/* Automatically generated file. Do not edit. 
 * Format:     ANSI C source code
 * Creator:    McStas <http://www.mcstas.org>
 * Instrument: ILL_H5_new.instr (ILL_H5_new)
 * Date:       Thu Apr  9 06:03:45 2026
 * File:       ./ILL_H5_new.c
 * CFLAGS=
 */

#ifndef WIN32
#  ifndef OPENACC
#    define _GNU_SOURCE
#  endif
#  define _POSIX_C_SOURCE 200809L
#endif
/* In case of cl.exe on Windows, supppress warnings about #pragma acc */
#ifdef _MSC_EXTENSIONS
#pragma warning(disable: 4068)
#endif

#define MCCODE_STRING " 3.99.99, git"
#define FLAVOR        "mcstas"
#define FLAVOR_UPPER  "MCSTAS"

#define MC_USE_DEFAULT_MAIN
#define MC_TRACE_ENABLED

#include <string.h>
#include <inttypes.h>

typedef double MCNUM;
typedef struct {MCNUM x, y, z;} Coords;
typedef MCNUM Rotation[3][3];
#define MCCODE_BASE_TYPES

/* available random number generators */
#define _RNG_ALG_MT         1
#define _RNG_ALG_KISS       2
/* selection of random number generator */
#ifndef RNG_ALG
#  define RNG_ALG  _RNG_ALG_KISS
#endif
#if RNG_ALG == _RNG_ALG_MT // MT 
#define randstate_t uint32_t
#elif RNG_ALG == _RNG_ALG_KISS  // KISS
#define randstate_t uint64_t
#endif

#ifndef MC_NUSERVAR
#define MC_NUSERVAR 10
#endif

/* Particle JUMP control logic */
struct particle_logic_struct {
int dummy;
};

struct _struct_particle {
  double x,y,z; /* position [m] */
  double vx,vy,vz; /* velocity [m/s] */
  double sx,sy,sz; /* spin [0-1] */
  int mcgravitation; /* gravity-state */
  void *mcMagnet;    /* precession-state */
  int allow_backprop; /* allow backprop */
  /* Generic Temporaries: */
  /* May be used internally by components e.g. for special */
  /* return-values from functions used in trace, thusreturned via */
  /* particle struct. (Example: Wolter Conics from McStas, silicon slabs.) */
  double _mctmp_a; /* temp a */
  double _mctmp_b; /* temp b */
  double _mctmp_c; /* temp c */
  randstate_t randstate[7];
  double t, p;     /* time, event weight */
  long long _uid;  /* Unique event ID */
  long _index;     /* component index where to send this event */
  long _absorbed;  /* flag set to TRUE when this event is to be removed/ignored */
  long _scattered; /* flag set to TRUE when this event has interacted with the last component instance */
  long _restore;   /* set to true if neutron event must be restored */
  long flag_nocoordschange;   /* set to true if particle is jumping */
  struct particle_logic_struct _logic;
  // user variables and comp-injections:
  double  flag;
  int  ncol_25;
  int  nrow_25;
  int  ncol_37;
  int  nrow_37;
  int  ncol_114;
  int  nrow_114;
  int  ncol_130;
  int  nrow_130;
};
typedef struct _struct_particle _class_particle;

_class_particle _particle_global_randnbuse_var;
_class_particle* _particle = &_particle_global_randnbuse_var;

#pragma acc routine
_class_particle mcgenstate(void);
#pragma acc routine
_class_particle mcsetstate(double x, double y, double z, double vx, double vy, double vz,
			   double t, double sx, double sy, double sz, double p, int mcgravitation, void *mcMagnet, int mcallowbackprop);
#pragma acc routine
_class_particle mcgetstate(_class_particle mcneutron, double *x, double *y, double *z,
                           double *vx, double *vy, double *vz, double *t,
                           double *sx, double *sy, double *sz, double *p);

extern int mcgravitation;      /* flag to enable gravitation */
#pragma acc declare create ( mcgravitation )

_class_particle mcgenstate(void) {
  _class_particle particle = mcsetstate(0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, mcgravitation, NULL, 0);
  return(particle);
}
/*Generated user variable handlers:*/

#pragma acc routine
double particle_getvar(_class_particle *p, char *name, int *suc);

#ifdef OPENACC
#pragma acc routine
int str_comp(char *str1, char *str2);
#endif

double particle_getvar(_class_particle *p, char *name, int *suc){
#ifndef OPENACC
#define str_comp strcmp
#endif
  int s=1;
  double rval=0;
  if(!str_comp("x",name)){rval=p->x;s=0;}
  if(!str_comp("y",name)){rval=p->y;s=0;}
  if(!str_comp("z",name)){rval=p->z;s=0;}
  if(!str_comp("vx",name)){rval=p->vx;s=0;}
  if(!str_comp("vy",name)){rval=p->vy;s=0;}
  if(!str_comp("vz",name)){rval=p->vz;s=0;}
  if(!str_comp("sx",name)){rval=p->sx;s=0;}
  if(!str_comp("sy",name)){rval=p->sy;s=0;}
  if(!str_comp("sz",name)){rval=p->sz;s=0;}
  if(!str_comp("t",name)){rval=p->t;s=0;}
  if(!str_comp("p",name)){rval=p->p;s=0;}
  if(!str_comp("_mctmp_a",name)){rval=p->_mctmp_a;s=0;}
  if(!str_comp("_mctmp_b",name)){rval=p->_mctmp_b;s=0;}
  if(!str_comp("_mctmp_c",name)){rval=p->_mctmp_c;s=0;}
  if(!str_comp("flag",name)){rval=*( (double *)(&(p->flag)) );s=0;}
  if(!str_comp("ncol_25",name)){rval=*( (double *)(&(p->ncol_25)) );s=0;}
  if(!str_comp("nrow_25",name)){rval=*( (double *)(&(p->nrow_25)) );s=0;}
  if(!str_comp("ncol_37",name)){rval=*( (double *)(&(p->ncol_37)) );s=0;}
  if(!str_comp("nrow_37",name)){rval=*( (double *)(&(p->nrow_37)) );s=0;}
  if(!str_comp("ncol_114",name)){rval=*( (double *)(&(p->ncol_114)) );s=0;}
  if(!str_comp("nrow_114",name)){rval=*( (double *)(&(p->nrow_114)) );s=0;}
  if(!str_comp("ncol_130",name)){rval=*( (double *)(&(p->ncol_130)) );s=0;}
  if(!str_comp("nrow_130",name)){rval=*( (double *)(&(p->nrow_130)) );s=0;}
  if (suc!=0x0) {*suc=s;}
  return rval;
}

#pragma acc routine
void* particle_getvar_void(_class_particle *p, char *name, int *suc);

#ifdef OPENACC
#pragma acc routine
int str_comp(char *str1, char *str2);
#endif

void* particle_getvar_void(_class_particle *p, char *name, int *suc){
#ifndef OPENACC
#define str_comp strcmp
#endif
  int s=1;
  void* rval=0;
  if(!str_comp("x",name)) {rval=(void*)&(p->x); s=0;}
  if(!str_comp("y",name)) {rval=(void*)&(p->y); s=0;}
  if(!str_comp("z",name)) {rval=(void*)&(p->z); s=0;}
  if(!str_comp("vx",name)){rval=(void*)&(p->vx);s=0;}
  if(!str_comp("vy",name)){rval=(void*)&(p->vy);s=0;}
  if(!str_comp("vz",name)){rval=(void*)&(p->vz);s=0;}
  if(!str_comp("sx",name)){rval=(void*)&(p->sx);s=0;}
  if(!str_comp("sy",name)){rval=(void*)&(p->sy);s=0;}
  if(!str_comp("sz",name)){rval=(void*)&(p->sz);s=0;}
  if(!str_comp("t",name)) {rval=(void*)&(p->t); s=0;}
  if(!str_comp("p",name)) {rval=(void*)&(p->p); s=0;}
  if(!str_comp("flag",name)){rval=(void*)&(p->flag);s=0;}
  if(!str_comp("ncol_25",name)){rval=(void*)&(p->ncol_25);s=0;}
  if(!str_comp("nrow_25",name)){rval=(void*)&(p->nrow_25);s=0;}
  if(!str_comp("ncol_37",name)){rval=(void*)&(p->ncol_37);s=0;}
  if(!str_comp("nrow_37",name)){rval=(void*)&(p->nrow_37);s=0;}
  if(!str_comp("ncol_114",name)){rval=(void*)&(p->ncol_114);s=0;}
  if(!str_comp("nrow_114",name)){rval=(void*)&(p->nrow_114);s=0;}
  if(!str_comp("ncol_130",name)){rval=(void*)&(p->ncol_130);s=0;}
  if(!str_comp("nrow_130",name)){rval=(void*)&(p->nrow_130);s=0;}
  if (suc!=0x0) {*suc=s;}
  return rval;
}

#pragma acc routine
int particle_setvar_void(_class_particle *, char *, void*);

int particle_setvar_void(_class_particle *p, char *name, void* value){
#ifndef OPENACC
#define str_comp strcmp
#endif
  int rval=1;
  if(!str_comp("x",name)) {memcpy(&(p->x),  value, sizeof(double)); rval=0;}
  if(!str_comp("y",name)) {memcpy(&(p->y),  value, sizeof(double)); rval=0;}
  if(!str_comp("z",name)) {memcpy(&(p->z),  value, sizeof(double)); rval=0;}
  if(!str_comp("vx",name)){memcpy(&(p->vx), value, sizeof(double)); rval=0;}
  if(!str_comp("vy",name)){memcpy(&(p->vy), value, sizeof(double)); rval=0;}
  if(!str_comp("vz",name)){memcpy(&(p->vz), value, sizeof(double)); rval=0;}
  if(!str_comp("sx",name)){memcpy(&(p->sx), value, sizeof(double)); rval=0;}
  if(!str_comp("sy",name)){memcpy(&(p->sy), value, sizeof(double)); rval=0;}
  if(!str_comp("sz",name)){memcpy(&(p->sz), value, sizeof(double)); rval=0;}
  if(!str_comp("p",name)) {memcpy(&(p->p),  value, sizeof(double)); rval=0;}
  if(!str_comp("t",name)) {memcpy(&(p->t),  value, sizeof(double)); rval=0;}
  if(!str_comp("flag",name)){memcpy(&(p->flag), value, sizeof(double )); rval=0;}
  if(!str_comp("ncol_25",name)){memcpy(&(p->ncol_25), value, sizeof(int )); rval=0;}
  if(!str_comp("nrow_25",name)){memcpy(&(p->nrow_25), value, sizeof(int )); rval=0;}
  if(!str_comp("ncol_37",name)){memcpy(&(p->ncol_37), value, sizeof(int )); rval=0;}
  if(!str_comp("nrow_37",name)){memcpy(&(p->nrow_37), value, sizeof(int )); rval=0;}
  if(!str_comp("ncol_114",name)){memcpy(&(p->ncol_114), value, sizeof(int )); rval=0;}
  if(!str_comp("nrow_114",name)){memcpy(&(p->nrow_114), value, sizeof(int )); rval=0;}
  if(!str_comp("ncol_130",name)){memcpy(&(p->ncol_130), value, sizeof(int )); rval=0;}
  if(!str_comp("nrow_130",name)){memcpy(&(p->nrow_130), value, sizeof(int )); rval=0;}
  return rval;
}

#pragma acc routine
int particle_setvar_void_array(_class_particle *, char *, void*, int);

int particle_setvar_void_array(_class_particle *p, char *name, void* value, int elements){
#ifndef OPENACC
#define str_comp strcmp
#endif
  int rval=1;
  return rval;
}

#pragma acc routine
void particle_restore(_class_particle *p, _class_particle *p0);

void particle_restore(_class_particle *p, _class_particle *p0) {
  p->x  = p0->x;  p->y  = p0->y;  p->z  = p0->z;
  p->vx = p0->vx; p->vy = p0->vy; p->vz = p0->vz;
  p->sx = p0->sx; p->sy = p0->sy; p->sz = p0->sz;
  p->t = p0->t;  p->p  = p0->p;
  p->_absorbed=0; p->_restore=0;
}

#pragma acc routine
double particle_getuservar_byid(_class_particle *p, int id, int *suc){
  int s=1;
  double rval=0;
  switch(id){
  case 0: { rval=*( (double *)(&(p->flag)) );s=0;break;}
  case 1: { rval=*( (double *)(&(p->ncol_25)) );s=0;break;}
  case 2: { rval=*( (double *)(&(p->nrow_25)) );s=0;break;}
  case 3: { rval=*( (double *)(&(p->ncol_37)) );s=0;break;}
  case 4: { rval=*( (double *)(&(p->nrow_37)) );s=0;break;}
  case 5: { rval=*( (double *)(&(p->ncol_114)) );s=0;break;}
  case 6: { rval=*( (double *)(&(p->nrow_114)) );s=0;break;}
  case 7: { rval=*( (double *)(&(p->ncol_130)) );s=0;break;}
  case 8: { rval=*( (double *)(&(p->nrow_130)) );s=0;break;}
  }
  if (suc!=0x0) {*suc=s;}
  return rval;
}

#pragma acc routine
void particle_uservar_init(_class_particle *p){
  p->flag=0;
  p->ncol_25=0;
  p->nrow_25=0;
  p->ncol_37=0;
  p->nrow_37=0;
  p->ncol_114=0;
  p->nrow_114=0;
  p->ncol_130=0;
  p->nrow_130=0;
}

#define MC_EMBEDDED_RUNTIME
/* embedding file "mccode-r.h" */

/*******************************************************************************
*
* McCode, neutron/xray ray-tracing package
*         Copyright (C) 1997-2009, All rights reserved
*         Risoe National Laboratory, Roskilde, Denmark
*         Institut Laue Langevin, Grenoble, France
*
* Runtime: share/mccode-r.h
*
* %Identification
* Written by: KN
* Date:    Aug 29, 1997
* Release: mcstas 3.99.99
* Version: $Revision$
*
* Runtime system header for McStas/McXtrace.
*
* In order to use this library as an external library, the following variables
* and macros must be declared (see details in the code)
*
*   struct mcinputtable_struct mcinputtable[];
*   int numipar;
*   metadata_table_t metadata_table[];
*   int num_metadata;
*   char instrument_name[], instrument_source[];
*   int traceenabled, defaultmain;
*   extern MCNUM  mccomp_storein[];
*   extern MCNUM  mcAbsorbProp[];
*   extern MCNUM  mcScattered;
*   #define MCCODE_STRING "the McStas/McXtrace version"
*
* Usage: Automatically embbeded in the c code.
*
* $Id$
*
*******************************************************************************/

#ifndef MCCODE_R_H
#define MCCODE_R_H "$Revision$"

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <limits.h>
#include <errno.h>
#include <time.h>
#ifndef _MSC_EXTENSIONS
#include <sys/time.h>
#endif
#include <float.h>
#include <inttypes.h>
#include <stdint.h>
#ifdef OPENACC
#include <openacc.h>
#ifndef GCCOFFLOAD
#include <accelmath.h>
#else
#include <math.h>
#endif
#pragma acc routine
int noprintf();
#pragma acc routine
size_t str_len(const char *s);
#else
#include <math.h>
#endif

/* In case of gcc / clang, ensure to use
   the built-in isnan/isinf functions */
#if defined(__GNUC__) || defined(__clang__)
#  ifdef isnan
#    undef isnan
#  endif
#  ifdef isinf
#    undef isinf
#  endif
#  define isnan(x) __builtin_isnan(x)
#  define isinf(x) __builtin_isinf(x)
#endif

#ifdef _MSC_EXTENSIONS
#ifndef _TIMES_H
#define _TIMES_H

#if defined(WIN32) || defined(_WIN32)
#include <sys/timeb.h>
#include <sys/types.h>
#include <winsock2.h>

int gettimeofday(struct timeval* t,void* timezone);

#define __need_clock_t
#include <time.h>


/* Structure describing CPU time used by a process and its children.  */
struct tms
  {
    clock_t tms_utime;          /* User CPU time.  */
    clock_t tms_stime;          /* System CPU time.  */

    clock_t tms_cutime;         /* User CPU time of dead children.  */
    clock_t tms_cstime;         /* System CPU time of dead children.  */
  };

/* Store the CPU time used by this process and all its
   dead children (and their dead children) in BUFFER.
   Return the elapsed real time, or (clock_t) -1 for errors.
   All times are in CLK_TCKths of a second.  */
clock_t times (struct tms *__buffer);

typedef long long suseconds_t ;



int gettimeofday(struct timeval* t,void* timezone)
{       struct _timeb timebuffer;
        _ftime( &timebuffer );
        t->tv_sec=timebuffer.time;
        t->tv_usec=1000*timebuffer.millitm;
		return 0;
}

clock_t times (struct tms *__buffer) {

	__buffer->tms_utime = clock();
	__buffer->tms_stime = 0;
	__buffer->tms_cstime = 0;
	__buffer->tms_cutime = 0;
	return __buffer->tms_utime;
}


#endif
#endif
#endif

/* If the runtime is embedded in the simulation program, some definitions can
   be made static. */

#ifdef MC_EMBEDDED_RUNTIME
#  define mcstatic
#else
#  define mcstatic
#endif

#ifdef __dest_os
#  if (__dest_os == __mac_os)
#    define MAC
#  endif
#endif

#ifdef __FreeBSD__
#  define NEED_STAT_H
#endif

#if defined(__APPLE__) && defined(__GNUC__)
#  define NEED_STAT_H
#endif

#if defined(WIN32) || defined(_WIN32)
#  define NEED_STAT_H
#  define NEED_TYPES_H
#endif

#ifdef NEED_STAT_H
#  include <sys/stat.h>
#endif

#ifdef NEED_TYPES_H
#  include <sys/types.h>
#endif

#ifndef MC_PATHSEP_C
#if defined(WIN32) || defined(_WIN32)
#    define MC_PATHSEP_C '\\'
#    define MC_PATHSEP_S "\\"
#  else  /* !WIN32 */
#    define MC_PATHSEP_C '/'
#    define MC_PATHSEP_S "/"
#  endif /* !WIN32 */
#endif /* MC_PATHSEP_C */

#if defined(WIN32) || defined(_WIN32)
#if defined _MSC_VER
#include <direct.h>
#elif defined __GNUC__
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#endif
#define mkdir(a,b) mkdir(a)
#define getpid() _getpid()
#endif

/* the version string is replaced when building distribution with mkdist */
#ifndef MCCODE_STRING
#  define MCCODE_STRING " 3.99.99, git"
#endif

#ifndef MCCODE_DATE
#  define MCCODE_DATE "git"
#endif

#ifndef MCCODE_VERSION
#  define MCCODE_VERSION "3.99.99"
#endif

#ifndef __MCCODE_VERSION__
#define __MCCODE_VERSION__ 399099L
#endif

#ifndef MCCODE_NAME
#  define MCCODE_NAME "mcstas"
#endif

#ifndef MCCODE_PARTICLE
#  define MCCODE_PARTICLE "neutron"
#endif

#ifndef MCCODE_PARTICLE_CODE
#  define MCCODE_PARTICLE_CODE 2112
#endif

#ifndef MCCODE_LIBENV
#  define MCCODE_LIBENV "MCSTAS"
#endif

#ifndef FLAVOR_UPPER
#  define FLAVOR_UPPER MCCODE_NAME
#endif

#ifdef MC_PORTABLE
#  ifndef NOSIGNALS
#    define NOSIGNALS 1
#  endif
#endif

#ifdef MAC
#  ifndef NOSIGNALS
#    define NOSIGNALS 1
#  endif
#endif

#if (USE_MPI == 0)
#  undef USE_MPI
#endif

#ifdef USE_MPI  /* default is to disable signals with MPI, as MPICH uses them to communicate */
#  ifndef NOSIGNALS
#    define NOSIGNALS 1
#  endif
#endif

#ifdef OPENACC  /* default is to disable signals with PGI/OpenACC */
#  ifndef NOSIGNALS
#    define NOSIGNALS 1
#  endif
#endif

#ifndef OPENACC
#  ifndef USE_OFF  /* default is to enable OFF when not using PGI/OpenACC */
#    define USE_OFF
#  endif
#  ifndef CPUFUNNEL  /* allow to enable FUNNEL-mode on CPU */
#  ifdef FUNNEL      /* by default disable FUNNEL-mode when not using PGI/OpenACC */
#    undef FUNNEL
#  endif
#  endif
#endif

#if (NOSIGNALS == 0)
#  undef NOSIGNALS
#endif

/** Header information for metadata-r.c ----------------------------------------------------------------------------- */
struct metadata_table_struct { /* stores metadata strings from components */
  char * source;  // component name which provided the metadata
  char * name;    // the name of the metadata
  char * type;    // the MIME type of the metadata (free form, valid identifier)
  char * value;   // the metadata string contents
};
typedef struct metadata_table_struct metadata_table_t;
char * metadata_table_key_component(char* key);
char * metadata_table_key_literal(char * key);
int metadata_table_defined(int, metadata_table_t *, char *);
char * metadata_table_name(int, metadata_table_t *, char *);
char * metadata_table_type(int, metadata_table_t *, char *);
char * metadata_table_literal(int, metadata_table_t *, char *);
void metadata_table_print_all_keys(int no, metadata_table_t * tab);
int metadata_table_print_all_components(int no, metadata_table_t * tab);
int metadata_table_print_component_keys(int no, metadata_table_t * tab, char * key);
/* -------------------------------------------------------------------------- Header information for metadata-r.c --- */

/* Note: the enum instr_formal_types definition MUST be kept
   synchronized with the one in mccode.h and with the
   instr_formal_type_names array in cogen.c. */
enum instr_formal_types
  {
    instr_type_int,
    instr_type_string, instr_type_char,
    instr_type_vector, instr_type_double
  };
struct mcinputtable_struct { /* defines instrument parameters */
  char *name; /* name of parameter */
  void *par;  /* pointer to instrument parameter (variable) */
  enum instr_formal_types type;
  char *val;  /* default value */
  char *unit; /* expected unit for parameter; informational only */
};


#ifndef MCCODE_BASE_TYPES
typedef double MCNUM;
typedef struct {MCNUM x, y, z;} Coords;
typedef MCNUM Rotation[3][3];
#endif

/* the following variables are defined in the McStas generated C code
   but should be defined externally in case of independent library usage */
#ifndef DANSE
extern struct mcinputtable_struct mcinputtable[];         /* list of instrument parameters */
extern int    numipar;                                    /* number of instrument parameters */
extern metadata_table_t metadata_table[];                 /* list of component-defined string metadata */
extern int    num_metadata;                               /* number of component-defined string metadata */
extern char   instrument_name[], instrument_source[]; /* instrument name and filename */
extern char  *instrument_exe;                           /* executable path = argv[0] or NULL */
extern char   instrument_code[];                        /* contains the initial 'instr' file */

#ifndef MC_ANCIENT_COMPATIBILITY
extern int traceenabled, defaultmain;
#endif
#endif


/* Useful macros ============================================================ */


/* SECTION: Dynamic Arrays */
typedef int* IArray1d;
IArray1d create_iarr1d(int n);
void destroy_iarr1d(IArray1d a);

typedef int** IArray2d;
IArray2d create_iarr2d(int nx, int ny);
void destroy_iarr2d(IArray2d a);

typedef int*** IArray3d;
IArray3d create_iarr3d(int nx, int ny, int nz);
void destroy_iarr3d(IArray3d a);

typedef double* DArray1d;
DArray1d create_darr1d(int n);
void destroy_darr1d(DArray1d a);

typedef double** DArray2d;
DArray2d create_darr2d(int nx, int ny);
void destroy_darr2d(DArray2d a);

typedef double*** DArray3d;
DArray3d create_darr3d(int nx, int ny, int nz);
void destroy_darr3d(DArray3d a);


/* MPI stuff */
#ifdef USE_MPI
#include "mpi.h"

#ifdef OMPI_MPI_H  /* openmpi does not use signals: we may install our sighandler */
#ifndef OPENACC    /* ... but only if we are not also running on GPU */
#undef NOSIGNALS
#endif
#endif

/*
 * MPI_MASTER(i):
 * execution of i only on master node
 */
#define MPI_MASTER(statement) { \
  if(mpi_node_rank == mpi_node_root)\
  { statement; } \
}

#ifndef MPI_REDUCE_BLOCKSIZE
#define MPI_REDUCE_BLOCKSIZE 100000
#endif

int mc_MPI_Sum(double* buf, long count);
int mc_MPI_Send(void *sbuf, long count, MPI_Datatype dtype, int dest);
int mc_MPI_Recv(void *rbuf, long count, MPI_Datatype dtype, int source);

/* MPI_Finalize exits gracefully and should be preferred to MPI_Abort */
#define exit(code) do {                                   \
    MPI_Finalize();                                       \
    exit(code);                                           \
  } while(0)

#else /* !USE_MPI */
#define MPI_MASTER(instr) instr
#endif /* USE_MPI */


#ifdef USE_MPI
static int mpi_node_count;
#endif

#ifdef USE_THREADS  /* user want threads */
#error Threading (USE_THREADS) support has been removed for very poor efficiency. Use MPI/SSH grid instead.
#endif


void   mcset_ncount(unsigned long long count);    /* wrapper to get mcncount */
#pragma acc routine
unsigned long long int mcget_ncount(void);            /* wrapper to set mcncount */
unsigned long long mcget_run_num(void);           /* wrapper to get mcrun_num=0:mcncount-1 */

/* Following part is only embedded when not redundant with mccode.h ========= */

#ifndef MCCODE_H

#ifndef NOSIGNALS
#include <signal.h>
char  *mcsig_message;
#define SIG_MESSAGE(msg) mcsig_message=(char *)(msg);
#else
#define SIG_MESSAGE(...)
#endif /* !NOSIGNALS */


/* Useful macros and constants ============================================== */


#ifndef FLT_MAX
#define FLT_MAX         3.40282347E+38F /* max decimal value of a "float" */
#endif

#ifndef MIN
#define MIN(a, b)  (((a) < (b)) ? (a) : (b))
#endif
#ifndef MAX
#define MAX(a, b)  (((a) > (b)) ? (a) : (b))
#endif
#ifndef SQR
#define SQR(x) ( (x) * (x) )
#endif
#ifndef SIGN
#define SIGN(x) (((x)>0.0)?(1):(-1))
#endif


#  ifndef M_E
#    define M_E        2.71828182845904523536  // e
#  endif
#  ifndef M_LOG2E
#    define M_LOG2E    1.44269504088896340736  //  log2(e)
#  endif
#  ifndef M_LOG10E
#    define M_LOG10E   0.434294481903251827651 //  log10(e)
#  endif
#  ifndef M_LN2
#    define M_LN2      0.693147180559945309417 //  ln(2)
#  endif
#  ifndef M_LN10
#    define M_LN10     2.30258509299404568402  //  ln(10)
#  endif
#  ifndef M_PI
#    define M_PI       3.14159265358979323846  //  pi
#  endif
#  ifndef PI
#    define PI       M_PI                      //  pi - also used in some places
#  endif
#  ifndef M_PI_2
#    define M_PI_2     1.57079632679489661923  //  pi/2
#  endif
#  ifndef M_PI_4
#    define M_PI_4     0.785398163397448309616 //  pi/4
#  endif
#  ifndef M_1_PI
#    define M_1_PI     0.318309886183790671538 //  1/pi
#  endif
#  ifndef M_2_PI
#    define M_2_PI     0.636619772367581343076 //  2/pi
#  endif
#  ifndef M_2_SQRTPI
#    define M_2_SQRTPI 1.12837916709551257390  //  2/sqrt(pi)
#  endif
#  ifndef M_SQRT2
#    define M_SQRT2    1.41421356237309504880  //  sqrt(2)
#  endif
#  ifndef M_SQRT1_2
#    define M_SQRT1_2  0.707106781186547524401 //  1/sqrt(2)
#  endif

#define RAD2MIN  ((180*60)/PI)
#define MIN2RAD  (PI/(180*60))
#define DEG2RAD  (PI/180)
#define RAD2DEG  (180/PI)
#define FWHM2RMS 0.424660900144    /* Convert between full-width-half-max and */
#define RMS2FWHM 2.35482004503     /* root-mean-square (standard deviation) */
#define HBAR     1.05457168e-34    /* [Js] h bar Planck constant CODATA 2002 */
#define MNEUTRON 1.67492728e-27    /* [kg] mass of neutron CODATA 2002 */
#define GRAVITY  9.81              /* [m/s^2] gravitational acceleration */
#define NA       6.02214179e23     /* [#atoms/g .mole] Avogadro's number*/


#define UNSET nan("0x6E6F74736574")
int nans_match(double, double);
int is_unset(double);
int is_valid(double);
int is_set(double);
int all_unset(int n, ...);
int all_set(int n, ...);
int any_unset(int n, ...);
int any_set(int n, ...);


/* wrapper to get absolute and relative position of comp */
/* mccomp_posa and mccomp_posr are defined in McStas generated C code */
#define POS_A_COMP_INDEX(index) (instrument->_position_absolute[index])
#define POS_R_COMP_INDEX(index) (instrument->_position_relative[index])

/* setting parameters based COMP_GETPAR (returned as pointer)         */
/* compname must be given as a string, type and par are symbols.      */
#define COMP_GETPAR3(type, compname, par) \
    &( ((_class_ ## type ##_parameters *) _getvar_parameters(compname))->par )
/* the body of this function depends on component instances, and is cogen'd */
void* _getvar_parameters(char* compname);

int _getcomp_index(char* compname);

/* Note: The two-stage approach to COMP_GETPAR is NOT redundant; without it,
* after #define C sample, COMP_GETPAR(C,x) would refer to component C, not to
* component sample. Such are the joys of ANSI C.

* Anyway the usage of COMP_GETPAR requires that we use sometimes bare names...
* NOTE: This can ONLY be used in instrument descriptions, not components.
*/
#define COMP_GETPAR2(comp, par) (_ ## comp ## _var._parameters.par)
#define COMP_GETPAR(comp, par) COMP_GETPAR2(comp,par)

#define INSTRUMENT_GETPAR(par) (_instrument_var._parameters.par)

/* Current component name, index, position and orientation */
/* These macros work because, using class-based functions, "comp" is usually
*  the local variable of the active/current component. */
#define INDEX_CURRENT_COMP (_comp->_index)
#define NAME_CURRENT_COMP (_comp->_name)
#define TYPE_CURRENT_COMP (_comp->_type)
#define POS_A_CURRENT_COMP (_comp->_position_absolute)
#define POS_R_CURRENT_COMP (_comp->_position_relative)
#define ROT_A_CURRENT_COMP (_comp->_rotation_absolute)
#define ROT_R_CURRENT_COMP (_comp->_rotation_relative)

#define NAME_INSTRUMENT (instrument->_name)


/* MCDISPLAY/trace and debugging message sent to stdout */
#ifdef MC_TRACE_ENABLED
#define DEBUG
#endif

#ifdef DEBUG
#define DEBUG_INSTR() if(!mcdotrace); else { printf("INSTRUMENT:\n"); printf("Instrument '%s' (%s)\n", instrument_name, instrument_source); }
#define DEBUG_COMPONENT(name,c,t) if(!mcdotrace); else {\
     printf("COMPONENT: \"%s\"\n"					  \
     "POS: %g, %g, %g, %g, %g, %g, %g, %g, %g, %g, %g, %g\n", \
     name, c.x, c.y, c.z, t[0][0], t[0][1], t[0][2], \
     t[1][0], t[1][1], t[1][2], t[2][0], t[2][1], t[2][2]); \
     printf("Component %30s AT (%g,%g,%g)\n", name, c.x, c.y, c.z); }
#define DEBUG_INSTR_END() if(!mcdotrace); else printf("INSTRUMENT END:\n");
#define DEBUG_ENTER() if(!mcdotrace); else printf("ENTER:\n");
#define DEBUG_COMP(c) if(!mcdotrace); else printf("COMP: \"%s\"\n", c);
#define DEBUG_LEAVE() if(!mcdotrace); else printf("LEAVE:\n");
#define DEBUG_ABSORB() if(!mcdotrace); else printf("ABSORB:\n");
#else
#define DEBUG_INSTR()
#define DEBUG_COMPONENT(name,c,t)
#define DEBUG_INSTR_END()
#define DEBUG_ENTER()
#define DEBUG_COMP(c)
#define DEBUG_LEAVE()
#define DEBUG_ABSORB()
#endif

// mcDEBUG_STATE and mcDEBUG_SCATTER are defined by mcstas-r.h and mcxtrace-r.h



#ifdef TEST
#define test_printf printf
#else
#define test_printf while(0) printf
#endif

/* send MCDISPLAY message to stdout to show gemoetry */
void mcdis_magnify(char *what);
void mcdis_line(double x1, double y1, double z1,
                double x2, double y2, double z2);
void mcdis_dashed_line(double x1, double y1, double z1,
		       double x2, double y2, double z2, int n);
void mcdis_multiline(int count, ...);
void mcdis_rectangle(char* plane, double x, double y, double z,
		     double width, double height);
void mcdis_box(double x, double y, double z,
	       double width, double height, double length, double thickness, double nx, double ny, double nz);
void mcdis_circle(char *plane, double x, double y, double z, double r);
void mcdis_Circle(double x, double y, double z, double r, double nx, double ny, double nz);
void mcdis_cylinder( double x, double y, double z,
		     double r, double height, double thickness, double nx, double ny, double nz);
void mcdis_cone( double x, double y, double z,
        double r, double height, double nx, double ny, double nz);
void mcdis_sphere(double x, double y, double z, double r);


/* random number generation. ================================================ */

#if RNG_ALG == _RNG_ALG_MT  // MT (currently not functional for GPU)
#  define MC_RAND_MAX ((uint32_t)0xffffffffUL)
#  define RANDSTATE_LEN 1
#  define srandom(seed) mt_srandom_empty()
#  define random() mt_random()
#  define _random() mt_random()
#elif RNG_ALG == _RNG_ALG_KISS  // KISS
#  ifndef UINT64_MAX
#    define UINT64_MAX ((uint64_t)0xffffffffffffffffULL)
#  endif
#  define MC_RAND_MAX UINT64_MAX
#  define RANDSTATE_LEN 7
#  define srandom(seed) kiss_srandom(_particle->randstate, seed)
#  define random() kiss_random(_particle->randstate)
#  define _random() kiss_random(state)
#endif

#pragma acc routine
double _randnorm2(randstate_t* state);

// Component writer interface
#define randnorm() _randnorm2(_particle->randstate)        // NOTE: can't use _randnorm on GPU
#define rand01() _rand01(_particle->randstate)
#define randpm1() _randpm1(_particle->randstate)
#define rand0max(p1) _rand0max(p1, _particle->randstate)
#define randminmax(p1, p2) _randminmax(p1, p2, _particle->randstate)
#define randtriangle() _randtriangle(_particle->randstate)

// Mersenne Twister rng
uint32_t mt_random(void);
void mt_srandom (uint32_t x);
void mt_srandom_empty();

// KISS rng
#pragma acc routine
uint64_t *kiss_srandom(uint64_t state[7], uint64_t seed);
#pragma acc routine
uint64_t kiss_random(uint64_t state[7]);

// Scrambler / hash function
#pragma acc routine seq
randstate_t _hash(randstate_t x);

// internal RNG (transforms) interface
#pragma acc routine
double _rand01(randstate_t* state);
#pragma acc routine
double _randpm1(randstate_t* state);
#pragma acc routine
double _rand0max(double max, randstate_t* state);
#pragma acc routine
double _randminmax(double min, double max, randstate_t* state);
#pragma acc routine
double _randtriangle(randstate_t* state);


#ifdef USE_OPENCL
#include "opencl-lib.h"
#include "opencl-lib.c"
#endif

#ifndef DANSE
int init(void);
int raytrace(_class_particle*);
int save(FILE *);
int finally(void);
int display(void);
#endif


/* GPU related algorithms =================================================== */

/*
*  Divide-and-conquer strategy for parallel sort absorbed last.
*/
#ifdef FUNNEL
long sort_absorb_last(_class_particle* particles, _class_particle* pbuffer, long len, long buffer_len, long flag_split, long* multiplier);
#endif
long sort_absorb_last_serial(_class_particle* particles, long len);


/* simple vector algebra ==================================================== */


#define vec_prod(x, y, z, x1, y1, z1, x2, y2, z2) \
	vec_prod_func(&x, &y, &z, x1, y1, z1, x2, y2, z2)
#pragma acc routine seq
mcstatic void vec_prod_func(double *x, double *y, double *z,
		double x1, double y1, double z1, double x2, double y2, double z2);

#pragma acc routine seq
mcstatic double scalar_prod(
		double x1, double y1, double z1, double x2, double y2, double z2);

#pragma acc routine seq
mcstatic void norm_func(double *x, double *y, double *z);
#define NORM(x,y,z)	norm_func(&x, &y, &z)

#pragma acc routine seq
void normal_vec(double *nx, double *ny, double *nz,
    double x, double y, double z);

/**
 * Rotate the vector vx,vy,vz psi radians around the vector ax,ay,az
 * and put the result in x,y,z.
 */
#define rotate(x, y, z, vx, vy, vz, phi, ax, ay, az) \
  do { \
    double mcrt_tmpx = (ax), mcrt_tmpy = (ay), mcrt_tmpz = (az); \
    double mcrt_vp, mcrt_vpx, mcrt_vpy, mcrt_vpz; \
    double mcrt_vnx, mcrt_vny, mcrt_vnz, mcrt_vn1x, mcrt_vn1y, mcrt_vn1z; \
    double mcrt_bx, mcrt_by, mcrt_bz; \
    double mcrt_cos, mcrt_sin; \
    NORM(mcrt_tmpx, mcrt_tmpy, mcrt_tmpz); \
    mcrt_vp = scalar_prod((vx), (vy), (vz), mcrt_tmpx, mcrt_tmpy, mcrt_tmpz); \
    mcrt_vpx = mcrt_vp*mcrt_tmpx; \
    mcrt_vpy = mcrt_vp*mcrt_tmpy; \
    mcrt_vpz = mcrt_vp*mcrt_tmpz; \
    mcrt_vnx = (vx) - mcrt_vpx; \
    mcrt_vny = (vy) - mcrt_vpy; \
    mcrt_vnz = (vz) - mcrt_vpz; \
    vec_prod(mcrt_bx, mcrt_by, mcrt_bz, \
             mcrt_tmpx, mcrt_tmpy, mcrt_tmpz, mcrt_vnx, mcrt_vny, mcrt_vnz); \
    mcrt_cos = cos((phi)); mcrt_sin = sin((phi)); \
    mcrt_vn1x = mcrt_vnx*mcrt_cos + mcrt_bx*mcrt_sin; \
    mcrt_vn1y = mcrt_vny*mcrt_cos + mcrt_by*mcrt_sin; \
    mcrt_vn1z = mcrt_vnz*mcrt_cos + mcrt_bz*mcrt_sin; \
    (x) = mcrt_vpx + mcrt_vn1x; \
    (y) = mcrt_vpy + mcrt_vn1y; \
    (z) = mcrt_vpz + mcrt_vn1z; \
  } while(0)

/**
 * Mirror (xyz) in the plane given by the point (rx,ry,rz) and normal (nx,ny,nz)
 *
 * TODO: This define is seemingly never used...
 */
#define mirror(x,y,z,rx,ry,rz,nx,ny,nz) \
  do { \
    double mcrt_tmpx= (nx), mcrt_tmpy = (ny), mcrt_tmpz = (nz); \
    double mcrt_tmpt; \
    NORM(mcrt_tmpx, mcrt_tmpy, mcrt_tmpz); \
    mcrt_tmpt=scalar_prod((rx),(ry),(rz),mcrt_tmpx,mcrt_tmpy,mcrt_tmpz); \
    (x) = rx -2 * mcrt_tmpt*mcrt_rmpx; \
    (y) = ry -2 * mcrt_tmpt*mcrt_rmpy; \
    (z) = rz -2 * mcrt_tmpt*mcrt_rmpz; \
  } while (0)

#pragma acc routine
Coords coords_set(MCNUM x, MCNUM y, MCNUM z);
#pragma acc routine
Coords coords_get(Coords a, MCNUM *x, MCNUM *y, MCNUM *z);
#pragma acc routine
Coords coords_add(Coords a, Coords b);
#pragma acc routine
Coords coords_sub(Coords a, Coords b);
#pragma acc routine
Coords coords_neg(Coords a);
#pragma acc routine
Coords coords_scale(Coords b, double scale);
#pragma acc routine
double coords_sp(Coords a, Coords b);
#pragma acc routine
Coords coords_xp(Coords b, Coords c);
#pragma acc routine
double coords_len(Coords a);
#pragma acc routine seq
void   coords_print(Coords a);
#pragma acc routine seq
mcstatic void coords_norm(Coords* c);

#pragma acc routine seq
void rot_set_rotation(Rotation t, double phx, double phy, double phz);
#pragma acc routine seq
int  rot_test_identity(Rotation t);
#pragma acc routine seq
void rot_mul(Rotation t1, Rotation t2, Rotation t3);
#pragma acc routine seq
void rot_copy(Rotation dest, Rotation src);
#pragma acc routine seq
void rot_transpose(Rotation src, Rotation dst);
#pragma acc routine seq
Coords rot_apply(Rotation t, Coords a);

#pragma acc routine seq
void mccoordschange(Coords a, Rotation t, _class_particle *particle);
#pragma acc routine seq
void mccoordschange_polarisation(Rotation t, double *sx, double *sy, double *sz);

double mcestimate_error(double N, double p1, double p2);
void mcreadparams(void);

/* this is now in mcstas-r.h and mcxtrace-r.h as the number of state parameters
is no longer equal */

_class_particle mcgenstate(void);

// trajectory/shape intersection routines
#pragma acc routine seq
int inside_rectangle(double, double, double, double);
#pragma acc routine seq
int box_intersect(double *dt_in, double *dt_out, double x, double y, double z,
      double vx, double vy, double vz, double dx, double dy, double dz);
#pragma acc routine seq
int cylinder_intersect(double *t0, double *t1, double x, double y, double z,
      double vx, double vy, double vz, double r, double h);
#pragma acc routine seq
int sphere_intersect(double *t0, double *t1, double x, double y, double z,
      double vx, double vy, double vz, double r);
// second order equation roots
#pragma acc routine seq
int solve_2nd_order(double *t1, double *t2,
      double A,  double B,  double C);

// random vector generation to shape
// defines silently introducing _particle as the last argument
#define randvec_target_circle(xo, yo, zo, solid_angle, xi, yi, zi, radius) \
  _randvec_target_circle(xo, yo, zo, solid_angle, xi, yi, zi, radius, _particle)
#define randvec_target_rect_angular(xo, yo, zo, solid_angle, xi, yi, zi, height, width, A) \
  _randvec_target_rect_angular(xo, yo, zo, solid_angle, xi, yi, zi, height, width, A, _particle)
#define randvec_target_rect_real(xo, yo, zo, solid_angle, xi, yi, zi, height, width, A, lx, ly, lz, order) \
  _randvec_target_rect_real(xo, yo, zo, solid_angle, xi, yi, zi, height, width, A, lx, ly, lz, order, _particle)
// defines forwarding to "inner" functions
#define randvec_target_sphere randvec_target_circle
#define randvec_target_rect(p0,p1,p2,p3,p4,p5,p6,p7,p8,p9) \
  randvec_target_rect_real(p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,0,0,0,1)
// headers for randvec
#pragma acc routine seq
void _randvec_target_circle(double *xo, double *yo, double *zo,
  double *solid_angle, double xi, double yi, double zi, double radius,
  _class_particle* _particle);
#pragma acc routine seq
void _randvec_target_rect_angular(double *xo, double *yo, double *zo,
  double *solid_angle, double xi, double yi, double zi, double height,
  double width, Rotation A,
  _class_particle* _particle);
#pragma acc routine seq
void _randvec_target_rect_real(double *xo, double *yo, double *zo, double *solid_angle,
  double xi, double yi, double zi, double height, double width, Rotation A,
  double lx, double ly, double lz, int order,
  _class_particle* _particle);


// this is the main()
int mccode_main(int argc, char *argv[]);


#endif /* !MCCODE_H */

#ifndef MCCODE_R_IO_H
#define MCCODE_R_IO_H "$Revision$"

#if (USE_NEXUS == 0)
#undef USE_NEXUS
#endif

#ifndef CHAR_BUF_LENGTH
#define CHAR_BUF_LENGTH 1024
#endif


/* I/O section part ========================================================= */

/* ========================================================================== */

/*                               MCCODE_R_IO_C                                */

/* ========================================================================== */


/* main DETECTOR structure which stores most information to write to data files */
struct mcdetector_struct {
  char   filename[CHAR_BUF_LENGTH];   /* file name of monitor */
  double Position[3];                 /* position of detector component*/
  char   position[CHAR_BUF_LENGTH];   /* position of detector component (string)*/
  Rotation Rotation;                  /* position of detector component*/
  char   options[CHAR_BUF_LENGTH];    /* Monitor_nD style list-mode'options' (string)*/
  char   component[CHAR_BUF_LENGTH];  /* component instance name */
  char   nexuscomp[CHAR_BUF_LENGTH];  /* component naming in NeXus/HDF case */
  char   instrument[CHAR_BUF_LENGTH]; /* instrument name */
  char   type[CHAR_BUF_LENGTH];       /* data type, e.g. 0d, 1d, 2d, 3d */
  char   user[CHAR_BUF_LENGTH];       /* user name, e.g. HOME */
  char   date[CHAR_BUF_LENGTH];       /* date of simulation end/write time */
  char   title[CHAR_BUF_LENGTH];      /* title of detector */
  char   xlabel[CHAR_BUF_LENGTH];     /* X axis label */
  char   ylabel[CHAR_BUF_LENGTH];     /* Y axis label */
  char   zlabel[CHAR_BUF_LENGTH];     /* Z axis label */
  char   xvar[CHAR_BUF_LENGTH];       /* X variable name */
  char   yvar[CHAR_BUF_LENGTH];       /* Y variable name */
  char   zvar[CHAR_BUF_LENGTH];       /* Z variable name */
  char   ncount[CHAR_BUF_LENGTH];     /* number of events initially generated */
  char   limits[CHAR_BUF_LENGTH];     /* X Y Z limits, e.g. [xmin xmax ymin ymax zmin zmax] */
  char   variables[CHAR_BUF_LENGTH];  /* variables written into data block */
  char   statistics[CHAR_BUF_LENGTH]; /* center, mean and half width along axis */
  char   signal[CHAR_BUF_LENGTH];     /* min max and mean of signal (data block) */
  char   values[CHAR_BUF_LENGTH];     /* integrated values e.g. [I I_err N] */
  double xmin,xmax;                   /* min max of axes */
  double ymin,ymax;
  double zmin,zmax;
  double intensity;                   /* integrated values for data block */
  double error;
  double events;
  double min;                         /* statistics for data block */
  double max;
  double mean;
  double centerX;                     /* statistics for axes */
  double halfwidthX;
  double centerY;
  double halfwidthY;
  int    rank;                        /* dimensionaly of monitor, e.g. 0 1 2 3 */
  char   istransposed;                /* flag to transpose matrix for some formats */

  long   m,n,p;                       /* dimensions of data block and along axes */
  long   date_l;                      /* same as date, but in sec since 1970 */

  double *p0, *p1, *p2;               /* pointers to saved data, NULL when freed */
  char   format[CHAR_BUF_LENGTH];    /* format for file generation */
};

typedef struct mcdetector_struct MCDETECTOR;

static   char *dirname             = NULL;      /* name of output directory */
static   char *siminfo_name        = "mccode";  /* default output sim file name */
char    *mcformat                    = NULL;      /* NULL (default) or a specific format */

/* file I/O definitions and function prototypes */

#ifndef MC_EMBEDDED_RUNTIME /* the mcstatic variables (from mccode-r.c) */
extern FILE * siminfo_file;     /* handle to the output siminfo file */
extern int    mcgravitation;      /* flag to enable gravitation */
extern int    mcdotrace;          /* flag to print MCDISPLAY messages */
#else
mcstatic FILE *siminfo_file        = NULL;
#endif

/* I/O function prototypes ================================================== */

// from msysgit: https://code.google.com/p/msysgit/source/browse/compat/strcasestr.c
char *strcasestr(const char *haystack, const char *needle);

/* output functions */
MCDETECTOR mcdetector_out_0D(char *t, double p0, double p1, double p2, char *c, Coords pos, Rotation rot, int index);
MCDETECTOR mcdetector_out_1D(char *t, char *xl, char *yl,
                  char *xvar, double x1, double x2, long n,
                  double *p0, double *p1, double *p2, char *f, char *c, Coords pos, Rotation rot, int index);
MCDETECTOR mcdetector_out_2D(char *t, char *xl, char *yl,
                  double x1, double x2, double y1, double y2, long m,
                  long n, double *p0, double *p1, double *p2, char *f,
                  char *c, Coords pos, Rotation rot, int index);
MCDETECTOR mcdetector_out_list(char *t, char *xl, char *yl,
                  long m, long n,
                  double *p1, char *f,
	          char *c, Coords posa, Rotation rot,char* options, int index);

/* wrappers to output functions, that automatically set NAME and POSITION */
#define DETECTOR_OUT(p0,p1,p2) mcdetector_out_0D(NAME_CURRENT_COMP,p0,p1,p2,NAME_CURRENT_COMP,POS_A_CURRENT_COMP,ROT_A_CURRENT_COMP,INDEX_CURRENT_COMP)
#define DETECTOR_OUT_0D(t,p0,p1,p2) mcdetector_out_0D(t,p0,p1,p2,NAME_CURRENT_COMP,POS_A_CURRENT_COMP,ROT_A_CURRENT_COMP,INDEX_CURRENT_COMP)
#define DETECTOR_OUT_1D(t,xl,yl,xvar,x1,x2,n,p0,p1,p2,f) \
     mcdetector_out_1D(t,xl,yl,xvar,x1,x2,n,p0,p1,p2,f,NAME_CURRENT_COMP,POS_A_CURRENT_COMP,ROT_A_CURRENT_COMP,INDEX_CURRENT_COMP)
#define DETECTOR_OUT_2D(t,xl,yl,x1,x2,y1,y2,m,n,p0,p1,p2,f) \
     mcdetector_out_2D(t,xl,yl,x1,x2,y1,y2,m,n,p0,p1,p2,f,NAME_CURRENT_COMP,POS_A_CURRENT_COMP,ROT_A_CURRENT_COMP,INDEX_CURRENT_COMP)

#ifdef USE_NEXUS
#include "napi.h"
NXhandle nxhandle;
#endif

#endif /* ndef MCCODE_R_IO_H */

#endif /* MCCODE_R_H */
/* End of file "mccode-r.h". */

/* embedding file "mcstas-r.h" */

/*******************************************************************************
*
* McStas, neutron ray-tracing package
*         Copyright (C) 1997-2009, All rights reserved
*         Risoe National Laboratory, Roskilde, Denmark
*         Institut Laue Langevin, Grenoble, France
*
* Runtime: share/mcstas-r.h
*
* %Identification
* Written by: KN
* Date:    Aug 29, 1997
* Release: McStas X.Y
* Version: $Revision$
*
* Runtime system header for McStas.
*
* In order to use this library as an external library, the following variables
* and macros must be declared (see details in the code)
*
*   struct mcinputtable_struct mcinputtable[];
*   int mcnumipar;
*   char instrument_name[], instrument_source[];
*   int traceenabled, defaultmain;
*   extern MCNUM  mccomp_storein[];
*   extern MCNUM  instrument.counter_AbsorbProp[];
*   extern MCNUM  mcScattered;
*   #define MCCODE_STRING "the McStas version"
*
* Usage: Automatically embbeded in the c code.
*
* $Id$
*
*******************************************************************************/

#ifndef MCSTAS_R_H
#define MCSTAS_R_H "$Revision$"

/* Following part is only embedded when not redundent with mcstas.h */

#ifndef MCCODE_H

#define AA2MS    629.622368        /* Convert k[1/AA] to v[m/s] */
#define MS2AA    1.58825361e-3     /* Convert v[m/s] to k[1/AA] */
#define K2V      AA2MS
#define V2K      MS2AA
#define Q2V      AA2MS
#define V2Q      MS2AA
#define SE2V     437.393377        /* Convert sqrt(E)[meV] to v[m/s] */
#define VS2E     5.22703725e-6     /* Convert (v[m/s])**2 to E[meV] */

#define SCATTER0 do {DEBUG_SCATTER(); SCATTERED++;} while(0)
#define SCATTER SCATTER0

#define JUMPTOCOMP(comp) mcneutron->_index = INDEX_COMP(comp);

#define MAGNET_ON \
  do { \
    mcMagnet = 1; \
  } while(0)

#define MAGNET_OFF \
  do { \
    mcMagnet = 0; \
  } while(0)

#define ALLOW_BACKPROP \
  do { \
    allow_backprop = 1; \
  } while(0)

#define DISALLOW_BACKPROP \
  do { \
    allow_backprop = 0; \
  } while(0)

#define PROP_MAGNET(dt) \
  do { \
  } while (0)
    /* change coordinates from local system to magnet system */
/*    Rotation rotLM, rotTemp; \
      Coords   posLM = coords_sub(POS_A_CURRENT_COMP, mcMagnetPos); \
      rot_transpose(ROT_A_CURRENT_COMP, rotTemp); \
      rot_mul(rotTemp, mcMagnetRot, rotLM); \
      mcMagnetPrecession(x, y, z, t, vx, vy, vz, \
               &sx, &sy, &sz, dt, posLM, rotLM); \
      } while(0)
*/

#define mcPROP_DT(dt) \
  do { \
    if (mcMagnet && dt > 0) PROP_MAGNET(dt);\
    x += vx*(dt); \
    y += vy*(dt); \
    z += vz*(dt); \
    t += (dt); \
    if (isnan(p) || isinf(p)) { ABSORB; }\
  } while(0)

/* ADD: E. Farhi, Aug 6th, 2001 PROP_GRAV_DT propagation with acceleration */
#define PROP_GRAV_DT(dt, Ax, Ay, Az) \
  do { \
    if(dt < 0 && allow_backprop == 0) { ABSORB; }\
    if (mcMagnet) /*printf("Spin precession gravity\n")*/; \
    x  += vx*(dt) + (Ax)*(dt)*(dt)/2; \
    y  += vy*(dt) + (Ay)*(dt)*(dt)/2; \
    z  += vz*(dt) + (Az)*(dt)*(dt)/2; \
    vx += (Ax)*(dt); \
    vy += (Ay)*(dt); \
    vz += (Az)*(dt); \
    t  += (dt); \
    DISALLOW_BACKPROP;\
  } while(0)


#define PROP_DT(dt) \
  do { \
    if(dt < 0 && allow_backprop == 0) { RESTORE=1; ABSORB; }; \
    if (mcgravitation) { Coords mcLocG; double mc_gx, mc_gy, mc_gz; \
    mcLocG = rot_apply(ROT_A_CURRENT_COMP, coords_set(0,-GRAVITY,0)); \
    coords_get(mcLocG, &mc_gx, &mc_gy, &mc_gz); \
    PROP_GRAV_DT(dt, mc_gx, mc_gy, mc_gz); } \
    else mcPROP_DT(dt); \
    DISALLOW_BACKPROP;\
  } while(0)


#define PROP_Z0 \
  do { \
    if (mcgravitation) { Coords mcLocG; int mc_ret; \
    double mc_dt, mc_gx, mc_gy, mc_gz; \
    mcLocG = rot_apply(ROT_A_CURRENT_COMP, coords_set(0,-GRAVITY,0)); \
    coords_get(mcLocG, &mc_gx, &mc_gy, &mc_gz); \
    mc_ret = solve_2nd_order(&mc_dt, NULL, -mc_gz/2, -vz, -z); \
    if (mc_ret) {PROP_GRAV_DT(mc_dt, mc_gx, mc_gy, mc_gz); z=0;}\
    else if (allow_backprop == 0 && mc_dt < 0) { ABSORB; }; } \
    else mcPROP_Z0; \
    DISALLOW_BACKPROP;\
  } while(0)

#define mcPROP_Z0 \
  do { \
    double mc_dt; \
    if(vz == 0) { ABSORB; }; \
    mc_dt = -z/vz; \
    if(mc_dt < 0 && allow_backprop == 0) { ABSORB; }; \
    mcPROP_DT(mc_dt); \
    z = 0; \
    DISALLOW_BACKPROP;\
  } while(0)

#define PROP_X0 \
  do { \
    if (mcgravitation) { Coords mcLocG; int mc_ret; \
    double mc_dt, mc_gx, mc_gy, mc_gz; \
    mcLocG = rot_apply(ROT_A_CURRENT_COMP, coords_set(0,-GRAVITY,0)); \
    coords_get(mcLocG, &mc_gx, &mc_gy, &mc_gz); \
    mc_ret = solve_2nd_order(&mc_dt, NULL, -mc_gx/2, -vx, -x); \
    if (mc_ret) {PROP_GRAV_DT(mc_dt, mc_gx, mc_gy, mc_gz); x=0;}\
    else if (allow_backprop == 0 && mc_dt < 0) { ABSORB; }; } \
    else mcPROP_X0; \
    DISALLOW_BACKPROP;\
  } while(0)

#define mcPROP_X0 \
  do { \
    double mc_dt; \
    if(vx == 0) { ABSORB; }; \
    mc_dt = -x/vx; \
    if(mc_dt < 0 && allow_backprop == 0) { ABSORB; }; \
    mcPROP_DT(mc_dt); \
    x = 0; \
    DISALLOW_BACKPROP;\
  } while(0)

#define PROP_Y0 \
  do { \
    if (mcgravitation) { Coords mcLocG; int mc_ret; \
    double mc_dt, mc_gx, mc_gy, mc_gz; \
    mcLocG = rot_apply(ROT_A_CURRENT_COMP, coords_set(0,-GRAVITY,0)); \
    coords_get(mcLocG, &mc_gx, &mc_gy, &mc_gz); \
    mc_ret = solve_2nd_order(&mc_dt, NULL, -mc_gy/2, -vy, -y); \
    if (mc_ret) {PROP_GRAV_DT(mc_dt, mc_gx, mc_gy, mc_gz); y=0;}\
    else if (allow_backprop == 0 && mc_dt < 0) { ABSORB; }; } \
    else mcPROP_Y0; \
    DISALLOW_BACKPROP;\
  } while(0)


#define mcPROP_Y0 \
  do { \
    double mc_dt; \
    if(vy == 0) { ABSORB; }; \
    mc_dt = -y/vy; \
    if(mc_dt < 0 && allow_backprop == 0) { ABSORB; }; \
    mcPROP_DT(mc_dt); \
    y = 0; \
    DISALLOW_BACKPROP; \
  } while(0)


#ifdef DEBUG

#define DEBUG_STATE() if(!mcdotrace); else \
  printf("STATE: %g, %g, %g, %g, %g, %g, %g, %g, %g, %g, %g\n", \
         x,y,z,vx,vy,vz,t,sx,sy,sz,p);
#define DEBUG_SCATTER() if(!mcdotrace); else \
  printf("SCATTER: %g, %g, %g, %g, %g, %g, %g, %g, %g, %g, %g\n", \
         x,y,z,vx,vy,vz,t,sx,sy,sz,p);

#else

#define DEBUG_STATE()
#define DEBUG_SCATTER()

#endif

#endif /* !MCCODE_H */

#endif /* MCSTAS_R_H */
/* End of file "mcstas-r.h". */

/* embedding file "mccode-r.c" */

/*******************************************************************************
*
* McCode, neutron/xray ray-tracing package
*         Copyright (C) 1997-2009, All rights reserved
*         Risoe National Laboratory, Roskilde, Denmark
*         Institut Laue Langevin, Grenoble, France
*
* Runtime: share/mccode-r.c
*
* %Identification
* Written by: KN
* Date:    Aug 29, 1997
* Release: McStas X.Y/McXtrace X.Y
* Version: $Revision$
*
* Runtime system for McStas and McXtrace.
* Embedded within instrument in runtime mode.
* Contains SECTIONS:
*   MPI handling (sum, send, recv)
*   format definitions
*   I/O
*   mcdisplay support
*   random numbers
*   coordinates handling
*   vectors math (solve 2nd order, normals, randvec...)
*   parameter handling
*   signal and main handlers
*
* Usage: Automatically embbeded in the c code whenever required.
*
* $Id$
*
*******************************************************************************/

/*******************************************************************************
* The I/O format definitions and functions
*******************************************************************************/


/** Include header files to avoid implicit declarations (not allowed on LLVM) */
#include <ctype.h>
#include <sys/types.h>
#include <dirent.h>
#include <errno.h>

// UNIX specific headers (non-Windows)
#if defined(__unix__) || defined(__APPLE__)
#include <unistd.h>
#include <sys/stat.h>
#endif


#ifndef DANSE
#ifdef MC_ANCIENT_COMPATIBILITY
int traceenabled = 0;
int defaultmain  = 0;
#endif
/* else defined directly in the McCode generated C code */

static   long mcseed                 = 0; /* seed for random generator */
#pragma acc declare create ( mcseed )
static   long mcstartdate            = 0; /* start simulation time */
static   int  mcdisable_output_files = 0; /* --no-output-files */
mcstatic int  mcgravitation          = 0; /* use gravitation flag, for PROP macros */
mcstatic int  mcusedefaults          = 0; /* assume default value for all parameters */
mcstatic int  mcappend               = 0; /* flag to allow append mode on datasets/directories */
mcstatic int  mcdotrace              = 0; /* flag for --trace and messages for DISPLAY */
mcstatic int  mcnexus_embed_idf      = 0; /* flag to embed xml-formatted IDF file for Mantid */
#pragma acc declare create ( mcdotrace )
int      mcallowbackprop             = 0;         /* flag to enable negative/backprop */

/* OpenACC-related segmentation parameters: */
int vecsize = 128;
int numgangs = 7813;
long gpu_innerloop = 2147483647;

/* Monitor_nD list/buffer-size default */
/* Starting value may be defined using -DND_BUFFER=N */
/* Can further be controlled dynamically using --bufsiz input */
long MONND_BUFSIZ = 10000000;
#ifdef ND_BUFFER
MONND_BUFSIZ = ND_BUFFER;
#endif
 

/* Number of particle histories to simulate. */
#ifdef NEUTRONICS
mcstatic unsigned long long int mcncount             = 1;
mcstatic unsigned long long int mcrun_num            = 0;
#else
#ifdef MCDEFAULT_NCOUNT
mcstatic unsigned long long int mcncount             = MCDEFAULT_NCOUNT;
#else
mcstatic unsigned long long int mcncount             = 1000000;
#endif
#pragma acc declare create ( mcncount )
mcstatic unsigned long long int mcrun_num            = 0;
#pragma acc declare create ( mcrun_num )
#endif /* NEUTRONICS */

#else
#include "mcstas-globals.h"
#endif /* !DANSE */

#ifndef NX_COMPRESSION
#define NX_COMPRESSION NX_COMP_NONE
#endif

/* String nullification on GPU and other replacements */
#ifdef OPENACC
int noprintf() {
  return 0;
}

int str_comp(char *str1, char *str2) {
  while (*str1 && *str1 == *str2) {
    str1++;
    str2++;
  }
  return (*str1 - *str2);
}

size_t str_len(const char *s)
{
  size_t len = 0;
  if(s != NULL)
  {
    while(*s != '\0')
    {
      ++len;
      ++s;
    }
  }
  return len;
}

#endif

/* SECTION: Predefine (component) parameters ================================= */

int nans_match(double a, double b){
  return (*(uint64_t*)&a == *(uint64_t*)&b);
}
int is_unset(double x){
  return nans_match(x, UNSET);
}
int is_set(double x){
  return !nans_match(x, UNSET);
}
int is_valid(double x){
  return !isnan(x)||is_unset(x);
}
int all_unset(int n, ...){
  va_list ptr;
  va_start(ptr, n);
  int ret=1;
  for (int i=0; i<n; ++i) if(is_set(va_arg(ptr, double))) ret=0;
  va_end(ptr);
  return ret;
}
int all_set(int n, ...){
  va_list ptr;
  va_start(ptr, n);
  int ret=1;
  for (int i=0; i<n; ++i) if(is_unset(va_arg(ptr, double))) ret=0;
  va_end(ptr);
  return ret;
}
int any_unset(int n, ...){
  va_list ptr;
  va_start(ptr, n);
  int ret=0;
  for (int i=0; i<n; ++i) if(is_unset(va_arg(ptr, double))) ret=1;
  va_end(ptr);
  return ret;
}
int any_set(int n, ...){
  va_list ptr;
  va_start(ptr, n);
  int ret=0;
  for (int i=0; i<n; ++i) if(is_set(va_arg(ptr, double))) ret=1;
  va_end(ptr);
  return ret;
}


/* SECTION: Dynamic Arrays ================================================== */
IArray1d create_iarr1d(int n){
  IArray1d arr1d;
  arr1d = calloc(n, sizeof(int));
  if (!arr1d) {
    fprintf(stderr, "Error allocating IArray1d of dimension %i\n",n);
    exit(-1);
  }
  return arr1d;
}

void destroy_iarr1d(IArray1d a){
  free(a);
}

IArray2d create_iarr2d(int nx, int ny){
  IArray2d arr2d;
  arr2d = calloc(nx, sizeof(int *));
  if (!arr2d) {
    fprintf(stderr, "Error allocating IArray2d of dimension %i x %i\n",nx,ny);
    exit(-1);
  }

  int *p1;
  p1 = calloc(nx*ny, sizeof(int));

  if (!p1) {
    fprintf(stderr, "Error allocating int* array of dimension %i\n",nx*ny);
    exit(-1);
  }
  
  int i;
  for (i=0; i<nx; i++){
    arr2d[i] = &(p1[i*ny]);
  }
  return arr2d;
}

void destroy_iarr2d(IArray2d a){
  free(a[0]);
  free(a);
}

IArray3d create_iarr3d(int nx, int ny, int nz){
  IArray3d arr3d;
  int i, j;

  // 1d
  arr3d = calloc(nx, sizeof(int **));
  if (!arr3d) {
    fprintf(stderr, "Error allocating IArray3d of dimension %i x %i x %i\n",nx,ny,nz);
    exit(-1);
  }

  // d2
  int **p1;
  p1 = calloc(nx*ny, sizeof(int *));

  if (!p1) {
    fprintf(stderr, "Error allocating int** array of dimension %i\n",nx*ny);
    exit(-1);
  }
  
  for (i=0; i<nx; i++){
    arr3d[i] = &(p1[i*ny]);
  }

  // 3d
  int *p2;
  p2 = calloc(nx*ny*nz, sizeof(int));
  if (!p2) {
    fprintf(stderr, "Error allocating int* array of dimension %i\n",nx*ny*nz);
    exit(-1);
  }
  for (i=0; i<nx; i++){
    for (j=0; j<ny; j++){
      arr3d[i][j] = &(p2[(i*ny+j)*nz]);
    }
  }
  return arr3d;
}

void destroy_iarr3d(IArray3d a){
  free(a[0][0]);
  free(a[0]);
  free(a);
}

DArray1d create_darr1d(int n){
  DArray1d arr1d;
  arr1d = calloc(n, sizeof(double));
  if (!arr1d) {
    fprintf(stderr, "Error allocating DArray1d of dimension %i\n",n);
    exit(-1);
  }
  return arr1d;
}

void destroy_darr1d(DArray1d a){
  free(a);
}

DArray2d create_darr2d(int nx, int ny){
  DArray2d arr2d;
  arr2d = calloc(nx, sizeof(double *));
  if (!arr2d) {
    fprintf(stderr, "Error allocating DArray2d of dimension %i x %i\n",nx,ny);
    exit(-1);
  }
  double *p1;
  p1 = calloc(nx*ny, sizeof(double));
  if (!p1) {
    fprintf(stderr, "Error allocating double* array of dimension %i\n",nx*ny);
    exit(-1);
  }
  int i;
  for (i=0; i<nx; i++){
    arr2d[i] = &(p1[i*ny]);
  }
  return arr2d;
}

void destroy_darr2d(DArray2d a){
  free(a[0]);
  free(a);
}

DArray3d create_darr3d(int nx, int ny, int nz){
  DArray3d arr3d;

  int i, j;

  // 1d
  arr3d = calloc(nx, sizeof(double **));
  if (!arr3d) {
    fprintf(stderr, "Error allocating DArray3d of dimension %i x %i x %i\n",nx,ny,nz);
    exit(-1);
  }
  // d2
  double **p1;
  p1 = calloc(nx*ny, sizeof(double *));
  if (!p1) {
    fprintf(stderr, "Error allocating double** array of dimension %i\n",nx*ny);
    exit(-1);
  }
  for (i=0; i<nx; i++){
    arr3d[i] = &(p1[i*ny]);
  }

  // 3d
  double *p2;
  p2 = calloc(nx*ny*nz, sizeof(double));
  if (!p2) {
    fprintf(stderr, "Error allocating double* array of dimension %i\n",nx*ny*nz);
    exit(-1);
  }
  for (i=0; i<nx; i++){
    for (j=0; j<ny; j++){
      arr3d[i][j] = &(p2[(i*ny+j)*nz]);
    }
  }
  return arr3d;
}

void destroy_darr3d(DArray3d a){
  free(a[0][0]);
  free(a[0]);
  free(a);
}


/* SECTION: MPI handling ==================================================== */

#ifdef USE_MPI
/* MPI rank */
static int mpi_node_rank;
static int mpi_node_root = 0;


/*******************************************************************************
* mc_MPI_Reduce: Gathers arrays from MPI nodes using Reduce function.
*******************************************************************************/
int mc_MPI_Sum(double *sbuf, long count)
{
  if (!sbuf || count <= 0) return(MPI_SUCCESS); /* nothing to reduce */
  else {
    /* we must cut the buffer into blocks not exceeding the MPI max buffer size of 32000 */
    long   offset=0;
    double *rbuf=NULL;
    int    length=MPI_REDUCE_BLOCKSIZE; /* defined in mccode-r.h */
    int    i=0;
    rbuf = calloc(count, sizeof(double));
    if (!rbuf)
      exit(-fprintf(stderr, "Error: Out of memory %zi (mc_MPI_Sum)\n", count*sizeof(double)));
    while (offset < count) {
      if (!length || offset+length > count-1) length=count-offset;
      else length=MPI_REDUCE_BLOCKSIZE;
      if (MPI_Allreduce((double*)(sbuf+offset), (double*)(rbuf+offset),
              length, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD) != MPI_SUCCESS)
        return MPI_ERR_COUNT;
      offset += length;
    }

    for (i=0; i<count; i++) sbuf[i] = rbuf[i];
    free(rbuf);
  }
  return MPI_SUCCESS;
} /* mc_MPI_Sum */

/*******************************************************************************
* mc_MPI_Send: Send array to MPI node by blocks to avoid buffer limit
*******************************************************************************/
int mc_MPI_Send(void *sbuf,
                  long count, MPI_Datatype dtype,
                  int dest)
{
  int dsize;
  long offset=0;
  int  tag=1;
  int  length=MPI_REDUCE_BLOCKSIZE; /* defined in mccode-r.h */

  if (!sbuf || count <= 0) return(MPI_SUCCESS); /* nothing to send */
  MPI_Type_size(dtype, &dsize);

  while (offset < count) {
    if (offset+length > count-1) length=count-offset;
    else length=MPI_REDUCE_BLOCKSIZE;
    if (MPI_Send((void*)((char*)sbuf+offset*dsize), length, dtype, dest, tag++, MPI_COMM_WORLD) != MPI_SUCCESS)
      return MPI_ERR_COUNT;
    offset += length;
  }

  return MPI_SUCCESS;
} /* mc_MPI_Send */

/*******************************************************************************
* mc_MPI_Recv: Receives arrays from MPI nodes by blocks to avoid buffer limit
*             the buffer must have been allocated previously.
*******************************************************************************/
int mc_MPI_Recv(void *sbuf,
                  long count, MPI_Datatype dtype,
                  int source)
{
  int dsize;
  long offset=0;
  int  tag=1;
  int  length=MPI_REDUCE_BLOCKSIZE; /* defined in mccode-r.h */

  if (!sbuf || count <= 0) return(MPI_SUCCESS); /* nothing to recv */
  MPI_Type_size(dtype, &dsize);

  while (offset < count) {
    if (offset+length > count-1) length=count-offset;
    else length=MPI_REDUCE_BLOCKSIZE;
    if (MPI_Recv((void*)((char*)sbuf+offset*dsize), length, dtype, source, tag++,
            MPI_COMM_WORLD, MPI_STATUS_IGNORE) != MPI_SUCCESS)
      return MPI_ERR_COUNT;
    offset += length;
  }

  return MPI_SUCCESS;
} /* mc_MPI_Recv */

#endif /* USE_MPI */

/* SECTION: parameters handling ============================================= */

/* Instrument input parameter type handling. */
/*******************************************************************************
* mcparm_double: extract double value from 's' into 'vptr'
*******************************************************************************/
static int
mcparm_double(char *s, void *vptr)
{
  char *p;
  double *v = (double *)vptr;

  if (!s) { *v = 0; return(1); }
  *v = strtod(s, &p);
  if(*s == '\0' || (p != NULL && *p != '\0') || errno == ERANGE)
    return 0;                        /* Failed */
  else
    return 1;                        /* Success */
}

/*******************************************************************************
* mcparminfo_double: display parameter type double
*******************************************************************************/
static char *
mcparminfo_double(char *parmname)
{
  return "double";
}

/*******************************************************************************
* mcparmerror_double: display error message when failed extract double
*******************************************************************************/
static void
mcparmerror_double(char *parm, char *val)
{
  fprintf(stderr, "Error: Invalid value '%s' for floating point parameter %s (mcparmerror_double)\n",
          val, parm);
}

/*******************************************************************************
* mcparmprinter_double: convert double to string
*******************************************************************************/
static void
mcparmprinter_double(char *f, void *vptr)
{
  double *v = (double *)vptr;
  sprintf(f, "%g", *v);
}

/*******************************************************************************
* mcparm_int: extract int value from 's' into 'vptr'
*******************************************************************************/
static int
mcparm_int(char *s, void *vptr)
{
  char *p;
  int *v = (int *)vptr;
  long x;

  if (!s) { *v = 0; return(1); }
  *v = 0;
  x = strtol(s, &p, 10);
  if(x < INT_MIN || x > INT_MAX)
    return 0;                        /* Under/overflow */
  *v = x;
  if(*s == '\0' || (p != NULL && *p != '\0') || errno == ERANGE)
    return 0;                        /* Failed */
  else
    return 1;                        /* Success */
}

/*******************************************************************************
* mcparminfo_int: display parameter type int
*******************************************************************************/
static char *
mcparminfo_int(char *parmname)
{
  return "int";
}

/*******************************************************************************
* mcparmerror_int: display error message when failed extract int
*******************************************************************************/
static void
mcparmerror_int(char *parm, char *val)
{
  fprintf(stderr, "Error: Invalid value '%s' for integer parameter %s (mcparmerror_int)\n",
          val, parm);
}

/*******************************************************************************
* mcparmprinter_int: convert int to string
*******************************************************************************/
static void
mcparmprinter_int(char *f, void *vptr)
{
  int *v = (int *)vptr;
  sprintf(f, "%d", *v);
}

/*******************************************************************************
* mcparm_string: extract char* value from 's' into 'vptr' (copy)
*******************************************************************************/
static int
mcparm_string(char *s, void *vptr)
{
  char **v = (char **)vptr;
  if (!s) { *v = NULL; return(1); }
  *v = (char *)malloc(strlen(s) + 1);
  if(*v == NULL)
  {
    exit(-fprintf(stderr, "Error: Out of memory %li (mcparm_string).\n", (long)strlen(s) + 1));
  }
  strcpy(*v, s);
  return 1;                        /* Success */
}

/*******************************************************************************
* mcparminfo_string: display parameter type string
*******************************************************************************/
static char *
mcparminfo_string(char *parmname)
{
  return "string";
}

/*******************************************************************************
* mcparmerror_string: display error message when failed extract string
*******************************************************************************/
static void
mcparmerror_string(char *parm, char *val)
{
  fprintf(stderr, "Error: Invalid value '%s' for string parameter %s (mcparmerror_string)\n",
          val, parm);
}

/*******************************************************************************
* mcparmprinter_string: convert string to string (including esc chars)
*******************************************************************************/
static void
mcparmprinter_string(char *f, void *vptr)
{
  char **v = (char **)vptr;
  char *p;

  if (!*v) { *f='\0'; return; }
  strcpy(f, "");
  for(p = *v; *p != '\0'; p++)
  {
    switch(*p)
    {
      case '\n':
        strcat(f, "\\n");
        break;
      case '\r':
        strcat(f, "\\r");
        break;
      case '"':
        strcat(f, "\\\"");
        break;
      case '\\':
        strcat(f, "\\\\");
        break;
      default:
        strncat(f, p, 1);
    }
  }
  /* strcat(f, "\""); */
} /* mcparmprinter_string */

/* now we may define the parameter structure, using previous functions */
static struct
  {
    int (*getparm)(char *, void *);
    char * (*parminfo)(char *);
    void (*error)(char *, char *);
    void (*printer)(char *, void *);
} mcinputtypes[] = {
  {
    mcparm_int, mcparminfo_int, mcparmerror_int,
    mcparmprinter_int
  }, {
    mcparm_string, mcparminfo_string, mcparmerror_string,
    mcparmprinter_string
  }, {
    mcparm_string, mcparminfo_string, mcparmerror_string,
    mcparmprinter_string
  }, {
    mcparm_double, mcparminfo_double, mcparmerror_double,
    mcparmprinter_double
  }, {
    mcparm_double, mcparminfo_double, mcparmerror_double,
    mcparmprinter_double
  }
};

/*******************************************************************************
* mcestimate_error: compute sigma from N,p,p2 in Gaussian large numbers approx
*******************************************************************************/
double mcestimate_error(double N, double p1, double p2)
{
  double pmean, n1;
  if(N <= 1)
    return p1;
  pmean = p1 / N;
  n1 = N - 1;
  /* Note: underflow may cause p2 to become zero; the fabs() below guards
     against this. */
  return sqrt((N/n1)*fabs(p2 - pmean*pmean));
}

double (*mcestimate_error_p)
  (double V2, double psum, double p2sum)=mcestimate_error;

/* ========================================================================== */

/*                               MCCODE_R_IO_C                                */

/* ========================================================================== */

#ifndef MCCODE_R_IO_C
#define MCCODE_R_IO_C "$Revision$"

/* SECTION: file i/o handling ================================================ */

#ifndef HAVE_STRCASESTR
// from msysgit: https://code.google.com/p/msysgit/source/browse/compat/strcasestr.c
char *strcasestr(const char *haystack, const char *needle)
{
  int nlen = strlen(needle);
  int hlen = strlen(haystack) - nlen + 1;
  int i;

  for (i = 0; i < hlen; i++) {
    int j;
    for (j = 0; j < nlen; j++) {
            unsigned char c1 = haystack[i+j];
            unsigned char c2 = needle[j];
            if (toupper(c1) != toupper(c2))
                    goto next;
    }
    return (char *) haystack + i;
  next:
    ;
  }
  return NULL;
}


#endif
#ifndef HAVE_STRCASECMP
int strcasecmp( const char *s1, const char *s2 )
{
  int c1, c2;
  do {
    c1 = tolower( (unsigned char) *s1++ );
    c2 = tolower( (unsigned char) *s2++ );
  } while (c1 == c2 && c1 != 0);
  return c2 > c1 ? -1 : c1 > c2;
}
#endif

#ifndef STRACPY
/* this is a replacement to strncpy, but ensures that the copy ends with NULL */
/* http://stracpy.blogspot.fr/2011/04/stracpy-strncpy-replacement.html */
#define STRACPY
char *stracpy(char *destination, const char *source, size_t amount)
{
        if (!destination || !source || !amount) return(NULL);
        while(amount--)
          if((*destination++ = *source++) == '\0') break;
        *destination = '\0';
        return destination;
}
#endif

/*******************************************************************************
* mcfull_file: allocates a full file name=dirname+file. Catenate extension if missing.
*******************************************************************************/
char *mcfull_file(char *name, char *ext)
{
  int   dirlen=0;
  char *mem   =NULL;

  dirlen = dirname ? strlen(dirname) : 0;
  mem = (char*)malloc(dirlen + strlen(name) + CHAR_BUF_LENGTH);
  if(!mem) {
    exit(-fprintf(stderr, "Error: Out of memory %li (mcfull_file)\n", (long)(dirlen + strlen(name) + 256)));
  }
  strcpy(mem, "");

  /* prepend directory name to path if name does not contain a path */
  if (dirlen > 0 && !strchr(name, MC_PATHSEP_C)) {
    strcat(mem, dirname);
    strcat(mem, MC_PATHSEP_S);
  } /* dirlen */

  strcat(mem, name);
  if (!strchr(name, '.') && ext && strlen(ext))
  { /* add extension if not in file name already */
    strcat(mem, ".");
    strcat(mem, ext);
  }
  return(mem);
} /* mcfull_file */

/*******************************************************************************
* mcnew_file: opens a new file within dirname if non NULL
*             the file is opened in "a" (append, create if does not exist)
*             the extension 'ext' is added if the file name does not include one.
*             the last argument is set to 0 if file did not exist, else to 1.
*******************************************************************************/
FILE *mcnew_file(char *name, char *ext, int *exists)
{
  char *mem;
  FILE *file=NULL;

  if (!name || strlen(name) == 0 || mcdisable_output_files) return(NULL);

  mem  = mcfull_file(name, ext); /* create dirname/name.ext */

  /* check for existence */
  file = fopen(mem, "r"); /* for reading -> fails if does not exist */
  if (file) {
    fclose(file);
    *exists=1;
  } else
    *exists=0;

  /* open the file for writing/appending */
#ifdef USE_NEXUS
  if (mcformat && strcasestr(mcformat, "NeXus")) {
    /* NXhandle nxhandle is defined in the .h with USE_NEXUS */
    NXaccess mode = (*exists ? NXACC_CREATE5 | NXACC_RDWR : NXACC_CREATE5);

    if (NXopen(mem, mode, &nxhandle) != NX_OK)
      file = NULL;
    else
      file = (FILE*)&nxhandle; /* to make it non NULL */
  } else
#endif
    file = fopen(mem, "a+");

  if(!file)
    fprintf(stderr, "Warning: could not open output file '%s' for %s (mcnew_file)\n",
      mem, *exists ? "append" : "create");
  free(mem);

  return file;
} /* mcnew_file */

/*******************************************************************************
* mcdetector_statistics: compute detector statistics, error bars, [x I I_err N] 1D
* RETURN:            updated detector structure
* Used by: detector_import
*******************************************************************************/
MCDETECTOR mcdetector_statistics(
  MCDETECTOR detector)
{

  if (!detector.p1 || !detector.m)
    return(detector);

  /* compute statistics and update MCDETECTOR structure ===================== */
  double sum_z  = 0, min_z  = 0, max_z  = 0;
  double fmon_x =0,  smon_x = 0, fmon_y =0, smon_y=0, mean_z=0;
  double Nsum=0, P2sum=0;

  double sum_xz = 0, sum_yz = 0, sum_x = 0, sum_y = 0, sum_x2z = 0, sum_y2z = 0;
  int    i,j;
  char   hasnan=0, hasinf=0;
  char   israw = ((char*)strcasestr(detector.format,"raw") != NULL);
  double *this_p1=NULL; /* new 1D McCode array [x I E N]. Freed after writing data */

  /* if McCode/PGPLOT and rank==1 we create a new m*4 data block=[x I E N] */
  if (detector.rank == 1 && strcasestr(detector.format,"McCode")) {
    this_p1 = (double *)calloc(detector.m*detector.n*detector.p*4, sizeof(double));
    if (!this_p1)
      exit(-fprintf(stderr, "Error: Out of memory creating %zi 1D " MCCODE_STRING " data set for file '%s' (detector_import)\n",
        detector.m*detector.n*detector.p*4*sizeof(double*), detector.filename));
  }

  max_z = min_z = detector.p1[0];

  /* compute sum and moments (not for lists) */
  if (!strcasestr(detector.format,"list") && detector.m)
  for(j = 0; j < detector.n*detector.p; j++)
  {
    for(i = 0; i < detector.m; i++)
    {
      double x,y,z;
      double N, E;
      long   index= !detector.istransposed ? i*detector.n*detector.p + j : i+j*detector.m;
      char   hasnaninf=0;

      if (detector.m)
        x = detector.xmin + (i + 0.5)/detector.m*(detector.xmax - detector.xmin);
      else x = 0;
      if (detector.n && detector.p)
        y = detector.ymin + (j + 0.5)/detector.n/detector.p*(detector.ymax - detector.ymin);
      else y = 0;
      z = detector.p1[index];
      N = detector.p0 ? detector.p0[index] : 1;
      E = detector.p2 ? detector.p2[index] : 0;
      if (detector.p2 && !israw)
        detector.p2[index] = (*mcestimate_error_p)(detector.p0[index],detector.p1[index],detector.p2[index]); /* set sigma */

      if (detector.rank == 1 && this_p1 && strcasestr(detector.format,"McCode")) {
        /* fill-in 1D McCode array [x I E N] */
        this_p1[index*4]   = x;
        this_p1[index*4+1] = z;
        this_p1[index*4+2] = detector.p2 ? detector.p2[index] : 0;
        this_p1[index*4+3] = N;
      }

      if (isnan(z) || isnan(E) || isnan(N)) hasnaninf=hasnan=1;
      if (isinf(z) || isinf(E) || isinf(N)) hasnaninf=hasinf=1;

      /* compute stats integrals */
      if (!hasnaninf) {
        sum_xz += x*z;
        sum_yz += y*z;
        sum_x  += x;
        sum_y  += y;
        sum_z  += z;
        sum_x2z += x*x*z;
        sum_y2z += y*y*z;
        if (z > max_z) max_z = z;
        if (z < min_z) min_z = z;

        Nsum += N;
        P2sum += E;
      }

    }
  } /* for j */

  /* compute 1st and 2nd moments. For lists, sum_z=0 so this is skipped. */
  if (sum_z && detector.n*detector.m*detector.p)
  {
    fmon_x = sum_xz/sum_z;
    fmon_y = sum_yz/sum_z;
    smon_x = sum_x2z/sum_z-fmon_x*fmon_x; smon_x = smon_x > 0 ? sqrt(smon_x) : 0;
    smon_y = sum_y2z/sum_z-fmon_y*fmon_y; smon_y = smon_y > 0 ? sqrt(smon_y) : 0;
    mean_z = sum_z/detector.n/detector.m/detector.p;
  }
  /* store statistics into detector */
  detector.intensity = sum_z;
  detector.error     = Nsum ? (*mcestimate_error_p)(Nsum, sum_z, P2sum) : 0;
  detector.events    = Nsum;
  detector.min       = min_z;
  detector.max       = max_z;
  detector.mean      = mean_z;
  detector.centerX   = fmon_x;
  detector.halfwidthX= smon_x;
  detector.centerY   = fmon_y;
  detector.halfwidthY= smon_y;

  /* if McCode/PGPLOT and rank==1 replace p1 with new m*4 1D McCode and clear others */
  if (detector.rank == 1 && this_p1 && strcasestr(detector.format,"McCode")) {

    detector.p1 = this_p1;
    detector.n  = detector.m; detector.m  = 4;
    detector.p0 = detector.p2 = NULL;
    detector.istransposed = 1;
  }

  if (detector.n*detector.m*detector.p > 1)
    snprintf(detector.signal, CHAR_BUF_LENGTH,
      "Min=%g; Max=%g; Mean=%g;", detector.min, detector.max, detector.mean);
  else
    strcpy(detector.signal, "None");
  snprintf(detector.values, CHAR_BUF_LENGTH,
    "%g %g %g", detector.intensity, detector.error, detector.events);

  switch (detector.rank) {
    case 1:  snprintf(detector.statistics, CHAR_BUF_LENGTH, "X0=%g; dX=%g;",
      detector.centerX, detector.halfwidthX); break;
    case 2:
    case 3:  snprintf(detector.statistics, CHAR_BUF_LENGTH, "X0=%g; dX=%g; Y0=%g; dY=%g;",
      detector.centerX, detector.halfwidthX, detector.centerY, detector.halfwidthY);
      break;
    default: strcpy(detector.statistics, "None");
  }

  if (hasnan)
    printf("WARNING: Nan detected in component/file %s %s\n",
      detector.component, strlen(detector.filename) ? detector.filename : "");
  if (hasinf)
    printf("WARNING: Inf detected in component/file %s %s\n",
      detector.component, strlen(detector.filename) ? detector.filename : "");

  return(detector);

} /* mcdetector_statistics */

/*******************************************************************************
* detector_import: build detector structure, merge non-lists from MPI
*                    compute basic stat, write "Detector:" line
* RETURN:            detector structure. Invalid data if detector.p1 == NULL
*                    Invalid detector sets m=0 and filename=""
*                    Simulation data  sets m=0 and filename=siminfo_name
* This function is equivalent to the old 'mcdetector_out', returning a structure
*******************************************************************************/
MCDETECTOR detector_import(
  char *format,
  char *component, char *title,
  long m, long n,  long p,
  char *xlabel, char *ylabel, char *zlabel,
  char *xvar, char *yvar, char *zvar,
  double x1, double x2, double y1, double y2, double z1, double z2,
  char *filename,
  double *p0, double *p1, double *p2,
  Coords position, Rotation rotation, int index)
{
  time_t t;       /* for detector.date */
  long   date_l;  /* date as a long number */
  char   istransposed=0;
  char   c[CHAR_BUF_LENGTH]; /* temp var for signal label */

  MCDETECTOR detector;

  /* build MCDETECTOR structure ============================================= */
  /* make sure we do not have NULL for char fields */

  /* these also apply to simfile */
  strncpy (detector.filename,  filename ? filename : "",        CHAR_BUF_LENGTH);
  strncpy (detector.format,    format   ? format   : "McCode" , CHAR_BUF_LENGTH);
  /* add extension if missing */
  if (strlen(detector.filename) && !strchr(detector.filename, '.'))
  { /* add extension if not in file name already */
    strcat(detector.filename, ".dat");
  }
  strncpy (detector.component, component ? component : MCCODE_STRING " component", CHAR_BUF_LENGTH);
  #ifdef USE_NEXUS
  char pref[5];
  if (index-1 < 10) {
    sprintf(pref,"000");
  } else if (index-1 < 100) {
    sprintf(pref,"00");
  } else if (index-1 < 1000) {
    sprintf(pref,"0");
  } else if (index-1 < 10000) {
    sprintf(pref,"");
  } else {
    fprintf(stderr,"Error, no support for > 10000 comps at the moment!\n");
    exit(-1);
  }
  sprintf(detector.nexuscomp,"%s%d_%s",pref,index-1,detector.component);
  #endif

  snprintf(detector.instrument, CHAR_BUF_LENGTH, "%s (%s)", instrument_name, instrument_source);
  snprintf(detector.user, CHAR_BUF_LENGTH,      "%s on %s",
        getenv("USER") ? getenv("USER") : MCCODE_NAME,
        getenv("HOST") ? getenv("HOST") : "localhost");
  time(&t);         /* get current write time */
  date_l = (long)t; /* same but as a long */
  snprintf(detector.date, CHAR_BUF_LENGTH, "%s", ctime(&t));
  if (strlen(detector.date))   detector.date[strlen(detector.date)-1] = '\0'; /* remove last \n in date */
  detector.date_l = date_l;

  if (!mcget_run_num() || mcget_run_num() >= mcget_ncount())
    snprintf(detector.ncount, CHAR_BUF_LENGTH, "%llu", mcget_ncount()
#ifdef USE_MPI
*mpi_node_count
#endif
  );
  else
    snprintf(detector.ncount, CHAR_BUF_LENGTH, "%g/%g", (double)mcget_run_num(), (double)mcget_ncount());

  detector.p0         = p0;
  detector.p1         = p1;
  detector.p2         = p2;

  /* handle transposition (not for NeXus) */
  if (!strcasestr(detector.format, "NeXus")) {
    if (m<0 || n<0 || p<0)             istransposed = !istransposed;
    if (strcasestr(detector.format, "transpose")) istransposed = !istransposed;
    if (istransposed) { /* do the swap once for all */
      long i=m; m=n; n=i;
    }
  }

  m=labs(m); n=labs(n); p=labs(p); /* make sure dimensions are positive */
  detector.istransposed = istransposed;

  /* determine detector rank (dimensionality) */
  if (!m || !n || !p || !p1) detector.rank = 4; /* invalid: exit with m=0 filename="" */
  else if (m*n*p == 1)       detector.rank = 0; /* 0D */
  else if (n == 1 || m == 1) detector.rank = 1; /* 1D */
  else if (p == 1)           detector.rank = 2; /* 2D */
  else                       detector.rank = 3; /* 3D */

  /* from rank, set type */
  switch (detector.rank) {
    case 0:  strcpy(detector.type,  "array_0d"); m=n=p=1; break;
    case 1:  snprintf(detector.type, CHAR_BUF_LENGTH, "array_1d(%ld)", m*n*p); m *= n*p; n=p=1; break;
    case 2:  snprintf(detector.type, CHAR_BUF_LENGTH, "array_2d(%ld, %ld)", m, n*p); n *= p; p=1; break;
    case 3:  snprintf(detector.type, CHAR_BUF_LENGTH, "array_3d(%ld, %ld, %ld)", m, n, p); break;
    default: m=0; strcpy(detector.type, ""); strcpy(detector.filename, "");/* invalid */
  }

  detector.m    = m;
  detector.n    = n;
  detector.p    = p;

  /* these only apply to detector files ===================================== */

  detector.Position[0]=position.x;
  detector.Position[1]=position.y;
  detector.Position[2]=position.z;
  rot_copy(detector.Rotation,rotation);
  snprintf(detector.position, CHAR_BUF_LENGTH, "%g %g %g", position.x, position.y, position.z);
  /* may also store actual detector orientation in the future */

  strncpy(detector.title,      title && strlen(title) ? title : component,       CHAR_BUF_LENGTH);
  strncpy(detector.xlabel,     xlabel && strlen(xlabel) ? xlabel : "X", CHAR_BUF_LENGTH); /* axis labels */
  strncpy(detector.ylabel,     ylabel && strlen(ylabel) ? ylabel : "Y", CHAR_BUF_LENGTH);
  strncpy(detector.zlabel,     zlabel && strlen(zlabel) ? zlabel : "Z", CHAR_BUF_LENGTH);
  strncpy(detector.xvar,       xvar && strlen(xvar) ? xvar :       "x", CHAR_BUF_LENGTH); /* axis variables */
  strncpy(detector.yvar,       yvar && strlen(yvar) ? yvar :       detector.xvar, CHAR_BUF_LENGTH);
  strncpy(detector.zvar,       zvar && strlen(zvar) ? zvar :       detector.yvar, CHAR_BUF_LENGTH);

  /* set "variables" as e.g. "I I_err N" */
  strcpy(c, "I ");
  if (strlen(detector.zvar))      strncpy(c, detector.zvar,32);
  else if (strlen(detector.yvar)) strncpy(c, detector.yvar,32);
  else if (strlen(detector.xvar)) strncpy(c, detector.xvar,32);

  if (detector.rank == 1)
    snprintf(detector.variables, CHAR_BUF_LENGTH, "%s %s %s_err N", detector.xvar, c, c);
  else
    snprintf(detector.variables, CHAR_BUF_LENGTH, "%s %s_err N", c, c);

  /* limits */
  detector.xmin = x1;
  detector.xmax = x2;
  detector.ymin = y1;
  detector.ymax = y2;
  detector.zmin = z1;
  detector.zmax = z2;
  if (abs(detector.rank) == 1)
    snprintf(detector.limits, CHAR_BUF_LENGTH, "%g %g", x1, x2);
  else if (detector.rank == 2)
    snprintf(detector.limits, CHAR_BUF_LENGTH, "%g %g %g %g", x1, x2, y1, y2);
  else
    snprintf(detector.limits, CHAR_BUF_LENGTH, "%g %g %g %g %g %g", x1, x2, y1, y2, z1, z2);

  /* if MPI and nodes_nb > 1: reduce data sets when using MPI =============== */
#ifdef USE_MPI
  if (!strcasestr(detector.format,"list") && mpi_node_count > 1 && m) {
    /* we save additive data: reduce everything into mpi_node_root */
    if (p0) mc_MPI_Sum(p0, m*n*p);
    if (p1) mc_MPI_Sum(p1, m*n*p);
    if (p2) mc_MPI_Sum(p2, m*n*p);
    if (!p0) {  /* additive signal must be then divided by the number of nodes */
      int i;
      for (i=0; i<m*n*p; i++) {
        p1[i] /= mpi_node_count;
        if (p2) p2[i] /= mpi_node_count;
      }
    }
  }
#endif /* USE_MPI */

  /* compute statistics, Nsum, intensity, Error bars */
  detector = mcdetector_statistics(detector);

#ifdef USE_MPI
  /* slaves are done */
  if(mpi_node_rank != mpi_node_root) {
    return detector;
  }
#endif

  /* output "Detector:" line ================================================ */
  /* when this is a detector written by a component (not the SAVE from instrument),
     not an event lists */
  if (!m) return(detector);
  if (!strcasestr(detector.format,"list")) {
    if (!strcmp(detector.component, instrument_name)) {
      if (strlen(detector.filename))  /* we name it from its filename, or from its title */
        strncpy(c, detector.filename, CHAR_BUF_LENGTH);
      else
        snprintf(c, CHAR_BUF_LENGTH, "%s", instrument_name);
    } else
      strncpy(c, detector.component, CHAR_BUF_LENGTH);  /* usual detectors written by components */

    printf("Detector: %s_I=%g %s_ERR=%g %s_N=%g",
           c, detector.intensity,
           c, detector.error,
           c, detector.events);
    printf(" \"%s\"\n", strlen(detector.filename) ? detector.filename : detector.component);
  }


  return(detector);
} /* detector_import */

/* end MCDETECTOR import section ============================================ */

















/* ========================================================================== */

/*                               ASCII output                                 */
/*     The SIM file is YAML based, the data files have '#' headers            */

/* ========================================================================== */


/*******************************************************************************
* mcinfo_out: output instrument tags/info (only in SIM)
* Used in: siminfo_init (ascii), mcinfo(stdout)
*******************************************************************************/
static void mcinfo_out(char *pre, FILE *f)
{
  char Parameters[CHAR_BUF_LENGTH] = "";
  int  i;

  if (!f || mcdisable_output_files) return;

  /* create parameter string ================================================ */
  for(i = 0; i < numipar; i++)
  {
    char ThisParam[CHAR_BUF_LENGTH];
    if (strlen(mcinputtable[i].name) > CHAR_BUF_LENGTH) break;
    snprintf(ThisParam, CHAR_BUF_LENGTH, " %s(%s)", mcinputtable[i].name,
            (*mcinputtypes[mcinputtable[i].type].parminfo)
                (mcinputtable[i].name));
    if (strlen(Parameters) + strlen(ThisParam) + 1 >= CHAR_BUF_LENGTH) break;
    strcat(Parameters, ThisParam);
  }

  /* output data ============================================================ */
  if (f != stdout)
    fprintf(f, "%sFile: %s%c%s\n",    pre, dirname, MC_PATHSEP_C, siminfo_name);
  else
    fprintf(f, "%sCreator: %s\n",     pre, MCCODE_STRING);

  fprintf(f, "%sSource: %s\n",   pre, instrument_source);
  fprintf(f, "%sParameters: %s\n",    pre, Parameters);

  fprintf(f, "%sTrace_enabled: %s\n", pre, traceenabled ? "yes" : "no");
  fprintf(f, "%sDefault_main: %s\n",  pre, defaultmain ?  "yes" : "no");
#ifdef MC_EMBEDDED_RUNTIME
  fprintf(f, "%sEmbedded_runtime: %s\n", pre, "yes");
#else
  fprintf(f, "%sEmbedded_runtime: %s\n", pre, "no");
#endif

  fflush(f);
} /* mcinfo_out */

/*******************************************************************************
* mcruninfo_out: output simulation tags/info (both in SIM and data files)
* Used in: siminfo_init (ascii case), mcdetector_out_xD_ascii
*******************************************************************************/
static void mcruninfo_out(char *pre, FILE *f)
{
  int i;
  char Parameters[CHAR_BUF_LENGTH];

  if (!f || mcdisable_output_files) return;

  fprintf(f, "%sFormat: %s%s\n",      pre,
    mcformat && strlen(mcformat) ? mcformat : MCCODE_NAME,
    mcformat && strcasestr(mcformat,"McCode") ? " with text headers" : "");
  fprintf(f, "%sURL: %s\n",         pre, "http://www.mccode.org");
  fprintf(f, "%sCreator: %s\n",     pre, MCCODE_STRING);
  fprintf(f, "%sInstrument: %s\n", pre, instrument_source);
  fprintf(f, "%sNcount: %llu\n",        pre, mcget_ncount());
  fprintf(f, "%sTrace: %s\n",       pre, mcdotrace ? "yes" : "no");
  fprintf(f, "%sGravitation: %s\n", pre, mcgravitation ? "yes" : "no");
  snprintf(Parameters, CHAR_BUF_LENGTH, "%ld", mcseed);
  fprintf(f, "%sSeed: %s\n",        pre, Parameters);
  fprintf(f, "%sDirectory: %s\n",        pre, dirname ? dirname : ".");
#ifdef USE_MPI
  if (mpi_node_count > 1)
    fprintf(f, "%sNodes: %i\n",        pre, mpi_node_count);
#endif

  // TODO Consider replacing this by a a call to `mcparameterinfo_out(pre+"Param: ", f)`
  /* output parameter string ================================================ */
  for(i = 0; i < numipar; i++) {
      if (mcinputtable[i].par){
	/* Parameters with a default value */
	if(mcinputtable[i].val && strlen(mcinputtable[i].val)){
	  (*mcinputtypes[mcinputtable[i].type].printer)(Parameters, mcinputtable[i].par);
	  fprintf(f, "%sParam: %s=%s\n", pre, mcinputtable[i].name, Parameters);
        /* ... and those without */
	}else{
	  fprintf(f, "%sParam: %s=NULL\n", pre, mcinputtable[i].name);
	}
      }
  }
  fflush(f);
} /* mcruninfo_out */

/*******************************************************************************
 * @brief Print parameter information to the specified file
 * @param pre any beginning-of-line padding
 * @param f the output file
 */
static void mcparameterinfo_out(char * pre, FILE *f){
  if (!f || mcdisable_output_files) return;

  unsigned int nchar = 4;
  for (int i=0; i < numipar; ++i){
    if (mcinputtable[i].par && mcinputtable[i].val && strlen(mcinputtable[i].val) > nchar)
      nchar = strlen(mcinputtable[i].val);
  }
  char * buffer = calloc(nchar+1, sizeof(char));

  if (!buffer) {
    exit(1);
  }

  for (int i=0; i < numipar; ++i) {
    if (mcinputtable[i].par) {
      char * name = mcinputtable[i].name;
      if (mcinputtable[i].val && strlen(mcinputtable[i].val)) {
        mcinputtypes[mcinputtable[i].type].printer(buffer, mcinputtable[i].par);
      } else {
        strcpy(buffer, "NULL");
      }
      if (strlen(mcinputtable[i].unit)){
        //fprintf(f, "%s%s %s (\"%s\") = %s\n", pre, mcinputtypes[mcinputtable[i].type].parminfo(name), name, mcinputtable[i].unit, buffer);
        fprintf(f, "%s%s %s/\"%s\" = %s\n", pre, mcinputtypes[mcinputtable[i].type].parminfo(name), name, mcinputtable[i].unit, buffer);
      } else {
        fprintf(f, "%s%s %s = %s\n", pre, mcinputtypes[mcinputtable[i].type].parminfo(name), name, buffer);
      }
    }
  }

  free(buffer);
}

/*******************************************************************************
* siminfo_out:    wrapper to fprintf(siminfo_file)
*******************************************************************************/
void siminfo_out(char *format, ...)
{
  va_list ap;

  if(siminfo_file && !mcdisable_output_files)
  {
    va_start(ap, format);
    vfprintf(siminfo_file, format, ap);
    va_end(ap);
  }
} /* siminfo_out */


/*******************************************************************************
* mcdatainfo_out: output detector header
*   mcdatainfo_out(prefix, file_handle, detector) writes info to data file
*******************************************************************************/
static void
mcdatainfo_out(char *pre, FILE *f, MCDETECTOR detector)
{
  if (!f || !detector.m || mcdisable_output_files) return;

  /* output data ============================================================ */
  fprintf(f, "%sDate: %s (%li)\n",       pre, detector.date, detector.date_l);
  fprintf(f, "%stype: %s\n",       pre, detector.type);
  fprintf(f, "%sSource: %s\n",     pre, detector.instrument);
  fprintf(f, "%scomponent: %s\n",  pre, detector.component);
  fprintf(f, "%sposition: %s\n",   pre, detector.position);

  fprintf(f, "%stitle: %s\n",      pre, detector.title);
  fprintf(f, !mcget_run_num() || mcget_run_num() >= mcget_ncount() ?
             "%sNcount: %s\n" :
             "%sratio: %s\n",  pre, detector.ncount);

  if (strlen(detector.filename)) {
    fprintf(f, "%sfilename: %s\n", pre, detector.filename);
  }

  fprintf(f, "%sstatistics: %s\n", pre, detector.statistics);
  fprintf(f, "%ssignal: %s\n",     pre, detector.signal);
  fprintf(f, "%svalues: %s\n",     pre, detector.values);

  if (detector.rank >= 1)
  {
    fprintf(f, "%sxvar: %s\n",     pre, detector.xvar);
    fprintf(f, "%syvar: %s\n",     pre, detector.yvar);
    fprintf(f, "%sxlabel: %s\n",   pre, detector.xlabel);
    fprintf(f, "%sylabel: %s\n",   pre, detector.ylabel);
    if (detector.rank > 1) {
      fprintf(f, "%szvar: %s\n",   pre, detector.zvar);
      fprintf(f, "%szlabel: %s\n", pre, detector.zlabel);
    }
  }

  fprintf(f,
    abs(detector.rank)==1 ?
             "%sxlimits: %s\n" :
             "%sxylimits: %s\n", pre, detector.limits);
  fprintf(f, "%svariables: %s\n", pre,
    strcasestr(detector.format, "list") ? detector.ylabel : detector.variables);

  fflush(f);

} /* mcdatainfo_out */

/* mcdetector_out_array_ascii: output a single array to a file
 *   m: columns
 *   n: rows
 *   p: array
 *   f: file handle (already opened)
 */
static void mcdetector_out_array_ascii(long m, long n, double *p, FILE *f, char istransposed)
{
  if(f)
  {
    int i,j;
    for(j = 0; j < n; j++)
    {
      for(i = 0; i < m; i++)
      {
          fprintf(f, "%.10g ", p[!istransposed ? i*n + j : j*m+i]);
      }
      fprintf(f,"\n");
    }
  }
} /* mcdetector_out_array_ascii */

/*******************************************************************************
* mcdetector_out_0D_ascii: called by mcdetector_out_0D for ascii output
*******************************************************************************/
MCDETECTOR mcdetector_out_0D_ascii(MCDETECTOR detector)
{
  int exists=0;
  FILE *outfile = NULL;

  /* Write data set information to simulation description file. */
  MPI_MASTER(
    siminfo_out("\nbegin data\n"); // detector.component
    mcdatainfo_out("  ", siminfo_file, detector);
    siminfo_out("end data\n");
    /* Don't write if filename is NULL: mcnew_file handles this (return NULL) */
    outfile = mcnew_file(detector.component, "dat", &exists);
    if(outfile)
    {
      /* write data file header and entry in simulation description file */
      mcruninfo_out( "# ", outfile);
      mcdatainfo_out("# ", outfile, detector);
      /* write I I_err N */
      fprintf(outfile, "%g %g %g\n",
        detector.intensity, detector.error, detector.events);
      fclose(outfile);
    }
  ); /* MPI_MASTER */
  return(detector);
} /* mcdetector_out_0D_ascii */

/*******************************************************************************
* mcdetector_out_1D_ascii: called by mcdetector_out_1D for ascii output
*******************************************************************************/
MCDETECTOR mcdetector_out_1D_ascii(MCDETECTOR detector)
{
  int exists=0;
  FILE *outfile = NULL;

  MPI_MASTER(
    /* Write data set information to simulation description file. */
    siminfo_out("\nbegin data\n"); // detector.filename
    mcdatainfo_out("  ", siminfo_file, detector);
    siminfo_out("end data\n");
    /* Loop over array elements, writing to file. */
    /* Don't write if filename is NULL: mcnew_file handles this (return NULL) */
    outfile = mcnew_file(detector.filename, "dat", &exists);
    if(outfile)
    {
      /* write data file header and entry in simulation description file */
      mcruninfo_out( "# ", outfile);
      mcdatainfo_out("# ", outfile, detector);
      /* output the 1D array columns */
      mcdetector_out_array_ascii(detector.m, detector.n, detector.p1, outfile, detector.istransposed);

      fclose(outfile);
    }
  ); /* MPI_MASTER */
  return(detector);

}  /* mcdetector_out_1D_ascii */

/*******************************************************************************
* mcdetector_out_2D_ascii: called by mcdetector_out_2D for ascii output
*******************************************************************************/
MCDETECTOR mcdetector_out_2D_ascii(MCDETECTOR detector)
{
  int exists=0;
  FILE *outfile = NULL;

  MPI_MASTER(
    /* Loop over array elements, writing to file. */
    /* Don't write if filename is NULL: mcnew_file handles this (return NULL) */
    outfile = mcnew_file(detector.filename, "dat", &exists);
    if(outfile)
    {
      /* write header only if file has just been created (not appending) */
      if (!exists) {
        /* Write data set information to simulation description file. */
        siminfo_out("\nbegin data\n"); // detector.filename
        mcdatainfo_out("  ", siminfo_file, detector);
        siminfo_out("end data\n");

        mcruninfo_out( "# ", outfile);
        mcdatainfo_out("# ", outfile,   detector);
      }
      /* Add # Data entry for any write to the file (e.g. via -USR2, see GitHub issue #2174 ) */
      fprintf(outfile, "# Data [%s/%s] %s:\n", detector.component, detector.filename, detector.zvar);
      mcdetector_out_array_ascii(detector.m, detector.n*detector.p, detector.p1,
        outfile, detector.istransposed);
      if (detector.p2) {
        fprintf(outfile, "# Errors [%s/%s] %s_err:\n", detector.component, detector.filename, detector.zvar);
        mcdetector_out_array_ascii(detector.m, detector.n*detector.p, detector.p2,
          outfile, detector.istransposed);
      }
      if (detector.p0) {
        fprintf(outfile, "# Events [%s/%s] N:\n", detector.component, detector.filename);
        mcdetector_out_array_ascii(detector.m, detector.n*detector.p, detector.p0,
          outfile, detector.istransposed);
      }
      fclose(outfile);

      if (!exists) {
        if (strcasestr(detector.format, "list"))
          printf("Events:   \"%s\"\n",
            strlen(detector.filename) ? detector.filename : detector.component);
      }
    } /* if outfile */
  ); /* MPI_MASTER */
#ifdef USE_MPI
  if (strcasestr(detector.format, "list") && mpi_node_count > 1) {
    int node_i=0;
    /* loop along MPI nodes to write sequentially */
    for(node_i=0; node_i<mpi_node_count; node_i++) {
      /* MPI: slaves wait for the master to write its block, then append theirs */
      MPI_Barrier(MPI_COMM_WORLD);
      if (node_i != mpi_node_root && node_i == mpi_node_rank) {
        if(strlen(detector.filename) && !mcdisable_output_files)	/* Don't write if filename is NULL */
          outfile = mcnew_file(detector.filename, "dat", &exists);
        if (!exists)
          fprintf(stderr, "Warning: [MPI node %i] file '%s' does not exist yet, "
                          "MASTER should have opened it before.\n",
            mpi_node_rank, detector.filename);
        if(outfile) {
          mcdetector_out_array_ascii(detector.m, detector.n*detector.p, detector.p1,
            outfile, detector.istransposed);
          fclose(outfile);
        }
      }
    }
  } /* if strcasestr list */
#endif
  return(detector);
} /* mcdetector_out_2D_ascii */

/*******************************************************************************
* strcpy_valid: makes a valid string for variable names.
*   copy 'original' into 'valid', replacing invalid characters by '_'
*   char arrays must be pre-allocated
*******************************************************************************/
static char *strcpy_valid(char *valid, char *original)
{
  long i;
  int  n=CHAR_BUF_LENGTH; /* max length of valid names */

  if (original == NULL || !strlen(original)) return(NULL);

  if (n > strlen(original)) n = strlen(original);
  else original += strlen(original)-n;
  strncpy(valid, original, n);

  for (i=0; i < n; i++)
  {
    if ( (valid[i] > 122)
      || (valid[i] < 32)
      || (strchr("!\"#$%&'()*+,-.:;<=>?@[\\]^`/ \n\r\t", valid[i]) != NULL) )
    {
      if (i) valid[i] = '_'; else valid[i] = 'm';
    }
  }
  valid[i] = '\0';

  return(valid);
} /* strcpy_valid */

/* end ascii output section ================================================= */







#ifdef USE_NEXUS

/* ========================================================================== */

/*                               NeXus output                                 */

/* ========================================================================== */

#define nxprintf(...)    nxstr('d', __VA_ARGS__)
#define nxprintattr(...) nxstr('a', __VA_ARGS__)

/*******************************************************************************
* nxstr: output a tag=value data set (char) in NeXus/current group
*   when 'format' is larger that 1024 chars it is used as value for the 'tag'
*   else the value is assembled with format and following arguments.
*   type='d' -> data set
*        'a' -> attribute for current data set
*******************************************************************************/
static int nxstr(char type, NXhandle *f, char *tag, char *format, ...)
{
  va_list ap;
  char value[CHAR_BUF_LENGTH];
  int  i;
  int  ret=NX_OK;

  if (!tag || !format || !strlen(tag) || !strlen(format)) return(NX_OK);

  /* assemble the value string */
  if (strlen(format) < CHAR_BUF_LENGTH) {
    va_start(ap, format);
    ret = vsnprintf(value, CHAR_BUF_LENGTH, format, ap);
    va_end(ap);

    i = strlen(value);
  } else {
    i = strlen(format);
  }

  if (type == 'd') {
    /* open/put/close data set */
    if (NXmakedata (f, tag, NX_CHAR, 1, &i) != NX_OK) return(NX_ERROR);
    NXopendata (f, tag);
    if (strlen(format) < CHAR_BUF_LENGTH)
      ret = NXputdata  (f, value);
    else
      ret = NXputdata  (f, format);
    NXclosedata(f);
  } else {
    if (strlen(format) < CHAR_BUF_LENGTH)
      ret = NXputattr  (f, tag, value, strlen(value), NX_CHAR);
    else
      ret = NXputattr  (f, tag, format, strlen(format), NX_CHAR);
  }

  return(ret);

} /* nxstr */

/*******************************************************************************
* mcinfo_readfile: read a full file into a string buffer which is allocated
*   Think to free the buffer after use.
* Used in: mcinfo_out_nexus (nexus)
*******************************************************************************/
char *mcinfo_readfile(char *filename)
{
  FILE *f = fopen(filename, "rb");
  if (!f) return(NULL);
  fseek(f, 0, SEEK_END);
  long fsize = ftell(f);
  rewind(f);
  char *string = malloc(fsize + 1);
  if (string) {
    int n = fread(string, fsize, 1, f);
    fclose(f);

    string[fsize] = 0;
  }
  return(string);
}

/*******************************************************************************
* mcinfo_out: output instrument/simulation groups in NeXus file
* Used in: siminfo_init (nexus)
*******************************************************************************/
static void mcinfo_out_nexus(NXhandle f)
{
  FILE  *fid;     /* for intrument source code/C/IDF */
  char  *buffer=NULL;
  time_t t     =time(NULL); /* for date */
  char   entry0[CHAR_BUF_LENGTH];
  int    count=0;
  char   name[CHAR_BUF_LENGTH];
  char   class[CHAR_BUF_LENGTH];

  if (!f || mcdisable_output_files) return;

  /* write NeXus NXroot attributes */
  /* automatically added: file_name, HDF5_Version, file_time, NeXus_version */
  nxprintattr(f, "creator",   "%s generated with " MCCODE_STRING, instrument_name);

  /* count the number of existing NXentry and create the next one */
  NXgetgroupinfo(f, &count, name, class);
  sprintf(entry0, "entry%i", count+1);

  /* create the main NXentry (mandatory in NeXus) */
  if (NXmakegroup(f, entry0, "NXentry") == NX_OK)
  if (NXopengroup(f, entry0, "NXentry") == NX_OK) {
    nxprintf(nxhandle, "program_name", MCCODE_STRING);
    nxprintf(f, "start_time", ctime(&t));
    nxprintf(f, "title", "%s%s%s simulation generated by instrument %s",
      dirname && strlen(dirname) ? dirname : ".", MC_PATHSEP_S, siminfo_name,
      instrument_name);
    nxprintattr(f, "program_name", MCCODE_STRING);
    nxprintattr(f, "instrument",   instrument_name);
    nxprintattr(f, "simulation",   "%s%s%s",
        dirname && strlen(dirname) ? dirname : ".", MC_PATHSEP_S, siminfo_name);

    /* write NeXus instrument group */
    if (NXmakegroup(f, "instrument", "NXinstrument") == NX_OK)
    if (NXopengroup(f, "instrument", "NXinstrument") == NX_OK) {
      int   i;
      char *string=NULL;

      /* write NeXus parameters(types) data =================================== */
      string = (char*)malloc(CHAR_BUF_LENGTH);
      if (string) {
        strcpy(string, "");
        for(i = 0; i < numipar; i++)
        {
          char ThisParam[CHAR_BUF_LENGTH];
          snprintf(ThisParam, CHAR_BUF_LENGTH, " %s(%s)", mcinputtable[i].name,
                  (*mcinputtypes[mcinputtable[i].type].parminfo)
                      (mcinputtable[i].name));
          if (strlen(string) + strlen(ThisParam) < CHAR_BUF_LENGTH)
            strcat(string, ThisParam);
        }
        nxprintattr(f, "Parameters",    string);
        free(string);
      }

      nxprintattr(f, "name",          instrument_name);
      nxprintf   (f, "name",          instrument_name);
      nxprintattr(f, "Source",        instrument_source);

      nxprintattr(f, "Trace_enabled", traceenabled ? "yes" : "no");
      nxprintattr(f, "Default_main",  defaultmain ?  "yes" : "no");
#ifdef MC_EMBEDDED_RUNTIME
      nxprintattr(f, "Embedded_runtime", "yes");
#else
      nxprintattr(f, "Embedded_runtime", "no");
#endif

      /* add instrument source code when available */
      buffer = mcinfo_readfile(instrument_source);
      if (buffer && strlen(buffer)) {
        long length=strlen(buffer);
        nxprintf (f, "description", buffer);
        NXopendata(f,"description");
        nxprintattr(f, "file_name", instrument_source);
        nxprintattr(f, "file_size", "%li", length);
        nxprintattr(f, "MCCODE_STRING", MCCODE_STRING);
        NXclosedata(f);
        nxprintf (f,"instrument_source", "%s " MCCODE_NAME " " MCCODE_PARTICLE " Monte Carlo simulation", instrument_name);
        free(buffer);
      } else
        nxprintf (f, "description", "File %s not found (instrument description %s is missing)",
          instrument_source, instrument_name);

      if (mcnexus_embed_idf) {
        /* add Mantid/IDF.xml when available */
        char *IDFfile=NULL;
        IDFfile = (char*)malloc(CHAR_BUF_LENGTH);
        sprintf(IDFfile,"%s%s",instrument_source,".xml");
        buffer = mcinfo_readfile(IDFfile);
        if (buffer && strlen(buffer)) {
          NXmakegroup (nxhandle, "instrument_xml", "NXnote");
          NXopengroup (nxhandle, "instrument_xml", "NXnote");
          nxprintf(f, "data", buffer);
          nxprintf(f, "description", "IDF.xml file found with instrument %s", instrument_source);
          nxprintf(f, "type", "text/xml");
          NXclosegroup(f); /* instrument_xml */
          free(buffer);
        }
        free(IDFfile);
      }

      /* Add "components" entry */
      if (NXmakegroup(f, "components", "NXdata") == NX_OK) {
        NXopengroup(f, "components", "NXdata");
        nxprintattr(f, "description", "Component list for instrument %s",  instrument_name);
	NXclosegroup(f); /* components */
      } else {
	printf("Failed to create NeXus component hierarchy\n");
      }
      NXclosegroup(f); /* instrument */
    } /* NXinstrument */

    /* write NeXus simulation group */
    if (NXmakegroup(f, "simulation", "NXnote") == NX_OK)
    if (NXopengroup(f, "simulation", "NXnote") == NX_OK) {

      nxprintattr(f, "name",   "%s%s%s",
        dirname && strlen(dirname) ? dirname : ".", MC_PATHSEP_S, siminfo_name);

      nxprintf   (f, "name",      "%s",     siminfo_name);
      nxprintattr(f, "Format",    mcformat && strlen(mcformat) ? mcformat : MCCODE_NAME);
      nxprintattr(f, "URL",       "http://www.mccode.org");
      nxprintattr(f, "program",   MCCODE_STRING);
      nxprintattr(f, "Instrument",instrument_source);
      nxprintattr(f, "Trace",     mcdotrace ?     "yes" : "no");
      nxprintattr(f, "Gravitation",mcgravitation ? "yes" : "no");
      nxprintattr(f, "Seed",      "%li", mcseed);
      nxprintattr(f, "Directory", dirname);
    #ifdef USE_MPI
      if (mpi_node_count > 1)
        nxprintf(f, "Nodes", "%i",        mpi_node_count);
    #endif

      /* output parameter string ================================================ */
      if (NXmakegroup(f, "Param", "NXparameters") == NX_OK) {
	NXopengroup(f,"Param", "NXparameters");
        int i;
        char string[CHAR_BUF_LENGTH];
        for(i = 0; i < numipar; i++) {
          if (mcget_run_num() || (mcinputtable[i].val && strlen(mcinputtable[i].val))) {
            if (mcinputtable[i].par == NULL)
              strncpy(string, (mcinputtable[i].val ? mcinputtable[i].val : ""), CHAR_BUF_LENGTH);
            else
              (*mcinputtypes[mcinputtable[i].type].printer)(string, mcinputtable[i].par);

            nxprintf(f,  mcinputtable[i].name, "%s", string);
            nxprintattr(f, mcinputtable[i].name, string);
          }
        }
        NXclosegroup(f); /* Param */
      } /* NXparameters */
      NXclosegroup(f); /* simulation */
    } /* NXsimulation */

    /* create a group to hold all links for all monitors */
    NXmakegroup(f, "data", "NXdetector");

    /* leave the NXentry opened (closed at exit) */
  } /* NXentry */
} /* mcinfo_out_nexus */

/*******************************************************************************
* mccomp_placement_type_nexus:
*   Places
*    - absolute (3x1) position
*    - absolute (3x3) rotation
*    - type / class of component instance into attributes under
*     entry<N>/instrument/compname
*   requires: NXentry to be opened
*******************************************************************************/
static void mccomp_placement_type_nexus(NXhandle nxhandle, char* component, Coords position, Rotation rotation, char* comptype)
{
  /* open NeXus instrument group */

  #ifdef USE_NEXUS
  if(nxhandle) {
    if (NXopengroup(nxhandle, "instrument", "NXinstrument") == NX_OK) {
      if (NXopengroup(nxhandle, "components", "NXdata") == NX_OK) {
	if (NXmakegroup(nxhandle, component, "NXdata") == NX_OK) {
	  if (NXopengroup(nxhandle, component, "NXdata") == NX_OK) {
	    int64_t pdims[3]; pdims[0]=3; pdims[1]=0; pdims[2]=0;
	    if (NXcompmakedata64(nxhandle, "Position", NX_FLOAT64, 1, pdims, NX_COMPRESSION, pdims) == NX_OK) {
	      if (NXopendata(nxhandle, "Position") == NX_OK) {
		double pos[3]; coords_get(position, &pos[0], &pos[1], &pos[2]);
		if (NXputdata (nxhandle, pos) == NX_OK) {
		  NXclosedata(nxhandle);
		} else {
		  fprintf(stderr, "COULD NOT PUT Position field for component %s\n",component);
		}
	      } else {
		fprintf(stderr, "Warning: could not open Position field for component %s\n",component);
	      }
	    }
	    int64_t rdims[3]; rdims[0]=3; rdims[1]=3; rdims[2]=0;
	    if (NXcompmakedata64(nxhandle, "Rotation", NX_FLOAT64, 2, rdims, NX_COMPRESSION, rdims) == NX_OK) {
	      if (NXopendata(nxhandle, "Rotation") == NX_OK) {
		if (NXputdata (nxhandle, rotation) == NX_OK) {
		  NXclosedata(nxhandle);
		} else {
		  fprintf(stderr, "COULD NOT PUT Rotation field for component %s\n",component);
		}
	      } else {
		fprintf(stderr, "Warning: could not open Rotation field for component %s\n",component);
	      }
	    }
	    nxprintf(nxhandle, "Component_type", comptype);
	    NXclosegroup(nxhandle); // component
	  } else {
	    printf("FAILED to open comp data group %s\n",component);
	  }
	} else {
	  printf("FAILED to create comp data group %s\n",component);
	}
	NXclosegroup(nxhandle); // components
      } else {
	printf("Failed to open NeXus component hierarchy\n");
      }
      NXclosegroup(nxhandle); // instrument
    } else {
      printf("Failed to open NeXus instrument hierarchy\n");
    }
  } else {
    fprintf(stderr,"NO NEXUS FILE\n");
  }
  #endif
} /* mccomp_placement_nexus */

/*******************************************************************************
* mccomp_param_nexus:
*   Output parameter/value pair for component instance into
*   the attribute
*     entry<N>/instrument/compname/parameter
*   requires: NXentry to be opened
*******************************************************************************/
static void mccomp_param_nexus(NXhandle nxhandle, char* component, char* parameter, char* defval, char* value, char* type)
{
  /* open NeXus instrument group */

  #ifdef USE_NEXUS
  if(nxhandle) {
    if (NXopengroup(nxhandle, "instrument", "NXinstrument") == NX_OK) {
      if (NXopengroup(nxhandle, "components", "NXdata") == NX_OK) {
	if (NXopengroup(nxhandle, component, "NXdata") == NX_OK) {
	  NXMDisableErrorReporting(); /* inactivate NeXus error messages, as creation may fail */
	  NXmakegroup(nxhandle, "parameters", "NXdata");
	  NXMEnableErrorReporting();  /* re-enable NeXus error messages */
	  if (NXopengroup(nxhandle, "parameters", "NXdata") == NX_OK) {
	    NXmakegroup(nxhandle, parameter, "NXnote");
	    if (NXopengroup(nxhandle, parameter, "NXnote") == NX_OK) {
	      nxprintattr(nxhandle, "type", type);
	      nxprintattr(nxhandle, "default",  defval);
	      nxprintattr(nxhandle, "value",  value);
	      NXclosegroup(nxhandle); // parameter
	    } else {
	      printf("FAILED to open parameters %s data group \n",parameter);
	    }
	    NXclosegroup(nxhandle); // "parameters"
	  } else {
	    printf("FAILED to open comp/parameters data group \n");
	  }
	  NXclosegroup(nxhandle); // component
	  } else {
	  printf("FAILED to open comp data group %s\n",component);
	}
	NXclosegroup(nxhandle); // components
      } else {
	printf("Failed to open NeXus component hierarchy\n");
      }
      NXclosegroup(nxhandle); // instrument
    } else {
      printf("Failed to open NeXus instrument hierarchy\n");
    }
  } else {
    fprintf(stderr,"NO NEXUS FILE\n");
  }
#endif
} /* mccomp_param_nexus */

/*******************************************************************************
* mcdatainfo_out_nexus: output detector header
*   mcdatainfo_out_nexus(detector) create group and write info to NeXus data file
*   open data:NXdetector then filename:NXdata and write headers/attributes
*   requires: NXentry to be opened
*******************************************************************************/
static void
mcdatainfo_out_nexus(NXhandle f, MCDETECTOR detector)
{
  char data_name[CHAR_BUF_LENGTH];
  if (!f || !detector.m || mcdisable_output_files) return;

  strcpy_valid(data_name,
    strlen(detector.filename) ?
      detector.filename : detector.component);

  /* the NXdetector group has been created in mcinfo_out_nexus (siminfo_init) */
  if (NXopengroup(f, "instrument", "NXinstrument") == NX_OK) {
    if (NXopengroup(f, "components", "NXdata") == NX_OK) {
      NXMDisableErrorReporting(); /* inactivate NeXus error messages, as creation may fail */
      NXmakegroup(f, detector.nexuscomp, "NXdata");
      if (NXopengroup(f, detector.nexuscomp, "NXdata") == NX_OK) {
	NXmakegroup(f, "output", "NXdetector");
	if (NXopengroup(f, "output", "NXdetector") == NX_OK) {
	  if (NXmakegroup(f, data_name, "NXdata") == NX_OK) {
	    if (NXopengroup(f, data_name, "NXdata") == NX_OK) {
	      /* output metadata (as attributes) ======================================== */
	      nxprintattr(f, "Date",       detector.date);
	      nxprintattr(f, "type",       detector.type);
	      nxprintattr(f, "Source",     detector.instrument);
	      nxprintattr(f, "component",  detector.component);
	      nxprintattr(f, "position",   detector.position);

	      nxprintattr(f, "title",      detector.title);
	      nxprintattr(f, !mcget_run_num() || mcget_run_num() >= mcget_ncount() ?
			  "Ncount" :
			  "ratio",  detector.ncount);

	      if (strlen(detector.filename)) {
		nxprintattr(f, "filename", detector.filename);
	      }

	      nxprintattr(f, "statistics", detector.statistics);
	      nxprintattr(f, "signal",     detector.signal);
	      nxprintattr(f, "values",     detector.values);

	      if (detector.rank >= 1)
		{
		  nxprintattr(f, "xvar",     detector.xvar);
		  nxprintattr(f, "yvar",     detector.yvar);
		  nxprintattr(f, "xlabel",   detector.xlabel);
		  nxprintattr(f, "ylabel",   detector.ylabel);
		  if (detector.rank > 1) {
		    nxprintattr(f, "zvar",   detector.zvar);
		    nxprintattr(f, "zlabel", detector.zlabel);
		  }
		}

	      nxprintattr(f, abs(detector.rank)==1 ?
			  "xlimits" :
			  "xylimits", detector.limits);
	      nxprintattr(f, "variables",
			  strcasestr(detector.format, "list") ? detector.ylabel : detector.variables);

	      NXclosegroup(f); // data_name
	    }
	  }
	}
	NXclosegroup(f); // output
	NXclosegroup(f); // detector.nexuscomp
      }
      NXclosegroup(f); // components
    }
    NXMEnableErrorReporting();  /* re-enable NeXus error messages */
    NXclosegroup(f); // instrument
  } /* NXdetector (instrument) */ 
} /* mcdatainfo_out_nexus */

/*******************************************************************************
* mcdetector_out_axis_nexus: write detector axis into current NXdata
*   requires: NXdata to be opened
*******************************************************************************/
int mcdetector_out_axis_nexus(NXhandle f, char *label, char *var, int rank, long length, double min, double max)
{
  if (!f || length <= 1 || mcdisable_output_files || max == min) return(NX_OK);
  else {
    double *axis;
    axis=malloc(sizeof(double)*length);
    if (!axis ) {
      printf("Fatal memory error allocating NeXus axis of length %li, exiting!\n", length);
      return(NX_ERROR);
    }
    char *valid;
    valid=malloc(sizeof(char)*CHAR_BUF_LENGTH);
    if (!valid ) {
      printf("Fatal memory error allocating label axis of length %li, exiting!\n", CHAR_BUF_LENGTH);
      free(axis);
      return(NX_ERROR);
    }
    int dim=(int)length;
    int i;
    int nprimary=1;
    /* create an axis from [min:max] */
    for(i = 0; i < length; i++)
      axis[i] = min+(max-min)*(i+0.5)/length;
    /* create the data set */
    strcpy_valid(valid, label);
    NXcompmakedata(f, valid, NX_FLOAT64, 1, &dim, NX_COMPRESSION, &dim);
    /* open it */
    if (NXopendata(f, valid) != NX_OK) {
      fprintf(stderr, "Warning: could not open axis rank %i '%s' (NeXus)\n",
        rank, valid);
      free(axis);
      free(valid);
      return(NX_ERROR);
    }
    /* put the axis and its attributes */
    NXputdata  (f, axis);
    nxprintattr(f, "long_name",  label);
    nxprintattr(f, "short_name", var);
    NXputattr  (f, "axis",       &rank,     1, NX_INT32);
    nxprintattr(f, "units",      var);
    NXputattr  (f, "primary",    &nprimary, 1, NX_INT32);
    NXclosedata(f);
    free(axis);
    free(valid);
    return(NX_OK);
  }
} /* mcdetector_out_axis_nexus */

/*******************************************************************************
* mcdetector_out_array_nexus: write detector array into current NXdata (1D,2D)
*   requires: NXdata to be opened
*******************************************************************************/
int mcdetector_out_array_nexus(NXhandle f, char *part, double *data, MCDETECTOR detector)
{

  int64_t dims[3]={detector.m,detector.n,detector.p};  /* number of elements to write */
  int64_t fulldims[3]={detector.m,detector.n,detector.p};
  int signal=1;
  int exists=0;
  int64_t current_dims[3]={0,0,0};
  int ret=NX_OK;

  if (!f || !data || !detector.m || mcdisable_output_files) return(NX_OK);

  /* when this is a list, we set 1st dimension to NX_UNLIMITED for creation */
  if (strcasestr(detector.format, "list")) fulldims[0] = NX_UNLIMITED;

  /* create the data set in NXdata group */
  NXMDisableErrorReporting(); /* inactivate NeXus error messages, as creation may fail */
  ret = NXcompmakedata64(f, part, NX_FLOAT64, detector.rank, fulldims, NX_COMPRESSION, dims);
  if (ret != NX_OK) {
    /* failed: data set already exists */
    int datatype=0;
    int rank=0;
    exists=1;
    /* inquire current size of data set (nb of events stored) */
    NXopendata(f, part);
    NXgetinfo64(f, &rank, current_dims, &datatype);
    NXclosedata(f);
  }
  NXMEnableErrorReporting();  /* re-enable NeXus error messages */

  /* open the data set */
  if (NXopendata(f, part) == NX_ERROR) {
    fprintf(stderr, "Warning: could not open DataSet %s '%s' (NeXus)\n",
      part, detector.title);
    return(NX_ERROR);
  }
  if (strcasestr(detector.format, "list")) {
    current_dims[1] = current_dims[2] = 0; /* set starting location for writing slab */
    NXputslab64(f, data, current_dims, dims);
    if (!exists)
      printf("Events:   \"%s\"\n",
        strlen(detector.filename) ? detector.filename : detector.component);
    else
      printf("Append:   \"%s\"\n",
	     strlen(detector.filename) ? detector.filename : detector.component);
  } else {
    NXputdata (f, data);
  }

  if (strstr(part,"data") || strstr(part, "events")) {
    NXputattr(f, "signal", &signal, 1, NX_INT32);
    nxprintattr(f, "short_name", strlen(detector.filename) ?
      detector.filename : detector.component);
  }
  nxprintattr(f, "long_name", "%s '%s'", part, detector.title);
  NXclosedata(f);

  return(NX_OK);
} /* mcdetector_out_array_nexus */

/*******************************************************************************
* mcdetector_out_data_nexus: write detector axes+data into current NXdata
*   The data:NXdetector is opened, then filename:NXdata
*   requires: NXentry to be opened
*******************************************************************************/
int mcdetector_out_data_nexus(NXhandle f, MCDETECTOR detector)
{
  char data_name[CHAR_BUF_LENGTH];

  if (!f || !detector.m || mcdisable_output_files) return(NX_OK);

  strcpy_valid(data_name,
    strlen(detector.filename) ?
      detector.filename : detector.component);
  NXlink pLink;
  /* the NXdetector group has been created in mcinfo_out_nexus (siminfo_init) */
  if (NXopengroup(f, "instrument", "NXinstrument") == NX_OK) {
    if (NXopengroup(f, "components", "NXdata") == NX_OK) {
      if (NXopengroup(f, detector.nexuscomp, "NXdata") == NX_OK) {
	if (NXopengroup(f, "output", "NXdetector") == NX_OK) {

	  /* the NXdata group has been created in mcdatainfo_out_nexus */
	  if (NXopengroup(f, data_name, "NXdata") == NX_OK) {
	    
	    MPI_MASTER(
		       nxprintattr(f, "options",
				   strlen(detector.options) ? detector.options : "None");
		       );
	    /* write axes, for histogram data sets, not for lists */
	    if (!strcasestr(detector.format, "list")) {
	      mcdetector_out_axis_nexus(f, detector.xlabel, detector.xvar,
					1, detector.m, detector.xmin, detector.xmax);
	      mcdetector_out_axis_nexus(f, detector.ylabel, detector.yvar,
					2, detector.n, detector.ymin, detector.ymax);
	      mcdetector_out_axis_nexus(f, detector.zlabel, detector.zvar,
					3, detector.p, detector.zmin, detector.zmax); 
	    } else {
	      	    MPI_MASTER(
			       nxprintattr(f, "dataset columns",
					   strlen(detector.ylabel) ? detector.ylabel : "None");
		    );
	    }

	    /* write the actual data (appended if already exists) */
	    if (!strcasestr(detector.format, "list") && !strcasestr(detector.format, "pixels")) {
	      mcdetector_out_array_nexus(f, "data", detector.p1, detector);
	      mcdetector_out_array_nexus(f, "errors", detector.p2, detector);
	      mcdetector_out_array_nexus(f, "ncount", detector.p0, detector);
	    } else if (strcasestr(detector.format, "pixels")) {
	      mcdetector_out_array_nexus(  f, "pixels", detector.p1, detector);
	    } else {
	      mcdetector_out_array_nexus(  f, "events", detector.p1, detector);
	    }
	    NXclosegroup(f);
	    NXopengroup(f, data_name, "NXdata");
	    NXgetgroupID(nxhandle, &pLink);
	    NXclosegroup(f);
	  } /* NXdata data_name*/
	  NXclosegroup(f);
	} /* NXdetector output */
	NXclosegroup(f);
      } /* NXdata detector.nexuscomp */
      NXclosegroup(f);
    } /* NXdata components */
    NXclosegroup(f);
  } /* NXdata instrument */
  
  if (!strcasestr(detector.format, "pixels")) {
    if (NXopengroup(f, "data", "NXdetector") == NX_OK) {
      NXmakelink(nxhandle, &pLink);
      NXclosegroup(f);
    }
  }
  return(NX_OK);
} /* mcdetector_out_array_nexus */

#ifdef USE_MPI
/*******************************************************************************
* mcdetector_out_list_slaves: slaves send their list data to master which writes
*   requires: NXentry to be opened
* WARNING: this method has a flaw: it requires all nodes to flush the lists
*   the same number of times. In case one node is just below the buffer size
*   when finishing (e.g. monitor_nd), it may not trigger save but others may.
*   Then the number of recv/send is not constant along nodes, and simulation stalls.
*******************************************************************************/
MCDETECTOR mcdetector_out_list_slaves(MCDETECTOR detector)
{
  int     node_i=0;
  MPI_MASTER(
	     printf("\n** MPI master gathering slave node list data ** \n");
  );

  if (mpi_node_rank != mpi_node_root) {
    /* MPI slave: slaves send their data to master: 2 MPI_Send calls */
    /* m, n, p must be sent first, since all slaves do not have the same number of events */
    int mnp[3]={detector.m,detector.n,detector.p};

    if (mc_MPI_Send(mnp, 3, MPI_INT, mpi_node_root)!= MPI_SUCCESS)
      fprintf(stderr, "Warning: proc %i to master: MPI_Send mnp list error (mcdetector_out_list_slaves)\n", mpi_node_rank);
    if (!detector.p1
     || mc_MPI_Send(detector.p1, mnp[0]*mnp[1]*mnp[2], MPI_DOUBLE, mpi_node_root) != MPI_SUCCESS)
      fprintf(stderr, "Warning: proc %i to master: MPI_Send p1 list error: mnp=%i (mcdetector_out_list_slaves)\n", mpi_node_rank, abs(mnp[0]*mnp[1]*mnp[2]));
    /* slaves are done: sent mnp and p1 */
  } /* end slaves */

  /* MPI master: receive data from slaves sequentially: 2 MPI_Recv calls */

  if (mpi_node_rank == mpi_node_root) {
    for(node_i=0; node_i<mpi_node_count; node_i++) {
      double *this_p1=NULL;                               /* buffer to hold the list from slaves */
      int     mnp[3]={0,0,0};  /* size of this buffer */
      if (node_i != mpi_node_root) { /* get data from slaves */
	if (mc_MPI_Recv(mnp, 3, MPI_INT, node_i) != MPI_SUCCESS)
	  fprintf(stderr, "Warning: master from proc %i: "
		  "MPI_Recv mnp list error (mcdetector_write_data)\n", node_i);
	if (mnp[0]*mnp[1]*mnp[2]) {
	  this_p1 = (double *)calloc(mnp[0]*mnp[1]*mnp[2], sizeof(double));
	  if (!this_p1 || mc_MPI_Recv(this_p1, abs(mnp[0]*mnp[1]*mnp[2]), MPI_DOUBLE, node_i)!= MPI_SUCCESS)
	    fprintf(stderr, "Warning: master from proc %i: "
		    "MPI_Recv p1 list error: mnp=%i (mcdetector_write_data)\n", node_i, mnp[0]*mnp[1]*mnp[2]);
	  else {
	    printf(". MPI master writing data for slave node %i\n",node_i);
	    detector.p1 = this_p1;
	    detector.m  = mnp[0]; detector.n  = mnp[1]; detector.p  = mnp[2];

	    mcdetector_out_data_nexus(nxhandle, detector);
	  }
	}
      } /* if not master */
      free(this_p1);
    } /* for */
  MPI_MASTER(
	     printf("\n** Done ** \n");
  );
  }
  // Common return statement for slaves / master alike
  return(detector);
}
#endif

MCDETECTOR mcdetector_out_0D_nexus(MCDETECTOR detector)
{
  /* Write data set information to NeXus file. */
  MPI_MASTER(
    mcdatainfo_out_nexus(nxhandle, detector);
  );

  return(detector);
} /* mcdetector_out_0D_ascii */

MCDETECTOR mcdetector_out_1D_nexus(MCDETECTOR detector)
{
  MPI_MASTER(
  mcdatainfo_out_nexus(nxhandle, detector);
  mcdetector_out_data_nexus(nxhandle, detector);
  );
  return(detector);
} /* mcdetector_out_1D_ascii */

MCDETECTOR mcdetector_out_2D_nexus(MCDETECTOR detector)
{
  MPI_MASTER(
  mcdatainfo_out_nexus(nxhandle, detector);
  mcdetector_out_data_nexus(nxhandle, detector);
  );

#ifdef USE_MPI // and USE_NEXUS
  /* NeXus: slave nodes have master write their lists */
  if (strcasestr(detector.format, "list") && mpi_node_count > 1) {
    mcdetector_out_list_slaves(detector);
  }
#endif /* USE_MPI */

  return(detector);
} /* mcdetector_out_2D_nexus */

MCDETECTOR mcdetector_out_3D_nexus(MCDETECTOR detector)
{
  printf("Received detector from %s\n",detector.component);
  MPI_MASTER(
  mcdatainfo_out_nexus(nxhandle, detector);
  mcdetector_out_data_nexus(nxhandle, detector);
  );
  return(detector);
} /* mcdetector_out_3D_nexus */


#endif /* USE_NEXUS*/








/* ========================================================================== */

/*                            Main input functions                            */
/*            DETECTOR_OUT_xD function calls -> ascii or NeXus                */

/* ========================================================================== */

/*******************************************************************************
* siminfo_init:   open SIM and write header
*******************************************************************************/
FILE *siminfo_init(FILE *f)
{
  int exists=0;

  /* check format */
  if (!mcformat || !strlen(mcformat)
   || !strcasecmp(mcformat, "MCSTAS") || !strcasecmp(mcformat, "MCXTRACE")
   || !strcasecmp(mcformat, "PGPLOT") || !strcasecmp(mcformat, "GNUPLOT") || !strcasecmp(mcformat, "MCCODE")
   || !strcasecmp(mcformat, "MATLAB")) {
    mcformat="McCode";
#ifdef USE_NEXUS
  } else if (strcasestr(mcformat, "NeXus")) {
    /* Do nothing */
#endif
  } else {
    fprintf(stderr,
	    "Warning: You have requested the output format %s which is unsupported by this binary. Resetting to standard %s format.\n",mcformat ,"McCode");
    mcformat="McCode";
  }

  /* open the SIM file if not defined yet */
  if (siminfo_file || mcdisable_output_files)
    return (siminfo_file);

#ifdef USE_NEXUS
  /* only master writes NeXus header: calls NXopen(nxhandle) */
  if (mcformat && strcasestr(mcformat, "NeXus")) {
	  MPI_MASTER(
	  siminfo_file = mcnew_file(siminfo_name, "h5", &exists);
    if(!siminfo_file)
      fprintf(stderr,
	      "Warning: could not open simulation description file '%s'\n",
	      siminfo_name);
	  else
	    mcinfo_out_nexus(nxhandle);
	  );
    return(siminfo_file); /* points to nxhandle */
  }
#endif

  /* write main description file (only MASTER) */
  MPI_MASTER(

  siminfo_file = mcnew_file(siminfo_name, "sim", &exists);
  if(!siminfo_file)
    fprintf(stderr,
	    "Warning: could not open simulation description file '%s'\n",
	    siminfo_name);
  else
  {
    /* write SIM header */
    time_t t=time(NULL);
    siminfo_out("%s simulation description file for %s.\n",
      MCCODE_NAME, instrument_name);
    siminfo_out("Date:    %s", ctime(&t)); /* includes \n */
    siminfo_out("Program: %s\n\n", MCCODE_STRING);

    siminfo_out("begin instrument: %s\n", instrument_name);
    mcinfo_out(   "  ", siminfo_file);
    siminfo_out("end instrument\n");

    siminfo_out("\nbegin simulation: %s\n", dirname);
    mcruninfo_out("  ", siminfo_file);
    siminfo_out("end simulation\n");

  }
  ); /* MPI_MASTER */
  return (siminfo_file);

} /* siminfo_init */

/*******************************************************************************
*   siminfo_close:  close SIM
*******************************************************************************/
void siminfo_close()
{
#ifdef USE_MPI
  if(mpi_node_rank == mpi_node_root) {
#endif
  if(siminfo_file && !mcdisable_output_files) {
#ifdef USE_NEXUS
    if (mcformat && strcasestr(mcformat, "NeXus")) {
      time_t t=time(NULL);
      nxprintf(nxhandle, "end_time", ctime(&t));
      nxprintf(nxhandle, "duration", "%li", (long)t-mcstartdate);
      NXclosegroup(nxhandle); /* NXentry */
      NXclose(&nxhandle);
    } else {
#endif
      fclose(siminfo_file);
#ifdef USE_NEXUS
    }
#endif
#ifdef USE_MPI
  }
#endif
    siminfo_file = NULL;
  }
} /* siminfo_close */

/*******************************************************************************
* mcdetector_out_0D: wrapper for 0D (single value).
*   Output single detector/monitor data (p0, p1, p2).
*   Title is t, component name is c.
*******************************************************************************/
MCDETECTOR mcdetector_out_0D(char *t, double p0, double p1, double p2,
			     char *c, Coords posa, Rotation rota, int index)
{
  /* import and perform basic detector analysis (and handle MPI reduce) */
  MCDETECTOR detector = detector_import(mcformat,
    c, (t ? t : MCCODE_STRING " data"),
    1, 1, 1,
    "I", "", "",
    "I", "", "",
    0, 0, 0, 0, 0, 0, c,
    &p0, &p1, &p2, posa, rota, index); /* write Detector: line */

#ifdef USE_NEXUS
  if (strcasestr(detector.format, "NeXus"))
    return(mcdetector_out_0D_nexus(detector));
  else
#endif
    return(mcdetector_out_0D_ascii(detector));

} /* mcdetector_out_0D */



/*******************************************************************************
* mcdetector_out_1D: wrapper for 1D.
*   Output 1d detector data (p0, p1, p2) for n bins linearly
*   distributed across the range x1..x2 (x1 is lower limit of first
*   bin, x2 is upper limit of last bin). Title is t, axis labels are xl
*   and yl. File name is f, component name is c.
*
*   t:    title
*   xl:   x-label
*   yl:   y-label
*   xvar: measured variable length
*   x1:   x axus min
*   x2:   x axis max
*   n:    1d data vector lenght
*   p0:   pntr to start of data block#0
*   p1:   pntr to start of data block#1
*   p2:   pntr to start of data block#2
*   f:    filename
*
*   Not included in the macro, and here forwarded to detector_import:
*   c:    ?
*   posa: ?
*******************************************************************************/
MCDETECTOR mcdetector_out_1D(char *t, char *xl, char *yl,
        char *xvar, double x1, double x2,
        long n,
        double *p0, double *p1, double *p2, char *f,
        char *c, Coords posa, Rotation rota, int index)
{
  /* import and perform basic detector analysis (and handle MPI_Reduce) */
  // detector_import calls mcdetector_statistics, which will return different
  // MCDETECTOR versions for 1-D data based on the value of mcformat.
  //
  MCDETECTOR detector = detector_import(mcformat,
    c, (t ? t : MCCODE_STRING " 1D data"),
    n, 1, 1,
    xl, yl, (n > 1 ? "Signal per bin" : " Signal"),
    xvar, "(I,I_err)", "I",
    x1, x2, 0, 0, 0, 0, f,
    p0, p1, p2, posa, rota, index); /* write Detector: line */
  if (!detector.p1 || !detector.m) return(detector);

#ifdef USE_NEXUS
  if (strcasestr(detector.format, "NeXus"))
    detector = mcdetector_out_1D_nexus(detector);
  else
#endif
    detector = mcdetector_out_1D_ascii(detector);
  if (detector.p1 != p1 && detector.p1) {
    // mcdetector_statistics allocated memory but it hasn't been freed.
    free(detector.p1);
    // plus undo the other damage done there:
    detector.p0 = p0; // was set to NULL
    detector.p1 = p1; // was set to this_p1
    detector.p2 = p2; // was set to NULL
    detector.m = detector.n; // (e.g., labs(n))
    detector.n = 1;  // not (n x n)
    detector.istransposed = n < 0 ? 1 : 0;
  }
  return detector;

} /* mcdetector_out_1D */

/*******************************************************************************
* mcdetector_out_2D: wrapper for 2D.
*   Special case for list: master creates file first, then slaves append their
*   blocks without header-
*
*   t:    title
*   xl:   x-label
*   yl:   y-label
*   x1:   x axus min
*   x2:   x axis max
*   y1:   y axis min
*   y2:   y axis max
*   m:    dim 1 (x) size
*   n:    dim 2 (y) size
*   p0:   pntr to start of data block#0
*   p1:   pntr to start of data block#1
*   p2:   pntr to start of data block#2
*   f:    filename
*
*   Not included in the macro, and here forwarded to detector_import:
*   c:    ?
*   posa: ?
*   rota: ?
*******************************************************************************/
MCDETECTOR mcdetector_out_2D(char *t, char *xl, char *yl,
                  double x1, double x2, double y1, double y2,
                  long m, long n,
                  double *p0, double *p1, double *p2, char *f,
		  char *c, Coords posa, Rotation rota, int index)
{
  char xvar[CHAR_BUF_LENGTH];
  char yvar[CHAR_BUF_LENGTH];

  /* create short axes labels */
  if (xl && strlen(xl)) { strncpy(xvar, xl, CHAR_BUF_LENGTH); xvar[2]='\0'; }
  else strcpy(xvar, "x");
  if (yl && strlen(yl)) { strncpy(yvar, yl, CHAR_BUF_LENGTH); yvar[2]='\0'; }
  else strcpy(yvar, "y");

  MCDETECTOR detector;

  /* import and perform basic detector analysis (and handle MPI_Reduce) */
  if (labs(m) == 1) {/* n>1 on Y, m==1 on X: 1D, no X axis*/
    detector = detector_import(mcformat,
      c, (t ? t : MCCODE_STRING " 1D data"),
      n, 1, 1,
      yl, "", "Signal per bin",
      yvar, "(I,Ierr)", "I",
      y1, y2, x1, x2, 0, 0, f,
      p0, p1, p2, posa, rota, index); /* write Detector: line */
  } else if (labs(n)==1) {/* m>1 on X, n==1 on Y: 1D, no Y axis*/
    detector = detector_import(mcformat,
      c, (t ? t : MCCODE_STRING " 1D data"),
      m, 1, 1,
      xl, "", "Signal per bin",
      xvar, "(I,Ierr)", "I",
      x1, x2, y1, y2, 0, 0, f,
      p0, p1, p2, posa, rota, index); /* write Detector: line */
  }else {
    detector = detector_import(mcformat,
      c, (t ? t : MCCODE_STRING " 2D data"),
      m, n, 1,
      xl, yl, "Signal per bin",
      xvar, yvar, "I",
      x1, x2, y1, y2, 0, 0, f,
      p0, p1, p2, posa, rota, index); /* write Detector: line */
  }

  if (!detector.p1 || !detector.m) return(detector);

#ifdef USE_NEXUS
  if (strcasestr(detector.format, "NeXus"))
    return(mcdetector_out_2D_nexus(detector));
  else
#endif
    return(mcdetector_out_2D_ascii(detector));

} /* mcdetector_out_2D */

/*******************************************************************************
* mcdetector_out_2D_list: List mode 2D including forwarding "options" from
* Monitor_nD
*
*   Special case for list: master creates file first, then slaves append their
*   blocks without header-
*
*   t:    title
*   xl:   x-label
*   yl:   y-label
*   x1:   x axus min
*   x2:   x axis max
*   y1:   y axis min
*   y2:   y axis max
*   m:    dim 1 (x) size
*   n:    dim 2 (y) size
*   p0:   pntr to start of data block#0
*   p1:   pntr to start of data block#1
*   p2:   pntr to start of data block#2
*   f:    filename
*
*   Not included in the macro, and here forwarded to detector_import:
*   c:    ?
*   posa: ?
*   rota: ?
*******************************************************************************/
MCDETECTOR mcdetector_out_2D_list(char *t, char *xl, char *yl,
                  double x1, double x2, double y1, double y2,
                  long m, long n,
                  double *p0, double *p1, double *p2, char *f,
		  char *c, Coords posa, Rotation rota, char* options, int index)
{
  char xvar[CHAR_BUF_LENGTH];
  char yvar[CHAR_BUF_LENGTH];

  /* create short axes labels */
  if (xl && strlen(xl)) { strncpy(xvar, xl, CHAR_BUF_LENGTH); xvar[2]='\0'; }
  else strcpy(xvar, "x");
  if (yl && strlen(yl)) { strncpy(yvar, yl, CHAR_BUF_LENGTH); yvar[2]='\0'; }
  else strcpy(yvar, "y");

  MCDETECTOR detector;

  /* import and perform basic detector analysis (and handle MPI_Reduce) */
  if (labs(m) == 1) {/* n>1 on Y, m==1 on X: 1D, no X axis*/
    detector = detector_import(mcformat,
      c, (t ? t : MCCODE_STRING " 1D data"),
      n, 1, 1,
      yl, "", "Signal per bin",
      yvar, "(I,Ierr)", "I",
      y1, y2, x1, x2, 0, 0, f,
      p0, p1, p2, posa, rota, index); /* write Detector: line */
  } else if (labs(n)==1) {/* m>1 on X, n==1 on Y: 1D, no Y axis*/
    detector = detector_import(mcformat,
      c, (t ? t : MCCODE_STRING " 1D data"),
      m, 1, 1,
      xl, "", "Signal per bin",
      xvar, "(I,Ierr)", "I",
      x1, x2, y1, y2, 0, 0, f,
      p0, p1, p2, posa, rota, index); /* write Detector: line */
  }else {
    detector = detector_import(mcformat,
      c, (t ? t : MCCODE_STRING " 2D data"),
      m, n, 1,
      xl, yl, "Signal per bin",
      xvar, yvar, "I",
      x1, x2, y1, y2, 0, 0, f,
     p0, p1, p2, posa, rota, index); /* write Detector: line */
  }

  MPI_MASTER(
  if (strlen(options)) {
    strcpy(detector.options,options);
  } else {
    strcpy(detector.options,"None");
  }
  );

  if (!detector.p1 || !detector.m) return(detector);

#ifdef USE_NEXUS
  if (strcasestr(detector.format, "NeXus"))
    return(mcdetector_out_2D_nexus(detector));
  else
#endif
    return(mcdetector_out_2D_ascii(detector));

} /* mcdetector_out_2D_list */

/*******************************************************************************
* mcdetector_out_list: wrapper for list output (calls out_2D with mcformat+"list").
*   m=number of events, n=size of each event
*******************************************************************************/
MCDETECTOR mcdetector_out_list(char *t, char *xl, char *yl,
                  long m, long n,
                  double *p1, char *f,
			       char *c, Coords posa, Rotation rota, char* options, int index)
{
  char       format_new[CHAR_BUF_LENGTH];
  char      *format_org;
  MCDETECTOR detector;

  format_org = mcformat;
  strcpy(format_new, mcformat);
  strcat(format_new, " list");
  mcformat = format_new;
  detector = mcdetector_out_2D_list(t, xl, yl,
                  1,labs(m),1,labs(n),
                  m,n,
                  NULL, p1, NULL, f,
		  c, posa,rota,options, index);

  mcformat = format_org;
  return(detector);
}

/*******************************************************************************
 * mcuse_dir: set data/sim storage directory and create it,
 * or exit with error if exists
 ******************************************************************************/
static void
mcuse_dir(char *dir)
{
  if (!dir || !strlen(dir)) return;
#ifdef MC_PORTABLE
  fprintf(stderr, "Error: "
          "Directory output cannot be used with portable simulation (mcuse_dir)\n");
  exit(1);
#else  /* !MC_PORTABLE */
  /* handle file://directory URL type */
  if (strncmp(dir, "file://", strlen("file://")))
    dirname = dir;
  else
    dirname = dir+strlen("file://");


#ifdef USE_MPI
  if(mpi_node_rank == mpi_node_root) {
#endif
    int exists=0;
    DIR* handle = opendir(dirname);
    if (handle) {
      /* Directory exists. */
      closedir(handle);
      exists=1;
    }
    if(mkdir(dirname, 0777)) {
#ifndef DANSE
      if(!mcappend) {
	fprintf(stderr, "Error: unable to create directory '%s' (mcuse_dir)\n", dir);
	fprintf(stderr, "(Maybe the directory already exists?)\n");
#endif
#ifdef USE_MPI
	MPI_Abort(MPI_COMM_WORLD, -1);
#endif
	exit(-1);
      }
    }
#ifdef USE_MPI
    }
#endif

  /* remove trailing PATHSEP (if any) */
  while (strlen(dirname) && dirname[strlen(dirname) - 1] == MC_PATHSEP_C)
    dirname[strlen(dirname) - 1]='\0';
#endif /* !MC_PORTABLE */
} /* mcuse_dir */

/*******************************************************************************
* mcinfo: display instrument simulation info to stdout and exit
*******************************************************************************/
static void
mcinfo(void)
{
  fprintf(stdout, "begin instrument: %s\n", instrument_name);
  mcinfo_out("  ", stdout);
  fprintf(stdout, "end instrument\n");
  fprintf(stdout, "begin simulation: %s\n", dirname ? dirname : ".");
  mcruninfo_out("  ", stdout);
  fprintf(stdout, "end simulation\n");
  exit(0); /* includes MPI_Finalize in MPI mode */
} /* mcinfo */

/*******************************************************************************
* mcparameterinfo: display instrument parameter info to stdout and exit
*******************************************************************************/
static void
mcparameterinfo(void)
{
  mcparameterinfo_out("  ", stdout);
  exit(0); /* includes MPI_Finalize in MPI mode */
} /* mcparameterinfo */



#endif /* ndef MCCODE_R_IO_C */

/* end of the I/O section =================================================== */







/*******************************************************************************
* mcset_ncount: set total number of rays to generate
*******************************************************************************/
void mcset_ncount(unsigned long long int count)
{
  mcncount = count;
}

/* mcget_ncount: get total number of rays to generate */
unsigned long long int mcget_ncount(void)
{
  return mcncount;
}

/* mcget_run_num: get curent number of rays */
/* Within the TRACE scope we are now using _particle->uid directly */
unsigned long long int mcget_run_num() // shuld be (_class_particle* _particle) somehow
{
  /* This function only remains for the few cases outside TRACE where we need to know
     the number of simulated particles */
  return mcrun_num;
}

/* mcsetn_arg: get ncount from a string argument */
static void
mcsetn_arg(char *arg)
{
  mcset_ncount((long long int) strtod(arg, NULL));
}

/* mcsetseed: set the random generator seed from a string argument */
static void
mcsetseed(char *arg)
{
  mcseed = atol(arg);
  if(!mcseed) {
  //  srandom(mcseed);
  //} else {
    fprintf(stderr, "Error: seed must not be zero (mcsetseed)\n");
    exit(1);
  }
}

/* Following part is only embedded when not redundent with mccode-r.h ========= */

#ifndef MCCODE_H

/* SECTION: MCDISPLAY support. =============================================== */

/*******************************************************************************
* Just output MCDISPLAY keywords to be caught by an external plotter client.
*******************************************************************************/

void mcdis_magnify(char *what){
  // Do nothing here, better use interactive zoom from the tools
}

void mcdis_line(double x1, double y1, double z1,
                double x2, double y2, double z2){
  printf("MCDISPLAY: multiline(2,%g,%g,%g,%g,%g,%g)\n",
         x1,y1,z1,x2,y2,z2);
}

void mcdis_dashed_line(double x1, double y1, double z1,
		       double x2, double y2, double z2, int n){
  int i;
  const double dx = (x2-x1)/(2*n+1);
  const double dy = (y2-y1)/(2*n+1);
  const double dz = (z2-z1)/(2*n+1);

  for(i = 0; i < n+1; i++)
    mcdis_line(x1 + 2*i*dx,     y1 + 2*i*dy,     z1 + 2*i*dz,
	       x1 + (2*i+1)*dx, y1 + (2*i+1)*dy, z1 + (2*i+1)*dz);
}

void mcdis_multiline(int count, ...){
  va_list ap;
  double x,y,z;

  printf("MCDISPLAY: multiline(%d", count);
  va_start(ap, count);
  while(count--)
    {
    x = va_arg(ap, double);
    y = va_arg(ap, double);
    z = va_arg(ap, double);
    printf(",%g,%g,%g", x, y, z);
    }
  va_end(ap);
  printf(")\n");
}

void mcdis_rectangle(char* plane, double x, double y, double z,
		     double width, double height){
  /* draws a rectangle in the plane           */
  /* x is ALWAYS width and y is ALWAYS height */
  if (strcmp("xy", plane)==0) {
    mcdis_multiline(5,
		    x - width/2, y - height/2, z,
		    x + width/2, y - height/2, z,
		    x + width/2, y + height/2, z,
		    x - width/2, y + height/2, z,
		    x - width/2, y - height/2, z);
  } else if (strcmp("xz", plane)==0) {
    mcdis_multiline(5,
		    x - width/2, y, z - height/2,
		    x + width/2, y, z - height/2,
		    x + width/2, y, z + height/2,
		    x - width/2, y, z + height/2,
		    x - width/2, y, z - height/2);
  } else if (strcmp("yz", plane)==0) {
    mcdis_multiline(5,
		    x, y - height/2, z - width/2,
		    x, y - height/2, z + width/2,
		    x, y + height/2, z + width/2,
		    x, y + height/2, z - width/2,
		    x, y - height/2, z - width/2);
  } else {

    fprintf(stderr, "Error: Definition of plane %s unknown\n", plane);
    exit(1);
  }
}

void mcdis_circle(char *plane, double x, double y, double z, double r){
  printf("MCDISPLAY: circle('%s',%g,%g,%g,%g)\n", plane, x, y, z, r);
}

void mcdis_new_circle(double x, double y, double z, double r, double nx, double ny, double nz){
  printf("MCDISPLAY: new_circle(%g,%g,%g,%g,%g,%g,%g)\n", x, y, z, r, nx, ny, nz);
}


/* Draws a circle with center (x,y,z), radius (r), and in the plane
 * with normal (nx,ny,nz)*/
void mcdis_Circle(double x, double y, double z, double r, double nx, double ny, double nz){
    int i;
    if(nx==0 && ny && nz==0){
        for (i=0;i<24; i++){
            mcdis_line(x+r*sin(i*2*PI/24),y,z+r*cos(i*2*PI/24),
                    x+r*sin((i+1)*2*PI/24),y,z+r*cos((i+1)*2*PI/24));
        }
    }else{
        double mx,my,mz;
        /*generate perpendicular vector using (nx,ny,nz) and (0,1,0)*/
        vec_prod(mx,my,mz, 0,1,0, nx,ny,nz);
        NORM(mx,my,mz);
        /*draw circle*/
        for (i=0;i<24; i++){
            double ux,uy,uz;
            double wx,wy,wz;
            rotate(ux,uy,uz, mx,my,mz, i*2*PI/24, nx,ny,nz);
            rotate(wx,wy,wz, mx,my,mz, (i+1)*2*PI/24, nx,ny,nz);
            mcdis_line(x+ux*r,y+uy*r,z+uz*r,
                    x+wx*r,y+wy*r,z+wz*r);
        }
    }
}


/*  OLD IMPLEMENTATION
    draws a box with center at (x, y, z) and
    width (deltax), height (deltay), length (deltaz) */
void mcdis_legacy_box(double x, double y, double z,
	       double width, double height, double length){

  mcdis_rectangle("xy", x, y, z-length/2, width, height);
  mcdis_rectangle("xy", x, y, z+length/2, width, height);
  mcdis_line(x-width/2, y-height/2, z-length/2,
	     x-width/2, y-height/2, z+length/2);
  mcdis_line(x-width/2, y+height/2, z-length/2,
	     x-width/2, y+height/2, z+length/2);
  mcdis_line(x+width/2, y-height/2, z-length/2,
	     x+width/2, y-height/2, z+length/2);
  mcdis_line(x+width/2, y+height/2, z-length/2,
	     x+width/2, y+height/2, z+length/2);
}

/*  NEW 3D IMPLEMENTATION OF BOX SUPPORTS HOLLOW ALSO
    draws a box with center at (x, y, z) and
    width (deltax), height (deltay), length (deltaz) */
void mcdis_box(double x, double y, double z,
	       double width, double height, double length, double thickness, double nx, double ny, double nz){
  if (mcdotrace==2) {
    printf("MCDISPLAY: box(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)\n", x, y, z, width, height, length, thickness, nx, ny, nz);
  } else {
    mcdis_legacy_box(x, y, z, width, height, length);
    if (thickness)
      mcdis_legacy_box(x, y, z, width-thickness, height-thickness, length);
  }
}


/* OLD IMPLEMENTATION
Draws a cylinder with center at (x,y,z) with extent (r,height).
 * The cylinder axis is along the vector nx,ny,nz. */
void mcdis_legacy_cylinder( double x, double y, double z,
        double r, double height, int N, double nx, double ny, double nz){
    int i;
    /*no lines make little sense - so trigger the default*/
    if(N<=0) N=5;

    NORM(nx,ny,nz);
    double h_2=height/2.0;
    mcdis_Circle(x+nx*h_2,y+ny*h_2,z+nz*h_2,r,nx,ny,nz);
    mcdis_Circle(x-nx*h_2,y-ny*h_2,z-nz*h_2,r,nx,ny,nz);

    double mx,my,mz;
    /*generate perpendicular vector using (nx,ny,nz) and (0,1,0)*/
    if(nx==0 && ny && nz==0){
        mx=my=0;mz=1;
    }else{
        vec_prod(mx,my,mz, 0,1,0, nx,ny,nz);
        NORM(mx,my,mz);
    }
    /*draw circle*/
    for (i=0; i<24; i++){
        double ux,uy,uz;
        rotate(ux,uy,uz, mx,my,mz, i*2*PI/24, nx,ny,nz);
        mcdis_line(x+nx*h_2+ux*r, y+ny*h_2+uy*r, z+nz*h_2+uz*r,
                 x-nx*h_2+ux*r, y-ny*h_2+uy*r, z-nz*h_2+uz*r);
    }
}

/* NEW 3D IMPLEMENTATION ALSO SUPPORTING HOLLOW
Draws a cylinder with center at (x,y,z) with extent (r,height).
 * The cylinder axis is along the vector nx,ny,nz.*/
void mcdis_cylinder( double x, double y, double z,
        double r, double height, double thickness, double nx, double ny, double nz){
  if (mcdotrace==2) {
      printf("MCDISPLAY: cylinder(%g, %g, %g, %g, %g, %g, %g, %g, %g)\n",
         x, y, z, r, height, thickness, nx, ny, nz);
  } else {
    mcdis_legacy_cylinder(x, y, z,
			  r, height, 12, nx, ny, nz);
  }
}

/* Draws a cone with center at (x,y,z) with extent (r,height).
 * The cone axis is along the vector nx,ny,nz.*/
void mcdis_cone( double x, double y, double z,
        double r, double height, double nx, double ny, double nz){
  if (mcdotrace==2) {
    printf("MCDISPLAY: cone(%g, %g, %g, %g, %g, %g, %g, %g)\n",
       x, y, z, r, height, nx, ny, nz);
  } else {
    mcdis_Circle(x, y, z, r, nx, ny, nz);
    mcdis_Circle(x+0.25*height*nx, y+0.25*height*ny, z+0.25*height*nz, 0.75*r, nx, ny, nz);
    mcdis_Circle(x+0.5*height*nx, y+0.5*height*ny, z+0.5*height*nz, 0.5*r, nx, ny, nz);
    mcdis_Circle(x+0.75*height*nx, y+0.75*height*ny, z+0.75*height*nz, 0.25*r, nx, ny, nz);
    mcdis_line(x, y, z, x+height*nx, y+height*ny, z+height*nz);
  }
}

/* Draws a disc with center at (x,y,z) with extent (r).
 * The disc axis is along the vector nx,ny,nz.*/
void mcdis_disc( double x, double y, double z,
        double r, double nx, double ny, double nz){
  printf("MCDISPLAY: disc(%g, %g, %g, %g, %g, %g, %g)\n",
     x, y, z, r, nx, ny, nz);
}

/* Draws a annulus with center at (x,y,z) with extent (outer_radius) and remove inner_radius.
 * The annulus axis is along the vector nx,ny,nz.*/
void mcdis_annulus( double x, double y, double z,
        double outer_radius, double inner_radius, double nx, double ny, double nz){
  printf("MCDISPLAY: annulus(%g, %g, %g, %g, %g, %g, %g, %g)\n",
     x, y, z, outer_radius, inner_radius, nx, ny, nz);
}

/* draws a sphere with center at (x,y,z) with extent (r)*/
void mcdis_sphere(double x, double y, double z, double r){
  if (mcdotrace==2) {
    printf("MCDISPLAY: sphere(%g,%g,%g,%g)\n", x, y, z, r);
  } else {
    double nx,ny,nz;
    int i;
    int N=12;

    nx=0;ny=0;nz=1;
    mcdis_Circle(x,y,z,r,nx,ny,nz);
    for (i=1;i<N;i++){
        rotate(nx,ny,nz, nx,ny,nz, PI/N, 0,1,0);
        mcdis_Circle(x,y,z,r,nx,ny,nz);
    }
    /*lastly draw a great circle perpendicular to all N circles*/
    //mcdis_Circle(x,y,z,radius,1,0,0);

    for (i=1;i<=N;i++){
        double yy=-r+ 2*r*((double)i/(N+1));
        mcdis_Circle(x,y+yy ,z,  sqrt(r*r-yy*yy) ,0,1,0);
    }
  }
}
/* POLYHEDRON IMPLEMENTATION*/

void mcdis_polyhedron(char *vertices_faces){
  printf("MCDISPLAY: polyhedron %s\n", vertices_faces);
}

/* POLYGON IMPLEMENTATION */
void mcdis_polygon(int count, ...){
  va_list ap;
  double *x,*y,*z;

  double x0=0,y0=0,z0=0; /* Used for centre-of-mass in trace==2 */

  x=malloc(count*sizeof(double));
  y=malloc(count*sizeof(double));
  z=malloc(count*sizeof(double));
  if (!x || !y || !z) {
    fprintf(stderr,"Error initializing polygon set size %i\n",count);
    exit(-1);
  }
  va_start(ap, count);
  // Fallback for trace==1 is multiline, one rank higher
  if (mcdotrace==1) {
    printf("MCDISPLAY: multiline(%i,",count+1);
  }
  
  int j;
  for (j=0; j<count; j++) {
    x[j] = va_arg(ap, double);
    y[j] = va_arg(ap, double);
    z[j] = va_arg(ap, double);
    if (mcdotrace==1) {
      printf("%g,%g,%g,",x[j],y[j],z[j]);
    } else {
      // Calculation of polygon centre of mass
      x0 += x[j]; y0 += y[j]; z0 += z[j];
    }
  }
  va_end(ap);

  /* Patch data for multiline(count+1, ... use 0th point*/
  if (mcdotrace==1) {
    printf("%g,%g,%g)\n",x[0],y[0],z[0]);
  } else {
    x0 /= count; y0 /= count; z0 /= count;
    /* Build up a json string for a "polyhedron" */
    // Estimate size of the JSON string
    const int VERTEX_OVERHEAD = 30;
    const int FACE_OVERHEAD_BASE = 20;
    const int FACE_INDEX_OVERHEAD = 15;
    int estimated_size = 256; // Base size
    estimated_size += count * VERTEX_OVERHEAD;

    int faceSize;
    int vtxSize;
    if (count > 3) {
      /* Split in triangles - as many as polygon rank */
      faceSize=count;
      vtxSize=count+1;
    } else {
      faceSize=1;
      vtxSize=count;
    }
    
    for (int i = 0; i < faceSize;) {
        int num_indices = 3;
        estimated_size += FACE_OVERHEAD_BASE + num_indices * FACE_INDEX_OVERHEAD;
        i += num_indices + 1;
    }

    char *json_string = malloc(estimated_size);
    if (json_string == NULL) {
        fprintf(stderr, "Memory allocation failed.\n");
        return;
    }

    char *ptr = json_string;
    ptr += sprintf(ptr, "{ \"vertices\": [");

    if (count==3) { // Single, basic triangle
      ptr += sprintf(ptr, "[%g, %g, %g], [%g, %g, %g], [%g, %g, %g]", x[0], y[0], z[0], x[1], y[1], z[1], x[2], y[2], z[2]);
    } else {
      for (int i = 0; i < vtxSize-1; i++) {
        ptr += sprintf(ptr, "[%g, %g, %g]", x[i], y[i], z[i]);
        if (i < vtxSize - 2) {
	  ptr += sprintf(ptr, ", ");
        } else {
	  ptr += sprintf(ptr, ", [%g, %g, %g]", x0, y0, z0);
	}
      }
    }
    ptr += sprintf(ptr, "], \"faces\": [");
    if (count==3) { // Single, basic triangle, 1 face...
      ptr += sprintf(ptr, "{ \"face\": [");
      ptr += sprintf(ptr, "0, 1, 2");
      ptr += sprintf(ptr, "]}");
    } else {
      for (int i = 0; i < faceSize; i++) {
        int num = 3;
        ptr += sprintf(ptr, "{ \"face\": [");
	if (i < faceSize - 1) {
	  ptr += sprintf(ptr, "%d, %d, %d",i,i+1,count);
	} else {
	  ptr += sprintf(ptr, "%d, %d, %d",i,count,0);
	}
	ptr += sprintf(ptr, "]}");
	if (i < faceSize-1) {
	  ptr += sprintf(ptr, ", ");
	}
      }
    }
    ptr += sprintf(ptr, "]}");
    mcdis_polyhedron(json_string);

    free(json_string);
  }
  free(x);free(y);free(z);
}
/* END NEW POLYGON IMPLEMENTATION*/

/*
void mcdis_polygon(double x1, double y1, double z1,
                double x2, double y2, double z2){
  printf("MCDISPLAY: polygon(2,%g,%g,%g,%g,%g,%g)\n",
         x1,y1,z1,x2,y2,z2);
}
*/

/* SECTION: coordinates handling ============================================ */

/*******************************************************************************
* Since we use a lot of geometric calculations using Cartesian coordinates,
* we collect some useful routines here. However, it is also permissible to
* work directly on the underlying struct coords whenever that is most
* convenient (that is, the type Coords is not abstract).
*
* Coordinates are also used to store rotation angles around x/y/z axis.
*
* Since coordinates are used much like a basic type (such as double), the
* structure itself is passed and returned, rather than a pointer.
*
* At compile-time, the values of the coordinates may be unknown (for example
* a motor position). Hence coordinates are general expressions and not simple
* numbers. For this we used the type Coords_exp which has three CExp
* fields. For runtime (or calculations possible at compile time), we use
* Coords which contains three double fields.
*******************************************************************************/

/* coords_set: Assign coordinates. */
Coords coords_set(MCNUM x, MCNUM y, MCNUM z)
{
  Coords a;

  a.x = x;
  a.y = y;
  a.z = z;
  return a;
}

/* coords_get: get coordinates. Required when 'x','y','z' are #defined as ray pars */
Coords coords_get(Coords a, MCNUM *x, MCNUM *y, MCNUM *z)
{
  *x = a.x;
  *y = a.y;
  *z = a.z;
  return a;
}

/* coords_add: Add two coordinates. */
Coords coords_add(Coords a, Coords b)
{
  Coords c;

  c.x = a.x + b.x;
  c.y = a.y + b.y;
  c.z = a.z + b.z;
  if (fabs(c.z) < 1e-14) c.z=0.0;
  return c;
}

/* coords_sub: Subtract two coordinates. */
Coords coords_sub(Coords a, Coords b)
{
  Coords c;

  c.x = a.x - b.x;
  c.y = a.y - b.y;
  c.z = a.z - b.z;
  if (fabs(c.z) < 1e-14) c.z=0.0;
  return c;
}

/* coords_neg: Negate coordinates. */
Coords coords_neg(Coords a)
{
  Coords b;

  b.x = -a.x;
  b.y = -a.y;
  b.z = -a.z;
  return b;
}

/* coords_scale: Scale a vector. */
Coords coords_scale(Coords b, double scale) {
  Coords a;

  a.x = b.x*scale;
  a.y = b.y*scale;
  a.z = b.z*scale;
  return a;
}

/* coords_sp: Scalar product: a . b */
double coords_sp(Coords a, Coords b) {
  double value;

  value = a.x*b.x + a.y*b.y + a.z*b.z;
  return value;
}

/* coords_xp: Cross product: a = b x c. */
Coords coords_xp(Coords b, Coords c) {
  Coords a;

  a.x = b.y*c.z - c.y*b.z;
  a.y = b.z*c.x - c.z*b.x;
  a.z = b.x*c.y - c.x*b.y;
  return a;
}

/* coords_len: Gives length of coords set. */
double coords_len(Coords a) {
  return sqrt(a.x*a.x + a.y*a.y + a.z*a.z);
}

/* coords_mirror: Mirror a in plane (through the origin) defined by normal n*/
Coords coords_mirror(Coords a, Coords n) {
  double t = scalar_prod(n.x, n.y, n.z, n.x, n.y, n.z);
  Coords b;
  if (t!=1) {
    t = sqrt(t);
    n.x /= t;
    n.y /= t;
    n.z /= t;
  }
  t=scalar_prod(a.x, a.y, a.z, n.x, n.y, n.z);
  b.x = a.x-2*t*n.x;
  b.y = a.y-2*t*n.y;
  b.z = a.z-2*t*n.z;
  return b;
}

/* coords_print: Print out vector values. */
void coords_print(Coords a) {
  #ifndef OPENACC
  fprintf(stdout, "(%f, %f, %f)\n", a.x, a.y, a.z);
  #endif
  return;
}

mcstatic void coords_norm(Coords* c) {
	double temp = coords_sp(*c,*c);

	// Skip if we will end dividing by zero
	if (temp == 0) return;

	temp = sqrt(temp);

	c->x /= temp;
	c->y /= temp;
	c->z /= temp;
}

/* coords_test_zero: check if zero vector*/
int coords_test_zero(Coords a){
  return ( a.x==0 && a.y==0 && a.z==0 );
}

/*******************************************************************************
* The Rotation type implements a rotation transformation of a coordinate
* system in the form of a double[3][3] matrix.
*
* Contrary to the Coords type in coords.c, rotations are passed by
* reference. Functions that yield new rotations do so by writing to an
* explicit result parameter; rotations are not returned from functions. The
* reason for this is that arrays cannot by returned from functions (though
* structures can; thus an alternative would have been to wrap the
* double[3][3] array up in a struct). Such are the ways of C programming.
*
* A rotation represents the tranformation of the coordinates of a vector when
* changing between coordinate systems that are rotated with respect to each
* other. For example, suppose that coordinate system Q is rotated 45 degrees
* around the Z axis with respect to coordinate system P. Let T be the
* rotation transformation representing a 45 degree rotation around Z. Then to
* get the coordinates of a vector r in system Q, apply T to the coordinates
* of r in P. If r=(1,0,0) in P, it will be (sqrt(1/2),-sqrt(1/2),0) in
* Q. Thus we should be careful when interpreting the sign of rotation angles:
* they represent the rotation of the coordinate systems, not of the
* coordinates (which has opposite sign).
*******************************************************************************/

/*******************************************************************************
* rot_set_rotation: Get transformation for rotation first phx around x axis,
* then phy around y, then phz around z.
*******************************************************************************/
void rot_set_rotation(Rotation t, double phx, double phy, double phz)
{
  if ((phx == 0) && (phy == 0) && (phz == 0)) {
    t[0][0] = 1.0;
    t[0][1] = 0.0;
    t[0][2] = 0.0;
    t[1][0] = 0.0;
    t[1][1] = 1.0;
    t[1][2] = 0.0;
    t[2][0] = 0.0;
    t[2][1] = 0.0;
    t[2][2] = 1.0;
  } else {
    double cx = cos(phx);
    double sx = sin(phx);
    double cy = cos(phy);
    double sy = sin(phy);
    double cz = cos(phz);
    double sz = sin(phz);

    t[0][0] = cy*cz;
    t[0][1] = sx*sy*cz + cx*sz;
    t[0][2] = sx*sz - cx*sy*cz;
    t[1][0] = -cy*sz;
    t[1][1] = cx*cz - sx*sy*sz;
    t[1][2] = sx*cz + cx*sy*sz;
    t[2][0] = sy;
    t[2][1] = -sx*cy;
    t[2][2] = cx*cy;
  }
}

/*******************************************************************************
* rot_test_identity: Test if rotation is identity
*******************************************************************************/
int rot_test_identity(Rotation t)
{
  return (t[0][0] + t[1][1] + t[2][2] == 3);
}

/*******************************************************************************
* rot_mul: Matrix multiplication of transformations (this corresponds to
* combining transformations). After rot_mul(T1, T2, T3), doing T3 is
* equal to doing first T2, then T1.
* Note that T3 must not alias (use the same array as) T1 or T2.
*******************************************************************************/
void rot_mul(Rotation t1, Rotation t2, Rotation t3)
{
  if (rot_test_identity(t1)) {
    rot_copy(t3, t2);
  } else if (rot_test_identity(t2)) {
    rot_copy(t3, t1);
  } else {
    int i,j;
    for(i = 0; i < 3; i++)
      for(j = 0; j < 3; j++)
	t3[i][j] = t1[i][0]*t2[0][j] + t1[i][1]*t2[1][j] + t1[i][2]*t2[2][j];
  }
}

/*******************************************************************************
* rot_copy: Copy a rotation transformation (arrays cannot be assigned in C).
*******************************************************************************/
void rot_copy(Rotation dest, Rotation src)
{
  int i,j;
  for(i = 0; i < 3; i++)
    for(j = 0; j < 3; j++)
      dest[i][j] = src[i][j];
}

/*******************************************************************************
* rot_transpose: Matrix transposition, which is inversion for Rotation matrices
*******************************************************************************/
void rot_transpose(Rotation src, Rotation dst)
{
  dst[0][0] = src[0][0];
  dst[0][1] = src[1][0];
  dst[0][2] = src[2][0];
  dst[1][0] = src[0][1];
  dst[1][1] = src[1][1];
  dst[1][2] = src[2][1];
  dst[2][0] = src[0][2];
  dst[2][1] = src[1][2];
  dst[2][2] = src[2][2];
}

/*******************************************************************************
* rot_apply: returns t*a
*******************************************************************************/
Coords rot_apply(Rotation t, Coords a)
{
  Coords b;
  if (rot_test_identity(t)) {
    return a;
  } else {
    b.x = t[0][0]*a.x + t[0][1]*a.y + t[0][2]*a.z;
    b.y = t[1][0]*a.x + t[1][1]*a.y + t[1][2]*a.z;
    b.z = t[2][0]*a.x + t[2][1]*a.y + t[2][2]*a.z;
    return b;
  }
}

/**
 * Pretty-printing of rotation matrices.
 */
void rot_print(Rotation rot) {
	printf("[ %4.2f %4.2f %4.2f ]\n",
			rot[0][0], rot[0][1], rot[0][2]);
	printf("[ %4.2f %4.2f %4.2f ]\n",
			rot[1][0], rot[1][1], rot[1][2]);
	printf("[ %4.2f %4.2f %4.2f ]\n\n",
			rot[2][0], rot[2][1], rot[2][2]);
}

/**
 * Vector product: used by vec_prod (mccode-r.h). Use coords_xp for Coords.
 */
void vec_prod_func(double *x, double *y, double *z,
		double x1, double y1, double z1,
		double x2, double y2, double z2) {
    *x = (y1)*(z2) - (y2)*(z1);
    *y = (z1)*(x2) - (z2)*(x1);
    *z = (x1)*(y2) - (x2)*(y1);
}

/**
 * Scalar product: use coords_sp for Coords.
 */
double scalar_prod(
		double x1, double y1, double z1,
		double x2, double y2, double z2) {
	return ((x1 * x2) + (y1 * y2) + (z1 * z2));
}

mcstatic void norm_func(double *x, double *y, double *z) {
	double temp = (*x * *x) + (*y * *y) + (*z * *z);
	if (temp != 0) {
		temp = sqrt(temp);
		*x /= temp;
		*y /= temp;
		*z /= temp;
	}
}


/* SECTION: GPU algorithms ================================================== */


/*
*  Divide-and-conquer strategy for parallelizing this task: Sort absorbed
*  particles last.
*
*   particles:  the particle array, required to checking _absorbed
*   pbuffer:    same-size particle buffer array required for parallel sort
*   len:        sorting area-of-interest size (e.g. from previous calls)
*   buffer_len: total array size
*   flag_split: if set, multiply live particles into absorbed slots, up to buffer_len
*   multiplier: output arg, becomes the  SPLIT multiplier if flag_split is set
*/
#ifdef FUNNEL
long sort_absorb_last(_class_particle* particles, _class_particle* pbuffer, long len, long buffer_len, long flag_split, long* multiplier) {
  #define SAL_THREADS 1024 // num parallel sections
  if (len<SAL_THREADS) return sort_absorb_last_serial(particles, len);

  if (multiplier != NULL) *multiplier = -1; // set default out value for multiplier
  long newlen = 0;
  long los[SAL_THREADS]; // target array startidxs
  long lens[SAL_THREADS]; // target array sublens
  long l = floor(len/(SAL_THREADS-1)); // subproblem_len
  long ll = len - l*(SAL_THREADS-1); // last_subproblem_len

  // TODO: The l vs ll is too simplistic, since ll can become much larger
  // than l, resulting in idling. We should distribute lengths more evenly.

  // step 1: sort sub-arrays
  #pragma acc parallel loop present(particles[0:buffer_len], pbuffer[0:buffer_len])
  for (unsigned long tidx=0; tidx<SAL_THREADS; tidx++) {
    long lo = l*tidx;
    long loclen = l;
    if (tidx==(SAL_THREADS-1)) loclen = ll; // last sub-problem special case
    long i = lo;
    long j = lo + loclen - 1;

    // write into pbuffer at i and j
    #pragma acc loop seq
    while (i < j) {
      #pragma acc loop seq
      while (!particles[i]._absorbed && i<j) {
        pbuffer[i] = particles[i];
        i++;
      }
      #pragma acc loop seq
      while (particles[j]._absorbed && i<j) {
        pbuffer[j] = particles[j];
        j--;
      }
      if (i < j) {
        pbuffer[j] = particles[i];
        pbuffer[i] = particles[j];
        i++;
        j--;
      }
    }
    // transfer edge case
    if (i==j)
      pbuffer[i] = particles[i];

    lens[tidx] = i - lo;
    if (i==j && !particles[i]._absorbed) lens[tidx]++;
  }

  // determine lo's
  long accumlen = 0;
  #pragma acc loop seq
  for (long idx=0; idx<SAL_THREADS; idx++) {
    los[idx] = accumlen;
    accumlen = accumlen + lens[idx];
  }

  // step 2: write non-absorbed sub-arrays to psorted/output from the left
  #pragma acc parallel loop present(pbuffer[0:buffer_len])
  for (unsigned long tidx=0; tidx<SAL_THREADS; tidx++) {
    long j, k;
    #pragma acc loop seq
    for (long i=0; i<lens[tidx]; i++) {
      j = i + l*tidx;
      k = i + los[tidx];
      particles[k] = pbuffer[j];
    }
  }
  //for (int ii=0;ii<accumlen;ii++) printf("%ld ", (psorted[ii]->_absorbed));

  // return (no SPLIT)
  if (flag_split != 1)
    return accumlen;

  // SPLIT - repeat the non-absorbed block N-1 times, where len % accumlen = N + R
  int mult = buffer_len / accumlen; // TODO: possibly use a new arg, bufferlen, rather than len

  // not enough space for full-block split, return
  if (mult <= 1)
    return accumlen;

  // copy non-absorbed block
  #pragma acc parallel loop present(particles[0:buffer_len])
  for (long tidx = 0; tidx < accumlen; tidx++) { // tidx: thread index
    randstate_t randstate[7];
    _class_particle sourcebuffer;
    _class_particle targetbuffer;
    // assign reduced weight to all particles
    particles[tidx].p=particles[tidx].p/mult;
    #pragma acc loop seq
    for (long bidx = 1; bidx < mult; bidx++) { // bidx: block index
      // preserve absorbed particle (for randstate)
      sourcebuffer = particles[bidx*accumlen + tidx];
      // buffer full particle struct
      targetbuffer = particles[tidx];
      // reassign previous randstate
      targetbuffer.randstate[0] = sourcebuffer.randstate[0];
      targetbuffer.randstate[1] = sourcebuffer.randstate[1];
      targetbuffer.randstate[2] = sourcebuffer.randstate[2];
      targetbuffer.randstate[3] = sourcebuffer.randstate[3];
      targetbuffer.randstate[4] = sourcebuffer.randstate[4];
      targetbuffer.randstate[5] = sourcebuffer.randstate[5];
      targetbuffer.randstate[6] = sourcebuffer.randstate[6];
      // apply
      particles[bidx*accumlen + tidx] = targetbuffer;
    }
  }

  // set out split multiplier value
  *multiplier = mult;

  // return expanded array size
  return accumlen * mult;
}

#endif

/*
*  Fallback serial version of the one above.
*/
long sort_absorb_last_serial(_class_particle* particles, long len) {
  long i = 0;
  long j = len - 1;
  _class_particle pbuffer;

  // bubble
  while (i < j) {
    while (!particles[i]._absorbed && i<j) i++;
    while (particles[j]._absorbed && i<j) j--;
    if (i < j) {
      pbuffer = particles[j];
      particles[j] = particles[i];
      particles[i] = pbuffer;
      i++;
      j--;
    }
  }

  // return new length
  if (i==j && !particles[i]._absorbed)
    return i + 1;
  else
    return i;
}

/*******************************************************************************
* mccoordschange: applies rotation to (x y z) and (vx vy vz) and Spin (sx,sy,sz)
*******************************************************************************/
void mccoordschange(Coords a, Rotation t, _class_particle *particle)
{
  Coords b, c;

  b.x = particle->x;
  b.y = particle->y;
  b.z = particle->z;
  c = rot_apply(t, b);
  b = coords_add(c, a);
  particle->x = b.x;
  particle->y = b.y;
  particle->z = b.z;

#if MCCODE_PARTICLE_CODE == 2112
    if (particle->vz != 0.0 || particle->vx != 0.0 || particle->vy != 0.0)
      mccoordschange_polarisation(t, &(particle->vx), &(particle->vy), &(particle->vz));

    if (particle->sz != 0.0 || particle->sx != 0.0 || particle->sy != 0.0)
      mccoordschange_polarisation(t, &(particle->sx), &(particle->sy), &(particle->sz));
#elif MCCODE_PARTICLE_CODE == 22
    if (particle->kz != 0.0 || particle->kx != 0.0 || particle->ky != 0.0)
      mccoordschange_polarisation(t, &(particle->kx), &(particle->ky), &(particle->kz));

    if (particle->Ez != 0.0 || particle->Ex != 0.0 || particle->Ey != 0.0)
      mccoordschange_polarisation(t, &(particle->Ex), &(particle->Ey), &(particle->Ez));
#endif
}

/*******************************************************************************
* mccoordschange_polarisation: applies rotation to vector (sx sy sz)
*******************************************************************************/
void mccoordschange_polarisation(Rotation t, double *sx, double *sy, double *sz)
{
  Coords b, c;

  b.x = *sx;
  b.y = *sy;
  b.z = *sz;
  c = rot_apply(t, b);
  *sx = c.x;
  *sy = c.y;
  *sz = c.z;
}

/* SECTION: vector math  ==================================================== */

/* normal_vec_func: Compute normal vector to (x,y,z). */
void normal_vec(double *nx, double *ny, double *nz,
                double x, double y, double z)
{
  double ax = fabs(x);
  double ay = fabs(y);
  double az = fabs(z);
  double l;
  if(x == 0 && y == 0 && z == 0)
  {
    *nx = 0;
    *ny = 0;
    *nz = 0;
    return;
  }
  if(ax < ay)
  {
    if(ax < az)
    {                           /* Use X axis */
      l = sqrt(z*z + y*y);
      *nx = 0;
      *ny = z/l;
      *nz = -y/l;
      return;
    }
  }
  else
  {
    if(ay < az)
    {                           /* Use Y axis */
      l = sqrt(z*z + x*x);
      *nx = z/l;
      *ny = 0;
      *nz = -x/l;
      return;
    }
  }
  /* Use Z axis */
  l = sqrt(y*y + x*x);
  *nx = y/l;
  *ny = -x/l;
  *nz = 0;
} /* normal_vec */

/*******************************************************************************
 * solve_2nd_order: second order equation solve: A*t^2 + B*t + C = 0
 * solve_2nd_order(&t1, NULL, A,B,C)
 *   returns 0 if no solution was found, or set 't1' to the smallest positive
 *   solution.
 * solve_2nd_order(&t1, &t2, A,B,C)
 *   same as with &t2=NULL, but also returns the second solution.
 * EXAMPLE usage for intersection of a trajectory with a plane in gravitation
 * field (gx,gy,gz):
 * The neutron starts at point r=(x,y,z) with velocityv=(vx vy vz). The plane
 * has a normal vector n=(nx,ny,nz) and contains the point W=(wx,wy,wz).
 * The problem consists in solving the 2nd order equation:
 *      1/2.n.g.t^2 + n.v.t + n.(r-W) = 0
 * so that A = 0.5 n.g; B = n.v; C = n.(r-W);
 * Without acceleration, t=-n.(r-W)/n.v
 ******************************************************************************/
int solve_2nd_order_old(double *t1, double *t2,
                  double A,  double B,  double C)
{
  int ret=0;

  if (!t1) return 0;
  *t1 = 0;
  if (t2) *t2=0;

  if (fabs(A) < 1E-10) /* approximate to linear equation: A ~ 0 */
  {
    if (B) {  *t1 = -C/B; ret=1; if (t2) *t2=*t1; }
    /* else no intersection: A=B=0 ret=0 */
  }
  else
  {
    double D;
    D = B*B - 4*A*C;
    if (D >= 0) /* Delta > 0: two solutions */
    {
      double sD, dt1, dt2;
      sD = sqrt(D);
      dt1 = (-B + sD)/2/A;
      dt2 = (-B - sD)/2/A;
      /* we identify very small values with zero */
      if (fabs(dt1) < 1e-10) dt1=0.0;
      if (fabs(dt2) < 1e-10) dt2=0.0;

      /* now we choose the smallest positive solution */
      if      (dt1<=0.0 && dt2>0.0) ret=2; /* dt2 positive */
      else if (dt2<=0.0 && dt1>0.0) ret=1; /* dt1 positive */
      else if (dt1> 0.0 && dt2>0.0)
      {  if (dt1 < dt2) ret=1; else ret=2; } /* all positive: min(dt1,dt2) */
      /* else two solutions are negative. ret=-1 */
      if (ret==1) { *t1 = dt1;  if (t2) *t2=dt2; }
      else        { *t1 = dt2;  if (t2) *t2=dt1; }
      ret=2;  /* found 2 solutions and t1 is the positive one */
    } /* else Delta <0: no intersection. ret=0 */
  }
  return(ret);
} /* solve_2nd_order */

int solve_2nd_order(double *t0, double *t1, double A, double B, double C){
  int retval=0;
  double sign=copysign(1.0,B);
  double dt0,dt1;

  dt0=0;
  dt1=0;
  if(t1){ *t1=0;}

  /*protect against rounding errors by locally equating DBL_EPSILON with 0*/
  if (fabs(A)<DBL_EPSILON){
    A=0;
  }
  if (fabs(B)<DBL_EPSILON){
    B=0;
  }
  if (fabs(C)<DBL_EPSILON){
    C=0;
  }

  /*check if coefficient are sane*/
  if( A==0  && B==0){
    retval=0;
  }else{
    if(A==0){
      /*equation is linear*/
      dt0=-C/B;
      retval=1;
    }else if (C==0){
      /*one root is 0*/
      if(sign<0){
        dt0=0;dt1=-B/A;
      }else{
        dt0=-B/A;dt1=0;
      }
      retval=2;
    }else{
      /*a regular 2nd order eq. Also works out fine for B==0.*/
      double D;
      D=B*B-4*A*C;
      if (D>=0){
        dt0=(-B - sign*sqrt(B*B-4*A*C))/(2*A);
        dt1=C/(A*dt0);
        retval=2;
      }else{
        /*no real roots*/
        retval=0;
      }
    }
    /*sort the solutions*/
    if (retval==1){
      /*put both solutions in t0 and t1*/
      *t0=dt0;
      if(t1) *t1=dt1;
    }else{
      /*we have two solutions*/
      /*swap if both are positive and t1 smaller than t0 or t1 the only positive*/
      int swap=0;
      if(dt1>0 && ( dt1<dt0 || dt0<=0) ){
        swap=1;
      }
      if (swap){
        *t0=dt1;
        if(t1) *t1=dt0;
      }else{
        *t0=dt0;
        if(t1) *t1=dt0;
      }
    }

  }
  return retval;

} /*solve_2nd_order_improved*/


/*******************************************************************************
 * randvec_target_circle: Choose random direction towards target at (x,y,z)
 * with given radius.
 * If radius is zero, choose random direction in full 4PI, no target.
 ******************************************************************************/
void _randvec_target_circle(double *xo, double *yo, double *zo, double *solid_angle,
        double xi, double yi, double zi, double radius,
        _class_particle* _particle)
{
  double l2, phi, theta, nx, ny, nz, xt, yt, zt, xu, yu, zu;

  if(radius == 0.0)
  {
    /* No target, choose uniformly a direction in full 4PI solid angle. */
    theta = acos(1 - rand0max(2));
    phi = rand0max(2 * PI);
    if(solid_angle)
      *solid_angle = 4*PI;
    nx = 1;
    ny = 0;
    nz = 0;
    yi = sqrt(xi*xi+yi*yi+zi*zi);
    zi = 0;
    xi = 0;
  }
  else
  {
    double costheta0;
    l2 = xi*xi + yi*yi + zi*zi; /* sqr Distance to target. */
    costheta0 = sqrt(l2/(radius*radius+l2));
    if (radius < 0) costheta0 *= -1;
    if(solid_angle)
    {
      /* Compute solid angle of target as seen from origin. */
        *solid_angle = 2*PI*(1 - costheta0);
    }

    /* Now choose point uniformly on circle surface within angle theta0 */
    theta = acos (1 - rand0max(1 - costheta0)); /* radius on circle */
    phi = rand0max(2 * PI); /* rotation on circle at given radius */
    /* Now, to obtain the desired vector rotate (xi,yi,zi) angle theta around a
       perpendicular axis u=i x n and then angle phi around i. */
    if(xi == 0 && zi == 0)
    {
      nx = 1;
      ny = 0;
      nz = 0;
    }
    else
    {
      nx = -zi;
      nz = xi;
      ny = 0;
    }
  }

  /* [xyz]u = [xyz]i x n[xyz] (usually vertical) */
  vec_prod(xu,  yu,  zu, xi, yi, zi,        nx, ny, nz);
  /* [xyz]t = [xyz]i rotated theta around [xyz]u */
  rotate  (xt,  yt,  zt, xi, yi, zi, theta, xu, yu, zu);
  /* [xyz]o = [xyz]t rotated phi around n[xyz] */
  rotate (*xo, *yo, *zo, xt, yt, zt, phi, xi, yi, zi);
}
/* randvec_target_circle */

/*******************************************************************************
 * randvec_target_rect_angular: Choose random direction towards target at
 * (xi,yi,zi) with given ANGULAR dimension height x width. height=phi_x=[0,PI],
 * width=phi_y=[0,2*PI] (radians)
 * If height or width is zero, choose random direction in full 4PI, no target.
 *******************************************************************************/
void _randvec_target_rect_angular(double *xo, double *yo, double *zo, double *solid_angle,
        double xi, double yi, double zi, double width, double height, Rotation A,
        _class_particle* _particle)
{
  double theta, phi, nx, ny, nz, xt, yt, zt, xu, yu, zu;
  Coords tmp;
  Rotation Ainverse;

  rot_transpose(A, Ainverse);

  if(height == 0.0 || width == 0.0)
  {
    randvec_target_circle(xo, yo, zo, solid_angle, xi, yi, zi, 0);
    return;
  }
  else
  {
    if(solid_angle)
    {
      /* Compute solid angle of target as seen from origin. */
      *solid_angle = 2*fabs(width*sin(height/2));
    }

    /* Go to global coordinate system */

    tmp = coords_set(xi, yi, zi);
    tmp = rot_apply(Ainverse, tmp);
    coords_get(tmp, &xi, &yi, &zi);

    /* Now choose point uniformly on the unit sphere segment with angle theta/phi */
    phi   = width*randpm1()/2.0;
    theta = asin(randpm1()*sin(height/2.0));
    /* Now, to obtain the desired vector rotate (xi,yi,zi) angle theta around
       n, and then phi around u. */
    if(xi == 0 && zi == 0)
    {
      nx = 1;
      ny = 0;
      nz = 0;
    }
    else
    {
      nx = -zi;
      nz = xi;
      ny = 0;
    }
  }

  /* [xyz]u = [xyz]i x n[xyz] (usually vertical) */
  vec_prod(xu,  yu,  zu, xi, yi, zi,        nx, ny, nz);
  /* [xyz]t = [xyz]i rotated theta around [xyz]u */
  rotate  (xt,  yt,  zt, xi, yi, zi, theta, nx, ny, nz);
  /* [xyz]o = [xyz]t rotated phi around n[xyz] */
  rotate (*xo, *yo, *zo, xt, yt, zt, phi, xu,  yu,  zu);

  /* Go back to local coordinate system */
  tmp = coords_set(*xo, *yo, *zo);
  tmp = rot_apply(A, tmp);
  coords_get(tmp, &*xo, &*yo, &*zo);
}
/* randvec_target_rect_angular */

/*******************************************************************************
 * randvec_target_rect_real: Choose random direction towards target at (xi,yi,zi)
 * with given dimension height x width (in meters !).
 *
 * Local emission coordinate is taken into account and corrected for 'order' times.
 * (See remarks posted to mcstas-users by George Apostolopoulus <gapost@ipta.demokritos.gr>)
 *
 * If height or width is zero, choose random direction in full 4PI, no target.
 *
 * Traditionally, this routine had the name randvec_target_rect - this is now a
 * a define (see mcstas-r.h) pointing here. If you use the old rouine, you are NOT
 * taking the local emmission coordinate into account.
*******************************************************************************/
void _randvec_target_rect_real(double *xo, double *yo, double *zo, double *solid_angle,
        double xi, double yi, double zi,
        double width, double height, Rotation A,
        double lx, double ly, double lz, int order,
        _class_particle* _particle)
{
  double dx, dy, dist, dist_p, nx, ny, nz, mx, my, mz, n_norm, m_norm;
  double cos_theta;
  Coords tmp;
  Rotation Ainverse;

  rot_transpose(A, Ainverse);

  if(height == 0.0 || width == 0.0)
  {
    randvec_target_circle(xo, yo, zo, solid_angle,
               xi, yi, zi, 0);
    return;
  }
  else
  {
    /* Now choose point uniformly on rectangle within width x height */
    dx = width*randpm1()/2.0;
    dy = height*randpm1()/2.0;

    /* Determine distance to target plane*/
    dist = sqrt(xi*xi + yi*yi + zi*zi);
    /* Go to global coordinate system */

    tmp = coords_set(xi, yi, zi);
    tmp = rot_apply(Ainverse, tmp);
    coords_get(tmp, &xi, &yi, &zi);

    /* Determine vector normal to trajectory axis (z) and gravity [0 1 0] */
    vec_prod(nx, ny, nz, xi, yi, zi, 0, 1, 0);

    /* This now defines the x-axis, normalize: */
    n_norm=sqrt(nx*nx + ny*ny + nz*nz);
    nx = nx/n_norm;
    ny = ny/n_norm;
    nz = nz/n_norm;

    /* Now, determine our y-axis (vertical in many cases...) */
    vec_prod(mx, my, mz, xi, yi, zi, nx, ny, nz);
    m_norm=sqrt(mx*mx + my*my + mz*mz);
    mx = mx/m_norm;
    my = my/m_norm;
    mz = mz/m_norm;

    /* Our output, random vector can now be defined by linear combination: */

    *xo = xi + dx * nx + dy * mx;
    *yo = yi + dx * ny + dy * my;
    *zo = zi + dx * nz + dy * mz;

    /* Go back to local coordinate system */
    tmp = coords_set(*xo, *yo, *zo);
    tmp = rot_apply(A, tmp);
    coords_get(tmp, &*xo, &*yo, &*zo);

    /* Go back to local coordinate system */
    tmp = coords_set(xi, yi, zi);
    tmp = rot_apply(A, tmp);
    coords_get(tmp, &xi, &yi, &zi);

    if (solid_angle) {
      /* Calculate vector from local point to remote random point */
      lx = *xo - lx;
      ly = *yo - ly;
      lz = *zo - lz;
      dist_p = sqrt(lx*lx + ly*ly + lz*lz);

      /* Adjust the 'solid angle' */
      /* 1/r^2 to the chosen point times cos(\theta) between the normal */
      /* vector of the target rectangle and direction vector of the chosen point. */
      cos_theta = (xi * lx + yi * ly + zi * lz) / (dist * dist_p);
      *solid_angle = width * height / (dist_p * dist_p);
      int counter;
      for (counter = 0; counter < order; counter++) {
        *solid_angle = *solid_angle * cos_theta;
      }
    }
  }
}
/* randvec_target_rect_real */


/* SECTION: random numbers ==================================================

  How to add a new RNG:

  - Use an rng with a manegable state vector, e.g. of lengt 4 or 7. The state
  will sit on the particle struct as a "randstate_t state[RANDSTATE_LEN]"
  - If the rng has a long state (as MT), set an empty "srandom" and initialize
  it explicitly using the appropriate define (RNG_ALG)
  - Add a seed and a random function (the transforms will be reused)
  - Write the proper defines in mccode-r.h, e.g. randstate_t and RANDSTATE_LEN,
  srandom and random.
  - Compile using -DRNG_ALG=<selector int value>

============================================================================= */


/* "Mersenne Twister", by Makoto Matsumoto and Takuji Nishimura. */
/* See http://www.math.keio.ac.jp/~matumoto/emt.html for original source. */
/*
   A C-program for MT19937, with initialization improved 2002/1/26.
   Coded by Takuji Nishimura and Makoto Matsumoto.

   Before using, initialize the state by using mt_srandom(seed)
   or init_by_array(init_key, key_length).

   Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
   All rights reserved.

   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions
   are met:

     1. Redistributions of source code must retain the above copyright
        notice, this list of conditions and the following disclaimer.

     2. Redistributions in binary form must reproduce the above copyright
        notice, this list of conditions and the following disclaimer in the
        documentation and/or other materials provided with the distribution.

     3. The names of its contributors may not be used to endorse or promote
        products derived from this software without specific prior written
        permission.

   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


   Any feedback is very welcome.
   http://www.math.keio.ac.jp/matumoto/emt.html
   email: matumoto@math.keio.ac.jp
*/
#include <stdio.h>
#include <stdint.h>   // for uint32_t
#include <stddef.h>   // for size_t

/* Period parameters */
#define N 624
#define M 397
#define MATRIX_A 0x9908b0dfU   /* constant vector a */
#define UPPER_MASK 0x80000000U /* most significant w-r bits */
#define LOWER_MASK 0x7fffffffU /* least significant r bits */

static uint32_t mt[N]; /* the array for the state vector  */
static int mti = N + 1; /* mti==N+1 means mt[N] is not initialized */

// Required for compatibility with common RNG interface (e.g., kiss/mt polymorphism)
void mt_srandom_empty(void) {}

// Initializes mt[N] with a seed
void mt_srandom(uint32_t seed) {
    mt[0] = seed;
    for (mti = 1; mti < N; mti++) {
        mt[mti] = 1812433253U * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti;
        /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */
        /* In the previous versions, MSBs of the seed affect   */
        /* only MSBs of the array mt[].                        */
        /* 2002/01/09 modified by Makoto Matsumoto             */
        mt[mti] &= 0xffffffffU;
        /* for >32 bit machines */
    }
}
/* Initialize by an array with array-length.
   Init_key is the array for initializing keys.
   key_length is its length. */
void init_by_array(uint32_t init_key[], size_t key_length) {
    size_t i = 1, j = 0, k;
    mt_srandom(19650218U);
    k = (N > key_length ? N : key_length);
    for (; k; k--) {
        mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525U))
              + init_key[j] + (uint32_t)j;
        mt[i] &= 0xffffffffU;
        i++; j++;
        if (i >= N) { mt[0] = mt[N - 1]; i = 1; }
        if (j >= key_length) j = 0;
    }
    for (k = N - 1; k; k--) {
        mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941U))
              - (uint32_t)i;
        mt[i] &= 0xffffffffU;
        i++;
        if (i >= N) { mt[0] = mt[N - 1]; i = 1; }
    }
    mt[0] = 0x80000000U; /* MSB is 1; ensuring non-zero initial array */
}

// Generates a random number on [0, 0xffffffff]-interval
uint32_t mt_random(void) {
    uint32_t y;
    static const uint32_t mag01[2] = { 0x0U, MATRIX_A };
    /* mag01[x] = x * MATRIX_A  for x=0,1 */

    if (mti >= N) { /* generate N words at one time */
        int kk;

        if (mti == N + 1)   /* if mt_srandom() has not been called, */ 
            mt_srandom(5489U);  /* a default initial seed is used */

        for (kk = 0; kk < N - M; kk++) {
            y = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK);
            mt[kk] = mt[kk + M] ^ (y >> 1) ^ mag01[y & 0x1U];
        }
        for (; kk < N - 1; kk++) {
            y = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK);
            mt[kk] = mt[kk + (M - N)] ^ (y >> 1) ^ mag01[y & 0x1U];
        }
        y = (mt[N - 1] & UPPER_MASK) | (mt[0] & LOWER_MASK);
        mt[N - 1] = mt[M - 1] ^ (y >> 1) ^ mag01[y & 0x1U];

        mti = 0;
    }

    y = mt[mti++];

    /* Tempering */
    y ^= (y >> 11);
    y ^= (y << 7) & 0x9d2c5680U;
    y ^= (y << 15) & 0xefc60000U;
    y ^= (y >> 18);

    return y;
}
#undef N
#undef M
#undef MATRIX_A
#undef UPPER_MASK
#undef LOWER_MASK
/* End of "Mersenne Twister". */


/*
KISS

 From: http://www.helsbreth.org/random/rng_kiss.html
 Scott Nelson 1999

 Based on Marsaglia's KISS or (KISS+SWB) <http://www.cs.yorku.ca/~oz/marsaglia-
rng.html>

 KISS - Keep it Simple Stupid PRNG

 the idea is to use simple, fast, individually promising
 generators to get a composite that will be fast, easy to code
 have a very long period and pass all the tests put to it.
 The three components of KISS are
        x(n)=a*x(n-1)+1 mod 2^32
        y(n)=y(n-1)(I+L^13)(I+R^17)(I+L^5),
        z(n)=2*z(n-1)+z(n-2) +carry mod 2^32
 The y's are a shift register sequence on 32bit binary vectors
 period 2^32-1;
 The z's are a simple multiply-with-carry sequence with period
 2^63+2^32-1.  The period of KISS is thus
      2^32*(2^32-1)*(2^63+2^32-1) > 2^127

 In 2025 adapted for consistent 64-bit behavior across platforms.
*/

/* the KISS state is stored as a vector of 7 uint64_t        */
/*   0  1  2  3  4      5  6   */
/* [ x, y, z, w, carry, k, m ] */

uint64_t *kiss_srandom(uint64_t state[7], uint64_t seed) {
    if (seed == 0) seed = 1ull;
    state[0] = seed | 1ull; // x
    state[1] = seed | 2ull; // y
    state[2] = seed | 4ull; // z
    state[3] = seed | 8ull; // w
    state[4] = 0ull;        // carry
    state[5] = 0ull;        // k
    state[6] = 0ull;        // m
    return state;
}

uint64_t kiss_random(uint64_t state[7]) {
    // Linear congruential generator
    state[0] = state[0] * 69069ull + 1ull;

    // Xorshift
    state[1] ^= state[1] << 13ull;
    state[1] ^= state[1] >> 17ull;
    state[1] ^= state[1] << 5ull;

    // Multiply-with-carry
    state[5] = (state[2] >> 2ull) + (state[3] >> 3ull) + (state[4] >> 2ull);
    state[6] = state[3] + state[3] + state[2] + state[4];
    state[2] = state[3];
    state[3] = state[6];
    state[4] = state[5] >> 62ull;  // Top bit of carry (adjusted for 64-bit)

    return state[0] + state[1] + state[3];
}
/* end of "KISS" rng */


/* FAST KISS in another implementation (Hundt) */

//////////////////////////////////////////////////////////////////////////////
// fast keep it simple stupid generator
//////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////
// Thomas Mueller hash for initialization of rngs
// http://stackoverflow.com/questions/664014/
//        what-integer-hash-function-are-good-that-accepts-an-integer-hash-key
//////////////////////////////////////////////////////////////////////////////
randstate_t _hash(randstate_t x) {
  x = ((x >> 16) ^ x) * (randstate_t)0x45d9f3b;
  x = ((x >> 16) ^ x) * (randstate_t)0x45d9f3b;
  x = ((x >> 16) ^ x);
  return x;
}


// SECTION: random number transforms ==========================================



// generate a random number from normal law
double _randnorm(randstate_t* state)
{
  static double v1, v2, s; /* removing static breaks comparison with McStas <= 2.5 */
  static int phase = 0;
  double X, u1, u2;

  if(phase == 0)
  {
    do
    {
      u1 = _rand01(state);
      u2 = _rand01(state);
      v1 = 2*u1 - 1;
      v2 = 2*u2 - 1;
      s = v1*v1 + v2*v2;
    } while(s >= 1 || s == 0);

    X = v1*sqrt(-2*log(s)/s);
  }
  else
  {
    X = v2*sqrt(-2*log(s)/s);
  }

  phase = 1 - phase;
  return X;
}
// another one
double _randnorm2(randstate_t* state) {
  double x, y, r;
  do {
      x = 2.0 * _rand01(state) - 1.0;
      y = 2.0 * _rand01(state) - 1.0;
      r = x*x + y*y;
  } while (r == 0.0 || r >= 1.0);
  return x * sqrt((-2.0 * log(r)) / r);
}

// Generate a random number from -1 to 1 with triangle distribution
double _randtriangle(randstate_t* state) {
	double randnum = _rand01(state);
	if (randnum>0.5) return(1-sqrt(2*(randnum-0.5)));
	else return(sqrt(2*randnum)-1);
}
double _rand01(randstate_t* state) {
	double randnum;
	randnum = (double) _random();
  // TODO: can we mult instead of div?
	randnum /= (double) MC_RAND_MAX + 1;
	return randnum;
}
// Return a random number between 1 and -1
double _randpm1(randstate_t* state) {
	double randnum;
	randnum = (double) _random();
	randnum /= ((double) MC_RAND_MAX + 1) / 2;
	randnum -= 1;
	return randnum;
}
// Return a random number between 0 and max.
double _rand0max(double max, randstate_t* state) {
	double randnum;
	randnum = (double) _random();
	randnum /= ((double) MC_RAND_MAX + 1) / max;
	return randnum;
}
// Return a random number between min and max.
double _randminmax(double min, double max, randstate_t* state) {
	return _rand0max(max - min, state) + max;
}


/* SECTION: main and signal handlers ======================================== */

/*******************************************************************************
* mchelp: displays instrument executable help with possible options
*******************************************************************************/
static void
mchelp(char *pgmname)
{
  int i;

  fprintf(stderr, "%s (%s) instrument simulation, generated with " MCCODE_STRING " (" MCCODE_DATE ")\n", instrument_name, instrument_source);
  fprintf(stderr, "Usage: %s [options] [parm=value ...]\n", pgmname);
  fprintf(stderr,
"Options are:\n"
"  -s SEED   --seed=SEED      Set random seed (must be != 0)\n"
"  -n COUNT  --ncount=COUNT   Set number of particles to simulate.\n"
"  -d DIR    --dir=DIR        Put all data files in directory DIR.\n"
"  -a        --append         Append data files to those in directory DIR.\n"	  
"  -t        --trace          Enable trace of " MCCODE_PARTICLE "s through instrument.\n"
"                             (Use -t=2 or --trace=2 for modernised mcdisplay rendering)\n"
"  -g        --gravitation    Enable gravitation for all trajectories.\n"
"  --no-output-files          Do not write any data files.\n"
"  -h        --help           Show this help message.\n"
"  -i        --info           Detailed instrument information.\n"
"  --list-parameters          Print the instrument parameters to standard out\n"
"  -y        --yes            Assume default values for all parameters with a default\n"
"  --meta-list                Print names of components which defined metadata\n"
"  --meta-defined COMP[:NAME] Print component defined metadata names, or (0,1) if NAME provided\n"
"  --meta-type COMP:NAME      Print metadata format type specified in definition\n"
"  --meta-data COMP:NAME      Print the metadata text\n"
"  --source                   Show the instrument code which was compiled.\n"
#ifdef OPENACC
"\n"
"  --vecsize                  OpenACC vector-size (default: 128)\n"
"  --numgangs                 Number of OpenACC gangs (default: 7813)\n"
"  --gpu_innerloop            Maximum rays to process pr. OpenACC \n"
"                             kernel run (default: 2147483647)\n"
"\n"
#endif
"\n"
"  --bufsiz                   Monitor_nD list/buffer-size (default: 1000000)\n"
"  --format=FORMAT            Output data files using FORMAT="
   FLAVOR_UPPER
#ifdef USE_NEXUS
   " NEXUS\n"
"  --IDF                      Embed an xml-formatted IDF instrument definition\n"
"                             in the NeXus file (if existent in .)\n\n"
#else
"\n\n"
#endif
);
#ifdef USE_MPI
  fprintf(stderr,
  "This instrument has been compiled with MPI support.\n  Use 'mpirun %s [options] [parm=value ...]'.\n", pgmname);
#endif
#ifdef OPENACC
  fprintf(stderr,
  "This instrument has been compiled with NVIDIA GPU support through OpenACC.\n  Running on systems without such devices will lead to segfaults.\nFurter, fprintf, sprintf and printf have been removed from any component TRACE.\n");
#endif

  if(numipar > 0)
  {
    fprintf(stderr, "Instrument parameters are:\n");
    for(i = 0; i < numipar; i++)
      if (mcinputtable[i].val && strlen(mcinputtable[i].val))
        fprintf(stderr, "  %-16s(%s) [default='%s']\n", mcinputtable[i].name,
        (*mcinputtypes[mcinputtable[i].type].parminfo)(mcinputtable[i].name),
        mcinputtable[i].val);
      else
        fprintf(stderr, "  %-16s(%s)\n", mcinputtable[i].name,
        (*mcinputtypes[mcinputtable[i].type].parminfo)(mcinputtable[i].name));
  }

#ifndef NOSIGNALS
  fprintf(stderr, "Known signals are: "
#ifdef SIGUSR1
  "USR1 (status) "
#endif
#ifdef SIGUSR2
  "USR2 (save) "
#endif
#ifdef SIGBREAK
  "BREAK (save) "
#endif
#ifdef SIGTERM
  "TERM (save and exit)"
#endif
  "\n");
#endif /* !NOSIGNALS */
} /* mchelp */


/* mcshowhelp: show help and exit with 0 */
static void
mcshowhelp(char *pgmname)
{
  mchelp(pgmname);
  exit(0);
}

/* mcusage: display usage when error in input arguments and exit with 1 */
static void
mcusage(char *pgmname)
{
  fprintf(stderr, "Error: incorrect command line arguments\n");
  mchelp(pgmname);
  exit(1);
}

/* mcenabletrace: enable trace/mcdisplay or error if requires recompile */
static void
mcenabletrace(int mode)
{
 if(traceenabled) {
  mcdotrace = mode;
  #pragma acc update device ( mcdotrace )
 } else {
   if (mode>0) {
     fprintf(stderr,
	     "Error: trace not enabled (mcenabletrace)\n"
	     "Please re-run the " MCCODE_NAME " compiler "
	     "with the --trace option, or rerun the\n"
	     "C compiler with the MC_TRACE_ENABLED macro defined.\n");
     exit(1);
   }
 }
}

/*******************************************************************************
* mcreadparams: request parameters from the prompt (or use default)
*******************************************************************************/
void
mcreadparams(void)
{
  int i,j,status;
  static char buf[CHAR_BUF_LENGTH];
  char *p;
  int len;

  MPI_MASTER(printf("Instrument parameters for %s (%s)\n",
                    instrument_name, instrument_source));

  for(i = 0; mcinputtable[i].name != 0; i++)
  {
    do
    {
      MPI_MASTER(
                 if (mcinputtable[i].val && strlen(mcinputtable[i].val))
                   printf("Set value of instrument parameter %s (%s) [default='%s']:\n",
                          mcinputtable[i].name,
                          (*mcinputtypes[mcinputtable[i].type].parminfo)
                          (mcinputtable[i].name), mcinputtable[i].val);
                 else
                   printf("Set value of instrument parameter %s (%s):\n",
                          mcinputtable[i].name,
                          (*mcinputtypes[mcinputtable[i].type].parminfo)
                          (mcinputtable[i].name));
                 fflush(stdout);
                 );
#ifdef USE_MPI
      if(mpi_node_rank == mpi_node_root)
        {
          p = fgets(buf, CHAR_BUF_LENGTH, stdin);
          if(p == NULL)
            {
              fprintf(stderr, "Error: empty input for paramater %s (mcreadparams)\n", mcinputtable[i].name);
              exit(1);
            }
        }
      else
        p = buf;
      MPI_Bcast(buf, CHAR_BUF_LENGTH, MPI_CHAR, mpi_node_root, MPI_COMM_WORLD);
#else /* !USE_MPI */
      p = fgets(buf, CHAR_BUF_LENGTH, stdin);
      if(p == NULL)
        {
          fprintf(stderr, "Error: empty input for paramater %s (mcreadparams)\n", mcinputtable[i].name);
          exit(1);
        }
#endif /* USE_MPI */
      len = strlen(buf);
      if (!len || (len == 1 && (buf[0] == '\n' || buf[0] == '\r')))
      {
        if (mcinputtable[i].val && strlen(mcinputtable[i].val)) {
          strncpy(buf, mcinputtable[i].val, CHAR_BUF_LENGTH);  /* use default value */
          len = strlen(buf);
        }
      }
      for(j = 0; j < 2; j++)
      {
        if(len > 0 && (buf[len - 1] == '\n' || buf[len - 1] == '\r'))
        {
          len--;
          buf[len] = '\0';
        }
      }

      status = (*mcinputtypes[mcinputtable[i].type].getparm)
                   (buf, mcinputtable[i].par);
      if(!status)
      {
        (*mcinputtypes[mcinputtable[i].type].error)(mcinputtable[i].name, buf);
        if (!mcinputtable[i].val || strlen(mcinputtable[i].val)) {
          fprintf(stderr, "       Change %s default value in instrument definition.\n", mcinputtable[i].name);
          exit(1);
        }
      }
    } while(!status);
  }
} /* mcreadparams */

/*******************************************************************************
* mcparseoptions: parse command line arguments (options, parameters)
*******************************************************************************/
void
mcparseoptions(int argc, char *argv[])
{
  int i, j;
  char *p;
  int paramset = 0, *paramsetarray;
  char *usedir=NULL;

  /* Add one to numipar to avoid allocating zero size memory block. */
  paramsetarray = (int*)malloc((numipar + 1)*sizeof(*paramsetarray));
  if(paramsetarray == NULL)
  {
    fprintf(stderr, "Error: insufficient memory (mcparseoptions)\n");
    exit(1);
  }
  for(j = 0; j < numipar; j++)
    {
      paramsetarray[j] = 0;
      if (mcinputtable[j].val != NULL && strlen(mcinputtable[j].val))
      {
        int  status;
        char buf[CHAR_BUF_LENGTH];
        strncpy(buf, mcinputtable[j].val, CHAR_BUF_LENGTH);
        status = (*mcinputtypes[mcinputtable[j].type].getparm)
                   (buf, mcinputtable[j].par);
        if(!status) fprintf(stderr, "Invalid '%s' default value %s in instrument definition (mcparseoptions)\n", mcinputtable[j].name, buf);
        else paramsetarray[j] = 1;
      } else {
        (*mcinputtypes[mcinputtable[j].type].getparm)
          (NULL, mcinputtable[j].par);
        paramsetarray[j] = 0;
      }
    }
  for(i = 1; i < argc; i++)
  {
    if(!strcmp("-s", argv[i]) && (i + 1) < argc)
      mcsetseed(argv[++i]);
    else if(!strncmp("-s", argv[i], 2))
      mcsetseed(&argv[i][2]);
    else if(!strcmp("--seed", argv[i]) && (i + 1) < argc)
      mcsetseed(argv[++i]);
    else if(!strncmp("--seed=", argv[i], 7))
      mcsetseed(&argv[i][7]);
    else if(!strcmp("-n", argv[i]) && (i + 1) < argc)
      mcsetn_arg(argv[++i]);
    else if(!strncmp("-n", argv[i], 2))
      mcsetn_arg(&argv[i][2]);
    else if(!strcmp("--ncount", argv[i]) && (i + 1) < argc)
      mcsetn_arg(argv[++i]);
    else if(!strncmp("--ncount=", argv[i], 9))
      mcsetn_arg(&argv[i][9]);
    else if(!strcmp("-d", argv[i]) && (i + 1) < argc)
      usedir=argv[++i];  /* will create directory after parsing all arguments (end of this function) */
    else if(!strncmp("-d", argv[i], 2))
      usedir=&argv[i][2];
    else if(!strcmp("--dir", argv[i]) && (i + 1) < argc)
      usedir=argv[++i];
    else if(!strncmp("-a", argv[i], 2))
      mcappend = 1;
    else if(!strcmp("--append", argv[i]))
      mcappend = 1;
    else if(!strncmp("--dir=", argv[i], 6))
      usedir=&argv[i][6];
    else if(!strcmp("-h", argv[i]))
      mcshowhelp(argv[0]);
    else if(!strcmp("--help", argv[i]) || !strcmp("--version", argv[i]))
      mcshowhelp(argv[0]);
    else if(!strcmp("-i", argv[i])) {
      mcformat=FLAVOR_UPPER;
      mcinfo();
    }
    else if(!strcmp("--info", argv[i]))
      mcinfo();
    else if (!strcmp("--list-parameters", argv[i]))
      mcparameterinfo();
    else if (!strcmp("--meta-list", argv[i]) && ((i+1) >= argc || argv[i+1][0] == '-')){
      //printf("Components with metadata defined:\n");
      exit(metadata_table_print_all_components(num_metadata, metadata_table) == 0);
    }
    else if (!strcmp("--meta-defined", argv[i]) && (i+1) < argc){
      exit(metadata_table_print_component_keys(num_metadata, metadata_table, argv[i+1]) == 0);
    }
    else if (!strcmp("--meta-type", argv[i]) && (i+1) < argc){
      char * literal_type = metadata_table_type(num_metadata, metadata_table, argv[i+1]);
      if (literal_type == NULL) exit(1);
      printf("%s\n", literal_type);
      exit(0);
    }
    else if (!strcmp("--meta-data", argv[i]) && (i+1) < argc){
      char * literal = metadata_table_literal(num_metadata, metadata_table, argv[i+1]);
      if (literal == NULL) exit(1);
      printf("%s\n", literal);
      exit(0);
    }
    else if(!strncmp("--trace=", argv[i], 8)) {
      mcenabletrace(atoi(&argv[i][8]));
    } else if(!strncmp("-t=", argv[i], 3) || !strcmp("--verbose", argv[i])) {
      mcenabletrace(atoi(&argv[i][3]));
    } else if(!strcmp("-t", argv[i]))
      mcenabletrace(1);
    else if(!strcmp("--trace", argv[i]) || !strcmp("--verbose", argv[i]))
      mcenabletrace(1);
    else if(!strcmp("--gravitation", argv[i]))
      mcgravitation = 1;
    else if(!strcmp("-g", argv[i]))
      mcgravitation = 1;
    else if(!strcmp("--yes", argv[i]))
      mcusedefaults = 1;
    else if(!strcmp("-y", argv[i]))
      mcusedefaults = 1;
    else if(!strncmp("--format=", argv[i], 9)) {
      mcformat=&argv[i][9];
    }
    else if(!strcmp("--format", argv[i]) && (i + 1) < argc) {
      mcformat=argv[++i];
    }
#ifdef USE_NEXUS
    else if(!strcmp("--IDF", argv[i])) {
      mcnexus_embed_idf = 1;
    }
#endif
    else if(!strncmp("--vecsize=", argv[i], 10)) {
      vecsize=atoi(&argv[i][10]);
    }    
    else if(!strcmp("--vecsize", argv[i]) && (i + 1) < argc) {
      vecsize=atoi(argv[++i]);
    }
    else if(!strncmp("--bufsiz=", argv[i], 9)) {
      MONND_BUFSIZ=atoi(&argv[i][9]);
    }
    else if(!strcmp("--bufsiz", argv[i]) && (i + 1) < argc) {
      MONND_BUFSIZ=atoi(argv[++i]);
    }
    else if(!strncmp("--numgangs=", argv[i], 11)) {
      numgangs=atoi(&argv[i][11]);
    }
    else if(!strcmp("--numgangs", argv[i]) && (i + 1) < argc) {
      numgangs=atoi(argv[++i]);
    }
    else if(!strncmp("--gpu_innerloop=", argv[i], 16)) {
      gpu_innerloop=(long)strtod(&argv[i][16], NULL);
    }
    else if(!strcmp("--gpu_innerloop", argv[i]) && (i + 1) < argc) {
      gpu_innerloop=(long)strtod(argv[++i], NULL);
    }

    else if(!strcmp("--no-output-files", argv[i]))
      mcdisable_output_files = 1;
    else if(!strcmp("--source", argv[i])) {
      printf("/* Source code %s from %s: */\n"
        "/******************************************************************************/\n"
        "%s\n"
        "/******************************************************************************/\n"
        "/* End of source code %s from %s */\n",
        instrument_name, instrument_source, instrument_code,
        instrument_name, instrument_source);
      exit(1);
    }
    else if(argv[i][0] != '-' && (p = strchr(argv[i], '=')) != NULL)
    {
      *p++ = '\0';

      for(j = 0; j < numipar; j++)
        if(!strcmp(mcinputtable[j].name, argv[i]))
        {
          int status;
          status = (*mcinputtypes[mcinputtable[j].type].getparm)(p,
                        mcinputtable[j].par);
          if(!status || !strlen(p))
          {
            (*mcinputtypes[mcinputtable[j].type].error)
              (mcinputtable[j].name, p);
            exit(1);
          }
          paramsetarray[j] = 1;
          paramset = 1;
          break;
        }
      if(j == numipar)
      {                                /* Unrecognized parameter name */
        fprintf(stderr, "Error: unrecognized parameter %s (mcparseoptions)\n", argv[i]);
        exit(1);
      }
    }
    else if(argv[i][0] == '-') {
      fprintf(stderr, "Error: unrecognized option argument %s (mcparseoptions). Ignored.\n", argv[i++]);
    }
    else {
      fprintf(stderr, "Error: unrecognized argument %s (mcparseoptions). Aborting.\n", argv[i]);
      mcusage(argv[0]);
    }
  }
  if (mcusedefaults) {
    MPI_MASTER(
     printf("Using all default parameter values\n");
    );
    for(j = 0; j < numipar; j++) {
      int status;
      if(mcinputtable[j].val && strlen(mcinputtable[j].val)){
	status = (*mcinputtypes[mcinputtable[j].type].getparm)(mcinputtable[j].val,
                        mcinputtable[j].par);
	paramsetarray[j] = 1;
	paramset = 1;
      }
    }
  }
  if(!paramset)
    mcreadparams();                /* Prompt for parameters if not specified. */
  else
  {
    for(j = 0; j < numipar; j++)
      if(!paramsetarray[j])
      {
        fprintf(stderr, "Error: Instrument parameter %s left unset (mcparseoptions)\n",
                mcinputtable[j].name);
        exit(1);
      }
  }
  free(paramsetarray);
#ifdef USE_MPI
  if (mcdotrace) mpi_node_count=1; /* disable threading when in trace mode */
#endif
  if (usedir && strlen(usedir) && !mcdisable_output_files) mcuse_dir(usedir);
} /* mcparseoptions */

#ifndef NOSIGNALS
/*******************************************************************************
* sighandler: signal handler that makes simulation stop, and save results
*******************************************************************************/
void sighandler(int sig)
{
  /* MOD: E. Farhi, Sep 20th 2001: give more info */
  time_t t1, t0;
#define SIG_SAVE 0
#define SIG_TERM 1
#define SIG_STAT 2
#define SIG_ABRT 3

  printf("\n# " MCCODE_STRING ": [pid %i] Signal %i detected", getpid(), sig);
#ifdef USE_MPI
  printf(" [proc %i]", mpi_node_rank);
#endif
#if defined(SIGUSR1) && defined(SIGUSR2) && defined(SIGKILL)
  if (!strcmp(mcsig_message, "sighandler") && (sig != SIGUSR1) && (sig != SIGUSR2))
  {
    printf("\n# Fatal : unrecoverable loop ! Suicide (naughty boy).\n");
    kill(0, SIGKILL); /* kill myself if error occurs within sighandler: loops */
  }
#endif
  switch (sig) {
#ifdef SIGINT
    case SIGINT : printf(" SIGINT (interrupt from terminal, Ctrl-C)"); sig = SIG_TERM; break;
#endif
#ifdef SIGILL
    case SIGILL  : printf(" SIGILL (Illegal instruction)"); sig = SIG_ABRT; break;
#endif
#ifdef SIGFPE
    case SIGFPE  : printf(" SIGFPE (Math Error)"); sig = SIG_ABRT; break;
#endif
#ifdef SIGSEGV
    case SIGSEGV : printf(" SIGSEGV (Mem Error)"); sig = SIG_ABRT; break;
#endif
#ifdef SIGTERM
    case SIGTERM : printf(" SIGTERM (Termination)"); sig = SIG_TERM; break;
#endif
#ifdef SIGABRT
    case SIGABRT : printf(" SIGABRT (Abort)"); sig = SIG_ABRT; break;
#endif
#ifdef SIGQUIT
    case SIGQUIT : printf(" SIGQUIT (Quit from terminal)"); sig = SIG_TERM; break;
#endif
#ifdef SIGTRAP
    case SIGTRAP : printf(" SIGTRAP (Trace trap)"); sig = SIG_ABRT; break;
#endif
#ifdef SIGPIPE
    case SIGPIPE : printf(" SIGPIPE (Broken pipe)"); sig = SIG_ABRT; break;
#endif
#ifdef SIGUSR1
    case SIGUSR1 : printf(" SIGUSR1 (Display info)"); sig = SIG_STAT; break;
#endif
#ifdef SIGUSR2
    case SIGUSR2 : printf(" SIGUSR2 (Save simulation)"); sig = SIG_SAVE; break;
#endif
#ifdef SIGHUP
    case SIGHUP  : printf(" SIGHUP (Hangup/update)"); sig = SIG_SAVE; break;
#endif
#ifdef SIGBUS
    case SIGBUS  : printf(" SIGBUS (Bus error)"); sig = SIG_ABRT; break;
#endif
#ifdef SIGURG
    case SIGURG  : printf(" SIGURG (Urgent socket condition)"); sig = SIG_ABRT; break;
#endif
#ifdef SIGBREAK
    case SIGBREAK: printf(" SIGBREAK (Break signal, Ctrl-Break)"); sig = SIG_SAVE; break;
#endif
    default : printf(" (look at signal list for signification)"); sig = SIG_ABRT; break;
  }
  printf("\n");
  printf("# Simulation: %s (%s) \n", instrument_name, instrument_source);
  printf("# Breakpoint: %s ", mcsig_message);
  if (strstr(mcsig_message, "Save") && (sig == SIG_SAVE))
    sig = SIG_STAT;
  SIG_MESSAGE("sighandler");
  if (mcget_ncount() == 0)
    printf("(0 %%)\n" );
  else
  {
    printf("%.2f %% (%10.1f/%10.1f)\n", 100.0*mcget_run_num()/mcget_ncount(), 1.0*mcget_run_num(), 1.0*mcget_ncount());
  }
  t0 = (time_t)mcstartdate;
  t1 = time(NULL);
  printf("# Date:      %s", ctime(&t1));
  printf("# Started:   %s", ctime(&t0));

  if (sig == SIG_STAT)
  {
    printf("# " MCCODE_STRING ": Resuming simulation (continue)\n");
    fflush(stdout);
    return;
  }
  else
  if (sig == SIG_SAVE)
  {
    printf("# " MCCODE_STRING ": Saving data and resume simulation (continue)\n");
    save(NULL);
    fflush(stdout);
    return;
  }
  else
  if (sig == SIG_TERM)
  {
    printf("# " MCCODE_STRING ": Finishing simulation (save results and exit)\n");
    finally();
    exit(0);
  }
  else
  {
    fflush(stdout);
    perror("# Last I/O Error");
    printf("# " MCCODE_STRING ": Simulation stop (abort).\n");
// This portion of the signal handling only works on UNIX
#if defined(__unix__) || defined(__APPLE__)
    signal(sig, SIG_DFL); /* force to use default sighandler now */
    kill(getpid(), sig);  /* and trigger it with the current signal */
#endif
    exit(-1);
  }
#undef SIG_SAVE
#undef SIG_TERM
#undef SIG_STAT
#undef SIG_ABRT

} /* sighandler */
#endif /* !NOSIGNALS */

#ifdef NEUTRONICS
/*Main neutronics function steers the McStas calls, initializes parameters etc */
/* Only called in case NEUTRONICS = TRUE */
void neutronics_main_(float *inx, float *iny, float *inz, float *invx, float *invy, float *invz, float *intime, float *insx, float *insy, float *insz, float *inw, float *outx, float *outy, float *outz, float *outvx, float *outvy, float *outvz, float *outtime, float *outsx, float *outsy, float *outsz, float *outwgt)
{

  extern double mcnx, mcny, mcnz, mcnvx, mcnvy, mcnvz;
  extern double mcnt, mcnsx, mcnsy, mcnsz, mcnp;

  /* External code governs iteration - McStas is iterated once per call to neutronics_main. I.e. below counter must be initiancated for each call to neutronics_main*/
  mcrun_num=0;

  time_t t;
  t = (time_t)mcstartdate;
  mcstartdate = t;  /* set start date before parsing options and creating sim file */
  init();

  /* *** parse options *** */
  SIG_MESSAGE("[" __FILE__ "] main START");
  mcformat=getenv(FLAVOR_UPPER "_FORMAT") ?
           getenv(FLAVOR_UPPER "_FORMAT") : FLAVOR_UPPER;

  /* Set neutron state based on input from neutronics code */
  mcsetstate(*inx,*iny,*inz,*invx,*invy,*invz,*intime,*insx,*insy,*insz,*inw);

  /* main neutron event loop - runs only one iteration */

  //mcstas_raytrace(&mcncount); /* prior to McStas 1.12 */

  mcallowbackprop = 1; //avoid absorbtion from negative dt
  int argc=1;
  char *argv[0];
  int dummy = mccode_main(argc, argv);

  *outx =  mcnx;
  *outy =  mcny;
  *outz =  mcnz;
  *outvx =  mcnvx;
  *outvy =  mcnvy;
  *outvz =  mcnvz;
  *outtime =  mcnt;
  *outsx =  mcnsx;
  *outsy =  mcnsy;
  *outsz =  mcnsz;
  *outwgt =  mcnp;

  return;
} /* neutronics_main */

#endif /*NEUTRONICS*/

#endif /* !MCCODE_H */
/* End of file "mccode-r.c". */
/* End of file "mccode-r.c". */

/* embedding file "mcstas-r.c" */

/*******************************************************************************
*
* McStas, neutron ray-tracing package
*         Copyright (C) 1997-2009, All rights reserved
*         Risoe National Laboratory, Roskilde, Denmark
*         Institut Laue Langevin, Grenoble, France
*
* Runtime: share/mcstas-r.c
*
* %Identification
* Written by: KN
* Date:    Aug 29, 1997
* Release: McStas X.Y
* Version: $Revision$
*
* Runtime system for McStas.
* Embedded within instrument in runtime mode.
*
* Usage: Automatically embbeded in the c code whenever required.
*
* $Id$
*
*******************************************************************************/

#ifndef MCSTAS_R_H
#include "mcstas-r.h"
#endif
#ifdef DANSE
#include "mcstas-globals.h"
#endif

/*******************************************************************************
* The I/O format definitions and functions
*******************************************************************************/

/*the magnet stack*/
#ifdef MC_POL_COMPAT
void (*mcMagnetPrecession) (double, double, double, double, double, double,
    double, double*, double*, double*, double, Coords, Rotation)=NULL;
Coords   mcMagnetPos;
Rotation mcMagnetRot;
double*  mcMagnetData                = NULL;
/* mcMagneticField(x, y, z, t, Bx, By, Bz) */
int (*mcMagneticField) (double, double, double, double,
    double*, double*, double*, void *) = NULL;
#endif

#ifndef MCSTAS_H

/*******************************************************************************
* mcsetstate: transfer parameters into global McStas variables
*******************************************************************************/
_class_particle mcsetstate(double x, double y, double z, double vx, double vy, double vz,
			   double t, double sx, double sy, double sz, double p, int mcgravitation, void *mcMagnet, int mcallowbackprop)
{
  _class_particle mcneutron;

  mcneutron.x  = x;
  mcneutron.y  = y;
  mcneutron.z  = z;
  mcneutron.vx = vx;
  mcneutron.vy = vy;
  mcneutron.vz = vz;
  mcneutron.t  = t;
  mcneutron.sx = sx;
  mcneutron.sy = sy;
  mcneutron.sz = sz;
  mcneutron.p  = p;
  mcneutron.mcgravitation = mcgravitation;
  mcneutron.mcMagnet = mcMagnet;
  mcneutron.allow_backprop = mcallowbackprop;
  mcneutron._uid       = 0;
  mcneutron._index     = 1;
  mcneutron._absorbed  = 0;
  mcneutron._restore   = 0;
  mcneutron._scattered = 0;
  mcneutron.flag_nocoordschange = 0;
  
  /* init tmp-vars - FIXME are they used? */
  mcneutron._mctmp_a = mcneutron._mctmp_b =  mcneutron._mctmp_c = 0;
  // what about mcneutron._logic ?
  mcneutron._logic.dummy=1;
  // init uservars via cogen'd-function
  particle_uservar_init(&mcneutron);

  return(mcneutron);
} /* mcsetstate */

/*******************************************************************************
* mcgetstate: get neutron parameters from particle structure
*******************************************************************************/
_class_particle mcgetstate(_class_particle mcneutron, double *x, double *y, double *z,
               double *vx, double *vy, double *vz, double *t,
               double *sx, double *sy, double *sz, double *p)
{
  *x  =  mcneutron.x;
  *y  =  mcneutron.y;
  *z  =  mcneutron.z;
  *vx =  mcneutron.vx;
  *vy =  mcneutron.vy;
  *vz =  mcneutron.vz;
  *t  =  mcneutron.t;
  *sx =  mcneutron.sx;
  *sy =  mcneutron.sy;
  *sz =  mcneutron.sz;
  *p  =  mcneutron.p;

  return(mcneutron);
} /* mcgetstate */


/*******************************************************************************
* mcgenstate: set default neutron parameters
*******************************************************************************/
// Moved to generated code
/* #pragma acc routine seq */
/* _class_particle mcgenstate(void) */
/* { */
/*   return(mcsetstate(0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, mcgravitation, mcMagnet, mcallowbackprop)); */
/* } */

/*******************************************************************************
* mccoordschanges: old style rotation routine rot -> (x y z) ,(vx vy vz),(sx,sy,sz)
*******************************************************************************/
void
mccoordschanges(Coords a, Rotation t, double *x, double *y, double *z,
               double *vx, double *vy, double *vz, double *sx, double *sy, double *sz)
{
  Coords b, c;

  b.x = *x;
  b.y = *y;
  b.z = *z;
  c = rot_apply(t, b);
  b = coords_add(c, a);
  *x = b.x;
  *y = b.y;
  *z = b.z;

  if ( (vz && vy  && vx) && (*vz != 0.0 || *vx != 0.0 || *vy != 0.0) )
    mccoordschange_polarisation(t, vx, vy, vz);

  if ( (sz && sy  && sx) && (*sz != 0.0 || *sx != 0.0 || *sy != 0.0) )
    mccoordschange_polarisation(t, sx, sy, sz);

}

/* intersection routines ==================================================== */

/*******************************************************************************
* inside_rectangle: Check if (x,y) is inside rectangle (xwidth, yheight)
* return 0 if outside and 1 if inside
*******************************************************************************/
int inside_rectangle(double x, double y, double xwidth, double yheight)
{
  if (x>-xwidth/2 && x<xwidth/2 && y>-yheight/2 && y<yheight/2)
    return 1;
  else
    return 0;
}

/*******************************************************************************
 * box_intersect: compute time intersection with a box
 * returns 0 when no intersection is found
 *      or 1 in case of intersection with resulting times dt_in and dt_out
 * This function written by Stine Nyborg, 1999.
 *******************************************************************************/
int box_intersect(double *dt_in, double *dt_out,
                  double x, double y, double z,
                  double vx, double vy, double vz,
                  double dx, double dy, double dz)
{
  double x_in, y_in, z_in, tt, t[6], a, b;
  int i, count, s;

      /* Calculate intersection time for each of the six box surface planes
       *  If the box surface plane is not hit, the result is zero.*/

  if(vx != 0)
   {
    tt = -(dx/2 + x)/vx;
    y_in = y + tt*vy;
    z_in = z + tt*vz;
    if( y_in > -dy/2 && y_in < dy/2 && z_in > -dz/2 && z_in < dz/2)
      t[0] = tt;
    else
      t[0] = 0;

    tt = (dx/2 - x)/vx;
    y_in = y + tt*vy;
    z_in = z + tt*vz;
    if( y_in > -dy/2 && y_in < dy/2 && z_in > -dz/2 && z_in < dz/2)
      t[1] = tt;
    else
      t[1] = 0;
   }
  else
    t[0] = t[1] = 0;

  if(vy != 0)
   {
    tt = -(dy/2 + y)/vy;
    x_in = x + tt*vx;
    z_in = z + tt*vz;
    if( x_in > -dx/2 && x_in < dx/2 && z_in > -dz/2 && z_in < dz/2)
      t[2] = tt;
    else
      t[2] = 0;

    tt = (dy/2 - y)/vy;
    x_in = x + tt*vx;
    z_in = z + tt*vz;
    if( x_in > -dx/2 && x_in < dx/2 && z_in > -dz/2 && z_in < dz/2)
      t[3] = tt;
    else
      t[3] = 0;
   }
  else
    t[2] = t[3] = 0;

  if(vz != 0)
   {
    tt = -(dz/2 + z)/vz;
    x_in = x + tt*vx;
    y_in = y + tt*vy;
    if( x_in > -dx/2 && x_in < dx/2 && y_in > -dy/2 && y_in < dy/2)
      t[4] = tt;
    else
      t[4] = 0;

    tt = (dz/2 - z)/vz;
    x_in = x + tt*vx;
    y_in = y + tt*vy;
    if( x_in > -dx/2 && x_in < dx/2 && y_in > -dy/2 && y_in < dy/2)
      t[5] = tt;
    else
      t[5] = 0;
   }
  else
    t[4] = t[5] = 0;

  /* The intersection is evaluated and *dt_in and *dt_out are assigned */

  a = b = s = 0;
  count = 0;

  for( i = 0; i < 6; i = i + 1 )
    if( t[i] == 0 )
      s = s+1;
    else if( count == 0 )
    {
      a = t[i];
      count = 1;
    }
    else
    {
      b = t[i];
      count = 2;
    }

  if ( a == 0 && b == 0 )
    return 0;
  else if( a < b )
  {
    *dt_in = a;
    *dt_out = b;
    return 1;
  }
  else
  {
    *dt_in = b;
    *dt_out = a;
    return 1;
  }

} /* box_intersect */

/*******************************************************************************
 * cylinder_intersect: compute intersection with a cylinder
 * returns 0 when no intersection is found
 *      or 2/4/8/16 bits depending on intersection,
 *     and resulting times t0 and t1
 * Written by: EM,NB,ABA 4.2.98
  *******************************************************************************/
int cylinder_intersect(double *t0, double *t1, double x, double y, double z,
                   double vx, double vy, double vz, double r, double h)
{
  double D, t_in, t_out, y_in, y_out;
  int ret=1;

  D = (2*vx*x + 2*vz*z)*(2*vx*x + 2*vz*z)
    - 4*(vx*vx + vz*vz)*(x*x + z*z - r*r);

  if (D>=0)
  {
    if (vz*vz + vx*vx) {
      t_in  = (-(2*vz*z + 2*vx*x) - sqrt(D))/(2*(vz*vz + vx*vx));
      t_out = (-(2*vz*z + 2*vx*x) + sqrt(D))/(2*(vz*vz + vx*vx));
    } else if (vy) { /* trajectory parallel to cylinder axis */
      t_in = (-h/2-y)/vy;
      t_out = (h/2-y)/vy;
      if (t_in>t_out){
        double tmp=t_in;
        t_in=t_out;t_out=tmp;
      }
    } else return 0;
    y_in = vy*t_in + y;
    y_out =vy*t_out + y;

    if ( (y_in > h/2 && y_out > h/2) || (y_in < -h/2 && y_out < -h/2) )
      return 0;
    else
    {
      if (y_in > h/2)
        { t_in = ((h/2)-y)/vy; ret += 2; }
      else if (y_in < -h/2)
        { t_in = ((-h/2)-y)/vy; ret += 4; }
      if (y_out > h/2)
        { t_out = ((h/2)-y)/vy; ret += 8; }
      else if (y_out < -h/2)
        { t_out = ((-h/2)-y)/vy; ret += 16; }
    }
    *t0 = t_in;
    *t1 = t_out;
    return ret;
  }
  else
  {
    *t0 = *t1 = 0;
    return 0;
  }
} /* cylinder_intersect */


/*******************************************************************************
 * sphere_intersect: Calculate intersection between a line and a sphere.
 * returns 0 when no intersection is found
 *      or 1 in case of intersection with resulting times t0 and t1
 *******************************************************************************/
int sphere_intersect(double *t0, double *t1, double x, double y, double z,
                 double vx, double vy, double vz, double r)
{
  double A, B, C, D, v;

  v = sqrt(vx*vx + vy*vy + vz*vz);
  A = v*v;
  B = 2*(x*vx + y*vy + z*vz);
  C = x*x + y*y + z*z - r*r;
  D = B*B - 4*A*C;
  if(D < 0)
    return 0;
  D = sqrt(D);
  *t0 = (-B - D) / (2*A);
  *t1 = (-B + D) / (2*A);
  return 1;
} /* sphere_intersect */

/*******************************************************************************
 * plane_intersect: Calculate intersection between a plane and a line.
 * returns 0 when no intersection is found (i.e. line is parallel to the plane)
 * returns 1 or -1 when intersection time is positive and negative respectively
 *******************************************************************************/
int plane_intersect(double *t, double x, double y, double z,
                 double vx, double vy, double vz, double nx, double ny, double nz, double wx, double wy, double wz)
{
  double s;
  if (fabs(s=scalar_prod(nx,ny,nz,vx,vy,vz))<FLT_EPSILON) return 0;
  *t = - scalar_prod(nx,ny,nz,x-wx,y-wy,z-wz)/s;
  if (*t<0) return -1;
  else return 1;
} /* plane_intersect */

#endif /* !MCSTAS_H */
/* End of file "mcstas-r.c". */


/* *****************************************************************************
* Start of instrument 'ILL_H5_new' generated code
***************************************************************************** */

#ifdef MC_TRACE_ENABLED
int traceenabled = 1;
#else
int traceenabled = 0;
#endif
#define MCSTAS "/u/data/pkwi/WORK/micromamba/envs/mcstas-3.x/share/mcstas/resources/"
int   defaultmain         = 1;
char  instrument_name[]   = "ILL_H5_new";
char  instrument_source[] = "ILL_H5_new.instr";
char *instrument_exe      = NULL; /* will be set to argv[0] in main */
char  instrument_code[]   = "Instrument ILL_H5_new source code ILL_H5_new.instr is not embedded in this executable.\n  Use --source option when running mcstas.\n";

int main(int argc, char *argv[]){return mccode_main(argc, argv);}

/* *****************************************************************************
* instrument 'ILL_H5_new' and components DECLARE
***************************************************************************** */

/* Instrument parameters: structure and a table for the initialisation
   (Used in e.g. inputparse and I/O function (e.g. detector_out) */

struct _struct_instrument_parameters {
  MCNUM lambda;
  MCNUM dlambda;
  MCNUM ThALES_lambda;
  MCNUM WASP_lambda;
  MCNUM D16_lambda;
  MCNUM SADAM_lambda;
  MCNUM IN15_lambda;
  MCNUM D22_lambda;
  MCNUM D22_collimation;
  char* ThALES_sample;
  char* WASP_sample;
  char* D16_sample;
  char* SADAM_sample;
  char* D22_sample;
  MCNUM ThALES_RMV;
  MCNUM D16_RMV;
  MCNUM SADAM_RMV;
  MCNUM ThALES_RMH;
};
typedef struct _struct_instrument_parameters _class_instrument_parameters;

struct _instrument_struct {
  char   _name[256]; /* the name of this instrument e.g. 'ILL_H5_new' */
/* Counters per component instance */
  double counter_AbsorbProp[327]; /* absorbed events in PROP routines */
  double counter_N[327], counter_P[327], counter_P2[327]; /* event counters after each component instance */
  _class_particle _trajectory[327]; /* current trajectory for STORE/RESTORE */
/* Components position table (absolute and relative coords) */
  Coords _position_relative[327]; /* positions of all components */
  Coords _position_absolute[327];
  _class_instrument_parameters _parameters; /* instrument parameters */
} _instrument_var;
struct _instrument_struct *instrument = & _instrument_var;
#pragma acc declare create ( _instrument_var )
#pragma acc declare create ( instrument )

int numipar = 18;
struct mcinputtable_struct mcinputtable[] = {
  "lambda", &(_instrument_var._parameters.lambda), instr_type_double, "5", "",
  "dlambda", &(_instrument_var._parameters.dlambda), instr_type_double, "4.5", "",
  "ThALES_lambda", &(_instrument_var._parameters.ThALES_lambda), instr_type_double, "4.2", "",
  "WASP_lambda", &(_instrument_var._parameters.WASP_lambda), instr_type_double, "6.3", "",
  "D16_lambda", &(_instrument_var._parameters.D16_lambda), instr_type_double, "5.6", "",
  "SADAM_lambda", &(_instrument_var._parameters.SADAM_lambda), instr_type_double, "4.4", "",
  "IN15_lambda", &(_instrument_var._parameters.IN15_lambda), instr_type_double, "6.5", "",
  "D22_lambda", &(_instrument_var._parameters.D22_lambda), instr_type_double, "4.5", "",
  "D22_collimation", &(_instrument_var._parameters.D22_collimation), instr_type_double, "2", "",
  "ThALES_sample", &(_instrument_var._parameters.ThALES_sample), instr_type_string, "Rb_liq_coh.sqw", "",
  "WASP_sample", &(_instrument_var._parameters.WASP_sample), instr_type_string, "Rb_liq_coh.sqw", "",
  "D16_sample", &(_instrument_var._parameters.D16_sample), instr_type_string, "H2O_liq.qSq", "",
  "SADAM_sample", &(_instrument_var._parameters.SADAM_sample), instr_type_string, "SiO2_quartza.laz", "",
  "D22_sample", &(_instrument_var._parameters.D22_sample), instr_type_string, "H2O_liq.qSq", "",
  "ThALES_RMV", &(_instrument_var._parameters.ThALES_RMV), instr_type_double, "-1", "",
  "D16_RMV", &(_instrument_var._parameters.D16_RMV), instr_type_double, "-1", "",
  "SADAM_RMV", &(_instrument_var._parameters.SADAM_RMV), instr_type_double, "-1", "",
  "ThALES_RMH", &(_instrument_var._parameters.ThALES_RMH), instr_type_double, "-1", "",
  NULL, NULL, instr_type_double, ""
};

struct metadata_table_struct metadata_table[] = {
  "", "", "", ""
};
int num_metadata = 0;

/* ************************************************************************** */
/*             SHARE user declarations for all components                     */
/* ************************************************************************** */

/* Shared user declarations for all components types 'Source_gen'. */
/*******************************************************************************
*
* McStas, neutron ray-tracing package
*         Copyright 1997-2002, All rights reserved
*         Risoe National Laboratory, Roskilde, Denmark
*         Institut Laue Langevin, Grenoble, France
*
* Library: share/read_table-lib.h
*
* %Identification
* Written by: EF
* Date: Aug 28, 2002
* Origin: ILL
* Release: McStas 1.6
* Version: $Revision$
*
* This file is to be imported by components that may read data from table files
* It handles some shared functions.
*
* This library may be used directly as an external library. It has no dependency
*
* Usage: within SHARE
* %include "read_table-lib"
*
*******************************************************************************/

#ifndef READ_TABLE_LIB_H
#define READ_TABLE_LIB_H "$Revision$"

#define READ_TABLE_STEPTOL  0.04 /* tolerancy for constant step approx */

#ifndef MC_PATHSEP_C
#ifdef WIN32
#define MC_PATHSEP_C '\\'
#define MC_PATHSEP_S "\\"
#else  /* !WIN32 */
#ifdef MAC
#define MC_PATHSEP_C ':'
#define MC_PATHSEP_S ":"
#else  /* !MAC */
#define MC_PATHSEP_C '/'
#define MC_PATHSEP_S "/"
#endif /* !MAC */
#endif /* !WIN32 */
#endif /* !MC_PATHSEP_C */

#ifndef MCSTAS
#ifdef WIN32
#define MCSTAS "C:\\mcstas\\lib"
#else  /* !WIN32 */
#ifdef MAC
#define MCSTAS ":mcstas:lib" /* ToDo: What to put here? */
#else  /* !MAC */
#define MCSTAS "/usr/local/lib/mcstas"
#endif /* !MAC */
#endif /* !WIN32 */
#endif /* !MCSTAS */

#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>

#ifndef _MSC_EXTENSIONS
#include <strings.h>
#else
#  include <string.h>
#  define strcasecmp _stricmp
#  define strncasecmp _strnicmp
#endif

  typedef struct struct_table
  {
    char    filename[1024];
    long    filesize;
    char   *header;  /* text header, e.g. comments */
    double *data;    /* vector { x[0], y[0], ... x[n-1], y[n-1]... } */
    double  min_x;   /* min value of first column */
    double  max_x;   /* max value of first column */
    double  step_x;  /* minimal step value of first column */
    long    rows;    /* number of rows in matrix block */
    long    columns; /* number of columns in matrix block */

    long    begin;   /* start fseek index of block */
    long    end;     /* stop  fseek index of block */
    long    block_number;  /* block index. 0 is catenation of all */
    long    array_length;  /* number of elements in the t_Table array */
    char    monotonic;     /* true when 1st column/vector data is monotonic */
    char    constantstep;  /* true when 1st column/vector data has constant step */
    char    method[32];    /* interpolation method: nearest, linear */
    char    quiet;   /*output level for messages to the console 0: print all messages, 1:only print some/including errors, 2: never print anything.*/
  } t_Table;

/*maximum number of rows to rebin a table = 1M*/
enum { mcread_table_rebin_maxsize = 1000000 };

typedef struct t_Read_table_file_item {
    int ref_count;
    t_Table *table_ref;
} t_Read_table_file_item;

typedef enum enum_Read_table_file_actions {STORE,FIND,GC}  t_Read_table_file_actions;

/* read_table-lib function prototypes */
/* ========================================================================= */

/* 'public' functions */
long     Table_Read              (t_Table *Table, char *File, long block_number);
long     Table_Read_Offset       (t_Table *Table, char *File, long block_number,
                                  long *offset, long max_lines);
long     Table_Read_Offset_Binary(t_Table *Table, char *File, char *Type,
                                  long *Offset, long Rows, long Columns);
long     Table_Rebin(t_Table *Table); /* rebin table with regular 1st column and interpolate all columns 2:end */
long     Table_Info (t_Table Table);
#pragma acc routine
double   Table_Index(t_Table Table,   long i, long j); /* get indexed value */
#pragma acc routine
double   Table_Value(t_Table Table, double X, long j); /* search X in 1st column and return interpolated value in j-column */
t_Table *Table_Read_Array(char *File, long *blocks);
void     Table_Free_Array(t_Table *Table);
long     Table_Info_Array(t_Table *Table);
int      Table_SetElement(t_Table *Table, long i, long j, double value);
long     Table_Init(t_Table *Table, long rows, long columns); /* create a Table */
#pragma acc routine
double   Table_Value2d(t_Table Table, double X, double Y);    /* same as Table_Index with non-integer indices and 2d interpolation */
MCDETECTOR Table_Write(t_Table Table, char*file, char*xl, char*yl, 
           double x1, double x2, double y1, double y2); /* write Table to disk */
void * Table_File_List_Handler(t_Read_table_file_actions action, void *item, void *item_modifier);
t_Table *Table_File_List_find(char *name, int block, int offset);
int Table_File_List_gc(t_Table *tab);
void *Table_File_List_store(t_Table *tab);

#define Table_ParseHeader(header, ...) \
  Table_ParseHeader_backend(header,__VA_ARGS__,NULL);

char **Table_ParseHeader_backend(char *header, ...);
FILE *Open_File(char *name, const char *Mode, char *path);


/* private functions */
void Table_Free(t_Table *Table);
long Table_Read_Handle(t_Table *Table, FILE *fid, long block_number, long max_lines, char *name);
static void Table_Stat(t_Table *Table);
#pragma acc routine
double Table_Interp1d(double x, double x1, double y1, double x2, double y2);
#pragma acc routine
double Table_Interp1d_nearest(double x, double x1, double y1, double x2, double y2);
#pragma acc routine
double Table_Interp2d(double x, double y, double x1, double y1, double x2, double y2,
double z11, double z12, double z21, double z22);


#endif

/* end of read_table-lib.h */
/*******************************************************************************
*
* McStas, neutron ray-tracing package
*         Copyright (C) 1997-2009, All rights reserved
*         Risoe National Laboratory, Roskilde, Denmark
*         Institut Laue Langevin, Grenoble, France
*
* Library: share/read_table-lib.c
*
* %Identification
* Written by: EF
* Date: Aug 28, 2002
* Origin: ILL
* Release: McStas CVS_090504
* Version: $Revision$
*
* This file is to be imported by components that may read data from table files
* It handles some shared functions. Embedded within instrument in runtime mode.
*
* Usage: within SHARE
* %include "read_table-lib"
*
*******************************************************************************/

#ifndef READ_TABLE_LIB_H
#include "read_table-lib.h"
#endif

#ifndef READ_TABLE_LIB_C
#define READ_TABLE_LIB_C "$Revision$"


/*******************************************************************************
 * void *Table_File_List_Handler(action, item, item_modifier)
 *   ACTION: handle file entries in the read_table-lib file list. If a file is read - it is supposed to be
 *   stored in a list such that we can avoid reading the same file many times.
 *   input  action: FIND, STORE, GC. check if file exists in the list, store an item in the list, or check if it can be garbage collected.
 *   input item: depends on the action.
 *    FIND)  item is a filename, and item_modifier is the block number
 *    STORE) item is the Table to store - item_modifier is ignored
 *    GC)    item is the Table to check. If it has a ref_count >1 then this is simply decremented.
 *   return  depends on the action
 *    FIND)  return a reference to a table+ref_count item if found - NULL otherwise. I.e. NULL means the file has not been read before and must be read again.
 *    STORE) return NULL always
 *    GC)    return NULL if no garbage collection is needed, return an adress to the t_Table which should be garbage collected. 0x1 is returned if
 *           the item is not found in the list
*******************************************************************************/
void * Table_File_List_Handler(t_Read_table_file_actions action, void *item, void *item_modifier){

    /* logic here is Read_Table should include a call to FIND. If found the return value should just be used as
     * if the table had been read from disk. If not found then read the table and STORE.
     * Table_Free should include a call to GC. If this returns non-NULL then we should proceed with freeing the memory
     * associated with the table item - otherwise only decrement the reference counter since there are more references
     * that may need it.*/

    static t_Read_table_file_item read_table_file_list[1024];  
    static int read_table_file_count=0;

    t_Read_table_file_item *tr;
    switch(action){
        case FIND:
            /*interpret data item as a filename, if it is found return a pointer to the table and increment refcount.
             * if not found return the item itself*/
            tr=read_table_file_list;
            while ( tr->table_ref!=NULL ){
                int i=*((int*) item_modifier);
                int j=*( ((int*) item_modifier)+1);
                if ( !strcmp(tr->table_ref->filename,(char *) item) &&
                        tr->table_ref->block_number==i && tr->table_ref->begin==j ){
                    tr->ref_count++;
                    return (void *) tr;
                }
                tr++;
            }
            return NULL;
        case STORE:
            /*find an available slot and store references to table there*/
            tr=&(read_table_file_list[read_table_file_count++]);
            tr->table_ref = ((t_Table *) item);
            tr->ref_count++;
            return NULL;
        case GC:
            /* Should this item be garbage collected (freed) - if so scratch the entry and return the address of the item - 
             * else decrement ref_count and return NULL.
             * A non-NULL return expects the item to actually be freed afterwards.*/
            tr=read_table_file_list;
            while ( tr->table_ref!=NULL ){
                if ( tr->table_ref->data ==((t_Table *)item)->data && 
                        tr->table_ref->block_number == ((t_Table *)item)->block_number){
                    /*matching item found*/
                    if (tr->ref_count>1){
                        /*the item is found and no garbage collection needed*/
                        tr->ref_count--;
                        return NULL;
                    }else{
                        /* The item is found and the reference counter is 1.
                         * This means we should garbage collect. Move remaining list items up one slot,
                         * and return the table for garbage collection by caller*/
                        while (tr->table_ref!=NULL){
                            *tr=*(tr+1);
                            tr++;
                        }
                        read_table_file_count--;
                        return (t_Table *) item;
                    }
                }
                tr++;
            }
            /* item not found, and so should be garbage collected. This could be the case if freeing a
             * Table that has been constructed from code - not read from file. Return 0x1 to flag it for
             * collection.*/
            return (void *) 0x1 ;
    }
    /* If we arrive here, nothing worked, return NULL */
    return NULL;
}

/* Access functions to the handler*/

/********************************************
 * t_Table *Table_File_List_find(char *name, int block, int offset)
 * input name: filename to search for in the file list
 * input block: data block in the file as each file may contain more than 1 data block.
 * return a ref. to a table if it is found (you may use this pointer and skip reading the file), NULL otherwise (i.e. go ahead and read the file)
*********************************************/
t_Table *Table_File_List_find(char *name, int block, int offset){
    int vars[2]={block,offset};
    t_Read_table_file_item *item = Table_File_List_Handler(FIND,name, vars);
    if (item == NULL){
        return NULL;
    }else{
        return item->table_ref;
    }
}
/********************************************
 * int Table_File_List_gc(t_Table *tab)
 * input tab: the table to check for references.
 * return 0: no garbage collection needed
 *        1: Table's data and header (at least) should be freed.
*********************************************/
int Table_File_List_gc(t_Table *tab){
    void *rval=Table_File_List_Handler(GC,tab,0);
    if (rval==NULL) return 0;
    else return 1;
}


/*****************************************************************************
 * void *Table_File_List_store(t_Table *tab)
 * input tab: pointer to table to store.
 * return None. 
*******************************************************************************/
void *Table_File_List_store(t_Table *tab){
    return Table_File_List_Handler(STORE,tab,0);
}


/*******************************************************************************
* FILE *Open_File(char *name, char *Mode, char *path)
*   ACTION: search for a file and open it. Optionally return the opened path.
*   input   name:  file name from which table should be extracted
*           mode: "r", "w", "a" or any valid fopen mode
*           path:  NULL or a pointer to at least 1024 allocated chars
*   return  initialized file handle or NULL in case of error
*******************************************************************************/

  FILE *Open_File(char *File, const char *Mode, char *Path)
  {
    char path[1024];
    FILE *hfile = NULL;
    
    if (!File || File[0]=='\0')                     return(NULL);
    if (!strcmp(File,"NULL") || !strcmp(File,"0"))  return(NULL);
    
    /* search in current or full path */
    strncpy(path, File, 1024);
    hfile = fopen(path, Mode);
    if(!hfile)
    {
      char dir[1024];

      if (!hfile && instrument_source[0] != '\0' && strlen(instrument_source)) /* search in instrument source location */
      {
        char *path_pos   = NULL;
        /* extract path: searches for last file separator */
        path_pos    = strrchr(instrument_source, MC_PATHSEP_C);  /* last PATHSEP */
        if (path_pos) {
          long path_length = path_pos +1 - instrument_source;  /* from start to path+sep */
          if (path_length) {
            strncpy(dir, instrument_source, path_length);
            dir[path_length] = '\0';
            snprintf(path, 1024, "%s%c%s", dir, MC_PATHSEP_C, File);
            hfile = fopen(path, Mode);
          }
        }
      }
      if (!hfile && instrument_exe[0] != '\0' && strlen(instrument_exe)) /* search in PWD instrument executable location */
      {
        char *path_pos   = NULL;
        /* extract path: searches for last file separator */
        path_pos    = strrchr(instrument_exe, MC_PATHSEP_C);  /* last PATHSEP */
        if (path_pos) {
          long path_length = path_pos +1 - instrument_exe;  /* from start to path+sep */
          if (path_length) {
            strncpy(dir, instrument_exe, path_length);
            dir[path_length] = '\0';
            snprintf(path, 1024, "%s%c%s", dir, MC_PATHSEP_C, File);
            hfile = fopen(path, Mode);
          }
        }
      }
      if (!hfile) /* search in HOME or . */
      {
        strcpy(dir, getenv("HOME") ? getenv("HOME") : ".");
        snprintf(path, 1024, "%s%c%s", dir, MC_PATHSEP_C, File);
        hfile = fopen(path, Mode);
      }
      if (!hfile) /* search in MCSTAS/data */
      {
        strcpy(dir, getenv(FLAVOR_UPPER) ? getenv(FLAVOR_UPPER) : MCSTAS);
        snprintf(path, 1024, "%s%c%s%c%s", dir, MC_PATHSEP_C, "data", MC_PATHSEP_C, File);
        hfile = fopen(path, Mode);
      }
      if (!hfile) /* search in MVCSTAS/contrib */
      {
        strcpy(dir, getenv(FLAVOR_UPPER) ? getenv(FLAVOR_UPPER) : MCSTAS);
        snprintf(path, 1024, "%s%c%s%c%s", dir, MC_PATHSEP_C, "contrib", MC_PATHSEP_C, File);
        hfile = fopen(path, Mode);
      }
      if(!hfile)
      {
        // fprintf(stderr, "Warning: Could not open input file '%s' (Open_File)\n", File);
        return (NULL);
      }
    }
    if (Path) strncpy(Path, path, 1024);
    return(hfile);
  } /* end Open_File */

/*******************************************************************************
* long Read_Table(t_Table *Table, char *name, int block_number)
*   ACTION: read a single Table from a text file
*   input   Table: pointer to a t_Table structure
*           name:  file name from which table should be extracted
*           block_number: if the file does contain more than one
*                 data block, then indicates which one to get (from index 1)
*                 a 0 value means append/catenate all
*   return  initialized single Table t_Table structure containing data, header, ...
*           number of read elements (-1: error, 0:header only)
* The routine stores any line starting with '#', '%' and ';' into the header
* File is opened, read and closed
* Other lines are interpreted as numerical data, and stored.
* Data block should be a rectangular matrix or vector.
* Data block may be rebinned with Table_Rebin (also sort in ascending order)
*******************************************************************************/
  long Table_Read(t_Table *Table, char *File, long block_number)
  { /* reads all or a single data block from 'file' and returns a Table structure  */
    return(Table_Read_Offset(Table, File, block_number, NULL, 0));
  } /* end Table_Read */

/*******************************************************************************
* long Table_Read_Offset(t_Table *Table, char *name, int block_number, long *offset
*                        long max_rows)
*   ACTION: read a single Table from a text file, starting at offset
*     Same as Table_Read(..) except:
*   input   offset:    pointer to an offset (*offset should be 0 at start)
*           max_rows: max number of data rows to read from file (0 means all)
*   return  initialized single Table t_Table structure containing data, header, ...
*           number of read elements (-1: error, 0:header only)
*           updated *offset position (where end of reading occured)
*******************************************************************************/
  long Table_Read_Offset(t_Table *Table, char *File,
                         long block_number, long *offset,
                         long max_rows)
  { /* reads all/a data block in 'file' and returns a Table structure  */
    FILE *hfile;
    long  nelements=0;
    long  begin=0;
    long  filesize=0;
    char  name[1024];
    char  path[1024];
    struct stat stfile;

    /*Need to be able to store the pointer*/
    if (!Table) return(-1);

    /*TK: Valgrind flags it as usage of uninitialised variable: */
    Table->quiet = 0;

    //if (offset && *offset) snprintf(name, 1024, "%s@%li", File, *offset);
    //else                   
    strncpy(name, File, 1024);
    if(offset && *offset){
        begin=*offset;
    }
    /* Check if the table has already been read from file.
     * If so just reuse the table, if not (this is flagged by returning NULL
     * set up a new table and read the data into it */
    t_Table *tab_p= Table_File_List_find(name,block_number,begin);
    if ( tab_p!=NULL ){
        /*table was found in the Table_File_List*/
        *Table=*tab_p;
        MPI_MASTER(
            if(Table->quiet<1)
              printf("Reusing input file '%s' (Table_Read_Offset)\n", name);
            );
        return Table->rows*Table->columns;
    }

    /* open the file */
    hfile = Open_File(File, "r", path);
    if (!hfile) return(-1);
    else {
      MPI_MASTER(
          if(Table->quiet<1)
            printf("Opening input file '%s' (Table_Read_Offset)\n", path);
          );
    }
    
    /* read file state */
    stat(path,&stfile); filesize = stfile.st_size;
    if (offset && *offset) fseek(hfile, *offset, SEEK_SET);
    begin     = ftell(hfile);
    
    Table_Init(Table, 0, 0);

    /* read file content and set the Table */
    nelements = Table_Read_Handle(Table, hfile, block_number, max_rows, name);
    Table->begin = begin;
    Table->end   = ftell(hfile);
    Table->filesize = (filesize>0 ? filesize : 0);
    Table_Stat(Table);
    
    Table_File_List_store(Table);

    if (offset) *offset=Table->end;
    fclose(hfile);
    return(nelements);

  } /* end Table_Read_Offset */

/*******************************************************************************
* long Table_Read_Offset_Binary(t_Table *Table, char *File, char *type,
*                               long *offset, long rows, long columns)
*   ACTION: read a single Table from a binary file, starting at offset
*     Same as Table_Read_Offset(..) except that it handles binary files.
*   input   type: may be "float"/NULL or "double"
*           offset: pointer to an offset (*offset should be 0 at start)
*           rows   : number of rows (0 means read all)
*           columns: number of columns
*   return  initialized single Table t_Table structure containing data, header, ...
*           number of read elements (-1: error, 0:header only)
*           updated *offset position (where end of reading occured)
*******************************************************************************/
  long Table_Read_Offset_Binary(t_Table *Table, char *File, char *type,
                                long *offset, long rows, long columns)
  { /* reads all/a data block in binary 'file' and returns a Table structure  */
    long    nelements, sizeofelement;
    long    filesize;
    FILE   *hfile;
    char    path[1024];
    struct stat stfile;
    double *data    = NULL;
    double *datatmp = NULL;
    long    i;
    long    begin;

    if (!Table) return(-1);

    Table_Init(Table, 0, 0);
    
    /* open the file */
    hfile = Open_File(File, "r", path);
    if (!hfile) return(-1);
    else {
      MPI_MASTER(
          if(Table->quiet<1)
            printf("Opening input file '%s' (Table_Read, Binary)\n", path);
      );
    }
    
    /* read file state */
    stat(File,&stfile);
    filesize = stfile.st_size;
    Table->filesize=filesize;
    
    /* read file content */
    if (type && !strcmp(type,"double")) sizeofelement = sizeof(double);
    else  sizeofelement = sizeof(float);
    if (offset && *offset) fseek(hfile, *offset, SEEK_SET);
    begin     = ftell(hfile);
    if (rows && filesize > sizeofelement*columns*rows)
      nelements = columns*rows;
    else nelements = (long)(filesize/sizeofelement);
    if (!nelements || filesize <= *offset) return(0);
    data    = (double*)malloc(nelements*sizeofelement);
    if (!data) {
      if(!(Table->quiet>1))
        fprintf(stderr,"Error: allocating %ld elements for %s file '%s'. Too big (Table_Read_Offset_Binary).\n", nelements, type, File);
      exit(-1);
    }
    nelements = fread(data, sizeofelement, nelements, hfile);

    if (!data || !nelements)
    {
      if(!(Table->quiet>1))
        fprintf(stderr,"Error: reading %ld elements from %s file '%s' (Table_Read_Offset_Binary)\n", nelements, type, File);
      exit(-1);
    }
    Table->begin   = begin;
    Table->end     = ftell(hfile);
    if (offset) *offset=Table->end;
    fclose(hfile);

    datatmp = (double*)realloc(data, (double)nelements*sizeofelement);
    if (!datatmp) {
      free(data);
      fprintf(stderr,"Error: reallocating %ld elements for %s file '%s'. Too big (Table_Read_Offset_Binary).\n", nelements, type, File);
      exit(-1);
    } else {
      data = datatmp;
    }
    /* copy file data into Table */
    if (type && !strcmp(type,"double")) Table->data = data;
    else {
      float  *s;
      double *dataf;
      s     = (float*)data;
      dataf = (double*)malloc(sizeof(double)*nelements);
      if (!dataf) {
	fprintf(stderr, "Could not allocate data block of size %ld\n", nelements);
	exit(-1);
      }
      for (i=0; i<nelements; i++)
        dataf[i]=s[i];
      free(data);
      Table->data = dataf;
    }
    strncpy(Table->filename, File, 1024);
    Table->rows    = nelements/columns;
    Table->columns = columns;
    Table->array_length = 1;
    Table->block_number = 1;

    Table_Stat(Table);

    return(nelements);
  } /* end Table_Read_Offset_Binary */

/*******************************************************************************
* long Table_Read_Handle(t_Table *Table, FILE *fid, int block_number, long max_rows, char *name)
*   ACTION: read a single Table from a text file handle (private)
*   input   Table:pointer to a t_Table structure
*           fid:  pointer to FILE handle
*           block_number: if the file does contain more than one
*                 data block, then indicates which one to get (from index 1)
*                 a 0 value means append/catenate all
*           max_rows: if non 0, only reads that number of lines
*   return  initialized single Table t_Table structure containing data, header, ...
*           modified Table t_Table structure containing data, header, ...
*           number of read elements (-1: error, 0:header only)
* The routine stores any line starting with '#', '%' and ';' into the header
* Other lines are interpreted as numerical data, and stored.
* Data block should be a rectangular matrix or vector.
* Data block may be rebined with Table_Rebin (also sort in ascending order)
*******************************************************************************/
  long Table_Read_Handle(t_Table *Table, FILE *hfile,
                         long block_number, long max_rows, char *name)
  { /* reads all/a data block from 'file' handle and returns a Table structure  */
    double *Data              = NULL;
    double *Datatmp           = NULL;
    char *Header              = NULL;
    char *Headertmp           = NULL;
    long  malloc_size         = CHAR_BUF_LENGTH;
    long  malloc_size_h       = 4096;
    long  Rows = 0,   Columns = 0;
    long  count_in_array      = 0;
    long  count_in_header     = 0;
    long  count_invalid       = 0;
    long  block_Current_index = 0;
    char  flag_End_row_loop   = 0;

    if (!Table) return(-1);
    Table_Init(Table, 0, 0);
    if (name && name[0]!='\0') strncpy(Table->filename, name, 1024);

    if(!hfile) {
       fprintf(stderr, "Error: File handle is NULL (Table_Read_Handle).\n");
       return (-1);
    }
    Header = (char*)  calloc(malloc_size_h, sizeof(char));
    Data   = (double*)calloc(malloc_size,   sizeof(double));
    if ((Header == NULL) || (Data == NULL)) {
       fprintf(stderr, "Error: Could not allocate Table and Header (Table_Read_Handle).\n");
       return (-1);
    }

    int flag_In_array = 0;
    do { /* while (!flag_End_row_loop) */
      char  *line=malloc(1024*CHAR_BUF_LENGTH*sizeof(char));
      long  back_pos=0;   /* ftell start of line */

      if (!line) {
	fprintf(stderr,"Could not allocate line buffer\n");
	exit(-1);
      }
      back_pos = ftell(hfile);
      if (fgets(line, 1024*CHAR_BUF_LENGTH, hfile) != NULL) { /* analyse line */
        /* first skip blank and tabulation characters */
        int i = strspn(line, " \t");

        /* handle comments: stored in header */
        if (NULL != strchr("#%;/", line[i]))
        { /* line is a comment */
          count_in_header += strlen(line);
          if (count_in_header >= malloc_size_h) {
            /* if succeed and in array : add (and realloc if necessary) */
            malloc_size_h = count_in_header+4096;
            char *Headertmp = (char*)realloc(Header, malloc_size_h*sizeof(char));
	    if(!Headertmp) {
	      free(Header);
	             fprintf(stderr, "Error: Could not reallocate Header (Table_Read_Handle).\n");
		     free(Header);
		     return (-1);
	    } else {
	      Header = Headertmp;
	    }
          }
          strncat(Header, line, 4096);
          flag_In_array=0;
          /* exit line and file if passed desired block */
          if (block_number > 0 && block_number == block_Current_index) {
            flag_End_row_loop = 1;
          }

          /* Continue with next line */
          continue;
        }
        if (strstr(line, "***"))
        {
          count_invalid++;
          /* Continue with next line */
          continue;
        }

        /* get the number of columns splitting line with strtok */
        char  *lexeme;
        char  flag_End_Line = 0;
        long  block_Num_Columns = 0;
        const char seps[] = " ,;\t\n\r";

        lexeme = strtok(line, seps);
        while (!flag_End_Line) {
          if ((lexeme != NULL) && (lexeme[0] != '\0')) {
            /* reading line: the token is not empty */
            double X;
            int    count=1;
            /* test if we have 'NaN','Inf' */
            if (!strncasecmp(lexeme,"NaN",3))
              X = 0;
            else if (!strncasecmp(lexeme,"Inf",3) || !strncasecmp(lexeme,"+Inf",4))
              X = FLT_MAX;
            else if (!strncasecmp(lexeme,"-Inf",4))
              X = -FLT_MAX;
            else
              count = sscanf(lexeme,"%lg",&X);
            if (count == 1) {
              /* reading line: the token is a number in the line */
              if (!flag_In_array) {
                /* reading num: not already in a block: starts a new data block */
                block_Current_index++;
                flag_In_array    = 1;
                block_Num_Columns= 0;
                if (block_number > 0) {
                  /* initialise a new data block */
                  Rows = 0;
                  count_in_array = 0;
                } /* else append */
              }
              /* reading num: all blocks or selected block */
              if (flag_In_array && (block_number == 0 ||
                  block_number == block_Current_index)) {
                /* starting block: already the desired number of rows ? */
                if (block_Num_Columns == 0 &&
                    max_rows > 0 && Rows >= max_rows) {
                  flag_End_Line      = 1;
                  flag_End_row_loop  = 1;
                  flag_In_array      = 0;
                  /* reposition to begining of line (ignore line) */
                  fseek(hfile, back_pos, SEEK_SET);
                } else { /* store into data array */
                  if (count_in_array >= malloc_size) {
                    /* realloc data buffer if necessary */
                    malloc_size = count_in_array*1.5;
                    Datatmp = (double*) realloc(Data, malloc_size*sizeof(double));
                    if (Datatmp == NULL) {
                      fprintf(stderr, "Error: Can not re-allocate memory %zi (Table_Read_Handle).\n",
                              malloc_size*sizeof(double));
		      free(Data);
                      return (-1);
                    } else {
                      Data=Datatmp;
                    }
                  }
                  if (0 == block_Num_Columns) Rows++;
                  Data[count_in_array] = X;
                  count_in_array++;
                  block_Num_Columns++;
                }
              } /* reading num: end if flag_In_array */
            } /* end reading num: end if sscanf lexeme -> numerical */
            else {
              /* reading line: the token is not numerical in that line. end block */
              if (block_Current_index == block_number) {
                flag_End_Line = 1;
                flag_End_row_loop = 1;
              } else {
                flag_In_array = 0;
                flag_End_Line = 1;
              }
            }
          }
          else {
            /* no more tokens in line */
            flag_End_Line = 1;
            if (block_Num_Columns > 0) Columns = block_Num_Columns;
          }

          // parse next token
          lexeme = strtok(NULL, seps);

        } /* while (!flag_End_Line) */
      } /* end: if fgets */
      else flag_End_row_loop = 1; /* else fgets : end of file */
      free(line);
    } while (!flag_End_row_loop); /* end while flag_End_row_loop */

    Table->block_number = block_number;
    Table->array_length = 1;

    // shrink header to actual size (plus terminating 0-byte)
    if (count_in_header) {
      Headertmp = (char*)realloc(Header, count_in_header*sizeof(char) + 1);
      if(!Headertmp) {
	fprintf(stderr, "Error: Could not shrink Header (Table_Read_Handle).\n");
	free(Header);
	return (-1);
      } else {
        Header = Headertmp;
      }
    }
    Table->header = Header;

    if (count_in_array*Rows*Columns == 0)
    {
      Table->rows         = 0;
      Table->columns      = 0;
      free(Data);
      return (0);
    }
    if (Rows * Columns != count_in_array)
    {
      fprintf(stderr, "Warning: Read_Table :%s %s Data has %li values that should be %li x %li\n",
        (Table->filename[0] != '\0' ? Table->filename : ""),
        (!block_number ? " catenated" : ""),
        count_in_array, Rows, Columns);
      Columns = count_in_array; Rows = 1;
    }
    if (count_invalid)
    {
      fprintf(stderr,"Warning: Read_Table :%s %s Data has %li invalid lines (*****). Ignored.\n",
      (Table->filename[0] != '\0' ? Table->filename : ""),
        (!block_number ? " catenated" : ""),
        count_invalid);
    }
    Datatmp     = (double*)realloc(Data, count_in_array*sizeof(double));
    if(!Datatmp) {
      fprintf(stderr, "Error: Could reallocate Data block to %li doubles (Table_Read_Handle).\n", count_in_array);
      free(Data);
      return (-1);
    } else {
      Data = Datatmp;
    }
    Table->data         = Data;
    Table->rows         = Rows;
    Table->columns      = Columns;

    return (count_in_array);

  } /* end Table_Read_Handle */

/*******************************************************************************
* long Table_Rebin(t_Table *Table)
*   ACTION: rebin a single Table, sorting 1st column in ascending order
*   input   Table: single table containing data.
*                  The data block is reallocated in this process
*   return  updated Table with increasing, evenly spaced first column (index 0)
*           number of data elements (-1: error, 0:empty data)
*******************************************************************************/
  long Table_Rebin(t_Table *Table)
  {
    double new_step=0;
    long   i;
    /* performs linear interpolation on X axis (0-th column) */

    if (!Table) return(-1);
    if (!Table->data 
    || Table->rows*Table->columns == 0 || !Table->step_x)
      return(0);
    Table_Stat(Table); /* recompute statitstics and minimal step */
    new_step = Table->step_x; /* minimal step in 1st column */

    if (!(Table->constantstep)) /* not already evenly spaced */
    {
      long Length_Table;
      double *New_Table;

      Length_Table = ceil(fabs(Table->max_x - Table->min_x)/new_step)+1;
      /*return early if the rebinned table will become too large*/
      if (Length_Table > mcread_table_rebin_maxsize){
        fprintf(stderr,"WARNING: (Table_Rebin): Rebinning table from %s would exceed 1M rows. Skipping.\n", Table->filename); 
        return(Table->rows*Table->columns);
      }
      New_Table    = (double*)malloc(Length_Table*Table->columns*sizeof(double));
      if (!New_Table) {
	fprintf(stderr,"Could not allocate New_Table of size %ld x %ld\n", Length_Table, Table->columns);
	exit(-1);
      }
      for (i=0; i < Length_Table; i++)
      {
        long   j;
        double X;
        X = Table->min_x + i*new_step;
        New_Table[i*Table->columns] = X;
        for (j=1; j < Table->columns; j++)
          New_Table[i*Table->columns+j]
                = Table_Value(*Table, X, j);
      } /* end for i */

      Table->rows = Length_Table;
      Table->step_x = new_step;
      Table->max_x = Table->min_x + (Length_Table-1)*new_step; 
      /*max might not be the same anymore
       * Use Length_Table -1 since the first and laset rows are the limits of the defined interval.*/
      free(Table->data);
      Table->data = New_Table;
      Table->constantstep=1;
    } /* end else (!constantstep) */
    return (Table->rows*Table->columns);
  } /* end Table_Rebin */

/*******************************************************************************
* double Table_Index(t_Table Table, long i, long j)
*   ACTION: read an element [i,j] of a single Table
*   input   Table: table containing data
*           i : index of row      (0:Rows-1)
*           j : index of column   (0:Columns-1)
*   return  Value = data[i][j]
* Returns Value from the i-th row, j-th column of Table
* Tests are performed on indexes i,j to avoid errors
*******************************************************************************/

#ifndef MIN
#define MIN(a, b)  (((a) < (b)) ? (a) : (b))
#endif
#ifndef MAX
#define MAX(a, b)  (((a) > (b)) ? (a) : (b))
#endif

double Table_Index(t_Table Table, long i, long j)
{
  long AbsIndex;

  if (Table.rows == 1 || Table.columns == 1) {
    /* vector */
    j = MIN(MAX(0, i+j), Table.columns*Table.rows - 1);
    i = 0;
  } else {
    /* matrix */
    i = MIN(MAX(0, i), Table.rows - 1);
    j = MIN(MAX(0, j), Table.columns - 1);
  }

  /* handle vectors specifically */
  AbsIndex = i*(Table.columns)+j;

  if (Table.data != NULL)
    return (Table.data[AbsIndex]);
  else
    return 0;
} /* end Table_Index */

/*******************************************************************************
* void Table_SetElement(t_Table *Table, long i, long j, double value)
*   ACTION: set an element [i,j] of a single Table
*   input   Table: table containing data
*           i : index of row      (0:Rows-1)
*           j : index of column   (0:Columns-1)
*           value = data[i][j]
* Returns 0 in case of error
* Tests are performed on indexes i,j to avoid errors
*******************************************************************************/
int Table_SetElement(t_Table *Table, long i, long j,
                     double value)
{
  long AbsIndex;

  if (Table->rows == 1 || Table->columns == 1) {
    /* vector */
    j = MIN(MAX(0, i+j), Table->columns*Table->rows - 1); i=0;
  } else {
    /* matrix */
    i = MIN(MAX(0, i), Table->rows - 1);
    j = MIN(MAX(0, j), Table->columns - 1);
  }

  AbsIndex = i*(Table->columns)+j;
  if (Table->data != NULL) {
    Table->data[AbsIndex] = value;
    return 1;
  }

  return 0;
} /* end Table_SetElement */

/*******************************************************************************
* double Table_Value(t_Table Table, double X, long j)
*   ACTION: read column [j] of a single Table at row which 1st column is X
*   input   Table: table containing data.
*           X : data value in the first column (index 0)
*           j : index of column from which is extracted the Value (0:Columns-1)
*   return  Value = data[index for X][j] with linear interpolation
* Returns Value from the j-th column of Table corresponding to the
* X value for the 1st column (index 0)
* Tests are performed (within Table_Index) on indexes i,j to avoid errors
* NOTE: data should rather be monotonic, and evenly sampled.
*******************************************************************************/
double Table_Value(t_Table Table, double X, long j)
{
  long   Index = -1;
  double X1=0, Y1=0, X2=0, Y2=0;
  double ret=0;

  if (X > Table.max_x) return Table_Index(Table,Table.rows-1  ,j);
  if (X < Table.min_x) return Table_Index(Table,0  ,j);

  // Use constant-time lookup when possible
  if(Table.constantstep) {
    Index = (long)floor(
              (X - Table.min_x) / (Table.max_x - Table.min_x) * (Table.rows-1));
    X1 = Table_Index(Table,Index-1,0);
    X2 = Table_Index(Table,Index  ,0);
  }
  // Use binary search on large, monotonic tables
  else if(Table.monotonic && Table.rows > 100) {
    long left = Table.min_x;
    long right = Table.max_x;

    while (!((X1 <= X) && (X < X2)) && (right - left > 1)) {
      Index = (left + right) / 2;

      X1 = Table_Index(Table, Index-1, 0);
      X2 = Table_Index(Table, Index,   0);

      if (X < X1) {
        right = Index;
      } else {
        left  = Index;
      }
    }
  }

  // Fall back to linear search, if no-one else has set X1, X2 correctly
  if (!((X1 <= X) && (X < X2))) {
    /* look for index surrounding X in the table -> Index */
    for (Index=1; Index <= Table.rows-1; Index++) {
        X1 = Table_Index(Table, Index-1,0);
        X2 = Table_Index(Table, Index  ,0);
        if ((X1 <= X) && (X < X2)) break;
      } /* end for Index */
  }

  Y1 = Table_Index(Table,Index-1, j);
  Y2 = Table_Index(Table,Index  , j);

#ifdef OPENACC
#define strcmp(a,b) str_comp(a,b)
#endif

  if (!strcmp(Table.method,"linear")) {
    ret = Table_Interp1d(X, X1,Y1, X2,Y2);
  }
  else if (!strcmp(Table.method,"nearest")) {
    ret = Table_Interp1d_nearest(X, X1,Y1, X2,Y2);
  }

#ifdef OPENACC
#ifdef strcmp
#undef strcmp
#endif
#endif

  return ret;
} /* end Table_Value */

/*******************************************************************************
* double Table_Value2d(t_Table Table, double X, double Y)
*   ACTION: read element [X,Y] of a matrix Table
*   input   Table: table containing data.
*           X : row index, may be non integer
*           Y : column index, may be non integer
*   return  Value = data[index X][index Y] with bi-linear interpolation
* Returns Value for the indices [X,Y]
* Tests are performed (within Table_Index) on indexes i,j to avoid errors
* NOTE: data should rather be monotonic, and evenly sampled.
*******************************************************************************/
double Table_Value2d(t_Table Table, double X, double Y)
  {
    long   x1,x2,y1,y2;
    double z11,z12,z21,z22;
    double ret=0;

    x1 = (long)floor(X);
    y1 = (long)floor(Y);

    if (x1 > Table.rows-1 || x1 < 0) {
      x2 = x1;
    } else {
      x2 = x1 + 1;
    }

    if (y1 > Table.columns-1 || y1 < 0) {
      y2 = y1;
    } else {
      y2 = y1 + 1;
    }

    z11 = Table_Index(Table, x1, y1);

    if (y2 != y1) z12=Table_Index(Table, x1, y2); else z12 = z11;
    if (x2 != x1) z21=Table_Index(Table, x2, y1); else z21 = z11;
    if (y2 != y1) z22=Table_Index(Table, x2, y2); else z22 = z21;

#ifdef OPENACC
#define strcmp(a,b) str_comp(a,b)
#endif

    if (!strcmp(Table.method,"linear"))
      ret = Table_Interp2d(X,Y, x1,y1,x2,y2, z11,z12,z21,z22);
#ifdef OPENACC
#ifdef strcmp
#undef strcmp
#endif
#endif
    else {
      if (fabs(X-x1) < fabs(X-x2)) {
        if (fabs(Y-y1) < fabs(Y-y2)) ret = z11; else ret = z12;
      } else {
        if (fabs(Y-y1) < fabs(Y-y2)) ret = z21; else ret = z22;
      }
    }
    return ret;
  } /* end Table_Value2d */


/*******************************************************************************
* void Table_Free(t_Table *Table)
*   ACTION: free a single Table. First Call Table_File_list_gc. If this returns
*   non-zero it means there are more refernces to the table, and so the table
*   should not bee freed.
*   return: empty Table
*******************************************************************************/
  void Table_Free(t_Table *Table)
  {
    if( !Table_File_List_gc(Table) ){
       return;
    } 
    if (!Table) return;
    if (Table->data   != NULL) free(Table->data);
    if (Table->header != NULL) free(Table->header);
    Table->data   = NULL;
    Table->header = NULL;
  } /* end Table_Free */

/******************************************************************************
* void Table_Info(t_Table Table)
*    ACTION: print informations about a single Table
*******************************************************************************/
  long Table_Info(t_Table Table)
  {
    char buffer[256];
    long ret=0;

    if (!Table.block_number) strcpy(buffer, "catenated");
    else sprintf(buffer, "block %li", Table.block_number);
    printf("Table from file '%s' (%s)",
        Table.filename[0] != '\0' ? Table.filename : "", buffer);
    if ((Table.data != NULL) && (Table.rows*Table.columns))
    {
      printf(" is %li x %li ", Table.rows, Table.columns);
      if (Table.rows*Table.columns > 1)
        printf("(x=%g:%g)", Table.min_x, Table.max_x);
      else printf("(x=%g) ", Table.min_x);
      ret = Table.rows*Table.columns;
      if (Table.monotonic)    printf(", monotonic");
      if (Table.constantstep) printf(", constant step");
      printf(". interpolation: %s\n", Table.method);
    }
    else printf(" is empty.\n");

    if (Table.header && strlen(Table.header)) {
      char *header;
      int  i;
      header = malloc(80);
      if (!header) return(ret);
      for (i=0; i<80; header[i++]=0);
      strncpy(header, Table.header, 75);
      if (strlen(Table.header) > 75) {
        strcat( header, " ...");
      }
      for (i=0; i<strlen(header); i++)
        if (header[i] == '\n' || header[i] == '\r') header[i] = ';';
      printf("  '%s'\n", header);
      free(header);
    }

    return(ret);
  } /* end Table_Info */

/******************************************************************************
* long Table_Init(t_Table *Table, m, n)
*   ACTION: initialise a Table to empty m by n table
*   return: empty Table
******************************************************************************/
long Table_Init(t_Table *Table, long rows, long columns)
{
  double *data=NULL;
  long   i;

  if (!Table) return(0);

  Table->header  = NULL;
  Table->filename[0]= '\0';
  Table->filesize= 0;
  Table->min_x   = 0;
  Table->max_x   = 0;
  Table->step_x  = 0;
  Table->block_number = 0;
  Table->array_length = 0;
  Table->monotonic    = 0;
  Table->constantstep = 0;
  Table->begin   = 0;
  Table->end     = 0;
  strcpy(Table->method,"linear");

  if (rows*columns >= 1) {
    data    = (double*)malloc(rows*columns*sizeof(double));
    if (data) for (i=0; i < rows*columns; data[i++]=0);
    else {
      if(Table->quiet<2)
        fprintf(stderr,"Error: allocating %ld double elements."
            "Too big (Table_Init).\n", rows*columns);
      rows = columns = 0;
    }
  }
  Table->rows    = (rows >= 1 ? rows : 0);
  Table->columns = (columns >= 1 ? columns : 0);
  Table->data    = data;
  return(Table->rows*Table->columns);
} /* end Table_Init */

/******************************************************************************
* long Table_Write(t_Table Table, char *file, x1,x2, y1,y2)
*   ACTION: write a Table to disk (ascii).
*     when x1=x2=0 or y1=y2=0, the table default limits are used.
*   return: 0=all is fine, non-0: error
*******************************************************************************/
MCDETECTOR Table_Write(t_Table Table, char *file, char *xl, char *yl, 
  double x1, double x2, double y1, double y2)
{
  MCDETECTOR detector;

  if ((Table.data == NULL) && (Table.rows*Table.columns)) {
    detector.m = 0;
    detector.xmin = 0;
    detector.xmax = 0;
    detector.ymin = 0;
    detector.ymax = 0;
    detector.zmin = 0;
    detector.zmax = 0; 
    detector.intensity = 0;
    detector.error = 0;
    detector.events = 0;
    detector.min = 0;
    detector.max = 0;
    detector.mean = 0;
    detector.centerX = 0;
    detector.halfwidthX = 0;
    detector.centerY = 0;
    detector.halfwidthY = 0;
    detector.rank = 0;
    detector.istransposed = 0;
    detector.n = 0;
    detector.p = 0;
    detector.date_l = 0;
    detector.p0 = NULL;
    detector.p1 = NULL;
    detector.p2 = NULL;
    return(detector); /* Table is empty - nothing to do */
  }
  if (!x1 && !x2) {
    x1 = Table.min_x;
    x2 = Table.max_x;
  }
  if (!y1 && !y2) {
    y1 = 1;
    y2 = Table.columns;
  }

  /* transfer content of the Table into a 2D detector */
  Coords coords = { 0, 0, 0};
  Rotation rot;
  rot_set_rotation(rot, 0, 0, 0);
  
  if (Table.rows == 1 || Table.columns == 1) {
    detector = mcdetector_out_1D(Table.filename,
                      xl ? xl : "", yl ? yl : "",
                      "x", x1, x2,
                      Table.rows * Table.columns,
                      NULL, Table.data, NULL,
		      file, file, coords, rot,9999);
  } else {
    detector = mcdetector_out_2D(Table.filename,
                      xl ? xl : "", yl ? yl : "",
                      x1, x2, y1, y2,
                      Table.rows, Table.columns,
                      NULL, Table.data, NULL,
		      file, file, coords, rot,9999);
  }
  return(detector);
}

/******************************************************************************
* void Table_Stat(t_Table *Table)
*   ACTION: computes min/max/mean step of 1st column for a single table (private)
*   return: updated Table
*******************************************************************************/
  static void Table_Stat(t_Table *Table)
  {
    long   i;
    double max_x, min_x;
    double row=1;
    char   monotonic=1;
    char   constantstep=1;
    double step=0;
    long n;

    if (!Table) return;
    if (!Table->rows || !Table->columns) return;
    if (Table->rows == 1) row=0; // single row
    max_x = -FLT_MAX;
    min_x =  FLT_MAX;
    n     = (row ? Table->rows : Table->columns);
    /* get min and max of first column/vector */
    for (i=0; i < n; i++)
    {
      double X;
      X = (row ? Table_Index(*Table,i  ,0)
                               : Table_Index(*Table,0, i));
      if (X < min_x) min_x = X;
      if (X > max_x) max_x = X;
    } /* for */
    
    /* test for monotonicity and constant step if the table is an XY or single vector */
    if (n > 1) {
      /* mean step */
      step = (max_x - min_x)/(n-1);
      /* now test if table is monotonic on first column, and get minimal step size */
      for (i=0; i < n-1; i++) {
        double X, diff;;
        X    = (row ? Table_Index(*Table,i  ,0)
                    : Table_Index(*Table,0,  i));
        diff = (row ? Table_Index(*Table,i+1,0)
                    : Table_Index(*Table,0,  i+1)) - X;
        if (diff && fabs(diff) < fabs(step)) step = diff;
        /* change sign ? */
        if ((max_x - min_x)*diff < 0 && monotonic)
          monotonic = 0;
      } /* end for */
      
      /* now test if steps are constant within READ_TABLE_STEPTOL */
      if(!step){
        /*means there's a disconitnuity -> not constantstep*/
        constantstep=0;
      }else if (monotonic) {
        for (i=0; i < n-1; i++) {
          double X, diff;
          X    = (row ? Table_Index(*Table,i  ,0)
              : Table_Index(*Table,0,  i));
          diff = (row ? Table_Index(*Table,i+1,0)
              : Table_Index(*Table,0,  i+1)) - X;
          if ( fabs(step)*(1+READ_TABLE_STEPTOL) < fabs(diff) ||
                fabs(diff) < fabs(step)*(1-READ_TABLE_STEPTOL) )
          { constantstep = 0; break; }
        }
      }

    }
    Table->step_x= step;
    Table->max_x = max_x;
    Table->min_x = min_x;
    Table->monotonic = monotonic;
    Table->constantstep = constantstep;
  } /* end Table_Stat */

/******************************************************************************
* t_Table *Table_Read_Array(char *File, long *blocks)
*   ACTION: read as many data blocks as available, iteratively from file
*   return: initialized t_Table array, last element is an empty Table.
*           the number of extracted blocks in non NULL pointer *blocks
*******************************************************************************/
  t_Table *Table_Read_Array(char *File, long *blocks)
  {
    t_Table *Table_Array    = NULL;
    t_Table *Table_Arraytmp = NULL;
    long offset=0;
    long block_number=0;
    long allocated=256;
    long nelements=1;

    /* first allocate an initial empty t_Table array */
    Table_Array = (t_Table *)malloc(allocated*sizeof(t_Table));
    if (!Table_Array) {
      fprintf(stderr, "Error: Can not allocate memory %zi (Table_Read_Array).\n",
         allocated*sizeof(t_Table));
      *blocks = 0;
      return (NULL);
    }

    while (nelements > 0)
    {
      t_Table Table;

      /* if ok, set t_Table block number else exit loop */
      block_number++;
      Table.block_number = block_number;
      
      /* access file at offset and get following block. Block number is from the set offset
       * hence the hardcoded 1 - i.e. the next block counted from offset.*/
      nelements = Table_Read_Offset(&Table, File, 1, &offset,0);
      /*if the block is empty - don't store it*/
      if (nelements>0){
          /* if t_Table array is not long enough, expand and realocate */
          if (block_number >= allocated-1) {
              allocated += 256;
              Table_Arraytmp = (t_Table *)realloc(Table_Array,
                      allocated*sizeof(t_Table));
              if (!Table_Arraytmp) {
                  fprintf(stderr, "Error: Can not re-allocate memory %zi (Table_Read_Array).\n",
                          allocated*sizeof(t_Table));
                  free(Table_Array);
                  *blocks = 0;
                  return (NULL);
              } else {
                Table_Array = Table_Arraytmp;
              }
          }
          /* store it into t_Table array */
          //snprintf(Table.filename, 1024, "%s#%li", File, block_number-1);
          Table_Array[block_number-1] = Table;
      }
      /* continues until we find an empty block */
    }
    /* send back number of extracted blocks */
    if (blocks) *blocks = block_number-1;

    /* now store total number of elements in Table array */
    for (offset=0; offset < block_number;
      Table_Array[offset++].array_length = block_number-1);

    return(Table_Array);
  } /* end Table_Read_Array */
/*******************************************************************************
* void Table_Free_Array(t_Table *Table)
*   ACTION: free a Table array
*******************************************************************************/
  void Table_Free_Array(t_Table *Table)
  {
    long index;
    if (!Table) return;
    for (index=0;index < Table[0].array_length; index++){
            Table_Free(&Table[index]);
    }
    free(Table);
  } /* end Table_Free_Array */

/******************************************************************************
* long Table_Info_Array(t_Table *Table)
*    ACTION: print informations about a Table array
*    return: number of elements in the Table array
*******************************************************************************/
  long Table_Info_Array(t_Table *Table)
  {
    long index=0;

    if (!Table) return(-1);
    while (index < Table[index].array_length
       && (Table[index].data || Table[index].header)
       && (Table[index].rows*Table[index].columns) ) {
      Table_Info(Table[index]);
      index++;
    }
    printf("This Table array contains %li elements\n", index);
    return(index);
  } /* end Table_Info_Array */

/******************************************************************************
* char **Table_ParseHeader(char *header, symbol1, symbol2, ..., NULL)
*    ACTION: search for char* symbols in header and return their value or NULL
*            the search is not case sensitive.
*            Last argument MUST be NULL
*    return: array of char* with line following each symbol, or NULL if not found
*******************************************************************************/
#ifndef MyNL_ARGMAX
#define MyNL_ARGMAX 50
#endif

char **Table_ParseHeader_backend(char *header, ...){
  va_list ap;
  char exit_flag=0;
  int counter   =0;
  char **ret    =NULL;
  if (!header || header[0]=='\0') return(NULL);

  ret = (char**)calloc(MyNL_ARGMAX, sizeof(char*));
  if (!ret) {
    printf("Table_ParseHeader: Cannot allocate %i values array for Parser (Table_ParseHeader).\n",
      MyNL_ARGMAX);
    return(NULL);
  }
  for (counter=0; counter < MyNL_ARGMAX; ret[counter++] = NULL);
  counter=0;

  va_start(ap, header);
  while(!exit_flag && counter < MyNL_ARGMAX-1)
  {
    char *arg_char=NULL;
    char *pos     =NULL;
    /* get variable argument value as a char */
    arg_char = va_arg(ap, char *);
    if (!arg_char || arg_char[0]=='\0'){
      exit_flag = 1; break;
    }
    /* search for the symbol in the header */
    pos = (char*)strcasestr(header, arg_char);
    if (pos) {
      char *eol_pos;
      eol_pos = strchr(pos+strlen(arg_char), '\n');
      if (!eol_pos)
        eol_pos = strchr(pos+strlen(arg_char), '\r');
      if (!eol_pos)
        eol_pos = pos+strlen(pos)-1;
      ret[counter] = (char*)malloc(eol_pos - pos);
      if (!ret[counter]) {
        printf("Table_ParseHeader: Cannot allocate value[%i] array for Parser searching for %s (Table_ParseHeader).\n",
          counter, arg_char);
        exit_flag = 1; break;
      }
      strncpy(ret[counter], pos+strlen(arg_char), eol_pos - pos - strlen(arg_char));
      ret[counter][eol_pos - pos - strlen(arg_char)]='\0';
    }
    counter++;
  }
  va_end(ap);
  return(ret);
} /* Table_ParseHeader */

/******************************************************************************
* double Table_Interp1d(x, x1, y1, x2, y2)
*    ACTION: interpolates linearly at x between y1=f(x1) and y2=f(x2)
*    return: y=f(x) value
*******************************************************************************/
double Table_Interp1d(double x,
  double x1, double y1,
  double x2, double y2)
{
  double slope;
  if (x2 == x1) return (y1+y2)/2;
  if (y1 == y2) return  y1;
  slope = (y2 - y1)/(x2 - x1);
  return y1+slope*(x - x1);
} /* Table_Interp1d */

/******************************************************************************
* double Table_Interp1d_nearest(x, x1, y1, x2, y2)
*    ACTION: table lookup with nearest method at x between y1=f(x1) and y2=f(x2)
*    return: y=f(x) value
*******************************************************************************/
double Table_Interp1d_nearest(double x,
  double x1, double y1,
  double x2, double y2)
{
  if (fabs(x-x1) < fabs(x-x2)) return (y1);
  else return(y2);
} /* Table_Interp1d_nearest */

/******************************************************************************
* double Table_Interp2d(x,y, x1,y1, x2,y2, z11,z12,z21,z22)
*    ACTION: interpolates bi-linearly at (x,y) between z1=f(x1,y1) and z2=f(x2,y2)
*    return: z=f(x,y) value
*    x,y |   x1   x2
*    ----------------
*     y1 |   z11  z21
*     y2 |   z12  z22
*******************************************************************************/
double Table_Interp2d(double x, double y,
  double x1, double y1,
  double x2, double y2,
  double z11, double z12, double z21, double z22)
{
  double ratio_x, ratio_y;
  if (x2 == x1) return Table_Interp1d(y, y1,z11, y2,z12);
  if (y1 == y2) return Table_Interp1d(x, x1,z11, x2,z21);

  ratio_y = (y - y1)/(y2 - y1);
  ratio_x = (x - x1)/(x2 - x1);
  return (1-ratio_x)*(1-ratio_y)*z11 + ratio_x*(1-ratio_y)*z21
    + ratio_x*ratio_y*z22         + (1-ratio_x)*ratio_y*z12;
} /* Table_Interp2d */

/* end of read_table-lib.c */
#endif // READ_TABLE_LIB_C


#ifndef SOURCE_GEN_DEF
#define SOURCE_GEN_DEF
/*******************************************************************************
* str_dup_numeric: replaces non 'valid name' chars with spaces
*******************************************************************************/
char *str_dup_numeric(char *orig)
  {
    long i;

    if (!orig || !strlen(orig)) return(NULL);

    for (i=0; i < strlen(orig); i++)
    {
      if ( (orig[i] > 122)
        || (orig[i] < 32)
        || (strchr("!\"#$%&'()*,:;<=>?@[\\]^`/ ", orig[i]) != NULL) )
      {
        orig[i] = ' ';
      }
    }
    orig[i] = '\0';
    /* now skip spaces */
    for (i=0; i < strlen(orig); i++) {
      if (*orig == ' ') orig++;
      else break;
    }

    return(orig);
  } /* str_dup_numeric */

  /* A normalised Maxwellian distribution : Integral over all l = 1 */
#pragma acc routine seq
  double SG_Maxwell(double l, double temp)
  {
    double a=949.0/temp;
    return 2*a*a*exp(-a/(l*l))/(l*l*l*l*l);
  }
#endif


/* Shared user declarations for all components types 'PowderN'. */
  /* used for reading data table from file */

/*******************************************************************************
*
* McStas, neutron ray-tracing package
*         Copyright (C) 1997-2008, All rights reserved
*         Risoe National Laboratory, Roskilde, Denmark
*         Institut Laue Langevin, Grenoble, France
*
* Runtime: share/interoff.h
*
* %Identification
* Written by: Reynald Arnerin
* Date:    Jun 12, 2008
* Release:
* Version:
*
* Object File Format intersection header for McStas. Requires the qsort function.
*
* Such files may be obtained with e.g.
*   qhull < points.xyz Qx Qv Tv o > points.off
* where points.xyz has format:
*   3
*   <nb_points>
*   <x> <y> <z>
*   ...
* The resulting file should have its first line being changed from '3' into 'OFF'.
* It can then be displayed with geomview.
* A similar, but somewhat older solution is to use 'powercrust' with e.g.
*   powercrust -i points.xyz
* which will generate a 'pc.off' file to be renamed as suited.
*
*******************************************************************************/

#ifndef INTEROFF_LIB_H
#define INTEROFF_LIB_H "$Revision$"

#ifndef OFF_EPSILON
#define OFF_EPSILON 1e-13
#endif

#ifndef OFF_INTERSECT_MAX
#ifdef OPENACC
#define OFF_INTERSECT_MAX 100
#else
#define OFF_INTERSECT_MAX 1024
#endif
#endif

//#include <float.h>

#define N_VERTEX_DISPLAYED    200000

typedef struct intersection {
	MCNUM time;  	  //time of the intersection
	Coords v;	      //intersection point
	Coords normal;  //normal vector of the surface intersected
	short in_out;	  //1 if the ray enters the volume, -1 otherwise
	short edge;	    //1 if the intersection is on the boundary of the polygon, and error is possible
	unsigned long index; // index of the face
} intersection;

typedef struct polygon {
  MCNUM* p;       //vertices of the polygon in adjacent order, this way : x1 | y1 | z1 | x2 | y2 | z2 ...
  int npol;       //number of vertices
  #pragma acc shape(p[0:npol]) init_needed(npol)
  Coords normal;
  double D;
} polygon;

typedef struct off_struct {
    long vtxSize;
    long polySize;
    long faceSize;
    Coords* vtxArray;
    #pragma acc shape(vtxArray[0:vtxSize]) init_needed(vtxSize)
    Coords* normalArray;
    #pragma acc shape(vtxArray[0:faceSize]) init_needed(faceSize)
    unsigned long* faceArray;
    #pragma acc shape(vtxArray[0:faceSize][0:polySize]) init_needed(faceSize,polySize)
    double* DArray;
    #pragma acc shape(vtxArray[0:polySize]) init_needed(polySize)
    char *filename;
    int mantidflag;
    long mantidoffset;
    intersection intersects[OFF_INTERSECT_MAX]; // After a call to off_intersect_all contains the list of intersections.
    int nextintersect;                 // 'Next' intersection (first t>0) solution after call to off_intersect_all
    int numintersect;               // Number of intersections after call to off_intersect_all
} off_struct;

/*******************************************************************************
* long off_init(  char *offfile, double xwidth, double yheight, double zdepth, off_struct* data)
* ACTION: read an OFF file, optionally center object and rescale, initialize OFF data structure
* INPUT: 'offfile' OFF file to read
*        'xwidth,yheight,zdepth' if given as non-zero, apply bounding box.
*           Specifying only one of these will also use the same ratio on all axes
*        'notcenter' center the object to the (0,0,0) position in local frame when set to zero
* RETURN: number of polyhedra and 'data' OFF structure
*******************************************************************************/
long off_init(  char *offfile, double xwidth, double yheight, double zdepth,
                int notcenter, off_struct* data);

/*******************************************************************************
* int off_intersect_all(double* t0, double* t3,
     Coords *n0, Coords *n3,
     double x, double y, double z,
     double vx, double vy, double vz,
     double ax, double ay, double az,
     off_struct *data )
* ACTION: computes intersection of neutron trajectory with an object.
* INPUT:  x,y,z and vx,vy,vz are the position and velocity of the neutron
*         ax, ay, az are the local acceleration vector
*         data points to the OFF data structure
* RETURN: the number of polyhedral which trajectory intersects
*         t0 and t3 are the smallest incoming and outgoing intersection times
*         n0 and n3 are the corresponding normal vectors to the surface
*         data is the full OFF structure, including a list intersection type
*******************************************************************************/
#pragma acc routine
int off_intersect_all(double* t0, double* t3,
     Coords *n0, Coords *n3,
     double x, double y, double z,
     double vx, double vy, double vz,
     double ax, double ay, double az,
     off_struct *data );

/*******************************************************************************
* int off_intersect(double* t0, double* t3,
     Coords *n0, Coords *n3,
     double x, double y, double z,
     double vx, double vy, double vz,
     double ax, double ay, double az,
     off_struct data )
* ACTION: computes intersection of neutron trajectory with an object.
* INPUT:  x,y,z and vx,vy,vz are the position and velocity of the neutron
*         ax, ay, az are the local acceleration vector
*         data points to the OFF data structure
* RETURN: the number of polyhedral which trajectory intersects
*         t0 and t3 are the smallest incoming and outgoing intersection times
*         n0 and n3 are the corresponding normal vectors to the surface
*******************************************************************************/
#pragma acc routine
int off_intersect(double* t0, double* t3,
     Coords *n0, Coords *n3,
     double x, double y, double z,
     double vx, double vy, double vz,
     double ax, double ay, double az,
     off_struct data );

/*****************************************************************************
* int off_intersectx(double* l0, double* l3,
     Coords *n0, Coords *n3,
     double x, double y, double z,
     double kx, double ky, double kz,
     off_struct data )
* ACTION: computes intersection of an xray trajectory with an object.
* INPUT:  x,y,z and kx,ky,kz, are spatial coordinates and wavevector of the x-ray
*         respectively. data points to the OFF data structure.
* RETURN: the number of polyhedral the trajectory intersects
*         l0 and l3 are the smallest incoming and outgoing intersection lengths
*         n0 and n3 are the corresponding normal vectors to the surface
*******************************************************************************/
#pragma acc routine
int off_x_intersect(double *l0,double *l3,
     Coords *n0, Coords *n3,
     double x,  double y,  double z,
     double kx, double ky, double kz,
     off_struct data );

/*******************************************************************************
* void off_display(off_struct data)
* ACTION: display up to N_VERTEX_DISPLAYED points from the object
*******************************************************************************/
void off_display(off_struct);

/*******************************************************************************
void p_to_quadratic(double eq[], Coords acc,
                    Coords pos, Coords vel,
                    double* teq)
* ACTION: define the quadratic for the intersection of a parabola with a plane
* INPUT: 'eq' plane equation
*        'acc' acceleration vector
*        'vel' velocity of the particle
*        'pos' position of the particle
*         equation of plane A * x + B * y + C * z - D = 0
*         eq[0] = (C*az)/2+(B*ay)/2+(A*ax)/2
*         eq[1] = C*vz+B*vy+A*vx
*         eq[2] = C*z0+B*y0+A*x0-D
* RETURN: equation of parabola: teq(0) * t^2 + teq(1) * t + teq(2)
*******************************************************************************/
void p_to_quadratic(Coords norm, MCNUM d, Coords acc, Coords pos, Coords vel,
		    double* teq);

/*******************************************************************************
int quadraticSolve(double eq[], double* x1, double* x2);
* ACTION: solves the quadratic for the roots x1 and x2 
*         eq[0] * t^2 + eq[1] * t + eq[2] = 0
* INPUT: 'eq' the coefficients of the parabola
* RETURN: roots x1 and x2 and the number of solutions
*******************************************************************************/
int quadraticSolve(double* eq, double* x1, double* x2);

#endif

/* end of interoff-lib.h */
/*******************************************************************************
*
* McStas, neutron ray-tracing package
*         Copyright (C) 1997-2008, All rights reserved
*         Risoe National Laboratory, Roskilde, Denmark
*         Institut Laue Langevin, Grenoble, France
*
* Runtime: share/interoff-lib.c
*
* %Identification
* Written by: Reynald Arnerin
* Date:    Jun 12, 2008
* Origin: ILL
* Release: $Revision$
* Version: McStas X.Y
*
* Object File Format intersection library for McStas. Requires the qsort function.
*
* Such files may be obtained with e.g.
*   qhull < points.xyz Qx Qv Tv o > points.off
* where points.xyz has format (it supports comments):
*   3
*   <nb_points>
*   <x> <y> <z>
*   ...
* The resulting file should have its first line being changed from '3' into 'OFF'.
* It can then be displayed with geomview.
* A similar, but somewhat older solution is to use 'powercrust' with e.g.
*   powercrust -i points.xyz
* which will generate a 'pc.off' file to be renamed as suited.
*
*******************************************************************************/

#ifndef INTEROFF_LIB_H
#include "interoff-lib.h"
#endif

#ifndef INTEROFF_LIB_C
#define INTEROFF_LIB_C "$Revision$"

#ifdef OPENACC // If on GPU map fprintf to printf
#define fprintf(stderr,...) printf(__VA_ARGS__)
#endif

#pragma acc routine
double off_F(double x, double y,double z,double A,double B,double C,double D) {
  return ( A*x + B*y + C*z + D );
}

#pragma acc routine
char off_sign(double a) {
  if (a<0)       return(-1);
  else if (a==0) return(0);
  else           return(1);
}

// off_normal ******************************************************************
//gives the normal vector of p
#pragma acc routine
void off_normal(Coords* n, polygon p)
{
  //using Newell method
  int i=0,j=0;
  n->x=0;n->y=0;n->z=0;
  for (i = 0, j = p.npol-1; i < p.npol; j = i++)
  {
    MCNUM x1=p.p[3*i],
          y1=p.p[3*i+1],
          z1=p.p[3*i+2];
    MCNUM x2=p.p[3*j],
          y2=p.p[3*j+1],
          z2=p.p[3*j+2];
    // n is the cross product of v1*v2
    n->x += (y1 - y2) * (z1 + z2);
    n->y += (z1 - z2) * (x1 + x2);
    n->z += (x1 - x2) * (y1 + y2);
  }
} /* off_normal */

// off_pnpoly ******************************************************************
//based on http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
//return 0 if the vertex is out
//    1 if it is in
//   -1 if on the boundary
#pragma acc routine
int off_pnpoly(polygon p, Coords v)
{
  int i=0, c = 0;
  MCNUM minx=FLT_MAX,maxx=-FLT_MAX,miny=FLT_MAX,maxy=-FLT_MAX,minz=FLT_MAX,maxz=-FLT_MAX;
  MCNUM areax=0,areay=0,areaz=0;

  int pol2dx=0,pol2dy=1;          //2d restriction of the poly
  MCNUM x=v.x,y=v.y;

  /*areax: projected area with x-scratched = |v1_yz x v2_yz|, where v1=(x1-x0,0,z1-z0) & v2=(x2-x0,0,z2-z0).*/
  /* In principle, if polygon is triangle area should be scaled by 1/2, but this is irrelevant for finding the maximum area.*/
  /* Similarly for y and z scratched.*/
  areax=coords_len(coords_xp(
        coords_set(0,p.p[3*1+1]-p.p[0+1],p.p[3*1+2]-p.p[0+2]),
        coords_set(0,p.p[3*2+1]-p.p[0+1],p.p[3*2+2]-p.p[0+2])));
  areay=coords_len(coords_xp(
        coords_set(p.p[3*1+0]-p.p[0+0],0,p.p[3*1+2]-p.p[0+2]),
        coords_set(p.p[3*2+0]-p.p[0+0],0,p.p[3*2+2]-p.p[0+2])));
  areaz=coords_len(coords_xp(
        coords_set(p.p[3*1+0]-p.p[0+0],p.p[3*1+1]-p.p[0+1],0),
        coords_set(p.p[3*2+0]-p.p[0+0],p.p[3*2+1]-p.p[0+1],0)));

  if(areaz<areax){
    if(areax<areay){
      /*pick areay - i.e. scratch y*/
      pol2dy=2;
      y=v.z;
    }else{
      /*scratch x*/
      pol2dx=2;
      x=v.z;
    }
  }else if (areaz<areay){
    pol2dy=2;
    y=v.z;
  }

  //trace rays and test number of intersection
  int j;
  for (i = 0, j = p.npol-1; i < p.npol; j = i++) {
    if (((((p.p[3*i+pol2dy])<=y) && (y<(p.p[3*j+pol2dy]))) ||
         (((p.p[3*j+pol2dy])<=y) && (y<(p.p[3*i+pol2dy])))) &&
        (x < ( (p.p[3*j+pol2dx] - p.p[3*i+pol2dx]) * (y - p.p[3*i+pol2dy])
             / (p.p[3*j+pol2dy] - p.p[3*i+pol2dy]) + p.p[3*i+pol2dx]) ))
      c = !c;

    if (((fabs(p.p[3*i+pol2dy]-y)<=OFF_EPSILON) || ((fabs(p.p[3*j+pol2dy]-y)<=OFF_EPSILON))) &&
        fabs(x -((p.p[3*j+pol2dx] - p.p[3*i+pol2dx]) * (y - p.p[3*i+pol2dy])
          / (p.p[3*j+pol2dy] - p.p[3*i+pol2dy]) + p.p[3*i+pol2dx])) < OFF_EPSILON)
    {
      //the point lies on the edge
      c=-1;
      break;
    }
  }

  return c;
} /* off_pnpoly */

// off_intersectPoly ***********************************************************
//gives the intersection vertex between ray [a,b) and polygon p and its parametric value on (a b)
//based on http://geometryalgorithms.com/Archive/algorithm_0105/algorithm_0105.htm
#pragma acc routine
int off_intersectPoly(intersection *inter, Coords a, Coords b, polygon p)
{
  //direction vector of [a,b]
  Coords dir = {b.x-a.x, b.y-a.y, b.z-a.z};

  //the normal vector to the polygon
  Coords normale=p.normal;
  //off_normal(&normale, p); done at the init stage

  //direction vector from a to a vertex of the polygon
  Coords w0 = {a.x-p.p[0], a.y-p.p[1], a.z-p.p[2]};

  //scalar product
  MCNUM nw0  =-scalar_prod(normale.x,normale.y,normale.z,w0.x,w0.y,w0.z);
  MCNUM ndir = scalar_prod(normale.x,normale.y,normale.z,dir.x,dir.y,dir.z);
  inter->time = inter->edge = inter->in_out=0;
  inter->v = inter->normal = coords_set(0,0,1);

  if (fabs(ndir) < OFF_EPSILON)    // ray is parallel to polygon plane
  {
    if (nw0 == 0)              // ray lies in polygon plane (infinite number of solution)
      return 0;
    else return 0;             // ray disjoint from plane (no solution)
  }

  // get intersect point of ray with polygon plane
  inter->time = nw0 / ndir;            //parametric value the point on line (a,b)

  inter->v = coords_set(a.x + inter->time * dir.x,// intersect point of ray and plane
    a.y + inter->time * dir.y,
    a.z + inter->time * dir.z);

  int res=off_pnpoly(p,inter->v);

  inter->edge=(res==-1);
  if (ndir<0)
    inter->in_out=1;  //the negative dot product means we enter the surface
  else
    inter->in_out=-1;

  inter->normal=p.normal;

  return res;         //true if the intersection point lies inside the poly
} /* off_intersectPoly */


// off_getBlocksIndex **********************************************************
/*reads the indexes at the beginning of the off file as this :
line 1  OFF
line 2  nbVertex nbFaces nbEdges
*/
FILE *off_getBlocksIndex(char* filename, long* vtxSize, long* polySize )
{
  FILE* f = Open_File(filename,"r", NULL); /* from read_table-lib: FILE *Open_File(char *name, char *Mode, char *path) */
  if (!f) return (f);

  char line[CHAR_BUF_LENGTH];
  char *ret=0;
  *vtxSize = *polySize = 0;

  /* **************** start to read the file header */
  /* OFF file:
     'OFF' or '3'
   */

  ret=fgets(line,CHAR_BUF_LENGTH , f);// line 1 = "OFF"
  if (ret == NULL)
  {
    fprintf(stderr, "Error: Can not read 1st line in file %s (interoff/off_getBlocksIndex)\n", filename);
    exit(1);
  }
  if (strlen(line)>5)
  {
      fprintf(stderr,"Error: First line in %s is too long (=%lu). Possibly the line is not terminated by '\\n'.\n"
              "       The first line is required to be exactly 'OFF', '3' or 'ply'.\n",
              filename,(long unsigned)strlen(line));
      fclose(f);
      return(NULL);
  }

  if (strncmp(line,"OFF",3) && strncmp(line,"3",1) && strncmp(line,"ply",1))
  {
    fprintf(stderr, "Error: %s is probably not an OFF, NOFF or PLY file (interoff/off_getBlocksIndex).\n"
                    "       Requires first line to be 'OFF', '3' or 'ply'.\n",filename);
    fclose(f);
    return(NULL);
  }

  if (!strncmp(line,"OFF",3) || !strncmp(line,"3",1)) {
    do  /* OFF file: skip # comments which may be there */
    {
      ret=fgets(line,CHAR_BUF_LENGTH , f);
      if (ret == NULL)
      {
        fprintf(stderr, "Error: Can not read line in file %s (interoff/off_getBlocksIndex)\n", filename);
        exit(1);
      }
    } while (line[0]=='#');
    //line = nblines of vertex,faces and edges arrays
    sscanf(line,"%lu %lu",vtxSize,polySize);
  } else {
    do  /* PLY file: read all lines until find 'end_header'
           and locate 'element faces' and 'element vertex' */
    {
      ret=fgets(line,CHAR_BUF_LENGTH , f);
      if (ret == NULL)
      {
        fprintf(stderr, "Error: Can not read line in file %s (interoff/off_getBlocksIndex)\n", filename);
        exit(1);
      }
      if (!strncmp(line,"element face",12))
        sscanf(line,"element face %lu",polySize);
      else if (!strncmp(line,"element vertex",14))
        sscanf(line,"element vertex %lu",vtxSize);
      else if (!strncmp(line,"format binary",13))
        exit(fprintf(stderr,
          "Error: Can not read binary PLY file %s, only 'format ascii' (interoff/off_getBlocksIndex)\n%s\n",
          filename, line));
    } while (strncmp(line,"end_header",10));
  }

  /* The FILE is left opened ready to read 'vtxSize' vertices (vtxSize *3 numbers)
     and then polySize polygons (rows) */

  return(f);
} /* off_getBlocksIndex */

// off_init_planes *************************************************************
//gives the equations of 2 perpandicular planes of [ab]
#pragma acc routine
void off_init_planes(Coords a, Coords b,
  MCNUM* A1, MCNUM* C1, MCNUM* D1, MCNUM *A2, MCNUM* B2, MCNUM* C2, MCNUM* D2)
{
  //direction vector of [a b]
  Coords dir={b.x-a.x, b.y-a.y, b.z-a.z};

  //the plane parallel to the 'y' is computed with the normal vector of the projection of [ab] on plane 'xz'
  *A1= dir.z;
  *C1=-dir.x;
  if(*A1!=0 || *C1!=0)
    *D1=-(a.x)*(*A1)-(a.z)*(*C1);
  else
  {
    //the plane does not support the vector, take the one parallel to 'z''
    *A1=1;
    //B1=dir.x=0
    *D1=-(a.x);
  }
  //the plane parallel to the 'x' is computed with the normal vector of the projection of [ab] on plane 'yz'
  *B2= dir.z;
  *C2=-dir.y;
  *A2= 0;
  if (*B2==0 && *C2==0)
  {
    //the plane does not support the vector, take the one parallel to 'z'
    *B2=1;
    //B1=dir.x=0
    *D2=-(a.y);
  }
  else {
    if (dir.z==0)
    {
      //the planes are the same, take the one parallel to 'z'
      *A2= dir.y;
      *B2=-dir.x;
      *D2=-(a.x)*(*A2)-(a.y)*(*B2);
    }
    else
      *D2=-(a.y)**B2-(a.z)**C2;
  }
} /* off_init_planes */

// off_clip_3D_mod *************************************************************
#pragma acc routine
int off_clip_3D_mod(intersection* t, Coords a, Coords b,
  Coords* vtxArray, unsigned long vtxSize, unsigned long* faceArray,
  unsigned long faceSize, Coords* normalArray)
{
  MCNUM A1=0, C1=0, D1=0, A2=0, B2=0, C2=0, D2=0;      //perpendicular plane equations to [a,b]
  off_init_planes(a, b, &A1, &C1, &D1, &A2, &B2, &C2, &D2);

  int t_size=0;
  MCNUM popol[3*4]; /*3 dimensions and max 4 vertices to form a polygon*/
  unsigned long i=0,indPoly=0;

  //exploring the polygons :
  i=indPoly=0;
  while (i<faceSize)
  {
    polygon pol;
    pol.npol  = faceArray[i];                //nb vertex of polygon
    pol.p     = popol;
    pol.normal= coords_set(0,0,1);
    pol.D     = 1;
    unsigned long indVertP1=faceArray[++i];  //polygon's first vertex index in vtxTable
    int j=1;
    /*check whether vertex is left or right of plane*/
    char sg0=off_sign(off_F(vtxArray[indVertP1].x,vtxArray[indVertP1].y,vtxArray[indVertP1].z,A1,0,C1,D1));
    while (j<pol.npol)
    {
      //polygon's j-th vertex index in vtxTable
      unsigned long indVertP2=faceArray[i+j];
      /*check whether vertex is left or right of plane*/
      char sg1=off_sign(off_F(vtxArray[indVertP2].x,vtxArray[indVertP2].y,vtxArray[indVertP2].z,A1,0,C1,D1));
      if (sg0!=sg1) //if the plane intersect the polygon
        break;

      ++j;
    }

    if (j<pol.npol)          //ok, let's test with the second plane
    {
      char sg1=off_sign(off_F(vtxArray[indVertP1].x,vtxArray[indVertP1].y,vtxArray[indVertP1].z,A2,B2,C2,D2));//tells if vertex is left or right of the plane

      j=1;
      while (j<pol.npol)
      {
        //unsigned long indVertPi=faceArray[i+j];  //polyg's j-th vertex index in vtxTable
        Coords vertPi=vtxArray[faceArray[i+j]];
        if (sg1!=off_sign(off_F(vertPi.x,vertPi.y,vertPi.z,A2,B2,C2,D2)))//if the plane intersect the polygon
          break;
        ++j;
      }
      if (j<pol.npol)
      {
#ifdef OFF_LEGACY
        if (t_size>OFF_INTERSECT_MAX)
        {
          fprintf(stderr, "Warning: number of intersection exceeded (%d) (interoff-lib/off_clip_3D_mod)\n", OFF_INTERSECT_MAX);
            return (t_size);
        }
#endif
        //both planes intersect the polygon, let's find the intersection point
        //our polygon :
        int k;
        for (k=0; k<pol.npol; ++k)
        {
          Coords vertPk=vtxArray[faceArray[i+k]];
          pol.p[3*k]  =vertPk.x;
          pol.p[3*k+1]=vertPk.y;
          pol.p[3*k+2]=vertPk.z;
        }
        pol.normal=normalArray[indPoly];
        intersection x;
        if (off_intersectPoly(&x, a, b, pol))
        {
          x.index = indPoly;
#ifdef OFF_LEGACY
          t[t_size++]=x;
#else
	  /* Check against our 4 existing times, starting from [-FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX] */
	  /* Case 1, negative time? */
	  if (t_size < 4) t_size++;	  
	  if (x.time < 0) {
	    if (x.time > t[0].time) {
	      t[0]=x;
	    }
	  } else {
	    /* Case 2, positive time */
	    intersection xtmp;
	    if (x.time < t[3].time) {
	      t[3]=x;
	      if (t[3].time < t[2].time) {
		xtmp = t[2];
		t[2] = t[3];
		t[3] = xtmp;
	      }
	      if (t[2].time < t[1].time) {
		xtmp = t[1];
		t[1] = t[2];
		t[2] = xtmp;
	      }
	    } 
	  }
#endif
	}
      } /* if (j<pol.npol) */
    } /* if (j<pol.npol) */
    i += pol.npol;
    indPoly++;
  } /* while i<faceSize */
  return t_size;
} /* off_clip_3D_mod */

// off_clip_3D_mod_grav *************************************************************
/*******************************************************************************
version of off_clip_3D_mod_grav
*******************************************************************************/
#pragma acc routine seq
int off_clip_3D_mod_grav(intersection* t, Coords pos, Coords vel, Coords acc,
  Coords* vtxArray, unsigned long vtxSize, unsigned long* faceArray,
  unsigned long faceSize, Coords* normalArray, double* DArray)
{
  int t_size=0;
  MCNUM popol[3*CHAR_BUF_LENGTH];
  double plane_Eq [4];
  double quadratic [3];
  unsigned long i=0,indPoly=0;
  //exploring the polygons :
  i=indPoly=0;
  while (i<faceSize)
  {
    polygon pol;
    pol.npol  = faceArray[i];                //nb vertex of polygon
    pol.p     = popol;
    pol.normal= coords_set(0,0,1);
    unsigned long indVertP1=faceArray[++i];  //polygon's first vertex index in vtxTable
    
    if (t_size>CHAR_BUF_LENGTH)
      {
	fprintf(stderr, "Warning: number of intersection exceeded (%d) (interoff-lib/off_clip_3D_mod)\n", CHAR_BUF_LENGTH);
	return (t_size);
      }
    //both planes intersect the polygon, let's find the intersection point
    //our polygon :
    int k;
    for (k=0; k<pol.npol; ++k)
      {
	Coords vertPk=vtxArray[faceArray[i+k]];
	pol.p[3*k]  =vertPk.x;
	pol.p[3*k+1]=vertPk.y;
	pol.p[3*k+2]=vertPk.z;
      }
    pol.normal=normalArray[indPoly];
    pol.D=DArray[indPoly];
    p_to_quadratic(pol.normal, pol.D, acc, pos, vel, quadratic);
    double x1, x2;
    int nsol = quadraticSolve(quadratic, &x1, &x2);

    if (nsol >= 1) {
      double time = 1.0e36;
      if (x1 < time && x1 > 0.0) {
	time = x1;
      }
      if (nsol == 2 && x2 < time && x2 > 0.0) {
	time = x2;
      }
      if (time != 1.0e36) {
	intersection inters;
	double t2 = time * time * 0.5;
	double tx = pos.x + time * vel.x;
	if (acc.x != 0.0) {
	  tx = tx + t2 * acc.x;
	}
	double ty = pos.y + time * vel.y;
	if (acc.y != 0.0) {
	  ty = ty + t2 * acc.y;
	}
	double tz = pos.z + time * vel.z;
	if (acc.z != 0.0) {
	  tz = tz + t2 * acc.z;
	}
	inters.v = coords_set(tx, ty, tz);
	Coords tvel = coords_set(vel.x + time * acc.x,
				 vel.y + time * acc.y,
				 vel.z + time * acc.z);
	inters.time = time;
	inters.normal = pol.normal;
	inters.index = indPoly;
	int res=off_pnpoly(pol,inters.v);
	if (res != 0) {
	  inters.edge=(res==-1);
	  MCNUM ndir = scalar_prod(pol.normal.x,pol.normal.y,pol.normal.z,tvel.x,tvel.y,tvel.z);
	  if (ndir<0) {
	    inters.in_out=1;  //the negative dot product means we enter the surface
	  } else {
	    inters.in_out=-1;
	  }
#ifdef OFF_LEGACY
          t[t_size++]=inters;
#else
    /* Check against our 4 existing times, starting from [-FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX] */
    /* Case 1, negative time? */
    if (t_size < 4) t_size++;
    if (inters.time < 0) {
      if (inters.time > t[0].time) {
        t[0]=inters;
      }
    } else {
      /* Case 2, positive time */
      intersection xtmp;
      if (inters.time < t[3].time) {
      t[3]=inters;
        if (t[3].time < t[2].time) {
    xtmp = t[2];
    t[2] = t[3];
    t[3] = xtmp;
        }
        if (t[2].time < t[1].time) {
    xtmp = t[1];
    t[1] = t[2];
    t[2] = xtmp;
        }
      }
    }
#endif
	}
      }
    }
    i += pol.npol;
    indPoly++;
  } /* while i<faceSize */
  return t_size;
} /* off_clip_3D_mod_grav */

// off_compare *****************************************************************
#pragma acc routine
int off_compare (void const *a, void const *b)
{
   intersection const *pa = a;
   intersection const *pb = b;

   return off_sign(pa->time - pb->time);
} /* off_compare */

// off_cleanDouble *************************************************************
//given an array of intersections throw those which appear several times
//returns 1 if there is a possibility of error
#pragma acc routine
int off_cleanDouble(intersection* t, int* t_size)
{
  int i=1;
  intersection prev=t[0];
  while (i<*t_size)
  {
    int j=i;
    //for each intersection with the same time
    while (j<*t_size && fabs(prev.time-t[j].time)<OFF_EPSILON)
    {
      //if the intersection is the exact same erase it
      if (prev.in_out==t[j].in_out)
      {
        int k;
        for (k=j+1; k<*t_size; ++k)
        {
          t[k-1]=t[k];
        }
        *t_size-=1;
      }
      else
        ++j;
    }
    prev=t[i];
    ++i;

  }
  return 1;
} /* off_cleanDouble */

// off_cleanInOut **************************************************************
//given an array of intesections throw those which enter and exit in the same time
//Meaning the ray passes very close to the volume
//returns 1 if there is a possibility of error
#pragma acc routine
int off_cleanInOut(intersection* t, int* t_size)
{
  int i=1;
  intersection prev=t[0];
  while (i<*t_size)
  {
    //if two intersection have the same time but one enters and the other exits erase both
    //(such intersections must be adjacent in the array : run off_cleanDouble before)
    if (fabs(prev.time-t[i].time)<OFF_EPSILON && prev.in_out!=t[i].in_out)
    {
      int j=0;
      for (j=i+1; j<*t_size; ++j)
      {
        t[j-2]=t[j];
      }
      *t_size-=2;
      prev=t[i-1];
    }
    else
    {
      prev=t[i];
      ++i;
    }
  }
  return (*t_size);
} /* off_cleanInOut */

/* PUBLIC functions ******************************************************** */

/*******************************************************************************
* long off_init(  char *offfile, double xwidth, double yheight, double zdepth, off_struct* data)
* ACTION: read an OFF file, optionally center object and rescale, initialize OFF data structure
* INPUT: 'offfile' OFF file to read
*        'xwidth,yheight,zdepth' if given as non-zero, apply bounding box.
*           Specifying only one of these will also use the same ratio on all axes
*        'notcenter' center the object to the (0,0,0) position in local frame when set to zero
* RETURN: number of polyhedra and 'data' OFF structure
*******************************************************************************/
long off_init(  char *offfile, double xwidth, double yheight, double zdepth,
                int notcenter, off_struct* data)
{
  // data to be initialized
  long    vtxSize =0, polySize=0, i=0, ret=0, faceSize=0;
  Coords* vtxArray        =NULL;
  Coords* normalArray     =NULL;
  double* DArray          =NULL;
  unsigned long* faceArray=NULL;
  FILE*   f               =NULL; /* the FILE with vertices and polygons */
  double minx=FLT_MAX,maxx=-FLT_MAX,miny=FLT_MAX,maxy=-FLT_MAX,minz=FLT_MAX,maxz=-FLT_MAX;

  // get the indexes
  if (!data) return(0);

  MPI_MASTER(
  printf("Loading geometry file (OFF/PLY): %s\n", offfile);
  );

  f=off_getBlocksIndex(offfile,&vtxSize,&polySize);
  if (!f) return(0);

  // read vertex table = [x y z | x y z | ...] =================================
  // now we read the vertices as 'vtxSize*3' numbers and store it in vtxArray
  MPI_MASTER(
  printf("  Number of vertices: %ld\n", vtxSize);
  );
  vtxArray   = malloc(vtxSize*sizeof(Coords));
  if (!vtxArray) return(0);
  i=0;
  while (i<vtxSize && ~feof(f))
  {
    double x,y,z;
    ret=fscanf(f, "%lg%lg%lg", &x,&y,&z);
    if (!ret) {
      // invalid line: we skip it (probably a comment)
      char line[CHAR_BUF_LENGTH];
      char *s=fgets(line, CHAR_BUF_LENGTH, f);
      continue;
    }
    if (ret != 3) {
      fprintf(stderr, "Error: can not read [xyz] coordinates for vertex %li in file %s (interoff/off_init). Read %li values.\n",
        i, offfile, ret);
      exit(2);
    }
    vtxArray[i].x=x;
    vtxArray[i].y=y;
    vtxArray[i].z=z;

    //bounding box
    if (vtxArray[i].x<minx) minx=vtxArray[i].x;
    if (vtxArray[i].x>maxx) maxx=vtxArray[i].x;
    if (vtxArray[i].y<miny) miny=vtxArray[i].y;
    if (vtxArray[i].y>maxy) maxy=vtxArray[i].y;
    if (vtxArray[i].z<minz) minz=vtxArray[i].z;
    if (vtxArray[i].z>maxz) maxz=vtxArray[i].z;
    i++; // inquire next vertex
  }

  // resizing and repositioning params
  double centerx=0, centery=0, centerz=0;
  if (!notcenter) {
    centerx=(minx+maxx)*0.5;
    centery=(miny+maxy)*0.5;
    centerz=(minz+maxz)*0.5;
  }

  double rangex=-minx+maxx,
         rangey=-miny+maxy,
         rangez=-minz+maxz;

  double ratiox=1,ratioy=1,ratioz=1;

  if (xwidth && rangex)
  {
    ratiox=xwidth/rangex;
    ratioy=ratiox;
    ratioz=ratiox;
  }

  if (yheight && rangey)
  {
    ratioy=yheight/rangey;
    if(!xwidth)  ratiox=ratioy;
    ratioz=ratioy;
  }

  if (zdepth && rangez)
  {
    ratioz=zdepth/rangez;
    if(!xwidth)  ratiox=ratioz;
    if(!yheight) ratioy=ratioz;
  }

  rangex *= ratiox;
  rangey *= ratioy;
  rangez *= ratioz;

  //center and resize the object
  for (i=0; i<vtxSize; ++i)
  {
    vtxArray[i].x=(vtxArray[i].x-centerx)*ratiox+(!notcenter ? 0 : centerx);
    vtxArray[i].y=(vtxArray[i].y-centery)*ratioy+(!notcenter ? 0 : centery);
    vtxArray[i].z=(vtxArray[i].z-centerz)*ratioz+(!notcenter ? 0 : centerz);
  }

  // read face table = [nbvertex v1 v2 vn | nbvertex v1 v2 vn ...] =============
  MPI_MASTER(
  printf("  Number of polygons: %ld\n", polySize);
  );
  normalArray= malloc(polySize*sizeof(Coords));
  faceArray  = malloc(polySize*10*sizeof(unsigned long)); // we assume polygons have less than 9 vertices
  DArray     = malloc(polySize*sizeof(double));
  if (!normalArray || !faceArray || !DArray) return(0);

  // fill faces
  faceSize=0;
  i=0;
  while (i<polySize && ~feof(f)) {
    int  nbVertex=0, j=0;
    // read the length of this polygon
    ret=fscanf(f, "%d", &nbVertex);
    if (!ret) {
      // invalid line: we skip it (probably a comment)
      char line[CHAR_BUF_LENGTH];
      char *s=fgets(line, CHAR_BUF_LENGTH, f);
      continue;
    }
    if (ret != 1) {
      fprintf(stderr, "Error: can not read polygon %li length in file %s (interoff/off_init)\n",
        i, offfile);
      exit(3);
    }
    if (faceSize > polySize*10) {
      fprintf(stderr, "Error: %li exceeded allocated polygon array[%li] in file %s (interoff/off_init)\n",
        faceSize, polySize*10, offfile);
    }
    faceArray[faceSize++] = nbVertex; // length of the polygon/face
    // then read the vertex ID's
    for (j=0; j<nbVertex; j++) {
      double vtx=0;
      ret=fscanf(f, "%lg", &vtx);
      faceArray[faceSize++] = vtx;   // add vertices index after length of polygon
    }
    i++;
  }

  // precomputes normals
  long indNormal=0;//index in polyArray
  i=0;    //index in faceArray
  while (i<faceSize)
  {
    int    nbVertex=faceArray[i];//nb of vertices of this polygon
    double *vertices=malloc(3*nbVertex*sizeof(double));
    if (!vertices) {
      fprintf(stderr,"Error allocating vertex array sized %i\n",nbVertex);
      exit(-1);
    }
    int j;

    for (j=0; j<nbVertex; ++j)
    {
      unsigned long indVertPj=faceArray[i+j+1];
      vertices[3*j]  =vtxArray[indVertPj].x;
      vertices[3*j+1]=vtxArray[indVertPj].y;
      vertices[3*j+2]=vtxArray[indVertPj].z;
    }

    polygon p;
    p.p   =vertices;
    p.npol=nbVertex;
    p.D=1;
    off_normal(&(p.normal),p);

    normalArray[indNormal]=p.normal;
    p.D = scalar_prod(p.normal.x,p.normal.y,p.normal.z,
		      vertices[0],vertices[1],vertices[2]);
    DArray[indNormal]=p.D;

    i += nbVertex+1;
    indNormal++;
    free(vertices);
  }

  MPI_MASTER(
  if (ratiox!=ratioy || ratiox!=ratioz || ratioy!=ratioz)
    printf("Warning: Aspect ratio of the geometry %s was modified.\n"
           "         If you want to keep the original proportions, specifiy only one of the dimensions.\n",
           offfile);
  if ( xwidth==0 && yheight==0 && zdepth==0 ) {
    printf("Warning: Neither xwidth, yheight or zdepth are defined.\n"
	   "           The file-defined (non-scaled) geometry the OFF geometry %s will be applied!\n",
           offfile);
  }
  printf("  Bounding box dimensions for geometry %s:\n", offfile);
  printf("    Length=%f (%.3f%%)\n", rangex, ratiox*100);
  printf("    Width= %f (%.3f%%)\n", rangey, ratioy*100);
  printf("    Depth= %f (%.3f%%)\n", rangez, ratioz*100);
  );

  data->vtxArray   = vtxArray;
  data->normalArray= normalArray;
  data->DArray     = DArray;
  data->faceArray  = faceArray;
  data->vtxSize    = vtxSize;
  data->polySize   = polySize;
  data->faceSize   = faceSize;
  data->filename   = offfile;
  #ifdef OPENACC
  acc_attach((void *)&vtxArray);
  acc_attach((void *)&normalArray);
  acc_attach((void *)&faceArray);
  #endif

  return(polySize);
} /* off_init */

#pragma acc routine
int Min_int(int x, int y) {
  return (x<y)? x :y;
}

 
#pragma acc routine
void merge(intersection *arr, int l, int m, int r)
{
int i, j, k;
int n1 = m - l + 1;
int n2 =  r - m;

/* create temp arrays */
intersection *L, *R;
 L = (intersection *)malloc(sizeof(intersection) * n1);
 R = (intersection *)malloc(sizeof(intersection) * n2);
 if (!L||!R) {
   fprintf(stderr,"Error allocating intersection arrays\n");
   exit(-1);
 }
/* Copy data to temp arrays L[] and R[] */
 #pragma acc loop independent
for (i = 0; i < n1; i++)
    L[i] = arr[l + i];
 #pragma acc loop independent
for (j = 0; j < n2; j++)
    R[j] = arr[m + 1+ j];

/* Merge the temp arrays back into arr[l..r]*/
i = 0;
j = 0;
k = l;

while (i < n1 && j < n2)
{
    if (L[i].time <= R[j].time)
    {
        arr[k] = L[i];
        i++;
    }
    else
    {
        arr[k] = R[j];
        j++;
    }
    k++;
}

/* Copy the remaining elements of L[], if there are any */

while (i < n1)
{
    arr[k] = L[i];
    i++;
    k++;
}

/* Copy the remaining elements of R[], if there are any */
while (j < n2)
{
    arr[k] = R[j];
    j++;
    k++;
}
free(L);
free(R);
}


#ifdef USE_OFF
#pragma acc routine
void gpusort(intersection *arr, int size)
{
  int curr_size;  // For current size of subarrays to be merged
  // curr_size varies from 1 to n/2
  int left_start; // For picking starting index of left subarray
  // to be merged
  // pcopying (R[0:n2])
  {
    for (curr_size=1; curr_size<=size-1; curr_size = 2*curr_size)
      {
	// Pick starting point of different subarrays of current size
	for (left_start=0; left_start<size-1; left_start += 2*curr_size)
	  {
	    // Find ending point of left subarray. mid+1 is starting
	    // point of right
	    int mid = left_start + curr_size - 1;

	    int right_end = Min_int(left_start + 2*curr_size - 1, size-1);

	    // Merge Subarrays arr[left_start...mid] & arr[mid+1...right_end]
	    if (mid < right_end) merge(arr, left_start, mid, right_end);
	  }
      }
  }
}
#endif

/*******************************************************************************
void p_to_quadratic(double eq[], Coords acc,
                    Coords pos, Coords vel,
                    double* teq)
* ACTION: define the quadratic for the intersection of a parabola with a plane
* INPUT: 'eq' plane equation
*        'acc' acceleration vector
*        'vel' velocity of the particle
*        'pos' position of the particle
*         equation of plane A * x + B * y + C * z - D = 0
*         eq[0] = (C*az)/2+(B*ay)/2+(A*ax)/2
*         eq[1] = C*vz+B*vy+A*vx
*         eq[2] = C*z0+B*y0+A*x0-D
* RETURN: equation of parabola: teq(0) * t^2 + teq(1) * t + teq(2)
*******************************************************************************/
void p_to_quadratic(Coords norm, MCNUM d, Coords acc, Coords pos, Coords vel,
		    double* teq)
{
  teq[0] = scalar_prod(norm.x, norm.y, norm.z, acc.x, acc.y, acc.z) * 0.5;
  teq[1] = scalar_prod(norm.x, norm.y, norm.z, vel.x, vel.y, vel.z);
  teq[2] = scalar_prod(norm.x, norm.y, norm.z, pos.x, pos.y, pos.z) - d;
  return;
}

/*******************************************************************************
int quadraticSolve(double eq[], double* x1, double* x2);
* ACTION: solves the quadratic for the roots x1 and x2 
*         eq[0] * t^2 + eq[1] * t + eq[2] = 0
* INPUT: 'eq' the coefficients of the parabola
* RETURN: roots x1 and x2 and the number of solutions
*******************************************************************************/
int quadraticSolve(double* eq, double* x1, double* x2)
{
  if (eq[0] == 0.0) { // This is a linear equation
    if (eq[1] != 0.0) { // one solution
      *x1 = -eq[2]/eq[1];
      *x2 = 1.0e36;
      return 1;
    }else { // no solutions, 1.0e36 will be ignored.
      *x1 = 1.0e36;
      *x2 = 1.0e36;
      return 0;
    }
  }
  double delta = eq[1]*eq[1]-4.0*eq[0]*eq[2];
  if (delta < 0.0) { // no solutions, both are imaginary
    *x1 = 1.0e36;
    *x2 = 1.0e36;
    return 0;
  }
  double s = 1.0;
  if (eq[1] < 0) {
    s = -1.0;
  }
  *x1 = (-eq[1] - s * sqrt(delta))/(2.0*eq[0]);
  if (eq[0] != 0.0) { //two solutions
    *x2 = eq[2]/(eq[0]*(*x1));
    return 2;
  } else { //one solution
    *x2 = 1.0e36;
    return 1;
  }
}

/*******************************************************************************
* int off_intersect_all(double* t0, double* t3,
     Coords *n0, Coords *n3,
     double x, double y, double z,
     double vx, double vy, double vz,
     double ax, double ay, double az,
     off_struct *data )
* ACTION: computes intersection of neutron trajectory with an object.
* INPUT:  x,y,z and vx,vy,vz are the position and velocity of the neutron
*         ax, ay, az are the local acceleration vector
*         data points to the OFF data structure
* RETURN: the number of polyhedral which trajectory intersects
*         t0 and t3 are the smallest incoming and outgoing intersection times
*         n0 and n3 are the corresponding normal vectors to the surface
*         data is the full OFF structure, including a list intersection type
*******************************************************************************/
int off_intersect_all(double* t0, double* t3,
     Coords *n0, Coords *n3,
     double x,  double y,  double z,
     double vx, double vy, double vz,
     double ax, double ay, double az,
     off_struct *data )
{

    int t_size = 0;
#ifdef OFF_LEGACY

    if(mcgravitation) {
      Coords pos={ x,  y,  z};
      Coords vel={vx, vy, vz};
      Coords acc={ax, ay, az};
      t_size=off_clip_3D_mod_grav(data->intersects, pos, vel, acc,
				  data->vtxArray, data->vtxSize, data->faceArray,
				  data->faceSize, data->normalArray, data->DArray );
    } else {
    ///////////////////////////////////
    // non-grav
      Coords A={x, y, z};
      Coords B={x+vx, y+vy, z+vz};
      t_size=off_clip_3D_mod(data->intersects, A, B,
			     data->vtxArray, data->vtxSize, data->faceArray,
			     data->faceSize, data->normalArray );
    }
    #ifndef OPENACC
    qsort(data->intersects, t_size, sizeof(intersection),  off_compare);
    #else
    #ifdef USE_OFF
    gpusort(data->intersects, t_size);
    #endif
    #endif
    off_cleanDouble(data->intersects, &t_size);
    off_cleanInOut(data->intersects,  &t_size);

    /*find intersections "closest" to 0 (favouring positive ones)*/
    if(t_size>0){
      int i=0;
      if(t_size>1) {
        for (i=1; i < t_size-1; i++){
          if (data->intersects[i-1].time > 0 && data->intersects[i].time > 0)
            break;
        }

	data->nextintersect=i-1;
	data->numintersect=t_size;

        if (t0) *t0 = data->intersects[i-1].time;
        if (n0) *n0 = data->intersects[i-1].normal;
        if (t3) *t3 = data->intersects[i].time;
        if (n3) *n3 = data->intersects[i].normal;
      } else {
        if (t0) *t0 = data->intersects[0].time;
	      if (n0) *n0 = data->intersects[0].normal;
      }
      /* should also return t[0].index and t[i].index as polygon ID */
      data->nextintersect=(data->intersects[data->nextintersect]).index;
      return t_size;
    }
#else
    intersection intersect4[4];
    intersect4[0].time=-FLT_MAX;
    intersect4[1].time=FLT_MAX;
    intersect4[2].time=FLT_MAX;
    intersect4[3].time=FLT_MAX;
    if(mcgravitation) {
      Coords pos={ x,  y,  z};
      Coords vel={vx, vy, vz};
      Coords acc={ax, ay, az};
      t_size=off_clip_3D_mod_grav(intersect4, pos, vel, acc,
				  data->vtxArray, data->vtxSize, data->faceArray,
				  data->faceSize, data->normalArray, data->DArray);
    } else {
    ///////////////////////////////////
    // non-grav
      Coords A={x, y, z};
      Coords B={x+vx, y+vy, z+vz};
      t_size=off_clip_3D_mod(intersect4, A, B,
	  data->vtxArray, data->vtxSize, data->faceArray, data->faceSize, data->normalArray );
    }
    if(t_size>0){
      int i=0;
      if (intersect4[0].time == -FLT_MAX) i=1;
      data->numintersect=t_size;
      if (t0) *t0 = intersect4[i].time;
      if (n0) *n0 = intersect4[i].normal;
      if (t3) *t3 = intersect4[i+1].time;
      if (n3) *n3 = intersect4[i+1].normal;

      if (intersect4[1].time == FLT_MAX)
      {
        if (t3) *t3 = 0.0;
      }

      /* should also return t[0].index and t[i].index as polygon ID */
      data->nextintersect=(int)intersect4[i].index;
      return t_size;
    }
#endif
    return 0;
} /* off_intersect */

/*******************************************************************************
* int off_intersect(double* t0, double* t3,
     Coords *n0, Coords *n3,
     double x, double y, double z,
     double vx, double vy, double vz,
     off_struct data )
* ACTION: computes intersection of neutron trajectory with an object.
* INPUT:  x,y,z and vx,vy,vz are the position and velocity of the neutron
*         data points to the OFF data structure
* RETURN: the number of polyhedral which trajectory intersects
*         t0 and t3 are the smallest incoming and outgoing intersection times
*         n0 and n3 are the corresponding normal vectors to the surface
*******************************************************************************/
int off_intersect(double* t0, double* t3,
     Coords *n0, Coords *n3,
     double x,  double y,  double z,
     double vx, double vy, double vz,
     double ax, double ay, double az,
     off_struct data )
{
  return off_intersect_all(t0, t3, n0, n3, x, y, z, vx, vy, vz, ax, ay, az, &data );
} /* off_intersect */

/*****************************************************************************
* int off_x_intersect(double* l0, double* l3,
     Coords *n0, Coords *n3,
     double x, double y, double z,
     double kx, double ky, double kz,
     off_struct data )
* ACTION: computes intersection of an xray trajectory with an object.
* INPUT:  x,y,z and kx,ky,kz, are spatial coordinates and wavevector of the x-ray
*         respectively. data points to the OFF data structure.
* RETURN: the number of polyhedral the trajectory intersects
*         l0 and l3 are the smallest incoming and outgoing intersection lengths
*         n0 and n3 are the corresponding normal vectors to the surface
*******************************************************************************/
int off_x_intersect(double *l0,double *l3,
     Coords *n0, Coords *n3,
     double x,  double y,  double z,
     double kx, double ky, double kz,
     off_struct data )
{
  /*This function simply reformats and calls off_intersect (as for neutrons)
   *by normalizing the wavevector - this will yield the intersection lengths
   *in m*/
  double jx,jy,jz,invk;
  int n;
  invk=1/sqrt(scalar_prod(kx,ky,kz,kx,ky,kz));
  jx=kx*invk;jy=ky*invk;jz=kz*invk;
  n=off_intersect(l0,l3,n0,n3,x,y,z,jx,jy,jz,0.0,0.0,0.0,data);
  return n;
}


/*******************************************************************************
* void off_display(off_struct data)
* ACTION: display up to N_VERTEX_DISPLAYED polygons from the object
*******************************************************************************/
void off_display(off_struct data)
{
    if(mcdotrace==2){
    // Estimate size of the JSON string
    const int VERTEX_OVERHEAD = 30;
    const int FACE_OVERHEAD_BASE = 20;
    const int FACE_INDEX_OVERHEAD = 15;
    int estimated_size = 256; // Base size
    estimated_size += data.vtxSize * VERTEX_OVERHEAD;

    for (int i = 0; i < data.faceSize;) {
        int num_indices = data.faceArray[i];
        estimated_size += FACE_OVERHEAD_BASE + num_indices * FACE_INDEX_OVERHEAD;
        i += num_indices + 1;
    }

    char *json_string = malloc(estimated_size);
    if (json_string == NULL) {
        fprintf(stderr, "Memory allocation failed.\n");
        return;
    }

    char *ptr = json_string;
    ptr += sprintf(ptr, "{ \"vertices\": [");

    for (int i = 0; i < data.vtxSize; i++) {
        ptr += sprintf(ptr, "[%g, %g, %g]", data.vtxArray[i].x, data.vtxArray[i].y, data.vtxArray[i].z);
        if (i < data.vtxSize - 1) {
            ptr += sprintf(ptr, ", ");
        }
    }

    ptr += sprintf(ptr, "], \"faces\": [");

    for (int i = 0; i < data.faceSize;) {
        int num = data.faceArray[i];
        ptr += sprintf(ptr, "{ \"face\": [");
        for (int j = 1; j <= num; j++) {
            ptr += sprintf(ptr, "%lu", data.faceArray[i + j]);
            if (j < num) {
                ptr += sprintf(ptr, ", ");
            }
        }
        ptr += sprintf(ptr, "]}");
        i += num + 1;
        if(i<data.faceSize){
          ptr += sprintf(ptr, ", ");
        }
    }

    ptr += sprintf(ptr, "]}");
    mcdis_polyhedron(json_string);

    free(json_string);
    }
    else {
      unsigned int i;
      double ratio=(double)(N_VERTEX_DISPLAYED)/(double)data.faceSize;
      unsigned int pixel=0;
      for (i=0; i<data.faceSize-1; i++) {
        int j;
        int nbVertex = data.faceArray[i];
        double x0,y0,z0;
        x0 = data.vtxArray[data.faceArray[i+1]].x;
        y0 = data.vtxArray[data.faceArray[i+1]].y;
        z0 = data.vtxArray[data.faceArray[i+1]].z;
        double x1=x0,y1=y0,z1=z0;
        double cmx=0,cmy=0,cmz=0;

        int drawthis = rand01() < ratio;
        // First pass, calculate center of mass location...
        for (j=1; j<=nbVertex; j++) {
          cmx = cmx+data.vtxArray[data.faceArray[i+j]].x;
          cmy = cmy+data.vtxArray[data.faceArray[i+j]].y;
          cmz = cmz+data.vtxArray[data.faceArray[i+j]].z;
        }
        cmx /= nbVertex;
        cmy /= nbVertex;
        cmz /= nbVertex;

        char pixelinfo[1024];
	char pixelinfotmp[1024];
        sprintf(pixelinfo, "%li,%li,%li,%i,%g,%g,%g,%g,%g,%g", data.mantidoffset+pixel, data.mantidoffset, data.mantidoffset+data.polySize-1, nbVertex, cmx, cmy, cmz, x1-cmx, y1-cmy, z1-cmz);
        for (j=2; j<=nbVertex; j++) {
          double x2,y2,z2;
          x2 = data.vtxArray[data.faceArray[i+j]].x;
          y2 = data.vtxArray[data.faceArray[i+j]].y;
          z2 = data.vtxArray[data.faceArray[i+j]].z;
          sprintf(pixelinfotmp, "%s,%g,%g,%g", pixelinfo, x2-cmx, y2-cmy, z2-cmz);
	  sprintf(pixelinfo,"%s",pixelinfotmp);
          if (ratio > 1 || drawthis) {
	    mcdis_line(x1,y1,z1,x2,y2,z2);
          }
          x1 = x2; y1 = y2; z1 = z2;
        }
        if (ratio > 1 || drawthis) {
	    mcdis_line(x1,y1,z1,x0,y0,z0);
          }
        if (data.mantidflag) {
          printf("MANTID_PIXEL: %s\n", pixelinfo);
          pixel++;
        }
        i += nbVertex;
      }
    }
} /* off_display */

/* end of interoff-lib.c */
#endif // INTEROFF_LIB_C

  /* Declare structures and functions only once in each instrument. */
  #ifndef POWDERN_DECL
  #define POWDERN_DECL

  struct line_data {
    double F2;       /* Value of structure factor */
    double q;        /* Qvector */
    int j;           /* Multiplicity */
    double DWfactor; /* Debye-Waller factor */
    double w;        /* Intrinsic line width */
    double Epsilon;  /* Strain=delta_d_d/d shift in ppm */
  };

  struct line_info_struct {
    struct line_data* list; /* Reflection array */
    int count;              /* Number of reflections */
    double Dd;
    double DWfactor;
    double V_0;
    double rho;
    double at_weight;
    double at_nb;
    double sigma_a;
    double sigma_i;
    char compname[256];
    double flag_barns;
    int shape;           /* 0 cylinder, 1 box, 2 sphere, 3 OFF file */
    int column_order[9]; /* column signification */
    int flag_warning;
    double dq;      /* wavevector transfer [Angs-1] */
    double Epsilon; /* global strain in ppm */
    double XsectionFactor;
    double my_s_v2_sum;
    double my_a_v;
    double my_inc;
    double lfree; // store mean free path for the last event;
    double *w_v, *q_v, *my_s_v2;
    double radius_i, xwidth_i, yheight_i, zdepth_i;
    double v; /* last velocity (cached) */
    double Nq;
    int nb_reuses, nb_refl, nb_refl_count;
    double v_min, v_max;
    double xs_Nq[CHAR_BUF_LENGTH];
    double xs_sum[CHAR_BUF_LENGTH];
    double neutron_passed;
    long xs_compute, xs_reuse, xs_calls;
  };

  // PN_list_compare *****************************************************************

  int
  PN_list_compare (const void* a, const void* b) {
    const struct line_data* pa = a;
    const struct line_data* pb = b;

    /* Sort by q */
    if (pa->q < pb->q)
      return -1;
    if (pa->q > pb->q)
      return 1;

    /* In case of tie, sort by F2 also */
    if (pa->F2 < pb->F2)
      return -1;
    if (pa->F2 > pb->F2)
      return 1;

    /* In case of tie, sort by j also */
    if (pa->j < pb->j)
      return -1;
    if (pa->j > pb->j)
      return 1;

    return 0;
  } /* PN_list_compare */

  #ifndef CIF2HKL
  #define CIF2HKL
  // hkl_filename = cif2hkl(file, options)
  //   used to convert CIF/CFL/INS file into F2(hkl)
  //   the CIF2HKL env var can point to a cif2hkl executable
  //   else the McCode binary is attempted, then the system.
  char*
  cif2hkl (char* infile, char* options) {
    char cmd[1024];
    int ret = 0;
    int found = 0;
    char* OUTFILE;
    char* inpath;

    // get filename extension
    char* ext = strrchr (infile, '.');
    if (!ext || ext == infile)
      return infile;
    else
      ext++;

    // return input when no extension or not a CIF/FullProf/ShelX file
    if (strcasecmp (ext, "cif") && strcasecmp (ext, "pcr") && strcasecmp (ext, "cfl") && strcasecmp (ext, "shx") && strcasecmp (ext, "ins")
        && strcasecmp (ext, "res"))
      return infile;

    OUTFILE = malloc (1024);
    if (!OUTFILE) {
      free (OUTFILE);
      return infile;
    }
    inpath = malloc (1024);
    if (!inpath) {
      free (OUTFILE);
      free (inpath);
      return infile;
    }

    // get input file path from read-table:Open_File
    FILE* f_infile = Open_File (infile, "r", inpath);
    if (!f_infile) {
      free (OUTFILE);
      free (inpath);
      free (f_infile);
      return infile;
    }
    fclose (f_infile);

    strncpy (OUTFILE, tmpnam (NULL), 1024); // create an output temporary file name

    // try in order the CIF2HKL env var, then the system cif2hkl, then the McCode one
    if (!found && getenv ("CIF2HKL")) {
      snprintf (cmd, 1024, "%s -o %s %s %s", getenv ("CIF2HKL"), OUTFILE, options, inpath);
      ret = system (cmd);
      if (ret != -1 && ret != 127)
        found = 1;
    }
    if (!found) {
      // try with cif2hkl command from the system PATH
      snprintf (cmd, 1024, "%s -o %s %s %s", "cif2hkl", OUTFILE, options, infile);
      ret = system (cmd);
      if (ret != -1 && ret != 127)
        found = 1;
    }
    if (!found) {
      // As a last resort, attempt with cif2hkl from $MCSTAS/bin
      snprintf (cmd, 1024, "%s%c%s%c%s -o %s %s %s", getenv (FLAVOR_UPPER) ? getenv (FLAVOR_UPPER) : MCSTAS, MC_PATHSEP_C, "bin", MC_PATHSEP_C, "cif2hkl",
                OUTFILE, options, inpath);
      ret = system (cmd);
    }
    // ret = -1:  child process could not be created
    // ret = 127: shell could not be executed in the child process
    if (ret == -1 || ret == 127) {
      free (OUTFILE);
      return (NULL);
    }

    // test if the result file has been created
    FILE* file = fopen (OUTFILE, "r");
    if (!file) {
      free (OUTFILE);
      return (NULL);
    }
    MPI_MASTER (printf ("%s: INFO: Converting %s into F2(HKL) list %s\n", __FILE__, inpath, OUTFILE); printf ("%s\n", cmd););
    fflush (NULL);
    fclose (file);
    return (OUTFILE);
  } // cif2hkl
  #endif

  int
  read_line_data (char* SC_file, struct line_info_struct* info) {
    struct line_data* list = NULL;
    int size = 0;
    t_Table sTable; /* sample data table structure from SC_file */
    int i = 0;
    int mult_count = 0;
    char flag = 0;
    double q_count = 0, j_count = 0, F2_count = 0;
    char** parsing;
    int list_count = 0;
    char* filename = NULL;

    if (!SC_file || !strlen (SC_file) || !strcmp (SC_file, "NULL")) {
      MPI_MASTER (printf ("PowderN: %s: Using incoherent elastic scattering only.\n", info->compname););
      info->count = 0;
      return (0);
    }
    filename = cif2hkl (SC_file, "--mode NUC");
    if (filename != SC_file)
      info->flag_barns = 1;                          // cif2hkl returns barns
    long retval = Table_Read (&sTable, filename, 1); /* read 1st block data from SC_file into sTable*/
    if (retval < 0) {
      fprintf (stderr, "PowderN: Could not open file %s - exiting!\n", SC_file);
      exit (-1);
    }

    /* parsing of header */
    parsing = Table_ParseHeader (sTable.header, "Vc", "V_0", "sigma_abs", "sigma_a ", "sigma_inc", "sigma_i ", "column_j", "column_d", "column_F2", "column_DW",
                                 "column_Dd", "column_inv2d", "column_1/2d", "column_sintheta/lambda", "column_q",                           /* 14 */
                                 "DW", "Debye_Waller", "delta_d_d/d", "column_F ", "V_rho", "density", "weight", "nb_atoms", "multiplicity", /* 23 */
                                 "column_ppm", "column_strain", NULL);

    if (parsing) {
      if (parsing[0] && !info->V_0)
        info->V_0 = atof (parsing[0]);
      if (parsing[1] && !info->V_0)
        info->V_0 = atof (parsing[1]);
      if (parsing[2] && !info->sigma_a)
        info->sigma_a = atof (parsing[2]);
      if (parsing[3] && !info->sigma_a)
        info->sigma_a = atof (parsing[3]);
      if (parsing[4] && !info->sigma_i)
        info->sigma_i = atof (parsing[4]);
      if (parsing[5] && !info->sigma_i)
        info->sigma_i = atof (parsing[5]);
      if (parsing[6])
        info->column_order[0] = atoi (parsing[6]);
      if (parsing[7])
        info->column_order[1] = atoi (parsing[7]);
      if (parsing[8])
        info->column_order[2] = atoi (parsing[8]);
      if (parsing[9])
        info->column_order[3] = atoi (parsing[9]);
      if (parsing[10])
        info->column_order[4] = atoi (parsing[10]);
      if (parsing[11])
        info->column_order[5] = atoi (parsing[11]);
      if (parsing[12])
        info->column_order[5] = atoi (parsing[12]);
      if (parsing[13])
        info->column_order[5] = atoi (parsing[13]);
      if (parsing[14])
        info->column_order[6] = atoi (parsing[14]);
      if (parsing[15] && info->DWfactor <= 0)
        info->DWfactor = atof (parsing[15]);
      if (parsing[16] && info->DWfactor <= 0)
        info->DWfactor = atof (parsing[16]);
      if (parsing[17] && info->Dd < 0)
        info->Dd = atof (parsing[17]);
      if (parsing[18])
        info->column_order[7] = atoi (parsing[18]);
      if (parsing[19] && !info->V_0)
        info->V_0 = 1 / atof (parsing[19]);
      if (parsing[20] && !info->rho)
        info->rho = atof (parsing[20]);
      if (parsing[21] && !info->at_weight)
        info->at_weight = atof (parsing[21]);
      if (parsing[22] && info->at_nb <= 1)
        info->at_nb = atof (parsing[22]);
      if (parsing[23] && info->at_nb <= 1)
        info->at_nb = atof (parsing[23]);
      if (parsing[24])
        info->column_order[8] = atoi (parsing[24]);
      if (parsing[25])
        info->column_order[8] = atoi (parsing[25]);
      for (i = 0; i <= 25; i++)
        if (parsing[i])
          free (parsing[i]);
      free (parsing);
    }

    if (!sTable.rows)
      exit (fprintf (stderr,
                     "PowderN: %s: Error: The number of rows in %s "
                     "should be at least %d\n",
                     info->compname, SC_file, 1));
    else
      size = sTable.rows;

    MPI_MASTER (Table_Info (sTable); printf ("PowderN: %s: Reading %d rows from %s\n", info->compname, size, SC_file););

    if (filename == SC_file) { // only when not from cif2hkl
      if (info->column_order[0] == 4 && info->flag_barns != 0)
        MPI_MASTER (printf ("PowderN: %s: Powder file probably of type Crystallographica/Fullprof (lau)\n"
                            "WARNING: but F2 unit is set to barns=1 (barns). Intensity might be 100 times too high.\n",
                            info->compname););
      if (info->column_order[0] == 17 && info->flag_barns == 0)
        MPI_MASTER (printf ("PowderN: %s: Powder file probably of type Lazy Pulver (laz)\n"
                            "WARNING: but F2 unit is set to barns=0 (fm^2). Intensity might be 100 times too low.\n",
                            info->compname););
    }
    /* allocate line_data array */
    list = (struct line_data*)malloc (size * sizeof (struct line_data));

    for (i = 0; i < size; i++) {
      /*      printf("Reading in line %i\n",i);*/
      double j = 0, d = 0, w = 0, q = 0, DWfactor = 0, F2 = 0, Epsilon = 0;
      int index;

      if (info->Dd >= 0)
        w = info->Dd;
      if (info->DWfactor > 0)
        DWfactor = info->DWfactor;
      if (info->Epsilon)
        Epsilon = info->Epsilon * 1e-6;

      /* get data from table using columns {j d F2 DW Dd inv2d q F} */
      /* column indexes start at 1, thus need to substract 1 */
      if (info->column_order[0] > 0)
        j = Table_Index (sTable, i, info->column_order[0] - 1);
      if (info->column_order[1] > 0)
        d = Table_Index (sTable, i, info->column_order[1] - 1);
      if (info->column_order[2] > 0)
        F2 = Table_Index (sTable, i, info->column_order[2] - 1);
      if (info->column_order[3] > 0)
        DWfactor = Table_Index (sTable, i, info->column_order[3] - 1);
      if (info->column_order[4] > 0)
        w = Table_Index (sTable, i, info->column_order[4] - 1);
      if (info->column_order[5] > 0 && !(info->column_order[1] > 0)) // Only use if d not read already
      {
        d = Table_Index (sTable, i, info->column_order[5] - 1);
        d = (d > 0 ? 1 / d / 2 : 0);
      }
      if (info->column_order[6] > 0 && !(info->column_order[1] > 0)) // Only use if d not read already
      {
        q = Table_Index (sTable, i, info->column_order[6] - 1);
        d = (q > 0 ? 2 * PI / q : 0);
      }
      if (info->column_order[7] > 0 && !F2) {
        F2 = Table_Index (sTable, i, info->column_order[7] - 1);
        F2 *= F2;
      }
      if (info->column_order[8] > 0 && !Epsilon) {
        Epsilon = Table_Index (sTable, i, info->column_order[8] - 1) * 1e-6;
      }

      /* assign and check values */
      j = (j > 0 ? j : 0);
      q = (d > 0 ? 2 * PI / d : 0); /* this is q */
      if (Epsilon && fabs (Epsilon) < 1e6) {
        q -= Epsilon * q; /* dq/q = -delta_d_d/d = -Epsilon */
      }
      DWfactor = (DWfactor > 0 ? DWfactor : 1);
      w = (w > 0 ? w : 0); /* this is q and d relative spreading */
      F2 = (F2 >= 0 ? F2 : 0);
      if (j == 0 || q == 0) {
        MPI_MASTER (printf ("PowderN: %s: line %i has invalid definition\n"
                            "         (mult=0 or q=0 or d=0)\n",
                            info->compname, i););
        continue;
      }
      list[list_count].j = j;
      list[list_count].q = q;
      list[list_count].DWfactor = DWfactor;
      list[list_count].w = w;
      list[list_count].F2 = F2;
      list[list_count].Epsilon = Epsilon;

      /* adjust multiplicity if j-column + multiple d-spacing lines */
      /* if  d = previous d, increase line duplication index */
      if (!q_count)
        q_count = q;
      if (!j_count)
        j_count = j;
      if (!F2_count)
        F2_count = F2;
      if (fabs (q_count - q) < 0.0001 * fabs (q) && fabs (F2_count - F2) < 0.0001 * fabs (F2) && j_count == j) {
        mult_count++;
        flag = 0;
      } else
        flag = 1;
      if (i == size - 1)
        flag = 1;
      /* else if d != previous d : just passed equivalent lines */
      if (flag) {
        if (i == size - 1)
          list_count++;
        /*   if duplication index == previous multiplicity */
        /*      set back multiplicity of previous lines to 1 */
        if ((mult_count && list_count > 0)
            && (mult_count == list[list_count - 1].j || ((list_count < size) && (i == size - 1) && (mult_count == list[list_count].j)))) {
          MPI_MASTER (printf ("PowderN: %s: Set multiplicity to 1 for lines [%i:%i]\n"
                              "         (d-spacing %g is duplicated %i times)\n",
                              info->compname, list_count - mult_count, list_count - 1, list[list_count - 1].q, mult_count););
          for (index = list_count - mult_count; index < list_count; list[index++].j = 1)
            ;
          mult_count = 1;
          q_count = q;
          j_count = j;
          F2_count = F2;
        }
        if (i == size - 1)
          list_count--;
        flag = 0;
      }
      list_count++;
    } /* end for */

    Table_Free (&sTable);

    /* sort the list with increasing q */
    qsort (list, list_count, sizeof (struct line_data), PN_list_compare);

    MPI_MASTER (printf ("PowderN: %s: Read %i reflections from file '%s'\n", info->compname, list_count, SC_file););

    // remove temporary F2(hkl) file when giving CFL/CIF/ShelX file
    if (filename != SC_file)
      unlink (filename);

    info->list = list;
    info->count = list_count;

    return (list_count);
  } /* read_line_data */

  /* computes the number of possible reflections (return value), and the total xsection 'sum' */
  /* this routine looks for a pre-computed value in the Nq and sum cache tables               */
  /* when found, the earch starts from the corresponding lower element in the table           */
  #pragma acc routine seq
  int
  calc_xsect (double v, double* qv, double* my_sv2, int count, double* sum, struct line_info_struct* line_info) {
    int Nq = 0, line = 0, line0 = 0;
    *sum = 0;

    /* check if a line_info element has been recorded already - not on OpenACC */
    #ifndef OPENACC
    if (v >= line_info->v_min && v <= line_info->v_max && line_info->neutron_passed >= CHAR_BUF_LENGTH) {
      line = (int)floor (v - line_info->v_min) * CHAR_BUF_LENGTH / (line_info->v_max - line_info->v_min);
      Nq = line_info->xs_Nq[line];
      *sum = line_info->xs_sum[line];
      if (!Nq && *sum == 0) {
        /* not yet set: we compute the sum up to the corresponding speed in the table cache */
        double line_v = line_info->v_min + line * (line_info->v_max - line_info->v_min) / CHAR_BUF_LENGTH;
        for (line0 = 0; line0 < count; line0++) {
          if (qv[line0] <= 2 * line_v) { /* q < 2*kf: restrict structural range */
            *sum += my_sv2[line0];
            if (Nq < line0 + 1)
              Nq = line0 + 1; /* determine maximum line index which can scatter */
          } else
            break;
        }
        line_info->xs_Nq[line] = Nq;
        line_info->xs_sum[line] = *sum;
        line_info->xs_compute++;
      } else
        line_info->xs_reuse++;
      line0 = Nq;
    }

    line_info->xs_calls++;
    #endif

    for (line = line0; line < count; line++) {
      if (qv[line] <= 2 * v) { /* q < 2*kf: restrict structural range */
        *sum += my_sv2[line];
        if (Nq < line + 1)
          Nq = line + 1; /* determine maximum line index which can scatter */
      } else
        break;
    }

    return (Nq);
  } /* calc_xsect */

  #endif /* !POWDERN_DECL */

/* Shared user declarations for all components types 'Monitor_nD'. */
/*******************************************************************************
*
* McStas, neutron ray-tracing package
*         Copyright 1997-2002, All rights reserved
*         Risoe National Laboratory, Roskilde, Denmark
*         Institut Laue Langevin, Grenoble, France
*
* Library: share/monitor_nd-lib.h
*
* %Identification
* Written by: EF
* Date: Aug 28, 2002
* Origin: ILL
* Modified by: TW, Nov 2020: introduced user doubles
* Release: McStas 1.6
* Version: $Revision$
*
* This file is to be imported by the monitor_nd related components
* It handles some shared functions.
*
* Usage: within SHARE
* %include "monitor_nd-lib"
*
*******************************************************************************/

#ifndef MONITOR_ND_LIB_H

#define MONITOR_ND_LIB_H "$Revision$"
#define MONnD_COORD_NMAX  30  /* max number of variables to record */

  typedef struct MonitornD_Defines
  {
    int COORD_NONE  ;
    int COORD_X     ;
    int COORD_Y     ;
    int COORD_Z     ;
    int COORD_RADIUS; 
    int COORD_VX    ;
    int COORD_VY    ;
    int COORD_VZ    ;
    int COORD_V     ;
    int COORD_T     ;
    int COORD_P     ;
    int COORD_SX    ;
    int COORD_SY    ;
    int COORD_SZ    ;
    int COORD_KX    ;
    int COORD_KY    ;
    int COORD_KZ    ;
    int COORD_K     ;
    int COORD_ENERGY;
    int COORD_LAMBDA;
    int COORD_KXY   ;
    int COORD_KYZ   ;
    int COORD_KXZ   ;
    int COORD_VXY   ;
    int COORD_VYZ   ;
    int COORD_VXZ   ;
    int COORD_HDIV  ;
    int COORD_VDIV  ;
    int COORD_ANGLE ;
    int COORD_NCOUNT;
    int COORD_THETA ;
    int COORD_PHI   ;
    int COORD_USER1 ;
    int COORD_USER2 ;
    int COORD_USER3 ;
    int COORD_USERDOUBLE0 ;
    int COORD_USERDOUBLE1 ;
    int COORD_USERDOUBLE2 ;
    int COORD_USERDOUBLE3 ;
    int COORD_USERDOUBLE4 ;
    int COORD_USERDOUBLE5 ;
    int COORD_USERDOUBLE6 ;
    int COORD_USERDOUBLE7 ;
    int COORD_USERDOUBLE8 ;
    int COORD_USERDOUBLE9 ;
    int COORD_USERDOUBLE10 ;
    int COORD_USERDOUBLE11 ;
    int COORD_USERDOUBLE12 ;
    int COORD_USERDOUBLE13 ;
    int COORD_USERDOUBLE14 ;
    int COORD_USERDOUBLE15 ;
    int COORD_XY    ;
    int COORD_XZ    ;
    int COORD_YZ    ;
    int COORD_PIXELID;

    /* token modifiers */
    int COORD_VAR   ; /* next token should be a variable or normal option */
    int COORD_MIN   ; /* next token is a min value */
    int COORD_MAX   ; /* next token is a max value */
    int COORD_DIM   ; /* next token is a bin value */
    int COORD_FIL   ; /* next token is a filename */
    int COORD_EVNT  ; /* next token is a buffer size value */
    int COORD_3HE   ; /* next token is a 3He pressure value */
    int COORD_LOG   ; /* next variable will be in log scale */
    int COORD_ABS   ; /* next variable will be in abs scale */
    int COORD_SIGNAL; /* next variable will be the signal var */
    int COORD_AUTO  ; /* set auto limits */

    char TOKEN_DEL[32]; /* token separators */

    char SHAPE_SQUARE; /* shape of the monitor */
    char SHAPE_DISK  ;
    char SHAPE_SPHERE;
    char SHAPE_CYLIND;
    char SHAPE_BANANA; /* cylinder without top/bottom, on restricted angular area */
    char SHAPE_BOX   ;
    char SHAPE_PREVIOUS;
    char SHAPE_OFF;

  } MonitornD_Defines_type;

  typedef struct MonitornD_Variables
  {
    double area;
    double Sphere_Radius     ;
    double Cylinder_Height   ;
    char   Flag_With_Borders ;   /* 2 means xy borders too */
    char   Flag_List         ;   /* 1 store 1 buffer, 2 is list all, 3 list all+append */
    char   Flag_nexusbins    ;   /* Only relevant in NeXus mode. -1 fully disable, 0 store BINS arrays if list mode, 1 store always */
    char   Flag_Multiple     ;   /* 1 when n1D, 0 for 2D */
    char   Flag_Verbose      ;
    int    Flag_Shape        ;
    char   Flag_Auto_Limits  ;   /* get limits from first Buffer */
    char   Flag_Absorb       ;   /* monitor is also a slit */
    char   Flag_per_cm2      ;   /* flux is per cm2 */
    char   Flag_log          ;   /* log10 of the flux */
    char   Flag_parallel     ;   /* set neutron state back after detection (parallel components) */
    char   Flag_Binary_List  ;
    char   Flag_capture      ;   /* lambda monitor with lambda/lambda(2200m/s = 1.7985 Angs) weightening */
    int    Flag_signal       ;   /* 0:monitor p, else monitor a mean value */
    int    Flag_mantid       ;   /* 0:normal monitor, else do mantid-event specifics */
    int    Flag_OFF          ;   /* Flag to indicate external geometry from OFF file */
    long long OFF_polyidx;   /* When intersection is done externally by off_intersect, this gives the 
				    polygon number, i.e. pixel index */
    unsigned long Coord_Number      ;   /* total number of variables to monitor, plus intensity (0) */
    unsigned long Coord_NumberNoPixel;  /* same but without counting PixelID */
    unsigned long Buffer_Block      ;   /* Buffer size for list or auto limits */
    long long Neutron_Counter   ;   /* event counter, simulation total counts is mcget_ncount() */
    unsigned long Buffer_Counter    ;   /* index in Buffer size (for realloc) */
    unsigned long Buffer_Size       ;
    int    Coord_Type[MONnD_COORD_NMAX];      /* type of variable */
    char   Coord_Label[MONnD_COORD_NMAX][30]; /* label of variable */
    char   Coord_Var[MONnD_COORD_NMAX][30];   /* short id of variable */
    long   Coord_Bin[MONnD_COORD_NMAX];       /* bins of variable array */
    long   Coord_BinProd[MONnD_COORD_NMAX];   /* product of bins of variable array */
    double Coord_Min[MONnD_COORD_NMAX];
    double Coord_Max[MONnD_COORD_NMAX];
    char   Monitor_Label[MONnD_COORD_NMAX*30];/* Label for monitor */
    char   Mon_File[128];                     /* output file name */

    /* these don't seem to be used anymore as they are superseded by _particle
    double cx, cy, cz;
    double cvx, cvy, cvz;
    double ckx, cky, ckz;
    double csx, csy, csz;
    double cEx, cEy, cEz;
    double cs1, cs2, ct, cphi, cp; */

    double He3_pressure;
    char   Flag_UsePreMonitor    ;   /* use a previously stored neutron parameter set */
    char   UserName1[128];
    char   UserName2[128];
    char   UserName3[128];
    char   UserVariable1[128];
    char   UserVariable2[128];
    char   UserVariable3[128];
    double UserDoubles[16];
    char   option[CHAR_BUF_LENGTH];

    long long int Nsum;
    double psum, p2sum;
    double **Mon2D_N;
    double **Mon2D_p;
    double **Mon2D_p2;
    double *Mon2D_Buffer;
    unsigned long PixelID;

    double mxmin,mxmax,mymin,mymax,mzmin,mzmax;
    double mean_dx, mean_dy, min_x, min_y, max_x, max_y, mean_p;

    char   compcurname[128];
    Coords compcurpos;
    Rotation compcurrot;
    int compcurindex;
  } MonitornD_Variables_type;

/* monitor_nd-lib function prototypes */
/* ========================================================================= */

void Monitor_nD_Init(MonitornD_Defines_type *, MonitornD_Variables_type *, MCNUM, MCNUM, MCNUM, MCNUM, MCNUM, MCNUM, MCNUM, MCNUM, MCNUM, int, int);
#pragma acc routine
int Monitor_nD_Trace(MonitornD_Defines_type *, MonitornD_Variables_type *, _class_particle* _particle);
MCDETECTOR Monitor_nD_Save(MonitornD_Defines_type *, MonitornD_Variables_type *);
void Monitor_nD_Finally(MonitornD_Defines_type *, MonitornD_Variables_type *);
void Monitor_nD_McDisplay(MonitornD_Defines_type *, MonitornD_Variables_type *);

#endif

/* end of monitor_nd-lib.h */
/*******************************************************************************
*
* McStas, neutron ray-tracing package
*         Copyright 1997-2002, All rights reserved
*         Risoe National Laboratory, Roskilde, Denmark
*         Institut Laue Langevin, Grenoble, France
*
* Library: share/monitor_nd-lib.c
*
* %Identification
* Written by: EF
* Date: Aug 28, 2002
* Origin: ILL
* Modified by: TW, Nov 2020: introduced user doubles
* Release: McStas 1.6
* Version: $Revision$
*
* This file is to be imported by the monitor_nd related components
* It handles some shared functions. Embedded within instrument in runtime mode.
*
* Usage: within SHARE
* %include "monitor_nd-lib"
*
*******************************************************************************/

#ifndef MONITOR_ND_LIB_H
#error McStas : please import this library with %include "monitor_nd-lib"
#endif

/* ========================================================================= */
/* Monitor_nD_Init: this routine is used to parse options                    */
/* ========================================================================= */

void Monitor_nD_Init(MonitornD_Defines_type *DEFS,
  MonitornD_Variables_type *Vars,
  MCNUM xwidth,
  MCNUM yheight,
  MCNUM zdepth,
  MCNUM xmin,
  MCNUM xmax,
  MCNUM ymin,
  MCNUM ymax,
  MCNUM zmin,
  MCNUM zmax,
  int offflag,
  int nexusbins)
  {
    long carg = 1;
    char *option_copy, *token;
    char Flag_New_token = 1;
    char Flag_End       = 1;
    char Flag_All       = 0;
    char Flag_No        = 0;
    char Flag_abs       = 0;
    int  Flag_auto      = 0;  /* -1: all, 1: the current variable */
    int  Set_Vars_Coord_Type;
    char Set_Vars_Coord_Label[64];
    char Set_Vars_Coord_Var[64];
    char Short_Label[MONnD_COORD_NMAX][64];
    int  Set_Coord_Mode;
    long i=0, j=0;
    double lmin, lmax, XY=0;
    long t;
    int N_spatial_dims=0;

    t = (long)time(NULL);

/* initialize DEFS */
/* Variables to monitor */
    DEFS->COORD_NONE   =0;
    DEFS->COORD_X      =1;
    DEFS->COORD_Y      =2;
    DEFS->COORD_Z      =3;
    DEFS->COORD_RADIUS =19;
    DEFS->COORD_VX     =4;
    DEFS->COORD_VY     =5;
    DEFS->COORD_VZ     =6;
    DEFS->COORD_V      =16;
    DEFS->COORD_T      =7;
    DEFS->COORD_P      =8;
    DEFS->COORD_SX     =9;
    DEFS->COORD_SY     =10;
    DEFS->COORD_SZ     =11;
    DEFS->COORD_KX     =12;
    DEFS->COORD_KY     =13;
    DEFS->COORD_KZ     =14;
    DEFS->COORD_K      =15;
    DEFS->COORD_ENERGY =17;
    DEFS->COORD_LAMBDA =18;
    DEFS->COORD_HDIV   =20;
    DEFS->COORD_VDIV   =21;
    DEFS->COORD_ANGLE  =22;
    DEFS->COORD_NCOUNT =23;
    DEFS->COORD_THETA  =24;
    DEFS->COORD_PHI    =25;
    DEFS->COORD_USER1  =26;
    DEFS->COORD_USER2  =27;
    DEFS->COORD_USER3  =28;
    DEFS->COORD_USERDOUBLE0=39;
    DEFS->COORD_USERDOUBLE1=40;
    DEFS->COORD_USERDOUBLE2=41;
    DEFS->COORD_USERDOUBLE3=42;
    DEFS->COORD_USERDOUBLE4=43;
    DEFS->COORD_USERDOUBLE5=44;
    DEFS->COORD_USERDOUBLE6=45;
    DEFS->COORD_USERDOUBLE7=46;
    DEFS->COORD_USERDOUBLE8=47;
    DEFS->COORD_USERDOUBLE9=48;
    DEFS->COORD_USERDOUBLE10=49;
    DEFS->COORD_USERDOUBLE11=50;
    DEFS->COORD_USERDOUBLE12=51;
    DEFS->COORD_USERDOUBLE13=52;
    DEFS->COORD_USERDOUBLE14=53;
    DEFS->COORD_USERDOUBLE15=54;
    DEFS->COORD_XY     =37;
    DEFS->COORD_YZ     =31;
    DEFS->COORD_XZ     =32;
    DEFS->COORD_VXY    =30;
    DEFS->COORD_VYZ    =34;
    DEFS->COORD_VXZ    =36;
    DEFS->COORD_KXY    =29;
    DEFS->COORD_KYZ    =33;
    DEFS->COORD_KXZ    =35;
    DEFS->COORD_PIXELID=38;

/* token modifiers */
    DEFS->COORD_VAR    =0;    /* next token should be a variable or normal option */
    DEFS->COORD_MIN    =1;    /* next token is a min value */
    DEFS->COORD_MAX    =2;    /* next token is a max value */
    DEFS->COORD_DIM    =3;    /* next token is a bin value */
    DEFS->COORD_FIL    =4;    /* next token is a filename */
    DEFS->COORD_EVNT   =5;    /* next token is a buffer size value */
    DEFS->COORD_3HE    =6;    /* next token is a 3He pressure value */
    DEFS->COORD_LOG    =64;   /* next variable will be in log scale */
    DEFS->COORD_ABS    =128;  /* next variable will be in abs scale */
    DEFS->COORD_SIGNAL =256;  /* next variable will be the signal var */
    DEFS->COORD_AUTO   =512;  /* set auto limits */

    strcpy(DEFS->TOKEN_DEL, " =,;[](){}:");  /* token separators */

    DEFS->SHAPE_SQUARE =0;    /* shape of the monitor */
    DEFS->SHAPE_DISK   =1;
    DEFS->SHAPE_SPHERE =2;
    DEFS->SHAPE_CYLIND =3;
    DEFS->SHAPE_BANANA =4;
    DEFS->SHAPE_BOX    =5;
    DEFS->SHAPE_PREVIOUS=6;
    DEFS->SHAPE_OFF=7;

    Vars->Sphere_Radius     = 0;
    Vars->Cylinder_Height   = 0;
    Vars->Flag_With_Borders = 0;   /* 2 means xy borders too */
    Vars->Flag_List         = 0;   /* 1=store 1 buffer, 2=list all, 3=re-use buffer */
    Vars->Flag_nexusbins    = 0;   /* NeXus only: -1=disable, 0=enable for list mode, 1=enable for all monitors */
                                   /*  (Actual control of variable happens in comp INIT) */
    Vars->Flag_Multiple     = 0;   /* 1 when n1D, 0 for 2D */
    Vars->Flag_Verbose      = 0;
    Vars->Flag_Shape        = DEFS->SHAPE_SQUARE;
    Vars->Flag_Auto_Limits  = 0;   /* get limits from first Buffer */
    Vars->Flag_Absorb       = 0;   /* monitor is also a slit */
    Vars->Flag_per_cm2      = 0;   /* flux is per cm2 */
    Vars->Flag_log          = 0;   /* log10 of the flux */
    Vars->Flag_parallel     = 0;   /* set neutron state back after detection (parallel components) */
    Vars->Flag_Binary_List  = 0;   /* save list as a binary file (smaller) */
    Vars->Coord_Number      = 0;   /* total number of variables to monitor, plus intensity (0) */
    Vars->Coord_NumberNoPixel=0;   /* same but without counting PixelID */

    Vars->Buffer_Block      = MONND_BUFSIZ;     /* Buffer size for list or auto limits */	
    Vars->Neutron_Counter   = 0;   /* event counter, simulation total counts is mcget_ncount() */
    Vars->Buffer_Counter    = 0;   /* index in Buffer size (for realloc) */
    Vars->Buffer_Size       = 0;
    Vars->He3_pressure      = 0;
    Vars->Flag_capture      = 0;
    Vars->Flag_signal       = DEFS->COORD_P;
    Vars->Flag_mantid       = 0;
    Vars->Flag_OFF          = offflag;
    Vars->OFF_polyidx       = -1;
    Vars->mean_dx=Vars->mean_dy=0;
    Vars->min_x = Vars->max_x  =0;
    Vars->min_y = Vars->max_y  =0;

    Set_Vars_Coord_Type = DEFS->COORD_NONE;
    Set_Coord_Mode = DEFS->COORD_VAR;

    /* handle size parameters */
    /* normal use is with xwidth, yheight, zdepth */
    /* if xmin,xmax,ymin,ymax,zmin,zmax are non 0, use them */
    if (fabs(xmin-xmax) == 0)
      { Vars->mxmin = -fabs(xwidth)/2; Vars->mxmax = fabs(xwidth)/2; }
    else
      { if (xmin < xmax) {Vars->mxmin = xmin; Vars->mxmax = xmax;}
        else {Vars->mxmin = xmax; Vars->mxmax = xmin;}
      }
    if (fabs(ymin-ymax) == 0)
      { Vars->mymin = -fabs(yheight)/2; Vars->mymax = fabs(yheight)/2; }
    else
      { if (ymin < ymax) {Vars->mymin = ymin; Vars->mymax = ymax;}
        else {Vars->mymin = ymax; Vars->mymax = ymin;}
      }
    if (fabs(zmin-zmax) == 0)
      { Vars->mzmin = -fabs(zdepth)/2; Vars->mzmax = fabs(zdepth)/2; }
    else
      { if (zmin < zmax) {Vars->mzmin = zmin; Vars->mzmax = zmax; }
        else {Vars->mzmin = zmax; Vars->mzmax = zmin; }
      }

    if (fabs(Vars->mzmax-Vars->mzmin) == 0)
      Vars->Flag_Shape        = DEFS->SHAPE_SQUARE;
    else
      Vars->Flag_Shape        = DEFS->SHAPE_BOX;

    if (Vars->Flag_OFF) {
      N_spatial_dims++;
      Vars->Flag_Shape        = DEFS->SHAPE_OFF;
    }
    
    /* parse option string */

    option_copy = (char*)malloc(strlen(Vars->option)+1);
    if (option_copy == NULL)
    {
      fprintf(stderr,"Monitor_nD: %s cannot allocate 'options' copy (%li). Fatal.\n", Vars->compcurname, (long)strlen(Vars->option));
      exit(-1);
    }

    if (strlen(Vars->option))
    {
      Flag_End = 0;
      strcpy(option_copy, Vars->option);
    }

    if (strstr(Vars->option, "cm2") || strstr(Vars->option, "cm^2")) Vars->Flag_per_cm2 = 1;

    if (strstr(Vars->option, "binary") || strstr(Vars->option, "float"))
      Vars->Flag_Binary_List  = 1;
    if (strstr(Vars->option, "double"))
      Vars->Flag_Binary_List  = 2;

    strcpy(Vars->Coord_Label[0],"Intensity");
    strncpy(Vars->Coord_Var[0],"p",30);
    Vars->Coord_Type[0] = DEFS->COORD_P;
    Vars->Coord_Bin[0] = 1;
    Vars->Coord_Min[0] = 0;
    Vars->Coord_Max[0] = FLT_MAX;

    /* default file name is comp_name+dateID */
    sprintf(Vars->Mon_File, "%s_%li", Vars->compcurname, t);

    carg = 1;
    while((Flag_End == 0) && (carg < 128))
    {
      if (Flag_New_token) /* retain previous token or get a new one */
      {
        if (carg == 1) token=(char *)strtok(option_copy,DEFS->TOKEN_DEL);
        else token=(char *)strtok(NULL,DEFS->TOKEN_DEL);
        if (token == NULL) Flag_End=1;
      }
      Flag_New_token = 1;
      if ((token != NULL) && (strlen(token) != 0))
      {
        char iskeyword=0; /* left at 0 when variables are processed, 1 for modifiers */
        int  old_Mode;
        /* change token to lower case */
        for (i=0; i<strlen(token); i++) token[i]=tolower(token[i]);
        /* first handle option values from preceeding keyword token detected */
        old_Mode = Set_Coord_Mode;
        if (Set_Coord_Mode == DEFS->COORD_MAX)  /* max=%i */
        {
          if (!Flag_All)
            Vars->Coord_Max[Vars->Coord_Number] = atof(token);
          else
            for (i = 0; i <= Vars->Coord_Number; Vars->Coord_Max[i++] = atof(token));
          Set_Coord_Mode = DEFS->COORD_VAR; Flag_All = 0;
        }
        if (Set_Coord_Mode == DEFS->COORD_MIN)  /* min=%i */
        {
          if (!Flag_All)
            Vars->Coord_Min[Vars->Coord_Number] = atof(token);
          else
            for (i = 0; i <= Vars->Coord_Number; Vars->Coord_Min[i++] = atof(token));
          Set_Coord_Mode = DEFS->COORD_MAX;
        }
        if (Set_Coord_Mode == DEFS->COORD_DIM)  /* bins=%i */
        {
          if (!Flag_All)
            Vars->Coord_Bin[Vars->Coord_Number] = atoi(token);
          else
            for (i = 0; i <= Vars->Coord_Number; Vars->Coord_Bin[i++] = atoi(token));
          Set_Coord_Mode = DEFS->COORD_VAR; Flag_All = 0;
        }
        if (Set_Coord_Mode == DEFS->COORD_FIL)  /* file=%s */
        {
          if (!Flag_No) strncpy(Vars->Mon_File,token,128);
          else { strcpy(Vars->Mon_File,""); Vars->Coord_Number = 0; Flag_End = 1;}
          Set_Coord_Mode = DEFS->COORD_VAR;
        }
        if (Set_Coord_Mode == DEFS->COORD_EVNT) /* list=%i */
        {
          if (!strcmp(token, "all") || Flag_All) Vars->Flag_List = 2;
          else { i = (long)ceil(atof(token)); if (i) Vars->Buffer_Block = i;
            Vars->Flag_List = 1; }
          Set_Coord_Mode = DEFS->COORD_VAR; Flag_All = 0;
        }
        if (Set_Coord_Mode == DEFS->COORD_3HE)  /* pressure=%g */
        {
            Vars->He3_pressure = atof(token);
            Set_Coord_Mode = DEFS->COORD_VAR; Flag_All = 0;
        }

        /* now look for general option keywords */
        if (!strcmp(token, "borders"))  {Vars->Flag_With_Borders = 1; iskeyword=1; }
        if (!strcmp(token, "verbose"))  {Vars->Flag_Verbose      = 1; iskeyword=1; }
        if (!strcmp(token, "log"))      {Vars->Flag_log          = 1; iskeyword=1; }
        if (!strcmp(token, "abs"))      {Flag_abs                = 1; iskeyword=1; }
        if (!strcmp(token, "multiple")) {Vars->Flag_Multiple     = 1; iskeyword=1; }
        if (!strcmp(token, "list") || !strcmp(token, "events")) {
          Vars->Flag_List = 1; Set_Coord_Mode = DEFS->COORD_EVNT;  }
        if (!strcmp(token, "limits") || !strcmp(token, "min"))
          Set_Coord_Mode = DEFS->COORD_MIN;
        if (!strcmp(token, "slit") || !strcmp(token, "absorb")) {
          Vars->Flag_Absorb = 1;  iskeyword=1; }
        if (!strcmp(token, "max"))  Set_Coord_Mode = DEFS->COORD_MAX;
        if (!strcmp(token, "bins") || !strcmp(token, "dim")) Set_Coord_Mode = DEFS->COORD_DIM;
        if (!strcmp(token, "file") || !strcmp(token, "filename")) {
          Set_Coord_Mode = DEFS->COORD_FIL;
          if (Flag_No) { strcpy(Vars->Mon_File,""); Vars->Coord_Number = 0; Flag_End = 1; }
        }
        if (!strcmp(token, "inactivate")) {
          Flag_End = 1; Vars->Coord_Number = 0; iskeyword=1; }
        if (!strcmp(token, "all"))    { Flag_All = 1;  iskeyword=1; }
        if (!strcmp(token, "sphere")) { Vars->Flag_Shape = DEFS->SHAPE_SPHERE; iskeyword=1; }
        if (!strcmp(token, "cylinder")) { Vars->Flag_Shape = DEFS->SHAPE_CYLIND; iskeyword=1; }
        if (!strcmp(token, "banana")) { Vars->Flag_Shape = DEFS->SHAPE_BANANA; iskeyword=1; }
        if (!strcmp(token, "square")) { Vars->Flag_Shape = DEFS->SHAPE_SQUARE; iskeyword=1; }
        if (!strcmp(token, "disk"))   { Vars->Flag_Shape = DEFS->SHAPE_DISK; iskeyword=1; }
        if (!strcmp(token, "box"))     { Vars->Flag_Shape = DEFS->SHAPE_BOX; iskeyword=1; }
        if (!strcmp(token, "previous")) { Vars->Flag_Shape = DEFS->SHAPE_PREVIOUS; iskeyword=1; }
        if (!strcmp(token, "parallel")){ Vars->Flag_parallel = 1; iskeyword=1; }
        if (!strcmp(token, "capture")) { Vars->Flag_capture = 1; iskeyword=1; }
        if (!strcmp(token, "auto")) { 
        #ifndef OPENACC
        if (Flag_auto != -1) {
	    Vars->Flag_Auto_Limits = 1;
	    if (Flag_All) Flag_auto = -1;
	    else          Flag_auto = 1;
	    iskeyword=1; Flag_All=0; 
	  }
        #endif
	}
        if (!strcmp(token, "premonitor")) {
          Vars->Flag_UsePreMonitor = 1; iskeyword=1; }
        if (!strcmp(token, "3He_pressure") || !strcmp(token, "pressure")) {
          Vars->He3_pressure = 3; iskeyword=1; }
        if (!strcmp(token, "no") || !strcmp(token, "not")) { Flag_No = 1;  iskeyword=1; }
        if (!strcmp(token, "signal")) Set_Coord_Mode = DEFS->COORD_SIGNAL;
        if (!strcmp(token, "mantid")) { Vars->Flag_mantid = 1; iskeyword=1; }

        /* Mode has changed: this was a keyword or value  ? */
        if (Set_Coord_Mode != old_Mode) iskeyword=1;

        /* now look for variable names to monitor */
        Set_Vars_Coord_Type = DEFS->COORD_NONE; lmin = 0; lmax = 0;

        if (!strcmp(token, "x"))
          { Set_Vars_Coord_Type = DEFS->COORD_X; strcpy(Set_Vars_Coord_Label,"x [m]"); strcpy(Set_Vars_Coord_Var,"x");
          lmin = Vars->mxmin; lmax = Vars->mxmax;
          Vars->Coord_Min[Vars->Coord_Number+1] = Vars->mxmin;
          Vars->Coord_Max[Vars->Coord_Number+1] = Vars->mxmax;
	  N_spatial_dims++;}
        if (!strcmp(token, "y"))
          { Set_Vars_Coord_Type = DEFS->COORD_Y; strcpy(Set_Vars_Coord_Label,"y [m]"); strcpy(Set_Vars_Coord_Var,"y");
          lmin = Vars->mymin; lmax = Vars->mymax;
          Vars->Coord_Min[Vars->Coord_Number+1] = Vars->mymin;
          Vars->Coord_Max[Vars->Coord_Number+1] = Vars->mymax;
	  N_spatial_dims++;}
        if (!strcmp(token, "z"))
          { Set_Vars_Coord_Type = DEFS->COORD_Z; strcpy(Set_Vars_Coord_Label,"z [m]"); strcpy(Set_Vars_Coord_Var,"z"); lmin = Vars->mzmin; lmax = Vars->mzmax;
	    N_spatial_dims++;}
        if (!strcmp(token, "k") || !strcmp(token, "wavevector"))
          { Set_Vars_Coord_Type = DEFS->COORD_K; strcpy(Set_Vars_Coord_Label,"|k| [Angs-1]"); strcpy(Set_Vars_Coord_Var,"k"); lmin = 0; lmax = 10; }
        if (!strcmp(token, "v"))
          { Set_Vars_Coord_Type = DEFS->COORD_V; strcpy(Set_Vars_Coord_Label,"Velocity [m/s]"); strcpy(Set_Vars_Coord_Var,"v"); lmin = 0; lmax = 10000; }
        if (!strcmp(token, "t") || !strcmp(token, "time") || !strcmp(token, "tof"))
          { Set_Vars_Coord_Type = DEFS->COORD_T; strcpy(Set_Vars_Coord_Label,"TOF [s]"); strcpy(Set_Vars_Coord_Var,"t"); lmin = 0; lmax = 1.0; }
        if ((!strcmp(token, "p") || !strcmp(token, "i") || !strcmp(token, "intensity") || !strcmp(token, "flux")))
          { Set_Vars_Coord_Type = DEFS->COORD_P;
            strcpy(Set_Vars_Coord_Label,"Intensity");
            strncat(Set_Vars_Coord_Label, " [n/s", 30);
            if (Vars->Flag_per_cm2) strncat(Set_Vars_Coord_Label, "/cm2", 30);
            if (XY > 1 && Vars->Coord_Number)
              strncat(Set_Vars_Coord_Label, "/bin", 30);
            strncat(Set_Vars_Coord_Label, "]", 30);
            strcpy(Set_Vars_Coord_Var,"I");
            lmin = 0; lmax = FLT_MAX;
            if (Flag_auto>0) Flag_auto=0;
          }

        if (!strcmp(token, "vx"))
          { Set_Vars_Coord_Type = DEFS->COORD_VX; strcpy(Set_Vars_Coord_Label,"vx [m/s]"); strcpy(Set_Vars_Coord_Var,"vx"); lmin = -1000; lmax = 1000; }
        if (!strcmp(token, "vy"))
          { Set_Vars_Coord_Type = DEFS->COORD_VY; strcpy(Set_Vars_Coord_Label,"vy [m/s]"); strcpy(Set_Vars_Coord_Var,"vy"); lmin = -1000; lmax = 1000; }
        if (!strcmp(token, "vz"))
          { Set_Vars_Coord_Type = DEFS->COORD_VZ; strcpy(Set_Vars_Coord_Label,"vz [m/s]"); strcpy(Set_Vars_Coord_Var,"vz"); lmin = -10000; lmax = 10000; }
        if (!strcmp(token, "kx"))
          { Set_Vars_Coord_Type = DEFS->COORD_KX; strcpy(Set_Vars_Coord_Label,"kx [Angs-1]"); strcpy(Set_Vars_Coord_Var,"kx"); lmin = -1; lmax = 1; }
        if (!strcmp(token, "ky"))
          { Set_Vars_Coord_Type = DEFS->COORD_KY; strcpy(Set_Vars_Coord_Label,"ky [Angs-1]"); strcpy(Set_Vars_Coord_Var,"ky"); lmin = -1; lmax = 1; }
        if (!strcmp(token, "kz"))
          { Set_Vars_Coord_Type = DEFS->COORD_KZ; strcpy(Set_Vars_Coord_Label,"kz [Angs-1]"); strcpy(Set_Vars_Coord_Var,"kz"); lmin = -10; lmax = 10; }
        if (!strcmp(token, "sx"))
          { Set_Vars_Coord_Type = DEFS->COORD_SX; strcpy(Set_Vars_Coord_Label,"sx [1]"); strcpy(Set_Vars_Coord_Var,"sx"); lmin = -1; lmax = 1; }
        if (!strcmp(token, "sy"))
          { Set_Vars_Coord_Type = DEFS->COORD_SY; strcpy(Set_Vars_Coord_Label,"sy [1]"); strcpy(Set_Vars_Coord_Var,"sy"); lmin = -1; lmax = 1; }
        if (!strcmp(token, "sz"))
          { Set_Vars_Coord_Type = DEFS->COORD_SZ; strcpy(Set_Vars_Coord_Label,"sz [1]"); strcpy(Set_Vars_Coord_Var,"sz"); lmin = -1; lmax = 1; }

        if (!strcmp(token, "energy") || !strcmp(token, "omega") || !strcmp(token, "e"))
          { Set_Vars_Coord_Type = DEFS->COORD_ENERGY; strcpy(Set_Vars_Coord_Label,"Energy [meV]"); strcpy(Set_Vars_Coord_Var,"E"); lmin = 0; lmax = 100; }
        if (!strcmp(token, "lambda") || !strcmp(token, "wavelength") || !strcmp(token, "l"))
          { Set_Vars_Coord_Type = DEFS->COORD_LAMBDA; strcpy(Set_Vars_Coord_Label,"Wavelength [Angs]"); strcpy(Set_Vars_Coord_Var,"L"); lmin = 0; lmax = 100; }
        if (!strcmp(token, "radius") || !strcmp(token, "r"))
          { Set_Vars_Coord_Type = DEFS->COORD_RADIUS; strcpy(Set_Vars_Coord_Label,"Radius [m]"); strcpy(Set_Vars_Coord_Var,"xy"); lmin = 0; lmax = xmax; }
        if (!strcmp(token, "xy"))
          { Set_Vars_Coord_Type = DEFS->COORD_XY; strcpy(Set_Vars_Coord_Label,"Radius (xy) [m]"); strcpy(Set_Vars_Coord_Var,"xy"); lmin = 0; lmax = xmax; N_spatial_dims+=1;}
        if (!strcmp(token, "yz"))
          { Set_Vars_Coord_Type = DEFS->COORD_YZ; strcpy(Set_Vars_Coord_Label,"Radius (yz) [m]"); strcpy(Set_Vars_Coord_Var,"yz"); lmin = 0; lmax = xmax; N_spatial_dims+=1;}
        if (!strcmp(token, "xz"))
          { Set_Vars_Coord_Type = DEFS->COORD_XZ; strcpy(Set_Vars_Coord_Label,"Radius (xz) [m]"); strcpy(Set_Vars_Coord_Var,"xz"); lmin = 0; lmax = xmax; N_spatial_dims+=1;}
        if (!strcmp(token, "vxy"))
          { Set_Vars_Coord_Type = DEFS->COORD_VXY; strcpy(Set_Vars_Coord_Label,"Radial Velocity (xy) [m]"); strcpy(Set_Vars_Coord_Var,"Vxy"); lmin = 0; lmax = 2000; }
        if (!strcmp(token, "kxy"))
          { Set_Vars_Coord_Type = DEFS->COORD_KXY; strcpy(Set_Vars_Coord_Label,"Radial Wavevector (xy) [Angs-1]"); strcpy(Set_Vars_Coord_Var,"Kxy"); lmin = 0; lmax = 2; }
        if (!strcmp(token, "vyz"))
          { Set_Vars_Coord_Type = DEFS->COORD_VYZ; strcpy(Set_Vars_Coord_Label,"Radial Velocity (yz) [m]"); strcpy(Set_Vars_Coord_Var,"Vyz"); lmin = 0; lmax = 2000; }
        if (!strcmp(token, "kyz"))
          { Set_Vars_Coord_Type = DEFS->COORD_KYZ; strcpy(Set_Vars_Coord_Label,"Radial Wavevector (yz) [Angs-1]"); strcpy(Set_Vars_Coord_Var,"Kyz"); lmin = 0; lmax = 2; }
        if (!strcmp(token, "vxz"))
          { Set_Vars_Coord_Type = DEFS->COORD_VXZ; strcpy(Set_Vars_Coord_Label,"Radial Velocity (xz) [m]"); strcpy(Set_Vars_Coord_Var,"Vxz"); lmin = 0; lmax = 2000; }
        if (!strcmp(token, "kxz"))
          { Set_Vars_Coord_Type = DEFS->COORD_KXZ; strcpy(Set_Vars_Coord_Label,"Radial Wavevector (xz) [Angs-1]"); strcpy(Set_Vars_Coord_Var,"Kxz"); lmin = 0; lmax = 2; }
        if (!strcmp(token, "angle") || !strcmp(token, "a"))
          { Set_Vars_Coord_Type = DEFS->COORD_ANGLE; strcpy(Set_Vars_Coord_Label,"Angle [deg]"); strcpy(Set_Vars_Coord_Var,"A"); lmin = -50; lmax = 50; N_spatial_dims++;}
        if (!strcmp(token, "hdiv")|| !strcmp(token, "divergence") || !strcmp(token, "xdiv") || !strcmp(token, "hd") || !strcmp(token, "dx"))
          { Set_Vars_Coord_Type = DEFS->COORD_HDIV; strcpy(Set_Vars_Coord_Label,"Hor. Divergence [deg]"); strcpy(Set_Vars_Coord_Var,"hd"); lmin = -5; lmax = 5; N_spatial_dims++;}
        if (!strcmp(token, "vdiv") || !strcmp(token, "ydiv") || !strcmp(token, "vd") || !strcmp(token, "dy"))
          { Set_Vars_Coord_Type = DEFS->COORD_VDIV; strcpy(Set_Vars_Coord_Label,"Vert. Divergence [deg]"); strcpy(Set_Vars_Coord_Var,"vd"); lmin = -5; lmax = 5; N_spatial_dims++;}
        if (!strcmp(token, "theta") || !strcmp(token, "longitude") || !strcmp(token, "th"))
          { Set_Vars_Coord_Type = DEFS->COORD_THETA; strcpy(Set_Vars_Coord_Label,"Longitude [deg]"); strcpy(Set_Vars_Coord_Var,"th"); lmin = -180; lmax = 180; N_spatial_dims++;}
        if (!strcmp(token, "phi") || !strcmp(token, "latitude") || !strcmp(token, "ph"))
          { Set_Vars_Coord_Type = DEFS->COORD_PHI; strcpy(Set_Vars_Coord_Label,"Latitude [deg]"); strcpy(Set_Vars_Coord_Var,"ph"); lmin = -90; lmax = 90; N_spatial_dims++;}
        if (!strcmp(token, "ncounts") || !strcmp(token, "n") || !strcmp(token, "neutron"))
          { Set_Vars_Coord_Type = DEFS->COORD_NCOUNT; strcpy(Set_Vars_Coord_Label,"Neutron ID [1]"); strcpy(Set_Vars_Coord_Var,"n"); lmin = 0; lmax = mcget_ncount(); if (Flag_auto>0) Flag_auto=0; }
        if (!strcmp(token, "id") || !strcmp(token, "pixel"))
          { Set_Vars_Coord_Type = DEFS->COORD_PIXELID; 
            strcpy(Set_Vars_Coord_Label,"Pixel ID [1]"); 
            strcpy(Set_Vars_Coord_Var,"id"); lmin = 0; lmax = FLT_MAX; 
            if (Flag_auto>0) Flag_auto=0;
            Vars->Flag_List = 1; }
        if (!strcmp(token, "user") || !strcmp(token, "user1") || !strcmp(token, "u1"))
          { Set_Vars_Coord_Type = DEFS->COORD_USER1; strncpy(Set_Vars_Coord_Label,Vars->UserName1,30); strcpy(Set_Vars_Coord_Var,"U1"); lmin = -1e10; lmax = 1e10; }
        if (!strcmp(token, "user2") || !strcmp(token, "u2"))
          { Set_Vars_Coord_Type = DEFS->COORD_USER2; strncpy(Set_Vars_Coord_Label,Vars->UserName2,30); strcpy(Set_Vars_Coord_Var,"U2"); lmin = -1e10; lmax = 1e10; }
        if (!strcmp(token, "user3") || !strcmp(token, "u3"))
          { Set_Vars_Coord_Type = DEFS->COORD_USER3; strncpy(Set_Vars_Coord_Label,Vars->UserName3,30); strcpy(Set_Vars_Coord_Var,"U3"); lmin = -1e10; lmax = 1e10; }

        if (!strcmp(token, "userdouble0") || !strcmp(token, "ud0"))
          { Set_Vars_Coord_Type = DEFS->COORD_USERDOUBLE0; strcpy(Set_Vars_Coord_Label,"ud0 [1]"); strcpy(Set_Vars_Coord_Var,"ud0"); lmin = -1e10; lmax = 1e10; }
        if (!strcmp(token, "userdouble1") || !strcmp(token, "ud1"))
          { Set_Vars_Coord_Type = DEFS->COORD_USERDOUBLE1; strcpy(Set_Vars_Coord_Label,"ud1 [1]"); strcpy(Set_Vars_Coord_Var,"ud1"); lmin = -1e10; lmax = 1e10; }
        if (!strcmp(token, "userdouble2") || !strcmp(token, "ud2"))
          { Set_Vars_Coord_Type = DEFS->COORD_USERDOUBLE2; strcpy(Set_Vars_Coord_Label,"ud2 [1]"); strcpy(Set_Vars_Coord_Var,"ud2"); lmin = -1e10; lmax = 1e10; }
        if (!strcmp(token, "userdouble3") || !strcmp(token, "ud3"))
          { Set_Vars_Coord_Type = DEFS->COORD_USERDOUBLE3; strcpy(Set_Vars_Coord_Label,"ud3 [1]"); strcpy(Set_Vars_Coord_Var,"ud3"); lmin = -1e10; lmax = 1e10; }
        if (!strcmp(token, "userdouble4") || !strcmp(token, "ud4"))
          { Set_Vars_Coord_Type = DEFS->COORD_USERDOUBLE4; strcpy(Set_Vars_Coord_Label,"ud4 [1]"); strcpy(Set_Vars_Coord_Var,"ud4"); lmin = -1e10; lmax = 1e10; }
        if (!strcmp(token, "userdouble5") || !strcmp(token, "ud5"))
          { Set_Vars_Coord_Type = DEFS->COORD_USERDOUBLE5; strcpy(Set_Vars_Coord_Label,"ud5 [1]"); strcpy(Set_Vars_Coord_Var,"ud5"); lmin = -1e10; lmax = 1e10; }
        if (!strcmp(token, "userdouble6") || !strcmp(token, "ud6"))
          { Set_Vars_Coord_Type = DEFS->COORD_USERDOUBLE6; strcpy(Set_Vars_Coord_Label,"ud6 [1]"); strcpy(Set_Vars_Coord_Var,"ud6"); lmin = -1e10; lmax = 1e10; }
        if (!strcmp(token, "userdouble7") || !strcmp(token, "ud7"))
          { Set_Vars_Coord_Type = DEFS->COORD_USERDOUBLE7; strcpy(Set_Vars_Coord_Label,"ud7 [1]"); strcpy(Set_Vars_Coord_Var,"ud7"); lmin = -1e10; lmax = 1e10; }
        if (!strcmp(token, "userdouble8") || !strcmp(token, "ud8"))
          { Set_Vars_Coord_Type = DEFS->COORD_USERDOUBLE8; strcpy(Set_Vars_Coord_Label,"ud8 [1]"); strcpy(Set_Vars_Coord_Var,"ud8"); lmin = -1e10; lmax = 1e10; }
        if (!strcmp(token, "userdouble9") || !strcmp(token, "ud9"))
          { Set_Vars_Coord_Type = DEFS->COORD_USERDOUBLE9; strcpy(Set_Vars_Coord_Label,"ud9 [1]"); strcpy(Set_Vars_Coord_Var,"ud9"); lmin = -1e10; lmax = 1e10; }
        if (!strcmp(token, "userdouble10") || !strcmp(token, "ud10"))
          { Set_Vars_Coord_Type = DEFS->COORD_USERDOUBLE10; strcpy(Set_Vars_Coord_Label,"ud10 [1]"); strcpy(Set_Vars_Coord_Var,"ud10"); lmin = -1e10; lmax = 1e10; }
        if (!strcmp(token, "userdouble11") || !strcmp(token, "ud11"))
          { Set_Vars_Coord_Type = DEFS->COORD_USERDOUBLE11; strcpy(Set_Vars_Coord_Label,"ud11 [1]"); strcpy(Set_Vars_Coord_Var,"ud11"); lmin = -1e10; lmax = 1e10; }
        if (!strcmp(token, "userdouble12") || !strcmp(token, "ud12"))
          { Set_Vars_Coord_Type = DEFS->COORD_USERDOUBLE12; strcpy(Set_Vars_Coord_Label,"ud12 [1]"); strcpy(Set_Vars_Coord_Var,"ud12"); lmin = -1e10; lmax = 1e10; }
        if (!strcmp(token, "userdouble13") || !strcmp(token, "ud13"))
          { Set_Vars_Coord_Type = DEFS->COORD_USERDOUBLE13; strcpy(Set_Vars_Coord_Label,"ud13 [1]"); strcpy(Set_Vars_Coord_Var,"ud13"); lmin = -1e10; lmax = 1e10; }
        if (!strcmp(token, "userdouble14") || !strcmp(token, "ud14"))
          { Set_Vars_Coord_Type = DEFS->COORD_USERDOUBLE14; strcpy(Set_Vars_Coord_Label,"ud14 [1]"); strcpy(Set_Vars_Coord_Var,"ud14"); lmin = -1e10; lmax = 1e10; }
        if (!strcmp(token, "userdouble15") || !strcmp(token, "ud15"))
          { Set_Vars_Coord_Type = DEFS->COORD_USERDOUBLE15; strcpy(Set_Vars_Coord_Label,"ud15 [1]"); strcpy(Set_Vars_Coord_Var,"ud15"); lmin = -1e10; lmax = 1e10; }

        /* now stores variable keywords detected, if any */
        if (Set_Vars_Coord_Type != DEFS->COORD_NONE)
        {
          int Coord_Number = Vars->Coord_Number;
          if (Vars->Flag_log) { Set_Vars_Coord_Type |= DEFS->COORD_LOG; Vars->Flag_log = 0; }
          if (Flag_abs) { Set_Vars_Coord_Type |= DEFS->COORD_ABS; Flag_abs = 0; }
          if (Flag_auto != 0) { Set_Vars_Coord_Type |= DEFS->COORD_AUTO; 
            if (Flag_auto > 0) Flag_auto = 0; }
          if (Set_Coord_Mode == DEFS->COORD_SIGNAL)
          {
            Coord_Number = 0;
            Vars->Flag_signal = Set_Vars_Coord_Type;
          }
          else
          {
            if (Coord_Number < MONnD_COORD_NMAX)
            { Coord_Number++;
              Vars->Coord_Number = Coord_Number; 
              if (Set_Vars_Coord_Type != DEFS->COORD_PIXELID)
                Vars->Coord_NumberNoPixel++;
            }
            else if (Vars->Flag_Verbose) printf("Monitor_nD: %s reached max number of variables (%i).\n", Vars->compcurname, MONnD_COORD_NMAX);
          }
          Vars->Coord_Type[Coord_Number] = Set_Vars_Coord_Type;
          strncpy(Vars->Coord_Label[Coord_Number], Set_Vars_Coord_Label,30);
          strncpy(Vars->Coord_Var[Coord_Number], Set_Vars_Coord_Var,30);
          if (lmin > lmax) { XY = lmin; lmin=lmax; lmax = XY; }
          Vars->Coord_Min[Coord_Number] = lmin;
          Vars->Coord_Max[Coord_Number] = lmax;
          if (Set_Vars_Coord_Type == DEFS->COORD_NCOUNT || Set_Vars_Coord_Type == DEFS->COORD_PIXELID || Set_Vars_Coord_Type == DEFS->COORD_SIGNAL)
            Vars->Coord_Bin[Coord_Number] = 1;
          else
            Vars->Coord_Bin[Coord_Number] = 20;
          Set_Coord_Mode = DEFS->COORD_VAR;
          Flag_All = 0;
          Flag_No  = 0;
        } else {
          /* no variable name could be read from options */
          if (!iskeyword) {
            if (strcmp(token, "cm2") && strcmp(token, "incoming")
             && strcmp(token, "outgoing") && strcmp(token, "cm2")
             && strcmp(token, "cm^2") && strcmp(token, "float")
             && strcmp(token, "double") && strcmp(token, "binary")
             && strcmp(token, "steradian") && Vars->Flag_Verbose)
              printf("Monitor_nD: %s: unknown '%s' keyword in 'options'. Ignoring.\n", Vars->compcurname, token);
          }
        }
      carg++;
      } /* end if token */
    } /* end while carg */

    /* Handle nexusbins information */
    /* Case 1, list mode and not disabled i.e. >-1 */
    if (Vars->Flag_List && nexusbins>-1) Vars->Flag_nexusbins=1;
    /* Case 2, NOT list mode and enabled i.e. ==1 */
    if (!Vars->Flag_List && nexusbins==1) Vars->Flag_nexusbins=1;

    free(option_copy);
    if (carg == 128) printf("Monitor_nD: %s reached max number of tokens (%i). Skipping.\n", Vars->compcurname, 128);

    if ((Vars->Flag_Shape == DEFS->SHAPE_BOX) && (fabs(Vars->mzmax - Vars->mzmin) == 0)) Vars->Flag_Shape = DEFS->SHAPE_SQUARE;

    if (Vars->Flag_log == 1) Vars->Coord_Type[0] |= DEFS->COORD_LOG;
    if (Vars->Coord_Number == 0)
    { Vars->Flag_Auto_Limits=0; Vars->Flag_Multiple=0; Vars->Flag_List=0; }

    /* now setting Monitor Name from variable labels */
    strcpy(Vars->Monitor_Label,"");
    XY = 1; /* will contain total bin number */
    for (i = 0; i <= Vars->Coord_Number; i++)
    {
      if (Flag_auto != 0) Vars->Coord_Type[i] |= DEFS->COORD_AUTO;
      Set_Vars_Coord_Type = (Vars->Coord_Type[i] & (DEFS->COORD_LOG-1));
      if ((Set_Vars_Coord_Type == DEFS->COORD_X)
       || (Set_Vars_Coord_Type == DEFS->COORD_Y)
       || (Set_Vars_Coord_Type == DEFS->COORD_Z))
       strcpy(Short_Label[i],"Position");
      else
      if ((Set_Vars_Coord_Type == DEFS->COORD_THETA)
       || (Set_Vars_Coord_Type == DEFS->COORD_PHI)
       || (Set_Vars_Coord_Type == DEFS->COORD_ANGLE))
       strcpy(Short_Label[i],"Angle");
      else
      if ((Set_Vars_Coord_Type == DEFS->COORD_XY)
       || (Set_Vars_Coord_Type == DEFS->COORD_XZ)
       || (Set_Vars_Coord_Type == DEFS->COORD_YZ)
       || (Set_Vars_Coord_Type == DEFS->COORD_RADIUS))
       strcpy(Short_Label[i],"Radius");
      else
      if ((Set_Vars_Coord_Type == DEFS->COORD_VX)
       || (Set_Vars_Coord_Type == DEFS->COORD_VY)
       || (Set_Vars_Coord_Type == DEFS->COORD_VZ)
       || (Set_Vars_Coord_Type == DEFS->COORD_V)
       || (Set_Vars_Coord_Type == DEFS->COORD_VXY)
       || (Set_Vars_Coord_Type == DEFS->COORD_VYZ)
       || (Set_Vars_Coord_Type == DEFS->COORD_VXZ))
       strcpy(Short_Label[i],"Velocity");
      else
      if ((Set_Vars_Coord_Type == DEFS->COORD_KX)
       || (Set_Vars_Coord_Type == DEFS->COORD_KY)
       || (Set_Vars_Coord_Type == DEFS->COORD_KZ)
       || (Set_Vars_Coord_Type == DEFS->COORD_KXY)
       || (Set_Vars_Coord_Type == DEFS->COORD_KYZ)
       || (Set_Vars_Coord_Type == DEFS->COORD_KXZ)
       || (Set_Vars_Coord_Type == DEFS->COORD_K))
       strcpy(Short_Label[i],"Wavevector");
      else
      if ((Set_Vars_Coord_Type == DEFS->COORD_SX)
       || (Set_Vars_Coord_Type == DEFS->COORD_SY)
       || (Set_Vars_Coord_Type == DEFS->COORD_SZ))
       strcpy(Short_Label[i],"Spin");
      else
      if ((Set_Vars_Coord_Type == DEFS->COORD_HDIV)
       || (Set_Vars_Coord_Type == DEFS->COORD_VDIV))
       strcpy(Short_Label[i],"Divergence");
      else
      if (Set_Vars_Coord_Type == DEFS->COORD_ENERGY)
       strcpy(Short_Label[i],"Energy");
      else
      if (Set_Vars_Coord_Type == DEFS->COORD_LAMBDA)
       strcpy(Short_Label[i],"Wavelength");
      else
      if (Set_Vars_Coord_Type == DEFS->COORD_NCOUNT)
       strcpy(Short_Label[i],"Neutron_ID");
      else
      if (Set_Vars_Coord_Type == DEFS->COORD_PIXELID)
       strcpy(Short_Label[i],"Pixel_ID");
      else
      if (Set_Vars_Coord_Type == DEFS->COORD_T)
          strcpy(Short_Label[i],"Time_Of_Flight");
      else
      if (Set_Vars_Coord_Type == DEFS->COORD_P)
          strcpy(Short_Label[i],"Intensity");
      else
      if (Set_Vars_Coord_Type == DEFS->COORD_USER1)
          strncpy(Short_Label[i],Vars->UserName1,30);
      else
      if (Set_Vars_Coord_Type == DEFS->COORD_USER2)
          strncpy(Short_Label[i],Vars->UserName2,30);
      else
      if (Set_Vars_Coord_Type == DEFS->COORD_USER3)
          strncpy(Short_Label[i],Vars->UserName3,30);
      else
          strcpy(Short_Label[i],"Unknown");

      if (Vars->Coord_Type[i] & DEFS->COORD_ABS)
      { strcat(Vars->Coord_Label[i]," (abs)"); }

      if (Vars->Coord_Type[i] & DEFS->COORD_LOG)
      { strcat(Vars->Coord_Label[i]," (log)"); }

      strcat(Vars->Monitor_Label, " ");
      strcat(Vars->Monitor_Label, Short_Label[i]);
      XY *= Vars->Coord_Bin[i];

    } /* end for Short_Label */

    if ((Vars->Coord_Type[0] & (DEFS->COORD_LOG-1)) == DEFS->COORD_P) {
      strncat(Vars->Coord_Label[0], " [n/s", 30);
      if (Vars->Flag_per_cm2) strncat(Vars->Coord_Label[0], "/cm2", 30);

      if (XY > 1 && Vars->Coord_Number)
        strncat(Vars->Coord_Label[0], "/bin", 30);
      strncat(Vars->Coord_Label[0], "]", 30);
    }

    /* update label 'signal per bin' if more than 1 bin */
    if (XY > 1 && Vars->Coord_Number) {
      if (Vars->Flag_capture)
        printf("Monitor_nD: %s: Using capture flux weightening on %ld bins.\n"
               "WARNING     Use binned data with caution, and prefer monitor integral value (I,Ierr).\n", Vars->compcurname, (long)XY);
    }

    strcat(Vars->Monitor_Label, " Monitor");
    if (Vars->Flag_Shape == DEFS->SHAPE_SQUARE) strcat(Vars->Monitor_Label, " (Square)");
    if (Vars->Flag_Shape == DEFS->SHAPE_DISK)   strcat(Vars->Monitor_Label, " (Disk)");
    if (Vars->Flag_Shape == DEFS->SHAPE_SPHERE) strcat(Vars->Monitor_Label, " (Sphere)");
    if (Vars->Flag_Shape == DEFS->SHAPE_CYLIND) strcat(Vars->Monitor_Label, " (Cylinder)");
    if (Vars->Flag_Shape == DEFS->SHAPE_BANANA) strcat(Vars->Monitor_Label, " (Banana)");
    if (Vars->Flag_Shape == DEFS->SHAPE_BOX)    strcat(Vars->Monitor_Label, " (Box)");
    if (Vars->Flag_Shape == DEFS->SHAPE_PREVIOUS) strcat(Vars->Monitor_Label, " (on PREVIOUS)");
    if (Vars->Flag_Shape == DEFS->SHAPE_OFF) strcat(Vars->Monitor_Label, " (OFF geometry)");
    if ((Vars->Flag_Shape == DEFS->SHAPE_CYLIND) || (Vars->Flag_Shape == DEFS->SHAPE_BANANA) || (Vars->Flag_Shape == DEFS->SHAPE_SPHERE) || (Vars->Flag_Shape == DEFS->SHAPE_BOX))
    {
      if (strstr(Vars->option, "incoming"))
      {
        Vars->Flag_Shape = abs(Vars->Flag_Shape);
        strcat(Vars->Monitor_Label, " [in]");
      }
      else /* if strstr(Vars->option, "outgoing")) */
      {
        Vars->Flag_Shape = -abs(Vars->Flag_Shape);
        strcat(Vars->Monitor_Label, " [out]");
      }
    }
    if (Vars->Flag_UsePreMonitor == 1)
    {
        strcat(Vars->Monitor_Label, " at ");
        strncat(Vars->Monitor_Label, Vars->UserName1,30);
    }
    if (Vars->Flag_log == 1) strcat(Vars->Monitor_Label, " [log] ");

    /* now allocate memory to store variables in TRACE */

    /* Vars->Coord_Number  0   : intensity or signal
     * Vars->Coord_Number  1:n : detector variables */

    if ((Vars->Coord_NumberNoPixel != 2) && !Vars->Flag_Multiple && !Vars->Flag_List)
    { Vars->Flag_Multiple = 1; /* default is n1D */
      if (Vars->Coord_Number != Vars->Coord_NumberNoPixel) Vars->Flag_List = 1; }

    /* list and auto limits case : Vars->Flag_List or Vars->Flag_Auto_Limits
     * -> Buffer to flush and suppress after Vars->Flag_Auto_Limits
     */
    if ((Vars->Flag_Auto_Limits || Vars->Flag_List) && Vars->Coord_Number)
    { /* Dim : (Vars->Coord_Number+1)*Vars->Buffer_Block matrix (for p, dp) */
      Vars->Mon2D_Buffer = (double *)malloc((Vars->Coord_Number+1)*Vars->Buffer_Block*sizeof(double));
      if (Vars->Mon2D_Buffer == NULL)
      { printf("Monitor_nD: %s cannot allocate Vars->Mon2D_Buffer (%zi). No list and auto limits.\n", Vars->compcurname, Vars->Buffer_Block*(Vars->Coord_Number+1)*sizeof(double)); Vars->Flag_List = 0; Vars->Flag_Auto_Limits = 0; }
      else
      {
        for (i=0; i < (Vars->Coord_Number+1)*Vars->Buffer_Block; Vars->Mon2D_Buffer[i++] = (double)0);
      }
      Vars->Buffer_Size = Vars->Buffer_Block;
    }

    /* 1D and n1D case : Vars->Flag_Multiple */
    if (Vars->Flag_Multiple && Vars->Coord_NumberNoPixel)
    { /* Dim : Vars->Coord_Number*Vars->Coord_Bin[i] vectors */
      Vars->Mon2D_N  = (double **)malloc((Vars->Coord_Number)*sizeof(double *));
      Vars->Mon2D_p  = (double **)malloc((Vars->Coord_Number)*sizeof(double *));
      Vars->Mon2D_p2 = (double **)malloc((Vars->Coord_Number)*sizeof(double *));
      if ((Vars->Mon2D_N == NULL) || (Vars->Mon2D_p == NULL) || (Vars->Mon2D_p2 == NULL))
      { fprintf(stderr,"Monitor_nD: %s n1D cannot allocate Vars->Mon2D_N/p/p2 (%zi). Fatal.\n", Vars->compcurname, (Vars->Coord_Number)*sizeof(double *)); exit(-1); }
      for (i= 1; i <= Vars->Coord_Number; i++)
      {
        Vars->Mon2D_N[i-1]  = (double *)malloc(Vars->Coord_Bin[i]*sizeof(double));
        Vars->Mon2D_p[i-1]  = (double *)malloc(Vars->Coord_Bin[i]*sizeof(double));
        Vars->Mon2D_p2[i-1] = (double *)malloc(Vars->Coord_Bin[i]*sizeof(double));
        if ((Vars->Mon2D_N == NULL) || (Vars->Mon2D_p == NULL) || (Vars->Mon2D_p2 == NULL))
        { fprintf(stderr,"Monitor_nD: %s n1D cannot allocate %s Vars->Mon2D_N/p/p2[%li] (%zi). Fatal.\n", Vars->compcurname, Vars->Coord_Var[i], i, (Vars->Coord_Bin[i])*sizeof(double *)); exit(-1); }
        else
        {
          for (j=0; j < Vars->Coord_Bin[i]; j++ )
          { Vars->Mon2D_N[i-1][j] = (double)0; Vars->Mon2D_p[i-1][j] = (double)0; Vars->Mon2D_p2[i-1][j] = (double)0; }
        }
      }
    }
    else /* 2D case : Vars->Coord_Number==2 and !Vars->Flag_Multiple and !Vars->Flag_List */
    if ((Vars->Coord_NumberNoPixel == 2) && !Vars->Flag_Multiple)
    { /* Dim : Vars->Coord_Bin[1]*Vars->Coord_Bin[2] matrix */
      Vars->Mon2D_N  = (double **)malloc((Vars->Coord_Bin[1])*sizeof(double *));
      Vars->Mon2D_p  = (double **)malloc((Vars->Coord_Bin[1])*sizeof(double *));
      Vars->Mon2D_p2 = (double **)malloc((Vars->Coord_Bin[1])*sizeof(double *));
      if ((Vars->Mon2D_N == NULL) || (Vars->Mon2D_p == NULL) || (Vars->Mon2D_p2 == NULL))
      { fprintf(stderr,"Monitor_nD: %s 2D cannot allocate %s Vars->Mon2D_N/p/p2 (%zi). Fatal.\n", Vars->compcurname, Vars->Coord_Var[1], (Vars->Coord_Bin[1])*sizeof(double *)); exit(-1); }
      for (i= 0; i < Vars->Coord_Bin[1]; i++)
      {
        Vars->Mon2D_N[i]  = (double *)malloc(Vars->Coord_Bin[2]*sizeof(double));
        Vars->Mon2D_p[i]  = (double *)malloc(Vars->Coord_Bin[2]*sizeof(double));
        Vars->Mon2D_p2[i] = (double *)malloc(Vars->Coord_Bin[2]*sizeof(double));
        if ((Vars->Mon2D_N == NULL) || (Vars->Mon2D_p == NULL) || (Vars->Mon2D_p2 == NULL))
        { fprintf(stderr,"Monitor_nD: %s 2D cannot allocate %s Vars->Mon2D_N/p/p2[%li] (%zi). Fatal.\n", Vars->compcurname, Vars->Coord_Var[1], i, (Vars->Coord_Bin[2])*sizeof(double *)); exit(-1); }
        else
        {
          for (j=0; j < Vars->Coord_Bin[2]; j++ )
          { Vars->Mon2D_N[i][j] = (double)0; Vars->Mon2D_p[i][j] = (double)0; Vars->Mon2D_p2[i][j] = (double)0; }
        }
      }
    }
    else {
      Vars->Mon2D_N = Vars->Mon2D_p = Vars->Mon2D_p2 = NULL;
    }
      /* no Mon2D allocated for
       * (Vars->Coord_Number != 2) && !Vars->Flag_Multiple && Vars->Flag_List */

    Vars->psum  = 0;
    Vars->p2sum = 0;
    Vars->Nsum  = 0;

    Vars->area  = fabs(Vars->mxmax - Vars->mxmin)*fabs(Vars->mymax - Vars->mymin)*1E4; /* in cm**2 for square and box shapes */
    Vars->Sphere_Radius = fabs(Vars->mxmax - Vars->mxmin)/2;
    if ((abs(Vars->Flag_Shape) == DEFS->SHAPE_DISK) || (abs(Vars->Flag_Shape) == DEFS->SHAPE_SPHERE))
    {
      Vars->area = PI*Vars->Sphere_Radius*Vars->Sphere_Radius*1E4; /* disk shapes */
    }


    if (Vars->area == 0 && abs(Vars->Flag_Shape) != DEFS->SHAPE_PREVIOUS ) {
      if (abs(Vars->Flag_Shape) != DEFS->SHAPE_OFF) {  
	Vars->Coord_Number = 0;
      }
    }
    if (Vars->Coord_Number == 0 && Vars->Flag_Verbose)
      printf("Monitor_nD: %s is inactivated (0D)\n", Vars->compcurname);
    Vars->Cylinder_Height = fabs(Vars->mymax - Vars->mymin);

    if (Vars->Flag_Verbose)
    {
      printf("Monitor_nD: %s is a %s.\n", Vars->compcurname, Vars->Monitor_Label);
      printf("Monitor_nD: version %s with options=%s\n", MONITOR_ND_LIB_H, Vars->option);
    }
    
    /* compute the product of bin dimensions for PixelID */
    Vars->Coord_BinProd[0]=1;

    for (i = 1; i <= Vars->Coord_Number; i++) {
      Vars->Coord_BinProd[i]=Vars->Coord_Bin[i]*Vars->Coord_BinProd[i-1];
    }

    #ifdef USE_NEXUS

    #ifdef USE_MPI
    if(mpi_node_rank == mpi_node_root) {
    #endif
      if(nxhandle) {

	/* This section of code writes detector shape information to
	   entryN/instrument/components/'name'/geometry in the NeXus file */

	char nexuscomp[CHAR_BUF_LENGTH];
	char pref[5];
	if (Vars->compcurindex-1 < 10) {
	  sprintf(pref,"000");
	} else if (Vars->compcurindex-1 < 100) {
	  sprintf(pref,"00");
	} else if (Vars->compcurindex-1 < 1000) {
	  sprintf(pref,"0");
	} else if (Vars->compcurindex-1 < 10000) {
	  sprintf(pref,"");
	} else {
	  fprintf(stderr,"Error, no support for > 10000 comps at the moment!\n");
	  exit(-1);
	}
	sprintf(nexuscomp,"%s%d_%s",pref,Vars->compcurindex-1,Vars->compcurname);

	if (NXopengroup(nxhandle, "instrument", "NXinstrument") == NX_OK) {
	  if (NXopengroup(nxhandle, "components", "NXdata") == NX_OK) {
	    if (NXopengroup(nxhandle, nexuscomp, "NXdata") == NX_OK) {
	      if (NXmakegroup(nxhandle, "Geometry", "NXdata") == NX_OK) {
		if (NXopengroup(nxhandle, "Geometry", "NXdata") == NX_OK) {
		  char tmp[CHAR_BUF_LENGTH];
		  sprintf(tmp,"%g",Vars->Sphere_Radius);
		  nxprintattr(nxhandle, "radius", tmp);

		  sprintf(tmp,"%g",Vars->Cylinder_Height);
		  nxprintattr(nxhandle, "height", tmp);

		  sprintf(tmp,"%g",Vars->mxmin);
		  nxprintattr(nxhandle, "xmin",  tmp);
		  sprintf(tmp,"%g",Vars->mxmax);
		  nxprintattr(nxhandle, "xmax",  tmp);

		  sprintf(tmp,"%g",Vars->mymin);
		  nxprintattr(nxhandle, "ymin",  tmp);
		  sprintf(tmp,"%g",Vars->mymax);
		  nxprintattr(nxhandle, "ymax",  tmp);

		  sprintf(tmp,"%g",Vars->mzmin);
		  nxprintattr(nxhandle, "zmin",  tmp);
		  sprintf(tmp,"%g",Vars->mzmax);
		  nxprintattr(nxhandle, "zmax",  tmp);

		  sprintf(tmp,"%g",Vars->mzmin);
		  nxprintattr(nxhandle, "zmin",  tmp);
		  sprintf(tmp,"%g",Vars->mzmax);
		  nxprintattr(nxhandle, "zmax",  tmp);

		  sprintf(tmp,"%i",Vars->Flag_Shape);
		  nxprintattr(nxhandle, "Shape identifier",  tmp);
		  sprintf(tmp,"%s",Vars->Monitor_Label);
		  nxprintattr(nxhandle, "Shape string",  tmp);
		  sprintf(tmp,"%s",Vars->option);
		  nxprintattr(nxhandle, "Option string",  tmp);

		  NXclosegroup(nxhandle); // Geometry
		} else {
		  printf("Failed to open component NeXus component Geometry group\n");
		}
	      } else {
		printf("Failed to create component NeXus component Geometry group\n");
	      }
	      NXclosegroup(nxhandle); // component
	    }
	    NXclosegroup(nxhandle); // components
	  } else {
	    printf("Failed to open NeXus component hierarchy\n");
	  }
	  NXclosegroup(nxhandle); // instrument
	}

	if (Vars->Flag_nexusbins) {
	  /* Below code communicates geometry-oriented "BINS" for the detector. */
	  char metadata[CHAR_BUF_LENGTH];
	  char metadatatmp[CHAR_BUF_LENGTH];
	  // Vars for 1D, >3D, OFF
	  long numbins;
	  long minbins = 0;
	  long maxbins = 0;
	  char binlabel[CHAR_BUF_LENGTH];
	  char binvar[CHAR_BUF_LENGTH];
	  sprintf(binlabel,"none");
	  sprintf(binvar,"none");
	  
	  // Find index of pixel column
	  int id_index;
	  for (id_index=0;id_index<30;id_index++) {
	    if (strcmp(Vars->Coord_Var[id_index], "id") == 0) break;
	  }
	  if (id_index == 30) id_index = Vars->Coord_Number-1; // Revert to earlier behavior is id not found
	  long pix=Vars->Coord_Min[id_index];
	  
	  MCDETECTOR detector;
	  
	  /* Init - perhaps better with an init-function in mccode-r? */
	  detector.m = 0;
	  detector.xmin = 0;
	  detector.xmax = 0;
	  detector.ymin = 0;
	  detector.ymax = 0;
	  detector.zmin = 0;
	  detector.zmax = 0;
	  detector.intensity = 0;
	  detector.error = 0;
	  detector.events = 0;
	  detector.min = 0;
	  detector.max = 0;
	  detector.mean = 0;
	  detector.centerX = 0;
	  detector.halfwidthX = 0;
	  detector.centerY = 0;
	  detector.halfwidthY = 0;
	  detector.rank = 0;
	  detector.istransposed = 0;
	  detector.n = 0;
	  detector.p = 0;
	  detector.date_l = 0;
	  detector.p0 = NULL;
	  detector.p1 = NULL;
	  detector.p2 = NULL;
	  
	  sprintf(detector.filename,"BINS");
	  sprintf(detector.component,"%s",Vars->compcurname);
	  sprintf(detector.nexuscomp,"%s%d_%s",pref,Vars->compcurindex-1,detector.component);
	  sprintf(detector.format,"pixels");
	  
	  if(!Vars->Flag_OFF) {
	    
	    sprintf(metadata,"id=%ld + %ld pixels: ",(long)Vars->Coord_Min[id_index],(long)Vars->Coord_BinProd[Vars->Coord_Number]);
	    for (i=1; i<N_spatial_dims; i++) {
	      sprintf(metadatatmp,"%s %s (%ld bins) x ",metadata,Vars->Coord_Label[i],Vars->Coord_Bin[i]);
	      sprintf(metadata,"%s",metadatatmp);
	    }
	    sprintf(metadatatmp,"%s %s (%ld bins)",metadata,Vars->Coord_Label[i],Vars->Coord_Bin[i]);
	    sprintf(metadata,"%s",metadatatmp);
	    numbins = Vars->Coord_BinProd[Vars->Coord_Number];
	    if (N_spatial_dims==1) {
	      minbins=Vars->Coord_Min[1];
	      maxbins=Vars->Coord_Max[1];
	      sprintf(binlabel,"%s",Vars->Coord_Label[1]);
	      sprintf(binvar,"%s",Vars->Coord_Var[1]);
	    } else if (N_spatial_dims>3) {
	      minbins=1;
	      maxbins=Vars->Coord_BinProd[Vars->Coord_Number];
	      sprintf(binlabel,"More than 3 dimensions");
	      sprintf(binvar,"wrapped_variables_4plus_dims");
	      N_spatial_dims=1;
	    }
	    sprintf(detector.xlabel,"%s",binlabel);
	    sprintf(detector.xvar,"%s",binvar);
	    detector.xmin=minbins;
	    detector.xmax=maxbins;
	  } else {
	    numbins = Vars->Flag_OFF;
	    minbins=1;
	    maxbins=Vars->Flag_OFF;
	    sprintf(binlabel,"OFF pixel index");
	    sprintf(binvar,"OFF");
	    N_spatial_dims=1;
	    sprintf(detector.xlabel,"%s",binlabel);
	    sprintf(detector.xvar,"%s",binvar);
	    detector.xmin=minbins;
	    detector.xmax=maxbins;
	  }
	  
	  long k,l,m;
	  if (N_spatial_dims==1) { // 1D case or ND
	    detector.m=numbins;
	    detector.n=1;
	    detector.p=1;
	    detector.rank=1;
	    detector.p0=(double *)calloc(numbins, sizeof(double));
	    detector.p1=(double *)calloc(numbins, sizeof(double));
	    detector.p2=(double *)calloc(numbins, sizeof(double));
	    if (Vars->Flag_Verbose) printf("1D case %ld \n",Vars->Coord_Bin[1]);
	    for (k=0; k<numbins; k++) {
	      if (Vars->Flag_Verbose) printf("Assigning pixel no [%ld] = %ld\n",k,pix);
	      detector.p1[k]=pix;
	      pix++;
	    }
	    mcdetector_out_1D_nexus(detector);
	    free(detector.p0);
	    free(detector.p1);
	    free(detector.p2);
	  } else if (N_spatial_dims==2) { // 2D case
	    detector.m=Vars->Coord_Bin[1];
	    detector.n=Vars->Coord_Bin[2];
	    detector.p=1;
	    detector.rank=2;
	    sprintf(detector.xlabel,"%s",Vars->Coord_Label[1]);
	    sprintf(detector.xvar,"%s",Vars->Coord_Var[1]);
	    detector.xmin=Vars->Coord_Min[1];
	    detector.xmax=Vars->Coord_Max[1];
	    sprintf(detector.ylabel,"%s",Vars->Coord_Label[2]);
	    sprintf(detector.yvar,"%s",Vars->Coord_Var[2]);
	    detector.ymin=Vars->Coord_Min[2];
	    detector.ymax=Vars->Coord_Max[2];
	    detector.p0=(double *)calloc(Vars->Coord_BinProd[Vars->Coord_Number], sizeof(double));
	    detector.p1=(double *)calloc(Vars->Coord_BinProd[Vars->Coord_Number], sizeof(double));
	    detector.p2=(double *)calloc(Vars->Coord_BinProd[Vars->Coord_Number], sizeof(double));
	    if (Vars->Flag_Verbose) printf("2D case %ld x %ld \n",Vars->Coord_Bin[1],Vars->Coord_Bin[2]);
	    for (k=0; k<Vars->Coord_Bin[1]; k++) {
	      for (l=0; l<Vars->Coord_Bin[2]; l++) {
		if (Vars->Flag_Verbose) printf("Assigning pixel no [%ld,%ld] = %ld\n",l,k,pix);
		detector.p1[k*Vars->Coord_Bin[2]+l]=pix;
		pix++;
	      }
	    }
	    mcdetector_out_2D_nexus(detector);
	    free(detector.p0);
	    free(detector.p1);
	    free(detector.p2);
	  } else if (N_spatial_dims==3) { // 3D case
	    detector.m=Vars->Coord_Bin[1];
	    detector.n=Vars->Coord_Bin[2];
	    detector.p=Vars->Coord_Bin[3];;
	    detector.rank=3;
	    sprintf(detector.xlabel,"%s",Vars->Coord_Label[1]);
	    sprintf(detector.xvar,"%s",Vars->Coord_Var[1]);
	    detector.xmin=Vars->Coord_Min[1];
	    detector.xmax=Vars->Coord_Max[1];
	    sprintf(detector.ylabel,"%s",Vars->Coord_Label[2]);
	    sprintf(detector.yvar,"%s",Vars->Coord_Var[2]);
	    detector.ymin=Vars->Coord_Min[2];
	    detector.ymax=Vars->Coord_Max[2];
	    sprintf(detector.zlabel,"%s",Vars->Coord_Label[3]);
	    sprintf(detector.zvar,"%s",Vars->Coord_Var[3]);
	    detector.zmin=Vars->Coord_Min[3];
	    detector.zmax=Vars->Coord_Max[3];
	    detector.p0=(double *)calloc(Vars->Coord_BinProd[Vars->Coord_Number], sizeof(double));
	    detector.p1=(double *)calloc(Vars->Coord_BinProd[Vars->Coord_Number], sizeof(double));
	    detector.p2=(double *)calloc(Vars->Coord_BinProd[Vars->Coord_Number], sizeof(double));
	    if (Vars->Flag_Verbose) printf("3D case %ld x %ld x %ld \n",Vars->Coord_Bin[1],Vars->Coord_Bin[2],Vars->Coord_Bin[3]);
	    for (k=0; k<Vars->Coord_Bin[1]; k++) {
	      for (l=0; l<Vars->Coord_Bin[2]; l++) {
		for (m=0; m<Vars->Coord_Bin[3]; m++) {
		  if (Vars->Flag_Verbose) printf("Assigning pixel no [%ld,%ld,%ld] = %ld\n",m,l,k,pix);
		  detector.p1[k*Vars->Coord_Bin[2]*Vars->Coord_Bin[3] + l*Vars->Coord_Bin[3] + m]=pix;
		  pix++;
		}
	      }
	    }
	    mcdetector_out_3D_nexus(detector);
	    free(detector.p0);
	    free(detector.p1);
	    free(detector.p2);
	  }
	} // Flag_nexusbins active
      } // nxhandle available
    #ifdef USE_MPI
    } // Master only
    #endif

    #endif // USE_NEXUS
    } /* end Monitor_nD_Init */

/* ========================================================================= */
/* Monitor_nD_Trace: this routine is used to monitor one propagating neutron */
/* return values: 0=neutron was absorbed, -1=neutron was outside bounds, 1=neutron was measured*/
/* ========================================================================= */

int Monitor_nD_Trace(MonitornD_Defines_type *DEFS, MonitornD_Variables_type *Vars, _class_particle* _particle)
{

  double  XY=0, pp=0;
  long    i =0, j =0;
  double  Coord[MONnD_COORD_NMAX];
  long    Coord_Index[MONnD_COORD_NMAX];
  char    While_End   =0;
  long    While_Buffer=0;
  char    Set_Vars_Coord_Type = DEFS->COORD_NONE;

  /* the logic below depends mainly on:
       Flag_List:        1=store 1 buffer, 2=list all, 3=re-use buffer 
       Flag_Auto_Limits: 0 (no auto limits/list), 1 (store events into Buffer), 2 (re-emit store events)
   */

  /* Vars->Flag_Auto_Limits=1: buffer full, we read the Buffer, and determine min and max bounds */
  if ((Vars->Buffer_Counter >= Vars->Buffer_Block) && (Vars->Flag_Auto_Limits == 1) && (Vars->Coord_Number > 0))
  {
    /* auto limits case : get limits in Buffer for each variable */
          /* Dim : (Vars->Coord_Number+1)*Vars->Buffer_Block matrix (for p, dp) */
    if (Vars->Flag_Verbose) printf("Monitor_nD: %s getting %li Auto Limits from List (%li events) in TRACE.\n", Vars->compcurname, Vars->Coord_Number, Vars->Buffer_Counter);
    for (i = 1; i <= Vars->Coord_Number; i++)
    {
      if (Vars->Coord_Type[i] & DEFS->COORD_AUTO)
      {
        Vars->Coord_Min[i] =  FLT_MAX;
        Vars->Coord_Max[i] = -FLT_MAX;
        for (j = 0; j < Vars->Buffer_Counter; j++)
        {
          XY = Vars->Mon2D_Buffer[i+j*(Vars->Coord_Number+1)];  /* scanning variables in Buffer */
          if (XY < Vars->Coord_Min[i]) Vars->Coord_Min[i] = XY;
          if (XY > Vars->Coord_Max[i]) Vars->Coord_Max[i] = XY;
        }
        if  (Vars->Flag_Verbose)  
          printf("  %s: min=%g max=%g\n", Vars->Coord_Var[i], Vars->Coord_Min[i], Vars->Coord_Max[i]);
      }
    }
    Vars->Flag_Auto_Limits = 2;  /* pass to 2nd auto limits step (read Buffer and generate new events to store in histograms) */
  } /* end if Flag_Auto_Limits == 1 */

#ifndef OPENACC
  /* manage realloc for 'list all' if Buffer size exceeded: flush Buffer to file */
  if ((Vars->Buffer_Counter >= Vars->Buffer_Block) && (Vars->Flag_List >= 2))
  {
    if (Vars->Buffer_Size >= 1000000 || Vars->Flag_List == 3)
    { /* save current (possibly append) and re-use Buffer */

      Monitor_nD_Save(DEFS, Vars);
      Vars->Flag_List = 3;
      Vars->Buffer_Block = Vars->Buffer_Size;
      Vars->Buffer_Counter  = 0;
      Vars->Neutron_Counter = 0;
    }
    else
    {
      Vars->Mon2D_Buffer  = (double *)realloc(Vars->Mon2D_Buffer, (Vars->Coord_Number+1)*(2*Vars->Buffer_Block)*sizeof(double));
      if (Vars->Mon2D_Buffer == NULL)
            { printf("Monitor_nD: %s cannot reallocate Vars->Mon2D_Buffer[%li] (%zi). Skipping.\n", Vars->compcurname, i, (long int)(2*Vars->Buffer_Block)*sizeof(double)); Vars->Flag_List = 1; }
      else { 
		  Vars->Buffer_Block = 2*Vars->Buffer_Block;
		  Vars->Buffer_Size = Vars->Buffer_Block;
	  }
    }
  } /* end if Buffer realloc */
#endif

  char    outsidebounds=0;
  while (!While_End)
  { /* we generate Coord[] and Coord_index[] from Buffer (auto limits) or passing neutron */
    if ((Vars->Flag_Auto_Limits == 2) && (Vars->Coord_Number > 0))
    { /* Vars->Flag_Auto_Limits == 2: read back from Buffer (Buffer is filled or auto limits have been computed) */
      if (While_Buffer < Vars->Buffer_Block)
      {
        /* first while loop (While_Buffer) */
        /* auto limits case : scan Buffer within limits and store in Mon2D */
        Coord[0] = pp = Vars->Mon2D_Buffer[While_Buffer*(Vars->Coord_Number+1)];

        for (i = 1; i <= Vars->Coord_Number; i++)
        {
          /* scanning variables in Buffer */
          if (Vars->Coord_Bin[i] <= 1) continue;
          XY = (Vars->Coord_Max[i]-Vars->Coord_Min[i]);

          Coord[i] = Vars->Mon2D_Buffer[i+While_Buffer*(Vars->Coord_Number+1)];
          if (XY > 0) Coord_Index[i] = floor((Coord[i]-Vars->Coord_Min[i])*Vars->Coord_Bin[i]/XY);
          else        Coord_Index[i] = 0;
          if (Vars->Flag_With_Borders)
          {
            if (Coord_Index[i] < 0)                   Coord_Index[i] = 0;
            if (Coord_Index[i] >= Vars->Coord_Bin[i]) Coord_Index[i] = Vars->Coord_Bin[i] - 1;
          }
        } /* end for */
        
        /* update the PixelID, we compute it from the previous variables index */
        if (Vars->Coord_NumberNoPixel < Vars->Coord_Number) /* there is a Pixel variable */
        for (i = 1; i <= Vars->Coord_Number; i++) {
          char Set_Vars_Coord_Type = (Vars->Coord_Type[i] & (DEFS->COORD_LOG-1));
          if (Set_Vars_Coord_Type == DEFS->COORD_PIXELID) {
            char flag_outside=0;
            Coord_Index[i] = Coord[i] = 0;
            for (j= 1; j < i; j++) {
              /* not for 1D variables with Bin=1 such as PixelID, NCOUNT, Intensity */
              if (Vars->Coord_Bin[j] == 1) continue; 
              if (0 > Coord_Index[j] || Coord_Index[j] >= Vars->Coord_Bin[j]) {
                flag_outside=1;
                Coord[i] = 0;
                break;
              }
              Coord[i] += Coord_Index[j]*Vars->Coord_BinProd[j-1];
            }
            if (!flag_outside) {
              Vars->Mon2D_Buffer[i+While_Buffer*(Vars->Coord_Number+1)] = Coord[i];
            }
          } /* end if PixelID */
        }
        While_Buffer++;
      } /* end if in Buffer */
      else /* (While_Buffer >= Vars->Buffer_Block) && (Vars->Flag_Auto_Limits == 2) */
      {
        Vars->Flag_Auto_Limits = 0;
        if (!Vars->Flag_List) /* free Buffer not needed anymore (no list to output) */
        { /* Dim : (Vars->Coord_Number+1)*Vars->Buffer_Block matrix (for p, p2) */
          free(Vars->Mon2D_Buffer); Vars->Mon2D_Buffer = NULL;
        }
        if (Vars->Flag_Verbose) printf("Monitor_nD: %s flushed %li Auto Limits from List (%li) in TRACE.\n", Vars->compcurname, Vars->Coord_Number, Vars->Buffer_Counter);
      }
    } /* if Vars->Flag_Auto_Limits == 2 */
    
    if (Vars->Flag_Auto_Limits != 2 || !Vars->Coord_Number) /* Vars->Flag_Auto_Limits == 0 (no auto limits/list) or 1 (store events into Buffer) */
    {
      /* automatically compute area and steradian solid angle when in AUTO mode */
      /* compute the steradian solid angle incoming on the monitor */
      double v;
      double tmp;
      v=sqrt(_particle->vx*_particle->vx + _particle->vy*_particle->vy + _particle->vz*_particle->vz);
      tmp=_particle->x;
      if (Vars->min_x > _particle->x){
        #pragma acc atomic write
        Vars->min_x = tmp;
      }
      if (Vars->max_x < _particle->x){
        #pragma acc atomic write
        Vars->max_x = tmp;
      }
      tmp=_particle->y;
      if (Vars->min_y > _particle->y){
        #pragma acc atomic write
        Vars->min_y = tmp;
      }
      if (Vars->max_y < _particle->y){
	tmp=_particle->y;
        #pragma acc atomic write
	Vars->max_y = tmp;
      }

      #pragma acc atomic
      Vars->mean_p = Vars->mean_p + _particle->p;
      if (v) {
        tmp=_particle->p*fabs(_particle->vx/v);
        #pragma acc atomic
        Vars->mean_dx = Vars->mean_dx + tmp; //_particle->p*fabs(_particle->vx/v);
        tmp=_particle->p*fabs(_particle->vy/v);
        #pragma acc atomic
        Vars->mean_dy = Vars->mean_dy + tmp; //_particle->p*fabs(_particle->vy/v);
      }

      for (i = 0; i <= Vars->Coord_Number; i++)
      { /* handle current neutron : last while */
        XY = 0;
        Set_Vars_Coord_Type = (Vars->Coord_Type[i] & (DEFS->COORD_LOG-1));
        /* get values for variables to monitor */
        if (Set_Vars_Coord_Type == DEFS->COORD_X) XY = _particle->x;
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_Y) XY = _particle->y;
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_Z) XY = _particle->z;
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_VX) XY = _particle->vx;
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_VY) XY = _particle->vy;
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_VZ) XY = _particle->vz;
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_KX) XY = V2K*_particle->vx;
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_KY) XY = V2K*_particle->vy;
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_KZ) XY = V2K*_particle->vz;
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_SX) XY = _particle->sx;
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_SY) XY = _particle->sy;
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_SZ) XY = _particle->sz;
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_T) XY = _particle->t;
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_P) XY = _particle->p;
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_USERDOUBLE0) XY = Vars->UserDoubles[0];
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_USERDOUBLE1) XY = Vars->UserDoubles[1];
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_USERDOUBLE2) XY = Vars->UserDoubles[2];
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_USERDOUBLE3) XY = Vars->UserDoubles[3];
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_USERDOUBLE4) XY = Vars->UserDoubles[4];
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_USERDOUBLE5) XY = Vars->UserDoubles[5];
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_USERDOUBLE6) XY = Vars->UserDoubles[6];
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_USERDOUBLE7) XY = Vars->UserDoubles[7];
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_USERDOUBLE8) XY = Vars->UserDoubles[8];
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_USERDOUBLE9) XY = Vars->UserDoubles[9];
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_USERDOUBLE10) XY = Vars->UserDoubles[10];
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_USERDOUBLE11) XY = Vars->UserDoubles[11];
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_USERDOUBLE12) XY = Vars->UserDoubles[12];
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_USERDOUBLE13) XY = Vars->UserDoubles[13];
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_USERDOUBLE14) XY = Vars->UserDoubles[14];
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_USERDOUBLE15) XY = Vars->UserDoubles[15];
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_HDIV) XY = RAD2DEG*atan2(_particle->vx,_particle->vz);
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_VDIV) XY = RAD2DEG*atan2(_particle->vy,_particle->vz);
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_V) XY = sqrt(_particle->vx*_particle->vx+_particle->vy*_particle->vy+_particle->vz*_particle->vz);
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_RADIUS)
          XY = sqrt(_particle->x*_particle->x+_particle->y*_particle->y+_particle->z*_particle->z);
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_XY)
          XY = sqrt(_particle->x*_particle->x+_particle->y*_particle->y)*(_particle->x > 0 ? 1 : -1);
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_YZ) XY = sqrt(_particle->y*_particle->y+_particle->z*_particle->z);
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_XZ)
          XY = sqrt(_particle->x*_particle->x+_particle->z*_particle->z);
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_VXY) XY = sqrt(_particle->vx*_particle->vx+_particle->vy*_particle->vy);
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_VXZ) XY = sqrt(_particle->vx*_particle->vx+_particle->vz*_particle->vz);
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_VYZ) XY = sqrt(_particle->vy*_particle->vy+_particle->vz*_particle->vz);
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_K) { XY = sqrt(_particle->vx*_particle->vx+_particle->vy*_particle->vy+_particle->vz*_particle->vz);  XY *= V2K; }
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_KXY) { XY = sqrt(_particle->vx*_particle->vx+_particle->vy*_particle->vy);  XY *= V2K; }
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_KXZ) { XY = sqrt(_particle->vx*_particle->vx+_particle->vz*_particle->vz);  XY *= V2K; }
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_KYZ) { XY = sqrt(_particle->vy*_particle->vy+_particle->vz*_particle->vz);  XY *= V2K; }
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_ENERGY) { XY = _particle->vx*_particle->vx+_particle->vy*_particle->vy+_particle->vz*_particle->vz;  XY *= VS2E; }
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_LAMBDA) { XY = sqrt(_particle->vx*_particle->vx+_particle->vy*_particle->vy+_particle->vz*_particle->vz);  XY *= V2K; if (XY != 0) XY = 2*PI/XY; }
        else
	  if (Set_Vars_Coord_Type == DEFS->COORD_NCOUNT) XY = _particle->_uid;
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_ANGLE)
        {  XY = sqrt(_particle->vx*_particle->vx+_particle->vy*_particle->vy);
           if (_particle->vz != 0)
                XY = RAD2DEG*atan2(XY,_particle->vz)*(_particle->x > 0 ? 1 : -1);
           else XY = 0;
        }
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_THETA)  { if (_particle->z != 0) XY = RAD2DEG*atan2(_particle->x,_particle->z); }
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_PHI) { double rr=sqrt(_particle->x*_particle->x+ _particle->y*_particle->y + _particle->z*_particle->z); if (rr != 0) XY = RAD2DEG*asin(_particle->y/rr); }
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_USER1) {int fail; XY = particle_getvar(_particle,Vars->UserVariable1,&fail); if(fail) XY=0; }
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_USER2) {int fail; XY = particle_getvar(_particle,Vars->UserVariable2,&fail); if(fail) XY=0; }
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_USER3) {int fail; XY = particle_getvar(_particle,Vars->UserVariable3,&fail); if(fail) XY=0; }
        else
        if (Set_Vars_Coord_Type == DEFS->COORD_PIXELID && !Vars->Flag_Auto_Limits) {
          /* compute the PixelID from previous coordinates 
             the PixelID is the product of Coord_Index[i] in the detector geometry 
             pixelID = sum( Coord_Index[j]*prod(Vars->Coord_Bin[1:(j-1)]) )
             
             this does not apply when we store events in the buffer as Coord_Index
             is not set. Then the pixelID will be re-computed during SAVE.
          */
          char flag_outside=0;
          for (j= 1; j < i; j++) {
            /* not for 1D variables with Bin=1 such as PixelID, NCOUNT, Intensity */
            if (Vars->Coord_Bin[j] <= 1) continue; 
            if (0 > Coord_Index[j] || Coord_Index[j] >= Vars->Coord_Bin[j]) { 
              flag_outside=1; XY=0; break;
            }
            XY += Coord_Index[j]*Vars->Coord_BinProd[j-1];
          }
	  if (Vars->Flag_mantid && Vars->Flag_OFF && Vars->OFF_polyidx >=0) XY=Vars->OFF_polyidx;
          if (!flag_outside) XY += Vars->Coord_Min[i];
        }
        
        /* handle 'abs' and 'log' keywords */
        if (Vars->Coord_Type[i] & DEFS->COORD_ABS) XY=fabs(XY);

        if (Vars->Coord_Type[i] & DEFS->COORD_LOG) /* compute log of variable if requested */
        {  if (XY > 0) XY = log(XY)/log(10);
           else        XY = -100; }

        Coord[i] = XY; Coord_Index[i] = 0;
        if (i == 0) { pp = XY; Coord_Index[i] = 0; }
        else {
        /* check bounds for variables which have no automatic limits */
          if ((!Vars->Flag_Auto_Limits || !(Vars->Coord_Type[i] & DEFS->COORD_AUTO)) && Vars->Coord_Bin[i]>1)
          { /* compute index in histograms for each variable to monitor */
            XY = (Vars->Coord_Max[i]-Vars->Coord_Min[i]);
            if (XY > 0) Coord_Index[i] = floor((Coord[i]-Vars->Coord_Min[i])*Vars->Coord_Bin[i]/XY);
            if (Vars->Flag_With_Borders)
            {
              if (Coord_Index[i] >= Vars->Coord_Bin[i]) Coord_Index[i] = Vars->Coord_Bin[i] - 1;
              if (Coord_Index[i] < 0) Coord_Index[i] = 0;
            }
            //if (0 > Coord_Index[i] || Coord_Index[i] >= Vars->Coord_Bin[i])
            //  outsidebounds=1;
          } /* else will get Index later from Buffer when Flag_Auto_Limits == 2 */
        }
        
      } /* end for i */
      While_End = 1;
    }/* end else if Vars->Flag_Auto_Limits == 2 */
    
    /* ====================================================================== */
    /* store n1d/2d neutron from Buffer (Auto_Limits == 2) or current neutron in while */
    if (Vars->Flag_Auto_Limits != 1) /* not when storing auto limits Buffer */
    {
      /* apply per cm2 */
      if (Vars->Flag_per_cm2 && Vars->area != 0)
        pp /= Vars->area;

      /* 2D case : Vars->Coord_Number==2 and !Vars->Flag_Multiple and !Vars->Flag_List */
      if ( Vars->Coord_NumberNoPixel == 2 && !Vars->Flag_Multiple)
      { /* Dim : Vars->Coord_Bin[1]*Vars->Coord_Bin[2] matrix */
        
        i = Coord_Index[1];
        j = Coord_Index[2];
        if (i >= 0 && i < Vars->Coord_Bin[1] && j >= 0 && j < Vars->Coord_Bin[2])
        {
          if (Vars->Mon2D_N) {
	    double p2 = pp*pp;
            #pragma acc atomic
	    Vars->Mon2D_N[i][j] = Vars->Mon2D_N[i][j]+1;
            #pragma acc atomic
	    Vars->Mon2D_p[i][j] = Vars->Mon2D_p[i][j]+pp;
            #pragma acc atomic
	    Vars->Mon2D_p2[i][j] = Vars->Mon2D_p2[i][j] + p2;
	  }
        } else {
          outsidebounds=1; 
        }
      } else {
        /* 1D and n1D case : Vars->Flag_Multiple */
        /* Dim : Vars->Coord_Number*Vars->Coord_Bin[i] vectors (intensity is not included) */
          
        for (i= 1; i <= Vars->Coord_Number; i++) {
          j = Coord_Index[i];
          if (j >= 0 && j < Vars->Coord_Bin[i]) {
            if  (Vars->Flag_Multiple && Vars->Mon2D_N) {
	      if (Vars->Mon2D_N) {
		double p2 = pp*pp;
                #pragma acc atomic
		Vars->Mon2D_N[i-1][j] = Vars->Mon2D_N[i-1][j]+1;
                #pragma acc atomic
		Vars->Mon2D_p[i-1][j] = Vars->Mon2D_p[i-1][j]+pp;
		#pragma acc atomic
		Vars->Mon2D_p2[i-1][j] = Vars->Mon2D_p2[i-1][j] + p2;
	      }
	    }
          } else { 
            outsidebounds=1;
            break;
          }
        }
      }
    } /* end (Vars->Flag_Auto_Limits != 1) */
    
    if (Vars->Flag_Auto_Limits != 2 && !outsidebounds) /* not when reading auto limits Buffer */
    { /* now store Coord into Buffer (no index needed) if necessary (list or auto limits) */
      if ((Vars->Buffer_Counter < Vars->Buffer_Block) && ((Vars->Flag_List) || (Vars->Flag_Auto_Limits == 1)))
      {
        for (i = 0; i <= Vars->Coord_Number; i++)
        {
	  // This is is where the list is appended. How to make this "atomic"?
          #pragma acc atomic write 
          Vars->Mon2D_Buffer[i + Vars->Buffer_Counter*(Vars->Coord_Number+1)] = Coord[i];
        }
	    #pragma acc atomic update
        Vars->Buffer_Counter = Vars->Buffer_Counter + 1;
        if (Vars->Flag_Verbose && (Vars->Buffer_Counter >= Vars->Buffer_Block) && (Vars->Flag_List == 1)) 
          printf("Monitor_nD: %s %li neutrons stored in List.\n", Vars->compcurname, Vars->Buffer_Counter);
      }
    } /* end (Vars->Flag_Auto_Limits != 2) */
    
  } /* end while */
  #pragma acc atomic
  Vars->Nsum = Vars->Nsum + 1;
  #pragma acc atomic
  Vars->psum  = Vars->psum + pp;
  #pragma acc atomic
  Vars->p2sum = Vars->p2sum + pp*pp;

  /*determine return value: 1:neutron was in bounds and measured, -1: outside bounds, 0: outside bounds, should be absorbed.*/
  if(outsidebounds){
      if(Vars->Flag_Absorb){
          return 0;
      }else{
          return -1;
      }
  } else {
   /* For the OPENACC list buffer an atomic capture/update of the
      updated Neutron_counter - updated below under list mode 
	  Only need to be updated when inside bounds. */
   #pragma acc atomic update
   Vars->Neutron_Counter++;
  }
  return 1;
} /* end Monitor_nD_Trace */

/* ========================================================================= */
/* Monitor_nD_Save: this routine is used to save data files                  */
/* ========================================================================= */

MCDETECTOR Monitor_nD_Save(MonitornD_Defines_type *DEFS, MonitornD_Variables_type *Vars)
  {
    char   *fname;
    long    i,j;
    double *p0m = NULL;
    double *p1m = NULL;
    double *p2m = NULL;
    char    Coord_X_Label[CHAR_BUF_LENGTH];
    double  min1d, max1d;
    double  min2d, max2d;
    char    While_End = 0;
    long    While_Buffer = 0;
    double  XY=0, pp=0;
    double  Coord[MONnD_COORD_NMAX];
    long    Coord_Index[MONnD_COORD_NMAX];
    char    label[CHAR_BUF_LENGTH];

    MCDETECTOR detector;
    strcpy(detector.options,Vars->option);
    if (Vars->Flag_Verbose && Vars->Flag_per_cm2) {
      printf("Monitor_nD: %s: active flat detector area is %g [cm^2], total area is %g [cm^2]\n",
        Vars->compcurname, (Vars->max_x-Vars->min_x)
                          *(Vars->max_y-Vars->min_y)*1E4, Vars->area);
      printf("Monitor_nD: %s: beam solid angle is %g [st] (%g x %g [deg^2])\n",
        Vars->compcurname,
        2*fabs(2*atan2(Vars->mean_dx,Vars->mean_p)
         *sin(2*atan2(Vars->mean_dy,Vars->mean_p)/2)),
        atan2(Vars->mean_dx,Vars->mean_p)*RAD2DEG,
        atan2(Vars->mean_dy,Vars->mean_p)*RAD2DEG);
    }

    /* check Buffer flush when end of simulation reached */
    if ((Vars->Buffer_Counter <= Vars->Buffer_Block) && Vars->Flag_Auto_Limits && Vars->Mon2D_Buffer && Vars->Buffer_Counter)
    {
      /* Get Auto Limits */
      if (Vars->Flag_Verbose) printf("Monitor_nD: %s getting %li Auto Limits from List (%li events).\n", Vars->compcurname, Vars->Coord_Number, Vars->Buffer_Counter);

      for (i = 1; i <= Vars->Coord_Number; i++)
      {
        if ((Vars->Coord_Type[i] & DEFS->COORD_AUTO) && Vars->Coord_Bin[i] > 1)
        {
          Vars->Coord_Min[i] = FLT_MAX;
          Vars->Coord_Max[i] = -FLT_MAX;
          for (j = 0; j < Vars->Buffer_Counter; j++)
          {
            XY = Vars->Mon2D_Buffer[i+j*(Vars->Coord_Number+1)];  /* scanning variables in Buffer */
            if (XY < Vars->Coord_Min[i]) Vars->Coord_Min[i] = XY;
            if (XY > Vars->Coord_Max[i]) Vars->Coord_Max[i] = XY;
          }
          if  (Vars->Flag_Verbose)  
            printf("  %s: min=%g max=%g in %li bins\n", Vars->Coord_Var[i], Vars->Coord_Min[i], Vars->Coord_Max[i], Vars->Coord_Bin[i]);
        }
      }
      Vars->Flag_Auto_Limits = 2;  /* pass to 2nd auto limits step */
      Vars->Buffer_Block = Vars->Buffer_Counter;

      while (!While_End)
      { /* we generate Coord[] and Coord_index[] from Buffer (auto limits) */
        /* simulation ended before Buffer was filled. Limits have to be computed, and stored events must be sent into histograms */
        
        if (While_Buffer < Vars->Buffer_Block)
        {
          /* first while loops (While_Buffer) */
          Coord[0] = Vars->Mon2D_Buffer[While_Buffer*(Vars->Coord_Number+1)];

          /* auto limits case : scan Buffer within limits and store in Mon2D */
          for (i = 1; i <= Vars->Coord_Number; i++)
          {
            /* scanning variables in Buffer */
            if (Vars->Coord_Bin[i] <= 1) Coord_Index[i] = 0;
            else {
              XY = (Vars->Coord_Max[i]-Vars->Coord_Min[i]);
              Coord[i] = Vars->Mon2D_Buffer[i+While_Buffer*(Vars->Coord_Number+1)];
              if (XY > 0) Coord_Index[i] = floor((Coord[i]-Vars->Coord_Min[i])*Vars->Coord_Bin[i]/XY);
              else Coord_Index[i] = 0;
              if (Vars->Flag_With_Borders)
              {
                if (Coord_Index[i] < 0) Coord_Index[i] = 0;
                if (Coord_Index[i] >= Vars->Coord_Bin[i]) Coord_Index[i] = Vars->Coord_Bin[i] - 1;
              }
            }
          } /* end for */

          /* update the PixelID, we compute it from the previous variables index */
          for (i = 1; i <= Vars->Coord_Number; i++) {
            char Set_Vars_Coord_Type = (Vars->Coord_Type[i] & (DEFS->COORD_LOG-1));
            if (Set_Vars_Coord_Type == DEFS->COORD_PIXELID) {
              char outsidebounds=0;
              Coord_Index[i] = Coord[i] = 0;
              for (j= 1; j < i; j++) {
                /* not for 1D variables with Bin=1 such as PixelID, NCOUNT, Intensity */
                if (Vars->Coord_Bin[j] == 1) continue; 
                if (0 > Coord_Index[j] || Coord_Index[j] >= Vars->Coord_Bin[j]) {
                  outsidebounds=1;
                  Coord[i] = 0;
                  break;
                }
                Coord[i] += Coord_Index[j]*Vars->Coord_BinProd[j-1];
              }
              if (!outsidebounds) {
                Vars->Mon2D_Buffer[i+While_Buffer*(Vars->Coord_Number+1)] = Coord[i];
              }
            } /* end if PixelID */
          }
          While_Buffer++;
        } /* end if in Buffer */
        else /* (While_Buffer >= Vars->Buffer_Block) && (Vars->Flag_Auto_Limits == 2) */
        {
          Vars->Flag_Auto_Limits = 0;
          While_End = 1;
          if (Vars->Flag_Verbose) printf("Monitor_nD: %s flushed %li Auto Limits from List (%li).\n", Vars->compcurname, Vars->Coord_Number, Vars->Buffer_Counter);
        }

        /* store n1d/2d section from Buffer */

        pp = Coord[0];
        /* apply per cm2 or per st */
        if (Vars->Flag_per_cm2 && Vars->area      != 0)
          pp /= Vars->area;
        
        /* 2D case : Vars->Coord_Number==2 and !Vars->Flag_Multiple and !Vars->Flag_List */
        if (!Vars->Flag_Multiple && Vars->Coord_NumberNoPixel == 2)
        { /* Dim : Vars->Coord_Bin[1]*Vars->Coord_Bin[2] matrix */
          i = Coord_Index[1];
          j = Coord_Index[2];
          if (i >= 0 && i < Vars->Coord_Bin[1] && j >= 0 && j < Vars->Coord_Bin[2])
          {
            if (Vars->Mon2D_N) {
              Vars->Mon2D_N[i][j]++;
              Vars->Mon2D_p[i][j] += pp;
              Vars->Mon2D_p2[i][j] += pp*pp;
            }
          } else if (Vars->Flag_Absorb) pp=0;
        }
        else
        /* 1D and n1D case : Vars->Flag_Multiple */
        { /* Dim : Vars->Coord_Number*Vars->Coord_Bin[i] vectors (intensity is not included) */
          for (i= 1; i <= Vars->Coord_Number; i++)
          {
            j = Coord_Index[i];
            if (j >= 0 && j < Vars->Coord_Bin[i])
            {
              if (Vars->Flag_Multiple && Vars->Mon2D_N) {
                Vars->Mon2D_N[i-1][j]++;
                Vars->Mon2D_p[i-1][j] += pp;
                Vars->Mon2D_p2[i-1][j] += pp*pp;
              }
            } else if (Vars->Flag_Absorb) {
              pp=0; break;
            }
          }
        } /* end store 2D/1D */
        
      } /* end while */
    } /* end Force Get Limits */

    /* write output files (sent to file as p[i*n + j] vectors) */
    if (Vars->Coord_Number == 0)
    {
      double Nsum;
      double psum, p2sum;
      Nsum = Vars->Nsum;
      psum = Vars->psum;
      p2sum= Vars->p2sum;
      if (Vars->Flag_signal != DEFS->COORD_P && Nsum > 0)
      { psum /=Nsum; p2sum /= Nsum*Nsum; }
      /* DETECTOR_OUT_0D(Vars->Monitor_Label, Vars->Nsum, Vars->psum, Vars->p2sum); */
      detector = mcdetector_out_0D(Vars->Monitor_Label, Nsum, psum, p2sum, Vars->compcurname, Vars->compcurpos, Vars->compcurrot,Vars->compcurindex);
    }
    else
    if (strlen(Vars->Mon_File) > 0)
    {
      fname = (char*)malloc(strlen(Vars->Mon_File)+10*Vars->Coord_Number);
      if (Vars->Flag_List && Vars->Mon2D_Buffer) /* List: DETECTOR_OUT_2D */
      {
       
        if (Vars->Flag_List >= 2) Vars->Buffer_Size = Vars->Neutron_Counter;
        if (Vars->Buffer_Size >= Vars->Neutron_Counter)
          Vars->Buffer_Size = Vars->Neutron_Counter;
        strcpy(fname,Vars->Mon_File);
        if (strchr(Vars->Mon_File,'.') == NULL) strcat(fname, "_list");

        strcpy(Coord_X_Label,"");
        for (i= 0; i <= Vars->Coord_Number; i++)
        {
          strcat(Coord_X_Label, Vars->Coord_Var[i]);
          strcat(Coord_X_Label, " ");
          if (strchr(Vars->Mon_File,'.') == NULL)
          { strcat(fname, "."); strcat(fname, Vars->Coord_Var[i]); }
        }
        if (Vars->Flag_Verbose) printf("Monitor_nD: %s write monitor file %s List (%lix%li).\n", Vars->compcurname, fname,(long int)Vars->Neutron_Counter,Vars->Coord_Number);

        /* handle the type of list output */
        strcpy(label, Vars->Monitor_Label);
        
        detector = mcdetector_out_list(
              label, "List of neutron events", Coord_X_Label,
              -Vars->Buffer_Size, Vars->Coord_Number+1,
              Vars->Mon2D_Buffer,
              fname, Vars->compcurname, Vars->compcurpos, Vars->compcurrot, Vars->option,Vars->compcurindex);
      }
      if (Vars->Flag_Multiple) /* n1D: DETECTOR_OUT_1D */
      {
        for (i= 0; i < Vars->Coord_Number; i++)
        {

          strcpy(fname,Vars->Mon_File);
          if (strchr(Vars->Mon_File,'.') == NULL)
          { strcat(fname, "."); strcat(fname, Vars->Coord_Var[i+1]); }
          sprintf(Coord_X_Label, "%s monitor", Vars->Coord_Label[i+1]);
          strcpy(label, Coord_X_Label);
          if (Vars->Coord_Bin[i+1] > 0) { /* 1D monitor */
            if (Vars->Flag_Verbose) printf("Monitor_nD: %s write monitor file %s 1D (%li).\n", Vars->compcurname, fname, Vars->Coord_Bin[i+1]);
            min1d = Vars->Coord_Min[i+1];
            max1d = Vars->Coord_Max[i+1];
            if (min1d == max1d) max1d = min1d+1e-6;
            p1m = (double *)malloc(Vars->Coord_Bin[i+1]*sizeof(double));
            p2m = (double *)malloc(Vars->Coord_Bin[i+1]*sizeof(double));
            if (p2m == NULL) /* use Raw Buffer line output */
            {
              if (Vars->Flag_Verbose) printf("Monitor_nD: %s cannot allocate memory for output. Using raw data.\n", Vars->compcurname);
              if (p1m != NULL) free(p1m);
              detector = mcdetector_out_1D(
              label,
              Vars->Coord_Label[i+1],
              Vars->Coord_Label[0],
              Vars->Coord_Var[i+1],
              min1d, max1d,
              Vars->Coord_Bin[i+1],
              Vars->Mon2D_N[i],Vars->Mon2D_p[i],Vars->Mon2D_p2[i],
              fname, Vars->compcurname, Vars->compcurpos, Vars->compcurrot,Vars->compcurindex);
            } /* if (p2m == NULL) */
            else
            {
              if (Vars->Flag_log != 0)
              {
                XY = FLT_MAX;
                for (j=0; j < Vars->Coord_Bin[i+1]; j++) /* search min of signal */
                  if ((XY > Vars->Mon2D_p[i][j]) && (Vars->Mon2D_p[i][j] > 0)) XY = Vars->Mon2D_p[i][j];
                if (XY <= 0) XY = -log(FLT_MAX)/log(10); else XY = log(XY)/log(10)-1;
              } /* if */

              for (j=0; j < Vars->Coord_Bin[i+1]; j++)
              {
                p1m[j] = Vars->Mon2D_p[i][j];
                p2m[j] = Vars->Mon2D_p2[i][j];
                if (Vars->Flag_signal != DEFS->COORD_P && Vars->Mon2D_N[i][j] > 0)
                { /* normalize mean signal to the number of events */
                  p1m[j] /= Vars->Mon2D_N[i][j];
                  p2m[j] /= Vars->Mon2D_N[i][j]*Vars->Mon2D_N[i][j];
                }
                if (Vars->Flag_log != 0)
                {
                  if ((p1m[j] > 0) && (p2m[j] > 0))
                  {
                    p2m[j] /= p1m[j]*p1m[j];
                    p1m[j] = log(p1m[j])/log(10);
                  }
                  else
                  {
                    p1m[j] = XY;
                    p2m[j] = 0;
                  }
                }
              } /* for */
              detector = mcdetector_out_1D(
                label,
                Vars->Coord_Label[i+1],
                Vars->Coord_Label[0],
                Vars->Coord_Var[i+1],
                min1d, max1d,
                Vars->Coord_Bin[i+1],
                Vars->Mon2D_N[i],p1m,p2m,
                fname, Vars->compcurname, Vars->compcurpos, Vars->compcurrot,Vars->compcurindex);

            } /* else */
            /* comment out 'free memory' lines to avoid loosing arrays if
               'detector' structure is used by other instrument parts
            if (p1m != NULL) free(p1m); p1m=NULL;
            if (p2m != NULL) free(p2m); p2m=NULL;
            */
          } else { /* 0d monitor */
            detector = mcdetector_out_0D(label, Vars->Mon2D_p[i][0], Vars->Mon2D_p2[i][0], Vars->Mon2D_N[i][0], Vars->compcurname, Vars->compcurpos, Vars->compcurrot,Vars->compcurindex);
          }


        } /* for */
      } /* if 1D */
      else
      if (Vars->Coord_NumberNoPixel == 2)  /* 2D: DETECTOR_OUT_2D */
      {
        strcpy(fname,Vars->Mon_File);

        p0m = (double *)malloc(Vars->Coord_Bin[1]*Vars->Coord_Bin[2]*sizeof(double));
        p1m = (double *)malloc(Vars->Coord_Bin[1]*Vars->Coord_Bin[2]*sizeof(double));
        p2m = (double *)malloc(Vars->Coord_Bin[1]*Vars->Coord_Bin[2]*sizeof(double));
        if (p2m == NULL)
        {
          if (Vars->Flag_Verbose) printf("Monitor_nD: %s cannot allocate memory for 2D array (%zi). Skipping.\n", Vars->compcurname, 3*Vars->Coord_Bin[1]*Vars->Coord_Bin[2]*sizeof(double));
          /* comment out 'free memory' lines to avoid loosing arrays if
               'detector' structure is used by other instrument parts
          if (p0m != NULL) free(p0m);
          if (p1m != NULL) free(p1m);
          */
        }
        else
        {
          if (Vars->Flag_log != 0)
          {
            XY = FLT_MAX;
            for (i= 0; i < Vars->Coord_Bin[1]; i++)
              for (j= 0; j < Vars->Coord_Bin[2]; j++) /* search min of signal */
                if ((XY > Vars->Mon2D_p[i][j]) && (Vars->Mon2D_p[i][j]>0)) XY = Vars->Mon2D_p[i][j];
            if (XY <= 0) XY = -log(FLT_MAX)/log(10); else XY = log(XY)/log(10)-1;
          }
          for (i= 0; i < Vars->Coord_Bin[1]; i++)
          {
            for (j= 0; j < Vars->Coord_Bin[2]; j++)
            {
              long index;
              index = j + i*Vars->Coord_Bin[2];
              p0m[index] = Vars->Mon2D_N[i][j];
              p1m[index] = Vars->Mon2D_p[i][j];
              p2m[index] = Vars->Mon2D_p2[i][j];
              if (Vars->Flag_signal != DEFS->COORD_P && p0m[index] > 0)
              {
                  p1m[index] /= p0m[index];
                  p2m[index] /= p0m[index]*p0m[index];
              }

              if (Vars->Flag_log != 0)
              {
                if ((p1m[index] > 0) && (p2m[index] > 0))
                {
                  p2m[index] /= (p1m[index]*p1m[index]);
                  p1m[index] = log(p1m[index])/log(10);

                }
                else
                {
                  p1m[index] = XY;
                  p2m[index] = 0;
                }
              }
            }
          }
          if (strchr(Vars->Mon_File,'.') == NULL)
          { strcat(fname, "."); strcat(fname, Vars->Coord_Var[1]);
              strcat(fname, "_"); strcat(fname, Vars->Coord_Var[2]); }
          if (Vars->Flag_Verbose) printf("Monitor_nD: %s write monitor file %s 2D (%lix%li).\n", Vars->compcurname, fname, Vars->Coord_Bin[1], Vars->Coord_Bin[2]);

          min1d = Vars->Coord_Min[1];
          max1d = Vars->Coord_Max[1];
          if (min1d == max1d) max1d = min1d+1e-6;
          min2d = Vars->Coord_Min[2];
          max2d = Vars->Coord_Max[2];
          if (min2d == max2d) max2d = min2d+1e-6;
          strcpy(label, Vars->Monitor_Label);
          if (Vars->Coord_Bin[1]*Vars->Coord_Bin[2] > 1
           && Vars->Flag_signal == DEFS->COORD_P)
            strcat(label, " per bin");
	  if (Vars->Flag_List) {
            detector = mcdetector_out_2D_list(
              label,
              Vars->Coord_Label[1],
	      Vars->Coord_Label[2],
	      min1d, max1d,
	      min2d, max2d,
	      Vars->Coord_Bin[1],
	      Vars->Coord_Bin[2],
	      p0m,p1m,p2m,
	      fname, Vars->compcurname, Vars->compcurpos, Vars->compcurrot,Vars->option,Vars->compcurindex);
	  } else {
            detector = mcdetector_out_2D(
              label,
              Vars->Coord_Label[1],
	      Vars->Coord_Label[2],
	      min1d, max1d,
	      min2d, max2d,
	      Vars->Coord_Bin[1],
	      Vars->Coord_Bin[2],
	      p0m,p1m,p2m,
	      fname, Vars->compcurname, Vars->compcurpos, Vars->compcurrot,Vars->compcurindex);
	  }

          /* comment out 'free memory' lines to avoid loosing arrays if
               'detector' structure is used by other instrument parts
          if (p0m != NULL) free(p0m);
          if (p1m != NULL) free(p1m);
          if (p2m != NULL) free(p2m);
          */
        }
      }
      free(fname);
    }
    return(detector);
  } /* end Monitor_nD_Save */

/* ========================================================================= */
/* Monitor_nD_Finally: this routine is used to free memory                   */
/* ========================================================================= */

void Monitor_nD_Finally(MonitornD_Defines_type *DEFS,
  MonitornD_Variables_type *Vars)
  {
    int i;

    /* Now Free memory Mon2D.. */
    if ((Vars->Flag_Auto_Limits || Vars->Flag_List) && Vars->Coord_Number)
    { /* Dim : (Vars->Coord_Number+1)*Vars->Buffer_Block matrix (for p, dp) */
      if (Vars->Mon2D_Buffer != NULL) free(Vars->Mon2D_Buffer);
    }

    /* 1D and n1D case : Vars->Flag_Multiple */
    if (Vars->Flag_Multiple && Vars->Coord_Number)
    { /* Dim : Vars->Coord_Number*Vars->Coord_Bin[i] vectors */
      for (i= 0; i < Vars->Coord_Number; i++)
      {
        free(Vars->Mon2D_N[i]);
        free(Vars->Mon2D_p[i]);
        free(Vars->Mon2D_p2[i]);
      }
      free(Vars->Mon2D_N);
      free(Vars->Mon2D_p);
      free(Vars->Mon2D_p2);
    }


    /* 2D case : Vars->Coord_Number==2 and !Vars->Flag_Multiple and !Vars->Flag_List */
    if ((Vars->Coord_NumberNoPixel == 2) && !Vars->Flag_Multiple)
    { /* Dim : Vars->Coord_Bin[1]*Vars->Coord_Bin[2] matrix */
      for (i= 0; i < Vars->Coord_Bin[1]; i++)
      {
        free(Vars->Mon2D_N[i]);
        free(Vars->Mon2D_p[i]);
        free(Vars->Mon2D_p2[i]);
      }
      free(Vars->Mon2D_N);
      free(Vars->Mon2D_p);
      free(Vars->Mon2D_p2);
    }
  } /* end Monitor_nD_Finally */

/* ========================================================================= */
/* Monitor_nD_McDisplay: this routine is used to display component           */
/* ========================================================================= */

void Monitor_nD_McDisplay(MonitornD_Defines_type *DEFS,
  MonitornD_Variables_type *Vars)
  {
    double radius, h;
    double xmin;
    double xmax;
    double ymin;
    double ymax;
    double zmin;
    double zmax;
    int    i;
    double hdiv_min=-180, hdiv_max=180, vdiv_min=-90, vdiv_max=90;
    char   restricted = 0;

    radius = Vars->Sphere_Radius;
    h = Vars->Cylinder_Height;
    xmin = Vars->mxmin;
    xmax = Vars->mxmax;
    ymin = Vars->mymin;
    ymax = Vars->mymax;
    zmin = Vars->mzmin;
    zmax = Vars->mzmax;

    /* determine if there are angular limits set at start (no auto) in coord_types
     * cylinder/banana: look for hdiv
     * sphere: look for angle, radius (->atan2(val,radius)), hdiv, vdiv
     * this activates a 'restricted' flag, to draw a region as blades on cylinder/sphere
     */
    for (i= 0; i <= Vars->Coord_Number; i++)
    {
      int Set_Vars_Coord_Type;
      Set_Vars_Coord_Type = (Vars->Coord_Type[i] & (DEFS->COORD_LOG-1));
      if (Set_Vars_Coord_Type == DEFS->COORD_HDIV || Set_Vars_Coord_Type == DEFS->COORD_THETA)
      { hdiv_min = Vars->Coord_Min[i]; hdiv_max = Vars->Coord_Max[i]; restricted = 1; }
      else if (Set_Vars_Coord_Type == DEFS->COORD_VDIV || Set_Vars_Coord_Type == DEFS->COORD_PHI)
      { vdiv_min = Vars->Coord_Min[i]; vdiv_max = Vars->Coord_Max[i];restricted = 1;  }
      else if (Set_Vars_Coord_Type == DEFS->COORD_ANGLE)
      { hdiv_min = vdiv_min = Vars->Coord_Min[i];
        hdiv_max = vdiv_max = Vars->Coord_Max[i];
        restricted = 1; }
      else if (Set_Vars_Coord_Type == DEFS->COORD_RADIUS)
      { double angle;
        angle = RAD2DEG*atan2(Vars->Coord_Max[i], radius);
        hdiv_min = vdiv_min = angle;
        hdiv_max = vdiv_max = angle;
        restricted = 1; }
      else if (Set_Vars_Coord_Type == DEFS->COORD_Y && abs(Vars->Flag_Shape) == DEFS->SHAPE_SPHERE)
      {
        vdiv_min = atan2(ymin,radius)*RAD2DEG;
        vdiv_max = atan2(ymax,radius)*RAD2DEG;
        restricted = 1;
      }
    }
    /* full sphere */
    if ((!restricted && (abs(Vars->Flag_Shape) == DEFS->SHAPE_SPHERE))
    || abs(Vars->Flag_Shape) == DEFS->SHAPE_PREVIOUS)
    {
      mcdis_magnify("");
      mcdis_circle("xy",0,0,0,radius);
      mcdis_circle("xz",0,0,0,radius);
      mcdis_circle("yz",0,0,0,radius);
    }
    /* banana/cylinder/sphere portion */
    else
    if (restricted && ((abs(Vars->Flag_Shape) == DEFS->SHAPE_CYLIND)
                    || (abs(Vars->Flag_Shape) == DEFS->SHAPE_BANANA)
                    || (abs(Vars->Flag_Shape) == DEFS->SHAPE_SPHERE)))
    {
      int NH=24, NV=24;
      int ih, iv;
      double width, height;
      int issphere;
      issphere = (abs(Vars->Flag_Shape) == DEFS->SHAPE_SPHERE);
      width = (hdiv_max-hdiv_min)/NH;
      if (!issphere) {
	NV=1; /* cylinder has vertical axis */
      }
      height= (vdiv_max-vdiv_min)/NV;
      
      /* check width and height of elements (sphere) to make sure the nb
         of plates remains limited */
      if (width < 10  && NH > 1) { width = 10;  NH=(hdiv_max-hdiv_min)/width; width=(hdiv_max-hdiv_min)/NH; }
      if (height < 10 && NV > 1) { height = 10; NV=(vdiv_max-vdiv_min)/height; height= (vdiv_max-vdiv_min)/NV; }
      
      mcdis_magnify("xyz");
      for(ih = 0; ih < NH; ih++)
        for(iv = 0; iv < NV; iv++)
        {
          double theta0, phi0, theta1, phi1;          /* angles in spherical coordinates */
          double x0,y0,z0,x1,y1,z1,x2,y2,z2,x3,y3,z3; /* vertices at plate edges */
          phi0 = (hdiv_min+ width*ih-90)*DEG2RAD;        /* in xz plane */
          phi1 = (hdiv_min+ width*(ih+1)-90)*DEG2RAD;
          if (issphere)
          {
            theta0= (vdiv_min+height* iv + 90)   *DEG2RAD; /* in vertical plane */
            theta1= (vdiv_min+height*(iv+1) + 90)*DEG2RAD;
            
            y0 = -radius*cos(theta0);            /* z with Z vertical */
            y1 = -radius*cos(theta1);
            if (y0 < ymin) y0=ymin;
            if (y0 > ymax) y0=ymax;
            if (y1 < ymin) y1=ymin;
            if (y1 > ymax) y1=ymax;
          } else {
            y0 = ymin;
            y1 = ymax;
            theta0=theta1=90*DEG2RAD;
          }

          x0 = radius*sin(theta0)*cos(phi0); /* x with Z vertical */
          z0 =-radius*sin(theta0)*sin(phi0); /* y with Z vertical */
          x1 = radius*sin(theta1)*cos(phi0); 
          z1 =-radius*sin(theta1)*sin(phi0);
          x2 = radius*sin(theta1)*cos(phi1); 
          z2 =-radius*sin(theta1)*sin(phi1);
          x3 = radius*sin(theta0)*cos(phi1); 
          z3 =-radius*sin(theta0)*sin(phi1);
          y2 = y1; y3 = y0;

          mcdis_multiline(5,
            x0,y0,z0,
            x1,y1,z1,
            x2,y2,z2,
            x3,y3,z3,
            x0,y0,z0);
        }
      if (Vars->Flag_mantid) {
	/* First define the base pixel type */
	double dt, dy;
	dt = (Vars->Coord_Max[1]-Vars->Coord_Min[1])/Vars->Coord_Bin[1];
	dy = (Vars->Coord_Max[2]-Vars->Coord_Min[2])/Vars->Coord_Bin[2];
	printf("MANTID_BANANA_DET:  %g, %g, %g, %g, %g, %li, %li, %llu\n", radius, 
	       Vars->Coord_Min[1],Vars->Coord_Max[1], Vars->Coord_Min[2],Vars->Coord_Max[2], Vars->Coord_Bin[1], Vars->Coord_Bin[2], (long long unsigned)Vars->Coord_Min[4]); 
      }
    }
    /* disk (circle) */
    else
    if (abs(Vars->Flag_Shape) == DEFS->SHAPE_DISK)
    {
      mcdis_magnify("");
      mcdis_circle("xy",0,0,0,radius);
    }
    /* rectangle (square) */
    else
    if (abs(Vars->Flag_Shape) == DEFS->SHAPE_SQUARE)
    {
      mcdis_magnify("xy");
      mcdis_multiline(5, (double)xmin, (double)ymin, 0.0,
             (double)xmax, (double)ymin, 0.0,
             (double)xmax, (double)ymax, 0.0,
             (double)xmin, (double)ymax, 0.0,
             (double)xmin, (double)ymin, 0.0);
      
      if (Vars->Flag_mantid) {
	/* First define the base pixel type */
	double dx, dy;
	dx = (Vars->Coord_Max[1]-Vars->Coord_Min[1])/Vars->Coord_Bin[1];
	dy = (Vars->Coord_Max[2]-Vars->Coord_Min[2])/Vars->Coord_Bin[2];
	printf("MANTID_RECTANGULAR_DET:  %g, %g, %g, %g, %li, %li, %llu\n", 
	       Vars->Coord_Min[1],Vars->Coord_Max[1], Vars->Coord_Min[2],Vars->Coord_Max[2], Vars->Coord_Bin[1], Vars->Coord_Bin[2], (long long unsigned)Vars->Coord_Min[4]);
      }
    }
    /* full cylinder/banana */
    else
    if (!restricted && ((abs(Vars->Flag_Shape) == DEFS->SHAPE_CYLIND) || (abs(Vars->Flag_Shape) == DEFS->SHAPE_BANANA)))
    {
      mcdis_magnify("xyz");
      mcdis_circle("xz", 0,  h/2.0, 0, radius);
      mcdis_circle("xz", 0, -h/2.0, 0, radius);
      mcdis_line(-radius, -h/2.0, 0, -radius, +h/2.0, 0);
      mcdis_line(+radius, -h/2.0, 0, +radius, +h/2.0, 0);
      mcdis_line(0, -h/2.0, -radius, 0, +h/2.0, -radius);
      mcdis_line(0, -h/2.0, +radius, 0, +h/2.0, +radius);
    }
    else
    /* box */
    if (abs(Vars->Flag_Shape) == DEFS->SHAPE_BOX)
    {
      mcdis_magnify("xyz");
      mcdis_multiline(5, xmin, ymin, zmin,
                   xmax, ymin, zmin,
                   xmax, ymax, zmin,
                   xmin, ymax, zmin,
                   xmin, ymin, zmin);
      mcdis_multiline(5, xmin, ymin, zmax,
                   xmax, ymin, zmax,
                   xmax, ymax, zmax,
                   xmin, ymax, zmax,
                   xmin, ymin, zmax);
      mcdis_line(xmin, ymin, zmin, xmin, ymin, zmax);
      mcdis_line(xmax, ymin, zmin, xmax, ymin, zmax);
      mcdis_line(xmin, ymax, zmin, xmin, ymax, zmax);
      mcdis_line(xmax, ymax, zmin, xmax, ymax, zmax);
    }
  } /* end Monitor_nD_McDisplay */

/* end of monitor_nd-lib.c */




/* Shared user declarations for all components types 'Guide_gravity'. */
/*****************************************************************************
*
* McStas, neutron ray-tracing package
*         Copyright 1997-2006, All rights reserved
*         Risoe National Laboratory, Roskilde, Denmark
*         Institut Laue Langevin, Grenoble, France
*
* Library: share/ref-lib.h
*
* %Identification
* Written by: Peter Christiansen
* Date: August, 2006
* Origin: RISOE
* Release: McStas 1.10
* Version: $Revision$
*
* Add StdDoubleReflecFunc, ExtendedReflecFunc
* Date: October, 2022
* Locale: ESS
* Release: McStas 2.7x, 3.1x
*
* Commonly used reflection functions are declared in this file which
* are used by some guide and mirror components.
*
* Depends on read_table-lib
*
* Usage: within SHARE
* %include "ref-lib"
*
****************************************************************************/


#ifndef REF_LIB_H
#define REF_LIB_H "$Revision$"

void StdReflecFunc(double, double*, double*);
void TableReflecFunc(double, t_Table*, double*);
void StdDoubleReflecFunc(double, double*, double*);
void ExtendedReflecFunc(double, double*, double*);

#endif

/* end of ref-lib.h */
/****************************************************************************
*
* McStas, neutron ray-tracing package
*         Copyright 1997-2006, All rights reserved
*         Risoe National Laboratory, Roskilde, Denmark
*         Institut Laue Langevin, Grenoble, France
*
* Library: share/ref-lib.c
*
* %Identification
* Written by: Peter Christiansen
* Date: August, 2006
* Origin: RISOE
* Release: McStas 1.10
* Version: $Revision$
*
* Add StdDoubleReflecFunc, ExtendedReflecFunc
* Date: October, 2022
* Locale: ESS
* Release: McStas 2.7.x, 3.x
*
* Commonly used reflection functions are declared in this file which
* are used by some guide and mirror components.
*
* Variable names have prefix 'mc_ref_' for 'McStas Reflection'
* to avoid conflicts
*
* Usage: within SHARE
* %include "ref-lib"
*
****************************************************************************/

#ifndef REF_LIB_H
#include "ref-lib.h"
#endif

#ifndef READ_TABLE_LIB_H
#include "read_table-lib.h"
#include "read_table-lib.c"
#endif

/****************************************************************************
* void StdReflecFunc(double q, double *par, double *r)
*
* The McStas standard analytic parametrization of the reflectivity.
* The parameters are:
* R0:      [1]    Low-angle reflectivity
* Qc:      [AA-1] Critical scattering vector
* alpha:   [AA]   Slope of reflectivity
* m:       [1]    m-value of material. Zero means completely absorbing.
* W:       [AA-1] Width of supermirror cut-off
*****************************************************************************/
#pragma acc routine seq
void StdReflecFunc(double mc_pol_q, double *mc_pol_par, double *mc_pol_r) {
    double R0    = mc_pol_par[0];
    double Qc    = mc_pol_par[1];
    double alpha = mc_pol_par[2];
    double m     = mc_pol_par[3];
    double W     = mc_pol_par[4];
    double beta  = 0;
    mc_pol_q     = fabs(mc_pol_q);
    double arg;
    double m_corr;

    /* Simpler parametrization from Henrik Jacobsen uses these values that depend on m only.
       double m_value=m*0.9853+0.1978;
       double W=-0.0002*m_value+0.0022;
       double alpha=0.2304*m_value+5.0944;
       double beta=-7.6251*m_value+68.1137;
       If W and alpha are set to 0, use Henrik's approach for estimating these parameters
       and apply the formulation:
       arg = R0*0.5*(1-tanh(arg))*(1-alpha*(q-Qc)+beta*(q-Qc)*(q-Qc));
    */
    if (W==0 && alpha==0) {
      m = m * 0.9853 + 0.1978;
      m_corr = m * 0.9853 - 0.7875;
      W = -0.0002 * m_corr + 0.0022;
      alpha = 0.2304 * m_corr + 5.0944;
      beta = -7.6251 * m_corr + 68.1137;
      if (m==3) {
	alpha = m_corr;
	beta = 0;
      }
      arg = (mc_pol_q - m*Qc)/W; // <--- here m, not m_corr!!
    }

    arg = W > 0 ? (mc_pol_q - m*Qc)/W : 11;

    if (arg > 10 || m <= 0 || Qc <=0 || R0 <= 0) {
      *mc_pol_r = 0;
      return;
    }

    if (m < 1) { Qc *= m; m=1; }

    if(mc_pol_q <= Qc) {
      *mc_pol_r = R0;
      return;
    }


    *mc_pol_r = R0*0.5*(1 - tanh(arg))*(1 - alpha*(mc_pol_q - Qc) + beta*(mc_pol_q - Qc)*(mc_pol_q - Qc));

    return;
  }

/****************************************************************************
* void TableReflecFunc(double q, t_Table *par, double *r) {
*
* Looks up the reflectivity in a table using the routines in read_table-lib.
*****************************************************************************/
#pragma acc routine seq
void TableReflecFunc(double mc_pol_q, t_Table *mc_pol_par, double *mc_pol_r) {

  *mc_pol_r = Table_Value(*mc_pol_par, mc_pol_q, 1);
  if(*mc_pol_r>1)
    *mc_pol_r = 1;
  return;
}


/****************************************************************************
* void StdDoubleReflecFunc(double q, double *par, double *r)
* 
* The McStas standard analytic parametrization of the reflectivity for 
* double-side coated supermirror.
* The parameters are:
* R0:      [1]    Low-angle reflectivity
* Qc:      [AA-1] Critical scattering vector
* alpha:   [AA]   Slope of reflectivity
* m:       [1]    m-value of material. Zero means completely absorbing.
* W:       [AA-1] Width of supermirror cut-off
*****************************************************************************/
void StdDoubleReflecFunc(double mc_pol_q, double *mc_pol_par, double *mc_pol_r) {
    double R0    = mc_pol_par[0];
    double Qc    = mc_pol_par[1];
    double alpha = mc_pol_par[2];
    double m     = mc_pol_par[3];
    double W     = mc_pol_par[4];
    double beta  = 0;
    mc_pol_q     = fabs(mc_pol_q);
    double arg;
        
    /* Simpler parametrization from Henrik Jacobsen uses these values that depend on m only.
       double m_value=m*0.9853+0.1978;
       double W=-0.0002*m_value+0.0022;
       double alpha=0.2304*m_value+5.0944;
       double beta=-7.6251*m_value+68.1137; 
       If W and alpha are set to 0, use Henrik's approach for estimating these parameters
       and apply the formulation:
       arg = R0*0.5*(1-tanh(arg))*(1-alpha*(q-Qc)+beta*(q-Qc)*(q-Qc));
    */  
    if (W==0 && alpha==0) {
      m=m*0.9853+0.1978;
      W=-0.0002*m+0.0022;
      alpha=0.2304*m+5.0944;
      beta=-7.6251*m+68.1137;
      if (m<=3) {
	alpha=m;
	beta=0;
      }
    }
    
    arg = W > 0 ? (mc_pol_q - m*Qc)/W : 11;

    if (arg > 10 || m <= 0 || Qc <=0 || R0 <= 0) {
      *mc_pol_r = 0;
      return;
    }
    
    if (m < 1) { Qc *= m; m=1; }
    
	/*
		Reflectivity R0 = single-side coated supermirror reflectivity
		double-side coated supermirror reflectivity = 1- (1-R0)^2
	*/
	
    if(mc_pol_q <= Qc) {      
      *mc_pol_r = 1- (1-R0)*(1-R0);
      return;
    }
    
    
    R0 = R0*0.5*(1 - tanh(arg))*(1 - alpha*(mc_pol_q - Qc) + beta*(mc_pol_q - Qc)*(mc_pol_q - Qc));
    *mc_pol_r = 1- (1-R0)*(1-R0);
   
    return;
  }

void ExtendedReflecFunc(double mc_pol_q, double *mc_pol_par, double *mc_pol_r) {
    double R0    = mc_pol_par[0];
    double Qc    = mc_pol_par[1];
    double alpha = mc_pol_par[2];
    double m     = mc_pol_par[3];
    double W     = mc_pol_par[4];
    double beta  = mc_pol_par[5];
    mc_pol_q     = fabs(mc_pol_q);
    double arg;

    /* Simpler parametrization from Henrik Jacobsen uses these values that depend on m only.
       double m_value=m*0.9853+0.1978;
       double W=-0.0002*m_value+0.0022;
       double alpha=0.2304*m_value+5.0944;
       double beta=-7.6251*m_value+68.1137;
       If W and alpha are set to 0, use Henrik's approach for estimating these parameters
       and apply the formulation:
       arg = R0*0.5*(1-tanh(arg))*(1-alpha*(q-Qc)+beta*(q-Qc)*(q-Qc));
    */
    if (W==0 && alpha==0) {
      m=m*0.9853+0.1978;
      W=-0.0002*m+0.0022;
      alpha=0.2304*m+5.0944;
      beta=-7.6251*m+68.1137;
      if (m<=3) {
	alpha=m;
	beta=0;
      }
    }

    arg = W > 0 ? (mc_pol_q - m*Qc)/W : 11;

    if (arg > 10 || m <= 0 || Qc <=0 || R0 <= 0) {
      *mc_pol_r = 0;
      return;
    }

    if (m < 1) { Qc *= m; m=1; }

    if(mc_pol_q <= Qc) {
      *mc_pol_r = R0;
      return;
    }


    *mc_pol_r = R0*0.5*(1 - tanh(arg))*(1 - alpha*(mc_pol_q - Qc) + beta*(mc_pol_q - Qc)*(mc_pol_q - Qc));

    return;
  }

/* end of ref-lib.c */

  #ifndef Gravity_guide_Version
  #define Gravity_guide_Version "$Revision$"

  #ifndef PROP_GRAV_DT
  #error McStas : You need PROP_GRAV_DT (McStas >= 1.4.3) to run this component
  #endif

  /*
   * G:       (m/s^2) Gravitation acceleration along y axis [-9.81]
   * Gx:      (m/s^2) Gravitation acceleration along x axis [0]
   * Gy:      (m/s^2) Gravitation acceleration along y axis [-9.81]
   * Gz:      (m/s^2) Gravitation acceleration along z axis [0]
   * mh:      (1)    m-value of material for left/right vert. mirrors
   * mv:      (1)    m-value of material for top/bottom horz. mirrors
   * mx:      (1)    m-value of material for left/right vert. mirrors
   * my:      (1)    m-value of material for top/bottom horz. mirrors
   */

  typedef struct Gravity_guide_Vars {
    double gx;
    double gy;
    double gz;
    double nx[6], ny[6], nz[6];
    double wx[6], wy[6], wz[6];
    double A[6], norm_n2[6], norm_n[6];
    long N_reflection[7];
    double w1c, h1c;
    double w2c, h2c;
    double M[5];
    double Alpha[5];
    double nzC[5], norm_n2xy[5], Axy[5];
    double wav_lr, wav_tb, wav_z;
    double chamfer_z, chamfer_lr, chamfer_tb;
    char compcurname[256];
    double fc_freq, fc_phase;
    double warnings;
  } Gravity_guide_Vars_type;

  void
  Gravity_guide_Init (Gravity_guide_Vars_type* aVars, MCNUM a_w1, MCNUM a_h1, MCNUM a_w2, MCNUM a_h2, MCNUM a_l, MCNUM a_R0, MCNUM a_Qc, MCNUM a_alpha, MCNUM a_m,
                      MCNUM a_W, MCNUM a_nslit, MCNUM a_d, MCNUM a_Gx, MCNUM a_Gy, MCNUM a_Gz, MCNUM a_mleft, MCNUM a_mright, MCNUM a_mtop, MCNUM a_mbottom,
                      MCNUM a_nhslit, MCNUM a_wavy_lr, MCNUM a_wavy_tb, MCNUM a_wavy_z, MCNUM a_wavy, MCNUM a_chamfers_z, MCNUM a_chamfers_lr,
                      MCNUM a_chamfers_tb, MCNUM a_chamfers, MCNUM a_nu, MCNUM a_phase, MCNUM a_aleft, MCNUM a_aright, MCNUM a_atop, MCNUM a_abottom) {
    int i;

    for (i = 0; i < 7; aVars->N_reflection[i++] = 0)
      ;
    for (i = 0; i < 5; aVars->M[i++] = 0)
      ;
    for (i = 0; i < 5; aVars->Alpha[i++] = 0)
      ;

    aVars->gx = a_Gx; /* The gravitation vector in the current component axis system */
    aVars->gy = a_Gy;
    aVars->gz = a_Gz;
    aVars->warnings = 0;

    if (a_nslit <= 0 || a_nhslit <= 0) {
      fprintf (stderr, "%s: Fatal: no channel in this guide (nhslit or nslit=0).\n", aVars->compcurname);
      exit (-1);
    }
    if (a_d < 0) {
      fprintf (stderr, "%s: Fatal: subdividing walls have negative thickness in this guide (d<0).\n", aVars->compcurname);
      exit (-1);
    }
    aVars->w1c = (a_w1 - (a_nslit - 1) * a_d) / (double)a_nslit;
    aVars->w2c = (a_w2 - (a_nslit - 1) * a_d) / (double)a_nslit;
    aVars->h1c = (a_h1 - (a_nhslit - 1) * a_d) / (double)a_nhslit;
    aVars->h2c = (a_h2 - (a_nhslit - 1) * a_d) / (double)a_nhslit;

    for (i = 0; i <= 4; aVars->M[i++] = a_m)
      ;
    for (i = 0; i <= 4; aVars->Alpha[i++] = a_alpha)
      ;
    if (a_mleft >= 0)
      aVars->M[1] = a_mleft;
    if (a_mright >= 0)
      aVars->M[2] = a_mright;
    if (a_mtop >= 0)
      aVars->M[3] = a_mtop;
    if (a_mbottom >= 0)
      aVars->M[4] = a_mbottom;
    if (a_aleft >= 0)
      aVars->Alpha[1] = a_aleft;
    if (a_aright >= 0)
      aVars->Alpha[2] = a_aright;
    if (a_atop >= 0)
      aVars->Alpha[3] = a_atop;
    if (a_abottom >= 0)
      aVars->Alpha[4] = a_abottom;

    /* n: normal vectors to surfaces */
    aVars->nx[1] = a_l;
    aVars->ny[1] = 0;
    aVars->nz[1] = 0.5 * (aVars->w2c - aVars->w1c); /* 1:+X left       */
    aVars->nx[2] = -a_l;
    aVars->ny[2] = 0;
    aVars->nz[2] = -aVars->nz[1]; /* 2:-X right      */
    aVars->nx[3] = 0;
    aVars->ny[3] = a_l;
    aVars->nz[3] = 0.5 * (aVars->h2c - aVars->h1c); /* 3:+Y top        */
    aVars->nx[4] = 0;
    aVars->ny[4] = -a_l;
    aVars->nz[4] = -aVars->nz[3]; /* 4:-Y bottom     */
    aVars->nx[5] = 0;
    aVars->ny[5] = 0;
    aVars->nz[5] = a_l; /* 5:+Z exit       */
    aVars->nx[0] = 0;
    aVars->ny[0] = 0;
    aVars->nz[0] = -a_l; /* 0:Z0 input      */
    /* w: a point on these surfaces */
    aVars->wx[1] = +(aVars->w1c) / 2;
    aVars->wy[1] = 0;
    aVars->wz[1] = 0; /* 1:+X left       */
    aVars->wx[2] = -(aVars->w1c) / 2;
    aVars->wy[2] = 0;
    aVars->wz[2] = 0; /* 2:-X right      */
    aVars->wx[3] = 0;
    aVars->wy[3] = +(aVars->h1c) / 2;
    aVars->wz[3] = 0; /* 3:+Y top        */
    aVars->wx[4] = 0;
    aVars->wy[4] = -(aVars->h1c) / 2;
    aVars->wz[4] = 0; /* 4:-Y bottom     */
    aVars->wx[5] = 0;
    aVars->wy[5] = 0;
    aVars->wz[5] = a_l; /* 5:+Z exit       */
    aVars->wx[0] = 0;
    aVars->wy[0] = 0;
    aVars->wz[0] = 0; /* 0:Z0 input      */

    for (i = 0; i <= 5; i++) {
      aVars->A[i] = scalar_prod (aVars->nx[i], aVars->ny[i], aVars->nz[i], aVars->gx, aVars->gy, aVars->gz) / 2;
      aVars->norm_n2[i] = aVars->nx[i] * aVars->nx[i] + aVars->ny[i] * aVars->ny[i] + aVars->nz[i] * aVars->nz[i];
      if (aVars->norm_n2[i] <= 0) {
        fprintf (stderr, "%s: Fatal: normal vector norm %i is null/negative ! check guide dimensions.\n", aVars->compcurname, i);
        exit (-1);
      } /* should never occur */
      else
        aVars->norm_n[i] = sqrt (aVars->norm_n2[i]);
    }
    /* partial computations for l/r/t/b sides, to save computing time */
    for (i = 1; i <= 4; i++) {      /* stores nz that changes in case non box element (focus/defocus) */
      aVars->nzC[i] = aVars->nz[i]; /* partial xy terms */
      aVars->norm_n2xy[i] = aVars->nx[i] * aVars->nx[i] + aVars->ny[i] * aVars->ny[i];
      aVars->Axy[i] = (aVars->nx[i] * aVars->gx + aVars->ny[i] * aVars->gy) / 2;
    }
    /* handle waviness init */
    if (a_wavy && (!a_wavy_tb && !a_wavy_lr && !a_wavy_z)) {
      aVars->wav_tb = aVars->wav_lr = aVars->wav_z = a_wavy;
    } else {
      aVars->wav_tb = a_wavy_tb;
      aVars->wav_lr = a_wavy_lr;
      aVars->wav_z = a_wavy_z;
    }
    aVars->wav_tb *= DEG2RAD / (sqrt (8 * log (2))); /* Convert from deg FWHM to rad Gaussian sigma */
    aVars->wav_lr *= DEG2RAD / (sqrt (8 * log (2)));
    aVars->wav_z *= DEG2RAD / (sqrt (8 * log (2)));
    /* handle chamfers init */
    if (a_chamfers && (!a_chamfers_z && !a_chamfers_lr && !a_chamfers_tb)) {
      aVars->chamfer_z = aVars->chamfer_lr = aVars->chamfer_tb = a_chamfers;
    } else {
      aVars->chamfer_z = a_chamfers_z;
      aVars->chamfer_lr = a_chamfers_lr;
      aVars->chamfer_tb = a_chamfers_tb;
    }

    aVars->fc_freq = a_nu;
    aVars->fc_phase = a_phase;
  }

  #pragma acc routine seq
  int
  Gravity_guide_Trace (double* dt, Gravity_guide_Vars_type* aVars, double cx, double cy, double cz, double cvx, double cvy, double cvz, double cxnum, double cxk,
                       double cynum, double cyk, double* cnx, double* cny, double* cnz, _class_particle* _particle) {
    double B, C;
    int ret = 0;
    int side = 0;
    double n1;
    double dt0, dt_min = 0;
    int i;
    double loc_num, loc_nslit;
    int i_slope = 3;

    /* look if there is a previous intersection with guide sides */
    /* A = 0.5 n.g; B = n.v; C = n.(r-W); */
    /* 5=+Z side: n=(0, 0, -l) ; W = (0, 0, l) (at z=l, guide exit)*/
    B = aVars->nz[5] * cvz;
    C = aVars->nz[5] * (cz - aVars->wz[5]);
    ret = solve_2nd_order (&dt0, NULL, aVars->A[5], B, C);
    if (ret && dt0 > 1e-10) {
      dt_min = dt0;
      side = 5;
    }

    loc_num = cynum;
    loc_nslit = cyk;
    for (i = 4; i > 0; i--) {
      if (i == 2) {
        i_slope = 1;
        loc_num = cxnum;
        loc_nslit = cxk;
      }

      if (aVars->nzC[i_slope] != 0) {
        n1 = loc_nslit - 2 * (loc_num); /* slope of l/r/u/d sides depends on the channel ! */
        loc_num++;                      /* use partial computations to alter nz and A */
        aVars->nz[i] = aVars->nzC[i] * n1;
        aVars->A[i] = aVars->Axy[i] + aVars->nz[i] * aVars->gz / 2;
      }
      if (i < 3) {
        B = aVars->nx[i] * cvx + aVars->nz[i] * cvz;
        C = aVars->nx[i] * (cx - aVars->wx[i]) + aVars->nz[i] * cz;
      } else {
        B = aVars->ny[i] * cvy + aVars->nz[i] * cvz;
        C = aVars->ny[i] * (cy - aVars->wy[i]) + aVars->nz[i] * cz;
      }
      ret = solve_2nd_order (&dt0, NULL, aVars->A[i], B, C);
      if (ret && dt0 > 1e-10 && (dt0 < dt_min || !dt_min)) {
        dt_min = dt0;
        side = i;
        if (aVars->nzC[i] != 0) {
          aVars->norm_n2[i] = aVars->norm_n2xy[i] + aVars->nz[i] * aVars->nz[i];
          aVars->norm_n[i] = sqrt (aVars->norm_n2[i]);
        }
      }
    }

    *dt = dt_min;
    /* handles waviness: rotate n vector */
    if (side > 0 && side < 5 && (aVars->wav_z || aVars->wav_lr || aVars->wav_tb)) {
      double nt_x, nt_y, nt_z; /* transverse vector */
      double nn_x, nn_y, nn_z; /* normal vector (tmp) */
      double phi;
      /* normal vector n_z = [ 0,0,1], n_t = n x n_z; */
      vec_prod (nt_x, nt_y, nt_z, aVars->nx[side], aVars->ny[side], aVars->nz[side], 0, 0, 1);
      /* rotate n with angle wavy_z around n_t -> nn */
      if (aVars->wav_z) {
        phi = aVars->wav_z;
        rotate (nn_x, nn_y, nn_z, aVars->nx[side], aVars->ny[side], aVars->nz[side], aVars->wav_z * randnorm (), nt_x, nt_y, nt_z);
      } else {
        nn_x = aVars->nx[side];
        nn_y = aVars->ny[side];
        nn_z = aVars->nz[side];
      }
      /* rotate n with angle wavy_{x|y} around n_z -> nt */
      phi = (side <= 2) ? aVars->wav_lr : aVars->wav_tb;
      if (phi) {
        rotate (nt_x, nt_y, nt_z, nn_x, nn_y, nn_z, phi * randnorm (), 0, 0, 1);
      } else {
        nt_x = nn_x;
        nt_y = nn_y;
        nt_z = nn_z;
      }
      *cnx = nt_x;
      *cny = nt_y;
      *cnz = nt_z;
    } else {
      *cnx = aVars->nx[side];
      *cny = aVars->ny[side];
      *cnz = aVars->nz[side];
    }
    return (side);
  }



  #endif

/* Shared user declarations for all components types 'Guide_tapering'. */


/* Shared user declarations for all components types 'Monochromator_curved'. */
  #pragma acc routine
  double
  GAUSS_monocurved (double x, double mean, double rms) {
    return (exp (-((x) - (mean)) * ((x) - (mean)) / (2 * (rms) * (rms))) / (sqrt (2 * PI) * (rms)));
  }



/* Shared user declarations for all components types 'Isotropic_Sqw'. */

  #ifndef ISOTROPIC_SQW
  #define ISOTROPIC_SQW $Revision$

  /* {j d F2 DW Dd inv2d q F} + { Sq if j == -1}*/
  #ifndef Crystallographica
  #define Crystallographica { 4,5,7,0,0,0,0, 0,0 }
  #define Fullprof          { 4,0,8,0,0,5,0, 0,0 }
  #define Undefined         { 0,0,0,0,0,0,0, 0,0 }
  #define Lazy              {17,6,0,0,0,0,0,13,0 }
  #endif
  /* special case for [q,Sq] table */
  #define qSq               {-1,0,0,0,0,0,1, 0,0 }




  /* For the density of states S(w) */
  struct Sqw_W_struct {
    double omega;       /* omega value for the data block */
    double cumul_proba; /* cumulated intensity (between 0 and 1) */
  };

  /* For the S(q|w) probabilities */
  struct Sqw_Q_struct {
    double Q;           /* omega value for the data block */
    double cumul_proba; /* normalized cumulated probability */
  };

  struct Sqw_Data_struct /* contains normalized Sqw data for probabilities, coh and inc */
  {
    struct Sqw_W_struct* SW;   /* P(w)  ~ density of states */
    struct Sqw_Q_struct** SQW; /* P(Q|w)= probability of each Q with w */

    long* SW_lookup;
    long** QW_lookup;
    t_Table Sqw;  /* S(q,w) rebin from file in range -w_max:w_max and 0:q_max, with exp(-hw/kT) weight */
    t_Table iqSq; /* sigma(Ei) = sigma/2/Ki^2 * \int q S(q,w) dq dw up to 2*Ki_max */
    long q_bins;
    long w_bins;          /* length of q and w vectors/axes from file */
    double q_max, q_step; /* min=0      */
    double w_max, w_step; /* min=-w_max */
    long lookup_length;
    char filename[80];
    double intensity;
    double Ei_max; /* max neutron incoming energy for Sigma=iqSq table */
    long iqSq_length;
    char type;
    double q_min_file;
  };

  struct Sqw_sample_struct { /* global parameters gathered as a structure */
    char compname[256];

    struct Sqw_Data_struct Data_inc;
    struct Sqw_Data_struct Data_coh;

    double s_abs, s_coh, s_inc; /* material constants */
    double my_s;
    double my_a_v;
    double mat_rho;
    double mat_weight;
    double mat_density;
    double Temperature; /* temperature from the data file */
    int shape;          /* 0:cylinder, 1:box, 2:sphere 3:any shape*/

    double sqw_threshold; /* options to tune S(q,w) */
    double sqw_classical;
    double sqw_norm;

    double barns; /* for powders */
    double Dd, DWfactor;

    double T2E; /* constants */
    char Q_correction[256];
    double sqSE2K;

    int maxloop; /* flags to monitor caught warnings */
    int minevents;
    long neutron_removed;
    long neutron_enter;
    long neutron_pmult;
    long neutron_exit;
    char verbose_output;
    int column_order[9]; /* column signification */
    long lookup_length;

    double dq, dw; /* q/w transfer */
    char type;     /* interaction type: c(coherent),             i(incoherent),
                                        V(isotropic incoherent), t(transmitted) */
    /* store information from the last event */
    double ki_x, ki_y, ki_z, kf_x, kf_y, kf_z;
    double ti, tf;
    double vi, vf;
    double ki, kf;
    double theta;

    double mean_scatt; /* stat to show at the end */
    double mean_abs;
    double psum_scatt;
    double single_coh;
    double single_inc;
    double multi;

    double rw, rq;
  };

  #include <stdio.h>
  #include <math.h>

  /* sets a Data S(q,w) to 'NULL' */
  void
  Sqw_Data_init (struct Sqw_Data_struct* Sqw_Data) {
    Sqw_Data->q_bins = 0;
    Sqw_Data->w_bins = 0;
    Sqw_Data->q_max = 0;
    Sqw_Data->q_step = 1;
    Sqw_Data->w_max = 0;
    Sqw_Data->w_step = 1;
    Sqw_Data->Ei_max = 0;
    Sqw_Data->lookup_length = 100; /* length of lookup tables */
    Sqw_Data->intensity = 0;
    strcpy (Sqw_Data->filename, "");
    Sqw_Data->SW = NULL;
    Sqw_Data->SQW = NULL;
    Sqw_Data->SW_lookup = NULL;
    Sqw_Data->QW_lookup = NULL;
    Sqw_Data->iqSq_length = 100;
    Sqw_Data->type = ' ';
    Sqw_Data->q_min_file = 0;
  }

  off_struct offdata;

  /* gaussian distribution to appply around Bragg peaks in a powder */
  double
  Sqw_powder_gauss (double x, double mean, double rms) {
    return (exp (-(x - mean) * (x - mean) / (2 * rms * rms)) / (sqrt (2 * PI) * rms));
  }

  /* Sqw_quantum_correction
  *
  * Return the 'quantum correction factor Q so that:
  *
  *   S(q, w) = Q(w) S*(q,w)
  *   S(q,-w) = exp(-hw/kT) S(q,w)
  *   S(q, w) = exp( hw/kT) S(q,-w)
  *
  * with S*=classical limit and Q(w) defined below. For omega > 0, S(q,w) > S(q,-w)
  *
  * input:
  *   w: energy      [meV]
  *   T: temperature [K]
  *   type: 'Schofield' or 'Boltzmann'        Q = exp(hw/kT/2)
  *         'harmonic'  or 'Bader'            Q = hw/kT./(1-exp(-hw/kT))
  *         'standard'  or 'Frommhold'        Q = 2./(1+exp(-hw/kT)) [recommended]
  *
  * References:
  *  B. Hehr, http://www.lib.ncsu.edu/resolver/1840.16/7422 PhD manuscript (2010).
  *  S. A. Egorov, K. F. Everitt and J. L. Skinner. J. Phys. Chem., 103, 9494 (1999).
  *  P. Schofield. Phys. Rev. Lett., 4, 239 (1960).
  *  J. S. Bader and B. J. Berne. J. Chem. Phys., 100, 8359 (1994).
  *  T. D. Hone and G. A. Voth. J. Chem. Phys., 121, 6412 (2004).
  *  L. Frommhold. Collision-induced absorption in gases, 1 st ed., Cambridge
  *    Monographs on Atomic, Molecular, and Chemical Physics, Vol. 2,
  *    Cambridge Univ. Press: London (1993).

   */
  double
  Sqw_quantum_correction (double hw, double T, char* type) {
    double Q = 1;
    double kT = T / 11.605; /* [K] -> [meV = 1000*KB/e] */
    if (!hw || !T)
      return 1;
    if (type == NULL || !strcmp (type, "standard") || !strcmp (type, "Frommhold") || !strcmp (type, "default"))
      Q = 2 / (1 + exp (-hw / kT));
    if (!strcmp (type, "Schofield") || !strcmp (type, "Boltzmann"))
      Q = exp (hw / kT / 2);
    if (!strcmp (type, "harmonic") || !strcmp (type, "Bader"))
      Q = hw / kT / (1 - exp (-hw / kT));

    return Q;
  }

  /*****************************************************************************
   * Sqw_read_PowderN: Read PowderN data files
   *   Returns t_Table array or NULL in case of error
   * Used in : Sqw_readfile (1)
   *****************************************************************************/
  t_Table*
  Sqw_read_PowderN (struct Sqw_sample_struct* Sqw, t_Table sqwTable) {
    struct line_data {
      double F2;       /* Value of structure factor */
      double q;        /* Q vector */
      int j;           /* Multiplicity */
      double DWfactor; /* Debye-Waller factor */
      double w;        /* Intrinsic line width */
    };
    struct line_data* list = NULL;
    double q_count = 0, j_count = 0, F2_count = 0;
    int mult_count = 0;
    double q_step = FLT_MAX;
    long size = 0;
    int i, index;
    double q_min = 0, q_max = 0;
    char flag = 0;
    int list_count = 0;
    double q_step_cur;
    char flag_qSq = 0;

    t_Table* retTable;

    flag_qSq = (Sqw->column_order[8] > 0 && Sqw->column_order[6] > 0);

    MPI_MASTER (if (Sqw->column_order[0] == 4 && Sqw->barns != 0)
                    printf ("Isotropic_sqw: %s: Powder file probably of type Crystallographica/Fullprof (lau)\n"
                            "WARNING:       but F2 unit is set to powder_barns=1 (barns). Intensity might be 100 times too high.\n",
                            Sqw->compname);
                if (Sqw->column_order[0] == 17 && Sqw->barns == 0)
                    printf ("Isotropic_sqw: %s: Powder file probably of type Lazy Pulver (laz)\n"
                            "WARNING:       but F2 unit is set to powder_barns=0 (fm^2). Intensity might be 100 times too low.\n",
                            Sqw->compname););
    size = sqwTable.rows;
    MPI_MASTER (if (Sqw->verbose_output > 0) {
      printf ("Isotropic_sqw: Converting %ld %s from %s into S(q,w) data\n", size, flag_qSq ? "S(q)" : "powder lines", sqwTable.filename);
    });
    /* allocate line_data array */
    list = (struct line_data*)malloc (size * sizeof (struct line_data));

    for (i = 0; i < size; i++) {
      double j = 0, d = 0, w = 0, DWfactor = 0, F2 = 0, Sq = -1, q = 0;
      int index;

      if (Sqw->Dd >= 0)
        w = Sqw->Dd;
      if (Sqw->DWfactor > 0)
        DWfactor = Sqw->DWfactor;

      /* get data from table using columns {j d F2 DW Dd inv2d q} + { Sq }*/
      /* column indexes start at 1, thus need to substract 1 */
      if (Sqw->column_order[0] > 0)
        j = Table_Index (sqwTable, i, Sqw->column_order[0] - 1);
      if (Sqw->column_order[1] > 0)
        d = Table_Index (sqwTable, i, Sqw->column_order[1] - 1);
      if (Sqw->column_order[2] > 0)
        F2 = Table_Index (sqwTable, i, Sqw->column_order[2] - 1);
      if (Sqw->column_order[3] > 0)
        DWfactor = Table_Index (sqwTable, i, Sqw->column_order[3] - 1);
      if (Sqw->column_order[4] > 0)
        w = Table_Index (sqwTable, i, Sqw->column_order[4] - 1);
      if (Sqw->column_order[5] > 0 && !(Sqw->column_order[1] > 0)) {
        d = Table_Index (sqwTable, i, Sqw->column_order[5] - 1);
        if (d)
          d = 1 / d / 2;
      }
      if (Sqw->column_order[6] > 0)
        q = Table_Index (sqwTable, i, Sqw->column_order[6] - 1);
      if (Sqw->column_order[7] > 0 && !F2) {
        F2 = Table_Index (sqwTable, i, Sqw->column_order[7] - 1);
        F2 *= F2;
      }

      if (Sqw->column_order[8] > 0)
        Sq = Table_Index (sqwTable, i, Sqw->column_order[8] - 1);

      if (q > 0 && Sq >= 0)
        F2 = Sq;
      if (d > 0 && q <= 0)
        q = 2 * PI / d;

      /* assign and check values */
      j = (j > 0 ? j : 0);
      if (flag_qSq)
        j = 1;
      DWfactor = (DWfactor > 0 ? DWfactor : 1);
      w = (w > 0 ? w : 0);
      F2 = (F2 >= 0 ? F2 : 0);
      d = (q > 0 ? 2 * PI / d : 0);
      if (j == 0 || d == 0 || q == 0) {
        MPI_MASTER (printf ("Isotropic_sqw: %s: Warning: line %i has invalid definition\n"
                            "         (mult=0 or q=0 or d=0)\n",
                            Sqw->compname, i););
        continue;
      }
      list[list_count].j = j;
      list[list_count].q = q;
      list[list_count].DWfactor = DWfactor;
      list[list_count].w = w;
      list[list_count].F2 = F2; /* or S(q) if flag_qSq */

      if (q_max < d)
        q_max = q;
      if (q_min > d)
        q_min = q;
      if (list_count > 1) {
        q_step_cur = fabs (list[list_count].q - list[list_count - 1].q);
        if (q_step_cur > 1e-5 && (!q_step || q_step_cur < q_step))
          q_step = q_step_cur;
      }

      /* adjust multiplicity if j-column + multiple d-spacing lines */
      /* if  d = previous d, increase line duplication index */
      if (!q_count)
        q_count = q;
      if (!j_count)
        j_count = j;
      if (!F2_count)
        F2_count = F2;
      if (fabs (q_count - q) < 0.0001 * fabs (q) && fabs (F2_count - F2) < 0.0001 * fabs (F2) && j_count == j) {
        mult_count++;
        flag = 0;
      } else
        flag = 1;
      if (i == size - 1)
        flag = 1;
      /* else if d != previous d : just passed equivalent lines */
      if (flag) {
        if (i == size - 1)
          list_count++;
        /*   if duplication index == previous multiplicity */
        /*      set back multiplicity of previous lines to 1 */
        if (Sqw->verbose_output > 2 && (mult_count == list[list_count - 1].j || (mult_count == list[list_count].j && i == size - 1))) {
          MPI_MASTER (printf ("Isotropic_Sqw: %s: Setting multiplicity to 1 for lines [%i:%i]\n"
                              "         (d-spacing %g is duplicated %i times)\n",
                              Sqw->compname, list_count - mult_count, list_count - 1, list[list_count - 1].q, mult_count););
          for (index = list_count - mult_count; index < list_count; list[index++].j = 1)
            ;
          mult_count = 1;
          q_count = q;
          j_count = j;
          F2_count = F2;
        }
        if (i == size - 1)
          list_count--;
        flag = 0;
      }
      list_count++;
    } /* end for */

    /* now builds new Table_Array to continue with Sqw_readfile */
    if (q_max == q_min || !q_step)
      return (NULL);
    if (!flag_qSq)
      size = 3 * q_max / q_step; /* set a default of 3 q values per line */
    else
      size = list_count;
    /* update the value of q_step */
    q_step = q_max / size;
    MPI_MASTER (if (Sqw->verbose_output > 0) printf ("Isotropic_sqw: q range [%g:%g], creating %li elements vector\n", q_min, q_max, size););

    retTable = (t_Table*)calloc (4, sizeof (t_Table));
    if (!retTable)
      printf ("Isotropic_Sqw: ERROR: Cannot allocate PowderN->Sqw table.\n");
    else {
      char* header;
      if (!Table_Init (&retTable[0], size, 1)) {
        printf ("Isotropic_Sqw: ERROR Cannot allocate q-axis [%li] from Powder lines.\n", size);
        return (NULL);
      }
      if (!Table_Init (&retTable[1], 1, 1)) {
        printf ("Isotropic_Sqw: ERROR Cannot allocate w-axis from Powder lines.\n");
        return (NULL);
      }
      if (!Table_Init (&retTable[2], size, 1)) {
        printf ("Isotropic_Sqw: ERROR Cannot allocate Sqw [%li] from Powder lines.\n", size);
        return (NULL);
      }
      Table_Init (&retTable[3], 0, 0);

      header = malloc (64);
      if (header) {
        retTable[0].header = header;
        strcpy (retTable[0].header, "q");
      }
      header = malloc (64);
      if (header) {
        retTable[1].header = header;
        strcpy (retTable[1].header, "w");
      }
      header = malloc (64);
      if (header) {
        retTable[2].header = header;
        strcpy (retTable[2].header, "Sqw");
      }
      for (i = 0; i < 4; i++) {
        retTable[i].array_length = 3;
        retTable[i].block_number = i + 1;
      }
      if (!flag_qSq)
        for (i = 0; i < size; i++)
          retTable[0].data[i] = i * q_max / size;
      for (i = 0; i < list_count; i++) { /* loop on each Bragg peak */
        double peak_qmin, peak_qmax, factor, q;
        if (list[i].w > 0 && !flag_qSq) {
          peak_qmin = list[i].q * (1 - list[i].w * 3);
          peak_qmax = list[i].q * (1 + list[i].w * 3);
        } else { /* Dirac peak, no width */
          peak_qmin = peak_qmax = list[i].q;
        }
        /* S(q) intensity is here */
        factor = list[i].j * (list[i].DWfactor ? list[i].DWfactor : 1) * Sqw->mat_rho * PI / 2 / (Sqw->type == 'c' ? Sqw->s_coh : Sqw->s_inc) * list[i].F2
                 / list[i].q / list[i].q;
        if (Sqw->barns)
          factor *= 100;
        for (q = peak_qmin; q <= peak_qmax; q += q_step) {
          index = (long)floor (size * q / q_max);
          if (index < 0)
            index = 0;
          else if (index >= size)
            index = size - 1;
          if (flag_qSq) {
            retTable[2].data[index] += list[i].F2;
            retTable[0].data[index] = list[i].q;
          } else {
            if (list[i].w <= 0 || list[i].w * q < q_step) /* step function */
              retTable[2].data[index] += factor / q_step;
            else /* gaussian */
              retTable[2].data[index] += factor * Sqw_powder_gauss (q, list[i].q, list[i].w * list[i].q);
          }
        }
      } /* end for i */
      Table_Stat (&retTable[0]);
      Table_Stat (&retTable[1]);
      Table_Stat (&retTable[2]);
      Sqw->sqw_norm = 0; /* F2 are normalized already */
    }

    return (retTable);
  } /* Sqw_read_PowderN */

  /*****************************************************************************
   *  Sqw_search_SW: For a given random number 'randnum', search for the bin
   *   containing  the corresponding Sqw->SW
   *  Choose an energy in the projected S(w) distribution
   * Used in : TRACE (1)
   *****************************************************************************/
  #pragma acc routine seq
  int
  Sqw_search_SW (struct Sqw_Data_struct Sqw, double randnum) {
    int index_w = 0;

    if (randnum < 0)
      randnum = 0;
    if (randnum > 1)
      randnum = 1;

    if (Sqw.w_bins == 1)
      return (0);
    /* benefit from fast lookup table if exists */
    if (Sqw.SW_lookup) {
      index_w = Sqw.SW_lookup[(long)floor (randnum * Sqw.lookup_length)] - 1;
      if (index_w < 0)
        index_w = 0;
    }

    while (index_w < Sqw.w_bins && (&(Sqw.SW[index_w]) != NULL) && (randnum > Sqw.SW[index_w].cumul_proba))
      index_w++;
    if (index_w >= Sqw.w_bins)
      index_w = Sqw.w_bins - 1;

    if (&(Sqw.SW[index_w]) == NULL) {
      printf ("Isotropic_Sqw: Warning: No corresponding value in the SW. randnum too big.\n");
      printf ("  index_w=%i ; randnum=%f ; Sqw.SW[index_w-1].cumul_proba=%f (Sqw_search_SW)\n", index_w, randnum, Sqw.SW[index_w - 1].cumul_proba);
      return index_w - 1;
    } else
      return (index_w);
  }

  /*****************************************************************************
   *  Sqw_search_Q_proba_per_w: For a given random number randnum, search for
   *   the bin containing the corresponding Sqw.SW in the Q probablility grid
   *  Choose a momentum in the S(q|w) distribution
   *  index is given by Sqw_search_SW
   * Used in : TRACE (1)
   *****************************************************************************/
  #pragma acc routine seq
  int
  Sqw_search_Q_proba_per_w (struct Sqw_Data_struct Sqw, double randnum, int index_w) {
    int index_q = 0;

    if (randnum < 0)
      randnum = 0;
    if (randnum > 1)
      randnum = 1;

    /* benefit from fast lookup table if exists */
    if (Sqw.QW_lookup && Sqw.QW_lookup[index_w]) {
      index_q = Sqw.QW_lookup[index_w][(long)floor (randnum * Sqw.lookup_length)] - 1;
      if (index_q < 0)
        index_q = 0;
    }

    while (index_q < Sqw.q_bins && (&(Sqw.SQW[index_w][index_q]) != NULL) && (randnum > Sqw.SQW[index_w][index_q].cumul_proba)) {
      index_q++;
    }
    if (index_q >= Sqw.q_bins)
      index_q = Sqw.q_bins - 1;

    if (&(Sqw.SQW[index_w][index_q]) == NULL)
      return -1;
    else
      return (index_q);
  }

  /*****************************************************************************
   * compute the effective total cross section \int q S(q,w) dw dq
   * for incoming neutron energy 0 < Ei < 2*w_max, and
   * integration range w=-w_max:Ei and q=Q0:Q1 with
   *   Q0 = SE2Q*(sqrt(Ei)-sqrt(Ei-w))=|Ki-Kf|
   *   Q1 = SE2Q*(sqrt(Ei)+sqrt(Ei-w))=|Ki+Kf|
   * The data to use is Sqw_Data->Sqw, and the limits are Sqw_Data->w_max Sqw_Data->q_max
   *   Returns the integral value
   * Used in: Sqw_readfile (1)
   *****************************************************************************/
  #pragma acc routine seq
  double
  Sqw_integrate_iqSq (struct Sqw_Data_struct* Sqw_Data, double Ei) {
    long index_w;
    double iqSq = 0;
    /* w=Ei-Ef q=ki-kf w>0 neutron looses energy, Stokes, Ef = Ei-w > 0, Kf =|Ki-q| > 0 */
    for (index_w = 0; index_w < Sqw_Data->w_bins; index_w++) {
      long index_q;
      double w = -Sqw_Data->w_max + index_w * Sqw_Data->w_step; /* in the Sqw table */
      if (w <= Ei) {                                            /* integration range w=-w_max:Ei, Ef = Ei-w > 0 */
        double sq = 0, Q0 = 0, Q1 = 0;
        sq = sqrt (Ei - w); /* always real as test was true before */
        Q0 = SE2V * V2K * (sqrt (Ei) - sq);
        Q1 = SE2V * V2K * (sqrt (Ei) + sq);

        for (index_q = 0; index_q < Sqw_Data->q_bins; index_q++) {
          double q = (double)index_q * Sqw_Data->q_step;
          /* add 'pixel' = q S(q,w) */
          if (Q0 <= q && q <= Q1)
            iqSq += q * Table_Index (Sqw_Data->Sqw, index_q, index_w);
        }
      }
    }
    /* multiply by 'pixel' size = dq dw */
    return (iqSq * Sqw_Data->q_step * Sqw_Data->w_step);
  } /* Sqw_integrate_iqSq */

  /*****************************************************************************
   * Sqw_diagnosis: Computes Sqw_classical, moments and physical quantities
   *                make consistency checks, and output some data files
   *   Return: output files and information displayed
   * Used in: Sqw_init (2) only by MASTER node with MPI
   *****************************************************************************/
  void
  Sqw_diagnosis (struct Sqw_sample_struct* Sqw, struct Sqw_Data_struct* Sqw_Data) {

    t_Table Sqw_cl;         /* the Sqw symmetric/classical version (T-> Inf) */
    t_Table Gqw;            /* the generalized density of states as of Carpenter and Price, J Non Cryst Sol 92 (1987) 153 */
    t_Table Sqw_moments[7]; /* M0=S(q) M1=E_r M3 w_c w_l M0_cl=S_cl(q) G(w) */
    t_Table w_c, w_l;
    long index_q, index_w;
    char c[CHAR_BUF_LENGTH]; /* temporary variable */
    long q_min_index = 0;

    char do_coh = 0, do_inc = 0;
    double q_min = 0;
    double u2 = 0, S0 = 1;
    long u2_count = 0;

    if (!Sqw_Data || !Sqw_Data->intensity)
      return; /* nothing to do with empty S(q,w) */

    if (Sqw_Data->type == 'c')
      do_coh = 1;
    if (Sqw_Data->type == 'i')
      do_inc = 1;

    q_min = Sqw_Data->q_min_file;
    if (q_min <= 0)
      q_min = Sqw_Data->q_step;

    /* test if there is only one S(q,w) available */
    if (!((Sqw->Data_inc).intensity) || !((Sqw->Data_coh).intensity))
      do_coh = do_inc = 1; /* do both if only one file given */

    if (Sqw->Temperature > 0) {
      if (!Table_Init (&Sqw_cl, Sqw_Data->q_bins, Sqw_Data->w_bins)) {
        printf ("Isotropic_Sqw: %s: Cannot allocate S_cl(q,w) Table (%lix%i).\n"
                "WARNING          Skipping S(q,w) diagnosis.\n",
                Sqw->compname, Sqw_Data->q_bins, 1);
        return;
      }
      sprintf (Sqw_cl.filename, "S(q,w)_cl from %s (dynamic structure factor, classical)", Sqw_Data->filename);
      Sqw_cl.block_number = 1;
      Sqw_cl.min_x = 0;
      Sqw_cl.max_x = Sqw_Data->q_max;
      Sqw_cl.step_x = Sqw_Data->q_step;
    }

    /* initialize moments and 1D stuff */
    for (index_q = 0; index_q < 6; index_q++) {
      if (!Table_Init (&Sqw_moments[index_q], Sqw_Data->q_bins, 1)) {
        printf ("Isotropic_Sqw: %s: Cannot allocate S(q,w) moment %ld Table (%lix%i).\n"
                "WARNING          Skipping S(q,w) diagnosis.\n",
                Sqw->compname, index_q, Sqw_Data->q_bins, 1);
        Table_Free (&Sqw_cl);
        return;
      }
      Sqw_moments[index_q].block_number = 1;
      Sqw_moments[index_q].min_x = 0;
      Sqw_moments[index_q].max_x = Sqw_Data->q_max;
      Sqw_moments[index_q].step_x = Sqw_Data->q_step;
    }
    index_q = 6;
    Table_Init (&Sqw_moments[index_q], Sqw_Data->w_bins, 1);
    Sqw_moments[index_q].block_number = 1;
    Sqw_moments[index_q].min_x = -Sqw_Data->w_max;
    Sqw_moments[index_q].max_x = Sqw_Data->w_max;
    Sqw_moments[index_q].step_x = Sqw_Data->w_step;

    /* set Table titles */
    sprintf (Sqw_moments[0].filename, "S(q)=M0(q) from %s [int S(q,w) dw]", Sqw_Data->filename);
    sprintf (Sqw_moments[1].filename, "M1(q) 1-st moment from %s [int w S(q,w) dw] = HBAR^2*q^2/2/m (f-sum rule, recoil, Lovesey T1 Eq 3.63 p72, Egelstaff p196)",
             Sqw_Data->filename);
    sprintf (Sqw_moments[2].filename, "M3(q) 3-rd moment from %s [int w^3 S(q,w) dw] = M1(q)*w_l^2(q)", Sqw_Data->filename);
    sprintf (Sqw_moments[3].filename,
             "w_c(q) = sqrt(M1(q)/M0(q)*2kT) collective excitation from %s (Lovesey T1 Eq 5.38 p180, p211 Eq 5.204). Gaussian half-width of the S(q,w) classical",
             Sqw_Data->filename);
    sprintf (Sqw_moments[4].filename, "w_l(q) = sqrt(M3(q)/M1(q)) harmonic frequency from %s (Lovesey T1 5.39 p 180)", Sqw_Data->filename);
    sprintf (Sqw_moments[5].filename, "S_cl(q)=M0_cl(q) from %s [int S_cl(q,w) dw]", Sqw_Data->filename);
    sprintf (Sqw_moments[6].filename, "G(w) generalized effective density of states from %s (Carpenter J Non Cryst Sol 92 (1987) 153)", Sqw_Data->filename);

    for (index_q = 0; index_q < Sqw_Data->q_bins; index_q++) {
      double q = index_q * Sqw_Data->q_step; /* q value in Sqw_full ; q_min = 0 */
      double sq = 0;                         /* S(q) = w0 = 0-th moment */
      double w1 = 0;                         /* first  moment      \int w     Sqw dw */
      double w3 = 0;                         /* third  moment      \int w^3   Sqw dw */
      double sq_cl = 0;                      /* S(q) = M0 = 0-th moment classical */
      double w_c = 0;
      double w_l = 0;

      for (index_w = 0; index_w < Sqw_Data->w_bins; index_w++) {

        double w = -Sqw_Data->w_max + index_w * Sqw_Data->w_step; /* w value in Sqw_full */
        double sqw_cl = 0;
        double sqw_full = 0;

        sqw_full = Table_Index (Sqw_Data->Sqw, index_q, index_w);

        /* Sqw moments */
        if (w && Sqw_Data->w_bins) {
          double tmp;
          tmp = sqw_full * Sqw_Data->w_step;
          tmp *= w;
          w1 += tmp;
          tmp *= w * w;
          w3 += tmp;
        }

        /* compute classical Sqw and S(q)_cl */
        if (Sqw->Temperature > 0) {
          double n;
          sqw_cl = sqw_full * Sqw_quantum_correction (-w, Sqw->Temperature, Sqw->Q_correction);
          if (!Table_SetElement (&Sqw_cl, index_q, index_w, sqw_cl))
            printf ("Isotropic_Sqw: %s: "
                    "Error when setting Sqw_cl[%li q=%g,%li w=%g]=%g from file %s\n",
                    Sqw->compname, index_q, q, index_w, w, sqw_cl, Sqw_Data->filename);
          sq_cl += sqw_cl;
        }
        sq += sqw_full;
      } /* for index_w */

      sq *= Sqw_Data->w_step; /* S(q) = \int S(q,w) dw = structure factor */
      sq_cl *= Sqw_Data->w_step;
      /* find minimal reliable q value (not interpolated) */
      if (q >= q_min && !q_min_index && sq) {
        q_min_index = index_q;
        q_min = q;
        if (0.9 < sq)
          S0 = sq; /* minimum reliable S(q) */
        else
          S0 = 1;
      }
      /* compute <u^2> = <3 * ln(S(q)) / q^2> */
      if (q_min_index && q && S0 && sq) {
        u2 += 3 * log (sq / S0) / q / q;
        u2_count++;
      }

      /* store moment values (q) as M0=S(q) M1=E_r M3 w_c w_l M0_cl=S_cl(q) */
      Table_SetElement (&Sqw_moments[0], index_q, 0, sq);
      Table_SetElement (&Sqw_moments[1], index_q, 0, w1);
      Table_SetElement (&Sqw_moments[2], index_q, 0, w3);
      if (w1 > 0 && sq && Sqw->Temperature > 0) {
        double w_c = sqrt (w1 / sq * 2 * Sqw->Temperature * Sqw->T2E); /* HBAR^2 q^2 kT /m/ S(q) */
        Table_SetElement (&Sqw_moments[3], index_q, 0, w_c);           /* collective dispersion */
      }
      if (w1 && w3 * w1 > 0) {
        double w_l = sqrt (w3 / w1);
        Table_SetElement (&Sqw_moments[4], index_q, 0, w_l); /* harmonic dispersion */
      }
      if (Sqw->Temperature > 0)
        Table_SetElement (&Sqw_moments[5], index_q, 0, sq_cl);

    } /* for index_q */

    /* display some usefull information, only once in MPI mode (MASTER) */
    if (Sqw->Temperature > 0) {
      double Da = 1.660538921e-27; /* [kg] unified atomic mass unit = Dalton = 1 g/mol */
                                   #ifndef KB
      double KB = 1.3806503e-23;   /* [J/K] */
      /* HBAR   = 1.05457168e-34 */
      #endif
      double CELE = 1.602176487e-19;               /* [C] Elementary charge CODATA 2006 'e' */
      double meV2Hz = CELE / HBAR / 1000 / 2 / PI; /* 1 meV = 241.80e9 GHz */
      double gqw_sum = 0;

      /* classical Sqw */
      sprintf (c, "%s_%s_cl.sqw", Sqw->compname, Sqw_Data->type == 'c' ? "coh" : "inc");
      Table_Write (Sqw_cl, c, "Momentum [Angs-1]", "'S(q,w)*exp(hw/2kT) classical limit' Energy [meV]", 0, Sqw_Data->q_max, -Sqw_Data->w_max, Sqw_Data->w_max);
      Table_Free (&Sqw_cl);

      if (u2_count)
        u2 /= u2_count;

      MPI_MASTER (
          if (do_coh || do_inc) printf ("Isotropic_Sqw: %s: "
                                        "Physical constants from the S(q,w) %s for T=%g [K]. Values are estimates.\n",
                                        Sqw->compname, Sqw_Data->filename, Sqw->Temperature);
          if (do_coh) {
            if (Sqw->mat_weight) {
              double LAMBDA = HBAR * 2 * PI / sqrt (2 * PI * Sqw->mat_weight * Da * KB * Sqw->Temperature) * 1e10; /* in [Angs] */
              double z = Sqw->mat_rho * LAMBDA * LAMBDA * LAMBDA;                                                  /* fugacity , rho=N/V in [Angs-3]*/
              double mu = KB * Sqw->Temperature * log (z);                                                         /* perfect gas chemical potential */
              printf ("# De Broglie wavelength     LAMBDA=%g [Angs]\n", LAMBDA);
              printf ("# Fugacity                       z=%g (from Egelstaff p32 Eq 2.31)\n", z);
              printf ("# Chemical potential            mu=%g [eV] (eq. perfect gas)\n", mu / CELE);
            }

            /* compute isothermal sound velocity and compressibility */
            /* get the S(q_min) value and the corresponding w_c */

            if (q_min_index > 0 && q_min && q_min < 0.6) {
              double w_c = Table_Index (Sqw_moments[3], q_min_index, 0); /* meV */
              /* HBAR = [J*s] */
              double c_T = 2 * PI * w_c * meV2Hz / q_min / 1e10; /* meV*Angs -> m/s */
              double ChiT = S0 / (KB * Sqw->Temperature * Sqw->mat_rho * 1e30);
              printf ("# Isothermal compressibility Chi_T=%g [Pa-1] (Egelstaff  p201 Eq 10.21) at q=%g [Angs-1]\n", ChiT, q_min);
              printf ("# Isothermal sound velocity    c_T=%g [m/s]  (Lovesey T1 p210 Eq 5.197) at q=%g [Angs-1]\n", c_T, q_min);

              /* Computation if C11 is rather tricky as it is obtained from w_l, which is usually quite noisy
               * This means that the obtained values are not reliable from C = rho c_l^2 (Egelstaff Eq 14.10b p284)
               * C44 = rho c_c^2 ~ C11/3
               */
              double w_l = Table_Index (Sqw_moments[4], q_min_index, 0); /* meV */
              double c_l = 2 * PI * w_l * meV2Hz / q_min / 1e10;         /* meV*Angs -> m/s */
              double C11 = (Sqw->mat_weight * Da) * (Sqw->mat_rho * 1e30) * c_l * c_l;
              printf ("# Elastic modulus              C11=%g [GPa]  (Egelstaff Eq 14.10b p284) [rough estimate] at q=%g [Angs-1]\n", C11 / 1e9, q_min);
            }
          } if (do_inc) {
            /* display the mean square displacement from S(q) = exp(-<u^2>q^2/3)
                 <u^2>= <3 * ln(S(q)) / q^2>
             */
            if (u2_count && u2) {
              printf ("# Mean square displacement   <u^2>=%g [Angs^2] (<3 * ln(S(q)) / q^2>)\n", u2);
            }

            /* compute the mean diffusion coefficient D=w_c/q^2 */
            /* FWHM of gaussian is Gamma*RMS2FWHM, only in diffusive regime (Q < 0.2 Angs-1) */
            if (q_min_index > 0 && q_min && q_min < 0.6) {
              double w_c = Table_Index (Sqw_moments[3], q_min_index, 0);
              double D = 2 * PI * w_c * meV2Hz / q_min / q_min / 1e14 * RMS2FWHM / 2; /* meV*Angs^2 -> mm^2/s */
              printf ("# Diffusion coefficient          D=%g [mm^2/s] (Egelstaff p220)\n", D);
              if (u2_count && u2 && D)
                printf ("# Jump relaxation time         tau=%g [ns] (Egelstaff Eq 11.8 p220)\n", u2 * 1e-2 / 6 / D);
            }
          }); /* MPI_MASTER */

      /* density of states (generalized) */
      if (!Table_Init (&Gqw, Sqw_Data->q_bins, Sqw_Data->w_bins)) {
        printf ("Isotropic_Sqw: %s: Cannot allocate G(q,w) Table (%lix%i).\n"
                "WARNING          Skipping S(q,w) diagnosis.\n",
                Sqw->compname, Sqw_Data->q_bins, 1);
        return;
      }
      sprintf (Gqw.filename, "G(q,w) from %s (generalized density of states, Carpenter J Non Cryst Sol 92 (1987) 153)", Sqw_Data->filename);
      Gqw.block_number = 1;
      Gqw.min_x = 0;
      Gqw.max_x = Sqw_Data->q_max;
      Gqw.step_x = Sqw_Data->q_step;

      for (index_w = 0; index_w < Sqw_Data->w_bins; index_w++) {
        double w = -Sqw_Data->w_max + index_w * Sqw_Data->w_step; /* w value in Sqw_full */
        double gw = 0;
        for (index_q = 0; index_q < Sqw_Data->q_bins; index_q++) {
          double q = index_q * Sqw_Data->q_step; /* q value in Sqw_full ; q_min = 0 */
          double sqw_full = Table_Index (Sqw_Data->Sqw, index_q, index_w);
          double n = 1 / (exp (w / (Sqw->Temperature * Sqw->T2E)) - 1); /* Bose factor */
          double DW = q && u2 ? exp (2 * u2 * q * q / 6) : 1;           /* Debye-Weller factor */
          double gqw = q && n + 1 ? sqw_full * DW * 2 * (Sqw->mat_weight * Da) * w / (n + 1) / q / q : 0;
          if (!Table_SetElement (&Gqw, index_q, index_w, gqw))
            printf ("Isotropic_Sqw: %s: "
                    "Error when setting Gqw[%li q=%g,%li w=%g]=%g from file %s\n",
                    Sqw->compname, index_q, q, index_w, w, gqw, Sqw_Data->filename);
          gw += gqw;
          gqw_sum += gqw;
        }
        Table_SetElement (&Sqw_moments[6], index_w, 0, gw);
      }

      /* normalize the density of states */
      for (index_w = 0; index_w < Sqw_Data->w_bins; index_w++) {
        double gw = Table_Index (Sqw_moments[6], index_w, 0);
        Table_SetElement (&Sqw_moments[6], index_w, 0, gw / gqw_sum);
        for (index_q = 0; index_q < Sqw_Data->q_bins; index_q++) {
          double gqw = Table_Index (Gqw, index_q, index_w);
          Table_SetElement (&Gqw, index_q, index_w, gqw / gqw_sum);
        }
      }

      /* write Gqw and free memory */
      if (Sqw_Data->w_bins > 1) {
        sprintf (c, "%s_%s.gqw", Sqw->compname, Sqw_Data->type == 'c' ? "coh" : "inc");
        Table_Write (Gqw, c, "Momentum [Angs-1]", "'Generalized density of states' Energy [meV]", 0, Sqw_Data->q_max, -Sqw_Data->w_max, Sqw_Data->w_max);
        Table_Free (&Gqw);
      }
    } /* if T>0 */

    /* write all tables to disk M0=S(q) M1=E_r M3 w_c w_l M0_cl=S_cl(q) */
    if (Sqw_Data->w_bins > 1) {
      sprintf (c, "%s_%s.m1", Sqw->compname, Sqw_Data->type == 'c' ? "coh" : "inc");
      Table_Write (Sqw_moments[1], c, "Momentum [Angs-1]", "int w S(q,w) dw (recoil) q^2/2m [meV]", 0, Sqw_Data->q_max, 0, 0);
      sprintf (c, "%s_%s.w_l", Sqw->compname, Sqw_Data->type == 'c' ? "coh" : "inc");
      Table_Write (Sqw_moments[4], c, "Momentum [Angs-1]", "w_l(q) harmonic frequency [meV]", 0, Sqw_Data->q_max, 0, 0);
      sprintf (c, "%s_%s.sqw", Sqw->compname, Sqw_Data->type == 'c' ? "coh" : "inc");
      Table_Write (Sqw_Data->Sqw, c, "Momentum [Angs-1]", "'S(q,w) dynamical structure factor [meV-1]' Energy [meV]", 0, Sqw_Data->q_max, -Sqw_Data->w_max,
                   Sqw_Data->w_max);

      if (Sqw->Temperature > 0) {
        sprintf (c, "%s_%s.w_c", Sqw->compname, Sqw_Data->type == 'c' ? "coh" : "inc");
        Table_Write (Sqw_moments[3], c, "Momentum [Angs-1]", "w_c(q) collective excitation [meV]", 0, Sqw_Data->q_max, 0, 0);
        sprintf (c, "%s_%s_cl.sq", Sqw->compname, Sqw_Data->type == 'c' ? "coh" : "inc");
        Table_Write (Sqw_moments[5], c, "Momentum [Angs-1]", "int S_cl(q,w) dw", 0, Sqw_Data->q_max, 0, 0);
        sprintf (c, "%s_%s.gw", Sqw->compname, Sqw_Data->type == 'c' ? "coh" : "inc");
        Table_Write (Sqw_moments[6], c, "Energy [meV]", "'Generalized effective density of states' Energy [meV]", -Sqw_Data->w_max, Sqw_Data->w_max, 0, 0);
      }
    }
    sprintf (c, "%s_%s.sq", Sqw->compname, Sqw_Data->type == 'c' ? "coh" : "inc");
    Table_Write (Sqw_moments[0], c, "Momentum [Angs-1]", "S(q) = int S(q,w) dw", 0, Sqw_Data->q_max, 0, 0);
    sprintf (c, "%s_%s.sigma", Sqw->compname, Sqw_Data->type == 'c' ? "coh" : "inc");
    Table_Write (Sqw_Data->iqSq, c, "Energy [meV]", "sigma kf/ki int q S(q,w) dw scattering cross section [barns]", 0, 0, 0, 0);

    /* free Tables */
    for (index_q = 0; index_q < 7; Table_Free (&Sqw_moments[index_q++]))
      ;

  } /* Sqw_diagnosis */

  /*****************************************************************************
   * Sqw_readfile: Read Sqw data files
   *   Returns Sqw_Data_struct or NULL in case of error
   * Used in : Sqw_init (2)
   *****************************************************************************/
  struct Sqw_Data_struct*
  Sqw_readfile (struct Sqw_sample_struct* Sqw, char* file, struct Sqw_Data_struct* Sqw_Data) {

    t_Table* Table_Array = NULL;
    long nblocks = 0;
    char flag = 0;

    t_Table Sqw_full, iqSq; /* the Sqw (non symmetric) and total scattering X section */

    double sum = 0;
    double mat_at_nb = 1;
    double iq2Sq = 0;
    long* SW_lookup = NULL;
    long** QW_lookup = NULL;
    char** parsing = NULL;

    long index_q, index_w;
    double q_min_file, q_max_file, q_step_file;
    long q_bins_file;
    double w_min_file, w_max_file, w_step_file;
    long w_bins_file;
    double q_max, q_step;
    long q_bins;
    double w_max, w_step;
    long w_bins;

    double alpha = 0;

    double M1 = 0;
    double M1_cl = 0;
    double T = 0;
    double T_file = 0;
    long T_count = 0;
    long M1_count = 0;
    long M1_cl_count = 0;

    /* setup default */
    Sqw_Data_init (Sqw_Data);

    if (!file || !strlen (file) || !strcmp (file, "NULL") || !strcmp (file, "0"))
      return (Sqw_Data);
    /* read the Sqw file */
    Table_Array = Table_Read_Array (file, &nblocks);
    strncpy (Sqw_Data->filename, file, 80);
    if (!Table_Array)
      return (NULL);

    /* (1) parsing of header ================================================== */
    parsing = Table_ParseHeader (Table_Array[0].header, "Vc", "V_0", "sigma_abs", "sigma_a ", "sigma_inc", "sigma_i ", "column_j",                       /* 6 */
                                 "column_d", "column_F2", "column_DW", "column_Dd", "column_inv2d", "column_1/2d", "column_sintheta_lambda", "column_q", /* 14 */
                                 "sigma_coh", "sigma_c ", "Temperature", "column_Sq", "column_F ",                                                       /* 19 */
                                 "V_rho", "density", "weight", "nb_atoms", "multiplicity", "classical", NULL);
    if (parsing) {
      int i;
      if (parsing[0] && !Sqw->mat_rho)
        Sqw->mat_rho = 1 / atof (parsing[0]);
      if (parsing[1] && !Sqw->mat_rho)
        Sqw->mat_rho = 1 / atof (parsing[1]);
      if (parsing[2] && !Sqw->s_abs)
        Sqw->s_abs = atof (parsing[2]);
      if (parsing[3] && !Sqw->s_abs)
        Sqw->s_abs = atof (parsing[3]);
      if (parsing[4] && !Sqw->s_inc)
        Sqw->s_inc = atof (parsing[4]);
      if (parsing[5] && !Sqw->s_inc)
        Sqw->s_inc = atof (parsing[5]);
      if (parsing[6])
        Sqw->column_order[0] = atoi (parsing[6]);
      if (parsing[7])
        Sqw->column_order[1] = atoi (parsing[7]);
      if (parsing[8])
        Sqw->column_order[2] = atoi (parsing[8]);
      if (parsing[9])
        Sqw->column_order[3] = atoi (parsing[9]);
      if (parsing[10])
        Sqw->column_order[4] = atoi (parsing[10]);
      if (parsing[11])
        Sqw->column_order[5] = atoi (parsing[11]);
      if (parsing[12])
        Sqw->column_order[5] = atoi (parsing[12]);
      if (parsing[13])
        Sqw->column_order[5] = atoi (parsing[13]);
      if (parsing[14])
        Sqw->column_order[6] = atoi (parsing[14]);
      if (parsing[15] && !Sqw->s_coh)
        Sqw->s_coh = atof (parsing[15]);
      if (parsing[16] && !Sqw->s_coh)
        Sqw->s_coh = atof (parsing[16]);
      if (parsing[17] && !Sqw->Temperature)
        Sqw->Temperature = atof (parsing[17]); /* from user or file */
      if (parsing[17])
        T_file = atof (parsing[17]); /* from file */
      if (parsing[18])
        Sqw->column_order[8] = atoi (parsing[18]);
      if (parsing[19])
        Sqw->column_order[7] = atoi (parsing[19]);
      if (parsing[20] && !Sqw->mat_rho)
        Sqw->mat_rho = atof (parsing[20]);
      if (parsing[21] && !Sqw->mat_density)
        Sqw->mat_density = atof (parsing[21]);
      if (parsing[22] && !Sqw->mat_weight)
        Sqw->mat_weight = atof (parsing[22]);
      if (parsing[23])
        mat_at_nb = atof (parsing[23]);
      if (parsing[24])
        mat_at_nb = atof (parsing[24]);
      if (parsing[25]) { /* classical is found in the header */
        char* endptr;
        double value = strtod (parsing[25], &endptr);
        if (*endptr == *parsing[25]) {
          if (Sqw->sqw_classical < 0)
            Sqw->sqw_classical = 1;
        } else
          Sqw->sqw_classical = value;
      }
      for (i = 0; i <= 25; i++)
        if (parsing[i])
          free (parsing[i]);
      free (parsing);
    }

    /* compute the scattering unit density from material weight and density */
    /* the weight of the scattering element is the chemical formula molecular weight
     * times the nb of chemical formulae in the scattering element (nb_atoms) */
    if (!Sqw->mat_rho && Sqw->mat_density > 0 && Sqw->mat_weight > 0 && mat_at_nb > 0) {
      /* molar volume [cm^3/mol] = weight [g/mol] / density [g/cm^3] */
      /* atom density per Angs^3 = [mol/cm^3] * N_Avogadro *(1e-8)^3 */
      Sqw->mat_rho = Sqw->mat_density / (Sqw->mat_weight * mat_at_nb) / 1e24 * NA;
      MPI_MASTER (if (Sqw->verbose_output > 0)
                      printf ("Isotropic_Sqw: %s: Computing scattering unit density V_rho=%g [AA^-3] from density=%g [g/cm^3] weight=%g [g/mol].\n",
                              Sqw->compname, Sqw->mat_rho, Sqw->mat_density, Sqw->mat_weight););
    }

    /* the scattering unit cross sections are the chemical formula ones
     * times the nb of chemical formulae in the scattering element */
    if (mat_at_nb > 0) {
      Sqw->s_abs *= mat_at_nb;
      Sqw->s_inc *= mat_at_nb;
      Sqw->s_coh *= mat_at_nb;
    }

    if (nblocks) {
      if (nblocks == 1) {
        /* import Powder file */
        t_Table* newTable = NULL;
        newTable = Sqw_read_PowderN (Sqw, Table_Array[0]);
        if (!newTable) {
          MPI_MASTER (printf ("Isotropic_Sqw: %s: ERROR importing powder line file %s.\n"
                              "               Check format definition.\n",
                              Sqw->compname, file););
          exit (-1);
        } else
          flag = 0;
        Table_Free_Array (Table_Array);
        Table_Array = newTable;
      } else if (nblocks != 3) {
        MPI_MASTER (printf ("Isotropic_Sqw: %s: ERROR "
                            "File %s contains %li block%s instead of 3.\n",
                            Sqw->compname, file, nblocks, (nblocks == 1 ? "" : "s")););
      } else {
        flag = 0;
        Sqw->barns = 0; /* Sqw files do not use powder_barns */
      }
    }

    /* print some info about Sqw files */
    if (flag)
      Sqw->verbose_output = 2;

    if (flag) {
      MPI_MASTER (if (nblocks) printf ("ERROR          Wrong file format.\n"
                                       "               Disabling contribution.\n"
                                       "               File must contain 3 blocks for [q,w,sqw] or Powder file (1 block, laz,lau).\n"););
      return (Sqw_Data);
    }

    sprintf (Table_Array[0].filename, "%s#q", file);
    sprintf (Table_Array[1].filename, "%s#w", file);
    sprintf (Table_Array[2].filename, "%s#sqw", file);

    MPI_MASTER (if (nblocks && Sqw->verbose_output > 2) {
      printf ("Isotropic_Sqw: %s file read, analysing...\n", file);
      Table_Info_Array (Table_Array);
    });

    /* (2) compute range for full +/- w and allocate S(q,w) =================== */

    /* get the q,w extend of the table from the file */
    q_bins_file = Table_Array[0].rows * Table_Array[0].columns;
    w_bins_file = Table_Array[1].rows * Table_Array[1].columns;

    /* is there enough qw data in file to proceed ? */
    if (q_bins_file <= 1 || w_bins_file <= 0) {
      MPI_MASTER (printf ("Isotropic_Sqw: %s: Data file %s has incomplete q or omega information (%lix%li).\n"
                          "ERROR          Exiting.\n",
                          Sqw->compname, file, q_bins_file, w_bins_file););
      return (Sqw_Data);
    }

    q_min_file = Table_Array[0].min_x;
    q_max_file = Table_Array[0].max_x;
    q_step_file = Table_Array[0].step_x ? Table_Array[0].step_x : (q_max_file - q_min_file) / (Table_Array[0].rows * Table_Array[0].columns);
    w_min_file = Table_Array[1].min_x;
    w_max_file = Table_Array[1].max_x;
    w_step_file = Table_Array[1].step_x;

    /* create a regular extended q,w and Sqw tables applying the exp(-hw/kT) factor */
    q_max = q_max_file;
    q_bins = (q_step_file ? q_max / q_step_file : q_bins_file) + 1;
    q_step = q_bins - 1 > 0 ? q_max / (q_bins - 1) : 1;
    w_max = fabs (w_max_file);
    if (fabs (w_min_file) > fabs (w_max_file))
      w_max = fabs (w_min_file);
    /* w_min =-w_max */
    w_bins = (w_step_file ? (long)(2 * w_max / w_step_file) : 0) + 1; /* twice the initial w range */
    w_step = w_bins - 1 > 0 ? 2 * w_max / (w_bins - 1) : 1;           /* that is +/- w_max         */

    /* create the Sqw table in full range */
    if (!Table_Init (&Sqw_full, q_bins, w_bins)) {
      printf ("Isotropic_Sqw: %s: Cannot allocate Sqw_full Table (%lix%li).\n"
              "ERROR          Exiting.\n",
              Sqw->compname, q_bins, w_bins);
      return (NULL);
    }
    sprintf (Sqw_full.filename, "S(q,w) from %s (dynamic structure factor)", file);
    Sqw_full.block_number = 1;

    Sqw_Data->q_bins = q_bins;
    Sqw_Data->q_max = q_max;
    Sqw_Data->q_step = q_step;
    Sqw_Data->w_bins = w_bins;
    Sqw_Data->w_max = w_max;
    Sqw_Data->w_step = w_step;
    Sqw_Data->q_min_file = q_min_file;

    /* build an energy symmetric Sqw data set with detailed balance there-in, so
     * that we can both compute effective scattering Xsection, probability distributions
     * that is S(q) and \int q S(q).
     * We scan the new Sqw table elements with regular qw binning and search for their
     * equivalent element in the Sqw file data set. This is slower than doing the opposite.
     * We could be scanning all file elements, and fill the new table, but in the
     * process some empty spaces may appear when the initial file binning is not regular
     * in qw, leading to gaps in the new table.
     */

    /* (3) we build q and w lookup table for conversion file -> sqw_full ====== */
    MPI_MASTER (if (Sqw->verbose_output > 2)
                    printf ("Isotropic_Sqw: %s: Creating Sqw_full... (%s, %s)\n", Sqw->compname, file, Sqw->type == 'c' ? "coh" : "inc"););

    double* w_file2full = malloc (w_bins * sizeof (double)); /* lookup table for fast file -> Sqw_full allocation */
    if (!w_file2full) {
      fprintf (stderr, "Isotropic_Sqw: Catastrophic Error allocating lookup table w_file2full!\nEXIT\n");
      exit (-1);
    }

    for (index_w = 0; index_w < w_bins; w_file2full[index_w++] = 0)
      ;

    for (index_w = 0; index_w < w_bins; index_w++) {

      double w = -w_max + index_w * w_step; /* w value in Sqw_full */
      double index_w_file = 0;              /* w index in Sqw file */
      char found = 0;
      for (index_w_file = 0; index_w_file < w_bins_file; index_w_file++) {
        double w0 = Table_Index (Table_Array[1], (long)index_w_file, 0);
        double w1 = Table_Index (Table_Array[1], (long)index_w_file + 1, 0);
        /* test if we are in Stokes */
        if (w0 > w1) {
          double tmp = w0;
          w0 = w1;
          w1 = tmp;
        }
        if (w0 <= w && w < w1) {
          /* w ~ w_file exists in file, usually on w > 0 side Stokes, neutron looses energy */
          index_w_file += w1 - w0 ? (w - w0) / (w1 - w0) : 0; /* may correspond with a position in-betwwen two w elements */
          found = 1;
          break;
        }
      }
      /* test if we are in anti-Stokes */
      if (!found)
        for (index_w_file = 0; index_w_file < w_bins_file; index_w_file++) {
          double w0 = Table_Index (Table_Array[1], (long)index_w_file, 0);
          double w1 = Table_Index (Table_Array[1], (long)index_w_file + 1, 0);
          /* test if we are in anti-Stokes */
          if (w0 > w1) {
            double tmp = w0;
            w0 = w1;
            w1 = tmp;
          }
          if (w0 <= -w && -w < w1) { /* w value is mirrored from the opposite side in file */
            index_w_file += w1 - w0 ? (-w - w0) / (w1 - w0) : 0;
            index_w_file = -index_w_file; /* in this case, index value is set to negative */
            break;
          }
        }
      w_file2full[index_w] = index_w_file;
    }

    double* q_file2full = malloc (q_bins * sizeof (double));
    if (!q_file2full) {
      fprintf (stderr, "Isotropic_Sqw: Catastrophic Error allocating lookup table q_file2full!\nEXIT\n");
      exit (-1);
    }
    for (index_q = 0; index_q < q_bins; q_file2full[index_q++] = 0)
      ;

    for (index_q = 0; index_q < q_bins; index_q++) {

      double q = index_q * q_step; /* q value in Sqw_full ; q_min = 0 */
      double index_q_file = 0;     /* q index in Sqw file */

      /* search for q value in the initial file data set */
      if (q <= q_min_file)
        index_q_file = 0;
      else if (q >= q_max_file)
        index_q_file = q_bins_file - 1;
      else
        for (index_q_file = 0; index_q_file < q_bins_file; index_q_file++) {
          double q0 = Table_Index (Table_Array[0], (long)index_q_file, 0);
          double q1 = Table_Index (Table_Array[0], (long)index_q_file + 1, 0);
          if (q0 <= q && q <= q1) {
            index_q_file += q1 - q0 ? (q - q0) / (q1 - q0) : 0; /* may correspond with a position in-betwwen two q elements */
            break;
          }
        }
      q_file2full[index_q] = index_q_file;
    }

    /* (4) now we build Sqw on full Q,W ranges, using the Q,W table lookup above -> Sqw_full */
    for (index_q = 0; index_q < q_bins; index_q++) {

      double q = index_q * q_step; /* q value in Sqw_full ; q_min = 0 */
      double index_q_file = 0;     /* q index in Sqw file */

      /* get q value in the initial file data set */
      index_q_file = q_file2full[index_q];

      /* now scan energy elements in Sqw full, and search these in file data */
      for (index_w = 0; index_w < w_bins; index_w++) {
        double w = -w_max + index_w * w_step; /* w value in Sqw_full */
        double index_w_file = 0;              /* w index in Sqw file */
        double sqw_file = 0;                  /* Sqw(index_q, index_w) value interpolated from file */

        /* search for w value in the file data set, negative when mirrored */
        index_w_file = w_file2full[index_w];
        /* get Sqw_file element, with bi-linear interpolation from file */
        /* when the initial file does not contain the energy, the opposite element (-w) is used */
        sqw_file = Table_Value2d (Table_Array[2], index_q_file, fabs (index_w_file));
        /* apply the minimum threshold to remove noisy background in S(q,w) */
        if (sqw_file < Sqw->sqw_threshold)
          sqw_file = 0;
        else if (index_w_file < 0)
          sqw_file = -sqw_file; /* negative == mirrored from other side */

        if (!Table_SetElement (&Sqw_full, index_q, index_w, sqw_file))
          printf ("Isotropic_Sqw: %s: "
                  "Error when setting Sqw[%li q=%g,%li w=%g]=%g from file %s\n",
                  Sqw->compname, index_q, q, index_w, w, fabs (sqw_file), file);
      } /* for index_w */
    } /* for index_q */

    /* free memory and store limits for new full Sqw table */
    Table_Free_Array (Table_Array);

    /* if only one S(q,w) side is given, it is symmetrised by mirroring, then M1=0 */

    /* (5) test if the Sqw_full is classical or not by computing the 1st moment (=0 for classical) */
    /* also compute temperature (quantum case) from file if not set */
    for (index_q = 0; index_q < q_bins; index_q++) {

      double q = index_q * q_step; /* q value in Sqw_full ; q_min = 0 */

      for (index_w = 0; index_w < w_bins; index_w++) {
        double w = -w_max + index_w * w_step; /* w value in Sqw_full */
        double sqw_full = Table_Index (Sqw_full, index_q, index_w);
        long index_mw = w_bins - 1 - index_w; /* opposite w index in S(q,w) */
        double sqw_opp = Table_Index (Sqw_full, index_q, index_mw);
        double T_defined = T_file ? T_file : Sqw->Temperature; /* T better from file, else from user */

        /* the analysis must be done only on values which exist on both sides */
        /* as integrals must be symmetric, and Bose factor requires both sides as well */
        if (sqw_full > 0 && sqw_opp > 0) {
          /* compute temperature from Bose factor */
          if (sqw_opp != sqw_full) {
            T += fabs (w / log (sqw_opp / sqw_full) / Sqw->T2E);
            T_count++;
          }
          /* we first assume Sqw is quantum. M1_cl should be 0, M1 should be recoil */
          M1 += w * sqw_full * w_step;
          M1_count++;
          /* we assume it is quantum (non symmetric) and check that its symmetrized version has M1_cl=0 */
          if (T_defined > 0) {
            sqw_opp = sqw_full * Sqw_quantum_correction (-w, T_defined, Sqw->Q_correction); /* Sqw_cl */
            M1_cl += w * sqw_opp * w_step;
            M1_cl_count++;
          } else if (Sqw->mat_weight) {
            /* T=0 ? would compute the M1_cl = M1 - recoil energy, assuming we have a quantum S(q,w) in file */
            /* the M1(quantum) = (MNEUTRON/m)*2.0725*q^2 recoil energy */
            double Da = 1.660538921e-27;                                    /* atomic mass unit */
            double Er = (MNEUTRON / Sqw->mat_weight / Da) * 2.0725 * q * q; /* recoil for one scattering unit in the cell [meV] Schober JDN16 p239 */
            M1_cl += M1 - Er;
            M1_cl_count++;
          }
        } /* both side from file */
      } /*index_w */
    } /*index_q */

    if (T_count)
      T /= T_count; /* mean temperature from Bose ratio */
    if (M1_count)
      M1 /= M1_count;
    if (M1_cl_count)
      M1_cl /= M1_cl_count; /* mean energy value along q range */

    /* determine if we use a classical or quantum S(q,w) */
    if (Sqw->sqw_classical < 0) {
      if (fabs (M1) < 2 * w_step) {
        Sqw->sqw_classical = 1; /* the initial Sqw from file seems to be centered, thus classical */
      } else if (fabs (M1_cl) < fabs (M1)) {
        /* M1 for classical is closer to 0 than for quantum one */
        Sqw->sqw_classical = 0; /* initial data from file seems to be quantum (non classical) */
      } else {                  /* M1_cl > M1 > 2*w_step */
        MPI_MASTER (printf ("Isotropic_Sqw: %s: I do not know if S(q,w) data is classical or quantum.\n"
                            "WARNING        First moment M1=%g M1_cl=%g for file %s. Defaulting to classical case.\n",
                            Sqw->compname, M1, M1_cl, file););
      }
    }
    if (Sqw->sqw_classical < 0)
      Sqw->sqw_classical = 1; /* default when quantum/classical choice is not set */

    /* (5b) set temperature. Temperatures defined are:
     *   T_file:           temperature read from the .sqw file
     *   T:                temperature computed from the quantum Sqw using detailed balance
     *   Sqw->Temperature: temperature defined by user, or read from file when not set
     */

    /* display some warnings about the computed temperature */
    if (T > 3000)
      T = 0; /* unrealistic */
    if (!T_file && T) {
      MPI_MASTER (
        if (Sqw->verbose_output > 0) {
	  printf ("Isotropic_Sqw: %s: Temperature computed from S(q,w) data from %s is T=%g [K].\n", Sqw->compname, file, T);
	}
      );
    }

    if (Sqw->Temperature == 0) {
      Sqw->Temperature = T_file ? T_file : T; /* 0:  not set: we use file value, else computed */
    } else if (Sqw->Temperature == -1) {
      Sqw->Temperature = 0; /* -1: no detailed balance. Display message at end of INIT */
    } else if (Sqw->Temperature == -2) {
      Sqw->Temperature = T ? T : T_file; /* -2: use guessed value when available */
    } /* else let value as it is (e.g. >0) */

    if (Sqw->verbose_output > 0 && Sqw->Temperature) {
      MPI_MASTER (printf ("Isotropic_Sqw: %s: Temperature set to T=%g [K]\n", Sqw->compname, Sqw->Temperature););
    }

    MPI_MASTER (if (Sqw->verbose_output > 0 && w_bins > 1)
                    printf ("Isotropic_Sqw: %s: S(q,w) data from %s (%s) assumed to be %s.\n", Sqw->compname, file, Sqw->type == 'c' ? "coh" : "inc",
                            Sqw->sqw_classical ? "classical (symmetrised in energy)" : "non-classical (includes Bose factor, non symmetric in energy)"););

    /* (6) apply detailed balance on Sqw_full for classical or quantum S(q,w) */
    /* compute the \int q^2 S(q) for normalisation */

    MPI_MASTER (if (Sqw->sqw_classical && Sqw->verbose_output > 0 && Sqw->Temperature > 0)
                    printf ("Isotropic_Sqw: %s: Applying exp(hw/2kT) factor with T=%g [K] on %s file (classical/symmetric) using '%s' quantum correction\n",
                            Sqw->compname, Sqw->Temperature, file, Sqw->Q_correction););
    for (index_q = 0; index_q < q_bins; index_q++) {
      double sq = 0;
      double q = index_q * q_step; /* q value in Sqw_full ; q_min = 0 */
      for (index_w = 0; index_w < w_bins; index_w++) {
        double w = -w_max + index_w * w_step; /* w value in Sqw_full */
        double balance = 1;                   /* detailed balance factor, default is 1 */
        double sqw_full = Table_Index (Sqw_full, index_q, index_w);

        /* do we use a symmetric S(q,w) from real G(r,t) from e.g. MD ? */

        if (Sqw->sqw_classical && Sqw->Temperature > 0) /* data is symmetric, we apply Bose factor */
          /* un-symmetrize Sqw(file) * exp(hw/kT/2) on both sides */
          balance = Sqw_quantum_correction (w, Sqw->Temperature, Sqw->Q_correction);
        else if (!Sqw->sqw_classical) { /* data is quantum (contains Bose) */
          if (sqw_full < 0) {           /* quantum but mirrored/symmetric value (was missing in file) */
            if (T)
              /* prefer to use T computed from file for mirroring */
              balance *= exp (w / (T * Sqw->T2E)); /* apply Bose where missing */
            else if (Sqw->Temperature)
              balance *= exp (w / (Sqw->Temperature * Sqw->T2E)); /* apply Bose where missing */
          }
          /* test if T computed from file matches requested T, else apply correction */
          if (T && Sqw->Temperature > 0 && Sqw->Temperature != T) {
            balance *= exp (-w / (T * Sqw->T2E) / 2);               /* make it a classical data set: remove computed/read T from quantum data file */
            balance *= exp (w / (Sqw->Temperature * Sqw->T2E) / 2); /* then apply Bose to requested temperature */
          }
        }

        /* update Sqw value */
        sqw_full = fabs (sqw_full) * balance;
        Table_SetElement (&Sqw_full, index_q, index_w, sqw_full);
        /* sum up the S(q) (0-th moment) = w0 */
        sq += sqw_full;
      } /* index_w */
      sq *= w_step;                 /* S(q)  = \int S(q,w) dw    = structure factor */
      iq2Sq += q * q * sq * q_step; /* iq2Sq = \int q^2 S(q) dq  = used for g-sum rule (normalisation) */
      sum += sq * q_step;           /* |S|   = \int S(q,w) dq dw = total integral value in file */
    } /* index_q */

    if (!sum) {
      MPI_MASTER (printf ("Isotropic_Sqw: %s: No valid data in the selected (Q,w) range: sum(S)=0\n"
                          "ERROR          Available Sqw data is\n",
                          Sqw->compname);
                  printf ("                 q=[%g:%g] w=[%g:%g]\n", q_min_file, q_max_file, w_min_file, w_max_file););
      Table_Free (&Sqw_full);
      return (NULL);
    }

    /* norm S(q ,w) = sum(S)*q_range/q_bins on total q,w range from file */
    sum *= (q_max_file - q_min_file) / q_bins_file;

    /* (7) renormalization of S(q,w) ========================================== */

    if (Sqw->sqw_norm > 0)
      alpha = Sqw->sqw_norm;
    else if (!Sqw->sqw_norm)
      alpha = 1;

    if (!alpha && iq2Sq) { /* compute theoretical |S| norm */
      /* Eq (2.44) from H.E. Fischer et al, Rep. Prog. Phys., 69 (2006) 233 */
      alpha = (q_max * q_max * q_max / 3 - (Sqw->type == 'c' ? 2 * PI * PI * Sqw->mat_rho : 0)) / iq2Sq;
    }

    if (alpha < 0) {
      MPI_MASTER (printf ("Isotropic_Sqw: %s: normalisation factor is negative. rho=%g [Angs^-3] may be too high.\n"
                          "WARNING        Disabling renormalization i.e. keeping initial S(q,w).\n",
                          Sqw->compname, Sqw->mat_rho););
      alpha = 0;
    }

    /* apply normalization on S(q,w) */
    if (alpha && alpha != 1) {
      sum *= alpha;
      for (index_q = 0; index_q < q_bins; index_q++) {
        for (index_w = 0; index_w < w_bins; index_w++)
          Table_SetElement (&Sqw_full, index_q, index_w, Table_Index (Sqw_full, index_q, index_w) * alpha);
      }
    }

    Sqw_Data->intensity = sum;

    Table_Stat (&Sqw_full);
    Sqw_full.min_x = 0;
    Sqw_full.max_x = q_max;
    Sqw_full.step_x = q_step;

    MPI_MASTER (if (Sqw->verbose_output > 0) {
      printf ("Isotropic_Sqw: %s: Generated %s %scoherent Sqw\n"
              "                   q=[%g:%g Angs-1] w=[%g:%g meV] |S|=%g size=[%lix%li] sigma=%g [barns]\n",
              Sqw->compname, file, (Sqw->type == 'i' ? "in" : ""), q_min_file, q_max_file, w_min_file, w_max_file, Sqw_Data->intensity, q_bins, Sqw_Data->w_bins,
              (Sqw->type == 'i' ? Sqw->s_inc : Sqw->s_coh));
      if (w_max < 1e-2)
        printf ("               Mainly elastic scattering.\n");
      if (Sqw->sqw_norm > 0 && Sqw->sqw_norm != 1)
        printf ("                   normalization factor S(q,w)*%g (user)\n", alpha);
      else if (Sqw->sqw_norm < 0)
        printf ("                   normalization factor S(q,w)*%g (auto) \\int q^2 S(q) dq=%g\n", alpha, iq2Sq);
    });

    /* (8) Compute total cross section ======================================== */

    /* now compute the effective total cross section  (Sqw_integrate_iqSq)
          sigma(Ei) = sigma/2/Ki^2 * \int q S(q,w) dw dq
     * for each incoming neutron energy 0 < Ei < 2*w_max, and
     * integration range w=-Ei:w_max and q=Q0:Q1 with
     *   Q0 = SE2Q*(sqrt(E)-sqrt(E+w))
     *   Q1 = SE2Q*(sqrt(E)+sqrt(E+w))
     */

    Sqw_Data->lookup_length = Sqw->lookup_length;
    Sqw_Data->iqSq_length = Sqw->lookup_length;
    /* this length should be greater when w_max=0 for e.g. elastic only */
    if (w_bins <= 1)
      Sqw_Data->iqSq_length = q_bins;

    if (!Table_Init (&iqSq, Sqw_Data->iqSq_length, 1)) {
      /* from 0 to 2*Ki_max */
      printf ("Isotropic_Sqw: %s: Cannot allocate [int q S(q,w) dq dw] array (%li bytes).\n"
              "ERROR          Exiting.\n",
              Sqw->compname, Sqw->lookup_length * sizeof (double));
      Table_Free (&Sqw_full);
      return (NULL);
    }

    /* compute the maximum incoming energy that can be handled */
    Sqw_Data->Ei_max = 2 * w_max;

    /* Checked in different ways in Powder and "proper inelastic" case */
    if (w_step == 1) {
      /* Powder */
      double Ei_max_q = (q_max * K2V) * (q_max * K2V) * VS2E / 2;
      if (Ei_max_q > Sqw_Data->Ei_max)
        Sqw_Data->Ei_max = Ei_max_q;
    } else {
      /* Proper inelastic */
      /* check if the q-range will limit the integration */
      if ((q_max * K2V) * (q_max * K2V) * VS2E / 2 > Sqw_Data->Ei_max) {
        /* then scan Ei until we pass q_max */
        for (index_w = 0; index_w < Sqw_Data->iqSq_length; index_w++) {
          double Ei = index_w * 2 * w_max / Sqw_Data->iqSq_length;
          if ((Ei > w_max && sqrt (Ei) + sqrt (Ei - w_max) >= q_max / (SE2V * V2K)) || sqrt (Ei) + sqrt (Ei + w_max) >= q_max / (SE2V * V2K))
            if (Ei < Sqw_Data->Ei_max) {
              Sqw_Data->Ei_max = Ei;
              break;
            }
        }
      }
    }

    MPI_MASTER (if (Sqw->verbose_output >= 2) printf ("Isotropic_Sqw: %s: Creating Sigma(Ei=0:%g [meV]) with %li entries...(%s %s)\n", Sqw->compname,
                                                      Sqw_Data->Ei_max, Sqw_Data->iqSq_length, file, Sqw->type == 'c' ? "coh" : "inc"););
    Sqw_Data->Sqw = Sqw_full; /* store the S(q,w) Table (matrix) for Sqw_integrate_iqSq */

    /* this loop takes time: use MPI when available */

    for (index_w = 0; index_w < Sqw_Data->iqSq_length; index_w++) {

      /* Ei = energy of incoming neutron, typically 0:w_max or 0:2*q_max */
      double Ei; /* neutron energy value in Sqw_full, up to 2*w_max */
      double Ki, Vi;
      double Sigma = 0;
      Ei = index_w * Sqw_Data->Ei_max / Sqw_Data->iqSq_length;
      Vi = sqrt (Ei / VS2E);
      Ki = V2K * Vi;
      /* sigma(Ei) = sigma/2/Ki^2 * \int q S(q,w) dq dw */
      /* Eq (6) from E. Farhi et al. J. Comp. Phys. 228 (2009) 5251 */
      Sigma = Ki <= 0 ? 0 : (Sqw->type == 'c' ? Sqw->s_coh : Sqw->s_inc) / 2 / Ki / Ki * Sqw_integrate_iqSq (Sqw_Data, Ei);
      Table_SetElement (&iqSq, index_w, 0, Sigma);
    }

    sprintf (iqSq.filename, "[sigma/2Ki^2 int q S(q,w) dq dw] from %s", file);
    iqSq.min_x = 0;
    iqSq.max_x = Sqw_Data->Ei_max;
    iqSq.step_x = Sqw_Data->Ei_max / Sqw_Data->iqSq_length;
    iqSq.block_number = 1;

    Sqw_Data->iqSq = iqSq; /* store the sigma(Ei) = \int q S(q,w) dq dw Table (vector) */

    /* (9) Compute P(w) probability =========================================== */

    /* set up 'density of states' */
    /* uses: Sqw_full and w axes */
    Sqw_Data->SW = (struct Sqw_W_struct*)calloc (w_bins, sizeof (struct Sqw_W_struct));

    if (!Sqw_Data->SW) {
      printf ("Isotropic_Sqw: %s: Cannot allocate SW (%li bytes).\n"
              "ERROR          Exiting.\n",
              Sqw->compname, w_bins * sizeof (struct Sqw_W_struct));
      Table_Free (&Sqw_full);
      Table_Free (&iqSq);
      return (NULL);
    }
    sum = 0;
    for (index_w = 0; index_w < w_bins; index_w++) {
      double local_val = 0;
      double w = -w_max + index_w * w_step;
      for (index_q = 0; index_q < q_bins; index_q++) {                                     /* integrate on all q values */
        local_val += Table_Index (Sqw_full, index_q, index_w) * q_step * index_q * q_step; /* q*S(q,w) */
      }
      Sqw_Data->SW[index_w].omega = w;
      sum += local_val; /* S(w)=\int S(q,w) dq */
      /* compute cumulated probability */
      Sqw_Data->SW[index_w].cumul_proba = local_val;
      if (index_w)
        Sqw_Data->SW[index_w].cumul_proba += Sqw_Data->SW[index_w - 1].cumul_proba;
      else
        Sqw_Data->SW[index_w].cumul_proba = 0;
    }

    if (!sum) {
      MPI_MASTER (printf ("Isotropic_Sqw: %s: Total S(q,w) intensity is NULL.\n"
                          "ERROR          Exiting.\n",
                          Sqw->compname););
      Table_Free (&Sqw_full);
      Table_Free (&iqSq);
      return (NULL);
    }

    /* normalize Pw distribution to 0:1 range */
    for (index_w = 0; index_w < w_bins; index_w++) {
      Sqw_Data->SW[index_w].cumul_proba /= Sqw_Data->SW[w_bins - 1].cumul_proba;
    }

    if (Sqw->verbose_output > 2) {
      MPI_MASTER (printf ("Isotropic_Sqw: %s: Generated normalized SW[%li] in range [0:%g]\n", Sqw->compname, w_bins, Sqw_Data->SW[w_bins - 1].cumul_proba););
    }

    /* (10) Compute P(Q|w) probability ======================================== */

    /* set up Q probability table per w bin */
    /* uses:  Sqw_full */
    Sqw_Data->SQW = (struct Sqw_Q_struct**)calloc (w_bins, sizeof (struct Sqw_Q_struct*));

    if (!Sqw_Data->SQW) {
      printf ("Isotropic_Sqw: %s: Cannot allocate P(Q|w) array (%li bytes).\n"
              "ERROR          Exiting.\n",
              Sqw->compname, w_bins * sizeof (struct Sqw_Q_struct*));
      Table_Free (&Sqw_full);
      Table_Free (&iqSq);
      return (NULL);
    }
    for (index_w = 0; index_w < w_bins; index_w++) {
      Sqw_Data->SQW[index_w] = (struct Sqw_Q_struct*)calloc (q_bins, sizeof (struct Sqw_Q_struct));

      if (!Sqw_Data->SQW[index_w]) {
        printf ("Isotropic_Sqw: %s: Cannot allocate P(Q|w)[%li] (%li bytes).\n"
                "ERROR          Exiting.\n",
                Sqw->compname, index_w, q_bins * sizeof (struct Sqw_Q_struct));
        Table_Free (&Sqw_full);
        Table_Free (&iqSq);
        return (NULL);
      }
      /* set P(Q|W) and compute total intensity */
      for (index_q = 0; index_q < q_bins; index_q++) {
        double q = index_q * q_step;
        Sqw_Data->SQW[index_w][index_q].Q = q;

        /* compute cumulated probability and take into account Jacobian with additional 'q' factor */
        Sqw_Data->SQW[index_w][index_q].cumul_proba = q * Table_Index (Sqw_full, index_q, index_w); /* q*S(q,w) */
        if (index_q)
          Sqw_Data->SQW[index_w][index_q].cumul_proba += Sqw_Data->SQW[index_w][index_q - 1].cumul_proba;
        else
          Sqw_Data->SQW[index_w][index_q].cumul_proba = 0;
      }
      /* normalize P(q|w) distribution to 0:1 range */
      for (index_q = 0; index_q < q_bins; Sqw_Data->SQW[index_w][index_q++].cumul_proba /= Sqw_Data->SQW[index_w][q_bins - 1].cumul_proba)
        ;
    }
    if (Sqw->verbose_output > 2) {
      MPI_MASTER (printf ("Isotropic_Sqw: %s: Generated P(Q|w)\n", Sqw->compname););
    }

    /* (11) generate quick lookup tables for SW and SQW ======================= */

    SW_lookup = (long*)calloc (Sqw->lookup_length, sizeof (long));

    if (!SW_lookup) {
      printf ("Isotropic_Sqw: %s: Cannot allocate SW_lookup (%li bytes).\n"
              "Warning        Will be slower.\n",
              Sqw->compname, Sqw->lookup_length * sizeof (long));
    } else {
      int i;
      for (i = 0; i < Sqw->lookup_length; i++) {
        double w = (double)i / (double)Sqw->lookup_length; /* a random number tabulated value */
        SW_lookup[i] = Sqw_search_SW (*Sqw_Data, w);
      }
      Sqw_Data->SW_lookup = SW_lookup;
    }
    QW_lookup = (long**)calloc (w_bins, sizeof (long*));

    if (!QW_lookup) {
      printf ("Isotropic_Sqw: %s: Cannot allocate QW_lookup (%li bytes).\n"
              "Warning        Will be slower.\n",
              Sqw->compname, w_bins * sizeof (long*));
    } else {
      for (index_w = 0; index_w < w_bins; index_w++) {
        QW_lookup[index_w] = (long*)calloc (Sqw->lookup_length, sizeof (long));
        if (!QW_lookup[index_w]) {
          printf ("Isotropic_Sqw: %s: Cannot allocate QW_lookup[%li] (%li bytes).\n"
                  "Warning        Will be slower.\n",
                  Sqw->compname, index_w, Sqw->lookup_length * sizeof (long));
          free (QW_lookup);
          Sqw_Data->QW_lookup = QW_lookup = NULL;
          break;
        } else {
          int i;
          for (i = 0; i < Sqw->lookup_length; i++) {
            double w = (double)i / (double)Sqw->lookup_length; /* a random number tabulated value */
            QW_lookup[index_w][i] = Sqw_search_Q_proba_per_w (*Sqw_Data, w, index_w);
          }
        }
      }
      Sqw_Data->QW_lookup = QW_lookup;
    }
    if ((Sqw_Data->QW_lookup || Sqw_Data->SW_lookup) && Sqw->verbose_output > 2) {
      MPI_MASTER (printf ("Isotropic_Sqw: %s: Generated lookup tables with %li entries\n", Sqw->compname, Sqw->lookup_length););
    }
    free (w_file2full);
    free (q_file2full);
    return (Sqw_Data);
  } /* end Sqw_readfile */

  /*****************************************************************************
   * Sqw_init_read: Read coherent/incoherent Sqw data files
   *   Returns Sqw total intensity, or 0 (error)
   * Used in : INITIALIZE (1)
   *****************************************************************************/
  double
  Sqw_init (struct Sqw_sample_struct* Sqw, char* file_coh, char* file_inc) {
    double ret = 0;

    /* read files */
    struct Sqw_Data_struct *d_inc, *d_coh;
    Sqw->type = 'i';
    d_inc = Sqw_readfile (Sqw, file_inc, &(Sqw->Data_inc));
    Sqw->type = 'c';
    d_coh = Sqw_readfile (Sqw, file_coh, &(Sqw->Data_coh));

    if (d_inc && !d_inc->intensity && Sqw->s_inc > 0) {
      MPI_MASTER (if (Sqw->verbose_output > 0)
                      printf ("Isotropic_Sqw: %s: Using Isotropic elastic incoherent scattering (sigma=%g [barns])\n", Sqw->compname, Sqw->s_inc););
      ret = 1;
    }

    if (!d_inc || !d_coh)
      return (0);

    d_coh->type = 'c';
    Sqw->Data_inc.type = 'i';
    MPI_MASTER (if (d_coh && !d_coh->intensity && Sqw->s_coh) printf ("Isotropic_Sqw: %s: Coherent scattering Sqw intensity is null.\n"
                                                                      "Warning        Disabling coherent scattering.\n",
                                                                      Sqw->compname););
    if (d_inc && d_coh && d_inc->intensity && d_coh->intensity) {
      char msg[80];
      strcpy (msg, "");
      /* check dimensions/limits for Q, Energy in coh and inc Tables */
      if (d_inc->q_bins != d_coh->q_bins)
        strcpy (msg, "Q axis size");
      if (d_inc->w_bins != d_coh->w_bins)
        strcpy (msg, "Energy axis size");
      if (d_inc->q_max != d_coh->q_max)
        strcpy (msg, "Q axis limits");
      if (d_inc->w_max != d_coh->w_max)
        strcpy (msg, "Energy axis limits");
      MPI_MASTER (if (strlen (msg)) {
        printf ("Isotropic_Sqw: %s: Sqw data from files %s and %s do not match\n"
                "WARNING        wrong %s\n",
                Sqw->compname, file_coh, file_inc, msg);
      });
    }

    if (!ret)
      ret = d_inc->intensity + d_coh->intensity;
    return (ret);
  } /* Sqw_init */

  #endif /* definied ISOTROPIC_SQW */

/* Shared user declarations for all components types 'Pol_mirror'. */
/*****************************************************************************
*
* McStas, neutron ray-tracing package
*         Copyright 1997-2006, All rights reserved
*         Risoe National Laboratory, Roskilde, Denmark
*         Institut Laue Langevin, Grenoble, France
*
* Library: share/pol-lib.h
*
* %Identification
* Written by: Peter Christiansen
* Date: August, 2006
* Origin: RISOE
* Release: McStas 1.10
* Version: $Revision: 4382 $
*
* This file is to be imported by polarisation components.
* It handles some shared functions.
*
* This library may be used directly as an external library. 
* It has no dependency.
*
* Usage: within SHARE
* %include "pol-lib"
*
****************************************************************************/

#ifndef POL_LIB_H
#define POL_LIB_H "$Revision: 4382 $"

// Constant used
#define mc_pol_omegaL (-2 * PI * 29.16e6) /* MHz*rad/Tesla */
#define mc_pol_mu0 (4*M_PI*1e-7)

/*example field functions should have a variable set of arguments*/
#include <stdarg.h>
#include <stddef.h>
/*macros for some stuff*/
#ifndef MCSTAS_R_H
#include <mcstas-r.h>
#endif


typedef int mcmagnet_field_func (double, double, double, double, double *, double *, double *, void *);
typedef void mcmagnet_prec_func (Coords, Rotation, _class_particle *, double);
typedef va_list mcmagnet_data;

/*here's where the mcstas magnet stack is declared*/
/*the magnet stack*/

typedef struct mcmagnet_field_info {
  int func_id;
  Rotation *rot;
  Coords *pos;
  double *field_parameters;
  int stop;
} mcmagnet_field_info;

void mc_pol_set_timestep(double);
void mc_pol_set_angular_accuracy(double);

#define mcmagnet_pack(dest,id,rotation,position,stopbit,args) \
  do { \
    mcmagnet_field_info * mctmp_p; \
    mctmp_p=(dest); \
    mctmp_p->func_id=id;\
    mctmp_p->rot=(rotation); \
    mctmp_p->pos=(position); \
    mctmp_p->stop=(stopbit); \
    mctmp_p->field_parameters=(args); \
  } while (0);

#define mcmagnet_reset() \
  do { \
    mcMagneticField=NULL; \
    mcMagnetData=NULL; \
    MAGNET_OFF; \
  } while (0);

#define mcmagnet_free(mcmagnet_desc) \
  do { \
    mcmagnet_field_info * mctmp_p=(mcmagnet_desc); \
    if (mctmp_p!=NULL) { \
      if (mctmp_p->data!=NULL) free(mctmp_p->data); \
      free(mctmp_p); \
    } \
  } while(0);

#define MCMAGNET_STOP_ARG INT_MIN

void mcmagnet_print_active();
void mcmagnet_print_field(mcmagnet_field_info *);
void mcmagnet_print_stack();

void *mcmagnet_init_par_backend(int dummy, ...);

int mcmagnet_get_field(_class_particle *_particle, double x, double y, double z, double t, double *bx,double *by, double *bz, double Bprms[8]);
void *mcmagnet_push(_class_particle *_particle, int func_id, Rotation *magnet_rot, Coords *magnet_pos, int stopbit, double Bprms[8]);
void *mcmagnet_pop(_class_particle *_particle);

/*main magnetic field dispatcher function - every request goes through here*/
int field_dispatcher(int field_id, double x, double y, double z, double t, double *bx, double *by, double *bz, void *data);

/*example functions for magnetic fields*/
int const_magnetic_field(double x, double y, double z, double t, double *bx, double *by, double *bz, void *data);
int rot_magnetic_field(double x, double y, double z, double t, double *bx, double *by, double *bz, void *data);
int majorana_magnetic_field(double x, double y, double z, double t, double *bx, double *by, double *bz, void *data);
int gradient_magnetic_field(double x, double y, double z, double t, double *bx, double *by, double *bz, void *data);

/* Routines used for Monochromator and guides/mirrors 
 * in the special (usual) case where
 * the up direction is parallel to the y-axis and 
 * the down direction is anti-parallel to the y-axis */
void GetMonoPolFNFM(double, double, double*, double*);
void GetMonoPolRefProb(double, double, double, double*);
void SetMonoPolRefOut(double, double, double, double*, double*, double*);
void SetMonoPolTransOut(double, double, double, double*, double*, double*);

// Routines for spin precession in magnetic fields
void SimpleNumMagnetPrecession(Coords, Rotation, _class_particle *, double);

// Routines to help calculate the required magnetic field
double GetConstantField(double, double, double);

#endif

/* end of pol-lib.h */
/****************************************************************************
*
* McStas, neutron ray-tracing package
*         Copyright 1997-2006, All rights reserved
*         Risoe National Laboratory, Roskilde, Denmark
*         Institut Laue Langevin, Grenoble, France
*
* Library: share/pol-lib.c
*
* %Identification
* Written by: Erik B Knudsen, Astrid Rømer & Peter Christiansen
* Date: Oct 08
* Origin: RISOE
* Release: McStas 1.12
* Version: $Revision: 4466 $
*
* This file is to be imported by polarisation components.
* It handles some shared functions.
* Embedded within instrument in runtime mode.
* Variable names have prefix 'mc_pol_' for 'McStas Polarisation'
* to avoid conflicts
*
* Usage: within SHARE
* %include "pol-lib"
*
****************************************************************************/

#ifndef POL_LIB_H
#include "pol-lib.h"
#endif

#include<sys/stat.h>


/*******************************************************************************
*
* McCode, neutron/xray ray-tracing package
*         Copyright (C) 1997-2015, All rights reserved
*         Risoe National Laboratory, Roskilde, Denmark
*         Institut Laue Langevin, Grenoble, France
*
* Runtime: share/interpolation.h
*
* %Identification
* Written by: EF
* Date:    May 5th 2015
* Release: McStas X.Y/McXtrace X.Y
* Version: $Revision: 5455 $
*
* Table interpolation routines (header)
*
* Usage: Automatically embbeded in the c code whenever required, with e.g.:
*   %include "interpolation-lib"
*
* public function:
* interpolator = interpolator_load(filename, 0, 0, NULL);
*   or
* interpolator = interpolator_load(filename, space_dim, field_dim, "regular" or "kdtree");
*
* interpolator_info(interpolator);
* 
* interpolator_interpolate(interpolator, {x,y,z...}, {bx,by,bz...});
*   or 
* interpolator_interpolate3_3(interpolator, x,y,z, &bx,&by,&bz);
* 
* interpolator_save(interpolator);
*
* Example:
*   struct interpolator_struct interpolator = 
*             interpolator_load("filename", space_dim, field_dim, NULL);
*   interpolator_info(interpolator);
*   double space[space_dim]={x,y,z};
*   double field[field_dim]; // will contain interpolated values
*   interpolator_interpolate(interpolator, space, field); 
*
* Data file format:
* file is a list of rows [x,y,z...    field_x, field_y, ... ]
*                        | space ... | field  ... |
*
* ---------------------------------------------------------------------------------
*             !! Important notes on table dimensionality etc: !!
* ---------------------------------------------------------------------------------
* 1. On GPU's (NVIDIA/OpenACC) only the 'regular' interpolation method is available
*    and us hence the 'default'. A GPU-compiled instrument will exit with an error
*    if you decide to force 'kdtree' mode.
*    ('kdtree' needs the macro R_SWAP which works node connectivity/placement in
*      the loaded dataset structure - is thus not thread-safe. And difficult to
*      make 'atomic' / would require 'one file content pr. neutron'... :-( )
*
* 2. On CPU's the default is 'NULL'/0, meaning that the library will itself try to
*    evaluate if a dataset is suitable for 'regular' or 'kdtree'. You may still
*    request one of the method explicitly if this makes sense in your case.
*
* 3. 'regular' means 'quite regular indeed'... Voxels in the volume MUST be of
*    uniform size AND dimensions of the volume MUST be equal on all spatial axes.
* ---------------------------------------------------------------------------------
*/

/*******************************************************************************
 * begin declaration (.h) section
 ******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#ifndef INTERPOLATOR_DIMENSIONS
#define INTERPOLATOR_DIMENSIONS 3
#endif

typedef struct
{
  // This is the location of this point (space).
  short  space_dimensionality;
  double *v;    // e.g. double []
  
  // These are the values for our field at this location.
  double *data; // e.g. double []

  // This is the point index in the point list.
  int    index;
  #pragma acc shape(v[0:space_dimensionality], data[0:space_dimensionality]) init_needed(space_dimensionality)
} vertex;
 
/* This struct will store each node of our kdtree. */
typedef struct _treeNode {
  vertex   *point;
  int       depth;
  struct _treeNode *rChild;
  struct _treeNode *lChild;
  #pragma acc shape(point[0:1],rChild[0:1],lChild[0:1])
} treeNode;

struct interpolator_struct {
  char  method[256];
  long  space_dimensionality; // [x,y,z...]
  long  field_dimensionality; // [bx,by,bz...]
  long  points;
  char  filename[1024];
  treeNode *kdtree;    /* for k-d tree */
  #pragma acc shape(kdtree[0:1])
  double  *gridx;  /* each grid contains a component of the field */
  double  *gridy;
  double  *gridz;
  long prod;
  #pragma acc shape(gridx[0:prod],gridy[0:prod],gridz[0:prod]) init_needed(prod)
  double   min[INTERPOLATOR_DIMENSIONS];
  double   max[INTERPOLATOR_DIMENSIONS];
  long     bin[INTERPOLATOR_DIMENSIONS];
  double   step[INTERPOLATOR_DIMENSIONS];
  long     constant_step[INTERPOLATOR_DIMENSIONS];
};

/******************************************************************************/
// interpolator_info: print information about the interpolator
void interpolator_info(struct interpolator_struct *interpolator);
 
/*******************************************************************************
 * interpolator_load: interpolation initialiser, from point cloud
 *   returns the interpolator structure
 * The input is mainly the file name, which is a column based text format.
 * The interpolator->method is set as 'kdtree' or 'regular' as set at points load
 ******************************************************************************/ 
struct interpolator_struct *interpolator_load(char *filename, 
   long space_dimensionality, long field_dimensionality,
   char *method);
     
/*******************************************************************************
 * interpolator_interpolate: main interpolation routine.
 *   returns the 'field' value (of length interpolator->field_dimensionality)
 *   at the given 'space' location (of length interpolator->space_dimensionality)
 *   The returned array 'field' MUST be pre-allocated.
 ******************************************************************************/
#pragma acc routine
double *interpolator_interpolate(struct interpolator_struct *interpolator,
  double *space, double *field);


/*******************************************************************************
 * interpolator_interpolate3_3: main interpolation routine for 3D space
 *   returns the 'field' value (e.g. 3d)
 *   at the given 'coord' location (e.g. 3d)
 * The interpolator->method can be 'kdtree' or 'regular' as set at points load
 ******************************************************************************/
#pragma acc routine
double *interpolator_interpolate3_3(struct interpolator_struct *interpolator,
                    double  x,  double  y,  double  z,
                    double *bx, double *by, double *bz);

/*******************************************************************************
*
* McCode, neutron/xray ray-tracing package
*         Copyright (C) 1997-2015, All rights reserved
*         Risoe National Laboratory, Roskilde, Denmark
*         Institut Laue Langevin, Grenoble, France
*
* Runtime: share/interpolation.c
*
* %Identification
* Written by: EF
* Date:    May 5th 2015
* Release: McStas X.Y/McXtrace X.Y
* Version: $Revision: 5455 $
*
* Table interpolation routines
*
* Usage: Automatically embbeded in the c code whenever required, with e.g.:
*   %include "interpolation-lib"
*
* public function:
* interpolator = interpolator_load(filename, 0, 0, NULL);
*   or
* interpolator = interpolator_load(filename, space_dim, field_dim, "regular" or "kdtree");
*
* interpolator_info(interpolator);
* 
* interpolator_interpolate(interpolator, {x,y,z...}, {bx,by,bz...});
*   or 
* interpolator_interpolate3_3(interpolator, x,y,z, &bx,&by,&bz);
* 
* interpolator_save(interpolator);
*
* Example:
*   struct interpolator_struct interpolator = 
*             interpolator_load("filename", space_dim, field_dim, NULL);
*   interpolator_info(interpolator);
*   double space[space_dim]={x,y,z};
*   double field[field_dim]; // will contain interpolated values
*   interpolator_interpolate(interpolator, space, field); 
*
* Data file format:
* file is a list of rows [x,y,z...    field_x, field_y, ... ]
*                        | space ... | field  ... |
*
* ---------------------------------------------------------------------------------
*             !! Important notes on table dimensionality etc: !!
* ---------------------------------------------------------------------------------
* 1. On GPU's (NVIDIA/OpenACC) only the 'regular' interpolation method is available
*    and us hence the 'default'. A GPU-compiled instrument will exit with an error
*    if you decide to force 'kdtree' mode.
*    ('kdtree' needs the macro R_SWAP which works node connectivity/placement in
*      the loaded dataset structure - is thus not thread-safe. And difficult to
*      make 'atomic' / would require 'one file content pr. neutron'... :-( )
*
* 2. On CPU's the default is 'NULL'/0, meaning that the library will itself try to
*    evaluate if a dataset is suitable for 'regular' or 'kdtree'. You may still
*    request one of the method explicitly if this makes sense in your case.
*
* 3. 'regular' means 'quite regular indeed'... Voxels in the volume MUST be of
*    uniform size AND dimensions of the volume MUST be equal on all spatial axes.
* ---------------------------------------------------------------------------------
*/

/*******************************************************************************
 * begin declaration (.h) section
 ******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

/*******************************************************************************
 * begin k-D tree section
 ******************************************************************************/

#define R_SQR(x)        ((x) * (x))
#define R_SWAP(x, y, t) {t tmp; tmp=x; x=y; y=tmp;}
 
 
/******************************************************************************/

// kdtree_squaredDistance: Calculate the standard Euclidean distance between 
//   these two points in whatever dimension we are considering.
#pragma acc routine
double kdtree_squaredDistance(vertex* a, vertex* b)
{
  int i;
  double sum = 0;
  if (!a || !b || a->space_dimensionality != b->space_dimensionality) return 0;
  
  for (i = 0; i < a->space_dimensionality; i++) {
    sum += R_SQR(a->v[i] - b->v[i]);
  }
  return sum;
} // kdtree_squaredDistance

/******************************************************************************/
// kdtree_borderCheck: Check to see whether or not this node provides a better 
//   nearest neighbour.
#pragma acc routine
void kdtree_borderCheck(vertex *v, treeNode *thisNode,
                 vertex **currentBest, double *sDist)
{
  if (!thisNode || !v || !sDist) return;
  
  double thisDist = kdtree_squaredDistance(thisNode->point,v);
  if (thisDist < *sDist)
  {
    *sDist        = thisDist;
    *currentBest  = thisNode->point;
  }
  // Now recurse down the children, checking whether or not we should
  // go both sides of the splitting plane, or just down one side.
  int k = (thisNode->depth) % v->space_dimensionality;
  if (R_SQR(thisNode->point->v[k] - v->v[k]) <= *sDist)
  {
   // The distance to the current spliting plane is less than our current
   // estimate for the shortest distance, we are going to have to traverse
   // both sides of the splitting plane.
    kdtree_borderCheck(v, thisNode->lChild, currentBest, sDist);
    kdtree_borderCheck(v, thisNode->rChild, currentBest, sDist);
  } else {
    // We only have to consider one side of the splitting plane.
    if (thisNode->point->v[k] > (*currentBest)->v[k])
      kdtree_borderCheck(v, thisNode->lChild, currentBest, sDist);
    else
      kdtree_borderCheck(v, thisNode->rChild, currentBest, sDist);
  }
} // kdtree_borderCheck

/******************************************************************************/

// kdtree_partition: Note we slightly modify the standard partition algorithm, 
//   so that we can partition based on only one dimension of the pointset.
#pragma acc routine
int kdtree_partition(vertex **points, int d, int left, int right, int pivot)
{
  double pivotValue = points[pivot]->v[d];
  int i;
  int storeIndex = left;
  
  if (!points) return 0;

  R_SWAP(points[pivot], points[right], vertex*);

  for (i = left; i < right; i++) {
    if (points[i]->v[d] < pivotValue) {
      R_SWAP(points[storeIndex], points[i], vertex*);
      storeIndex ++;
    }
  }
  R_SWAP(points[right], points[storeIndex], vertex*);

  return storeIndex;
} // kdtree_partition

/******************************************************************************/
// kdtree_splitAboutMedian: Find the median in expected linear time. - We will 
//   also pivot all the data about the found median, returning the integer giving
//   the pivot value.

int kdtree_splitAboutMedian(vertex **points, int d, int left, int right)
{
  int k = (right-left)/2 +left;
  if (!points) return 0;
  
  // This isn't a perfect uniform distribution, but it doesn't really matter
  // for this application.
  while (left < right)
  {
    int pivotIndex    = rand() % (right-left)+left;
    int pivotNewIndex = kdtree_partition(points,d,left,right,pivotIndex);
    if (k == pivotNewIndex)
      return k;
    else if (k < pivotNewIndex)
      right = pivotNewIndex-1;
    else
      left  = pivotNewIndex+1;
  }

  return left;
} // kdtree_splitAboutMedian

/******************************************************************************/
// kdtree_addToTree: create a kd-tree out of a point set
treeNode* kdtree_addToTree(vertex **points, int left, int right, int depth)
{
  // We can modify the number of dimensions in use. This is defined in the
  // header file.

  if (right < left || !points) return NULL;

  int d = depth % points[0]->space_dimensionality;

  treeNode *node = malloc(sizeof(treeNode));
  if (!node) {
    fprintf(stderr,"interpolation-lib: malloc() error in kdtree_addToTree\n");
    exit(-1);
  }
  node->depth    = depth;

  int med      = kdtree_splitAboutMedian(points, d, left, right);
  node->point  = points[med];

  node->lChild = kdtree_addToTree(points, left,  med-1, depth + 1);
  node->rChild = kdtree_addToTree(points, med+1, right, depth + 1);

  return node;
} // kdtree_addToTree

/******************************************************************************/
// kdtree_nearestNeighbour_helper: helper function for kdtree_nearestNeighbour
//   used recursively until a close vertex is found
#pragma acc routine
void kdtree_nearestNeighbour_helper(vertex* v, treeNode *tree,
                             vertex **bestV, double *bestDist)
{
  if (!v || !tree || !bestDist) return;
  
  int k = tree->depth % v->space_dimensionality;

  int left = tree->point->v[k] > v->v[k];

  treeNode *first  = left ? tree->lChild : tree->rChild;
  treeNode *second = left ? tree->rChild : tree->lChild;

  // investigate first child if present
  if (first != NULL) {
    kdtree_nearestNeighbour_helper(v, first, bestV, bestDist);
  }

  // update result
  double thisDist = kdtree_squaredDistance(tree->point, v);
  if ((*bestV == NULL) || (thisDist < *bestDist)) {
    *bestDist = thisDist;
    *bestV    = tree->point;
  }

  // no second child to investigate
  if (second == NULL) {
    return;
  }

  // we only investigate second child if necessary
  double treek = tree->point->v[k];

  if (R_SQR(treek - v->v[k]) <= *bestDist) {
    kdtree_borderCheck(v, second, bestV, bestDist);
  }
} // kdtree_nearestNeighbour_helper

/******************************************************************************/
// kdtree_nearestNeighbour: find closest vertex in tree to given vertex coords
#pragma acc routine
vertex* kdtree_nearestNeighbour(vertex* v, treeNode *tree) {
  vertex *bestV = NULL;
  double bestDist = 0;
  if (!v || !tree) return NULL;

  kdtree_nearestNeighbour_helper(v, tree, &bestV, &bestDist);
  v->data = bestV->data;
  
  return bestV;
} // kdtree_nearestNeighbour

#undef R_SQR
#undef R_SWAP

/*******************************************************************************
 * end k-D tree section
 ******************************************************************************/


/*******************************************************************************
 * begin interpolator section
 ******************************************************************************/
 
/******************************************************************************/
/* interpolator_double_vector_compare: comparator for double qsort */
int interpolator_double_vector_compare(void const *a, void const *b) {
  if (*(double*)a > *(double*)b)
  {
    return 1;
  }
  else if (*(double*)a < *(double*)b)
  {
    return -1;
  }
  else
  {
    return 0;
  }
}

/******************************************************************************/
/* interpolator_init: initialise an empty interpolator structure */
struct interpolator_struct *interpolator_init(void) {
  int dim=0;
  struct interpolator_struct *interpolator = malloc(sizeof(struct interpolator_struct));
  if (!interpolator) {
    fprintf(stderr,"interpolation-lib: malloc() error in interpolator_init\n");
    exit(-1);
  }
  
  if (!interpolator) return NULL;
  
  strcpy(interpolator->method,"NULL");
  strcpy(interpolator->filename,"NULL");
  interpolator->points = interpolator->space_dimensionality 
                       = interpolator->field_dimensionality = 0;
  interpolator->kdtree = NULL;
  for (dim=0; dim < INTERPOLATOR_DIMENSIONS; dim++) {
    interpolator->min[dim] = +FLT_MAX;
    interpolator->max[dim] = -FLT_MAX;
    interpolator->bin[dim] = 0;
    interpolator->step[dim]= 0;
    interpolator->constant_step[dim] = 1; /* assumes we have constant step. Check done at load. */
    interpolator->gridx = NULL;
    interpolator->gridy = NULL;
    interpolator->gridz = NULL;
  }
  return interpolator;
} /* interpolator_init */

/******************************************************************************/
// interpolator_offset: determine element offset for an n-dimensional array
//   used in: interpolator_load and interpolator_interpolate
#pragma acc routine
long interpolator_offset(int dim, long *dimInfo, long *indices) {
  
  long result=-1;  // where the resultant offset will be stored 
  int  i;       // loop counter 
  
  /* indices check */
  for (i=0; i < dim; i++) {
    if (indices[i] < 0)           indices[i]=0;
    if (indices[i] >= dimInfo[i]) indices[i]=dimInfo[i]-1;
  }
  // Perform the general offset calculation for an n-dimensional array 
  for (i=0; i < dim; i++) {
    result = i == 0 ? indices[0]
                    : result * dimInfo[i] + indices[i];
  }
  return result; 
} // interpolator_offset

/******************************************************************************/
// interpolator_info: print information about the interpolator
void interpolator_info(struct interpolator_struct *interpolator) {
  if (!interpolator) return;
  MPI_MASTER(
    printf("interpolator: file '%s' with %ld points. Space is %ldD, Field is %ldD. Using method '%s'.\n",
      interpolator->filename, interpolator->points, 
      interpolator->space_dimensionality, interpolator->field_dimensionality,
      interpolator->method);
  );
} /* interpolator_info */
 
/*******************************************************************************
 * interpolator_load: interpolation initialiser, from point cloud
 *   returns the interpolator structure
 * The input is mainly the file name, which is a column based text format.
 * The interpolator->method is set as 'kdtree' or 'regular' as set at points load
 ******************************************************************************/ 
struct interpolator_struct *interpolator_load(char *filename, 
   long space_dimensionality, long field_dimensionality,
   char *method) {

  struct interpolator_struct *interpolator = interpolator_init();
  int dim=0;
  
  // Read the table with Read Table Lib
  t_Table table;

  if(!Table_Read(&table, filename, 0) || table.rows <= 0 || !filename || strlen(filename) > 1024) {
    // Give up!
    fprintf(stderr, "interpolator_load: ERROR: Could not open file: '%s'.\n", filename);
    Table_Free(&table);
    return NULL;
  }

  #ifdef OPENACC
  if (method && strlen(method) && (!strcmp(method, "kdtree"))) {
    fprintf(stderr, "\n\n!! interpolator_load: FATAL ERROR: !! \n'kdtree' is not supported on OpenACC/GPU - only 'regular' works!\n\n");
    Table_Free(&table);
    exit(-1);
  }
  #endif

  strcpy(interpolator->filename, filename);
  interpolator->space_dimensionality = space_dimensionality;
  interpolator->field_dimensionality = field_dimensionality;
  interpolator->points = table.rows; /* rows= [x,y,z,... field_x, field_y, ... ] */
  if (method && strlen(method) && strlen(method) < 32)
    strcpy(interpolator->method, method);
  else
    strcpy(interpolator->method, "NULL");
  
  /* get columns and determine dimensionality if not set */
  if (!interpolator->space_dimensionality) {
    if (table.columns >= 4)
      interpolator->space_dimensionality=3;
    else if (table.columns == 2)
      interpolator->space_dimensionality=1;
  }
  if (interpolator->space_dimensionality <= 0 
   || interpolator->space_dimensionality > INTERPOLATOR_DIMENSIONS) {
    fprintf(stderr, "interpolator_load: ERROR: Invalid space dimensionality "
                    "(0 < dim=%li < %i) from file '%s'.\n",
      interpolator->space_dimensionality, INTERPOLATOR_DIMENSIONS, filename);
    return NULL;
  }
  
  interpolator->field_dimensionality = table.columns - space_dimensionality;
  if (interpolator->field_dimensionality <= 0 
   || interpolator->field_dimensionality > INTERPOLATOR_DIMENSIONS) {
    fprintf(stderr, "interpolator_load: ERROR: Invalid field dimensionality "
                    "(0 < dim=%li < %i) from file '%s'.\n",
      interpolator->field_dimensionality, INTERPOLATOR_DIMENSIONS, filename);
    return NULL;
  }
  
  /* read space columns to determine if sampling is regular */
  for (dim=0; dim<interpolator->space_dimensionality; dim++) {
    double  x_prev=0;
    long    index;
    double* vector = (double*) calloc(sizeof(double), table.rows);
    if (!vector) {
      fprintf(stderr,"interpolation-lib: vector calloc() error in interpolator_load\n");
      exit(-1);
    }
    interpolator->bin[dim] = 1;
    /* get min/max and fill vector for sorting */
    for (index=0; index<table.rows; index++) {
      double x = Table_Index(table, index, dim);
      if (x < interpolator->min[dim]) interpolator->min[dim] = x;
      if (x > interpolator->max[dim]) interpolator->max[dim] = x;
      vector[index] = x;
    }
    /* sort vector */
    qsort(vector, table.rows, sizeof(double), interpolator_double_vector_compare);
    
    /* now count the number of unique values and check constant step */
    for (index=0; index<table.rows; index++) {
      double x = vector[index];
      double this_step = 0;
      if (!index) x_prev = x;
      this_step = fabs(x - x_prev);
      if (this_step)
        interpolator->bin[dim]++; /* count unique values */
      if (interpolator->step[dim] <= 0) 
        interpolator->step[dim] = this_step;
      if (this_step && fabs(this_step - interpolator->step[dim]) > interpolator->step[dim]*READ_TABLE_STEPTOL) {
        /* difference of this step with the first one is 'large' */
        interpolator->constant_step[dim] = 0; /* not constant step -> kd-tree should be used */
        if (!strcmp(interpolator->method, "NULL") || !strcmp(interpolator->method, "0")) {
          strcpy(interpolator->method, "kdtree");
	} else if (!strcmp(interpolator->method, "regular")) { 
	    // We arrived here with 'regular' explicitly user-selected / required (GPU)
	    // which leads to wrong results.
	    fprintf(stderr,"\n\n%s\n\n",
	      "!! interpolation-lib ERROR: !!\n"
	      "   You are running the 'regular' interpolation scheme with a file of\n"
	      "   non-consistent axis 'binning' along one or more axes.\n"
              "   This combination is not possible.\n"
	      "   Please either resample the file to a regular grid or run with 'kdtree'\n"
	      "   (NB: kdtree is available on CPU only)");
	    exit(-1);
	}
      }
      x_prev = x;
    }
    printf("interpolator_load: Axis %d: step=%g, unique values=%li, from file '%s'.\n",
        dim, interpolator->step[dim], interpolator->bin[dim], filename);

    if (interpolator->step[dim]<=0 || interpolator->bin[dim]<=1) {
      fprintf(stderr, "interpolator_load: ERROR: Invalid axis %d: step=%g, unique values=%li, from file '%s'.\n",
        dim, interpolator->step[dim], interpolator->bin[dim], filename);
      strcpy(interpolator->method,"NULL");
      return NULL;
    }
    free(vector);
  } /* end for dim(space/axis) */

  /* check kd-tree method */
  if (!strlen(interpolator->method) || !strcmp(interpolator->method, "NULL") || !strcmp(interpolator->method, "0"))
    if (strcmp(interpolator->method, "kdtree"))  /* not kdtree ? -> use direct indexing */
      strcpy(interpolator->method, "regular");
  
  /* assign interpolation technique: 'regular' direct indexing */
  if (!strcmp(interpolator->method, "regular")) {
    interpolator->kdtree = NULL;

    /* store table values onto the grid: each field component is stored on the
     * interpolator->grid, and has size=prod(interpolator->bin)
     */
    long prod=1; /* the number of elements in the grid */
    for (dim=0; dim<interpolator->space_dimensionality; dim++)
      prod *= interpolator->bin[dim];
    interpolator->prod=prod;
    for (dim=0; dim<interpolator->field_dimensionality; dim++) {
      double *array = (double*)calloc(prod, sizeof(double));
      if (!array) {
	fprintf(stderr,"interpolation-lib: array calloc() error in interpolator_load\n");
	exit(-1);
      }
      printf("interpolator_load: allocating %g Gb for dim=%d\n",
        (double)prod/1073741824.0, dim); fflush(NULL);
      long index;
      if (!array) {
        fprintf(stderr, "interpolator_load: ERROR: Not enough memory for field component %i\n"
                        "  which requires %g Gb, from file '%s'. Will use kd-tree method.\n",
        dim, (double)prod/1073741824.0, filename);
        strcpy(interpolator->method,"kdtree");
        break;
      }
      for (index=0; index<table.rows; index++) {
        long *indices = malloc(interpolator->space_dimensionality*sizeof(long));
	if (!indices) {
	  fprintf(stderr,"interpolation-lib: indices malloc() error in interpolator_load\n");
	  exit(-1);
	}
        long this_index;
        int  axis=0;

        /* compute index 'space' elements of this 'field' value */
        for (axis=0; axis < interpolator->space_dimensionality; axis++) {
          double x      = Table_Index(table, index, axis);
          indices[axis] = round((x - interpolator->min[axis])/interpolator->step[axis]);
        }
        this_index = interpolator_offset(interpolator->space_dimensionality,
                       interpolator->bin, indices);
        // array[axis1][axis2][...] = field[dim] column after [space] elements
        array[this_index] = Table_Index(table, index, interpolator->space_dimensionality+dim);
	free(indices);
      }
      if (dim==0)
	interpolator->gridx = array;
      if (dim==1)
        interpolator->gridy = array;
      if (dim==2)
        interpolator->gridz = array;
      #pragma acc data copyin(array[0:prod])
    } // end for dim(field)
  } else

  /* assign interpolation technique: kd-tree (when nearest direct indexing fails) */
  if (!strcmp(interpolator->method, "kdtree")) {
    // Allocate array of vertex pointers
    vertex **vertices = calloc(table.rows, sizeof(vertex*));
    if (!vertices) {
      fprintf(stderr, "interpolator_load: ERROR: Not enough memory when allocating field with %li vertices from file '%s'\n",
        interpolator->bin[dim], filename);
      strcpy(interpolator->method,"NULL");
      return NULL;
    }

    // Convert from table to array layout
    int i, j;
    long count=0;
    for (i=0; i < table.rows; i++)
    {
      vertex *v    = malloc(sizeof(vertex));
      double *field= calloc(interpolator->field_dimensionality, sizeof(double));
      double *coord= calloc(interpolator->space_dimensionality, sizeof(double));
      if (!v || !field || !coord) {
	fprintf(stderr,"interpolation-lib: v/field/coord calloc()/malloc() error in interpolator_load\n");
	exit(-1);
      }
      if (v && field && coord) {
        for (j = 0; j < interpolator->space_dimensionality; j++) {
          coord[j]    = Table_Index(table, i,     j);
        }
        for (j = 0; j < interpolator->field_dimensionality; j++) {
          field[j] = Table_Index(table, i, interpolator->space_dimensionality + j);
        }
        v->space_dimensionality = interpolator->space_dimensionality;
        v->v    = coord;
        v->data = field;
        v->index= i;
      }
      vertices[i] = v;
    }

    interpolator->kdtree = kdtree_addToTree(vertices, 0, table.rows-1, 0); // build treeNode
    //for (i=0; i<INTERPOLATOR_DIMENSIONS; interpolator->grid[i++] = NULL);  // inactivate grid method
    interpolator->gridx=NULL;
    interpolator->gridy=NULL;
    interpolator->gridz=NULL;
    free(vertices);
  } 
  else
    fprintf(stderr, "interpolator_load: ERROR: unknown interpolator method %s [file '%s'].\n",
      interpolator->method, filename);
  
  // Free table
  Table_Free(&table);
  return interpolator;
} /* end interpolator_load */
     
/*******************************************************************************
 * interpolator_interpolate: main interpolation routine.
 *   returns the 'field' value (of length interpolator->field_dimensionality)
 *   at the given 'space' location (of length interpolator->space_dimensionality)
 *   The returned array 'field' MUST be pre-allocated.
 ******************************************************************************/ 
double *interpolator_interpolate(struct interpolator_struct *interpolator,
  double *space, double *field)
{
  if (!space || !interpolator || !field) return NULL;
  #ifdef OPENACC
  #define strcmp str_comp
  #endif
  
  /* k-d tree call ************************************************************/
  if (!strcmp(interpolator->method, "kdtree") && interpolator->kdtree) {
    vertex v;
    int i;
    v.v = space; 
    v.space_dimensionality=interpolator->space_dimensionality;
    vertex *w =kdtree_nearestNeighbour(&v, interpolator->kdtree);
    if (!w) return NULL;
    for (i=0; i<interpolator->field_dimensionality; i++){
        field[i]=w->data[i];
    }
    return (w->data);

  } else 
  
  /* nearest direct grid element call *****************************************/
  if (!strcmp(interpolator->method, "regular") && interpolator->gridx) {
    int axis;
    long *indices = malloc((int)interpolator->space_dimensionality*sizeof(double));
    if (!indices) {
      #ifndef OPENACC
      fprintf(stderr,"interpolation-lib: indices malloc() error in interpolator_interpolate\n");
      exit(-1);
      #endif
    }
    for (axis=0; axis < interpolator->space_dimensionality; axis++) {
      indices[axis] = round((space[axis]-interpolator->min[axis])/interpolator->step[axis]);
    }
    long index = interpolator_offset(3, interpolator->bin, indices);
    for (axis=0; axis < interpolator->field_dimensionality; axis++) {
      if (axis==0)
	field[axis] = interpolator->gridx[index];
      if (axis==1)
        field[axis] = interpolator->gridy[index];
      if (axis==2)
        field[axis] = interpolator->gridz[index];
    }
    free(indices);
    return field;
  } else {
    #ifndef OPENACC
    fprintf(stderr, "interpolator_interpolate: ERROR: invalid interpolator method %s from file '%s'.\n",
      interpolator->method, interpolator->filename);
    exit(-1);
    #endif
  }
  
} // interpolator_interpolate


/*******************************************************************************
 * interpolator_interpolate3_3: main interpolation routine for 3D space
 *   returns the 'field' value (e.g. 3d)
 *   at the given 'coord' location (e.g. 3d)
 * The interpolator->method can be 'kdtree' or 'regular' as set at points load
 ******************************************************************************/ 
double *interpolator_interpolate3_3(struct interpolator_struct *interpolator,
                    double  x,  double  y,  double  z,
                    double *bx, double *by, double *bz)
{
  double coord[3] = { x,y,z };
  double field[3] = { 0,0,0 };
  double *ret=NULL;
  if (interpolator->space_dimensionality != 3 
   || interpolator->field_dimensionality != 3) return 0;
  ret = interpolator_interpolate(interpolator, coord, field);
  *bx = field[0]; *by = field[1]; *bz = field[2];
  return(ret);
} /* interpolator_interpolate3_3 */




/*definition of the magnetic stack*/
#ifndef MCMAGNET_STACKSIZE
#define MCMAGNET_STACKSIZE 12
#endif

/*Threshold below which two magnetic fields are considered to be
 * in the same direction.*/
#ifndef mc_pol_angular_accuracy
#define mc_pol_angular_accuracy (1.0*DEG2RAD)
#endif

/*The maximal timestep taken by neutrons in a const field*/
#ifndef mc_pol_initial_timestep
#define mc_pol_initial_timestep 1e-5;
#endif

#ifdef PROP_MAGNET
#undef PROP_MAGNET
#define PROP_MAGNET(dt) \
  do { \
    /* change coordinates from local system to lab system. The magnet stack always refers to the lab system. */ \
    Rotation rotLM; \
    Coords   posLM = POS_A_CURRENT_COMP; \
    rot_transpose(ROT_A_CURRENT_COMP, rotLM); \
    SimpleNumMagnetPrecession(posLM, rotLM, _particle, dt); \
  } while(0)
#endif

enum field_functions{
  tabled=-1,
  none=0,
  constant=1,
  rotating=2,
  majorana=3,
  MSF=4,
  RF=5,
  gradient=6,
};

#pragma acc routine seq
int magnetic_field_dispatcher(int func_id, double x, double y, double z, double t, double *bx,double *by, double *bz, double pars[8]){
  int retval=1;
  switch (func_id){
    case constant: 
      {
        retval=const_magnetic_field(x,y,z,t,bx,by,bz, pars);
        break;
      }
    case majorana:
      {
        retval=majorana_magnetic_field(x,y,z,t,bx,by,bz, pars);
        break;
      }
    case rotating:
      {
        retval=rot_magnetic_field(x,y,z,t,bx,by,bz, pars);
        break;
      }
    case RF:
      {
        /*not implemented yet*/
        break;
      }
    case gradient:
      {
        retval=gradient_magnetic_field(x,y,z,t,bx,by,bz,pars);
        break;
      }
    case none:
      {
        retval=0;*bx=0;*by=0;bz=0;
      }
  }
  return retval;
}


/*traverse the stack and return the magnetic field*/
#pragma acc routine seq
int mcmagnet_get_field(_class_particle *_particle, double x, double y, double z, double t, double *bx,double *by, double *bz, double dummy[8]){
  mcmagnet_field_info *p,**stack;
  Coords in,loc,b,bsum={0,0,0};
  Rotation r;
  /*extract the magnetic field stack experienced by this particle*/
  stack=((mcmagnet_field_info **) _particle->mcMagnet);

  /*PROP_MAGNET takes care of transforming local "PROP" coordinates to lab system*/
  in.x=x;in.y=y;in.z=z;

  int i=0,stat=1;
  p=stack[i];
  *bx=0;*by=0;*bz=0;
  if (p==NULL || p->func_id==0){
    *bx=0;*by=0;*bz=0;
    return 0;
  }
  
  while(p!=NULL){
    /*transform to the coordinate system of the particular magnetic function*/
    loc=coords_sub(rot_apply(*(p->rot),in),*(p->pos));
    stat=magnetic_field_dispatcher((p->func_id),loc.x,loc.y,loc.z,t,&(b.x),&(b.y),&(b.z),p->field_parameters);
    /*check if the field function should be garbage collected*/
    if (!stat){
      /*transform to the lab system and add up. (resusing loc variable - to now contain the field in lab coords)*/
      rot_transpose(*(p->rot),r);
      loc=rot_apply(r,b);
      bsum.x+=loc.x;bsum.y+=loc.y;bsum.z+=loc.z;
      //printf("Bs=(%g %g %g), B=(%g %g %g)\n",bsum.x,bsum.y,bsum.z,loc.x,loc.y,loc.z);
    }
    if (p->stop) break;
    p=stack[++i];
  }
  /*we now have the magnetic field in lab coords in loc., transfer it back to caller*/
  *bx=bsum.x;
  *by=bsum.y;
  *bz=bsum.z;
  return 0;
}

#pragma acc routine seq
void *mcmagnet_push(_class_particle *_particle, int func_id, Rotation *magnet_rot, Coords *magnet_pos, int stopbit, double prms[8]){
  /*check if any field has been pushed already*/
  if (_particle->mcMagnet==NULL){
    /*No fields exist in the stack so allocate room for it and point _particle->mcMagnet to it*/
    #ifdef OPENACC
    _particle->mcMagnet=malloc(MCMAGNET_STACKSIZE*sizeof(mcmagnet_field_info *));
    /* Lack of a calloc makes us NULLify manually since we check for NULL further down */ 
    for (int ll=0; ll<MCMAGNET_STACKSIZE; ll++) {
      ((mcmagnet_field_info **) _particle->mcMagnet)[ll]=NULL;
    }
    #else
    _particle->mcMagnet=calloc(MCMAGNET_STACKSIZE,sizeof(mcmagnet_field_info *));
    #endif
    if(!_particle->mcMagnet) {
      #ifndef OPENACC
      fprintf(stderr,"pol-lib: malloc() error pushing field to stack\n");
      exit(-1);
      #endif
    }
  }
  mcmagnet_field_info **stack=((mcmagnet_field_info **) _particle->mcMagnet);

  /*move the stack one step down start from -2 since we have 0-indexing (i.e. last item is stacksize-1) */
  int i;
  for (i=MCMAGNET_STACKSIZE-2;i>=0;i--){
    stack[i+1]=stack[i];
  }
  /*allocate momery for the new stack item*/
  #ifdef OPENACC
  stack[0]=malloc(sizeof(mcmagnet_field_info));
  #else
  stack[0]=calloc(1, sizeof(mcmagnet_field_info));
  #endif
  if(!stack[0]) {
    #ifndef OPENACC
    fprintf(stderr,"pol-lib: malloc() error allocating field stack[0]\n");
    exit(-1);
    #endif
  }
  /*drop the new item in*/
  mcmagnet_pack(stack[0],func_id,magnet_rot,magnet_pos,stopbit,prms);
  return NULL;// (void *) stack[0];
}

#pragma acc routine seq
void *mcmagnet_pop(_class_particle *_particle) {
  mcmagnet_field_info **stack=((mcmagnet_field_info **) _particle->mcMagnet);
  /*free memory for upper element*/
#ifdef OPENACC
  free(stack[0]);
#else
  free(stack[0]);
#endif
  /*move the stack one step up*/
  int i;
  for (i=0;i<MCMAGNET_STACKSIZE-2;i++){
    stack[i]=stack[i+1];
  }
  /*if this makes the upper element go NULL also NULL _particle->mcMagnet
    to flag that precession propagation is no longer needed*/
  if(stack[0]==NULL){
    free(_particle->mcMagnet);
    _particle->mcMagnet=NULL;
  }
  return NULL;// (void*) (stack[0]);
}

/*Example magnetic field functions*/
#pragma acc routine seq
int const_magnetic_field(double x, double y, double z, double t,
    double *bx, double *by, double *bz, void *data) {
  if (!data) return 1;
  *bx=((double *)data)[0];
  *by=((double *)data)[1];
  *bz=((double *)data)[2];
  return 0;
}

#pragma acc routine seq
int rot_magnetic_field(double x, double y, double z, double t,
    double *bx, double *by, double *bz, void *data) {
  /* Field of magnitude By that rotates to x in magnetLength m*/
  
  if (!data) return 1;
  double Bmagnitude=((double *)data)[0];//   = mcMagnetData[1];
  double magnetLength=((double *)data)[1];// = mcMagnetData[5];
  *bx =  Bmagnitude * sin(PI/2*z/magnetLength);
  *by =  Bmagnitude * cos(PI/2*z/magnetLength);
  *bz =  0;
  return 0;
}

#pragma acc routine seq
int majorana_magnetic_field(double x, double y, double z, double t,
    double *bx, double *by, double *bz, void *data) {
  /* Large linearly decreasing (from +Bx to -Bx in magnetLength) component along x axis,
   * small constant component along y axis
   */
  if (!data) return 1;
  double Blarge       = ((double *)data)[0];
  double Bsmall       = ((double *)data)[1];
  double magnetLength = ((double *)data)[2];
  *bx =  Blarge -2*Blarge*z/magnetLength;
  *by =  Bsmall;
  *bz =  0;
  return 0;
}


#pragma acc routine seq
int gradient_magnetic_field(double x, double y, double z, double t, double *bx, double *by, double *bz, void *data){
  double *bp = (double *)data;
  double *b1=bp;
  double L=bp[3];
  double *b2=&(bp[4]);
  double alpha=(z+L/2.0)/L;
  *bx=alpha * b1[0] + (1-alpha)*b2[0];
  *by=alpha * b1[1] + (1-alpha)*b2[1];
  *bz=alpha * b1[2] + (1-alpha)*b2[2];
  return 0;
}


/****************************************************************************
* void GetMonoPolFNFM(double Rup, double Rdown, double *FN, double *FM)
*
* ACTION: Calculate FN and FM from reflectivities Rup and Rdown
*
* For a monochromator (nuclear and magnetic scattering), the
* polarisation is done by defining the reflectivity for spin up (Rup)
* and spin down (Rdown) (which can be negative, see now!) and based on
* this the nuclear and magnetic structure factors are calculated:
* FM = sign(Rup)*sqrt(|Rup|) + sign(Rdown)*sqrt(|Rdown|)
* FN = sign(Rup)*sqrt(|Rup|) - sign(Rdown)*sqrt(|Rdown|)
*****************************************************************************/
#pragma acc routine seq
void GetMonoPolFNFM(double mc_pol_Rup, double mc_pol_Rdown,
		    double *mc_pol_FN, double *mc_pol_FM) {
  if (mc_pol_Rup>0)
    mc_pol_Rup   = sqrt(fabs(mc_pol_Rup));
  else
    mc_pol_Rup   = -sqrt(fabs(mc_pol_Rup));

  if (mc_pol_Rdown>0)
    mc_pol_Rdown = sqrt(fabs(mc_pol_Rdown));
  else
    mc_pol_Rdown = -sqrt(fabs(mc_pol_Rdown));

  *mc_pol_FN = 0.5*(mc_pol_Rup + mc_pol_Rdown);
  *mc_pol_FM = 0.5*(mc_pol_Rup - mc_pol_Rdown);
  return;
}

/****************************************************************************
* void GetMonoPolRefProb(double FN, double FM, double sy, double *prob)
*
* ACTION: Calculate reflection probability from sy, FN and FM
*
* For a monochromator with up direction along y the reflection
* probability is given as:
* prob = FN*FN + 2*FN*FM*sy_in + FM*FM
*     (= |Rup| + |Rdown| (for sy_in=0))
* where FN and FM are calculated from Rup and Rdown by GetMonoPolFNFM
*****************************************************************************/
#pragma acc routine seq
void GetMonoPolRefProb(double mc_pol_FN, double mc_pol_FM,
		       double mc_pol_sy, double *mc_pol_prob) {
  *mc_pol_prob = mc_pol_FN*mc_pol_FN + mc_pol_FM*mc_pol_FM
    + 2*mc_pol_FN*mc_pol_FM*mc_pol_sy;
  return;
}

/****************************************************************************
* void SetMonoPolRefOut(double FN, double FM, double refProb,
*		     double* sx, double* sy, double* sz) {
*
* ACTION: Set the outgoing polarisation vector of the reflected neutrons
* given FN, FM and the reflection probability.
*
* For a monochromator with up direction along y the outgoing polarisation
* is given as:
*	sx = (FN*FN - FM*FM)*sx_in/R0;
*	sy = ((FN*FN - FM*FM)*sy_in + 2*FN*FM + FM*FM*sy_in)/R0;
*	sz = (FN*FN - FM*FM)*sz_in/R0;
* where sx_in, sy_in, and sz_in is the incoming polarisation, and
* FN and FM are calculated from Rup and Rdown by GetMonoPolFNFM
*****************************************************************************/
#pragma acc routine seq
void SetMonoPolRefOut(double mc_pol_FN, double mc_pol_FM,
		      double mc_pol_refProb, double* mc_pol_sx,
		      double* mc_pol_sy, double* mc_pol_sz) {
  *mc_pol_sx = (mc_pol_FN*mc_pol_FN - mc_pol_FM*mc_pol_FM)*(*mc_pol_sx)
    /mc_pol_refProb;
  *mc_pol_sy = ((mc_pol_FN*mc_pol_FN - mc_pol_FM*mc_pol_FM)*(*mc_pol_sy)
		+ 2*mc_pol_FN*mc_pol_FM + 2*mc_pol_FM*mc_pol_FM*(*mc_pol_sy))
    /mc_pol_refProb;
  *mc_pol_sz = (mc_pol_FN*mc_pol_FN - mc_pol_FM*mc_pol_FM)*(*mc_pol_sz)
    /mc_pol_refProb;
  return;
}

/****************************************************************************
* void SetMonoPolTransOut(double FN, double FM, double refProb,
*			  double* sx, double* sy, double* sz) {
*
* ACTION: Set the outgoing polarisation vector of the transmitted neutrons
* given FN, FM and the REFLECTION probability.
*
* We use that the polarization is conserved so:
* s_in = refProb*s_ref+(1-refProb)*s_trans, and then
* s_trans = (s_in-refProb*s_ref)/(1-refProb)
* where refProb is calculated using the routine GetMonoPolRefProb
* and s_ref is calculated by SetMonoPolRefOut
*****************************************************************************/
#pragma acc routine seq
void SetMonoPolTransOut(double mc_pol_FN, double mc_pol_FM,
			double mc_pol_refProb, double* mc_pol_sx,
			double* mc_pol_sy, double* mc_pol_sz) {
  double mc_pol_sx_ref = *mc_pol_sx, mc_pol_sy_ref = *mc_pol_sy;
  double mc_pol_sz_ref = *mc_pol_sz;

  // By passing 1 as probability we get mc_pol_refProb*s_out_ref
  SetMonoPolRefOut(mc_pol_FN, mc_pol_FM, 1,
		   &mc_pol_sx_ref, &mc_pol_sy_ref, &mc_pol_sz_ref);
  *mc_pol_sx = (*mc_pol_sx - mc_pol_sx_ref)/(1 - mc_pol_refProb);
  *mc_pol_sy = (*mc_pol_sy - mc_pol_sy_ref)/(1 - mc_pol_refProb);
  *mc_pol_sz = (*mc_pol_sz - mc_pol_sz_ref)/(1 - mc_pol_refProb);
  return;
}

/****************************************************************************
* void SimpleNumMagnetPrecession(double x, double y, double z, double t,
*			         double vx, double vy, double vz,
*			         double* sx, double* sy, double* sz, double dt)
*
*****************************************************************************/
#pragma acc routine seq
void SimpleNumMagnetPrecession(Coords posMagnet, Rotation rotMagnet, _class_particle *precess_particle, double dt) {

  double Bx, By, Bz, mc_pol_phiz;
  double BxStart, ByStart, BzStart, Bstart;
  double BxTemp, ByTemp, BzTemp, Btemp;
  double mc_pol_timeStep, mc_pol_sp;
  const double mc_pol_spThreshold  = cos(mc_pol_angular_accuracy);
  _class_particle ploc=*precess_particle;
  _class_particle *pp = &ploc;
  Rotation mc_pol_rotBack;
  
  /* change coordinates from current local system to lab system */
  mccoordschange(posMagnet, rotMagnet, pp);
  mcmagnet_get_field(pp, pp->x, pp->y, pp->z, pp->t,&BxTemp, &ByTemp, &BzTemp,NULL);

  do {

    Bx = 0; By = 0; Bz = 0; mc_pol_phiz = 0;
    BxStart = BxTemp; ByStart = ByTemp; BzStart = BzTemp;
    Bstart = sqrt(BxStart*BxStart + ByStart*ByStart + BzStart*BzStart);
    
    mc_pol_timeStep = mc_pol_initial_timestep;

    /*check if we need to take multiple steps of maximum size mc_pol_timeStep*/
    if(dt<mc_pol_timeStep){
      mc_pol_timeStep = dt;
    }
    double xp,yp,zp; 
    do {
      xp = pp->x+ pp->vx*mc_pol_timeStep;
      yp = pp->y+ pp->vy*mc_pol_timeStep;
      zp = pp->z+ pp->vz*mc_pol_timeStep;

      mcmagnet_get_field(pp,xp,yp,zp, pp->t+mc_pol_timeStep, &BxTemp, &ByTemp, &BzTemp, NULL);
      /* not so elegant, but this is how we make sure that the steps decrease
       when the WHILE condition is not met*/
      mc_pol_timeStep *= 0.5;

      Btemp = sqrt(BxTemp*BxTemp + ByTemp*ByTemp + BzTemp*BzTemp);

      mc_pol_sp = scalar_prod(BxStart, ByStart, BzStart, BxTemp, ByTemp, BzTemp);
      mc_pol_sp /= Bstart*Btemp;

    } while (mc_pol_sp<mc_pol_spThreshold && mc_pol_timeStep>FLT_EPSILON);

    mc_pol_timeStep*=2;

    // update coordinate values
    pp->x = xp;
    pp->y = yp;
    pp->z = zp;
    pp->t += mc_pol_timeStep;
    dt -= mc_pol_timeStep;

    /*precess around mean magnetic field*/
    Bx = 0.5 * (BxStart + BxTemp);
    By = 0.5 * (ByStart + ByTemp);
    Bz = 0.5 * (BzStart + BzTemp);
    mc_pol_phiz = fmod(sqrt(Bx*Bx+ By*By+ Bz*Bz) * mc_pol_timeStep*mc_pol_omegaL, 2*PI);

    /* Do the neutron spin precession for the small timestep*/
    if(!(Bx==0 && By==0 && Bz==0)) {

      double sx_in = pp->sx;
      double sy_in = pp->sy;
      double sz_in = pp->sz;

      rotate(pp->sx, pp->sy, pp->sz, sx_in,sy_in,sz_in, mc_pol_phiz, Bx, By, Bz);
    }

  } while (dt>0);

  /* change back spin coordinates from lab system to local system*/
  rot_transpose(rotMagnet, mc_pol_rotBack);
  /*have to do this "manually" since mccordschange does not commute/reverse*/
  pp->x-=posMagnet.x; pp->y-=posMagnet.y; pp->z-=posMagnet.z;
  mccoordschange_polarisation(mc_pol_rotBack, &(pp->vx), &(pp->vy), &(pp->vz));
  mccoordschange_polarisation(mc_pol_rotBack, &(pp->sx), &(pp->sy), &(pp->sz));
  /*copy back the spin polarization coordinates to the caller*/
  precess_particle->sx=pp->sx;
  precess_particle->sy=pp->sy;
  precess_particle->sz=pp->sz;
}

/****************************************************************************
* double GetConstantField(double length, double lambda, double angle)
*
* Return the magnetic field in Tesla required to flip a neutron with
* wavelength lambda(1/velocity), angle degrees, over the specified
* length(=time*velocity).
*
*****************************************************************************/
#pragma acc routine seq
double GetConstantField(double mc_pol_length, double mc_pol_lambda,
			double mc_pol_angle)
{
  const double mc_pol_velocity = K2V*2*PI/mc_pol_lambda;
  const double mc_pol_time = mc_pol_length/mc_pol_velocity;

  // B*omegaL*time = angle
  return mc_pol_angle*DEG2RAD/mc_pol_omegaL/mc_pol_time; // T
}

/* end of regular pol-lib.c */



/* Shared user declarations for all components types 'Pol_guide_vmirror'. */



/* Shared user declarations for all components types 'Incoherent'. */


  struct StructVarsInc {
    double sigma_a; /* Absorption cross section per atom (barns) */
    double sigma_i; /* Incoherent scattering cross section per atom (barns) */
    double rho;     /* Density of atoms (AA-3) */
    double my_s;
    double my_a_v;
    int shape;         /* 0 cylinder, 1 box, 2 sphere, 3 OFF file */
    double aw, ah;     /* rectangular angular dimensions */
    double xw, yh;     /* rectangular metrical dimensions */
    double tx, ty, tz; /* target coords */
  };

/* Shared user declarations for all components types 'Shape'. */





/* ************************************************************************** */
/*             End of SHARE user declarations for all components              */
/* ************************************************************************** */


/* ********************** component definition declarations. **************** */

/* component Origin=Progress_bar() [1] DECLARE */
/* Parameter definition for component type 'Progress_bar' */
struct _struct_Progress_bar_parameters {
  /* Component type 'Progress_bar' setting parameters */
  char profile[16384];
  MCNUM percent;
  MCNUM flag_save;
  MCNUM minutes;
  /* Component type 'Progress_bar' private parameters */
  double  IntermediateCnts;
  time_t  StartTime;
  time_t  EndTime;
  time_t  CurrentTime;
  char  infostring[64];
}; /* _struct_Progress_bar_parameters */
typedef struct _struct_Progress_bar_parameters _class_Progress_bar_parameters;

/* Parameters for component type 'Progress_bar' */
struct _struct_Progress_bar {
  char     _name[256]; /* e.g. Origin */
  char     _type[256]; /* Progress_bar */
  long     _index; /* e.g. 2 index in TRACE list */
  Coords   _position_absolute;
  Coords   _position_relative; /* wrt PREVIOUS */
  Rotation _rotation_absolute;
  Rotation _rotation_relative; /* wrt PREVIOUS */
  int      _rotation_is_identity;
  int      _position_relative_is_zero;
  _class_Progress_bar_parameters _parameters;
};
typedef struct _struct_Progress_bar _class_Progress_bar;
_class_Progress_bar _Origin_var;
#pragma acc declare create ( _Origin_var )

/* component HCS=Source_gen() [2] DECLARE */
/* Parameter definition for component type 'Source_gen' */
struct _struct_Source_gen_parameters {
  /* Component type 'Source_gen' setting parameters */
  char flux_file[16384];
  char xdiv_file[16384];
  char ydiv_file[16384];
  MCNUM radius;
  MCNUM dist;
  MCNUM focus_xw;
  MCNUM focus_yh;
  MCNUM focus_aw;
  MCNUM focus_ah;
  MCNUM E0;
  MCNUM dE;
  MCNUM lambda0;
  MCNUM dlambda;
  MCNUM I1;
  MCNUM yheight;
  MCNUM xwidth;
  MCNUM verbose;
  MCNUM T1;
  MCNUM flux_file_perAA;
  MCNUM flux_file_log;
  MCNUM Lmin;
  MCNUM Lmax;
  MCNUM Emin;
  MCNUM Emax;
  MCNUM T2;
  MCNUM I2;
  MCNUM T3;
  MCNUM I3;
  MCNUM zdepth;
  int target_index;
  /* Component type 'Source_gen' private parameters */
  double  p_in;
  double  lambda1;
  double  lambda2;
  double  lambda3;
  t_Table  pTable;
  t_Table  pTable_x;
  t_Table  pTable_y;
  double  pTable_xmin;
  double  pTable_xmax;
  double  pTable_xsum;
  double  pTable_ymin;
  double  pTable_ymax;
  double  pTable_ysum;
  double  pTable_dxmin;
  double  pTable_dxmax;
  double  pTable_dymin;
  double  pTable_dymax;
}; /* _struct_Source_gen_parameters */
typedef struct _struct_Source_gen_parameters _class_Source_gen_parameters;

/* Parameters for component type 'Source_gen' */
struct _struct_Source_gen {
  char     _name[256]; /* e.g. HCS */
  char     _type[256]; /* Source_gen */
  long     _index; /* e.g. 2 index in TRACE list */
  Coords   _position_absolute;
  Coords   _position_relative; /* wrt PREVIOUS */
  Rotation _rotation_absolute;
  Rotation _rotation_relative; /* wrt PREVIOUS */
  int      _rotation_is_identity;
  int      _position_relative_is_zero;
  _class_Source_gen_parameters _parameters;
};
typedef struct _struct_Source_gen _class_Source_gen;
_class_Source_gen _HCS_var;
#pragma acc declare create ( _HCS_var )

/* component HCS_Al=PowderN() [3] DECLARE */
/* Parameter definition for component type 'PowderN' */
struct _struct_PowderN_parameters {
  /* Component type 'PowderN' setting parameters */
  char reflections[16384];
  char geometry[16384];
  MCNUM format[9];
  MCNUM radius;
  MCNUM yheight;
  MCNUM xwidth;
  MCNUM zdepth;
  MCNUM thickness;
  MCNUM pack;
  MCNUM Vc;
  MCNUM sigma_abs;
  MCNUM sigma_inc;
  MCNUM delta_d_d;
  MCNUM p_inc;
  MCNUM p_transmit;
  MCNUM DW;
  MCNUM nb_atoms;
  MCNUM d_omega;
  MCNUM d_phi;
  MCNUM tth_sign;
  MCNUM p_interact;
  MCNUM concentric;
  MCNUM density;
  MCNUM weight;
  MCNUM barns;
  MCNUM Strain;
  MCNUM focus_flip;
  int target_index;
  int order;
  /* Component type 'PowderN' private parameters */
  struct line_info_struct  line_info;
  double*  columns;
  off_struct  offdata;
  double  tgt_x;
  double  tgt_y;
  double  tgt_z;
}; /* _struct_PowderN_parameters */
typedef struct _struct_PowderN_parameters _class_PowderN_parameters;

/* Parameters for component type 'PowderN' */
struct _struct_PowderN {
  char     _name[256]; /* e.g. HCS_Al */
  char     _type[256]; /* PowderN */
  long     _index; /* e.g. 2 index in TRACE list */
  Coords   _position_absolute;
  Coords   _position_relative; /* wrt PREVIOUS */
  Rotation _rotation_absolute;
  Rotation _rotation_relative; /* wrt PREVIOUS */
  int      _rotation_is_identity;
  int      _position_relative_is_zero;
  _class_PowderN_parameters _parameters;
};
typedef struct _struct_PowderN _class_PowderN;
_class_PowderN _HCS_Al_var;
#pragma acc declare create ( _HCS_Al_var )

_class_PowderN _HCS_Al_4_var;
#pragma acc declare create ( _HCS_Al_4_var )

_class_PowderN _HCS_Al_5_var;
#pragma acc declare create ( _HCS_Al_5_var )

_class_PowderN _HCS_Al_6_var;
#pragma acc declare create ( _HCS_Al_6_var )

_class_PowderN _HCS_Al_7_var;
#pragma acc declare create ( _HCS_Al_7_var )

/* component H5=Monitor_nD() [8] DECLARE */
/* Parameter definition for component type 'Monitor_nD' */
struct _struct_Monitor_nD_parameters {
  /* Component type 'Monitor_nD' setting parameters */
  char user1[16384];
  char user2[16384];
  char user3[16384];
  MCNUM xwidth;
  MCNUM yheight;
  MCNUM zdepth;
  MCNUM xmin;
  MCNUM xmax;
  MCNUM ymin;
  MCNUM ymax;
  MCNUM zmin;
  MCNUM zmax;
  int bins;
  MCNUM min;
  MCNUM max;
  int restore_neutron;
  MCNUM radius;
  char options[16384];
  char filename[16384];
  char geometry[16384];
  int nowritefile;
  int nexus_bins;
  char username1[16384];
  char username2[16384];
  char username3[16384];
  /* Component type 'Monitor_nD' private parameters */
  MonitornD_Defines_type  DEFS;
  MonitornD_Variables_type  Vars;
  MCDETECTOR  detector;
  off_struct  offdata;
}; /* _struct_Monitor_nD_parameters */
typedef struct _struct_Monitor_nD_parameters _class_Monitor_nD_parameters;

/* Parameters for component type 'Monitor_nD' */
struct _struct_Monitor_nD {
  char     _name[256]; /* e.g. H5 */
  char     _type[256]; /* Monitor_nD */
  long     _index; /* e.g. 2 index in TRACE list */
  Coords   _position_absolute;
  Coords   _position_relative; /* wrt PREVIOUS */
  Rotation _rotation_absolute;
  Rotation _rotation_relative; /* wrt PREVIOUS */
  int      _rotation_is_identity;
  int      _position_relative_is_zero;
  _class_Monitor_nD_parameters _parameters;
};
typedef struct _struct_Monitor_nD _class_Monitor_nD;
_class_Monitor_nD _H5_var;
#pragma acc declare create ( _H5_var )

/* component H5_rect=Guide_gravity() [9] DECLARE */
/* Parameter definition for component type 'Guide_gravity' */
struct _struct_Guide_gravity_parameters {
  /* Component type 'Guide_gravity' setting parameters */
  MCNUM w1;
  MCNUM h1;
  MCNUM w2;
  MCNUM h2;
  MCNUM l;
  MCNUM R0;
  MCNUM Qc;
  MCNUM alpha;
  MCNUM m;
  MCNUM W;
  MCNUM nslit;
  MCNUM d;
  MCNUM mleft;
  MCNUM mright;
  MCNUM mtop;
  MCNUM mbottom;
  MCNUM nhslit;
  MCNUM G;
  MCNUM aleft;
  MCNUM aright;
  MCNUM atop;
  MCNUM abottom;
  MCNUM wavy;
  MCNUM wavy_z;
  MCNUM wavy_tb;
  MCNUM wavy_lr;
  MCNUM chamfers;
  MCNUM chamfers_z;
  MCNUM chamfers_lr;
  MCNUM chamfers_tb;
  MCNUM nelements;
  MCNUM nu;
  MCNUM phase;
  char reflect[16384];
  /* Component type 'Guide_gravity' private parameters */
  Gravity_guide_Vars_type  GVarsGlobal;
  t_Table  pTable;
  int  table_present;
}; /* _struct_Guide_gravity_parameters */
typedef struct _struct_Guide_gravity_parameters _class_Guide_gravity_parameters;

/* Parameters for component type 'Guide_gravity' */
struct _struct_Guide_gravity {
  char     _name[256]; /* e.g. H5_rect */
  char     _type[256]; /* Guide_gravity */
  long     _index; /* e.g. 2 index in TRACE list */
  Coords   _position_absolute;
  Coords   _position_relative; /* wrt PREVIOUS */
  Rotation _rotation_absolute;
  Rotation _rotation_relative; /* wrt PREVIOUS */
  int      _rotation_is_identity;
  int      _position_relative_is_zero;
  _class_Guide_gravity_parameters _parameters;
};
typedef struct _struct_Guide_gravity _class_Guide_gravity;
_class_Guide_gravity _H5_rect_var;
#pragma acc declare create ( _H5_rect_var )

_class_Monitor_nD _H53_origin_var;
#pragma acc declare create ( _H53_origin_var )

_class_Monitor_nD _H52_origin_var;
#pragma acc declare create ( _H52_origin_var )

_class_Monitor_nD _H51_origin_var;
#pragma acc declare create ( _H51_origin_var )

/* component H53_start=Arm() [13] DECLARE */
/* Parameter definition for component type 'Arm' */
struct _struct_Arm_parameters {
  char Arm_has_no_parameters;
}; /* _struct_Arm_parameters */
typedef struct _struct_Arm_parameters _class_Arm_parameters;

/* Parameters for component type 'Arm' */
struct _struct_Arm {
  char     _name[256]; /* e.g. H53_start */
  char     _type[256]; /* Arm */
  long     _index; /* e.g. 2 index in TRACE list */
  Coords   _position_absolute;
  Coords   _position_relative; /* wrt PREVIOUS */
  Rotation _rotation_absolute;
  Rotation _rotation_relative; /* wrt PREVIOUS */
  int      _rotation_is_identity;
  int      _position_relative_is_zero;
  _class_Arm_parameters _parameters;
};
typedef struct _struct_Arm _class_Arm;
_class_Arm _H53_start_var;
#pragma acc declare create ( _H53_start_var )

_class_Guide_gravity _H53_inpile_var;
#pragma acc declare create ( _H53_inpile_var )

_class_PowderN _H53_Al_var;
#pragma acc declare create ( _H53_Al_var )

_class_Guide_gravity _H53_Obt_var;
#pragma acc declare create ( _H53_Obt_var )

_class_PowderN _HCS_Al_17_var;
#pragma acc declare create ( _HCS_Al_17_var )

_class_Monitor_nD _H53_Obt_Out_var;
#pragma acc declare create ( _H53_Obt_Out_var )

_class_PowderN _HCS_Al_19_var;
#pragma acc declare create ( _HCS_Al_19_var )

_class_Guide_gravity _H53_VSComC1_var;
#pragma acc declare create ( _H53_VSComC1_var )

_class_PowderN _HCS_Al_21_var;
#pragma acc declare create ( _HCS_Al_21_var )

/* component H53_Nose=Guide_tapering() [22] DECLARE */
/* Parameter definition for component type 'Guide_tapering' */
struct _struct_Guide_tapering_parameters {
  /* Component type 'Guide_tapering' setting parameters */
  char option[16384];
  MCNUM w1;
  MCNUM h1;
  MCNUM l;
  MCNUM linw;
  MCNUM loutw;
  MCNUM linh;
  MCNUM louth;
  MCNUM R0;
  MCNUM Qcx;
  MCNUM Qcy;
  MCNUM alphax;
  MCNUM alphay;
  MCNUM W;
  MCNUM mx;
  MCNUM my;
  MCNUM segno;
  MCNUM curvature;
  MCNUM curvature_v;
  /* Component type 'Guide_tapering' private parameters */
  double*  w1c;
  double*  w2c;
  double*  ww;
  double*  hh;
  double*  whalf;
  double*  hhalf;
  double*  lwhalf;
  double*  lhhalf;
  double*  h1_in;
  double*  h2_out;
  double*  w1_in;
  double*  w2_out;
  double  l_seg;
  double  h12;
  double  h2;
  double  w12;
  double  w2;
  double  a_ell_q;
  double  b_ell_q;
  double  lbw;
  double  lbh;
  double  mxi;
  double  u1;
  double  u2;
  double  div1;
  double  p2_para;
  double  test;
  double  Div1;
  int  seg;
  char*  fu;
  char*  pos;
  char  file_name[1024];
  char*  ep;
  FILE*  num;
  double  rotation_h;
  double  rotation_v;
}; /* _struct_Guide_tapering_parameters */
typedef struct _struct_Guide_tapering_parameters _class_Guide_tapering_parameters;

/* Parameters for component type 'Guide_tapering' */
struct _struct_Guide_tapering {
  char     _name[256]; /* e.g. H53_Nose */
  char     _type[256]; /* Guide_tapering */
  long     _index; /* e.g. 2 index in TRACE list */
  Coords   _position_absolute;
  Coords   _position_relative; /* wrt PREVIOUS */
  Rotation _rotation_absolute;
  Rotation _rotation_relative; /* wrt PREVIOUS */
  int      _rotation_is_identity;
  int      _position_relative_is_zero;
  _class_Guide_tapering_parameters _parameters;
};
typedef struct _struct_Guide_tapering _class_Guide_tapering;
_class_Guide_tapering _H53_Nose_var;
#pragma acc declare create ( _H53_Nose_var )

_class_PowderN _HCS_Al_23_var;
#pragma acc declare create ( _HCS_Al_23_var )

_class_Monitor_nD _H53_ThALES_Monochromator_Cradle_var;
#pragma acc declare create ( _H53_ThALES_Monochromator_Cradle_var )

/* component H53_ThALES_Monochromator=Monochromator_curved() [25] DECLARE */
/* Parameter definition for component type 'Monochromator_curved' */
struct _struct_Monochromator_curved_parameters {
  /* Component type 'Monochromator_curved' setting parameters */
  char reflect[16384];
  char transmit[16384];
  MCNUM zwidth;
  MCNUM yheight;
  MCNUM gap;
  int NH;
  int NV;
  MCNUM mosaich;
  MCNUM mosaicv;
  MCNUM r0;
  MCNUM t0;
  MCNUM Q;
  MCNUM RV;
  MCNUM RH;
  MCNUM DM;
  MCNUM mosaic;
  MCNUM width;
  MCNUM height;
  MCNUM verbose;
  MCNUM order;
  /* Component type 'Monochromator_curved' private parameters */
  double  mos_rms_y;
  double  mos_rms_z;
  double  mos_rms_max;
  double  mono_Q;
  double  SlabWidth;
  double  SlabHeight;
  t_Table  rTable;
  t_Table  tTable;
  int  rTableFlag;
  int  tTableFlag;
  double*  tiltH;
  double*  tiltV;
  char  ncol_var[128];
  char  nrow_var[128];
}; /* _struct_Monochromator_curved_parameters */
typedef struct _struct_Monochromator_curved_parameters _class_Monochromator_curved_parameters;

/* Parameters for component type 'Monochromator_curved' */
struct _struct_Monochromator_curved {
  char     _name[256]; /* e.g. H53_ThALES_Monochromator */
  char     _type[256]; /* Monochromator_curved */
  long     _index; /* e.g. 2 index in TRACE list */
  Coords   _position_absolute;
  Coords   _position_relative; /* wrt PREVIOUS */
  Rotation _rotation_absolute;
  Rotation _rotation_relative; /* wrt PREVIOUS */
  int      _rotation_is_identity;
  int      _position_relative_is_zero;
  _class_Monochromator_curved_parameters _parameters;
};
typedef struct _struct_Monochromator_curved _class_Monochromator_curved;
_class_Monochromator_curved _H53_ThALES_Monochromator_var;
#pragma acc declare create ( _H53_ThALES_Monochromator_var )

_class_Arm _H53_ThALES_Monochromator_Jumper_var;
#pragma acc declare create ( _H53_ThALES_Monochromator_Jumper_var )

_class_Arm _H53_ThALES_Monochromator_Out_var;
#pragma acc declare create ( _H53_ThALES_Monochromator_Out_var )

_class_Monitor_nD _H53_ThALES_Sample_Div_var;
#pragma acc declare create ( _H53_ThALES_Sample_Div_var )

_class_Monitor_nD _H53_ThALES_Sample_XY_var;
#pragma acc declare create ( _H53_ThALES_Sample_XY_var )

_class_Monitor_nD _H53_ThALES_Sample_L_var;
#pragma acc declare create ( _H53_ThALES_Sample_L_var )

/* component H53_ThALES_Sample=Isotropic_Sqw() [31] DECLARE */
/* Parameter definition for component type 'Isotropic_Sqw' */
struct _struct_Isotropic_Sqw_parameters {
  /* Component type 'Isotropic_Sqw' setting parameters */
  MCNUM powder_format[9];
  char Sqw_coh[16384];
  char Sqw_inc[16384];
  char geometry[16384];
  MCNUM radius;
  MCNUM thickness;
  MCNUM xwidth;
  MCNUM yheight;
  MCNUM zdepth;
  MCNUM threshold;
  int order;
  MCNUM T;
  MCNUM verbose;
  MCNUM d_phi;
  int concentric;
  MCNUM rho;
  MCNUM sigma_abs;
  MCNUM sigma_coh;
  MCNUM sigma_inc;
  MCNUM classical;
  MCNUM powder_Dd;
  MCNUM powder_DW;
  MCNUM powder_Vc;
  MCNUM density;
  MCNUM weight;
  MCNUM p_interact;
  MCNUM norm;
  MCNUM powder_barns;
  char quantum_correction[16384];
  /* Component type 'Isotropic_Sqw' private parameters */
  struct Sqw_sample_struct  VarSqw;
  int*  columns;
  off_struct  offdata;
}; /* _struct_Isotropic_Sqw_parameters */
typedef struct _struct_Isotropic_Sqw_parameters _class_Isotropic_Sqw_parameters;

/* Parameters for component type 'Isotropic_Sqw' */
struct _struct_Isotropic_Sqw {
  char     _name[256]; /* e.g. H53_ThALES_Sample */
  char     _type[256]; /* Isotropic_Sqw */
  long     _index; /* e.g. 2 index in TRACE list */
  Coords   _position_absolute;
  Coords   _position_relative; /* wrt PREVIOUS */
  Rotation _rotation_absolute;
  Rotation _rotation_relative; /* wrt PREVIOUS */
  int      _rotation_is_identity;
  int      _position_relative_is_zero;
  _class_Isotropic_Sqw_parameters _parameters;
};
typedef struct _struct_Isotropic_Sqw _class_Isotropic_Sqw;
_class_Isotropic_Sqw _H53_ThALES_Sample_var;
#pragma acc declare create ( _H53_ThALES_Sample_var )

_class_Monitor_nD _H53_ThALES_Spectrometer_var;
#pragma acc declare create ( _H53_ThALES_Spectrometer_var )

_class_Monitor_nD _H53_ThALES_Diffractometer_var;
#pragma acc declare create ( _H53_ThALES_Diffractometer_var )

_class_Arm _Sample_Out_var;
#pragma acc declare create ( _Sample_Out_var )

/* component SC3=Collimator_linear() [35] DECLARE */
/* Parameter definition for component type 'Collimator_linear' */
struct _struct_Collimator_linear_parameters {
  /* Component type 'Collimator_linear' setting parameters */
  MCNUM xmin;
  MCNUM xmax;
  MCNUM ymin;
  MCNUM ymax;
  MCNUM xwidth;
  MCNUM yheight;
  MCNUM length;
  MCNUM divergence;
  MCNUM transmission;
  MCNUM divergenceV;
  /* Component type 'Collimator_linear' private parameters */
  double  slope;
  double  slopeV;
}; /* _struct_Collimator_linear_parameters */
typedef struct _struct_Collimator_linear_parameters _class_Collimator_linear_parameters;

/* Parameters for component type 'Collimator_linear' */
struct _struct_Collimator_linear {
  char     _name[256]; /* e.g. SC3 */
  char     _type[256]; /* Collimator_linear */
  long     _index; /* e.g. 2 index in TRACE list */
  Coords   _position_absolute;
  Coords   _position_relative; /* wrt PREVIOUS */
  Rotation _rotation_absolute;
  Rotation _rotation_relative; /* wrt PREVIOUS */
  int      _rotation_is_identity;
  int      _position_relative_is_zero;
  _class_Collimator_linear_parameters _parameters;
};
typedef struct _struct_Collimator_linear _class_Collimator_linear;
_class_Collimator_linear _SC3_var;
#pragma acc declare create ( _SC3_var )

_class_Arm _Ana_Cradle_var;
#pragma acc declare create ( _Ana_Cradle_var )

_class_Monochromator_curved _PG2Xtal_var;
#pragma acc declare create ( _PG2Xtal_var )

_class_Arm _Ana_Out_var;
#pragma acc declare create ( _Ana_Out_var )

_class_Collimator_linear _SC4_var;
#pragma acc declare create ( _SC4_var )

/* component He3H=Monitor() [40] DECLARE */
/* Parameter definition for component type 'Monitor' */
struct _struct_Monitor_parameters {
  /* Component type 'Monitor' setting parameters */
  MCNUM xmin;
  MCNUM xmax;
  MCNUM ymin;
  MCNUM ymax;
  MCNUM xwidth;
  MCNUM yheight;
  int restore_neutron;
  /* Component type 'Monitor' private parameters */
  double  Nsum;
  double  psum;
  double  p2sum;
}; /* _struct_Monitor_parameters */
typedef struct _struct_Monitor_parameters _class_Monitor_parameters;

/* Parameters for component type 'Monitor' */
struct _struct_Monitor {
  char     _name[256]; /* e.g. He3H */
  char     _type[256]; /* Monitor */
  long     _index; /* e.g. 2 index in TRACE list */
  Coords   _position_absolute;
  Coords   _position_relative; /* wrt PREVIOUS */
  Rotation _rotation_absolute;
  Rotation _rotation_relative; /* wrt PREVIOUS */
  int      _rotation_is_identity;
  int      _position_relative_is_zero;
  _class_Monitor_parameters _parameters;
};
typedef struct _struct_Monitor _class_Monitor;
_class_Monitor _He3H_var;
#pragma acc declare create ( _He3H_var )

_class_Arm _H53_ThALES_Transmit_var;
#pragma acc declare create ( _H53_ThALES_Transmit_var )

_class_Monitor_nD _H53_ThALES_TransmitXY_var;
#pragma acc declare create ( _H53_ThALES_TransmitXY_var )

_class_Arm _H52_start_var;
#pragma acc declare create ( _H52_start_var )

_class_Guide_gravity _H52_inpile_var;
#pragma acc declare create ( _H52_inpile_var )

_class_Guide_gravity _H52_Common_var;
#pragma acc declare create ( _H52_Common_var )

_class_Guide_gravity _H52_Common_46_var;
#pragma acc declare create ( _H52_Common_46_var )

_class_Guide_gravity _H52_Common_3_var;
#pragma acc declare create ( _H52_Common_3_var )

_class_PowderN _HCS_Al_48_var;
#pragma acc declare create ( _HCS_Al_48_var )

_class_Monitor_nD _H52_Obt_Out_var;
#pragma acc declare create ( _H52_Obt_Out_var )

_class_PowderN _HCS_Al_50_var;
#pragma acc declare create ( _HCS_Al_50_var )

_class_Guide_gravity _H52_Common_51_var;
#pragma acc declare create ( _H52_Common_51_var )

_class_Guide_gravity _H52_Common_52_var;
#pragma acc declare create ( _H52_Common_52_var )

_class_Guide_gravity _H52_Common_53_var;
#pragma acc declare create ( _H52_Common_53_var )

_class_Guide_gravity _H52_Common_54_var;
#pragma acc declare create ( _H52_Common_54_var )

_class_Guide_gravity _H52_Common_55_var;
#pragma acc declare create ( _H52_Common_55_var )

_class_Guide_gravity _H52_Common_56_var;
#pragma acc declare create ( _H52_Common_56_var )

_class_Guide_gravity _H52_Common_57_var;
#pragma acc declare create ( _H52_Common_57_var )

_class_Guide_gravity _H52_Common_58_var;
#pragma acc declare create ( _H52_Common_58_var )

_class_Guide_gravity _H52_Common_59_var;
#pragma acc declare create ( _H52_Common_59_var )

_class_Guide_gravity _H52_Common_60_var;
#pragma acc declare create ( _H52_Common_60_var )

_class_Guide_gravity _H52_Common_61_var;
#pragma acc declare create ( _H52_Common_61_var )

_class_Guide_gravity _H52_Common_62_var;
#pragma acc declare create ( _H52_Common_62_var )

_class_Guide_gravity _H52_Common_63_var;
#pragma acc declare create ( _H52_Common_63_var )

_class_PowderN _HCS_Al_64_var;
#pragma acc declare create ( _HCS_Al_64_var )

_class_Monitor_nD _H52_Common_Out_var;
#pragma acc declare create ( _H52_Common_Out_var )

_class_Monitor_nD _H523_origin_var;
#pragma acc declare create ( _H523_origin_var )

_class_Monitor_nD _H521_origin_var;
#pragma acc declare create ( _H521_origin_var )

_class_Monitor_nD _H522_origin_var;
#pragma acc declare create ( _H522_origin_var )

_class_Arm _H521_start_var;
#pragma acc declare create ( _H521_start_var )

_class_Guide_gravity _H521_Curved_var;
#pragma acc declare create ( _H521_Curved_var )

_class_Guide_gravity _H521_Curved_71_var;
#pragma acc declare create ( _H521_Curved_71_var )

_class_Guide_gravity _H521_Curved_72_var;
#pragma acc declare create ( _H521_Curved_72_var )

_class_Guide_gravity _H521_Curved_73_var;
#pragma acc declare create ( _H521_Curved_73_var )

_class_Guide_gravity _H521_Curved_74_var;
#pragma acc declare create ( _H521_Curved_74_var )

_class_Guide_gravity _H521_Curved_75_var;
#pragma acc declare create ( _H521_Curved_75_var )

_class_Guide_gravity _H521_Curved_76_var;
#pragma acc declare create ( _H521_Curved_76_var )

_class_Guide_gravity _H521_Curved_77_var;
#pragma acc declare create ( _H521_Curved_77_var )

_class_Guide_gravity _H521_Curved_78_var;
#pragma acc declare create ( _H521_Curved_78_var )

_class_Guide_gravity _H521_Curved_79_var;
#pragma acc declare create ( _H521_Curved_79_var )

_class_Guide_gravity _H521_Curved_80_var;
#pragma acc declare create ( _H521_Curved_80_var )

_class_Guide_gravity _H521_Curved_preVTE_var;
#pragma acc declare create ( _H521_Curved_preVTE_var )

_class_PowderN _HCS_Al_82_var;
#pragma acc declare create ( _HCS_Al_82_var )

_class_Monitor_nD _H521_VTE_var;
#pragma acc declare create ( _H521_VTE_var )

_class_PowderN _HCS_Al_84_var;
#pragma acc declare create ( _HCS_Al_84_var )

_class_Guide_gravity _H521_Curved_85_var;
#pragma acc declare create ( _H521_Curved_85_var )

_class_Guide_gravity _H521_Curved_86_var;
#pragma acc declare create ( _H521_Curved_86_var )

_class_Guide_gravity _H521_Curved_87_var;
#pragma acc declare create ( _H521_Curved_87_var )

_class_Guide_gravity _H521_Curved_88_var;
#pragma acc declare create ( _H521_Curved_88_var )

_class_Guide_gravity _H521_Curved_89_var;
#pragma acc declare create ( _H521_Curved_89_var )

_class_Guide_gravity _H521_Curved_90_var;
#pragma acc declare create ( _H521_Curved_90_var )

_class_Guide_gravity _H521_Curved_91_var;
#pragma acc declare create ( _H521_Curved_91_var )

_class_Guide_gravity _H521_Curved_92_var;
#pragma acc declare create ( _H521_Curved_92_var )

_class_Guide_gravity _H521_Curved_93_var;
#pragma acc declare create ( _H521_Curved_93_var )

_class_Guide_gravity _H521_Curved_94_var;
#pragma acc declare create ( _H521_Curved_94_var )

_class_Guide_gravity _H521_Curved_95_var;
#pragma acc declare create ( _H521_Curved_95_var )

_class_Guide_gravity _H521_Curved_96_var;
#pragma acc declare create ( _H521_Curved_96_var )

_class_Guide_gravity _H521_Curved_97_var;
#pragma acc declare create ( _H521_Curved_97_var )

_class_Guide_gravity _H521_Curved_98_var;
#pragma acc declare create ( _H521_Curved_98_var )

_class_Guide_gravity _H521_Curved_99_var;
#pragma acc declare create ( _H521_Curved_99_var )

_class_Guide_gravity _H521_Curved_100_var;
#pragma acc declare create ( _H521_Curved_100_var )

_class_Guide_gravity _H521_Curved_101_var;
#pragma acc declare create ( _H521_Curved_101_var )

_class_Guide_gravity _H521_Curved_102_var;
#pragma acc declare create ( _H521_Curved_102_var )

_class_Guide_gravity _H521_Curved_103_var;
#pragma acc declare create ( _H521_Curved_103_var )

_class_Guide_gravity _H521_Curved_104_var;
#pragma acc declare create ( _H521_Curved_104_var )

_class_Guide_gravity _H521_Curved_105_var;
#pragma acc declare create ( _H521_Curved_105_var )

_class_Guide_gravity _H521_Curved_106_var;
#pragma acc declare create ( _H521_Curved_106_var )

_class_Guide_gravity _H521_Curved_107_var;
#pragma acc declare create ( _H521_Curved_107_var )

_class_PowderN _HCS_Al_108_var;
#pragma acc declare create ( _HCS_Al_108_var )

_class_Monitor_nD _H521_Curved_Out_var;
#pragma acc declare create ( _H521_Curved_Out_var )

_class_Guide_gravity _H521_Straight_var;
#pragma acc declare create ( _H521_Straight_var )

_class_Monitor_nD _H521_Straight_Out_var;
#pragma acc declare create ( _H521_Straight_Out_var )

_class_PowderN _HCS_Al_112_var;
#pragma acc declare create ( _HCS_Al_112_var )

_class_Monitor_nD _H521_D16_Monochromator_Cradle_var;
#pragma acc declare create ( _H521_D16_Monochromator_Cradle_var )

_class_Monochromator_curved _H521_D16_Monochromator_var;
#pragma acc declare create ( _H521_D16_Monochromator_var )

_class_Arm _H521_D16_Monochromator_Jumper_var;
#pragma acc declare create ( _H521_D16_Monochromator_Jumper_var )

_class_Arm _H521_D16_Monochromator_Out_var;
#pragma acc declare create ( _H521_D16_Monochromator_Out_var )

_class_Monitor_nD _H521_D16_Sample_Div_var;
#pragma acc declare create ( _H521_D16_Sample_Div_var )

_class_Monitor_nD _H521_D16_Sample_XY_var;
#pragma acc declare create ( _H521_D16_Sample_XY_var )

_class_Monitor_nD _H521_D16_Sample_L_var;
#pragma acc declare create ( _H521_D16_Sample_L_var )

_class_Isotropic_Sqw _H521_D16_Sample_var;
#pragma acc declare create ( _H521_D16_Sample_var )

_class_Monitor_nD _H521_D16_Detector_var;
#pragma acc declare create ( _H521_D16_Detector_var )

_class_Monitor_nD _H521_D16_Spectrometer_var;
#pragma acc declare create ( _H521_D16_Spectrometer_var )

_class_Monitor_nD _H521_D16_Diffractometer_var;
#pragma acc declare create ( _H521_D16_Diffractometer_var )

_class_Arm _H521_D16_Transmit_var;
#pragma acc declare create ( _H521_D16_Transmit_var )

_class_PowderN _HCS_Al_125_var;
#pragma acc declare create ( _HCS_Al_125_var )

_class_Arm _H521_P6_Start_var;
#pragma acc declare create ( _H521_P6_Start_var )

_class_Guide_gravity _H521_P6_var;
#pragma acc declare create ( _H521_P6_var )

_class_PowderN _HCS_Al_128_var;
#pragma acc declare create ( _HCS_Al_128_var )

_class_Monitor_nD _H521_SADAM_Monochromator_Cradle_var;
#pragma acc declare create ( _H521_SADAM_Monochromator_Cradle_var )

_class_Monochromator_curved _H521_SADAM_Monochromator_var;
#pragma acc declare create ( _H521_SADAM_Monochromator_var )

_class_Arm _H521_SADAM_Monochromator_Out_var;
#pragma acc declare create ( _H521_SADAM_Monochromator_Out_var )

_class_Monitor_nD _H521_SADAM_Sample_Div_var;
#pragma acc declare create ( _H521_SADAM_Sample_Div_var )

_class_Monitor_nD _H521_SADAM_Sample_XY_var;
#pragma acc declare create ( _H521_SADAM_Sample_XY_var )

_class_Monitor_nD _H521_SADAM_Sample_L_var;
#pragma acc declare create ( _H521_SADAM_Sample_L_var )

_class_Isotropic_Sqw _H521_SADAM_Sample_var;
#pragma acc declare create ( _H521_SADAM_Sample_var )

_class_Monitor_nD _H521_SADAM_Detector_var;
#pragma acc declare create ( _H521_SADAM_Detector_var )

_class_Monitor_nD _H521_SADAM_Spectrometer_var;
#pragma acc declare create ( _H521_SADAM_Spectrometer_var )

_class_Monitor_nD _H521_SADAM_Diffractometer_var;
#pragma acc declare create ( _H521_SADAM_Diffractometer_var )

_class_Arm _H522_start_var;
#pragma acc declare create ( _H522_start_var )

_class_Guide_gravity _H522_Curved_var;
#pragma acc declare create ( _H522_Curved_var )

_class_Guide_gravity _H522_Curved_141_var;
#pragma acc declare create ( _H522_Curved_141_var )

_class_Guide_gravity _H522_Curved_142_var;
#pragma acc declare create ( _H522_Curved_142_var )

_class_Guide_gravity _H522_Curved_143_var;
#pragma acc declare create ( _H522_Curved_143_var )

_class_Guide_gravity _H522_Curved_144_var;
#pragma acc declare create ( _H522_Curved_144_var )

_class_Guide_gravity _H522_Curved_145_var;
#pragma acc declare create ( _H522_Curved_145_var )

_class_Guide_gravity _H522_Curved_146_var;
#pragma acc declare create ( _H522_Curved_146_var )

_class_Guide_gravity _H522_Curved_147_var;
#pragma acc declare create ( _H522_Curved_147_var )

_class_Guide_gravity _H522_Curved_148_var;
#pragma acc declare create ( _H522_Curved_148_var )

_class_Guide_gravity _H522_Curved_149_var;
#pragma acc declare create ( _H522_Curved_149_var )

_class_PowderN _HCS_Al_150_var;
#pragma acc declare create ( _HCS_Al_150_var )

_class_Monitor_nD _H522_VTE_var;
#pragma acc declare create ( _H522_VTE_var )

_class_PowderN _HCS_Al_152_var;
#pragma acc declare create ( _HCS_Al_152_var )

_class_Guide_gravity _H523_Curved_153_var;
#pragma acc declare create ( _H523_Curved_153_var )

_class_Guide_gravity _H523_Curved_154_var;
#pragma acc declare create ( _H523_Curved_154_var )

_class_Guide_gravity _H523_Curved_155_var;
#pragma acc declare create ( _H523_Curved_155_var )

_class_Guide_gravity _H523_Curved_156_var;
#pragma acc declare create ( _H523_Curved_156_var )

_class_Guide_gravity _H523_Curved_157_var;
#pragma acc declare create ( _H523_Curved_157_var )

_class_Guide_gravity _H522_Curved_158_var;
#pragma acc declare create ( _H522_Curved_158_var )

_class_Guide_gravity _H522_Curved_159_var;
#pragma acc declare create ( _H522_Curved_159_var )

_class_Guide_gravity _H522_Curved_160_var;
#pragma acc declare create ( _H522_Curved_160_var )

_class_Guide_gravity _H522_Curved_161_var;
#pragma acc declare create ( _H522_Curved_161_var )

_class_Guide_gravity _H522_Curved_162_var;
#pragma acc declare create ( _H522_Curved_162_var )

_class_Guide_gravity _H522_Curved_163_var;
#pragma acc declare create ( _H522_Curved_163_var )

_class_Guide_gravity _H522_Curved_164_var;
#pragma acc declare create ( _H522_Curved_164_var )

_class_Guide_gravity _H522_Curved_165_var;
#pragma acc declare create ( _H522_Curved_165_var )

_class_Guide_gravity _H522_Curved_166_var;
#pragma acc declare create ( _H522_Curved_166_var )

_class_Guide_gravity _H522_Curved_167_var;
#pragma acc declare create ( _H522_Curved_167_var )

_class_Guide_gravity _H522_Curved_168_var;
#pragma acc declare create ( _H522_Curved_168_var )

_class_Guide_gravity _H522_Curved_169_var;
#pragma acc declare create ( _H522_Curved_169_var )

_class_Guide_gravity _H522_Curved_170_var;
#pragma acc declare create ( _H522_Curved_170_var )

_class_Guide_gravity _H522_Curved_171_var;
#pragma acc declare create ( _H522_Curved_171_var )

_class_Guide_gravity _H522_Curved_172_var;
#pragma acc declare create ( _H522_Curved_172_var )

_class_Guide_gravity _H522_Curved_173_var;
#pragma acc declare create ( _H522_Curved_173_var )

_class_Guide_gravity _H522_Curved_174_var;
#pragma acc declare create ( _H522_Curved_174_var )

_class_Guide_gravity _H522_Curved_175_var;
#pragma acc declare create ( _H522_Curved_175_var )

_class_Guide_gravity _H522_Curved_176_var;
#pragma acc declare create ( _H522_Curved_176_var )

_class_Guide_gravity _H522_Curved_177_var;
#pragma acc declare create ( _H522_Curved_177_var )

_class_PowderN _HCS_Al_178_var;
#pragma acc declare create ( _HCS_Al_178_var )

_class_Monitor_nD _H522_Curved_Out_XY_var;
#pragma acc declare create ( _H522_Curved_Out_XY_var )

_class_Monitor_nD _H522_Curved_Out_XL_var;
#pragma acc declare create ( _H522_Curved_Out_XL_var )

/* component WASP_Vselector=V_selector() [181] DECLARE */
/* Parameter definition for component type 'V_selector' */
struct _struct_V_selector_parameters {
  /* Component type 'V_selector' setting parameters */
  MCNUM xwidth;
  MCNUM yheight;
  MCNUM zdepth;
  MCNUM radius;
  MCNUM alpha;
  MCNUM length;
  MCNUM d;
  MCNUM nu;
  MCNUM nslit;
  /* Component type 'V_selector' private parameters */
  double  omega;
  double  alpha_rad;
}; /* _struct_V_selector_parameters */
typedef struct _struct_V_selector_parameters _class_V_selector_parameters;

/* Parameters for component type 'V_selector' */
struct _struct_V_selector {
  char     _name[256]; /* e.g. WASP_Vselector */
  char     _type[256]; /* V_selector */
  long     _index; /* e.g. 2 index in TRACE list */
  Coords   _position_absolute;
  Coords   _position_relative; /* wrt PREVIOUS */
  Rotation _rotation_absolute;
  Rotation _rotation_relative; /* wrt PREVIOUS */
  int      _rotation_is_identity;
  int      _position_relative_is_zero;
  _class_V_selector_parameters _parameters;
};
typedef struct _struct_V_selector _class_V_selector;
_class_V_selector _WASP_Vselector_var;
#pragma acc declare create ( _WASP_Vselector_var )

_class_PowderN _HCS_Al_182_var;
#pragma acc declare create ( _HCS_Al_182_var )

_class_Guide_gravity _H522_Straight_var;
#pragma acc declare create ( _H522_Straight_var )

_class_PowderN _HCS_Al_184_var;
#pragma acc declare create ( _HCS_Al_184_var )

_class_Monitor_nD _H522_Vsel_L_var;
#pragma acc declare create ( _H522_Vsel_L_var )

_class_Arm _H522_mirror_centre_var;
#pragma acc declare create ( _H522_mirror_centre_var )

/* component WASP_polariser=Pol_mirror() [187] DECLARE */
/* Parameter definition for component type 'Pol_mirror' */
struct _struct_Pol_mirror_parameters {
  /* Component type 'Pol_mirror' setting parameters */
  MCNUM rUpPar[5];
  MCNUM rDownPar[5];
  char rUpData[16384];
  char rDownData[16384];
  MCNUM p_reflect;
  MCNUM zwidth;
  MCNUM yheight;
  /* Component type 'Pol_mirror' private parameters */
  t_Table  rUpTable;
  int  rUpTableFlag;
  t_Table  rDownTable;
  int  rDownTableFlag;
}; /* _struct_Pol_mirror_parameters */
typedef struct _struct_Pol_mirror_parameters _class_Pol_mirror_parameters;

/* Parameters for component type 'Pol_mirror' */
struct _struct_Pol_mirror {
  char     _name[256]; /* e.g. WASP_polariser */
  char     _type[256]; /* Pol_mirror */
  long     _index; /* e.g. 2 index in TRACE list */
  Coords   _position_absolute;
  Coords   _position_relative; /* wrt PREVIOUS */
  Rotation _rotation_absolute;
  Rotation _rotation_relative; /* wrt PREVIOUS */
  int      _rotation_is_identity;
  int      _position_relative_is_zero;
  _class_Pol_mirror_parameters _parameters;
};
typedef struct _struct_Pol_mirror _class_Pol_mirror;
_class_Pol_mirror _WASP_polariser_var;
#pragma acc declare create ( _WASP_polariser_var )

_class_Arm _H522_mirror_outdir_var;
#pragma acc declare create ( _H522_mirror_outdir_var )

_class_Monitor_nD _H522_mirror_ReflectXY_var;
#pragma acc declare create ( _H522_mirror_ReflectXY_var )

_class_Monitor_nD _H522_mirror_TransmitXY_var;
#pragma acc declare create ( _H522_mirror_TransmitXY_var )

_class_Monitor_nD _H522_mirror_outdXY_var;
#pragma acc declare create ( _H522_mirror_outdXY_var )

/* component WASP_Vpolariser=Pol_guide_vmirror() [192] DECLARE */
/* Parameter definition for component type 'Pol_guide_vmirror' */
struct _struct_Pol_guide_vmirror_parameters {
  /* Component type 'Pol_guide_vmirror' setting parameters */
  int nvs;
  MCNUM xwidth;
  MCNUM yheight;
  MCNUM length;
  MCNUM rR0;
  MCNUM rQc;
  MCNUM ralpha;
  MCNUM rmSM;
  MCNUM rW;
  MCNUM rbeta;
  MCNUM rUpR0;
  MCNUM rUpQc;
  MCNUM rUpalpha;
  MCNUM rUpmSM;
  MCNUM rUpW;
  MCNUM rUpbeta;
  MCNUM rDownR0;
  MCNUM rDownQc;
  MCNUM rDownalpha;
  MCNUM rDownmSM;
  MCNUM rDownW;
  MCNUM rDownbeta;
  int debug;
  MCNUM allow_inside_start;
  MCNUM rPar[7];
  MCNUM rUpPar[7];
  MCNUM rDownPar[7];
  char rParFile[16384];
  char rUpParFile[16384];
  char rDownParFile[16384];
  int inputType;
  /* Component type 'Pol_guide_vmirror' private parameters */
  Coords  localG;
  Coords  normalTop;
  Coords  normalBot;
  Coords  normalLeft;
  Coords  normalRight;
  Coords  normalInOut;
  Coords  pointTop;
  Coords  pointBot;
  Coords  pointLeft;
  Coords  pointRight;
  Coords  pointIn;
  Coords  pointOut;
  Coords*  mirrorNormals;
  Coords*  mirrorPoints;
  double  xwhalf;
  double  xwfull;
  double  norm;
  int  n_index;
  int  i_index;
  double  rParToFunc[6];
  double  rUpParToFunc[6];
  double  rDownParToFunc[6];
  t_Table  rParPtr;
  t_Table  rUpParPtr;
  t_Table  rDownParPtr;
}; /* _struct_Pol_guide_vmirror_parameters */
typedef struct _struct_Pol_guide_vmirror_parameters _class_Pol_guide_vmirror_parameters;

/* Parameters for component type 'Pol_guide_vmirror' */
struct _struct_Pol_guide_vmirror {
  char     _name[256]; /* e.g. WASP_Vpolariser */
  char     _type[256]; /* Pol_guide_vmirror */
  long     _index; /* e.g. 2 index in TRACE list */
  Coords   _position_absolute;
  Coords   _position_relative; /* wrt PREVIOUS */
  Rotation _rotation_absolute;
  Rotation _rotation_relative; /* wrt PREVIOUS */
  int      _rotation_is_identity;
  int      _position_relative_is_zero;
  _class_Pol_guide_vmirror_parameters _parameters;
};
typedef struct _struct_Pol_guide_vmirror _class_Pol_guide_vmirror;
_class_Pol_guide_vmirror _WASP_Vpolariser_var;
#pragma acc declare create ( _WASP_Vpolariser_var )

_class_Guide_gravity _H522_Straight_Last_var;
#pragma acc declare create ( _H522_Straight_Last_var )

_class_Monitor_nD _H522_WASP_Sample_Div_var;
#pragma acc declare create ( _H522_WASP_Sample_Div_var )

_class_Monitor_nD _H522_WASP_Sample_XY_var;
#pragma acc declare create ( _H522_WASP_Sample_XY_var )

_class_Monitor_nD _H522_WASP_Sample_L_var;
#pragma acc declare create ( _H522_WASP_Sample_L_var )

/* component H522_WASP_Sample=Incoherent() [197] DECLARE */
/* Parameter definition for component type 'Incoherent' */
struct _struct_Incoherent_parameters {
  /* Component type 'Incoherent' setting parameters */
  char geometry[16384];
  MCNUM radius;
  MCNUM xwidth;
  MCNUM yheight;
  MCNUM zdepth;
  MCNUM thickness;
  MCNUM target_x;
  MCNUM target_y;
  MCNUM target_z;
  MCNUM focus_r;
  MCNUM focus_xw;
  MCNUM focus_yh;
  MCNUM focus_aw;
  MCNUM focus_ah;
  int target_index;
  MCNUM pack;
  MCNUM p_interact;
  MCNUM f_QE;
  MCNUM gamma;
  MCNUM Etrans;
  MCNUM deltaE;
  MCNUM sigma_abs;
  MCNUM sigma_inc;
  MCNUM Vc;
  MCNUM concentric;
  MCNUM order;
  /* Component type 'Incoherent' private parameters */
  struct StructVarsInc  VarsInc;
  off_struct  offdata;
}; /* _struct_Incoherent_parameters */
typedef struct _struct_Incoherent_parameters _class_Incoherent_parameters;

/* Parameters for component type 'Incoherent' */
struct _struct_Incoherent {
  char     _name[256]; /* e.g. H522_WASP_Sample */
  char     _type[256]; /* Incoherent */
  long     _index; /* e.g. 2 index in TRACE list */
  Coords   _position_absolute;
  Coords   _position_relative; /* wrt PREVIOUS */
  Rotation _rotation_absolute;
  Rotation _rotation_relative; /* wrt PREVIOUS */
  int      _rotation_is_identity;
  int      _position_relative_is_zero;
  _class_Incoherent_parameters _parameters;
};
typedef struct _struct_Incoherent _class_Incoherent;
_class_Incoherent _H522_WASP_Sample_var;
#pragma acc declare create ( _H522_WASP_Sample_var )

_class_Monitor_nD _H522_WASP_Detector_var;
#pragma acc declare create ( _H522_WASP_Detector_var )

_class_Monitor_nD _H522_WASP_Spectrometer_var;
#pragma acc declare create ( _H522_WASP_Spectrometer_var )

_class_Monitor_nD _H522_WASP_Diffractometer_var;
#pragma acc declare create ( _H522_WASP_Diffractometer_var )

_class_Arm _H523_start_var;
#pragma acc declare create ( _H523_start_var )

_class_Guide_gravity _H523_Curved_var;
#pragma acc declare create ( _H523_Curved_var )

_class_Guide_gravity _H523_Curved_203_var;
#pragma acc declare create ( _H523_Curved_203_var )

_class_Guide_gravity _H523_Curved_204_var;
#pragma acc declare create ( _H523_Curved_204_var )

_class_Guide_gravity _H523_Curved_205_var;
#pragma acc declare create ( _H523_Curved_205_var )

_class_Guide_gravity _H523_Curved_206_var;
#pragma acc declare create ( _H523_Curved_206_var )

_class_PowderN _HCS_Al_207_var;
#pragma acc declare create ( _HCS_Al_207_var )

_class_Monitor_nD _H523_VTE_var;
#pragma acc declare create ( _H523_VTE_var )

_class_PowderN _HCS_Al_209_var;
#pragma acc declare create ( _HCS_Al_209_var )

_class_Guide_gravity _H523_Curved_210_var;
#pragma acc declare create ( _H523_Curved_210_var )

_class_Guide_gravity _H523_Curved_211_var;
#pragma acc declare create ( _H523_Curved_211_var )

_class_Guide_gravity _H523_Curved_212_var;
#pragma acc declare create ( _H523_Curved_212_var )

_class_Guide_gravity _H523_Curved_213_var;
#pragma acc declare create ( _H523_Curved_213_var )

_class_Guide_gravity _H523_Curved_214_var;
#pragma acc declare create ( _H523_Curved_214_var )

_class_Guide_gravity _H523_Curved_215_var;
#pragma acc declare create ( _H523_Curved_215_var )

_class_Guide_gravity _H523_Curved_216_var;
#pragma acc declare create ( _H523_Curved_216_var )

_class_Guide_gravity _H523_Curved_217_var;
#pragma acc declare create ( _H523_Curved_217_var )

_class_Guide_gravity _H523_Curved_218_var;
#pragma acc declare create ( _H523_Curved_218_var )

_class_Guide_gravity _H523_Curved_219_var;
#pragma acc declare create ( _H523_Curved_219_var )

_class_Guide_gravity _H523_Curved_220_var;
#pragma acc declare create ( _H523_Curved_220_var )

_class_Guide_gravity _H523_Curved_221_var;
#pragma acc declare create ( _H523_Curved_221_var )

_class_Guide_gravity _H523_Curved_222_var;
#pragma acc declare create ( _H523_Curved_222_var )

_class_Guide_gravity _H523_Curved_223_var;
#pragma acc declare create ( _H523_Curved_223_var )

_class_Guide_gravity _H523_Curved_224_var;
#pragma acc declare create ( _H523_Curved_224_var )

_class_Guide_gravity _H523_Curved_225_var;
#pragma acc declare create ( _H523_Curved_225_var )

_class_Guide_gravity _H523_Curved_226_var;
#pragma acc declare create ( _H523_Curved_226_var )

_class_Guide_gravity _H523_Curved_227_var;
#pragma acc declare create ( _H523_Curved_227_var )

_class_Guide_gravity _H523_Curved_228_var;
#pragma acc declare create ( _H523_Curved_228_var )

_class_Guide_gravity _H523_Curved_229_var;
#pragma acc declare create ( _H523_Curved_229_var )

_class_PowderN _HCS_Al_230_var;
#pragma acc declare create ( _HCS_Al_230_var )

_class_Arm _H523_CryoEDM_In_var;
#pragma acc declare create ( _H523_CryoEDM_In_var )

_class_Monitor_nD _H523_CryoEDM_In_L_var;
#pragma acc declare create ( _H523_CryoEDM_In_L_var )

_class_Arm _H523_CryoEDM_mirror_center_var;
#pragma acc declare create ( _H523_CryoEDM_mirror_center_var )

_class_Pol_mirror _H523_CryoEDM_polariser_var;
#pragma acc declare create ( _H523_CryoEDM_polariser_var )

_class_Arm _H523_CryoEDM_mirror_outdir_var;
#pragma acc declare create ( _H523_CryoEDM_mirror_outdir_var )

_class_Monitor_nD _H523_CryoEDM_mirror_ReflectXY_var;
#pragma acc declare create ( _H523_CryoEDM_mirror_ReflectXY_var )

_class_Monitor_nD _H523_CryoEDM_mirror_TransmitXY_var;
#pragma acc declare create ( _H523_CryoEDM_mirror_TransmitXY_var )

_class_Monitor_nD _H523_CryoEDM_Sample_L_var;
#pragma acc declare create ( _H523_CryoEDM_Sample_L_var )

_class_Monitor_nD _H523_CryoEDM_Sample_Div_var;
#pragma acc declare create ( _H523_CryoEDM_Sample_Div_var )

_class_Monitor_nD _H523_CryoEDM_Sample_XY_var;
#pragma acc declare create ( _H523_CryoEDM_Sample_XY_var )

_class_Arm _H51_start_var;
#pragma acc declare create ( _H51_start_var )

_class_Guide_gravity _H51_inpile_var;
#pragma acc declare create ( _H51_inpile_var )

_class_Guide_gravity _H51_Obt_1_var;
#pragma acc declare create ( _H51_Obt_1_var )

_class_Guide_gravity _H51_Obt_2_var;
#pragma acc declare create ( _H51_Obt_2_var )

_class_Guide_gravity _H51_Obt_3_var;
#pragma acc declare create ( _H51_Obt_3_var )

_class_PowderN _HCS_Al_246_var;
#pragma acc declare create ( _HCS_Al_246_var )

_class_Monitor_nD _H51_Obt_Out_var;
#pragma acc declare create ( _H51_Obt_Out_var )

_class_PowderN _HCS_Al_248_var;
#pragma acc declare create ( _HCS_Al_248_var )

_class_Guide_gravity _H51_S2_var;
#pragma acc declare create ( _H51_S2_var )

_class_Guide_gravity _H51_S2_250_var;
#pragma acc declare create ( _H51_S2_250_var )

_class_Guide_gravity _H51_S2_251_var;
#pragma acc declare create ( _H51_S2_251_var )

_class_PowderN _HCS_Al_H51_var;
#pragma acc declare create ( _HCS_Al_H51_var )

_class_Monitor_nD _H51_S2_Out_var;
#pragma acc declare create ( _H51_S2_Out_var )

_class_Monitor_nD _H51_split_2_var;
#pragma acc declare create ( _H51_split_2_var )

_class_Monitor_nD _H51_split_1_var;
#pragma acc declare create ( _H51_split_1_var )

_class_Arm _H511_Start_var;
#pragma acc declare create ( _H511_Start_var )

_class_Arm _H511_mirror_centre_var;
#pragma acc declare create ( _H511_mirror_centre_var )

_class_Pol_mirror _IN15_polariser_var;
#pragma acc declare create ( _IN15_polariser_var )

_class_Arm _H511_mirror_outdir_var;
#pragma acc declare create ( _H511_mirror_outdir_var )

_class_Monitor_nD _H511_mirror_ReflectXY_var;
#pragma acc declare create ( _H511_mirror_ReflectXY_var )

_class_Monitor_nD _H511_mirror_TransmitXY_var;
#pragma acc declare create ( _H511_mirror_TransmitXY_var )

_class_Monitor_nD _H511_mirror_outdXY_var;
#pragma acc declare create ( _H511_mirror_outdXY_var )

_class_Guide_gravity _H511_S3_var;
#pragma acc declare create ( _H511_S3_var )

_class_Guide_gravity _H511_S9_var;
#pragma acc declare create ( _H511_S9_var )

_class_PowderN _HCS_Al_265_var;
#pragma acc declare create ( _HCS_Al_265_var )

_class_Monitor_nD _H511_VTE_var;
#pragma acc declare create ( _H511_VTE_var )

_class_PowderN _HCS_Al_267_var;
#pragma acc declare create ( _HCS_Al_267_var )

_class_Guide_gravity _H511_S10_var;
#pragma acc declare create ( _H511_S10_var )

_class_V_selector _IN15_Vselector_var;
#pragma acc declare create ( _IN15_Vselector_var )

_class_Guide_gravity _H511_BeforeV_var;
#pragma acc declare create ( _H511_BeforeV_var )

_class_Pol_guide_vmirror _IN15_Vpolariser_var;
#pragma acc declare create ( _IN15_Vpolariser_var )

_class_Guide_gravity _H511_AfterV_var;
#pragma acc declare create ( _H511_AfterV_var )

_class_Monitor_nD _H511_IN15_Sample_Div_var;
#pragma acc declare create ( _H511_IN15_Sample_Div_var )

_class_Monitor_nD _H511_IN15_Sample_XY_var;
#pragma acc declare create ( _H511_IN15_Sample_XY_var )

_class_Monitor_nD _H511_IN15_Sample_L_var;
#pragma acc declare create ( _H511_IN15_Sample_L_var )

_class_Incoherent _H511_IN15_Sample_var;
#pragma acc declare create ( _H511_IN15_Sample_var )

_class_Monitor_nD _H511_IN15_Detector_var;
#pragma acc declare create ( _H511_IN15_Detector_var )

_class_Monitor_nD _H511_IN15_Spectrometer_var;
#pragma acc declare create ( _H511_IN15_Spectrometer_var )

_class_Monitor_nD _H511_IN15_Diffractometer_var;
#pragma acc declare create ( _H511_IN15_Diffractometer_var )

_class_Arm _H512_Start_var;
#pragma acc declare create ( _H512_Start_var )

_class_Guide_gravity _H512_S36_var;
#pragma acc declare create ( _H512_S36_var )

_class_Guide_gravity _H512_S36_282_var;
#pragma acc declare create ( _H512_S36_282_var )

_class_Guide_gravity _H512_S36_283_var;
#pragma acc declare create ( _H512_S36_283_var )

_class_Guide_gravity _H512_S36_284_var;
#pragma acc declare create ( _H512_S36_284_var )

_class_Guide_gravity _H512_S36_285_var;
#pragma acc declare create ( _H512_S36_285_var )

_class_Guide_gravity _H512_S36_286_var;
#pragma acc declare create ( _H512_S36_286_var )

_class_Guide_gravity _H512_S36_287_var;
#pragma acc declare create ( _H512_S36_287_var )

_class_Guide_gravity _H512_S36_288_var;
#pragma acc declare create ( _H512_S36_288_var )

_class_Guide_gravity _H512_S36_289_var;
#pragma acc declare create ( _H512_S36_289_var )

_class_Guide_gravity _H512_S36_290_var;
#pragma acc declare create ( _H512_S36_290_var )

_class_Guide_gravity _H512_S36_291_var;
#pragma acc declare create ( _H512_S36_291_var )

_class_Guide_gravity _H512_S36_292_var;
#pragma acc declare create ( _H512_S36_292_var )

_class_Guide_gravity _H512_S36_293_var;
#pragma acc declare create ( _H512_S36_293_var )

_class_Guide_gravity _H512_S36_294_var;
#pragma acc declare create ( _H512_S36_294_var )

_class_Guide_gravity _H512_S36_295_var;
#pragma acc declare create ( _H512_S36_295_var )

_class_Guide_gravity _H512_S36_296_var;
#pragma acc declare create ( _H512_S36_296_var )

_class_PowderN _HCS_Al_H512_var;
#pragma acc declare create ( _HCS_Al_H512_var )

_class_Monitor_nD _H512_VTE_var;
#pragma acc declare create ( _H512_VTE_var )

_class_PowderN _HCS_Al_299_var;
#pragma acc declare create ( _HCS_Al_299_var )

_class_Guide_gravity _H51_S78_var;
#pragma acc declare create ( _H51_S78_var )

_class_Guide_gravity _H51_S78_301_var;
#pragma acc declare create ( _H51_S78_301_var )

_class_Guide_gravity _H51_S78_302_var;
#pragma acc declare create ( _H51_S78_302_var )

_class_Guide_gravity _H51_S78_303_var;
#pragma acc declare create ( _H51_S78_303_var )

_class_PowderN _HCS_Al_304_var;
#pragma acc declare create ( _HCS_Al_304_var )

_class_Guide_gravity _H512_S11_var;
#pragma acc declare create ( _H512_S11_var )

_class_PowderN _HCS_Al_306_var;
#pragma acc declare create ( _HCS_Al_306_var )

_class_Monitor_nD _D22_PreV_var;
#pragma acc declare create ( _D22_PreV_var )

_class_V_selector _D22_Vselector_var;
#pragma acc declare create ( _D22_Vselector_var )

_class_Guide_gravity _D22_Collimation_var;
#pragma acc declare create ( _D22_Collimation_var )

_class_Arm _D22_Sample_Pos_var;
#pragma acc declare create ( _D22_Sample_Pos_var )

_class_Monitor_nD _H51_D22_Sample_Div_var;
#pragma acc declare create ( _H51_D22_Sample_Div_var )

_class_Monitor_nD _H51_D22_Sample_XY_var;
#pragma acc declare create ( _H51_D22_Sample_XY_var )

_class_Monitor_nD _H51_D22_Sample_L_var;
#pragma acc declare create ( _H51_D22_Sample_L_var )

_class_Isotropic_Sqw _H51_D22_Sample_var;
#pragma acc declare create ( _H51_D22_Sample_var )

_class_Monitor_nD _D22_Detector_var;
#pragma acc declare create ( _D22_Detector_var )

/* component D22_Detector_vessel=Shape() [316] DECLARE */
/* Parameter definition for component type 'Shape' */
struct _struct_Shape_parameters {
  /* Component type 'Shape' setting parameters */
  char geometry[16384];
  MCNUM radius;
  MCNUM xwidth;
  MCNUM yheight;
  MCNUM zdepth;
  MCNUM thickness;
  MCNUM nx;
  MCNUM ny;
  MCNUM nz;
  int center;
  /* Component type 'Shape' private parameters */
  off_struct  offdata;
}; /* _struct_Shape_parameters */
typedef struct _struct_Shape_parameters _class_Shape_parameters;

/* Parameters for component type 'Shape' */
struct _struct_Shape {
  char     _name[256]; /* e.g. D22_Detector_vessel */
  char     _type[256]; /* Shape */
  long     _index; /* e.g. 2 index in TRACE list */
  Coords   _position_absolute;
  Coords   _position_relative; /* wrt PREVIOUS */
  Rotation _rotation_absolute;
  Rotation _rotation_relative; /* wrt PREVIOUS */
  int      _rotation_is_identity;
  int      _position_relative_is_zero;
  _class_Shape_parameters _parameters;
};
typedef struct _struct_Shape _class_Shape;
_class_Shape _D22_Detector_vessel_var;
#pragma acc declare create ( _D22_Detector_vessel_var )

_class_Shape _BOG_var;
#pragma acc declare create ( _BOG_var )

_class_Shape _H53_ThALES_Drum_var;
#pragma acc declare create ( _H53_ThALES_Drum_var )

_class_Shape _H521_D16_Drum_var;
#pragma acc declare create ( _H521_D16_Drum_var )

_class_Shape _H521_SADAM_Drum_var;
#pragma acc declare create ( _H521_SADAM_Drum_var )

_class_Shape _Traversee_var;
#pragma acc declare create ( _Traversee_var )

_class_Arm _Core_Centre_var;
#pragma acc declare create ( _Core_Centre_var )

_class_Shape _Core_var;
#pragma acc declare create ( _Core_var )

_class_Shape _D2O_Vessel_var;
#pragma acc declare create ( _D2O_Vessel_var )

_class_Shape _H2O_Vessel_var;
#pragma acc declare create ( _H2O_Vessel_var )

int mcNUMCOMP = 325;

/* User declarations from instrument definition. Can define functions. */
  
  /* HCS (H5) source 'Measured' parameters */
  double sT3=413.5,sI3=10.22e12;
  double sT2=145.8,sI2=3.44e13;
  double sT1=40.1 ,sI1=2.78e13;
  
  /* guide coating parameters */
  double gR0          = 1;
  double gQc          = 0.0216;
  double gAlpha       = 4.07;
  double gW           = 1.0/300.0;
  
  double Al_Thickness = 0.001;
  double gGap         = 0.001;
  
  double ThALES_DM      = 3.355; /* PG002 */
  double ThALES_A1      = 0;
  double ThALES_L       = 2.12;
  
  double WASP_L       = 2.75;
  
  double D16_DM       = 3.355; /* PG002 */
  double D16_A1       = 0;
  double D16_L        = 2.8;
  
  double SADAM_DM     = 3.355; /* PG002 */
  double SADAM_A1     = 0;
  double SADAM_L      = 3.36;
  
  double CryoEDM_L    = 0.3;
    
  double IN15_L       = 3.7;
  double IN15_nu      = 0;
  double  D22_nu      = 0;
  double WASP_nu      = 0;

#undef compcurname
#undef compcurtype
#undef compcurindex
/* end of instrument 'ILL_H5_new' and components DECLARE */

/* *****************************************************************************
* instrument 'ILL_H5_new' and components INITIALISE
***************************************************************************** */

double index_getdistance(int first_index, int second_index)
/* Calculate the distance two components from their indexes*/
{
  return coords_len(coords_sub(POS_A_COMP_INDEX(first_index), POS_A_COMP_INDEX(second_index)));
}

double getdistance(char* first_component, char* second_component)
/* Calculate the distance between two named components */
{
  int first_index = _getcomp_index(first_component);
  int second_index = _getcomp_index(second_component);
  return index_getdistance(first_index, second_index);
}

double checked_setpos_getdistance(int current_index, char* first_component, char* second_component)
/* Calculate the distance between two named components at *_setpos() time, with component index checking */
{
  int first_index = _getcomp_index(first_component);
  int second_index = _getcomp_index(second_component);
  if (first_index >= current_index || second_index >= current_index) {
    printf("setpos_getdistance can only be used with the names of components before the current one!\n");
    return 0;
  }
  return index_getdistance(first_index, second_index);
}
#define setpos_getdistance(first, second) checked_setpos_getdistance(current_setpos_index, first, second)

/* component Origin=Progress_bar() SETTING, POSITION/ROTATION */
int _Origin_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_Origin_setpos] component Origin=Progress_bar() SETTING [Progress_bar:0]");
  stracpy(_Origin_var._name, "Origin", 16384);
  stracpy(_Origin_var._type, "Progress_bar", 16384);
  _Origin_var._index=1;
  int current_setpos_index = 1;
  if("NULL" && strlen("NULL"))
    stracpy(_Origin_var._parameters.profile, "NULL" ? "NULL" : "", 16384);
  else 
  _Origin_var._parameters.profile[0]='\0';
  _Origin_var._parameters.percent = 10;
  _Origin_var._parameters.flag_save = 0;
  _Origin_var._parameters.minutes = 0;


  /* component Origin=Progress_bar() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(_Origin_var._rotation_absolute,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_copy(_Origin_var._rotation_relative, _Origin_var._rotation_absolute);
    _Origin_var._rotation_is_identity =  rot_test_identity(_Origin_var._rotation_relative);
    _Origin_var._position_absolute = coords_set(
      0, 0, 0);
    tc1 = coords_neg(_Origin_var._position_absolute);
    _Origin_var._position_relative = rot_apply(_Origin_var._rotation_absolute, tc1);
  } /* Origin=Progress_bar() AT ROTATED */
  DEBUG_COMPONENT("Origin", _Origin_var._position_absolute, _Origin_var._rotation_absolute);
  instrument->_position_absolute[1] = _Origin_var._position_absolute;
  instrument->_position_relative[1] = _Origin_var._position_relative;
    _Origin_var._position_relative_is_zero =  coords_test_zero(_Origin_var._position_relative);
  instrument->counter_N[1]  = instrument->counter_P[1] = instrument->counter_P2[1] = 0;
  instrument->counter_AbsorbProp[1]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0000_Origin", _Origin_var._position_absolute, _Origin_var._rotation_absolute, "Progress_bar");
        mccomp_param_nexus(nxhandle,"0000_Origin", "profile", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0000_Origin", "percent", "10", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0000_Origin", "flag_save", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0000_Origin", "minutes", "0", "0","MCNUM");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _Origin_setpos */

/* component HCS=Source_gen() SETTING, POSITION/ROTATION */
int _HCS_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_setpos] component HCS=Source_gen() SETTING [Source_gen:0]");
  stracpy(_HCS_var._name, "HCS", 16384);
  stracpy(_HCS_var._type, "Source_gen", 16384);
  _HCS_var._index=2;
  int current_setpos_index = 2;
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_var._parameters.flux_file, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_var._parameters.flux_file[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_var._parameters.xdiv_file, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_var._parameters.xdiv_file[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_var._parameters.ydiv_file, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_var._parameters.ydiv_file[0]='\0';
  _HCS_var._parameters.radius = 0.21 / 2;
  _HCS_var._parameters.dist = 2.155;
  _HCS_var._parameters.focus_xw = 0.170;
  _HCS_var._parameters.focus_yh = 0.120;
  _HCS_var._parameters.focus_aw = 0;
  _HCS_var._parameters.focus_ah = 0;
  _HCS_var._parameters.E0 = 0;
  _HCS_var._parameters.dE = 0;
  _HCS_var._parameters.lambda0 = _instrument_var._parameters.lambda;
  _HCS_var._parameters.dlambda = _instrument_var._parameters.dlambda;
  _HCS_var._parameters.I1 = sI1;
  _HCS_var._parameters.yheight = 0.1;
  _HCS_var._parameters.xwidth = 0.1;
  _HCS_var._parameters.verbose = 1;
  _HCS_var._parameters.T1 = sT1;
  _HCS_var._parameters.flux_file_perAA = 0;
  _HCS_var._parameters.flux_file_log = 0;
  _HCS_var._parameters.Lmin = 0;
  _HCS_var._parameters.Lmax = 0;
  _HCS_var._parameters.Emin = 0;
  _HCS_var._parameters.Emax = 0;
  _HCS_var._parameters.T2 = sT2;
  _HCS_var._parameters.I2 = sI2;
  _HCS_var._parameters.T3 = sT3;
  _HCS_var._parameters.I3 = sI3;
  _HCS_var._parameters.zdepth = 0.15;
  _HCS_var._parameters.target_index = 1;


  /* component HCS=Source_gen() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _Origin_var._rotation_absolute, _HCS_var._rotation_absolute);
    rot_transpose(_Origin_var._rotation_absolute, tr1);
    rot_mul(_HCS_var._rotation_absolute, tr1, _HCS_var._rotation_relative);
    _HCS_var._rotation_is_identity =  rot_test_identity(_HCS_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_Origin_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_var._position_absolute = coords_add(_Origin_var._position_absolute, tc2);
    tc1 = coords_sub(_Origin_var._position_absolute, _HCS_var._position_absolute);
    _HCS_var._position_relative = rot_apply(_HCS_var._rotation_absolute, tc1);
  } /* HCS=Source_gen() AT ROTATED */
  DEBUG_COMPONENT("HCS", _HCS_var._position_absolute, _HCS_var._rotation_absolute);
  instrument->_position_absolute[2] = _HCS_var._position_absolute;
  instrument->_position_relative[2] = _HCS_var._position_relative;
    _HCS_var._position_relative_is_zero =  coords_test_zero(_HCS_var._position_relative);
  instrument->counter_N[2]  = instrument->counter_P[2] = instrument->counter_P2[2] = 0;
  instrument->counter_AbsorbProp[2]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0001_HCS", _HCS_var._position_absolute, _HCS_var._rotation_absolute, "Source_gen");
        mccomp_param_nexus(nxhandle,"0001_HCS", "flux_file", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0001_HCS", "xdiv_file", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0001_HCS", "ydiv_file", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0001_HCS", "radius", "0.0", "0.21 / 2","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "dist", "0", "2.155","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "focus_xw", "0.045", "0.170","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "focus_yh", "0.12", "0.120","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "focus_aw", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "focus_ah", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "E0", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "dE", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "lambda0", "0", "_instrument_var._parameters.lambda","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "dlambda", "0", "_instrument_var._parameters.dlambda","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "I1", "1", "sI1","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "yheight", "0.1", "0.1","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "xwidth", "0.1", "0.1","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "verbose", "0", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "T1", "0", "sT1","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "flux_file_perAA", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "flux_file_log", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "Lmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "Lmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "Emin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "Emax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "T2", "0", "sT2","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "I2", "0", "sI2","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "T3", "0", "sT3","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "I3", "0", "sI3","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "zdepth", "0", "0.15","MCNUM");
        mccomp_param_nexus(nxhandle,"0001_HCS", "target_index", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_setpos */

/* component HCS_Al=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_setpos] component HCS_Al=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_var._name, "HCS_Al", 16384);
  stracpy(_HCS_Al_var._type, "PowderN", 16384);
  _HCS_Al_var._index=3;
  int current_setpos_index = 3;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_var._parameters.geometry[0]='\0';
  _HCS_Al_var._parameters.format[0] = 0;
  _HCS_Al_var._parameters.format[1] = 0;
  _HCS_Al_var._parameters.format[2] = 0;
  _HCS_Al_var._parameters.format[3] = 0;
  _HCS_Al_var._parameters.format[4] = 0;
  _HCS_Al_var._parameters.format[5] = 0;
  _HCS_Al_var._parameters.format[6] = 0;
  _HCS_Al_var._parameters.format[7] = 0;
  _HCS_Al_var._parameters.format[8] = 0;
  _HCS_Al_var._parameters.radius = 0;
  _HCS_Al_var._parameters.yheight = 0.12;
  _HCS_Al_var._parameters.xwidth = 0.17;
  _HCS_Al_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_var._parameters.thickness = 0;
  _HCS_Al_var._parameters.pack = 1;
  _HCS_Al_var._parameters.Vc = 0;
  _HCS_Al_var._parameters.sigma_abs = 0;
  _HCS_Al_var._parameters.sigma_inc = 0;
  _HCS_Al_var._parameters.delta_d_d = 0;
  _HCS_Al_var._parameters.p_inc = 0.005;
  _HCS_Al_var._parameters.p_transmit = 0.9450;
  _HCS_Al_var._parameters.DW = 0;
  _HCS_Al_var._parameters.nb_atoms = 1;
  _HCS_Al_var._parameters.d_omega = 0;
  _HCS_Al_var._parameters.d_phi = 10;
  _HCS_Al_var._parameters.tth_sign = 0;
  _HCS_Al_var._parameters.p_interact = 0.05;
  _HCS_Al_var._parameters.concentric = 0;
  _HCS_Al_var._parameters.density = 0;
  _HCS_Al_var._parameters.weight = 0;
  _HCS_Al_var._parameters.barns = 1;
  _HCS_Al_var._parameters.Strain = 0;
  _HCS_Al_var._parameters.focus_flip = 0;
  _HCS_Al_var._parameters.target_index = 0;
  _HCS_Al_var._parameters.order = 1;


  /* component HCS_Al=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_var._rotation_absolute, _HCS_Al_var._rotation_absolute);
    rot_transpose(_HCS_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_var._rotation_absolute, tr1, _HCS_Al_var._rotation_relative);
    _HCS_Al_var._rotation_is_identity =  rot_test_identity(_HCS_Al_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.21);
    rot_transpose(_HCS_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_var._position_absolute = coords_add(_HCS_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_var._position_absolute, _HCS_Al_var._position_absolute);
    _HCS_Al_var._position_relative = rot_apply(_HCS_Al_var._rotation_absolute, tc1);
  } /* HCS_Al=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al", _HCS_Al_var._position_absolute, _HCS_Al_var._rotation_absolute);
  instrument->_position_absolute[3] = _HCS_Al_var._position_absolute;
  instrument->_position_relative[3] = _HCS_Al_var._position_relative;
    _HCS_Al_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_var._position_relative);
  instrument->counter_N[3]  = instrument->counter_P[3] = instrument->counter_P2[3] = 0;
  instrument->counter_AbsorbProp[3]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0002_HCS_Al", _HCS_Al_var._position_absolute, _HCS_Al_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "xwidth", "0", "0.17","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0002_HCS_Al", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_setpos */

/* component HCS_Al_4=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_4_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_4_setpos] component HCS_Al_4=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_4_var._name, "HCS_Al_4", 16384);
  stracpy(_HCS_Al_4_var._type, "PowderN", 16384);
  _HCS_Al_4_var._index=4;
  int current_setpos_index = 4;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_4_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_4_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_4_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_4_var._parameters.geometry[0]='\0';
  _HCS_Al_4_var._parameters.format[0] = 0;
  _HCS_Al_4_var._parameters.format[1] = 0;
  _HCS_Al_4_var._parameters.format[2] = 0;
  _HCS_Al_4_var._parameters.format[3] = 0;
  _HCS_Al_4_var._parameters.format[4] = 0;
  _HCS_Al_4_var._parameters.format[5] = 0;
  _HCS_Al_4_var._parameters.format[6] = 0;
  _HCS_Al_4_var._parameters.format[7] = 0;
  _HCS_Al_4_var._parameters.format[8] = 0;
  _HCS_Al_4_var._parameters.radius = 0;
  _HCS_Al_4_var._parameters.yheight = 0.12;
  _HCS_Al_4_var._parameters.xwidth = 0.17;
  _HCS_Al_4_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_4_var._parameters.thickness = 0;
  _HCS_Al_4_var._parameters.pack = 1;
  _HCS_Al_4_var._parameters.Vc = 0;
  _HCS_Al_4_var._parameters.sigma_abs = 0;
  _HCS_Al_4_var._parameters.sigma_inc = 0;
  _HCS_Al_4_var._parameters.delta_d_d = 0;
  _HCS_Al_4_var._parameters.p_inc = 0.005;
  _HCS_Al_4_var._parameters.p_transmit = 0.9450;
  _HCS_Al_4_var._parameters.DW = 0;
  _HCS_Al_4_var._parameters.nb_atoms = 1;
  _HCS_Al_4_var._parameters.d_omega = 0;
  _HCS_Al_4_var._parameters.d_phi = 10;
  _HCS_Al_4_var._parameters.tth_sign = 0;
  _HCS_Al_4_var._parameters.p_interact = 0.05;
  _HCS_Al_4_var._parameters.concentric = 0;
  _HCS_Al_4_var._parameters.density = 0;
  _HCS_Al_4_var._parameters.weight = 0;
  _HCS_Al_4_var._parameters.barns = 1;
  _HCS_Al_4_var._parameters.Strain = 0;
  _HCS_Al_4_var._parameters.focus_flip = 0;
  _HCS_Al_4_var._parameters.target_index = 0;
  _HCS_Al_4_var._parameters.order = 1;


  /* component HCS_Al_4=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_var._rotation_absolute, _HCS_Al_4_var._rotation_absolute);
    rot_transpose(_HCS_Al_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_4_var._rotation_absolute, tr1, _HCS_Al_4_var._rotation_relative);
    _HCS_Al_4_var._rotation_is_identity =  rot_test_identity(_HCS_Al_4_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.61);
    rot_transpose(_HCS_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_4_var._position_absolute = coords_add(_HCS_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_var._position_absolute, _HCS_Al_4_var._position_absolute);
    _HCS_Al_4_var._position_relative = rot_apply(_HCS_Al_4_var._rotation_absolute, tc1);
  } /* HCS_Al_4=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_4", _HCS_Al_4_var._position_absolute, _HCS_Al_4_var._rotation_absolute);
  instrument->_position_absolute[4] = _HCS_Al_4_var._position_absolute;
  instrument->_position_relative[4] = _HCS_Al_4_var._position_relative;
    _HCS_Al_4_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_4_var._position_relative);
  instrument->counter_N[4]  = instrument->counter_P[4] = instrument->counter_P2[4] = 0;
  instrument->counter_AbsorbProp[4]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0003_HCS_Al_4", _HCS_Al_4_var._position_absolute, _HCS_Al_4_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "xwidth", "0", "0.17","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0003_HCS_Al_4", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_4_setpos */

/* component HCS_Al_5=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_5_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_5_setpos] component HCS_Al_5=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_5_var._name, "HCS_Al_5", 16384);
  stracpy(_HCS_Al_5_var._type, "PowderN", 16384);
  _HCS_Al_5_var._index=5;
  int current_setpos_index = 5;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_5_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_5_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_5_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_5_var._parameters.geometry[0]='\0';
  _HCS_Al_5_var._parameters.format[0] = 0;
  _HCS_Al_5_var._parameters.format[1] = 0;
  _HCS_Al_5_var._parameters.format[2] = 0;
  _HCS_Al_5_var._parameters.format[3] = 0;
  _HCS_Al_5_var._parameters.format[4] = 0;
  _HCS_Al_5_var._parameters.format[5] = 0;
  _HCS_Al_5_var._parameters.format[6] = 0;
  _HCS_Al_5_var._parameters.format[7] = 0;
  _HCS_Al_5_var._parameters.format[8] = 0;
  _HCS_Al_5_var._parameters.radius = 0;
  _HCS_Al_5_var._parameters.yheight = 0.12;
  _HCS_Al_5_var._parameters.xwidth = 0.17;
  _HCS_Al_5_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_5_var._parameters.thickness = 0;
  _HCS_Al_5_var._parameters.pack = 1;
  _HCS_Al_5_var._parameters.Vc = 0;
  _HCS_Al_5_var._parameters.sigma_abs = 0;
  _HCS_Al_5_var._parameters.sigma_inc = 0;
  _HCS_Al_5_var._parameters.delta_d_d = 0;
  _HCS_Al_5_var._parameters.p_inc = 0.005;
  _HCS_Al_5_var._parameters.p_transmit = 0.9450;
  _HCS_Al_5_var._parameters.DW = 0;
  _HCS_Al_5_var._parameters.nb_atoms = 1;
  _HCS_Al_5_var._parameters.d_omega = 0;
  _HCS_Al_5_var._parameters.d_phi = 10;
  _HCS_Al_5_var._parameters.tth_sign = 0;
  _HCS_Al_5_var._parameters.p_interact = 0.05;
  _HCS_Al_5_var._parameters.concentric = 0;
  _HCS_Al_5_var._parameters.density = 0;
  _HCS_Al_5_var._parameters.weight = 0;
  _HCS_Al_5_var._parameters.barns = 1;
  _HCS_Al_5_var._parameters.Strain = 0;
  _HCS_Al_5_var._parameters.focus_flip = 0;
  _HCS_Al_5_var._parameters.target_index = 0;
  _HCS_Al_5_var._parameters.order = 1;


  /* component HCS_Al_5=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_var._rotation_absolute, _HCS_Al_5_var._rotation_absolute);
    rot_transpose(_HCS_Al_4_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_5_var._rotation_absolute, tr1, _HCS_Al_5_var._rotation_relative);
    _HCS_Al_5_var._rotation_is_identity =  rot_test_identity(_HCS_Al_5_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.78);
    rot_transpose(_HCS_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_5_var._position_absolute = coords_add(_HCS_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_4_var._position_absolute, _HCS_Al_5_var._position_absolute);
    _HCS_Al_5_var._position_relative = rot_apply(_HCS_Al_5_var._rotation_absolute, tc1);
  } /* HCS_Al_5=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_5", _HCS_Al_5_var._position_absolute, _HCS_Al_5_var._rotation_absolute);
  instrument->_position_absolute[5] = _HCS_Al_5_var._position_absolute;
  instrument->_position_relative[5] = _HCS_Al_5_var._position_relative;
    _HCS_Al_5_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_5_var._position_relative);
  instrument->counter_N[5]  = instrument->counter_P[5] = instrument->counter_P2[5] = 0;
  instrument->counter_AbsorbProp[5]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0004_HCS_Al_5", _HCS_Al_5_var._position_absolute, _HCS_Al_5_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "xwidth", "0", "0.17","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0004_HCS_Al_5", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_5_setpos */

/* component HCS_Al_6=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_6_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_6_setpos] component HCS_Al_6=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_6_var._name, "HCS_Al_6", 16384);
  stracpy(_HCS_Al_6_var._type, "PowderN", 16384);
  _HCS_Al_6_var._index=6;
  int current_setpos_index = 6;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_6_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_6_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_6_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_6_var._parameters.geometry[0]='\0';
  _HCS_Al_6_var._parameters.format[0] = 0;
  _HCS_Al_6_var._parameters.format[1] = 0;
  _HCS_Al_6_var._parameters.format[2] = 0;
  _HCS_Al_6_var._parameters.format[3] = 0;
  _HCS_Al_6_var._parameters.format[4] = 0;
  _HCS_Al_6_var._parameters.format[5] = 0;
  _HCS_Al_6_var._parameters.format[6] = 0;
  _HCS_Al_6_var._parameters.format[7] = 0;
  _HCS_Al_6_var._parameters.format[8] = 0;
  _HCS_Al_6_var._parameters.radius = 0;
  _HCS_Al_6_var._parameters.yheight = 0.12;
  _HCS_Al_6_var._parameters.xwidth = 0.17;
  _HCS_Al_6_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_6_var._parameters.thickness = 0;
  _HCS_Al_6_var._parameters.pack = 1;
  _HCS_Al_6_var._parameters.Vc = 0;
  _HCS_Al_6_var._parameters.sigma_abs = 0;
  _HCS_Al_6_var._parameters.sigma_inc = 0;
  _HCS_Al_6_var._parameters.delta_d_d = 0;
  _HCS_Al_6_var._parameters.p_inc = 0.005;
  _HCS_Al_6_var._parameters.p_transmit = 0.9450;
  _HCS_Al_6_var._parameters.DW = 0;
  _HCS_Al_6_var._parameters.nb_atoms = 1;
  _HCS_Al_6_var._parameters.d_omega = 0;
  _HCS_Al_6_var._parameters.d_phi = 10;
  _HCS_Al_6_var._parameters.tth_sign = 0;
  _HCS_Al_6_var._parameters.p_interact = 0.05;
  _HCS_Al_6_var._parameters.concentric = 0;
  _HCS_Al_6_var._parameters.density = 0;
  _HCS_Al_6_var._parameters.weight = 0;
  _HCS_Al_6_var._parameters.barns = 1;
  _HCS_Al_6_var._parameters.Strain = 0;
  _HCS_Al_6_var._parameters.focus_flip = 0;
  _HCS_Al_6_var._parameters.target_index = 0;
  _HCS_Al_6_var._parameters.order = 1;


  /* component HCS_Al_6=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_var._rotation_absolute, _HCS_Al_6_var._rotation_absolute);
    rot_transpose(_HCS_Al_5_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_6_var._rotation_absolute, tr1, _HCS_Al_6_var._rotation_relative);
    _HCS_Al_6_var._rotation_is_identity =  rot_test_identity(_HCS_Al_6_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.92);
    rot_transpose(_HCS_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_6_var._position_absolute = coords_add(_HCS_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_5_var._position_absolute, _HCS_Al_6_var._position_absolute);
    _HCS_Al_6_var._position_relative = rot_apply(_HCS_Al_6_var._rotation_absolute, tc1);
  } /* HCS_Al_6=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_6", _HCS_Al_6_var._position_absolute, _HCS_Al_6_var._rotation_absolute);
  instrument->_position_absolute[6] = _HCS_Al_6_var._position_absolute;
  instrument->_position_relative[6] = _HCS_Al_6_var._position_relative;
    _HCS_Al_6_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_6_var._position_relative);
  instrument->counter_N[6]  = instrument->counter_P[6] = instrument->counter_P2[6] = 0;
  instrument->counter_AbsorbProp[6]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0005_HCS_Al_6", _HCS_Al_6_var._position_absolute, _HCS_Al_6_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "xwidth", "0", "0.17","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0005_HCS_Al_6", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_6_setpos */

/* component HCS_Al_7=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_7_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_7_setpos] component HCS_Al_7=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_7_var._name, "HCS_Al_7", 16384);
  stracpy(_HCS_Al_7_var._type, "PowderN", 16384);
  _HCS_Al_7_var._index=7;
  int current_setpos_index = 7;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_7_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_7_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_7_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_7_var._parameters.geometry[0]='\0';
  _HCS_Al_7_var._parameters.format[0] = 0;
  _HCS_Al_7_var._parameters.format[1] = 0;
  _HCS_Al_7_var._parameters.format[2] = 0;
  _HCS_Al_7_var._parameters.format[3] = 0;
  _HCS_Al_7_var._parameters.format[4] = 0;
  _HCS_Al_7_var._parameters.format[5] = 0;
  _HCS_Al_7_var._parameters.format[6] = 0;
  _HCS_Al_7_var._parameters.format[7] = 0;
  _HCS_Al_7_var._parameters.format[8] = 0;
  _HCS_Al_7_var._parameters.radius = 0;
  _HCS_Al_7_var._parameters.yheight = 0.12;
  _HCS_Al_7_var._parameters.xwidth = 0.17;
  _HCS_Al_7_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_7_var._parameters.thickness = 0;
  _HCS_Al_7_var._parameters.pack = 1;
  _HCS_Al_7_var._parameters.Vc = 0;
  _HCS_Al_7_var._parameters.sigma_abs = 0;
  _HCS_Al_7_var._parameters.sigma_inc = 0;
  _HCS_Al_7_var._parameters.delta_d_d = 0;
  _HCS_Al_7_var._parameters.p_inc = 0.005;
  _HCS_Al_7_var._parameters.p_transmit = 0.9450;
  _HCS_Al_7_var._parameters.DW = 0;
  _HCS_Al_7_var._parameters.nb_atoms = 1;
  _HCS_Al_7_var._parameters.d_omega = 0;
  _HCS_Al_7_var._parameters.d_phi = 10;
  _HCS_Al_7_var._parameters.tth_sign = 0;
  _HCS_Al_7_var._parameters.p_interact = 0.05;
  _HCS_Al_7_var._parameters.concentric = 0;
  _HCS_Al_7_var._parameters.density = 0;
  _HCS_Al_7_var._parameters.weight = 0;
  _HCS_Al_7_var._parameters.barns = 1;
  _HCS_Al_7_var._parameters.Strain = 0;
  _HCS_Al_7_var._parameters.focus_flip = 0;
  _HCS_Al_7_var._parameters.target_index = 0;
  _HCS_Al_7_var._parameters.order = 1;


  /* component HCS_Al_7=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_var._rotation_absolute, _HCS_Al_7_var._rotation_absolute);
    rot_transpose(_HCS_Al_6_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_7_var._rotation_absolute, tr1, _HCS_Al_7_var._rotation_relative);
    _HCS_Al_7_var._rotation_is_identity =  rot_test_identity(_HCS_Al_7_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 2.15);
    rot_transpose(_HCS_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_7_var._position_absolute = coords_add(_HCS_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_6_var._position_absolute, _HCS_Al_7_var._position_absolute);
    _HCS_Al_7_var._position_relative = rot_apply(_HCS_Al_7_var._rotation_absolute, tc1);
  } /* HCS_Al_7=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_7", _HCS_Al_7_var._position_absolute, _HCS_Al_7_var._rotation_absolute);
  instrument->_position_absolute[7] = _HCS_Al_7_var._position_absolute;
  instrument->_position_relative[7] = _HCS_Al_7_var._position_relative;
    _HCS_Al_7_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_7_var._position_relative);
  instrument->counter_N[7]  = instrument->counter_P[7] = instrument->counter_P2[7] = 0;
  instrument->counter_AbsorbProp[7]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0006_HCS_Al_7", _HCS_Al_7_var._position_absolute, _HCS_Al_7_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "xwidth", "0", "0.17","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0006_HCS_Al_7", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_7_setpos */

/* component H5=Monitor_nD() SETTING, POSITION/ROTATION */
int _H5_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H5_setpos] component H5=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H5_var._name, "H5", 16384);
  stracpy(_H5_var._type, "Monitor_nD", 16384);
  _H5_var._index=8;
  int current_setpos_index = 8;
  if("" && strlen(""))
    stracpy(_H5_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H5_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H5_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H5_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H5_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H5_var._parameters.user3[0]='\0';
  _H5_var._parameters.xwidth = 0.17;
  _H5_var._parameters.yheight = 0.12;
  _H5_var._parameters.zdepth = 0;
  _H5_var._parameters.xmin = 0;
  _H5_var._parameters.xmax = 0;
  _H5_var._parameters.ymin = 0;
  _H5_var._parameters.ymax = 0;
  _H5_var._parameters.zmin = 0;
  _H5_var._parameters.zmax = 0;
  _H5_var._parameters.bins = 50;
  _H5_var._parameters.min = -1e40;
  _H5_var._parameters.max = 1e40;
  _H5_var._parameters.restore_neutron = 0;
  _H5_var._parameters.radius = 0;
  if("x y, slit" && strlen("x y, slit"))
    stracpy(_H5_var._parameters.options, "x y, slit" ? "x y, slit" : "", 16384);
  else 
  _H5_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H5_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H5_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H5_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H5_var._parameters.geometry[0]='\0';
  _H5_var._parameters.nowritefile = 0;
  _H5_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H5_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H5_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H5_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H5_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H5_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H5_var._parameters.username3[0]='\0';


  /* component H5=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_var._rotation_absolute, _H5_var._rotation_absolute);
    rot_transpose(_HCS_Al_7_var._rotation_absolute, tr1);
    rot_mul(_H5_var._rotation_absolute, tr1, _H5_var._rotation_relative);
    _H5_var._rotation_is_identity =  rot_test_identity(_H5_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 2.155);
    rot_transpose(_HCS_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H5_var._position_absolute = coords_add(_HCS_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_7_var._position_absolute, _H5_var._position_absolute);
    _H5_var._position_relative = rot_apply(_H5_var._rotation_absolute, tc1);
  } /* H5=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H5", _H5_var._position_absolute, _H5_var._rotation_absolute);
  instrument->_position_absolute[8] = _H5_var._position_absolute;
  instrument->_position_relative[8] = _H5_var._position_relative;
    _H5_var._position_relative_is_zero =  coords_test_zero(_H5_var._position_relative);
  instrument->counter_N[8]  = instrument->counter_P[8] = instrument->counter_P2[8] = 0;
  instrument->counter_AbsorbProp[8]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0007_H5", _H5_var._position_absolute, _H5_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0007_H5", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0007_H5", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0007_H5", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0007_H5", "xwidth", "0", "0.17","MCNUM");
        mccomp_param_nexus(nxhandle,"0007_H5", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0007_H5", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0007_H5", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0007_H5", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0007_H5", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0007_H5", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0007_H5", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0007_H5", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0007_H5", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0007_H5", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0007_H5", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0007_H5", "restore_neutron", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0007_H5", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0007_H5", "options", "NULL", "x y, slit", "char*");
        mccomp_param_nexus(nxhandle,"0007_H5", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0007_H5", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0007_H5", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0007_H5", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0007_H5", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0007_H5", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0007_H5", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H5_setpos */

/* component H5_rect=Guide_gravity() SETTING, POSITION/ROTATION */
int _H5_rect_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H5_rect_setpos] component H5_rect=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H5_rect_var._name, "H5_rect", 16384);
  stracpy(_H5_rect_var._type, "Guide_gravity", 16384);
  _H5_rect_var._index=9;
  int current_setpos_index = 9;
  _H5_rect_var._parameters.w1 = 0.170;
  _H5_rect_var._parameters.h1 = 0.12;
  _H5_rect_var._parameters.w2 = 0;
  _H5_rect_var._parameters.h2 = 0;
  _H5_rect_var._parameters.l = 1.0;
  _H5_rect_var._parameters.R0 = gR0;
  _H5_rect_var._parameters.Qc = gQc;
  _H5_rect_var._parameters.alpha = gAlpha;
  _H5_rect_var._parameters.m = 2;
  _H5_rect_var._parameters.W = gW;
  _H5_rect_var._parameters.nslit = 1;
  _H5_rect_var._parameters.d = 0.0005;
  _H5_rect_var._parameters.mleft = -1;
  _H5_rect_var._parameters.mright = -1;
  _H5_rect_var._parameters.mtop = -1;
  _H5_rect_var._parameters.mbottom = -1;
  _H5_rect_var._parameters.nhslit = 1;
  _H5_rect_var._parameters.G = 0;
  _H5_rect_var._parameters.aleft = -1;
  _H5_rect_var._parameters.aright = -1;
  _H5_rect_var._parameters.atop = -1;
  _H5_rect_var._parameters.abottom = -1;
  _H5_rect_var._parameters.wavy = 0;
  _H5_rect_var._parameters.wavy_z = 0;
  _H5_rect_var._parameters.wavy_tb = 0;
  _H5_rect_var._parameters.wavy_lr = 0;
  _H5_rect_var._parameters.chamfers = 0;
  _H5_rect_var._parameters.chamfers_z = 0;
  _H5_rect_var._parameters.chamfers_lr = 0;
  _H5_rect_var._parameters.chamfers_tb = 0;
  _H5_rect_var._parameters.nelements = 1;
  _H5_rect_var._parameters.nu = 0;
  _H5_rect_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H5_rect_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H5_rect_var._parameters.reflect[0]='\0';


  /* component H5_rect=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_var._rotation_absolute, _H5_rect_var._rotation_absolute);
    rot_transpose(_H5_var._rotation_absolute, tr1);
    rot_mul(_H5_rect_var._rotation_absolute, tr1, _H5_rect_var._rotation_relative);
    _H5_rect_var._rotation_is_identity =  rot_test_identity(_H5_rect_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 2.155);
    rot_transpose(_HCS_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H5_rect_var._position_absolute = coords_add(_HCS_var._position_absolute, tc2);
    tc1 = coords_sub(_H5_var._position_absolute, _H5_rect_var._position_absolute);
    _H5_rect_var._position_relative = rot_apply(_H5_rect_var._rotation_absolute, tc1);
  } /* H5_rect=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H5_rect", _H5_rect_var._position_absolute, _H5_rect_var._rotation_absolute);
  instrument->_position_absolute[9] = _H5_rect_var._position_absolute;
  instrument->_position_relative[9] = _H5_rect_var._position_relative;
    _H5_rect_var._position_relative_is_zero =  coords_test_zero(_H5_rect_var._position_relative);
  instrument->counter_N[9]  = instrument->counter_P[9] = instrument->counter_P2[9] = 0;
  instrument->counter_AbsorbProp[9]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0008_H5_rect", _H5_rect_var._position_absolute, _H5_rect_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "w1", "NONE", "0.170","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "l", "NONE", "1.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0008_H5_rect", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H5_rect_setpos */

/* component H53_origin=Monitor_nD() SETTING, POSITION/ROTATION */
int _H53_origin_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H53_origin_setpos] component H53_origin=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H53_origin_var._name, "H53_origin", 16384);
  stracpy(_H53_origin_var._type, "Monitor_nD", 16384);
  _H53_origin_var._index=10;
  int current_setpos_index = 10;
  if("" && strlen(""))
    stracpy(_H53_origin_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H53_origin_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H53_origin_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H53_origin_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H53_origin_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H53_origin_var._parameters.user3[0]='\0';
  _H53_origin_var._parameters.xwidth = 0.06;
  _H53_origin_var._parameters.yheight = 0.120;
  _H53_origin_var._parameters.zdepth = 0;
  _H53_origin_var._parameters.xmin = 0;
  _H53_origin_var._parameters.xmax = 0;
  _H53_origin_var._parameters.ymin = 0;
  _H53_origin_var._parameters.ymax = 0;
  _H53_origin_var._parameters.zmin = 0;
  _H53_origin_var._parameters.zmax = 0;
  _H53_origin_var._parameters.bins = 25;
  _H53_origin_var._parameters.min = -1e40;
  _H53_origin_var._parameters.max = 1e40;
  _H53_origin_var._parameters.restore_neutron = 1;
  _H53_origin_var._parameters.radius = 0;
  if("dx limits=[-2 2] dy limits=[-2 2]" && strlen("dx limits=[-2 2] dy limits=[-2 2]"))
    stracpy(_H53_origin_var._parameters.options, "dx limits=[-2 2] dy limits=[-2 2]" ? "dx limits=[-2 2] dy limits=[-2 2]" : "", 16384);
  else 
  _H53_origin_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_origin_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_origin_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_origin_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_origin_var._parameters.geometry[0]='\0';
  _H53_origin_var._parameters.nowritefile = 0;
  _H53_origin_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H53_origin_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_origin_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_origin_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_origin_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_origin_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_origin_var._parameters.username3[0]='\0';


  /* component H53_origin=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (1.5)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H5_var._rotation_absolute, _H53_origin_var._rotation_absolute);
    rot_transpose(_H5_rect_var._rotation_absolute, tr1);
    rot_mul(_H53_origin_var._rotation_absolute, tr1, _H53_origin_var._rotation_relative);
    _H53_origin_var._rotation_is_identity =  rot_test_identity(_H53_origin_var._rotation_relative);
    tc1 = coords_set(
      0.17 / 2 -0.06 / 2, 0, 1 + gGap);
    rot_transpose(_H5_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H53_origin_var._position_absolute = coords_add(_H5_var._position_absolute, tc2);
    tc1 = coords_sub(_H5_rect_var._position_absolute, _H53_origin_var._position_absolute);
    _H53_origin_var._position_relative = rot_apply(_H53_origin_var._rotation_absolute, tc1);
  } /* H53_origin=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H53_origin", _H53_origin_var._position_absolute, _H53_origin_var._rotation_absolute);
  instrument->_position_absolute[10] = _H53_origin_var._position_absolute;
  instrument->_position_relative[10] = _H53_origin_var._position_relative;
    _H53_origin_var._position_relative_is_zero =  coords_test_zero(_H53_origin_var._position_relative);
  instrument->counter_N[10]  = instrument->counter_P[10] = instrument->counter_P2[10] = 0;
  instrument->counter_AbsorbProp[10]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0009_H53_origin", _H53_origin_var._position_absolute, _H53_origin_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "yheight", "0", "0.120","MCNUM");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "bins", "0", "25","int");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "options", "NULL", "dx limits=[-2 2] dy limits=[-2 2]", "char*");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0009_H53_origin", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H53_origin_setpos */

/* component H52_origin=Monitor_nD() SETTING, POSITION/ROTATION */
int _H52_origin_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H52_origin_setpos] component H52_origin=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H52_origin_var._name, "H52_origin", 16384);
  stracpy(_H52_origin_var._type, "Monitor_nD", 16384);
  _H52_origin_var._index=11;
  int current_setpos_index = 11;
  if("" && strlen(""))
    stracpy(_H52_origin_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H52_origin_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H52_origin_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H52_origin_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H52_origin_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H52_origin_var._parameters.user3[0]='\0';
  _H52_origin_var._parameters.xwidth = 0.062;
  _H52_origin_var._parameters.yheight = 0.120;
  _H52_origin_var._parameters.zdepth = 0;
  _H52_origin_var._parameters.xmin = 0;
  _H52_origin_var._parameters.xmax = 0;
  _H52_origin_var._parameters.ymin = 0;
  _H52_origin_var._parameters.ymax = 0;
  _H52_origin_var._parameters.zmin = 0;
  _H52_origin_var._parameters.zmax = 0;
  _H52_origin_var._parameters.bins = 25;
  _H52_origin_var._parameters.min = -1e40;
  _H52_origin_var._parameters.max = 1e40;
  _H52_origin_var._parameters.restore_neutron = 1;
  _H52_origin_var._parameters.radius = 0;
  if("dx limits=[-2 2] dy limits=[-2 2]" && strlen("dx limits=[-2 2] dy limits=[-2 2]"))
    stracpy(_H52_origin_var._parameters.options, "dx limits=[-2 2] dy limits=[-2 2]" ? "dx limits=[-2 2] dy limits=[-2 2]" : "", 16384);
  else 
  _H52_origin_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H52_origin_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_origin_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H52_origin_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_origin_var._parameters.geometry[0]='\0';
  _H52_origin_var._parameters.nowritefile = 0;
  _H52_origin_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H52_origin_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_origin_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H52_origin_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_origin_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H52_origin_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_origin_var._parameters.username3[0]='\0';


  /* component H52_origin=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (0)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H5_var._rotation_absolute, _H52_origin_var._rotation_absolute);
    rot_transpose(_H53_origin_var._rotation_absolute, tr1);
    rot_mul(_H52_origin_var._rotation_absolute, tr1, _H52_origin_var._rotation_relative);
    _H52_origin_var._rotation_is_identity =  rot_test_identity(_H52_origin_var._rotation_relative);
    tc1 = coords_set(
      0.17 / 2 -0.06 / 2 -0.004 -0.062, 0, 1 + gGap);
    rot_transpose(_H5_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H52_origin_var._position_absolute = coords_add(_H5_var._position_absolute, tc2);
    tc1 = coords_sub(_H53_origin_var._position_absolute, _H52_origin_var._position_absolute);
    _H52_origin_var._position_relative = rot_apply(_H52_origin_var._rotation_absolute, tc1);
  } /* H52_origin=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H52_origin", _H52_origin_var._position_absolute, _H52_origin_var._rotation_absolute);
  instrument->_position_absolute[11] = _H52_origin_var._position_absolute;
  instrument->_position_relative[11] = _H52_origin_var._position_relative;
    _H52_origin_var._position_relative_is_zero =  coords_test_zero(_H52_origin_var._position_relative);
  instrument->counter_N[11]  = instrument->counter_P[11] = instrument->counter_P2[11] = 0;
  instrument->counter_AbsorbProp[11]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0010_H52_origin", _H52_origin_var._position_absolute, _H52_origin_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "xwidth", "0", "0.062","MCNUM");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "yheight", "0", "0.120","MCNUM");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "bins", "0", "25","int");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "options", "NULL", "dx limits=[-2 2] dy limits=[-2 2]", "char*");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0010_H52_origin", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H52_origin_setpos */

/* component H51_origin=Monitor_nD() SETTING, POSITION/ROTATION */
int _H51_origin_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H51_origin_setpos] component H51_origin=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H51_origin_var._name, "H51_origin", 16384);
  stracpy(_H51_origin_var._type, "Monitor_nD", 16384);
  _H51_origin_var._index=12;
  int current_setpos_index = 12;
  if("" && strlen(""))
    stracpy(_H51_origin_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H51_origin_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H51_origin_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H51_origin_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H51_origin_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H51_origin_var._parameters.user3[0]='\0';
  _H51_origin_var._parameters.xwidth = 0.04;
  _H51_origin_var._parameters.yheight = 0.120;
  _H51_origin_var._parameters.zdepth = 0;
  _H51_origin_var._parameters.xmin = 0;
  _H51_origin_var._parameters.xmax = 0;
  _H51_origin_var._parameters.ymin = 0;
  _H51_origin_var._parameters.ymax = 0;
  _H51_origin_var._parameters.zmin = 0;
  _H51_origin_var._parameters.zmax = 0;
  _H51_origin_var._parameters.bins = 25;
  _H51_origin_var._parameters.min = -1e40;
  _H51_origin_var._parameters.max = 1e40;
  _H51_origin_var._parameters.restore_neutron = 1;
  _H51_origin_var._parameters.radius = 0;
  if("dx limits=[-2 2] dy limits=[-2 2]" && strlen("dx limits=[-2 2] dy limits=[-2 2]"))
    stracpy(_H51_origin_var._parameters.options, "dx limits=[-2 2] dy limits=[-2 2]" ? "dx limits=[-2 2] dy limits=[-2 2]" : "", 16384);
  else 
  _H51_origin_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_origin_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_origin_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_origin_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_origin_var._parameters.geometry[0]='\0';
  _H51_origin_var._parameters.nowritefile = 0;
  _H51_origin_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H51_origin_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_origin_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_origin_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_origin_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_origin_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_origin_var._parameters.username3[0]='\0';


  /* component H51_origin=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-1.3269)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H5_var._rotation_absolute, _H51_origin_var._rotation_absolute);
    rot_transpose(_H52_origin_var._rotation_absolute, tr1);
    rot_mul(_H51_origin_var._rotation_absolute, tr1, _H51_origin_var._rotation_relative);
    _H51_origin_var._rotation_is_identity =  rot_test_identity(_H51_origin_var._rotation_relative);
    tc1 = coords_set(
      -0.17 / 2 + 0.04 / 2, 0, 1 + gGap);
    rot_transpose(_H5_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H51_origin_var._position_absolute = coords_add(_H5_var._position_absolute, tc2);
    tc1 = coords_sub(_H52_origin_var._position_absolute, _H51_origin_var._position_absolute);
    _H51_origin_var._position_relative = rot_apply(_H51_origin_var._rotation_absolute, tc1);
  } /* H51_origin=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H51_origin", _H51_origin_var._position_absolute, _H51_origin_var._rotation_absolute);
  instrument->_position_absolute[12] = _H51_origin_var._position_absolute;
  instrument->_position_relative[12] = _H51_origin_var._position_relative;
    _H51_origin_var._position_relative_is_zero =  coords_test_zero(_H51_origin_var._position_relative);
  instrument->counter_N[12]  = instrument->counter_P[12] = instrument->counter_P2[12] = 0;
  instrument->counter_AbsorbProp[12]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0011_H51_origin", _H51_origin_var._position_absolute, _H51_origin_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "xwidth", "0", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "yheight", "0", "0.120","MCNUM");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "bins", "0", "25","int");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "options", "NULL", "dx limits=[-2 2] dy limits=[-2 2]", "char*");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0011_H51_origin", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H51_origin_setpos */

/* component H53_start=Arm() SETTING, POSITION/ROTATION */
int _H53_start_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H53_start_setpos] component H53_start=Arm() SETTING [Arm:0]");
  stracpy(_H53_start_var._name, "H53_start", 16384);
  stracpy(_H53_start_var._type, "Arm", 16384);
  _H53_start_var._index=13;
  int current_setpos_index = 13;
  /* component H53_start=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H53_origin_var._rotation_absolute, _H53_start_var._rotation_absolute);
    rot_transpose(_H51_origin_var._rotation_absolute, tr1);
    rot_mul(_H53_start_var._rotation_absolute, tr1, _H53_start_var._rotation_relative);
    _H53_start_var._rotation_is_identity =  rot_test_identity(_H53_start_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H53_origin_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H53_start_var._position_absolute = coords_add(_H53_origin_var._position_absolute, tc2);
    tc1 = coords_sub(_H51_origin_var._position_absolute, _H53_start_var._position_absolute);
    _H53_start_var._position_relative = rot_apply(_H53_start_var._rotation_absolute, tc1);
  } /* H53_start=Arm() AT ROTATED */
  DEBUG_COMPONENT("H53_start", _H53_start_var._position_absolute, _H53_start_var._rotation_absolute);
  instrument->_position_absolute[13] = _H53_start_var._position_absolute;
  instrument->_position_relative[13] = _H53_start_var._position_relative;
    _H53_start_var._position_relative_is_zero =  coords_test_zero(_H53_start_var._position_relative);
  instrument->counter_N[13]  = instrument->counter_P[13] = instrument->counter_P2[13] = 0;
  instrument->counter_AbsorbProp[13]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0012_H53_start", _H53_start_var._position_absolute, _H53_start_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H53_start_setpos */

/* component H53_inpile=Guide_gravity() SETTING, POSITION/ROTATION */
int _H53_inpile_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H53_inpile_setpos] component H53_inpile=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H53_inpile_var._name, "H53_inpile", 16384);
  stracpy(_H53_inpile_var._type, "Guide_gravity", 16384);
  _H53_inpile_var._index=14;
  int current_setpos_index = 14;
  _H53_inpile_var._parameters.w1 = 0.06;
  _H53_inpile_var._parameters.h1 = 0.12;
  _H53_inpile_var._parameters.w2 = 0;
  _H53_inpile_var._parameters.h2 = 0;
  _H53_inpile_var._parameters.l = 4.930 -3.155;
  _H53_inpile_var._parameters.R0 = gR0;
  _H53_inpile_var._parameters.Qc = gQc;
  _H53_inpile_var._parameters.alpha = gAlpha;
  _H53_inpile_var._parameters.m = 3;
  _H53_inpile_var._parameters.W = gW;
  _H53_inpile_var._parameters.nslit = 1;
  _H53_inpile_var._parameters.d = 0.0005;
  _H53_inpile_var._parameters.mleft = -1;
  _H53_inpile_var._parameters.mright = -1;
  _H53_inpile_var._parameters.mtop = -1;
  _H53_inpile_var._parameters.mbottom = -1;
  _H53_inpile_var._parameters.nhslit = 1;
  _H53_inpile_var._parameters.G = 0;
  _H53_inpile_var._parameters.aleft = -1;
  _H53_inpile_var._parameters.aright = -1;
  _H53_inpile_var._parameters.atop = -1;
  _H53_inpile_var._parameters.abottom = -1;
  _H53_inpile_var._parameters.wavy = 0;
  _H53_inpile_var._parameters.wavy_z = 0;
  _H53_inpile_var._parameters.wavy_tb = 0;
  _H53_inpile_var._parameters.wavy_lr = 0;
  _H53_inpile_var._parameters.chamfers = 0;
  _H53_inpile_var._parameters.chamfers_z = 0;
  _H53_inpile_var._parameters.chamfers_lr = 0;
  _H53_inpile_var._parameters.chamfers_tb = 0;
  _H53_inpile_var._parameters.nelements = 1;
  _H53_inpile_var._parameters.nu = 0;
  _H53_inpile_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H53_inpile_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_inpile_var._parameters.reflect[0]='\0';


  /* component H53_inpile=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H53_start_var._rotation_absolute, _H53_inpile_var._rotation_absolute);
    rot_transpose(_H53_start_var._rotation_absolute, tr1);
    rot_mul(_H53_inpile_var._rotation_absolute, tr1, _H53_inpile_var._rotation_relative);
    _H53_inpile_var._rotation_is_identity =  rot_test_identity(_H53_inpile_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H53_start_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H53_inpile_var._position_absolute = coords_add(_H53_start_var._position_absolute, tc2);
    tc1 = coords_sub(_H53_start_var._position_absolute, _H53_inpile_var._position_absolute);
    _H53_inpile_var._position_relative = rot_apply(_H53_inpile_var._rotation_absolute, tc1);
  } /* H53_inpile=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H53_inpile", _H53_inpile_var._position_absolute, _H53_inpile_var._rotation_absolute);
  instrument->_position_absolute[14] = _H53_inpile_var._position_absolute;
  instrument->_position_relative[14] = _H53_inpile_var._position_relative;
    _H53_inpile_var._position_relative_is_zero =  coords_test_zero(_H53_inpile_var._position_relative);
  instrument->counter_N[14]  = instrument->counter_P[14] = instrument->counter_P2[14] = 0;
  instrument->counter_AbsorbProp[14]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0013_H53_inpile", _H53_inpile_var._position_absolute, _H53_inpile_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "l", "NONE", "4.930 -3.155","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "m", "1.0", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0013_H53_inpile", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H53_inpile_setpos */

/* component H53_Al=PowderN() SETTING, POSITION/ROTATION */
int _H53_Al_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H53_Al_setpos] component H53_Al=PowderN() SETTING [PowderN:0]");
  stracpy(_H53_Al_var._name, "H53_Al", 16384);
  stracpy(_H53_Al_var._type, "PowderN", 16384);
  _H53_Al_var._index=15;
  int current_setpos_index = 15;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_H53_Al_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _H53_Al_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_Al_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_Al_var._parameters.geometry[0]='\0';
  _H53_Al_var._parameters.format[0] = 0;
  _H53_Al_var._parameters.format[1] = 0;
  _H53_Al_var._parameters.format[2] = 0;
  _H53_Al_var._parameters.format[3] = 0;
  _H53_Al_var._parameters.format[4] = 0;
  _H53_Al_var._parameters.format[5] = 0;
  _H53_Al_var._parameters.format[6] = 0;
  _H53_Al_var._parameters.format[7] = 0;
  _H53_Al_var._parameters.format[8] = 0;
  _H53_Al_var._parameters.radius = 0;
  _H53_Al_var._parameters.yheight = 0.12;
  _H53_Al_var._parameters.xwidth = 0.06;
  _H53_Al_var._parameters.zdepth = Al_Thickness;
  _H53_Al_var._parameters.thickness = 0;
  _H53_Al_var._parameters.pack = 1;
  _H53_Al_var._parameters.Vc = 0;
  _H53_Al_var._parameters.sigma_abs = 0;
  _H53_Al_var._parameters.sigma_inc = 0;
  _H53_Al_var._parameters.delta_d_d = 0;
  _H53_Al_var._parameters.p_inc = 0.005;
  _H53_Al_var._parameters.p_transmit = 0.9450;
  _H53_Al_var._parameters.DW = 0;
  _H53_Al_var._parameters.nb_atoms = 1;
  _H53_Al_var._parameters.d_omega = 0;
  _H53_Al_var._parameters.d_phi = 10;
  _H53_Al_var._parameters.tth_sign = 0;
  _H53_Al_var._parameters.p_interact = 0.05;
  _H53_Al_var._parameters.concentric = 0;
  _H53_Al_var._parameters.density = 0;
  _H53_Al_var._parameters.weight = 0;
  _H53_Al_var._parameters.barns = 1;
  _H53_Al_var._parameters.Strain = 0;
  _H53_Al_var._parameters.focus_flip = 0;
  _H53_Al_var._parameters.target_index = 0;
  _H53_Al_var._parameters.order = 1;


  /* component H53_Al=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H53_inpile_var._rotation_absolute, _H53_Al_var._rotation_absolute);
    rot_transpose(_H53_inpile_var._rotation_absolute, tr1);
    rot_mul(_H53_Al_var._rotation_absolute, tr1, _H53_Al_var._rotation_relative);
    _H53_Al_var._rotation_is_identity =  rot_test_identity(_H53_Al_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H53_inpile , l ) + 0.01);
    rot_transpose(_H53_inpile_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H53_Al_var._position_absolute = coords_add(_H53_inpile_var._position_absolute, tc2);
    tc1 = coords_sub(_H53_inpile_var._position_absolute, _H53_Al_var._position_absolute);
    _H53_Al_var._position_relative = rot_apply(_H53_Al_var._rotation_absolute, tc1);
  } /* H53_Al=PowderN() AT ROTATED */
  DEBUG_COMPONENT("H53_Al", _H53_Al_var._position_absolute, _H53_Al_var._rotation_absolute);
  instrument->_position_absolute[15] = _H53_Al_var._position_absolute;
  instrument->_position_relative[15] = _H53_Al_var._position_relative;
    _H53_Al_var._position_relative_is_zero =  coords_test_zero(_H53_Al_var._position_relative);
  instrument->counter_N[15]  = instrument->counter_P[15] = instrument->counter_P2[15] = 0;
  instrument->counter_AbsorbProp[15]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0014_H53_Al", _H53_Al_var._position_absolute, _H53_Al_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0014_H53_Al", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H53_Al_setpos */

/* component H53_Obt=Guide_gravity() SETTING, POSITION/ROTATION */
int _H53_Obt_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H53_Obt_setpos] component H53_Obt=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H53_Obt_var._name, "H53_Obt", 16384);
  stracpy(_H53_Obt_var._type, "Guide_gravity", 16384);
  _H53_Obt_var._index=16;
  int current_setpos_index = 16;
  _H53_Obt_var._parameters.w1 = 0.06;
  _H53_Obt_var._parameters.h1 = 0.12;
  _H53_Obt_var._parameters.w2 = 0;
  _H53_Obt_var._parameters.h2 = 0;
  _H53_Obt_var._parameters.l = 3;
  _H53_Obt_var._parameters.R0 = gR0;
  _H53_Obt_var._parameters.Qc = gQc;
  _H53_Obt_var._parameters.alpha = gAlpha;
  _H53_Obt_var._parameters.m = 3;
  _H53_Obt_var._parameters.W = gW;
  _H53_Obt_var._parameters.nslit = 1;
  _H53_Obt_var._parameters.d = 0.0005;
  _H53_Obt_var._parameters.mleft = -1;
  _H53_Obt_var._parameters.mright = -1;
  _H53_Obt_var._parameters.mtop = -1;
  _H53_Obt_var._parameters.mbottom = -1;
  _H53_Obt_var._parameters.nhslit = 1;
  _H53_Obt_var._parameters.G = 0;
  _H53_Obt_var._parameters.aleft = -1;
  _H53_Obt_var._parameters.aright = -1;
  _H53_Obt_var._parameters.atop = -1;
  _H53_Obt_var._parameters.abottom = -1;
  _H53_Obt_var._parameters.wavy = 0;
  _H53_Obt_var._parameters.wavy_z = 0;
  _H53_Obt_var._parameters.wavy_tb = 0;
  _H53_Obt_var._parameters.wavy_lr = 0;
  _H53_Obt_var._parameters.chamfers = 0;
  _H53_Obt_var._parameters.chamfers_z = 0;
  _H53_Obt_var._parameters.chamfers_lr = 0;
  _H53_Obt_var._parameters.chamfers_tb = 0;
  _H53_Obt_var._parameters.nelements = 1;
  _H53_Obt_var._parameters.nu = 0;
  _H53_Obt_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H53_Obt_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_Obt_var._parameters.reflect[0]='\0';


  /* component H53_Obt=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H53_Al_var._rotation_absolute, _H53_Obt_var._rotation_absolute);
    rot_transpose(_H53_Al_var._rotation_absolute, tr1);
    rot_mul(_H53_Obt_var._rotation_absolute, tr1, _H53_Obt_var._rotation_relative);
    _H53_Obt_var._rotation_is_identity =  rot_test_identity(_H53_Obt_var._rotation_relative);
    tc1 = coords_set(
      0, 0, Al_Thickness + 0.015);
    rot_transpose(_H53_Al_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H53_Obt_var._position_absolute = coords_add(_H53_Al_var._position_absolute, tc2);
    tc1 = coords_sub(_H53_Al_var._position_absolute, _H53_Obt_var._position_absolute);
    _H53_Obt_var._position_relative = rot_apply(_H53_Obt_var._rotation_absolute, tc1);
  } /* H53_Obt=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H53_Obt", _H53_Obt_var._position_absolute, _H53_Obt_var._rotation_absolute);
  instrument->_position_absolute[16] = _H53_Obt_var._position_absolute;
  instrument->_position_relative[16] = _H53_Obt_var._position_relative;
    _H53_Obt_var._position_relative_is_zero =  coords_test_zero(_H53_Obt_var._position_relative);
  instrument->counter_N[16]  = instrument->counter_P[16] = instrument->counter_P2[16] = 0;
  instrument->counter_AbsorbProp[16]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0015_H53_Obt", _H53_Obt_var._position_absolute, _H53_Obt_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "l", "NONE", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "m", "1.0", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0015_H53_Obt", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H53_Obt_setpos */

/* component HCS_Al_17=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_17_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_17_setpos] component HCS_Al_17=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_17_var._name, "HCS_Al_17", 16384);
  stracpy(_HCS_Al_17_var._type, "PowderN", 16384);
  _HCS_Al_17_var._index=17;
  int current_setpos_index = 17;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_17_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_17_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_17_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_17_var._parameters.geometry[0]='\0';
  _HCS_Al_17_var._parameters.format[0] = 0;
  _HCS_Al_17_var._parameters.format[1] = 0;
  _HCS_Al_17_var._parameters.format[2] = 0;
  _HCS_Al_17_var._parameters.format[3] = 0;
  _HCS_Al_17_var._parameters.format[4] = 0;
  _HCS_Al_17_var._parameters.format[5] = 0;
  _HCS_Al_17_var._parameters.format[6] = 0;
  _HCS_Al_17_var._parameters.format[7] = 0;
  _HCS_Al_17_var._parameters.format[8] = 0;
  _HCS_Al_17_var._parameters.radius = 0;
  _HCS_Al_17_var._parameters.yheight = 0.12;
  _HCS_Al_17_var._parameters.xwidth = COMP_GETPAR ( H53_Obt , w1 );
  _HCS_Al_17_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_17_var._parameters.thickness = 0;
  _HCS_Al_17_var._parameters.pack = 1;
  _HCS_Al_17_var._parameters.Vc = 0;
  _HCS_Al_17_var._parameters.sigma_abs = 0;
  _HCS_Al_17_var._parameters.sigma_inc = 0;
  _HCS_Al_17_var._parameters.delta_d_d = 0;
  _HCS_Al_17_var._parameters.p_inc = 0.005;
  _HCS_Al_17_var._parameters.p_transmit = 0.9450;
  _HCS_Al_17_var._parameters.DW = 0;
  _HCS_Al_17_var._parameters.nb_atoms = 1;
  _HCS_Al_17_var._parameters.d_omega = 0;
  _HCS_Al_17_var._parameters.d_phi = 10;
  _HCS_Al_17_var._parameters.tth_sign = 0;
  _HCS_Al_17_var._parameters.p_interact = 0.05;
  _HCS_Al_17_var._parameters.concentric = 0;
  _HCS_Al_17_var._parameters.density = 0;
  _HCS_Al_17_var._parameters.weight = 0;
  _HCS_Al_17_var._parameters.barns = 1;
  _HCS_Al_17_var._parameters.Strain = 0;
  _HCS_Al_17_var._parameters.focus_flip = 0;
  _HCS_Al_17_var._parameters.target_index = 0;
  _HCS_Al_17_var._parameters.order = 1;


  /* component HCS_Al_17=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H53_Obt_var._rotation_absolute, _HCS_Al_17_var._rotation_absolute);
    rot_transpose(_H53_Obt_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_17_var._rotation_absolute, tr1, _HCS_Al_17_var._rotation_relative);
    _HCS_Al_17_var._rotation_is_identity =  rot_test_identity(_HCS_Al_17_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H53_Obt , l ) + 0.01);
    rot_transpose(_H53_Obt_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_17_var._position_absolute = coords_add(_H53_Obt_var._position_absolute, tc2);
    tc1 = coords_sub(_H53_Obt_var._position_absolute, _HCS_Al_17_var._position_absolute);
    _HCS_Al_17_var._position_relative = rot_apply(_HCS_Al_17_var._rotation_absolute, tc1);
  } /* HCS_Al_17=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_17", _HCS_Al_17_var._position_absolute, _HCS_Al_17_var._rotation_absolute);
  instrument->_position_absolute[17] = _HCS_Al_17_var._position_absolute;
  instrument->_position_relative[17] = _HCS_Al_17_var._position_relative;
    _HCS_Al_17_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_17_var._position_relative);
  instrument->counter_N[17]  = instrument->counter_P[17] = instrument->counter_P2[17] = 0;
  instrument->counter_AbsorbProp[17]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0016_HCS_Al_17", _HCS_Al_17_var._position_absolute, _HCS_Al_17_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "xwidth", "0", "COMP_GETPAR ( H53_Obt , w1 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0016_HCS_Al_17", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_17_setpos */

/* component H53_Obt_Out=Monitor_nD() SETTING, POSITION/ROTATION */
int _H53_Obt_Out_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H53_Obt_Out_setpos] component H53_Obt_Out=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H53_Obt_Out_var._name, "H53_Obt_Out", 16384);
  stracpy(_H53_Obt_Out_var._type, "Monitor_nD", 16384);
  _H53_Obt_Out_var._index=18;
  int current_setpos_index = 18;
  if("" && strlen(""))
    stracpy(_H53_Obt_Out_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H53_Obt_Out_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H53_Obt_Out_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H53_Obt_Out_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H53_Obt_Out_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H53_Obt_Out_var._parameters.user3[0]='\0';
  _H53_Obt_Out_var._parameters.xwidth = 0.06;
  _H53_Obt_Out_var._parameters.yheight = 0.12;
  _H53_Obt_Out_var._parameters.zdepth = 0;
  _H53_Obt_Out_var._parameters.xmin = 0;
  _H53_Obt_Out_var._parameters.xmax = 0;
  _H53_Obt_Out_var._parameters.ymin = 0;
  _H53_Obt_Out_var._parameters.ymax = 0;
  _H53_Obt_Out_var._parameters.zmin = 0;
  _H53_Obt_Out_var._parameters.zmax = 0;
  _H53_Obt_Out_var._parameters.bins = 50;
  _H53_Obt_Out_var._parameters.min = -1e40;
  _H53_Obt_Out_var._parameters.max = 1e40;
  _H53_Obt_Out_var._parameters.restore_neutron = 1;
  _H53_Obt_Out_var._parameters.radius = 0;
  if("x y, slit" && strlen("x y, slit"))
    stracpy(_H53_Obt_Out_var._parameters.options, "x y, slit" ? "x y, slit" : "", 16384);
  else 
  _H53_Obt_Out_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_Obt_Out_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_Obt_Out_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_Obt_Out_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_Obt_Out_var._parameters.geometry[0]='\0';
  _H53_Obt_Out_var._parameters.nowritefile = 0;
  _H53_Obt_Out_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H53_Obt_Out_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_Obt_Out_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_Obt_Out_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_Obt_Out_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_Obt_Out_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_Obt_Out_var._parameters.username3[0]='\0';


  /* component H53_Obt_Out=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_17_var._rotation_absolute, _H53_Obt_Out_var._rotation_absolute);
    rot_transpose(_HCS_Al_17_var._rotation_absolute, tr1);
    rot_mul(_H53_Obt_Out_var._rotation_absolute, tr1, _H53_Obt_Out_var._rotation_relative);
    _H53_Obt_Out_var._rotation_is_identity =  rot_test_identity(_H53_Obt_Out_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.04);
    rot_transpose(_HCS_Al_17_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H53_Obt_Out_var._position_absolute = coords_add(_HCS_Al_17_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_17_var._position_absolute, _H53_Obt_Out_var._position_absolute);
    _H53_Obt_Out_var._position_relative = rot_apply(_H53_Obt_Out_var._rotation_absolute, tc1);
  } /* H53_Obt_Out=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H53_Obt_Out", _H53_Obt_Out_var._position_absolute, _H53_Obt_Out_var._rotation_absolute);
  instrument->_position_absolute[18] = _H53_Obt_Out_var._position_absolute;
  instrument->_position_relative[18] = _H53_Obt_Out_var._position_relative;
    _H53_Obt_Out_var._position_relative_is_zero =  coords_test_zero(_H53_Obt_Out_var._position_relative);
  instrument->counter_N[18]  = instrument->counter_P[18] = instrument->counter_P2[18] = 0;
  instrument->counter_AbsorbProp[18]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0017_H53_Obt_Out", _H53_Obt_Out_var._position_absolute, _H53_Obt_Out_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "options", "NULL", "x y, slit", "char*");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0017_H53_Obt_Out", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H53_Obt_Out_setpos */

/* component HCS_Al_19=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_19_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_19_setpos] component HCS_Al_19=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_19_var._name, "HCS_Al_19", 16384);
  stracpy(_HCS_Al_19_var._type, "PowderN", 16384);
  _HCS_Al_19_var._index=19;
  int current_setpos_index = 19;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_19_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_19_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_19_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_19_var._parameters.geometry[0]='\0';
  _HCS_Al_19_var._parameters.format[0] = 0;
  _HCS_Al_19_var._parameters.format[1] = 0;
  _HCS_Al_19_var._parameters.format[2] = 0;
  _HCS_Al_19_var._parameters.format[3] = 0;
  _HCS_Al_19_var._parameters.format[4] = 0;
  _HCS_Al_19_var._parameters.format[5] = 0;
  _HCS_Al_19_var._parameters.format[6] = 0;
  _HCS_Al_19_var._parameters.format[7] = 0;
  _HCS_Al_19_var._parameters.format[8] = 0;
  _HCS_Al_19_var._parameters.radius = 0;
  _HCS_Al_19_var._parameters.yheight = 0.12;
  _HCS_Al_19_var._parameters.xwidth = 0.06;
  _HCS_Al_19_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_19_var._parameters.thickness = 0;
  _HCS_Al_19_var._parameters.pack = 1;
  _HCS_Al_19_var._parameters.Vc = 0;
  _HCS_Al_19_var._parameters.sigma_abs = 0;
  _HCS_Al_19_var._parameters.sigma_inc = 0;
  _HCS_Al_19_var._parameters.delta_d_d = 0;
  _HCS_Al_19_var._parameters.p_inc = 0.005;
  _HCS_Al_19_var._parameters.p_transmit = 0.9450;
  _HCS_Al_19_var._parameters.DW = 0;
  _HCS_Al_19_var._parameters.nb_atoms = 1;
  _HCS_Al_19_var._parameters.d_omega = 0;
  _HCS_Al_19_var._parameters.d_phi = 10;
  _HCS_Al_19_var._parameters.tth_sign = 0;
  _HCS_Al_19_var._parameters.p_interact = 0.05;
  _HCS_Al_19_var._parameters.concentric = 0;
  _HCS_Al_19_var._parameters.density = 0;
  _HCS_Al_19_var._parameters.weight = 0;
  _HCS_Al_19_var._parameters.barns = 1;
  _HCS_Al_19_var._parameters.Strain = 0;
  _HCS_Al_19_var._parameters.focus_flip = 0;
  _HCS_Al_19_var._parameters.target_index = 0;
  _HCS_Al_19_var._parameters.order = 1;


  /* component HCS_Al_19=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H53_Obt_Out_var._rotation_absolute, _HCS_Al_19_var._rotation_absolute);
    rot_transpose(_H53_Obt_Out_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_19_var._rotation_absolute, tr1, _HCS_Al_19_var._rotation_relative);
    _HCS_Al_19_var._rotation_is_identity =  rot_test_identity(_HCS_Al_19_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.01);
    rot_transpose(_H53_Obt_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_19_var._position_absolute = coords_add(_H53_Obt_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H53_Obt_Out_var._position_absolute, _HCS_Al_19_var._position_absolute);
    _HCS_Al_19_var._position_relative = rot_apply(_HCS_Al_19_var._rotation_absolute, tc1);
  } /* HCS_Al_19=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_19", _HCS_Al_19_var._position_absolute, _HCS_Al_19_var._rotation_absolute);
  instrument->_position_absolute[19] = _HCS_Al_19_var._position_absolute;
  instrument->_position_relative[19] = _HCS_Al_19_var._position_relative;
    _HCS_Al_19_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_19_var._position_relative);
  instrument->counter_N[19]  = instrument->counter_P[19] = instrument->counter_P2[19] = 0;
  instrument->counter_AbsorbProp[19]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0018_HCS_Al_19", _HCS_Al_19_var._position_absolute, _HCS_Al_19_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0018_HCS_Al_19", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_19_setpos */

/* component H53_VSComC1=Guide_gravity() SETTING, POSITION/ROTATION */
int _H53_VSComC1_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H53_VSComC1_setpos] component H53_VSComC1=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H53_VSComC1_var._name, "H53_VSComC1", 16384);
  stracpy(_H53_VSComC1_var._type, "Guide_gravity", 16384);
  _H53_VSComC1_var._index=20;
  int current_setpos_index = 20;
  _H53_VSComC1_var._parameters.w1 = 0.06;
  _H53_VSComC1_var._parameters.h1 = 0.12;
  _H53_VSComC1_var._parameters.w2 = 0;
  _H53_VSComC1_var._parameters.h2 = 0;
  _H53_VSComC1_var._parameters.l = 7;
  _H53_VSComC1_var._parameters.R0 = gR0;
  _H53_VSComC1_var._parameters.Qc = gQc;
  _H53_VSComC1_var._parameters.alpha = gAlpha;
  _H53_VSComC1_var._parameters.m = 3;
  _H53_VSComC1_var._parameters.W = gW;
  _H53_VSComC1_var._parameters.nslit = 1;
  _H53_VSComC1_var._parameters.d = 0.0005;
  _H53_VSComC1_var._parameters.mleft = -1;
  _H53_VSComC1_var._parameters.mright = -1;
  _H53_VSComC1_var._parameters.mtop = -1;
  _H53_VSComC1_var._parameters.mbottom = -1;
  _H53_VSComC1_var._parameters.nhslit = 1;
  _H53_VSComC1_var._parameters.G = 0;
  _H53_VSComC1_var._parameters.aleft = -1;
  _H53_VSComC1_var._parameters.aright = -1;
  _H53_VSComC1_var._parameters.atop = -1;
  _H53_VSComC1_var._parameters.abottom = -1;
  _H53_VSComC1_var._parameters.wavy = 0;
  _H53_VSComC1_var._parameters.wavy_z = 0;
  _H53_VSComC1_var._parameters.wavy_tb = 0;
  _H53_VSComC1_var._parameters.wavy_lr = 0;
  _H53_VSComC1_var._parameters.chamfers = 0;
  _H53_VSComC1_var._parameters.chamfers_z = 0;
  _H53_VSComC1_var._parameters.chamfers_lr = 0;
  _H53_VSComC1_var._parameters.chamfers_tb = 0;
  _H53_VSComC1_var._parameters.nelements = 7;
  _H53_VSComC1_var._parameters.nu = 0;
  _H53_VSComC1_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H53_VSComC1_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_VSComC1_var._parameters.reflect[0]='\0';


  /* component H53_VSComC1=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H53_Obt_var._rotation_absolute, _H53_VSComC1_var._rotation_absolute);
    rot_transpose(_HCS_Al_19_var._rotation_absolute, tr1);
    rot_mul(_H53_VSComC1_var._rotation_absolute, tr1, _H53_VSComC1_var._rotation_relative);
    _H53_VSComC1_var._rotation_is_identity =  rot_test_identity(_H53_VSComC1_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 3 + 0.075);
    rot_transpose(_H53_Obt_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H53_VSComC1_var._position_absolute = coords_add(_H53_Obt_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_19_var._position_absolute, _H53_VSComC1_var._position_absolute);
    _H53_VSComC1_var._position_relative = rot_apply(_H53_VSComC1_var._rotation_absolute, tc1);
  } /* H53_VSComC1=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H53_VSComC1", _H53_VSComC1_var._position_absolute, _H53_VSComC1_var._rotation_absolute);
  instrument->_position_absolute[20] = _H53_VSComC1_var._position_absolute;
  instrument->_position_relative[20] = _H53_VSComC1_var._position_relative;
    _H53_VSComC1_var._position_relative_is_zero =  coords_test_zero(_H53_VSComC1_var._position_relative);
  instrument->counter_N[20]  = instrument->counter_P[20] = instrument->counter_P2[20] = 0;
  instrument->counter_AbsorbProp[20]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0019_H53_VSComC1", _H53_VSComC1_var._position_absolute, _H53_VSComC1_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "l", "NONE", "7","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "m", "1.0", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "nelements", "1", "7","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0019_H53_VSComC1", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H53_VSComC1_setpos */

/* component HCS_Al_21=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_21_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_21_setpos] component HCS_Al_21=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_21_var._name, "HCS_Al_21", 16384);
  stracpy(_HCS_Al_21_var._type, "PowderN", 16384);
  _HCS_Al_21_var._index=21;
  int current_setpos_index = 21;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_21_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_21_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_21_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_21_var._parameters.geometry[0]='\0';
  _HCS_Al_21_var._parameters.format[0] = 0;
  _HCS_Al_21_var._parameters.format[1] = 0;
  _HCS_Al_21_var._parameters.format[2] = 0;
  _HCS_Al_21_var._parameters.format[3] = 0;
  _HCS_Al_21_var._parameters.format[4] = 0;
  _HCS_Al_21_var._parameters.format[5] = 0;
  _HCS_Al_21_var._parameters.format[6] = 0;
  _HCS_Al_21_var._parameters.format[7] = 0;
  _HCS_Al_21_var._parameters.format[8] = 0;
  _HCS_Al_21_var._parameters.radius = 0;
  _HCS_Al_21_var._parameters.yheight = 0.12;
  _HCS_Al_21_var._parameters.xwidth = 0.06;
  _HCS_Al_21_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_21_var._parameters.thickness = 0;
  _HCS_Al_21_var._parameters.pack = 1;
  _HCS_Al_21_var._parameters.Vc = 0;
  _HCS_Al_21_var._parameters.sigma_abs = 0;
  _HCS_Al_21_var._parameters.sigma_inc = 0;
  _HCS_Al_21_var._parameters.delta_d_d = 0;
  _HCS_Al_21_var._parameters.p_inc = 0.005;
  _HCS_Al_21_var._parameters.p_transmit = 0.9450;
  _HCS_Al_21_var._parameters.DW = 0;
  _HCS_Al_21_var._parameters.nb_atoms = 1;
  _HCS_Al_21_var._parameters.d_omega = 0;
  _HCS_Al_21_var._parameters.d_phi = 10;
  _HCS_Al_21_var._parameters.tth_sign = 0;
  _HCS_Al_21_var._parameters.p_interact = 0.05;
  _HCS_Al_21_var._parameters.concentric = 0;
  _HCS_Al_21_var._parameters.density = 0;
  _HCS_Al_21_var._parameters.weight = 0;
  _HCS_Al_21_var._parameters.barns = 1;
  _HCS_Al_21_var._parameters.Strain = 0;
  _HCS_Al_21_var._parameters.focus_flip = 0;
  _HCS_Al_21_var._parameters.target_index = 0;
  _HCS_Al_21_var._parameters.order = 1;


  /* component HCS_Al_21=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H53_VSComC1_var._rotation_absolute, _HCS_Al_21_var._rotation_absolute);
    rot_transpose(_H53_VSComC1_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_21_var._rotation_absolute, tr1, _HCS_Al_21_var._rotation_relative);
    _HCS_Al_21_var._rotation_is_identity =  rot_test_identity(_HCS_Al_21_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 7 + 0.01);
    rot_transpose(_H53_VSComC1_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_21_var._position_absolute = coords_add(_H53_VSComC1_var._position_absolute, tc2);
    tc1 = coords_sub(_H53_VSComC1_var._position_absolute, _HCS_Al_21_var._position_absolute);
    _HCS_Al_21_var._position_relative = rot_apply(_HCS_Al_21_var._rotation_absolute, tc1);
  } /* HCS_Al_21=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_21", _HCS_Al_21_var._position_absolute, _HCS_Al_21_var._rotation_absolute);
  instrument->_position_absolute[21] = _HCS_Al_21_var._position_absolute;
  instrument->_position_relative[21] = _HCS_Al_21_var._position_relative;
    _HCS_Al_21_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_21_var._position_relative);
  instrument->counter_N[21]  = instrument->counter_P[21] = instrument->counter_P2[21] = 0;
  instrument->counter_AbsorbProp[21]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0020_HCS_Al_21", _HCS_Al_21_var._position_absolute, _HCS_Al_21_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0020_HCS_Al_21", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_21_setpos */

/* component H53_Nose=Guide_tapering() SETTING, POSITION/ROTATION */
int _H53_Nose_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H53_Nose_setpos] component H53_Nose=Guide_tapering() SETTING [Guide_tapering:0]");
  stracpy(_H53_Nose_var._name, "H53_Nose", 16384);
  stracpy(_H53_Nose_var._type, "Guide_tapering", 16384);
  _H53_Nose_var._index=22;
  int current_setpos_index = 22;
  if("parabolical" && strlen("parabolical"))
    stracpy(_H53_Nose_var._parameters.option, "parabolical" ? "parabolical" : "", 16384);
  else 
  _H53_Nose_var._parameters.option[0]='\0';
  _H53_Nose_var._parameters.w1 = 0.06;
  _H53_Nose_var._parameters.h1 = 0.12;
  _H53_Nose_var._parameters.l = 2.0;
  _H53_Nose_var._parameters.linw = 0.0;
  _H53_Nose_var._parameters.loutw = 0.7;
  _H53_Nose_var._parameters.linh = 0.0;
  _H53_Nose_var._parameters.louth = 0.0;
  _H53_Nose_var._parameters.R0 = gR0;
  _H53_Nose_var._parameters.Qcx = gQc;
  _H53_Nose_var._parameters.Qcy = gQc;
  _H53_Nose_var._parameters.alphax = gAlpha;
  _H53_Nose_var._parameters.alphay = gAlpha;
  _H53_Nose_var._parameters.W = gW;
  _H53_Nose_var._parameters.mx = 3;
  _H53_Nose_var._parameters.my = 3;
  _H53_Nose_var._parameters.segno = 20;
  _H53_Nose_var._parameters.curvature = 0;
  _H53_Nose_var._parameters.curvature_v = 0;


  /* component H53_Nose=Guide_tapering() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_21_var._rotation_absolute, _H53_Nose_var._rotation_absolute);
    rot_transpose(_HCS_Al_21_var._rotation_absolute, tr1);
    rot_mul(_H53_Nose_var._rotation_absolute, tr1, _H53_Nose_var._rotation_relative);
    _H53_Nose_var._rotation_is_identity =  rot_test_identity(_H53_Nose_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.01);
    rot_transpose(_HCS_Al_21_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H53_Nose_var._position_absolute = coords_add(_HCS_Al_21_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_21_var._position_absolute, _H53_Nose_var._position_absolute);
    _H53_Nose_var._position_relative = rot_apply(_H53_Nose_var._rotation_absolute, tc1);
  } /* H53_Nose=Guide_tapering() AT ROTATED */
  DEBUG_COMPONENT("H53_Nose", _H53_Nose_var._position_absolute, _H53_Nose_var._rotation_absolute);
  instrument->_position_absolute[22] = _H53_Nose_var._position_absolute;
  instrument->_position_relative[22] = _H53_Nose_var._position_relative;
    _H53_Nose_var._position_relative_is_zero =  coords_test_zero(_H53_Nose_var._position_relative);
  instrument->counter_N[22]  = instrument->counter_P[22] = instrument->counter_P2[22] = 0;
  instrument->counter_AbsorbProp[22]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0021_H53_Nose", _H53_Nose_var._position_absolute, _H53_Nose_var._rotation_absolute, "Guide_tapering");
        mccomp_param_nexus(nxhandle,"0021_H53_Nose", "option", 0, "parabolical", "char*");
        mccomp_param_nexus(nxhandle,"0021_H53_Nose", "w1", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0021_H53_Nose", "h1", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0021_H53_Nose", "l", "NONE", "2.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0021_H53_Nose", "linw", "0", "0.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0021_H53_Nose", "loutw", "0", "0.7","MCNUM");
        mccomp_param_nexus(nxhandle,"0021_H53_Nose", "linh", "0", "0.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0021_H53_Nose", "louth", "0", "0.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0021_H53_Nose", "R0", "0.99", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0021_H53_Nose", "Qcx", "0.021", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0021_H53_Nose", "Qcy", "0.021", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0021_H53_Nose", "alphax", "6.07", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0021_H53_Nose", "alphay", "6.07", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0021_H53_Nose", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0021_H53_Nose", "mx", "1", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0021_H53_Nose", "my", "1", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0021_H53_Nose", "segno", "800", "20","MCNUM");
        mccomp_param_nexus(nxhandle,"0021_H53_Nose", "curvature", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0021_H53_Nose", "curvature_v", "0", "0","MCNUM");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H53_Nose_setpos */

/* component HCS_Al_23=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_23_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_23_setpos] component HCS_Al_23=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_23_var._name, "HCS_Al_23", 16384);
  stracpy(_HCS_Al_23_var._type, "PowderN", 16384);
  _HCS_Al_23_var._index=23;
  int current_setpos_index = 23;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_23_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_23_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_23_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_23_var._parameters.geometry[0]='\0';
  _HCS_Al_23_var._parameters.format[0] = 0;
  _HCS_Al_23_var._parameters.format[1] = 0;
  _HCS_Al_23_var._parameters.format[2] = 0;
  _HCS_Al_23_var._parameters.format[3] = 0;
  _HCS_Al_23_var._parameters.format[4] = 0;
  _HCS_Al_23_var._parameters.format[5] = 0;
  _HCS_Al_23_var._parameters.format[6] = 0;
  _HCS_Al_23_var._parameters.format[7] = 0;
  _HCS_Al_23_var._parameters.format[8] = 0;
  _HCS_Al_23_var._parameters.radius = 0;
  _HCS_Al_23_var._parameters.yheight = 0.12;
  _HCS_Al_23_var._parameters.xwidth = 0.04;
  _HCS_Al_23_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_23_var._parameters.thickness = 0;
  _HCS_Al_23_var._parameters.pack = 1;
  _HCS_Al_23_var._parameters.Vc = 0;
  _HCS_Al_23_var._parameters.sigma_abs = 0;
  _HCS_Al_23_var._parameters.sigma_inc = 0;
  _HCS_Al_23_var._parameters.delta_d_d = 0;
  _HCS_Al_23_var._parameters.p_inc = 0.005;
  _HCS_Al_23_var._parameters.p_transmit = 0.9450;
  _HCS_Al_23_var._parameters.DW = 0;
  _HCS_Al_23_var._parameters.nb_atoms = 1;
  _HCS_Al_23_var._parameters.d_omega = 0;
  _HCS_Al_23_var._parameters.d_phi = 10;
  _HCS_Al_23_var._parameters.tth_sign = 0;
  _HCS_Al_23_var._parameters.p_interact = 0.05;
  _HCS_Al_23_var._parameters.concentric = 0;
  _HCS_Al_23_var._parameters.density = 0;
  _HCS_Al_23_var._parameters.weight = 0;
  _HCS_Al_23_var._parameters.barns = 1;
  _HCS_Al_23_var._parameters.Strain = 0;
  _HCS_Al_23_var._parameters.focus_flip = 0;
  _HCS_Al_23_var._parameters.target_index = 0;
  _HCS_Al_23_var._parameters.order = 1;


  /* component HCS_Al_23=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H53_Nose_var._rotation_absolute, _HCS_Al_23_var._rotation_absolute);
    rot_transpose(_H53_Nose_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_23_var._rotation_absolute, tr1, _HCS_Al_23_var._rotation_relative);
    _HCS_Al_23_var._rotation_is_identity =  rot_test_identity(_HCS_Al_23_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 2 + 0.01);
    rot_transpose(_H53_Nose_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_23_var._position_absolute = coords_add(_H53_Nose_var._position_absolute, tc2);
    tc1 = coords_sub(_H53_Nose_var._position_absolute, _HCS_Al_23_var._position_absolute);
    _HCS_Al_23_var._position_relative = rot_apply(_HCS_Al_23_var._rotation_absolute, tc1);
  } /* HCS_Al_23=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_23", _HCS_Al_23_var._position_absolute, _HCS_Al_23_var._rotation_absolute);
  instrument->_position_absolute[23] = _HCS_Al_23_var._position_absolute;
  instrument->_position_relative[23] = _HCS_Al_23_var._position_relative;
    _HCS_Al_23_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_23_var._position_relative);
  instrument->counter_N[23]  = instrument->counter_P[23] = instrument->counter_P2[23] = 0;
  instrument->counter_AbsorbProp[23]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0022_HCS_Al_23", _HCS_Al_23_var._position_absolute, _HCS_Al_23_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "xwidth", "0", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0022_HCS_Al_23", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_23_setpos */

/* component H53_ThALES_Monochromator_Cradle=Monitor_nD() SETTING, POSITION/ROTATION */
int _H53_ThALES_Monochromator_Cradle_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H53_ThALES_Monochromator_Cradle_setpos] component H53_ThALES_Monochromator_Cradle=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H53_ThALES_Monochromator_Cradle_var._name, "H53_ThALES_Monochromator_Cradle", 16384);
  stracpy(_H53_ThALES_Monochromator_Cradle_var._type, "Monitor_nD", 16384);
  _H53_ThALES_Monochromator_Cradle_var._index=24;
  int current_setpos_index = 24;
  if("" && strlen(""))
    stracpy(_H53_ThALES_Monochromator_Cradle_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H53_ThALES_Monochromator_Cradle_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H53_ThALES_Monochromator_Cradle_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H53_ThALES_Monochromator_Cradle_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H53_ThALES_Monochromator_Cradle_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H53_ThALES_Monochromator_Cradle_var._parameters.user3[0]='\0';
  _H53_ThALES_Monochromator_Cradle_var._parameters.xwidth = 0.17;
  _H53_ThALES_Monochromator_Cradle_var._parameters.yheight = 0.12;
  _H53_ThALES_Monochromator_Cradle_var._parameters.zdepth = 0;
  _H53_ThALES_Monochromator_Cradle_var._parameters.xmin = 0;
  _H53_ThALES_Monochromator_Cradle_var._parameters.xmax = 0;
  _H53_ThALES_Monochromator_Cradle_var._parameters.ymin = 0;
  _H53_ThALES_Monochromator_Cradle_var._parameters.ymax = 0;
  _H53_ThALES_Monochromator_Cradle_var._parameters.zmin = 0;
  _H53_ThALES_Monochromator_Cradle_var._parameters.zmax = 0;
  _H53_ThALES_Monochromator_Cradle_var._parameters.bins = 50;
  _H53_ThALES_Monochromator_Cradle_var._parameters.min = -1e40;
  _H53_ThALES_Monochromator_Cradle_var._parameters.max = 1e40;
  _H53_ThALES_Monochromator_Cradle_var._parameters.restore_neutron = 1;
  _H53_ThALES_Monochromator_Cradle_var._parameters.radius = 0;
  if("x y" && strlen("x y"))
    stracpy(_H53_ThALES_Monochromator_Cradle_var._parameters.options, "x y" ? "x y" : "", 16384);
  else 
  _H53_ThALES_Monochromator_Cradle_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Monochromator_Cradle_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Monochromator_Cradle_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Monochromator_Cradle_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Monochromator_Cradle_var._parameters.geometry[0]='\0';
  _H53_ThALES_Monochromator_Cradle_var._parameters.nowritefile = 0;
  _H53_ThALES_Monochromator_Cradle_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Monochromator_Cradle_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Monochromator_Cradle_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Monochromator_Cradle_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Monochromator_Cradle_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Monochromator_Cradle_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Monochromator_Cradle_var._parameters.username3[0]='\0';


  /* component H53_ThALES_Monochromator_Cradle=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H53_Nose_var._rotation_absolute, _H53_ThALES_Monochromator_Cradle_var._rotation_absolute);
    rot_transpose(_HCS_Al_23_var._rotation_absolute, tr1);
    rot_mul(_H53_ThALES_Monochromator_Cradle_var._rotation_absolute, tr1, _H53_ThALES_Monochromator_Cradle_var._rotation_relative);
    _H53_ThALES_Monochromator_Cradle_var._rotation_is_identity =  rot_test_identity(_H53_ThALES_Monochromator_Cradle_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 2 + 2.3);
    rot_transpose(_H53_Nose_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H53_ThALES_Monochromator_Cradle_var._position_absolute = coords_add(_H53_Nose_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_23_var._position_absolute, _H53_ThALES_Monochromator_Cradle_var._position_absolute);
    _H53_ThALES_Monochromator_Cradle_var._position_relative = rot_apply(_H53_ThALES_Monochromator_Cradle_var._rotation_absolute, tc1);
  } /* H53_ThALES_Monochromator_Cradle=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H53_ThALES_Monochromator_Cradle", _H53_ThALES_Monochromator_Cradle_var._position_absolute, _H53_ThALES_Monochromator_Cradle_var._rotation_absolute);
  instrument->_position_absolute[24] = _H53_ThALES_Monochromator_Cradle_var._position_absolute;
  instrument->_position_relative[24] = _H53_ThALES_Monochromator_Cradle_var._position_relative;
    _H53_ThALES_Monochromator_Cradle_var._position_relative_is_zero =  coords_test_zero(_H53_ThALES_Monochromator_Cradle_var._position_relative);
  instrument->counter_N[24]  = instrument->counter_P[24] = instrument->counter_P2[24] = 0;
  instrument->counter_AbsorbProp[24]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", _H53_ThALES_Monochromator_Cradle_var._position_absolute, _H53_ThALES_Monochromator_Cradle_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "xwidth", "0", "0.17","MCNUM");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "options", "NULL", "x y", "char*");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0023_H53_ThALES_Monochromator_Cradle", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H53_ThALES_Monochromator_Cradle_setpos */

/* component H53_ThALES_Monochromator=Monochromator_curved() SETTING, POSITION/ROTATION */
int _H53_ThALES_Monochromator_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H53_ThALES_Monochromator_setpos] component H53_ThALES_Monochromator=Monochromator_curved() SETTING [Monochromator_curved:0]");
  stracpy(_H53_ThALES_Monochromator_var._name, "H53_ThALES_Monochromator", 16384);
  stracpy(_H53_ThALES_Monochromator_var._type, "Monochromator_curved", 16384);
  _H53_ThALES_Monochromator_var._index=25;
  int current_setpos_index = 25;
  if("HOPG.rfl" && strlen("HOPG.rfl"))
    stracpy(_H53_ThALES_Monochromator_var._parameters.reflect, "HOPG.rfl" ? "HOPG.rfl" : "", 16384);
  else 
  _H53_ThALES_Monochromator_var._parameters.reflect[0]='\0';
  if("HOPG.trm" && strlen("HOPG.trm"))
    stracpy(_H53_ThALES_Monochromator_var._parameters.transmit, "HOPG.trm" ? "HOPG.trm" : "", 16384);
  else 
  _H53_ThALES_Monochromator_var._parameters.transmit[0]='\0';
  _H53_ThALES_Monochromator_var._parameters.zwidth = 0.01;
  _H53_ThALES_Monochromator_var._parameters.yheight = 0.01;
  _H53_ThALES_Monochromator_var._parameters.gap = 0.0005;
  _H53_ThALES_Monochromator_var._parameters.NH = 7;
  _H53_ThALES_Monochromator_var._parameters.NV = 7;
  _H53_ThALES_Monochromator_var._parameters.mosaich = 30;
  _H53_ThALES_Monochromator_var._parameters.mosaicv = 30;
  _H53_ThALES_Monochromator_var._parameters.r0 = 1;
  _H53_ThALES_Monochromator_var._parameters.t0 = 1.0;
  _H53_ThALES_Monochromator_var._parameters.Q = 1.8734;
  _H53_ThALES_Monochromator_var._parameters.RV = _instrument_var._parameters.ThALES_RMV;
  _H53_ThALES_Monochromator_var._parameters.RH = _instrument_var._parameters.ThALES_RMH;
  _H53_ThALES_Monochromator_var._parameters.DM = ThALES_DM;
  _H53_ThALES_Monochromator_var._parameters.mosaic = 0;
  _H53_ThALES_Monochromator_var._parameters.width = 0.15;
  _H53_ThALES_Monochromator_var._parameters.height = 0.12;
  _H53_ThALES_Monochromator_var._parameters.verbose = 0;
  _H53_ThALES_Monochromator_var._parameters.order = 0;


  /* component H53_ThALES_Monochromator=Monochromator_curved() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (ThALES_A1)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H53_ThALES_Monochromator_Cradle_var._rotation_absolute, _H53_ThALES_Monochromator_var._rotation_absolute);
    rot_transpose(_H53_ThALES_Monochromator_Cradle_var._rotation_absolute, tr1);
    rot_mul(_H53_ThALES_Monochromator_var._rotation_absolute, tr1, _H53_ThALES_Monochromator_var._rotation_relative);
    _H53_ThALES_Monochromator_var._rotation_is_identity =  rot_test_identity(_H53_ThALES_Monochromator_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H53_ThALES_Monochromator_Cradle_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H53_ThALES_Monochromator_var._position_absolute = coords_add(_H53_ThALES_Monochromator_Cradle_var._position_absolute, tc2);
    tc1 = coords_sub(_H53_ThALES_Monochromator_Cradle_var._position_absolute, _H53_ThALES_Monochromator_var._position_absolute);
    _H53_ThALES_Monochromator_var._position_relative = rot_apply(_H53_ThALES_Monochromator_var._rotation_absolute, tc1);
  } /* H53_ThALES_Monochromator=Monochromator_curved() AT ROTATED */
  DEBUG_COMPONENT("H53_ThALES_Monochromator", _H53_ThALES_Monochromator_var._position_absolute, _H53_ThALES_Monochromator_var._rotation_absolute);
  instrument->_position_absolute[25] = _H53_ThALES_Monochromator_var._position_absolute;
  instrument->_position_relative[25] = _H53_ThALES_Monochromator_var._position_relative;
    _H53_ThALES_Monochromator_var._position_relative_is_zero =  coords_test_zero(_H53_ThALES_Monochromator_var._position_relative);
  instrument->counter_N[25]  = instrument->counter_P[25] = instrument->counter_P2[25] = 0;
  instrument->counter_AbsorbProp[25]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0024_H53_ThALES_Monochromator", _H53_ThALES_Monochromator_var._position_absolute, _H53_ThALES_Monochromator_var._rotation_absolute, "Monochromator_curved");
        mccomp_param_nexus(nxhandle,"0024_H53_ThALES_Monochromator", "reflect", "NULL", "HOPG.rfl", "char*");
        mccomp_param_nexus(nxhandle,"0024_H53_ThALES_Monochromator", "transmit", "NULL", "HOPG.trm", "char*");
        mccomp_param_nexus(nxhandle,"0024_H53_ThALES_Monochromator", "zwidth", "0.01", "0.01","MCNUM");
        mccomp_param_nexus(nxhandle,"0024_H53_ThALES_Monochromator", "yheight", "0.01", "0.01","MCNUM");
        mccomp_param_nexus(nxhandle,"0024_H53_ThALES_Monochromator", "gap", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0024_H53_ThALES_Monochromator", "NH", "11", "7","int");
        mccomp_param_nexus(nxhandle,"0024_H53_ThALES_Monochromator", "NV", "11", "7","int");
        mccomp_param_nexus(nxhandle,"0024_H53_ThALES_Monochromator", "mosaich", "30.0", "30","MCNUM");
        mccomp_param_nexus(nxhandle,"0024_H53_ThALES_Monochromator", "mosaicv", "30.0", "30","MCNUM");
        mccomp_param_nexus(nxhandle,"0024_H53_ThALES_Monochromator", "r0", "0.7", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0024_H53_ThALES_Monochromator", "t0", "1.0", "1.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0024_H53_ThALES_Monochromator", "Q", "1.8734", "1.8734","MCNUM");
        mccomp_param_nexus(nxhandle,"0024_H53_ThALES_Monochromator", "RV", "0", "_instrument_var._parameters.ThALES_RMV","MCNUM");
        mccomp_param_nexus(nxhandle,"0024_H53_ThALES_Monochromator", "RH", "0", "_instrument_var._parameters.ThALES_RMH","MCNUM");
        mccomp_param_nexus(nxhandle,"0024_H53_ThALES_Monochromator", "DM", "0", "ThALES_DM","MCNUM");
        mccomp_param_nexus(nxhandle,"0024_H53_ThALES_Monochromator", "mosaic", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0024_H53_ThALES_Monochromator", "width", "0", "0.15","MCNUM");
        mccomp_param_nexus(nxhandle,"0024_H53_ThALES_Monochromator", "height", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0024_H53_ThALES_Monochromator", "verbose", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0024_H53_ThALES_Monochromator", "order", "0", "0","MCNUM");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H53_ThALES_Monochromator_setpos */

/* component H53_ThALES_Monochromator_Jumper=Arm() SETTING, POSITION/ROTATION */
int _H53_ThALES_Monochromator_Jumper_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H53_ThALES_Monochromator_Jumper_setpos] component H53_ThALES_Monochromator_Jumper=Arm() SETTING [Arm:0]");
  stracpy(_H53_ThALES_Monochromator_Jumper_var._name, "H53_ThALES_Monochromator_Jumper", 16384);
  stracpy(_H53_ThALES_Monochromator_Jumper_var._type, "Arm", 16384);
  _H53_ThALES_Monochromator_Jumper_var._index=26;
  int current_setpos_index = 26;
  /* component H53_ThALES_Monochromator_Jumper=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H53_ThALES_Monochromator_Cradle_var._rotation_absolute, _H53_ThALES_Monochromator_Jumper_var._rotation_absolute);
    rot_transpose(_H53_ThALES_Monochromator_var._rotation_absolute, tr1);
    rot_mul(_H53_ThALES_Monochromator_Jumper_var._rotation_absolute, tr1, _H53_ThALES_Monochromator_Jumper_var._rotation_relative);
    _H53_ThALES_Monochromator_Jumper_var._rotation_is_identity =  rot_test_identity(_H53_ThALES_Monochromator_Jumper_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H53_ThALES_Monochromator_Cradle_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H53_ThALES_Monochromator_Jumper_var._position_absolute = coords_add(_H53_ThALES_Monochromator_Cradle_var._position_absolute, tc2);
    tc1 = coords_sub(_H53_ThALES_Monochromator_var._position_absolute, _H53_ThALES_Monochromator_Jumper_var._position_absolute);
    _H53_ThALES_Monochromator_Jumper_var._position_relative = rot_apply(_H53_ThALES_Monochromator_Jumper_var._rotation_absolute, tc1);
  } /* H53_ThALES_Monochromator_Jumper=Arm() AT ROTATED */
  DEBUG_COMPONENT("H53_ThALES_Monochromator_Jumper", _H53_ThALES_Monochromator_Jumper_var._position_absolute, _H53_ThALES_Monochromator_Jumper_var._rotation_absolute);
  instrument->_position_absolute[26] = _H53_ThALES_Monochromator_Jumper_var._position_absolute;
  instrument->_position_relative[26] = _H53_ThALES_Monochromator_Jumper_var._position_relative;
    _H53_ThALES_Monochromator_Jumper_var._position_relative_is_zero =  coords_test_zero(_H53_ThALES_Monochromator_Jumper_var._position_relative);
  instrument->counter_N[26]  = instrument->counter_P[26] = instrument->counter_P2[26] = 0;
  instrument->counter_AbsorbProp[26]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0025_H53_ThALES_Monochromator_Jumper", _H53_ThALES_Monochromator_Jumper_var._position_absolute, _H53_ThALES_Monochromator_Jumper_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H53_ThALES_Monochromator_Jumper_setpos */

/* component H53_ThALES_Monochromator_Out=Arm() SETTING, POSITION/ROTATION */
int _H53_ThALES_Monochromator_Out_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H53_ThALES_Monochromator_Out_setpos] component H53_ThALES_Monochromator_Out=Arm() SETTING [Arm:0]");
  stracpy(_H53_ThALES_Monochromator_Out_var._name, "H53_ThALES_Monochromator_Out", 16384);
  stracpy(_H53_ThALES_Monochromator_Out_var._type, "Arm", 16384);
  _H53_ThALES_Monochromator_Out_var._index=27;
  int current_setpos_index = 27;
  /* component H53_ThALES_Monochromator_Out=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (2 * ThALES_A1)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H53_ThALES_Monochromator_Cradle_var._rotation_absolute, _H53_ThALES_Monochromator_Out_var._rotation_absolute);
    rot_transpose(_H53_ThALES_Monochromator_Jumper_var._rotation_absolute, tr1);
    rot_mul(_H53_ThALES_Monochromator_Out_var._rotation_absolute, tr1, _H53_ThALES_Monochromator_Out_var._rotation_relative);
    _H53_ThALES_Monochromator_Out_var._rotation_is_identity =  rot_test_identity(_H53_ThALES_Monochromator_Out_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H53_ThALES_Monochromator_Cradle_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H53_ThALES_Monochromator_Out_var._position_absolute = coords_add(_H53_ThALES_Monochromator_Cradle_var._position_absolute, tc2);
    tc1 = coords_sub(_H53_ThALES_Monochromator_Jumper_var._position_absolute, _H53_ThALES_Monochromator_Out_var._position_absolute);
    _H53_ThALES_Monochromator_Out_var._position_relative = rot_apply(_H53_ThALES_Monochromator_Out_var._rotation_absolute, tc1);
  } /* H53_ThALES_Monochromator_Out=Arm() AT ROTATED */
  DEBUG_COMPONENT("H53_ThALES_Monochromator_Out", _H53_ThALES_Monochromator_Out_var._position_absolute, _H53_ThALES_Monochromator_Out_var._rotation_absolute);
  instrument->_position_absolute[27] = _H53_ThALES_Monochromator_Out_var._position_absolute;
  instrument->_position_relative[27] = _H53_ThALES_Monochromator_Out_var._position_relative;
    _H53_ThALES_Monochromator_Out_var._position_relative_is_zero =  coords_test_zero(_H53_ThALES_Monochromator_Out_var._position_relative);
  instrument->counter_N[27]  = instrument->counter_P[27] = instrument->counter_P2[27] = 0;
  instrument->counter_AbsorbProp[27]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0026_H53_ThALES_Monochromator_Out", _H53_ThALES_Monochromator_Out_var._position_absolute, _H53_ThALES_Monochromator_Out_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H53_ThALES_Monochromator_Out_setpos */

/* component H53_ThALES_Sample_Div=Monitor_nD() SETTING, POSITION/ROTATION */
int _H53_ThALES_Sample_Div_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H53_ThALES_Sample_Div_setpos] component H53_ThALES_Sample_Div=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H53_ThALES_Sample_Div_var._name, "H53_ThALES_Sample_Div", 16384);
  stracpy(_H53_ThALES_Sample_Div_var._type, "Monitor_nD", 16384);
  _H53_ThALES_Sample_Div_var._index=28;
  int current_setpos_index = 28;
  if("" && strlen(""))
    stracpy(_H53_ThALES_Sample_Div_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H53_ThALES_Sample_Div_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H53_ThALES_Sample_Div_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H53_ThALES_Sample_Div_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H53_ThALES_Sample_Div_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H53_ThALES_Sample_Div_var._parameters.user3[0]='\0';
  _H53_ThALES_Sample_Div_var._parameters.xwidth = 0.05;
  _H53_ThALES_Sample_Div_var._parameters.yheight = 0.05;
  _H53_ThALES_Sample_Div_var._parameters.zdepth = 0;
  _H53_ThALES_Sample_Div_var._parameters.xmin = 0;
  _H53_ThALES_Sample_Div_var._parameters.xmax = 0;
  _H53_ThALES_Sample_Div_var._parameters.ymin = 0;
  _H53_ThALES_Sample_Div_var._parameters.ymax = 0;
  _H53_ThALES_Sample_Div_var._parameters.zmin = 0;
  _H53_ThALES_Sample_Div_var._parameters.zmax = 0;
  _H53_ThALES_Sample_Div_var._parameters.bins = 50;
  _H53_ThALES_Sample_Div_var._parameters.min = -1e40;
  _H53_ThALES_Sample_Div_var._parameters.max = 1e40;
  _H53_ThALES_Sample_Div_var._parameters.restore_neutron = 1;
  _H53_ThALES_Sample_Div_var._parameters.radius = 0;
  if("dx limits=[-2 2], dy limits=[-2 2]" && strlen("dx limits=[-2 2], dy limits=[-2 2]"))
    stracpy(_H53_ThALES_Sample_Div_var._parameters.options, "dx limits=[-2 2], dy limits=[-2 2]" ? "dx limits=[-2 2], dy limits=[-2 2]" : "", 16384);
  else 
  _H53_ThALES_Sample_Div_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Sample_Div_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Sample_Div_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Sample_Div_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Sample_Div_var._parameters.geometry[0]='\0';
  _H53_ThALES_Sample_Div_var._parameters.nowritefile = 0;
  _H53_ThALES_Sample_Div_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Sample_Div_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Sample_Div_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Sample_Div_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Sample_Div_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Sample_Div_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Sample_Div_var._parameters.username3[0]='\0';


  /* component H53_ThALES_Sample_Div=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H53_ThALES_Monochromator_Out_var._rotation_absolute, _H53_ThALES_Sample_Div_var._rotation_absolute);
    rot_transpose(_H53_ThALES_Monochromator_Jumper_var._rotation_absolute, tr1);
    rot_mul(_H53_ThALES_Sample_Div_var._rotation_absolute, tr1, _H53_ThALES_Sample_Div_var._rotation_relative);
    _H53_ThALES_Sample_Div_var._rotation_is_identity =  rot_test_identity(_H53_ThALES_Sample_Div_var._rotation_relative);
    tc1 = coords_set(
      0, 0, ThALES_L);
    rot_transpose(_H53_ThALES_Monochromator_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H53_ThALES_Sample_Div_var._position_absolute = coords_add(_H53_ThALES_Monochromator_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H53_ThALES_Monochromator_Jumper_var._position_absolute, _H53_ThALES_Sample_Div_var._position_absolute);
    _H53_ThALES_Sample_Div_var._position_relative = rot_apply(_H53_ThALES_Sample_Div_var._rotation_absolute, tc1);
  } /* H53_ThALES_Sample_Div=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H53_ThALES_Sample_Div", _H53_ThALES_Sample_Div_var._position_absolute, _H53_ThALES_Sample_Div_var._rotation_absolute);
  instrument->_position_absolute[28] = _H53_ThALES_Sample_Div_var._position_absolute;
  instrument->_position_relative[28] = _H53_ThALES_Sample_Div_var._position_relative;
    _H53_ThALES_Sample_Div_var._position_relative_is_zero =  coords_test_zero(_H53_ThALES_Sample_Div_var._position_relative);
  instrument->counter_N[28]  = instrument->counter_P[28] = instrument->counter_P2[28] = 0;
  instrument->counter_AbsorbProp[28]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", _H53_ThALES_Sample_Div_var._position_absolute, _H53_ThALES_Sample_Div_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "xwidth", "0", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "yheight", "0", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "options", "NULL", "dx limits=[-2 2], dy limits=[-2 2]", "char*");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0027_H53_ThALES_Sample_Div", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H53_ThALES_Sample_Div_setpos */

/* component H53_ThALES_Sample_XY=Monitor_nD() SETTING, POSITION/ROTATION */
int _H53_ThALES_Sample_XY_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H53_ThALES_Sample_XY_setpos] component H53_ThALES_Sample_XY=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H53_ThALES_Sample_XY_var._name, "H53_ThALES_Sample_XY", 16384);
  stracpy(_H53_ThALES_Sample_XY_var._type, "Monitor_nD", 16384);
  _H53_ThALES_Sample_XY_var._index=29;
  int current_setpos_index = 29;
  if("" && strlen(""))
    stracpy(_H53_ThALES_Sample_XY_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H53_ThALES_Sample_XY_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H53_ThALES_Sample_XY_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H53_ThALES_Sample_XY_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H53_ThALES_Sample_XY_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H53_ThALES_Sample_XY_var._parameters.user3[0]='\0';
  _H53_ThALES_Sample_XY_var._parameters.xwidth = 0.10;
  _H53_ThALES_Sample_XY_var._parameters.yheight = 0.10;
  _H53_ThALES_Sample_XY_var._parameters.zdepth = 0;
  _H53_ThALES_Sample_XY_var._parameters.xmin = 0;
  _H53_ThALES_Sample_XY_var._parameters.xmax = 0;
  _H53_ThALES_Sample_XY_var._parameters.ymin = 0;
  _H53_ThALES_Sample_XY_var._parameters.ymax = 0;
  _H53_ThALES_Sample_XY_var._parameters.zmin = 0;
  _H53_ThALES_Sample_XY_var._parameters.zmax = 0;
  _H53_ThALES_Sample_XY_var._parameters.bins = 50;
  _H53_ThALES_Sample_XY_var._parameters.min = -1e40;
  _H53_ThALES_Sample_XY_var._parameters.max = 1e40;
  _H53_ThALES_Sample_XY_var._parameters.restore_neutron = 1;
  _H53_ThALES_Sample_XY_var._parameters.radius = 0;
  if("x y" && strlen("x y"))
    stracpy(_H53_ThALES_Sample_XY_var._parameters.options, "x y" ? "x y" : "", 16384);
  else 
  _H53_ThALES_Sample_XY_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Sample_XY_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Sample_XY_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Sample_XY_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Sample_XY_var._parameters.geometry[0]='\0';
  _H53_ThALES_Sample_XY_var._parameters.nowritefile = 0;
  _H53_ThALES_Sample_XY_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Sample_XY_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Sample_XY_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Sample_XY_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Sample_XY_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Sample_XY_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Sample_XY_var._parameters.username3[0]='\0';


  /* component H53_ThALES_Sample_XY=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H53_ThALES_Monochromator_Out_var._rotation_absolute, _H53_ThALES_Sample_XY_var._rotation_absolute);
    rot_transpose(_H53_ThALES_Sample_Div_var._rotation_absolute, tr1);
    rot_mul(_H53_ThALES_Sample_XY_var._rotation_absolute, tr1, _H53_ThALES_Sample_XY_var._rotation_relative);
    _H53_ThALES_Sample_XY_var._rotation_is_identity =  rot_test_identity(_H53_ThALES_Sample_XY_var._rotation_relative);
    tc1 = coords_set(
      0, 0, ThALES_L);
    rot_transpose(_H53_ThALES_Monochromator_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H53_ThALES_Sample_XY_var._position_absolute = coords_add(_H53_ThALES_Monochromator_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H53_ThALES_Sample_Div_var._position_absolute, _H53_ThALES_Sample_XY_var._position_absolute);
    _H53_ThALES_Sample_XY_var._position_relative = rot_apply(_H53_ThALES_Sample_XY_var._rotation_absolute, tc1);
  } /* H53_ThALES_Sample_XY=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H53_ThALES_Sample_XY", _H53_ThALES_Sample_XY_var._position_absolute, _H53_ThALES_Sample_XY_var._rotation_absolute);
  instrument->_position_absolute[29] = _H53_ThALES_Sample_XY_var._position_absolute;
  instrument->_position_relative[29] = _H53_ThALES_Sample_XY_var._position_relative;
    _H53_ThALES_Sample_XY_var._position_relative_is_zero =  coords_test_zero(_H53_ThALES_Sample_XY_var._position_relative);
  instrument->counter_N[29]  = instrument->counter_P[29] = instrument->counter_P2[29] = 0;
  instrument->counter_AbsorbProp[29]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", _H53_ThALES_Sample_XY_var._position_absolute, _H53_ThALES_Sample_XY_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "xwidth", "0", "0.10","MCNUM");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "yheight", "0", "0.10","MCNUM");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "options", "NULL", "x y", "char*");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0028_H53_ThALES_Sample_XY", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H53_ThALES_Sample_XY_setpos */

/* component H53_ThALES_Sample_L=Monitor_nD() SETTING, POSITION/ROTATION */
int _H53_ThALES_Sample_L_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H53_ThALES_Sample_L_setpos] component H53_ThALES_Sample_L=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H53_ThALES_Sample_L_var._name, "H53_ThALES_Sample_L", 16384);
  stracpy(_H53_ThALES_Sample_L_var._type, "Monitor_nD", 16384);
  _H53_ThALES_Sample_L_var._index=30;
  int current_setpos_index = 30;
  if("" && strlen(""))
    stracpy(_H53_ThALES_Sample_L_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H53_ThALES_Sample_L_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H53_ThALES_Sample_L_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H53_ThALES_Sample_L_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H53_ThALES_Sample_L_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H53_ThALES_Sample_L_var._parameters.user3[0]='\0';
  _H53_ThALES_Sample_L_var._parameters.xwidth = 0.10;
  _H53_ThALES_Sample_L_var._parameters.yheight = 0.10;
  _H53_ThALES_Sample_L_var._parameters.zdepth = 0;
  _H53_ThALES_Sample_L_var._parameters.xmin = 0;
  _H53_ThALES_Sample_L_var._parameters.xmax = 0;
  _H53_ThALES_Sample_L_var._parameters.ymin = 0;
  _H53_ThALES_Sample_L_var._parameters.ymax = 0;
  _H53_ThALES_Sample_L_var._parameters.zmin = 0;
  _H53_ThALES_Sample_L_var._parameters.zmax = 0;
  _H53_ThALES_Sample_L_var._parameters.bins = 50;
  _H53_ThALES_Sample_L_var._parameters.min = -1e40;
  _H53_ThALES_Sample_L_var._parameters.max = 1e40;
  _H53_ThALES_Sample_L_var._parameters.restore_neutron = 1;
  _H53_ThALES_Sample_L_var._parameters.radius = 0;
  if("lambda limits=[1 10]" && strlen("lambda limits=[1 10]"))
    stracpy(_H53_ThALES_Sample_L_var._parameters.options, "lambda limits=[1 10]" ? "lambda limits=[1 10]" : "", 16384);
  else 
  _H53_ThALES_Sample_L_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Sample_L_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Sample_L_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Sample_L_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Sample_L_var._parameters.geometry[0]='\0';
  _H53_ThALES_Sample_L_var._parameters.nowritefile = 0;
  _H53_ThALES_Sample_L_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Sample_L_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Sample_L_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Sample_L_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Sample_L_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Sample_L_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Sample_L_var._parameters.username3[0]='\0';


  /* component H53_ThALES_Sample_L=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H53_ThALES_Monochromator_Out_var._rotation_absolute, _H53_ThALES_Sample_L_var._rotation_absolute);
    rot_transpose(_H53_ThALES_Sample_XY_var._rotation_absolute, tr1);
    rot_mul(_H53_ThALES_Sample_L_var._rotation_absolute, tr1, _H53_ThALES_Sample_L_var._rotation_relative);
    _H53_ThALES_Sample_L_var._rotation_is_identity =  rot_test_identity(_H53_ThALES_Sample_L_var._rotation_relative);
    tc1 = coords_set(
      0, 0, ThALES_L);
    rot_transpose(_H53_ThALES_Monochromator_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H53_ThALES_Sample_L_var._position_absolute = coords_add(_H53_ThALES_Monochromator_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H53_ThALES_Sample_XY_var._position_absolute, _H53_ThALES_Sample_L_var._position_absolute);
    _H53_ThALES_Sample_L_var._position_relative = rot_apply(_H53_ThALES_Sample_L_var._rotation_absolute, tc1);
  } /* H53_ThALES_Sample_L=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H53_ThALES_Sample_L", _H53_ThALES_Sample_L_var._position_absolute, _H53_ThALES_Sample_L_var._rotation_absolute);
  instrument->_position_absolute[30] = _H53_ThALES_Sample_L_var._position_absolute;
  instrument->_position_relative[30] = _H53_ThALES_Sample_L_var._position_relative;
    _H53_ThALES_Sample_L_var._position_relative_is_zero =  coords_test_zero(_H53_ThALES_Sample_L_var._position_relative);
  instrument->counter_N[30]  = instrument->counter_P[30] = instrument->counter_P2[30] = 0;
  instrument->counter_AbsorbProp[30]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0029_H53_ThALES_Sample_L", _H53_ThALES_Sample_L_var._position_absolute, _H53_ThALES_Sample_L_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "xwidth", "0", "0.10","MCNUM");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "yheight", "0", "0.10","MCNUM");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "options", "NULL", "lambda limits=[1 10]", "char*");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0029_H53_ThALES_Sample_L", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H53_ThALES_Sample_L_setpos */

/* component H53_ThALES_Sample=Isotropic_Sqw() SETTING, POSITION/ROTATION */
int _H53_ThALES_Sample_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H53_ThALES_Sample_setpos] component H53_ThALES_Sample=Isotropic_Sqw() SETTING [Isotropic_Sqw:0]");
  stracpy(_H53_ThALES_Sample_var._name, "H53_ThALES_Sample", 16384);
  stracpy(_H53_ThALES_Sample_var._type, "Isotropic_Sqw", 16384);
  _H53_ThALES_Sample_var._index=31;
  int current_setpos_index = 31;
  _H53_ThALES_Sample_var._parameters.powder_format[0] = 0;
  _H53_ThALES_Sample_var._parameters.powder_format[1] = 0;
  _H53_ThALES_Sample_var._parameters.powder_format[2] = 0;
  _H53_ThALES_Sample_var._parameters.powder_format[3] = 0;
  _H53_ThALES_Sample_var._parameters.powder_format[4] = 0;
  _H53_ThALES_Sample_var._parameters.powder_format[5] = 0;
  _H53_ThALES_Sample_var._parameters.powder_format[6] = 0;
  _H53_ThALES_Sample_var._parameters.powder_format[7] = 0;
  _H53_ThALES_Sample_var._parameters.powder_format[8] = 0;
  if(_instrument_var._parameters.ThALES_sample && strlen(_instrument_var._parameters.ThALES_sample))
    stracpy(_H53_ThALES_Sample_var._parameters.Sqw_coh, _instrument_var._parameters.ThALES_sample ? _instrument_var._parameters.ThALES_sample : "", 16384);
  else 
  _H53_ThALES_Sample_var._parameters.Sqw_coh[0]='\0';
  _H53_ThALES_Sample_var._parameters.Sqw_inc[0]='\0';
  _H53_ThALES_Sample_var._parameters.geometry[0]='\0';
  _H53_ThALES_Sample_var._parameters.radius = 0.005;
  _H53_ThALES_Sample_var._parameters.thickness = 0;
  _H53_ThALES_Sample_var._parameters.xwidth = 0;
  _H53_ThALES_Sample_var._parameters.yheight = 0.05;
  _H53_ThALES_Sample_var._parameters.zdepth = 0;
  _H53_ThALES_Sample_var._parameters.threshold = 1e-20;
  _H53_ThALES_Sample_var._parameters.order = 0;
  _H53_ThALES_Sample_var._parameters.T = 0;
  _H53_ThALES_Sample_var._parameters.verbose = 1;
  _H53_ThALES_Sample_var._parameters.d_phi = 30;
  _H53_ThALES_Sample_var._parameters.concentric = 0;
  _H53_ThALES_Sample_var._parameters.rho = 0;
  _H53_ThALES_Sample_var._parameters.sigma_abs = 0;
  _H53_ThALES_Sample_var._parameters.sigma_coh = 0;
  _H53_ThALES_Sample_var._parameters.sigma_inc = 0;
  _H53_ThALES_Sample_var._parameters.classical = -1;
  _H53_ThALES_Sample_var._parameters.powder_Dd = 0;
  _H53_ThALES_Sample_var._parameters.powder_DW = 0;
  _H53_ThALES_Sample_var._parameters.powder_Vc = 0;
  _H53_ThALES_Sample_var._parameters.density = 0;
  _H53_ThALES_Sample_var._parameters.weight = 0;
  _H53_ThALES_Sample_var._parameters.p_interact = -1;
  _H53_ThALES_Sample_var._parameters.norm = -1;
  _H53_ThALES_Sample_var._parameters.powder_barns = 1;
  if("Frommhold" && strlen("Frommhold"))
    stracpy(_H53_ThALES_Sample_var._parameters.quantum_correction, "Frommhold" ? "Frommhold" : "", 16384);
  else 
  _H53_ThALES_Sample_var._parameters.quantum_correction[0]='\0';


  /* component H53_ThALES_Sample=Isotropic_Sqw() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H53_ThALES_Monochromator_Out_var._rotation_absolute, _H53_ThALES_Sample_var._rotation_absolute);
    rot_transpose(_H53_ThALES_Sample_L_var._rotation_absolute, tr1);
    rot_mul(_H53_ThALES_Sample_var._rotation_absolute, tr1, _H53_ThALES_Sample_var._rotation_relative);
    _H53_ThALES_Sample_var._rotation_is_identity =  rot_test_identity(_H53_ThALES_Sample_var._rotation_relative);
    tc1 = coords_set(
      0, 0, ThALES_L);
    rot_transpose(_H53_ThALES_Monochromator_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H53_ThALES_Sample_var._position_absolute = coords_add(_H53_ThALES_Monochromator_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H53_ThALES_Sample_L_var._position_absolute, _H53_ThALES_Sample_var._position_absolute);
    _H53_ThALES_Sample_var._position_relative = rot_apply(_H53_ThALES_Sample_var._rotation_absolute, tc1);
  } /* H53_ThALES_Sample=Isotropic_Sqw() AT ROTATED */
  DEBUG_COMPONENT("H53_ThALES_Sample", _H53_ThALES_Sample_var._position_absolute, _H53_ThALES_Sample_var._rotation_absolute);
  instrument->_position_absolute[31] = _H53_ThALES_Sample_var._position_absolute;
  instrument->_position_relative[31] = _H53_ThALES_Sample_var._position_relative;
    _H53_ThALES_Sample_var._position_relative_is_zero =  coords_test_zero(_H53_ThALES_Sample_var._position_relative);
  instrument->counter_N[31]  = instrument->counter_P[31] = instrument->counter_P2[31] = 0;
  instrument->counter_AbsorbProp[31]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0030_H53_ThALES_Sample", _H53_ThALES_Sample_var._position_absolute, _H53_ThALES_Sample_var._rotation_absolute, "Isotropic_Sqw");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "powder_format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "Sqw_coh", 0, _instrument_var._parameters.ThALES_sample, "char*");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "Sqw_inc", 0, NULL, "char*");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "geometry", 0, 0, "char*");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "radius", "0", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "yheight", "0", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "threshold", "1e-20", "1e-20","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "order", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "T", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "verbose", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "d_phi", "0", "30","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "concentric", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "rho", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "sigma_coh", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "classical", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "powder_Dd", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "powder_DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "powder_Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "p_interact", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "norm", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "powder_barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0030_H53_ThALES_Sample", "quantum_correction", "Frommhold", "Frommhold", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H53_ThALES_Sample_setpos */

/* component H53_ThALES_Spectrometer=Monitor_nD() SETTING, POSITION/ROTATION */
int _H53_ThALES_Spectrometer_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H53_ThALES_Spectrometer_setpos] component H53_ThALES_Spectrometer=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H53_ThALES_Spectrometer_var._name, "H53_ThALES_Spectrometer", 16384);
  stracpy(_H53_ThALES_Spectrometer_var._type, "Monitor_nD", 16384);
  _H53_ThALES_Spectrometer_var._index=32;
  int current_setpos_index = 32;
  if("" && strlen(""))
    stracpy(_H53_ThALES_Spectrometer_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H53_ThALES_Spectrometer_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H53_ThALES_Spectrometer_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H53_ThALES_Spectrometer_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H53_ThALES_Spectrometer_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H53_ThALES_Spectrometer_var._parameters.user3[0]='\0';
  _H53_ThALES_Spectrometer_var._parameters.xwidth = 0;
  _H53_ThALES_Spectrometer_var._parameters.yheight = 0.3;
  _H53_ThALES_Spectrometer_var._parameters.zdepth = 0;
  _H53_ThALES_Spectrometer_var._parameters.xmin = 0;
  _H53_ThALES_Spectrometer_var._parameters.xmax = 0;
  _H53_ThALES_Spectrometer_var._parameters.ymin = 0;
  _H53_ThALES_Spectrometer_var._parameters.ymax = 0;
  _H53_ThALES_Spectrometer_var._parameters.zmin = 0;
  _H53_ThALES_Spectrometer_var._parameters.zmax = 0;
  _H53_ThALES_Spectrometer_var._parameters.bins = 0;
  _H53_ThALES_Spectrometer_var._parameters.min = -1e40;
  _H53_ThALES_Spectrometer_var._parameters.max = 1e40;
  _H53_ThALES_Spectrometer_var._parameters.restore_neutron = 1;
  _H53_ThALES_Spectrometer_var._parameters.radius = 0.5;
  if("angle limits=[-150 150] bins=50, energy limits=[0 30], banana" && strlen("angle limits=[-150 150] bins=50, energy limits=[0 30], banana"))
    stracpy(_H53_ThALES_Spectrometer_var._parameters.options, "angle limits=[-150 150] bins=50, energy limits=[0 30], banana" ? "angle limits=[-150 150] bins=50, energy limits=[0 30], banana" : "", 16384);
  else 
  _H53_ThALES_Spectrometer_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Spectrometer_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Spectrometer_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Spectrometer_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Spectrometer_var._parameters.geometry[0]='\0';
  _H53_ThALES_Spectrometer_var._parameters.nowritefile = 0;
  _H53_ThALES_Spectrometer_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Spectrometer_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Spectrometer_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Spectrometer_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Spectrometer_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Spectrometer_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Spectrometer_var._parameters.username3[0]='\0';


  /* component H53_ThALES_Spectrometer=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H53_ThALES_Sample_var._rotation_absolute, _H53_ThALES_Spectrometer_var._rotation_absolute);
    rot_transpose(_H53_ThALES_Sample_var._rotation_absolute, tr1);
    rot_mul(_H53_ThALES_Spectrometer_var._rotation_absolute, tr1, _H53_ThALES_Spectrometer_var._rotation_relative);
    _H53_ThALES_Spectrometer_var._rotation_is_identity =  rot_test_identity(_H53_ThALES_Spectrometer_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H53_ThALES_Sample_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H53_ThALES_Spectrometer_var._position_absolute = coords_add(_H53_ThALES_Sample_var._position_absolute, tc2);
    tc1 = coords_sub(_H53_ThALES_Sample_var._position_absolute, _H53_ThALES_Spectrometer_var._position_absolute);
    _H53_ThALES_Spectrometer_var._position_relative = rot_apply(_H53_ThALES_Spectrometer_var._rotation_absolute, tc1);
  } /* H53_ThALES_Spectrometer=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H53_ThALES_Spectrometer", _H53_ThALES_Spectrometer_var._position_absolute, _H53_ThALES_Spectrometer_var._rotation_absolute);
  instrument->_position_absolute[32] = _H53_ThALES_Spectrometer_var._position_absolute;
  instrument->_position_relative[32] = _H53_ThALES_Spectrometer_var._position_relative;
    _H53_ThALES_Spectrometer_var._position_relative_is_zero =  coords_test_zero(_H53_ThALES_Spectrometer_var._position_relative);
  instrument->counter_N[32]  = instrument->counter_P[32] = instrument->counter_P2[32] = 0;
  instrument->counter_AbsorbProp[32]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", _H53_ThALES_Spectrometer_var._position_absolute, _H53_ThALES_Spectrometer_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "yheight", "0", "0.3","MCNUM");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "radius", "0", "0.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "options", "NULL", "angle limits=[-150 150] bins=50, energy limits=[0 30], banana", "char*");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0031_H53_ThALES_Spectrometer", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H53_ThALES_Spectrometer_setpos */

/* component H53_ThALES_Diffractometer=Monitor_nD() SETTING, POSITION/ROTATION */
int _H53_ThALES_Diffractometer_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H53_ThALES_Diffractometer_setpos] component H53_ThALES_Diffractometer=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H53_ThALES_Diffractometer_var._name, "H53_ThALES_Diffractometer", 16384);
  stracpy(_H53_ThALES_Diffractometer_var._type, "Monitor_nD", 16384);
  _H53_ThALES_Diffractometer_var._index=33;
  int current_setpos_index = 33;
  if("" && strlen(""))
    stracpy(_H53_ThALES_Diffractometer_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H53_ThALES_Diffractometer_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H53_ThALES_Diffractometer_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H53_ThALES_Diffractometer_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H53_ThALES_Diffractometer_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H53_ThALES_Diffractometer_var._parameters.user3[0]='\0';
  _H53_ThALES_Diffractometer_var._parameters.xwidth = 0;
  _H53_ThALES_Diffractometer_var._parameters.yheight = 0.3;
  _H53_ThALES_Diffractometer_var._parameters.zdepth = 0;
  _H53_ThALES_Diffractometer_var._parameters.xmin = 0;
  _H53_ThALES_Diffractometer_var._parameters.xmax = 0;
  _H53_ThALES_Diffractometer_var._parameters.ymin = 0;
  _H53_ThALES_Diffractometer_var._parameters.ymax = 0;
  _H53_ThALES_Diffractometer_var._parameters.zmin = 0;
  _H53_ThALES_Diffractometer_var._parameters.zmax = 0;
  _H53_ThALES_Diffractometer_var._parameters.bins = 0;
  _H53_ThALES_Diffractometer_var._parameters.min = -1e40;
  _H53_ThALES_Diffractometer_var._parameters.max = 1e40;
  _H53_ThALES_Diffractometer_var._parameters.restore_neutron = 0;
  _H53_ThALES_Diffractometer_var._parameters.radius = 1;
  if("theta bins=100 limits=[-150 150], y, banana" && strlen("theta bins=100 limits=[-150 150], y, banana"))
    stracpy(_H53_ThALES_Diffractometer_var._parameters.options, "theta bins=100 limits=[-150 150], y, banana" ? "theta bins=100 limits=[-150 150], y, banana" : "", 16384);
  else 
  _H53_ThALES_Diffractometer_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Diffractometer_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Diffractometer_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Diffractometer_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Diffractometer_var._parameters.geometry[0]='\0';
  _H53_ThALES_Diffractometer_var._parameters.nowritefile = 0;
  _H53_ThALES_Diffractometer_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Diffractometer_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Diffractometer_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Diffractometer_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Diffractometer_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_Diffractometer_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_Diffractometer_var._parameters.username3[0]='\0';


  /* component H53_ThALES_Diffractometer=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H53_ThALES_Sample_var._rotation_absolute, _H53_ThALES_Diffractometer_var._rotation_absolute);
    rot_transpose(_H53_ThALES_Spectrometer_var._rotation_absolute, tr1);
    rot_mul(_H53_ThALES_Diffractometer_var._rotation_absolute, tr1, _H53_ThALES_Diffractometer_var._rotation_relative);
    _H53_ThALES_Diffractometer_var._rotation_is_identity =  rot_test_identity(_H53_ThALES_Diffractometer_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H53_ThALES_Sample_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H53_ThALES_Diffractometer_var._position_absolute = coords_add(_H53_ThALES_Sample_var._position_absolute, tc2);
    tc1 = coords_sub(_H53_ThALES_Spectrometer_var._position_absolute, _H53_ThALES_Diffractometer_var._position_absolute);
    _H53_ThALES_Diffractometer_var._position_relative = rot_apply(_H53_ThALES_Diffractometer_var._rotation_absolute, tc1);
  } /* H53_ThALES_Diffractometer=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H53_ThALES_Diffractometer", _H53_ThALES_Diffractometer_var._position_absolute, _H53_ThALES_Diffractometer_var._rotation_absolute);
  instrument->_position_absolute[33] = _H53_ThALES_Diffractometer_var._position_absolute;
  instrument->_position_relative[33] = _H53_ThALES_Diffractometer_var._position_relative;
    _H53_ThALES_Diffractometer_var._position_relative_is_zero =  coords_test_zero(_H53_ThALES_Diffractometer_var._position_relative);
  instrument->counter_N[33]  = instrument->counter_P[33] = instrument->counter_P2[33] = 0;
  instrument->counter_AbsorbProp[33]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", _H53_ThALES_Diffractometer_var._position_absolute, _H53_ThALES_Diffractometer_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "yheight", "0", "0.3","MCNUM");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "restore_neutron", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "radius", "0", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "options", "NULL", "theta bins=100 limits=[-150 150], y, banana", "char*");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0032_H53_ThALES_Diffractometer", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H53_ThALES_Diffractometer_setpos */

/* component Sample_Out=Arm() SETTING, POSITION/ROTATION */
int _Sample_Out_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_Sample_Out_setpos] component Sample_Out=Arm() SETTING [Arm:0]");
  stracpy(_Sample_Out_var._name, "Sample_Out", 16384);
  stracpy(_Sample_Out_var._type, "Arm", 16384);
  _Sample_Out_var._index=34;
  int current_setpos_index = 34;
  /* component Sample_Out=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-42)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H53_ThALES_Monochromator_Out_var._rotation_absolute, _Sample_Out_var._rotation_absolute);
    rot_transpose(_H53_ThALES_Diffractometer_var._rotation_absolute, tr1);
    rot_mul(_Sample_Out_var._rotation_absolute, tr1, _Sample_Out_var._rotation_relative);
    _Sample_Out_var._rotation_is_identity =  rot_test_identity(_Sample_Out_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H53_ThALES_Sample_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _Sample_Out_var._position_absolute = coords_add(_H53_ThALES_Sample_var._position_absolute, tc2);
    tc1 = coords_sub(_H53_ThALES_Diffractometer_var._position_absolute, _Sample_Out_var._position_absolute);
    _Sample_Out_var._position_relative = rot_apply(_Sample_Out_var._rotation_absolute, tc1);
  } /* Sample_Out=Arm() AT ROTATED */
  DEBUG_COMPONENT("Sample_Out", _Sample_Out_var._position_absolute, _Sample_Out_var._rotation_absolute);
  instrument->_position_absolute[34] = _Sample_Out_var._position_absolute;
  instrument->_position_relative[34] = _Sample_Out_var._position_relative;
    _Sample_Out_var._position_relative_is_zero =  coords_test_zero(_Sample_Out_var._position_relative);
  instrument->counter_N[34]  = instrument->counter_P[34] = instrument->counter_P2[34] = 0;
  instrument->counter_AbsorbProp[34]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0033_Sample_Out", _Sample_Out_var._position_absolute, _Sample_Out_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _Sample_Out_setpos */

/* component SC3=Collimator_linear() SETTING, POSITION/ROTATION */
int _SC3_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_SC3_setpos] component SC3=Collimator_linear() SETTING [Collimator_linear:0]");
  stracpy(_SC3_var._name, "SC3", 16384);
  stracpy(_SC3_var._type, "Collimator_linear", 16384);
  _SC3_var._index=35;
  int current_setpos_index = 35;
  _SC3_var._parameters.xmin = -0.06 / 2;
  _SC3_var._parameters.xmax = 0.06 / 2;
  _SC3_var._parameters.ymin = -0.12 / 2;
  _SC3_var._parameters.ymax = 0.12 / 2;
  _SC3_var._parameters.xwidth = 0;
  _SC3_var._parameters.yheight = 0;
  _SC3_var._parameters.length = 0.40;
  _SC3_var._parameters.divergence = 40;
  _SC3_var._parameters.transmission = 1;
  _SC3_var._parameters.divergenceV = 0;


  /* component SC3=Collimator_linear() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _Sample_Out_var._rotation_absolute, _SC3_var._rotation_absolute);
    rot_transpose(_H53_ThALES_Diffractometer_var._rotation_absolute, tr1);
    rot_mul(_SC3_var._rotation_absolute, tr1, _SC3_var._rotation_relative);
    _SC3_var._rotation_is_identity =  rot_test_identity(_SC3_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.5);
    rot_transpose(_Sample_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _SC3_var._position_absolute = coords_add(_Sample_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H53_ThALES_Diffractometer_var._position_absolute, _SC3_var._position_absolute);
    _SC3_var._position_relative = rot_apply(_SC3_var._rotation_absolute, tc1);
  } /* SC3=Collimator_linear() AT ROTATED */
  DEBUG_COMPONENT("SC3", _SC3_var._position_absolute, _SC3_var._rotation_absolute);
  instrument->_position_absolute[35] = _SC3_var._position_absolute;
  instrument->_position_relative[35] = _SC3_var._position_relative;
    _SC3_var._position_relative_is_zero =  coords_test_zero(_SC3_var._position_relative);
  instrument->counter_N[35]  = instrument->counter_P[35] = instrument->counter_P2[35] = 0;
  instrument->counter_AbsorbProp[35]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0034_SC3", _SC3_var._position_absolute, _SC3_var._rotation_absolute, "Collimator_linear");
        mccomp_param_nexus(nxhandle,"0034_SC3", "xmin", "-0.02", "-0.06 / 2","MCNUM");
        mccomp_param_nexus(nxhandle,"0034_SC3", "xmax", "0.02", "0.06 / 2","MCNUM");
        mccomp_param_nexus(nxhandle,"0034_SC3", "ymin", "-0.05", "-0.12 / 2","MCNUM");
        mccomp_param_nexus(nxhandle,"0034_SC3", "ymax", "0.05", "0.12 / 2","MCNUM");
        mccomp_param_nexus(nxhandle,"0034_SC3", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0034_SC3", "yheight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0034_SC3", "length", "0.3", "0.40","MCNUM");
        mccomp_param_nexus(nxhandle,"0034_SC3", "divergence", "40", "40","MCNUM");
        mccomp_param_nexus(nxhandle,"0034_SC3", "transmission", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0034_SC3", "divergenceV", "0", "0","MCNUM");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _SC3_setpos */

/* component Ana_Cradle=Arm() SETTING, POSITION/ROTATION */
int _Ana_Cradle_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_Ana_Cradle_setpos] component Ana_Cradle=Arm() SETTING [Arm:0]");
  stracpy(_Ana_Cradle_var._name, "Ana_Cradle", 16384);
  stracpy(_Ana_Cradle_var._type, "Arm", 16384);
  _Ana_Cradle_var._index=36;
  int current_setpos_index = 36;
  /* component Ana_Cradle=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _Sample_Out_var._rotation_absolute, _Ana_Cradle_var._rotation_absolute);
    rot_transpose(_SC3_var._rotation_absolute, tr1);
    rot_mul(_Ana_Cradle_var._rotation_absolute, tr1, _Ana_Cradle_var._rotation_relative);
    _Ana_Cradle_var._rotation_is_identity =  rot_test_identity(_Ana_Cradle_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 1.37);
    rot_transpose(_Sample_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _Ana_Cradle_var._position_absolute = coords_add(_Sample_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_SC3_var._position_absolute, _Ana_Cradle_var._position_absolute);
    _Ana_Cradle_var._position_relative = rot_apply(_Ana_Cradle_var._rotation_absolute, tc1);
  } /* Ana_Cradle=Arm() AT ROTATED */
  DEBUG_COMPONENT("Ana_Cradle", _Ana_Cradle_var._position_absolute, _Ana_Cradle_var._rotation_absolute);
  instrument->_position_absolute[36] = _Ana_Cradle_var._position_absolute;
  instrument->_position_relative[36] = _Ana_Cradle_var._position_relative;
    _Ana_Cradle_var._position_relative_is_zero =  coords_test_zero(_Ana_Cradle_var._position_relative);
  instrument->counter_N[36]  = instrument->counter_P[36] = instrument->counter_P2[36] = 0;
  instrument->counter_AbsorbProp[36]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0035_Ana_Cradle", _Ana_Cradle_var._position_absolute, _Ana_Cradle_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _Ana_Cradle_setpos */

/* component PG2Xtal=Monochromator_curved() SETTING, POSITION/ROTATION */
int _PG2Xtal_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_PG2Xtal_setpos] component PG2Xtal=Monochromator_curved() SETTING [Monochromator_curved:0]");
  stracpy(_PG2Xtal_var._name, "PG2Xtal", 16384);
  stracpy(_PG2Xtal_var._type, "Monochromator_curved", 16384);
  _PG2Xtal_var._index=37;
  int current_setpos_index = 37;
  if("NULL" && strlen("NULL"))
    stracpy(_PG2Xtal_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _PG2Xtal_var._parameters.reflect[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_PG2Xtal_var._parameters.transmit, "NULL" ? "NULL" : "", 16384);
  else 
  _PG2Xtal_var._parameters.transmit[0]='\0';
  _PG2Xtal_var._parameters.zwidth = 0.01;
  _PG2Xtal_var._parameters.yheight = 0.01;
  _PG2Xtal_var._parameters.gap = 0.0005;
  _PG2Xtal_var._parameters.NH = 11;
  _PG2Xtal_var._parameters.NV = 1;
  _PG2Xtal_var._parameters.mosaich = 30;
  _PG2Xtal_var._parameters.mosaicv = 30;
  _PG2Xtal_var._parameters.r0 = 0.7;
  _PG2Xtal_var._parameters.t0 = 1.0;
  _PG2Xtal_var._parameters.Q = 1.8734;
  _PG2Xtal_var._parameters.RV = 0;
  _PG2Xtal_var._parameters.RH = 0;
  _PG2Xtal_var._parameters.DM = 3.355;
  _PG2Xtal_var._parameters.mosaic = 0;
  _PG2Xtal_var._parameters.width = .2;
  _PG2Xtal_var._parameters.height = .1;
  _PG2Xtal_var._parameters.verbose = 0;
  _PG2Xtal_var._parameters.order = 0;


  /* component PG2Xtal=Monochromator_curved() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (21)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _Ana_Cradle_var._rotation_absolute, _PG2Xtal_var._rotation_absolute);
    rot_transpose(_SC3_var._rotation_absolute, tr1);
    rot_mul(_PG2Xtal_var._rotation_absolute, tr1, _PG2Xtal_var._rotation_relative);
    _PG2Xtal_var._rotation_is_identity =  rot_test_identity(_PG2Xtal_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_Ana_Cradle_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _PG2Xtal_var._position_absolute = coords_add(_Ana_Cradle_var._position_absolute, tc2);
    tc1 = coords_sub(_SC3_var._position_absolute, _PG2Xtal_var._position_absolute);
    _PG2Xtal_var._position_relative = rot_apply(_PG2Xtal_var._rotation_absolute, tc1);
  } /* PG2Xtal=Monochromator_curved() AT ROTATED */
  DEBUG_COMPONENT("PG2Xtal", _PG2Xtal_var._position_absolute, _PG2Xtal_var._rotation_absolute);
  instrument->_position_absolute[37] = _PG2Xtal_var._position_absolute;
  instrument->_position_relative[37] = _PG2Xtal_var._position_relative;
    _PG2Xtal_var._position_relative_is_zero =  coords_test_zero(_PG2Xtal_var._position_relative);
  instrument->counter_N[37]  = instrument->counter_P[37] = instrument->counter_P2[37] = 0;
  instrument->counter_AbsorbProp[37]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0036_PG2Xtal", _PG2Xtal_var._position_absolute, _PG2Xtal_var._rotation_absolute, "Monochromator_curved");
        mccomp_param_nexus(nxhandle,"0036_PG2Xtal", "reflect", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0036_PG2Xtal", "transmit", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0036_PG2Xtal", "zwidth", "0.01", "0.01","MCNUM");
        mccomp_param_nexus(nxhandle,"0036_PG2Xtal", "yheight", "0.01", "0.01","MCNUM");
        mccomp_param_nexus(nxhandle,"0036_PG2Xtal", "gap", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0036_PG2Xtal", "NH", "11", "11","int");
        mccomp_param_nexus(nxhandle,"0036_PG2Xtal", "NV", "11", "1","int");
        mccomp_param_nexus(nxhandle,"0036_PG2Xtal", "mosaich", "30.0", "30","MCNUM");
        mccomp_param_nexus(nxhandle,"0036_PG2Xtal", "mosaicv", "30.0", "30","MCNUM");
        mccomp_param_nexus(nxhandle,"0036_PG2Xtal", "r0", "0.7", "0.7","MCNUM");
        mccomp_param_nexus(nxhandle,"0036_PG2Xtal", "t0", "1.0", "1.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0036_PG2Xtal", "Q", "1.8734", "1.8734","MCNUM");
        mccomp_param_nexus(nxhandle,"0036_PG2Xtal", "RV", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0036_PG2Xtal", "RH", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0036_PG2Xtal", "DM", "0", "3.355","MCNUM");
        mccomp_param_nexus(nxhandle,"0036_PG2Xtal", "mosaic", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0036_PG2Xtal", "width", "0", ".2","MCNUM");
        mccomp_param_nexus(nxhandle,"0036_PG2Xtal", "height", "0", ".1","MCNUM");
        mccomp_param_nexus(nxhandle,"0036_PG2Xtal", "verbose", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0036_PG2Xtal", "order", "0", "0","MCNUM");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _PG2Xtal_setpos */

/* component Ana_Out=Arm() SETTING, POSITION/ROTATION */
int _Ana_Out_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_Ana_Out_setpos] component Ana_Out=Arm() SETTING [Arm:0]");
  stracpy(_Ana_Out_var._name, "Ana_Out", 16384);
  stracpy(_Ana_Out_var._type, "Arm", 16384);
  _Ana_Out_var._index=38;
  int current_setpos_index = 38;
  /* component Ana_Out=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (42)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _Ana_Cradle_var._rotation_absolute, _Ana_Out_var._rotation_absolute);
    rot_transpose(_PG2Xtal_var._rotation_absolute, tr1);
    rot_mul(_Ana_Out_var._rotation_absolute, tr1, _Ana_Out_var._rotation_relative);
    _Ana_Out_var._rotation_is_identity =  rot_test_identity(_Ana_Out_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_Ana_Cradle_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _Ana_Out_var._position_absolute = coords_add(_Ana_Cradle_var._position_absolute, tc2);
    tc1 = coords_sub(_PG2Xtal_var._position_absolute, _Ana_Out_var._position_absolute);
    _Ana_Out_var._position_relative = rot_apply(_Ana_Out_var._rotation_absolute, tc1);
  } /* Ana_Out=Arm() AT ROTATED */
  DEBUG_COMPONENT("Ana_Out", _Ana_Out_var._position_absolute, _Ana_Out_var._rotation_absolute);
  instrument->_position_absolute[38] = _Ana_Out_var._position_absolute;
  instrument->_position_relative[38] = _Ana_Out_var._position_relative;
    _Ana_Out_var._position_relative_is_zero =  coords_test_zero(_Ana_Out_var._position_relative);
  instrument->counter_N[38]  = instrument->counter_P[38] = instrument->counter_P2[38] = 0;
  instrument->counter_AbsorbProp[38]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0037_Ana_Out", _Ana_Out_var._position_absolute, _Ana_Out_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _Ana_Out_setpos */

/* component SC4=Collimator_linear() SETTING, POSITION/ROTATION */
int _SC4_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_SC4_setpos] component SC4=Collimator_linear() SETTING [Collimator_linear:0]");
  stracpy(_SC4_var._name, "SC4", 16384);
  stracpy(_SC4_var._type, "Collimator_linear", 16384);
  _SC4_var._index=39;
  int current_setpos_index = 39;
  _SC4_var._parameters.xmin = -0.06 / 2;
  _SC4_var._parameters.xmax = 0.06 / 2;
  _SC4_var._parameters.ymin = -0.12 / 2;
  _SC4_var._parameters.ymax = 0.12 / 2;
  _SC4_var._parameters.xwidth = 0;
  _SC4_var._parameters.yheight = 0;
  _SC4_var._parameters.length = 0.24;
  _SC4_var._parameters.divergence = 40;
  _SC4_var._parameters.transmission = 1;
  _SC4_var._parameters.divergenceV = 0;


  /* component SC4=Collimator_linear() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _Ana_Out_var._rotation_absolute, _SC4_var._rotation_absolute);
    rot_transpose(_PG2Xtal_var._rotation_absolute, tr1);
    rot_mul(_SC4_var._rotation_absolute, tr1, _SC4_var._rotation_relative);
    _SC4_var._rotation_is_identity =  rot_test_identity(_SC4_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.25);
    rot_transpose(_Ana_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _SC4_var._position_absolute = coords_add(_Ana_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_PG2Xtal_var._position_absolute, _SC4_var._position_absolute);
    _SC4_var._position_relative = rot_apply(_SC4_var._rotation_absolute, tc1);
  } /* SC4=Collimator_linear() AT ROTATED */
  DEBUG_COMPONENT("SC4", _SC4_var._position_absolute, _SC4_var._rotation_absolute);
  instrument->_position_absolute[39] = _SC4_var._position_absolute;
  instrument->_position_relative[39] = _SC4_var._position_relative;
    _SC4_var._position_relative_is_zero =  coords_test_zero(_SC4_var._position_relative);
  instrument->counter_N[39]  = instrument->counter_P[39] = instrument->counter_P2[39] = 0;
  instrument->counter_AbsorbProp[39]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0038_SC4", _SC4_var._position_absolute, _SC4_var._rotation_absolute, "Collimator_linear");
        mccomp_param_nexus(nxhandle,"0038_SC4", "xmin", "-0.02", "-0.06 / 2","MCNUM");
        mccomp_param_nexus(nxhandle,"0038_SC4", "xmax", "0.02", "0.06 / 2","MCNUM");
        mccomp_param_nexus(nxhandle,"0038_SC4", "ymin", "-0.05", "-0.12 / 2","MCNUM");
        mccomp_param_nexus(nxhandle,"0038_SC4", "ymax", "0.05", "0.12 / 2","MCNUM");
        mccomp_param_nexus(nxhandle,"0038_SC4", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0038_SC4", "yheight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0038_SC4", "length", "0.3", "0.24","MCNUM");
        mccomp_param_nexus(nxhandle,"0038_SC4", "divergence", "40", "40","MCNUM");
        mccomp_param_nexus(nxhandle,"0038_SC4", "transmission", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0038_SC4", "divergenceV", "0", "0","MCNUM");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _SC4_setpos */

/* component He3H=Monitor() SETTING, POSITION/ROTATION */
int _He3H_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_He3H_setpos] component He3H=Monitor() SETTING [Monitor:0]");
  stracpy(_He3H_var._name, "He3H", 16384);
  stracpy(_He3H_var._type, "Monitor", 16384);
  _He3H_var._index=40;
  int current_setpos_index = 40;
  _He3H_var._parameters.xmin = -0.025400;
  _He3H_var._parameters.xmax = 0.025400;
  _He3H_var._parameters.ymin = -0.042850;
  _He3H_var._parameters.ymax = 0.042850;
  _He3H_var._parameters.xwidth = 0;
  _He3H_var._parameters.yheight = 0;
  _He3H_var._parameters.restore_neutron = 0;


  /* component He3H=Monitor() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _Ana_Out_var._rotation_absolute, _He3H_var._rotation_absolute);
    rot_transpose(_SC4_var._rotation_absolute, tr1);
    rot_mul(_He3H_var._rotation_absolute, tr1, _He3H_var._rotation_relative);
    _He3H_var._rotation_is_identity =  rot_test_identity(_He3H_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.7);
    rot_transpose(_Ana_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _He3H_var._position_absolute = coords_add(_Ana_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_SC4_var._position_absolute, _He3H_var._position_absolute);
    _He3H_var._position_relative = rot_apply(_He3H_var._rotation_absolute, tc1);
  } /* He3H=Monitor() AT ROTATED */
  DEBUG_COMPONENT("He3H", _He3H_var._position_absolute, _He3H_var._rotation_absolute);
  instrument->_position_absolute[40] = _He3H_var._position_absolute;
  instrument->_position_relative[40] = _He3H_var._position_relative;
    _He3H_var._position_relative_is_zero =  coords_test_zero(_He3H_var._position_relative);
  instrument->counter_N[40]  = instrument->counter_P[40] = instrument->counter_P2[40] = 0;
  instrument->counter_AbsorbProp[40]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0039_He3H", _He3H_var._position_absolute, _He3H_var._rotation_absolute, "Monitor");
        mccomp_param_nexus(nxhandle,"0039_He3H", "xmin", "-0.05", "-0.025400","MCNUM");
        mccomp_param_nexus(nxhandle,"0039_He3H", "xmax", "0.05", "0.025400","MCNUM");
        mccomp_param_nexus(nxhandle,"0039_He3H", "ymin", "-0.05", "-0.042850","MCNUM");
        mccomp_param_nexus(nxhandle,"0039_He3H", "ymax", "0.05", "0.042850","MCNUM");
        mccomp_param_nexus(nxhandle,"0039_He3H", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0039_He3H", "yheight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0039_He3H", "restore_neutron", "0", "0","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _He3H_setpos */

/* component H53_ThALES_Transmit=Arm() SETTING, POSITION/ROTATION */
int _H53_ThALES_Transmit_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H53_ThALES_Transmit_setpos] component H53_ThALES_Transmit=Arm() SETTING [Arm:0]");
  stracpy(_H53_ThALES_Transmit_var._name, "H53_ThALES_Transmit", 16384);
  stracpy(_H53_ThALES_Transmit_var._type, "Arm", 16384);
  _H53_ThALES_Transmit_var._index=41;
  int current_setpos_index = 41;
  /* component H53_ThALES_Transmit=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H53_ThALES_Monochromator_Cradle_var._rotation_absolute, _H53_ThALES_Transmit_var._rotation_absolute);
    rot_transpose(_He3H_var._rotation_absolute, tr1);
    rot_mul(_H53_ThALES_Transmit_var._rotation_absolute, tr1, _H53_ThALES_Transmit_var._rotation_relative);
    _H53_ThALES_Transmit_var._rotation_is_identity =  rot_test_identity(_H53_ThALES_Transmit_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H53_ThALES_Monochromator_Cradle_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H53_ThALES_Transmit_var._position_absolute = coords_add(_H53_ThALES_Monochromator_Cradle_var._position_absolute, tc2);
    tc1 = coords_sub(_He3H_var._position_absolute, _H53_ThALES_Transmit_var._position_absolute);
    _H53_ThALES_Transmit_var._position_relative = rot_apply(_H53_ThALES_Transmit_var._rotation_absolute, tc1);
  } /* H53_ThALES_Transmit=Arm() AT ROTATED */
  DEBUG_COMPONENT("H53_ThALES_Transmit", _H53_ThALES_Transmit_var._position_absolute, _H53_ThALES_Transmit_var._rotation_absolute);
  instrument->_position_absolute[41] = _H53_ThALES_Transmit_var._position_absolute;
  instrument->_position_relative[41] = _H53_ThALES_Transmit_var._position_relative;
    _H53_ThALES_Transmit_var._position_relative_is_zero =  coords_test_zero(_H53_ThALES_Transmit_var._position_relative);
  instrument->counter_N[41]  = instrument->counter_P[41] = instrument->counter_P2[41] = 0;
  instrument->counter_AbsorbProp[41]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0040_H53_ThALES_Transmit", _H53_ThALES_Transmit_var._position_absolute, _H53_ThALES_Transmit_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H53_ThALES_Transmit_setpos */

/* component H53_ThALES_TransmitXY=Monitor_nD() SETTING, POSITION/ROTATION */
int _H53_ThALES_TransmitXY_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H53_ThALES_TransmitXY_setpos] component H53_ThALES_TransmitXY=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H53_ThALES_TransmitXY_var._name, "H53_ThALES_TransmitXY", 16384);
  stracpy(_H53_ThALES_TransmitXY_var._type, "Monitor_nD", 16384);
  _H53_ThALES_TransmitXY_var._index=42;
  int current_setpos_index = 42;
  if("" && strlen(""))
    stracpy(_H53_ThALES_TransmitXY_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H53_ThALES_TransmitXY_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H53_ThALES_TransmitXY_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H53_ThALES_TransmitXY_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H53_ThALES_TransmitXY_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H53_ThALES_TransmitXY_var._parameters.user3[0]='\0';
  _H53_ThALES_TransmitXY_var._parameters.xwidth = 0.06;
  _H53_ThALES_TransmitXY_var._parameters.yheight = 0.12;
  _H53_ThALES_TransmitXY_var._parameters.zdepth = 0;
  _H53_ThALES_TransmitXY_var._parameters.xmin = 0;
  _H53_ThALES_TransmitXY_var._parameters.xmax = 0;
  _H53_ThALES_TransmitXY_var._parameters.ymin = 0;
  _H53_ThALES_TransmitXY_var._parameters.ymax = 0;
  _H53_ThALES_TransmitXY_var._parameters.zmin = 0;
  _H53_ThALES_TransmitXY_var._parameters.zmax = 0;
  _H53_ThALES_TransmitXY_var._parameters.bins = 50;
  _H53_ThALES_TransmitXY_var._parameters.min = -1e40;
  _H53_ThALES_TransmitXY_var._parameters.max = 1e40;
  _H53_ThALES_TransmitXY_var._parameters.restore_neutron = 0;
  _H53_ThALES_TransmitXY_var._parameters.radius = 0;
  if("x lambda limits=[1 10]" && strlen("x lambda limits=[1 10]"))
    stracpy(_H53_ThALES_TransmitXY_var._parameters.options, "x lambda limits=[1 10]" ? "x lambda limits=[1 10]" : "", 16384);
  else 
  _H53_ThALES_TransmitXY_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_TransmitXY_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_TransmitXY_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_TransmitXY_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_TransmitXY_var._parameters.geometry[0]='\0';
  _H53_ThALES_TransmitXY_var._parameters.nowritefile = 0;
  _H53_ThALES_TransmitXY_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_TransmitXY_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_TransmitXY_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_TransmitXY_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_TransmitXY_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H53_ThALES_TransmitXY_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H53_ThALES_TransmitXY_var._parameters.username3[0]='\0';


  /* component H53_ThALES_TransmitXY=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H53_ThALES_Monochromator_Cradle_var._rotation_absolute, _H53_ThALES_TransmitXY_var._rotation_absolute);
    rot_transpose(_H53_ThALES_Transmit_var._rotation_absolute, tr1);
    rot_mul(_H53_ThALES_TransmitXY_var._rotation_absolute, tr1, _H53_ThALES_TransmitXY_var._rotation_relative);
    _H53_ThALES_TransmitXY_var._rotation_is_identity =  rot_test_identity(_H53_ThALES_TransmitXY_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.2);
    rot_transpose(_H53_ThALES_Monochromator_Cradle_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H53_ThALES_TransmitXY_var._position_absolute = coords_add(_H53_ThALES_Monochromator_Cradle_var._position_absolute, tc2);
    tc1 = coords_sub(_H53_ThALES_Transmit_var._position_absolute, _H53_ThALES_TransmitXY_var._position_absolute);
    _H53_ThALES_TransmitXY_var._position_relative = rot_apply(_H53_ThALES_TransmitXY_var._rotation_absolute, tc1);
  } /* H53_ThALES_TransmitXY=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H53_ThALES_TransmitXY", _H53_ThALES_TransmitXY_var._position_absolute, _H53_ThALES_TransmitXY_var._rotation_absolute);
  instrument->_position_absolute[42] = _H53_ThALES_TransmitXY_var._position_absolute;
  instrument->_position_relative[42] = _H53_ThALES_TransmitXY_var._position_relative;
    _H53_ThALES_TransmitXY_var._position_relative_is_zero =  coords_test_zero(_H53_ThALES_TransmitXY_var._position_relative);
  instrument->counter_N[42]  = instrument->counter_P[42] = instrument->counter_P2[42] = 0;
  instrument->counter_AbsorbProp[42]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", _H53_ThALES_TransmitXY_var._position_absolute, _H53_ThALES_TransmitXY_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "restore_neutron", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "options", "NULL", "x lambda limits=[1 10]", "char*");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0041_H53_ThALES_TransmitXY", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H53_ThALES_TransmitXY_setpos */

/* component H52_start=Arm() SETTING, POSITION/ROTATION */
int _H52_start_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H52_start_setpos] component H52_start=Arm() SETTING [Arm:0]");
  stracpy(_H52_start_var._name, "H52_start", 16384);
  stracpy(_H52_start_var._type, "Arm", 16384);
  _H52_start_var._index=43;
  int current_setpos_index = 43;
  /* component H52_start=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H52_origin_var._rotation_absolute, _H52_start_var._rotation_absolute);
    rot_transpose(_H53_ThALES_TransmitXY_var._rotation_absolute, tr1);
    rot_mul(_H52_start_var._rotation_absolute, tr1, _H52_start_var._rotation_relative);
    _H52_start_var._rotation_is_identity =  rot_test_identity(_H52_start_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H52_origin_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H52_start_var._position_absolute = coords_add(_H52_origin_var._position_absolute, tc2);
    tc1 = coords_sub(_H53_ThALES_TransmitXY_var._position_absolute, _H52_start_var._position_absolute);
    _H52_start_var._position_relative = rot_apply(_H52_start_var._rotation_absolute, tc1);
  } /* H52_start=Arm() AT ROTATED */
  DEBUG_COMPONENT("H52_start", _H52_start_var._position_absolute, _H52_start_var._rotation_absolute);
  instrument->_position_absolute[43] = _H52_start_var._position_absolute;
  instrument->_position_relative[43] = _H52_start_var._position_relative;
    _H52_start_var._position_relative_is_zero =  coords_test_zero(_H52_start_var._position_relative);
  instrument->counter_N[43]  = instrument->counter_P[43] = instrument->counter_P2[43] = 0;
  instrument->counter_AbsorbProp[43]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0042_H52_start", _H52_start_var._position_absolute, _H52_start_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H52_start_setpos */

/* component H52_inpile=Guide_gravity() SETTING, POSITION/ROTATION */
int _H52_inpile_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H52_inpile_setpos] component H52_inpile=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H52_inpile_var._name, "H52_inpile", 16384);
  stracpy(_H52_inpile_var._type, "Guide_gravity", 16384);
  _H52_inpile_var._index=44;
  int current_setpos_index = 44;
  _H52_inpile_var._parameters.w1 = 0.062;
  _H52_inpile_var._parameters.h1 = 0.12;
  _H52_inpile_var._parameters.w2 = 0.068;
  _H52_inpile_var._parameters.h2 = 0.132;
  _H52_inpile_var._parameters.l = 4.930 -3.155;
  _H52_inpile_var._parameters.R0 = gR0;
  _H52_inpile_var._parameters.Qc = gQc;
  _H52_inpile_var._parameters.alpha = gAlpha;
  _H52_inpile_var._parameters.m = 3;
  _H52_inpile_var._parameters.W = gW;
  _H52_inpile_var._parameters.nslit = 1;
  _H52_inpile_var._parameters.d = 0.0005;
  _H52_inpile_var._parameters.mleft = -1;
  _H52_inpile_var._parameters.mright = -1;
  _H52_inpile_var._parameters.mtop = -1;
  _H52_inpile_var._parameters.mbottom = -1;
  _H52_inpile_var._parameters.nhslit = 1;
  _H52_inpile_var._parameters.G = 0;
  _H52_inpile_var._parameters.aleft = -1;
  _H52_inpile_var._parameters.aright = -1;
  _H52_inpile_var._parameters.atop = -1;
  _H52_inpile_var._parameters.abottom = -1;
  _H52_inpile_var._parameters.wavy = 0;
  _H52_inpile_var._parameters.wavy_z = 0;
  _H52_inpile_var._parameters.wavy_tb = 0;
  _H52_inpile_var._parameters.wavy_lr = 0;
  _H52_inpile_var._parameters.chamfers = 0;
  _H52_inpile_var._parameters.chamfers_z = 0;
  _H52_inpile_var._parameters.chamfers_lr = 0;
  _H52_inpile_var._parameters.chamfers_tb = 0;
  _H52_inpile_var._parameters.nelements = 1;
  _H52_inpile_var._parameters.nu = 0;
  _H52_inpile_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H52_inpile_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_inpile_var._parameters.reflect[0]='\0';


  /* component H52_inpile=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H52_start_var._rotation_absolute, _H52_inpile_var._rotation_absolute);
    rot_transpose(_H52_start_var._rotation_absolute, tr1);
    rot_mul(_H52_inpile_var._rotation_absolute, tr1, _H52_inpile_var._rotation_relative);
    _H52_inpile_var._rotation_is_identity =  rot_test_identity(_H52_inpile_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H52_start_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H52_inpile_var._position_absolute = coords_add(_H52_start_var._position_absolute, tc2);
    tc1 = coords_sub(_H52_start_var._position_absolute, _H52_inpile_var._position_absolute);
    _H52_inpile_var._position_relative = rot_apply(_H52_inpile_var._rotation_absolute, tc1);
  } /* H52_inpile=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H52_inpile", _H52_inpile_var._position_absolute, _H52_inpile_var._rotation_absolute);
  instrument->_position_absolute[44] = _H52_inpile_var._position_absolute;
  instrument->_position_relative[44] = _H52_inpile_var._position_relative;
    _H52_inpile_var._position_relative_is_zero =  coords_test_zero(_H52_inpile_var._position_relative);
  instrument->counter_N[44]  = instrument->counter_P[44] = instrument->counter_P2[44] = 0;
  instrument->counter_AbsorbProp[44]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0043_H52_inpile", _H52_inpile_var._position_absolute, _H52_inpile_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "w1", "NONE", "0.062","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "w2", "0", "0.068","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "h2", "0", "0.132","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "l", "NONE", "4.930 -3.155","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "m", "1.0", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0043_H52_inpile", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H52_inpile_setpos */

/* component H52_Common=Guide_gravity() SETTING, POSITION/ROTATION */
int _H52_Common_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H52_Common_setpos] component H52_Common=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H52_Common_var._name, "H52_Common", 16384);
  stracpy(_H52_Common_var._type, "Guide_gravity", 16384);
  _H52_Common_var._index=45;
  int current_setpos_index = 45;
  _H52_Common_var._parameters.w1 = COMP_GETPAR ( H52_inpile , w2 );
  _H52_Common_var._parameters.h1 = COMP_GETPAR ( H52_inpile , h2 );
  _H52_Common_var._parameters.w2 = COMP_GETPAR ( H52_inpile , w2 ) + 0.052 / 16;
  _H52_Common_var._parameters.h2 = COMP_GETPAR ( H52_inpile , h2 ) + 0.108 / 16;
  _H52_Common_var._parameters.l = 16.068 / 16;
  _H52_Common_var._parameters.R0 = gR0;
  _H52_Common_var._parameters.Qc = gQc;
  _H52_Common_var._parameters.alpha = gAlpha;
  _H52_Common_var._parameters.m = 3;
  _H52_Common_var._parameters.W = gW;
  _H52_Common_var._parameters.nslit = 1;
  _H52_Common_var._parameters.d = 0.0005;
  _H52_Common_var._parameters.mleft = -1;
  _H52_Common_var._parameters.mright = -1;
  _H52_Common_var._parameters.mtop = -1;
  _H52_Common_var._parameters.mbottom = -1;
  _H52_Common_var._parameters.nhslit = 1;
  _H52_Common_var._parameters.G = 0;
  _H52_Common_var._parameters.aleft = -1;
  _H52_Common_var._parameters.aright = -1;
  _H52_Common_var._parameters.atop = -1;
  _H52_Common_var._parameters.abottom = -1;
  _H52_Common_var._parameters.wavy = 0;
  _H52_Common_var._parameters.wavy_z = 0;
  _H52_Common_var._parameters.wavy_tb = 0;
  _H52_Common_var._parameters.wavy_lr = 0;
  _H52_Common_var._parameters.chamfers = 0;
  _H52_Common_var._parameters.chamfers_z = 0;
  _H52_Common_var._parameters.chamfers_lr = 0;
  _H52_Common_var._parameters.chamfers_tb = 0;
  _H52_Common_var._parameters.nelements = 1;
  _H52_Common_var._parameters.nu = 0;
  _H52_Common_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Common_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Common_var._parameters.reflect[0]='\0';


  /* component H52_Common=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (16.068 / 16 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H52_inpile_var._rotation_absolute, _H52_Common_var._rotation_absolute);
    rot_transpose(_H52_inpile_var._rotation_absolute, tr1);
    rot_mul(_H52_Common_var._rotation_absolute, tr1, _H52_Common_var._rotation_relative);
    _H52_Common_var._rotation_is_identity =  rot_test_identity(_H52_Common_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H52_inpile , l ) + gGap);
    rot_transpose(_H52_inpile_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H52_Common_var._position_absolute = coords_add(_H52_inpile_var._position_absolute, tc2);
    tc1 = coords_sub(_H52_inpile_var._position_absolute, _H52_Common_var._position_absolute);
    _H52_Common_var._position_relative = rot_apply(_H52_Common_var._rotation_absolute, tc1);
  } /* H52_Common=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H52_Common", _H52_Common_var._position_absolute, _H52_Common_var._rotation_absolute);
  instrument->_position_absolute[45] = _H52_Common_var._position_absolute;
  instrument->_position_relative[45] = _H52_Common_var._position_relative;
    _H52_Common_var._position_relative_is_zero =  coords_test_zero(_H52_Common_var._position_relative);
  instrument->counter_N[45]  = instrument->counter_P[45] = instrument->counter_P2[45] = 0;
  instrument->counter_AbsorbProp[45]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0044_H52_Common", _H52_Common_var._position_absolute, _H52_Common_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "w1", "NONE", "COMP_GETPAR ( H52_inpile , w2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "h1", "NONE", "COMP_GETPAR ( H52_inpile , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "w2", "0", "COMP_GETPAR ( H52_inpile , w2 ) + 0.052 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "h2", "0", "COMP_GETPAR ( H52_inpile , h2 ) + 0.108 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "l", "NONE", "16.068 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "m", "1.0", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0044_H52_Common", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H52_Common_setpos */

/* component H52_Common_46=Guide_gravity() SETTING, POSITION/ROTATION */
int _H52_Common_46_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H52_Common_46_setpos] component H52_Common_46=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H52_Common_46_var._name, "H52_Common_46", 16384);
  stracpy(_H52_Common_46_var._type, "Guide_gravity", 16384);
  _H52_Common_46_var._index=46;
  int current_setpos_index = 46;
  _H52_Common_46_var._parameters.w1 = COMP_GETPAR ( H52_Common , w2 );
  _H52_Common_46_var._parameters.h1 = COMP_GETPAR ( H52_Common , h2 );
  _H52_Common_46_var._parameters.w2 = COMP_GETPAR ( H52_Common , w2 ) + 0.052 / 16;
  _H52_Common_46_var._parameters.h2 = COMP_GETPAR ( H52_Common , h2 ) + 0.108 / 16;
  _H52_Common_46_var._parameters.l = 16.068 / 16;
  _H52_Common_46_var._parameters.R0 = gR0;
  _H52_Common_46_var._parameters.Qc = gQc;
  _H52_Common_46_var._parameters.alpha = gAlpha;
  _H52_Common_46_var._parameters.m = 3;
  _H52_Common_46_var._parameters.W = gW;
  _H52_Common_46_var._parameters.nslit = 1;
  _H52_Common_46_var._parameters.d = 0.0005;
  _H52_Common_46_var._parameters.mleft = -1;
  _H52_Common_46_var._parameters.mright = -1;
  _H52_Common_46_var._parameters.mtop = -1;
  _H52_Common_46_var._parameters.mbottom = -1;
  _H52_Common_46_var._parameters.nhslit = 1;
  _H52_Common_46_var._parameters.G = 0;
  _H52_Common_46_var._parameters.aleft = -1;
  _H52_Common_46_var._parameters.aright = -1;
  _H52_Common_46_var._parameters.atop = -1;
  _H52_Common_46_var._parameters.abottom = -1;
  _H52_Common_46_var._parameters.wavy = 0;
  _H52_Common_46_var._parameters.wavy_z = 0;
  _H52_Common_46_var._parameters.wavy_tb = 0;
  _H52_Common_46_var._parameters.wavy_lr = 0;
  _H52_Common_46_var._parameters.chamfers = 0;
  _H52_Common_46_var._parameters.chamfers_z = 0;
  _H52_Common_46_var._parameters.chamfers_lr = 0;
  _H52_Common_46_var._parameters.chamfers_tb = 0;
  _H52_Common_46_var._parameters.nelements = 1;
  _H52_Common_46_var._parameters.nu = 0;
  _H52_Common_46_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Common_46_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Common_46_var._parameters.reflect[0]='\0';


  /* component H52_Common_46=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (16.068 / 16 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H52_Common_var._rotation_absolute, _H52_Common_46_var._rotation_absolute);
    rot_transpose(_H52_Common_var._rotation_absolute, tr1);
    rot_mul(_H52_Common_46_var._rotation_absolute, tr1, _H52_Common_46_var._rotation_relative);
    _H52_Common_46_var._rotation_is_identity =  rot_test_identity(_H52_Common_46_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H52_Common , l ) + gGap);
    rot_transpose(_H52_Common_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H52_Common_46_var._position_absolute = coords_add(_H52_Common_var._position_absolute, tc2);
    tc1 = coords_sub(_H52_Common_var._position_absolute, _H52_Common_46_var._position_absolute);
    _H52_Common_46_var._position_relative = rot_apply(_H52_Common_46_var._rotation_absolute, tc1);
  } /* H52_Common_46=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H52_Common_46", _H52_Common_46_var._position_absolute, _H52_Common_46_var._rotation_absolute);
  instrument->_position_absolute[46] = _H52_Common_46_var._position_absolute;
  instrument->_position_relative[46] = _H52_Common_46_var._position_relative;
    _H52_Common_46_var._position_relative_is_zero =  coords_test_zero(_H52_Common_46_var._position_relative);
  instrument->counter_N[46]  = instrument->counter_P[46] = instrument->counter_P2[46] = 0;
  instrument->counter_AbsorbProp[46]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0045_H52_Common_46", _H52_Common_46_var._position_absolute, _H52_Common_46_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "w1", "NONE", "COMP_GETPAR ( H52_Common , w2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "h1", "NONE", "COMP_GETPAR ( H52_Common , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "w2", "0", "COMP_GETPAR ( H52_Common , w2 ) + 0.052 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "h2", "0", "COMP_GETPAR ( H52_Common , h2 ) + 0.108 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "l", "NONE", "16.068 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "m", "1.0", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0045_H52_Common_46", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H52_Common_46_setpos */

/* component H52_Common_3=Guide_gravity() SETTING, POSITION/ROTATION */
int _H52_Common_3_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H52_Common_3_setpos] component H52_Common_3=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H52_Common_3_var._name, "H52_Common_3", 16384);
  stracpy(_H52_Common_3_var._type, "Guide_gravity", 16384);
  _H52_Common_3_var._index=47;
  int current_setpos_index = 47;
  _H52_Common_3_var._parameters.w1 = COMP_GETPAR ( H52_Common_46 , w2 );
  _H52_Common_3_var._parameters.h1 = COMP_GETPAR ( H52_Common_46 , h2 );
  _H52_Common_3_var._parameters.w2 = COMP_GETPAR ( H52_Common_46 , w2 ) + 0.052 / 16;
  _H52_Common_3_var._parameters.h2 = COMP_GETPAR ( H52_Common_46 , h2 ) + 0.108 / 16;
  _H52_Common_3_var._parameters.l = 16.068 / 16;
  _H52_Common_3_var._parameters.R0 = gR0;
  _H52_Common_3_var._parameters.Qc = gQc;
  _H52_Common_3_var._parameters.alpha = gAlpha;
  _H52_Common_3_var._parameters.m = 3;
  _H52_Common_3_var._parameters.W = gW;
  _H52_Common_3_var._parameters.nslit = 1;
  _H52_Common_3_var._parameters.d = 0.0005;
  _H52_Common_3_var._parameters.mleft = -1;
  _H52_Common_3_var._parameters.mright = -1;
  _H52_Common_3_var._parameters.mtop = -1;
  _H52_Common_3_var._parameters.mbottom = -1;
  _H52_Common_3_var._parameters.nhslit = 1;
  _H52_Common_3_var._parameters.G = 0;
  _H52_Common_3_var._parameters.aleft = -1;
  _H52_Common_3_var._parameters.aright = -1;
  _H52_Common_3_var._parameters.atop = -1;
  _H52_Common_3_var._parameters.abottom = -1;
  _H52_Common_3_var._parameters.wavy = 0;
  _H52_Common_3_var._parameters.wavy_z = 0;
  _H52_Common_3_var._parameters.wavy_tb = 0;
  _H52_Common_3_var._parameters.wavy_lr = 0;
  _H52_Common_3_var._parameters.chamfers = 0;
  _H52_Common_3_var._parameters.chamfers_z = 0;
  _H52_Common_3_var._parameters.chamfers_lr = 0;
  _H52_Common_3_var._parameters.chamfers_tb = 0;
  _H52_Common_3_var._parameters.nelements = 1;
  _H52_Common_3_var._parameters.nu = 0;
  _H52_Common_3_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Common_3_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Common_3_var._parameters.reflect[0]='\0';


  /* component H52_Common_3=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (16.068 / 16 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H52_Common_46_var._rotation_absolute, _H52_Common_3_var._rotation_absolute);
    rot_transpose(_H52_Common_46_var._rotation_absolute, tr1);
    rot_mul(_H52_Common_3_var._rotation_absolute, tr1, _H52_Common_3_var._rotation_relative);
    _H52_Common_3_var._rotation_is_identity =  rot_test_identity(_H52_Common_3_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H52_Common_46 , l ) + gGap);
    rot_transpose(_H52_Common_46_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H52_Common_3_var._position_absolute = coords_add(_H52_Common_46_var._position_absolute, tc2);
    tc1 = coords_sub(_H52_Common_46_var._position_absolute, _H52_Common_3_var._position_absolute);
    _H52_Common_3_var._position_relative = rot_apply(_H52_Common_3_var._rotation_absolute, tc1);
  } /* H52_Common_3=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H52_Common_3", _H52_Common_3_var._position_absolute, _H52_Common_3_var._rotation_absolute);
  instrument->_position_absolute[47] = _H52_Common_3_var._position_absolute;
  instrument->_position_relative[47] = _H52_Common_3_var._position_relative;
    _H52_Common_3_var._position_relative_is_zero =  coords_test_zero(_H52_Common_3_var._position_relative);
  instrument->counter_N[47]  = instrument->counter_P[47] = instrument->counter_P2[47] = 0;
  instrument->counter_AbsorbProp[47]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0046_H52_Common_3", _H52_Common_3_var._position_absolute, _H52_Common_3_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "w1", "NONE", "COMP_GETPAR ( H52_Common_46 , w2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "h1", "NONE", "COMP_GETPAR ( H52_Common_46 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "w2", "0", "COMP_GETPAR ( H52_Common_46 , w2 ) + 0.052 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "h2", "0", "COMP_GETPAR ( H52_Common_46 , h2 ) + 0.108 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "l", "NONE", "16.068 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "m", "1.0", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0046_H52_Common_3", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H52_Common_3_setpos */

/* component HCS_Al_48=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_48_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_48_setpos] component HCS_Al_48=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_48_var._name, "HCS_Al_48", 16384);
  stracpy(_HCS_Al_48_var._type, "PowderN", 16384);
  _HCS_Al_48_var._index=48;
  int current_setpos_index = 48;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_48_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_48_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_48_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_48_var._parameters.geometry[0]='\0';
  _HCS_Al_48_var._parameters.format[0] = 0;
  _HCS_Al_48_var._parameters.format[1] = 0;
  _HCS_Al_48_var._parameters.format[2] = 0;
  _HCS_Al_48_var._parameters.format[3] = 0;
  _HCS_Al_48_var._parameters.format[4] = 0;
  _HCS_Al_48_var._parameters.format[5] = 0;
  _HCS_Al_48_var._parameters.format[6] = 0;
  _HCS_Al_48_var._parameters.format[7] = 0;
  _HCS_Al_48_var._parameters.format[8] = 0;
  _HCS_Al_48_var._parameters.radius = 0;
  _HCS_Al_48_var._parameters.yheight = 0.12;
  _HCS_Al_48_var._parameters.xwidth = COMP_GETPAR ( H52_Common_3 , w2 );
  _HCS_Al_48_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_48_var._parameters.thickness = 0;
  _HCS_Al_48_var._parameters.pack = 1;
  _HCS_Al_48_var._parameters.Vc = 0;
  _HCS_Al_48_var._parameters.sigma_abs = 0;
  _HCS_Al_48_var._parameters.sigma_inc = 0;
  _HCS_Al_48_var._parameters.delta_d_d = 0;
  _HCS_Al_48_var._parameters.p_inc = 0.005;
  _HCS_Al_48_var._parameters.p_transmit = 0.9450;
  _HCS_Al_48_var._parameters.DW = 0;
  _HCS_Al_48_var._parameters.nb_atoms = 1;
  _HCS_Al_48_var._parameters.d_omega = 0;
  _HCS_Al_48_var._parameters.d_phi = 10;
  _HCS_Al_48_var._parameters.tth_sign = 0;
  _HCS_Al_48_var._parameters.p_interact = 0.05;
  _HCS_Al_48_var._parameters.concentric = 0;
  _HCS_Al_48_var._parameters.density = 0;
  _HCS_Al_48_var._parameters.weight = 0;
  _HCS_Al_48_var._parameters.barns = 1;
  _HCS_Al_48_var._parameters.Strain = 0;
  _HCS_Al_48_var._parameters.focus_flip = 0;
  _HCS_Al_48_var._parameters.target_index = 0;
  _HCS_Al_48_var._parameters.order = 1;


  /* component HCS_Al_48=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H52_Common_3_var._rotation_absolute, _HCS_Al_48_var._rotation_absolute);
    rot_transpose(_H52_Common_3_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_48_var._rotation_absolute, tr1, _HCS_Al_48_var._rotation_relative);
    _HCS_Al_48_var._rotation_is_identity =  rot_test_identity(_HCS_Al_48_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H52_Common_3 , l ) + 0.01);
    rot_transpose(_H52_Common_3_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_48_var._position_absolute = coords_add(_H52_Common_3_var._position_absolute, tc2);
    tc1 = coords_sub(_H52_Common_3_var._position_absolute, _HCS_Al_48_var._position_absolute);
    _HCS_Al_48_var._position_relative = rot_apply(_HCS_Al_48_var._rotation_absolute, tc1);
  } /* HCS_Al_48=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_48", _HCS_Al_48_var._position_absolute, _HCS_Al_48_var._rotation_absolute);
  instrument->_position_absolute[48] = _HCS_Al_48_var._position_absolute;
  instrument->_position_relative[48] = _HCS_Al_48_var._position_relative;
    _HCS_Al_48_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_48_var._position_relative);
  instrument->counter_N[48]  = instrument->counter_P[48] = instrument->counter_P2[48] = 0;
  instrument->counter_AbsorbProp[48]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0047_HCS_Al_48", _HCS_Al_48_var._position_absolute, _HCS_Al_48_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "xwidth", "0", "COMP_GETPAR ( H52_Common_3 , w2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0047_HCS_Al_48", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_48_setpos */

/* component H52_Obt_Out=Monitor_nD() SETTING, POSITION/ROTATION */
int _H52_Obt_Out_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H52_Obt_Out_setpos] component H52_Obt_Out=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H52_Obt_Out_var._name, "H52_Obt_Out", 16384);
  stracpy(_H52_Obt_Out_var._type, "Monitor_nD", 16384);
  _H52_Obt_Out_var._index=49;
  int current_setpos_index = 49;
  if("" && strlen(""))
    stracpy(_H52_Obt_Out_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H52_Obt_Out_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H52_Obt_Out_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H52_Obt_Out_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H52_Obt_Out_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H52_Obt_Out_var._parameters.user3[0]='\0';
  _H52_Obt_Out_var._parameters.xwidth = COMP_GETPAR ( H52_Common_3 , w2 );
  _H52_Obt_Out_var._parameters.yheight = 0.12;
  _H52_Obt_Out_var._parameters.zdepth = 0;
  _H52_Obt_Out_var._parameters.xmin = 0;
  _H52_Obt_Out_var._parameters.xmax = 0;
  _H52_Obt_Out_var._parameters.ymin = 0;
  _H52_Obt_Out_var._parameters.ymax = 0;
  _H52_Obt_Out_var._parameters.zmin = 0;
  _H52_Obt_Out_var._parameters.zmax = 0;
  _H52_Obt_Out_var._parameters.bins = 50;
  _H52_Obt_Out_var._parameters.min = -1e40;
  _H52_Obt_Out_var._parameters.max = 1e40;
  _H52_Obt_Out_var._parameters.restore_neutron = 1;
  _H52_Obt_Out_var._parameters.radius = 0;
  if("x y, slit" && strlen("x y, slit"))
    stracpy(_H52_Obt_Out_var._parameters.options, "x y, slit" ? "x y, slit" : "", 16384);
  else 
  _H52_Obt_Out_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Obt_Out_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Obt_Out_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Obt_Out_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Obt_Out_var._parameters.geometry[0]='\0';
  _H52_Obt_Out_var._parameters.nowritefile = 0;
  _H52_Obt_Out_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Obt_Out_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Obt_Out_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Obt_Out_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Obt_Out_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Obt_Out_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Obt_Out_var._parameters.username3[0]='\0';


  /* component H52_Obt_Out=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_48_var._rotation_absolute, _H52_Obt_Out_var._rotation_absolute);
    rot_transpose(_HCS_Al_48_var._rotation_absolute, tr1);
    rot_mul(_H52_Obt_Out_var._rotation_absolute, tr1, _H52_Obt_Out_var._rotation_relative);
    _H52_Obt_Out_var._rotation_is_identity =  rot_test_identity(_H52_Obt_Out_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.04);
    rot_transpose(_HCS_Al_48_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H52_Obt_Out_var._position_absolute = coords_add(_HCS_Al_48_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_48_var._position_absolute, _H52_Obt_Out_var._position_absolute);
    _H52_Obt_Out_var._position_relative = rot_apply(_H52_Obt_Out_var._rotation_absolute, tc1);
  } /* H52_Obt_Out=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H52_Obt_Out", _H52_Obt_Out_var._position_absolute, _H52_Obt_Out_var._rotation_absolute);
  instrument->_position_absolute[49] = _H52_Obt_Out_var._position_absolute;
  instrument->_position_relative[49] = _H52_Obt_Out_var._position_relative;
    _H52_Obt_Out_var._position_relative_is_zero =  coords_test_zero(_H52_Obt_Out_var._position_relative);
  instrument->counter_N[49]  = instrument->counter_P[49] = instrument->counter_P2[49] = 0;
  instrument->counter_AbsorbProp[49]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0048_H52_Obt_Out", _H52_Obt_Out_var._position_absolute, _H52_Obt_Out_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "xwidth", "0", "COMP_GETPAR ( H52_Common_3 , w2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "options", "NULL", "x y, slit", "char*");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0048_H52_Obt_Out", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H52_Obt_Out_setpos */

/* component HCS_Al_50=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_50_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_50_setpos] component HCS_Al_50=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_50_var._name, "HCS_Al_50", 16384);
  stracpy(_HCS_Al_50_var._type, "PowderN", 16384);
  _HCS_Al_50_var._index=50;
  int current_setpos_index = 50;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_50_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_50_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_50_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_50_var._parameters.geometry[0]='\0';
  _HCS_Al_50_var._parameters.format[0] = 0;
  _HCS_Al_50_var._parameters.format[1] = 0;
  _HCS_Al_50_var._parameters.format[2] = 0;
  _HCS_Al_50_var._parameters.format[3] = 0;
  _HCS_Al_50_var._parameters.format[4] = 0;
  _HCS_Al_50_var._parameters.format[5] = 0;
  _HCS_Al_50_var._parameters.format[6] = 0;
  _HCS_Al_50_var._parameters.format[7] = 0;
  _HCS_Al_50_var._parameters.format[8] = 0;
  _HCS_Al_50_var._parameters.radius = 0;
  _HCS_Al_50_var._parameters.yheight = 0.12;
  _HCS_Al_50_var._parameters.xwidth = COMP_GETPAR ( H52_Common_3 , w2 );
  _HCS_Al_50_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_50_var._parameters.thickness = 0;
  _HCS_Al_50_var._parameters.pack = 1;
  _HCS_Al_50_var._parameters.Vc = 0;
  _HCS_Al_50_var._parameters.sigma_abs = 0;
  _HCS_Al_50_var._parameters.sigma_inc = 0;
  _HCS_Al_50_var._parameters.delta_d_d = 0;
  _HCS_Al_50_var._parameters.p_inc = 0.005;
  _HCS_Al_50_var._parameters.p_transmit = 0.9450;
  _HCS_Al_50_var._parameters.DW = 0;
  _HCS_Al_50_var._parameters.nb_atoms = 1;
  _HCS_Al_50_var._parameters.d_omega = 0;
  _HCS_Al_50_var._parameters.d_phi = 10;
  _HCS_Al_50_var._parameters.tth_sign = 0;
  _HCS_Al_50_var._parameters.p_interact = 0.05;
  _HCS_Al_50_var._parameters.concentric = 0;
  _HCS_Al_50_var._parameters.density = 0;
  _HCS_Al_50_var._parameters.weight = 0;
  _HCS_Al_50_var._parameters.barns = 1;
  _HCS_Al_50_var._parameters.Strain = 0;
  _HCS_Al_50_var._parameters.focus_flip = 0;
  _HCS_Al_50_var._parameters.target_index = 0;
  _HCS_Al_50_var._parameters.order = 1;


  /* component HCS_Al_50=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H52_Obt_Out_var._rotation_absolute, _HCS_Al_50_var._rotation_absolute);
    rot_transpose(_H52_Obt_Out_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_50_var._rotation_absolute, tr1, _HCS_Al_50_var._rotation_relative);
    _HCS_Al_50_var._rotation_is_identity =  rot_test_identity(_HCS_Al_50_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.01);
    rot_transpose(_H52_Obt_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_50_var._position_absolute = coords_add(_H52_Obt_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H52_Obt_Out_var._position_absolute, _HCS_Al_50_var._position_absolute);
    _HCS_Al_50_var._position_relative = rot_apply(_HCS_Al_50_var._rotation_absolute, tc1);
  } /* HCS_Al_50=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_50", _HCS_Al_50_var._position_absolute, _HCS_Al_50_var._rotation_absolute);
  instrument->_position_absolute[50] = _HCS_Al_50_var._position_absolute;
  instrument->_position_relative[50] = _HCS_Al_50_var._position_relative;
    _HCS_Al_50_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_50_var._position_relative);
  instrument->counter_N[50]  = instrument->counter_P[50] = instrument->counter_P2[50] = 0;
  instrument->counter_AbsorbProp[50]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0049_HCS_Al_50", _HCS_Al_50_var._position_absolute, _HCS_Al_50_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "xwidth", "0", "COMP_GETPAR ( H52_Common_3 , w2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0049_HCS_Al_50", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_50_setpos */

/* component H52_Common_51=Guide_gravity() SETTING, POSITION/ROTATION */
int _H52_Common_51_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H52_Common_51_setpos] component H52_Common_51=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H52_Common_51_var._name, "H52_Common_51", 16384);
  stracpy(_H52_Common_51_var._type, "Guide_gravity", 16384);
  _H52_Common_51_var._index=51;
  int current_setpos_index = 51;
  _H52_Common_51_var._parameters.w1 = COMP_GETPAR ( H52_Common_3 , w2 );
  _H52_Common_51_var._parameters.h1 = COMP_GETPAR ( H52_Common_3 , h2 );
  _H52_Common_51_var._parameters.w2 = COMP_GETPAR ( H52_Common_3 , w2 ) + 0.052 / 16;
  _H52_Common_51_var._parameters.h2 = COMP_GETPAR ( H52_Common_3 , h2 ) + 0.108 / 16;
  _H52_Common_51_var._parameters.l = 16.068 / 16;
  _H52_Common_51_var._parameters.R0 = gR0;
  _H52_Common_51_var._parameters.Qc = gQc;
  _H52_Common_51_var._parameters.alpha = gAlpha;
  _H52_Common_51_var._parameters.m = 3;
  _H52_Common_51_var._parameters.W = gW;
  _H52_Common_51_var._parameters.nslit = 1;
  _H52_Common_51_var._parameters.d = 0.0005;
  _H52_Common_51_var._parameters.mleft = -1;
  _H52_Common_51_var._parameters.mright = -1;
  _H52_Common_51_var._parameters.mtop = -1;
  _H52_Common_51_var._parameters.mbottom = -1;
  _H52_Common_51_var._parameters.nhslit = 1;
  _H52_Common_51_var._parameters.G = 0;
  _H52_Common_51_var._parameters.aleft = -1;
  _H52_Common_51_var._parameters.aright = -1;
  _H52_Common_51_var._parameters.atop = -1;
  _H52_Common_51_var._parameters.abottom = -1;
  _H52_Common_51_var._parameters.wavy = 0;
  _H52_Common_51_var._parameters.wavy_z = 0;
  _H52_Common_51_var._parameters.wavy_tb = 0;
  _H52_Common_51_var._parameters.wavy_lr = 0;
  _H52_Common_51_var._parameters.chamfers = 0;
  _H52_Common_51_var._parameters.chamfers_z = 0;
  _H52_Common_51_var._parameters.chamfers_lr = 0;
  _H52_Common_51_var._parameters.chamfers_tb = 0;
  _H52_Common_51_var._parameters.nelements = 1;
  _H52_Common_51_var._parameters.nu = 0;
  _H52_Common_51_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Common_51_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Common_51_var._parameters.reflect[0]='\0';


  /* component H52_Common_51=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (16.068 / 16 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_50_var._rotation_absolute, _H52_Common_51_var._rotation_absolute);
    rot_transpose(_HCS_Al_50_var._rotation_absolute, tr1);
    rot_mul(_H52_Common_51_var._rotation_absolute, tr1, _H52_Common_51_var._rotation_relative);
    _H52_Common_51_var._rotation_is_identity =  rot_test_identity(_H52_Common_51_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H52_Common_3 , l ) + gGap + 0.075);
    rot_transpose(_H52_Common_3_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H52_Common_51_var._position_absolute = coords_add(_H52_Common_3_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_50_var._position_absolute, _H52_Common_51_var._position_absolute);
    _H52_Common_51_var._position_relative = rot_apply(_H52_Common_51_var._rotation_absolute, tc1);
  } /* H52_Common_51=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H52_Common_51", _H52_Common_51_var._position_absolute, _H52_Common_51_var._rotation_absolute);
  instrument->_position_absolute[51] = _H52_Common_51_var._position_absolute;
  instrument->_position_relative[51] = _H52_Common_51_var._position_relative;
    _H52_Common_51_var._position_relative_is_zero =  coords_test_zero(_H52_Common_51_var._position_relative);
  instrument->counter_N[51]  = instrument->counter_P[51] = instrument->counter_P2[51] = 0;
  instrument->counter_AbsorbProp[51]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0050_H52_Common_51", _H52_Common_51_var._position_absolute, _H52_Common_51_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "w1", "NONE", "COMP_GETPAR ( H52_Common_3 , w2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "h1", "NONE", "COMP_GETPAR ( H52_Common_3 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "w2", "0", "COMP_GETPAR ( H52_Common_3 , w2 ) + 0.052 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "h2", "0", "COMP_GETPAR ( H52_Common_3 , h2 ) + 0.108 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "l", "NONE", "16.068 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "m", "1.0", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0050_H52_Common_51", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H52_Common_51_setpos */

/* component H52_Common_52=Guide_gravity() SETTING, POSITION/ROTATION */
int _H52_Common_52_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H52_Common_52_setpos] component H52_Common_52=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H52_Common_52_var._name, "H52_Common_52", 16384);
  stracpy(_H52_Common_52_var._type, "Guide_gravity", 16384);
  _H52_Common_52_var._index=52;
  int current_setpos_index = 52;
  _H52_Common_52_var._parameters.w1 = COMP_GETPAR ( H52_Common_51 , w2 );
  _H52_Common_52_var._parameters.h1 = COMP_GETPAR ( H52_Common_51 , h2 );
  _H52_Common_52_var._parameters.w2 = COMP_GETPAR ( H52_Common_51 , w2 ) + 0.052 / 16;
  _H52_Common_52_var._parameters.h2 = COMP_GETPAR ( H52_Common_51 , h2 ) + 0.108 / 16;
  _H52_Common_52_var._parameters.l = 16.068 / 16;
  _H52_Common_52_var._parameters.R0 = gR0;
  _H52_Common_52_var._parameters.Qc = gQc;
  _H52_Common_52_var._parameters.alpha = gAlpha;
  _H52_Common_52_var._parameters.m = 3;
  _H52_Common_52_var._parameters.W = gW;
  _H52_Common_52_var._parameters.nslit = 1;
  _H52_Common_52_var._parameters.d = 0.0005;
  _H52_Common_52_var._parameters.mleft = -1;
  _H52_Common_52_var._parameters.mright = -1;
  _H52_Common_52_var._parameters.mtop = -1;
  _H52_Common_52_var._parameters.mbottom = -1;
  _H52_Common_52_var._parameters.nhslit = 1;
  _H52_Common_52_var._parameters.G = 0;
  _H52_Common_52_var._parameters.aleft = -1;
  _H52_Common_52_var._parameters.aright = -1;
  _H52_Common_52_var._parameters.atop = -1;
  _H52_Common_52_var._parameters.abottom = -1;
  _H52_Common_52_var._parameters.wavy = 0;
  _H52_Common_52_var._parameters.wavy_z = 0;
  _H52_Common_52_var._parameters.wavy_tb = 0;
  _H52_Common_52_var._parameters.wavy_lr = 0;
  _H52_Common_52_var._parameters.chamfers = 0;
  _H52_Common_52_var._parameters.chamfers_z = 0;
  _H52_Common_52_var._parameters.chamfers_lr = 0;
  _H52_Common_52_var._parameters.chamfers_tb = 0;
  _H52_Common_52_var._parameters.nelements = 1;
  _H52_Common_52_var._parameters.nu = 0;
  _H52_Common_52_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Common_52_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Common_52_var._parameters.reflect[0]='\0';


  /* component H52_Common_52=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (16.068 / 16 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H52_Common_51_var._rotation_absolute, _H52_Common_52_var._rotation_absolute);
    rot_transpose(_H52_Common_51_var._rotation_absolute, tr1);
    rot_mul(_H52_Common_52_var._rotation_absolute, tr1, _H52_Common_52_var._rotation_relative);
    _H52_Common_52_var._rotation_is_identity =  rot_test_identity(_H52_Common_52_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H52_Common_51 , l ) + gGap);
    rot_transpose(_H52_Common_51_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H52_Common_52_var._position_absolute = coords_add(_H52_Common_51_var._position_absolute, tc2);
    tc1 = coords_sub(_H52_Common_51_var._position_absolute, _H52_Common_52_var._position_absolute);
    _H52_Common_52_var._position_relative = rot_apply(_H52_Common_52_var._rotation_absolute, tc1);
  } /* H52_Common_52=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H52_Common_52", _H52_Common_52_var._position_absolute, _H52_Common_52_var._rotation_absolute);
  instrument->_position_absolute[52] = _H52_Common_52_var._position_absolute;
  instrument->_position_relative[52] = _H52_Common_52_var._position_relative;
    _H52_Common_52_var._position_relative_is_zero =  coords_test_zero(_H52_Common_52_var._position_relative);
  instrument->counter_N[52]  = instrument->counter_P[52] = instrument->counter_P2[52] = 0;
  instrument->counter_AbsorbProp[52]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0051_H52_Common_52", _H52_Common_52_var._position_absolute, _H52_Common_52_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "w1", "NONE", "COMP_GETPAR ( H52_Common_51 , w2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "h1", "NONE", "COMP_GETPAR ( H52_Common_51 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "w2", "0", "COMP_GETPAR ( H52_Common_51 , w2 ) + 0.052 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "h2", "0", "COMP_GETPAR ( H52_Common_51 , h2 ) + 0.108 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "l", "NONE", "16.068 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "m", "1.0", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0051_H52_Common_52", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H52_Common_52_setpos */

/* component H52_Common_53=Guide_gravity() SETTING, POSITION/ROTATION */
int _H52_Common_53_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H52_Common_53_setpos] component H52_Common_53=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H52_Common_53_var._name, "H52_Common_53", 16384);
  stracpy(_H52_Common_53_var._type, "Guide_gravity", 16384);
  _H52_Common_53_var._index=53;
  int current_setpos_index = 53;
  _H52_Common_53_var._parameters.w1 = COMP_GETPAR ( H52_Common_52 , w2 );
  _H52_Common_53_var._parameters.h1 = COMP_GETPAR ( H52_Common_52 , h2 );
  _H52_Common_53_var._parameters.w2 = COMP_GETPAR ( H52_Common_52 , w2 ) + 0.052 / 16;
  _H52_Common_53_var._parameters.h2 = COMP_GETPAR ( H52_Common_52 , h2 ) + 0.108 / 16;
  _H52_Common_53_var._parameters.l = 16.068 / 16;
  _H52_Common_53_var._parameters.R0 = gR0;
  _H52_Common_53_var._parameters.Qc = gQc;
  _H52_Common_53_var._parameters.alpha = gAlpha;
  _H52_Common_53_var._parameters.m = 3;
  _H52_Common_53_var._parameters.W = gW;
  _H52_Common_53_var._parameters.nslit = 1;
  _H52_Common_53_var._parameters.d = 0.0005;
  _H52_Common_53_var._parameters.mleft = -1;
  _H52_Common_53_var._parameters.mright = -1;
  _H52_Common_53_var._parameters.mtop = -1;
  _H52_Common_53_var._parameters.mbottom = -1;
  _H52_Common_53_var._parameters.nhslit = 1;
  _H52_Common_53_var._parameters.G = 0;
  _H52_Common_53_var._parameters.aleft = -1;
  _H52_Common_53_var._parameters.aright = -1;
  _H52_Common_53_var._parameters.atop = -1;
  _H52_Common_53_var._parameters.abottom = -1;
  _H52_Common_53_var._parameters.wavy = 0;
  _H52_Common_53_var._parameters.wavy_z = 0;
  _H52_Common_53_var._parameters.wavy_tb = 0;
  _H52_Common_53_var._parameters.wavy_lr = 0;
  _H52_Common_53_var._parameters.chamfers = 0;
  _H52_Common_53_var._parameters.chamfers_z = 0;
  _H52_Common_53_var._parameters.chamfers_lr = 0;
  _H52_Common_53_var._parameters.chamfers_tb = 0;
  _H52_Common_53_var._parameters.nelements = 1;
  _H52_Common_53_var._parameters.nu = 0;
  _H52_Common_53_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Common_53_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Common_53_var._parameters.reflect[0]='\0';


  /* component H52_Common_53=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (16.068 / 16 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H52_Common_52_var._rotation_absolute, _H52_Common_53_var._rotation_absolute);
    rot_transpose(_H52_Common_52_var._rotation_absolute, tr1);
    rot_mul(_H52_Common_53_var._rotation_absolute, tr1, _H52_Common_53_var._rotation_relative);
    _H52_Common_53_var._rotation_is_identity =  rot_test_identity(_H52_Common_53_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H52_Common_52 , l ) + gGap);
    rot_transpose(_H52_Common_52_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H52_Common_53_var._position_absolute = coords_add(_H52_Common_52_var._position_absolute, tc2);
    tc1 = coords_sub(_H52_Common_52_var._position_absolute, _H52_Common_53_var._position_absolute);
    _H52_Common_53_var._position_relative = rot_apply(_H52_Common_53_var._rotation_absolute, tc1);
  } /* H52_Common_53=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H52_Common_53", _H52_Common_53_var._position_absolute, _H52_Common_53_var._rotation_absolute);
  instrument->_position_absolute[53] = _H52_Common_53_var._position_absolute;
  instrument->_position_relative[53] = _H52_Common_53_var._position_relative;
    _H52_Common_53_var._position_relative_is_zero =  coords_test_zero(_H52_Common_53_var._position_relative);
  instrument->counter_N[53]  = instrument->counter_P[53] = instrument->counter_P2[53] = 0;
  instrument->counter_AbsorbProp[53]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0052_H52_Common_53", _H52_Common_53_var._position_absolute, _H52_Common_53_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "w1", "NONE", "COMP_GETPAR ( H52_Common_52 , w2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "h1", "NONE", "COMP_GETPAR ( H52_Common_52 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "w2", "0", "COMP_GETPAR ( H52_Common_52 , w2 ) + 0.052 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "h2", "0", "COMP_GETPAR ( H52_Common_52 , h2 ) + 0.108 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "l", "NONE", "16.068 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "m", "1.0", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0052_H52_Common_53", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H52_Common_53_setpos */

/* component H52_Common_54=Guide_gravity() SETTING, POSITION/ROTATION */
int _H52_Common_54_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H52_Common_54_setpos] component H52_Common_54=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H52_Common_54_var._name, "H52_Common_54", 16384);
  stracpy(_H52_Common_54_var._type, "Guide_gravity", 16384);
  _H52_Common_54_var._index=54;
  int current_setpos_index = 54;
  _H52_Common_54_var._parameters.w1 = COMP_GETPAR ( H52_Common_53 , w2 );
  _H52_Common_54_var._parameters.h1 = COMP_GETPAR ( H52_Common_53 , h2 );
  _H52_Common_54_var._parameters.w2 = COMP_GETPAR ( H52_Common_53 , w2 ) + 0.052 / 16;
  _H52_Common_54_var._parameters.h2 = COMP_GETPAR ( H52_Common_53 , h2 ) + 0.108 / 16;
  _H52_Common_54_var._parameters.l = 16.068 / 16;
  _H52_Common_54_var._parameters.R0 = gR0;
  _H52_Common_54_var._parameters.Qc = gQc;
  _H52_Common_54_var._parameters.alpha = gAlpha;
  _H52_Common_54_var._parameters.m = 3;
  _H52_Common_54_var._parameters.W = gW;
  _H52_Common_54_var._parameters.nslit = 1;
  _H52_Common_54_var._parameters.d = 0.0005;
  _H52_Common_54_var._parameters.mleft = -1;
  _H52_Common_54_var._parameters.mright = -1;
  _H52_Common_54_var._parameters.mtop = -1;
  _H52_Common_54_var._parameters.mbottom = -1;
  _H52_Common_54_var._parameters.nhslit = 1;
  _H52_Common_54_var._parameters.G = 0;
  _H52_Common_54_var._parameters.aleft = -1;
  _H52_Common_54_var._parameters.aright = -1;
  _H52_Common_54_var._parameters.atop = -1;
  _H52_Common_54_var._parameters.abottom = -1;
  _H52_Common_54_var._parameters.wavy = 0;
  _H52_Common_54_var._parameters.wavy_z = 0;
  _H52_Common_54_var._parameters.wavy_tb = 0;
  _H52_Common_54_var._parameters.wavy_lr = 0;
  _H52_Common_54_var._parameters.chamfers = 0;
  _H52_Common_54_var._parameters.chamfers_z = 0;
  _H52_Common_54_var._parameters.chamfers_lr = 0;
  _H52_Common_54_var._parameters.chamfers_tb = 0;
  _H52_Common_54_var._parameters.nelements = 1;
  _H52_Common_54_var._parameters.nu = 0;
  _H52_Common_54_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Common_54_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Common_54_var._parameters.reflect[0]='\0';


  /* component H52_Common_54=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (16.068 / 16 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H52_Common_53_var._rotation_absolute, _H52_Common_54_var._rotation_absolute);
    rot_transpose(_H52_Common_53_var._rotation_absolute, tr1);
    rot_mul(_H52_Common_54_var._rotation_absolute, tr1, _H52_Common_54_var._rotation_relative);
    _H52_Common_54_var._rotation_is_identity =  rot_test_identity(_H52_Common_54_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H52_Common_53 , l ) + gGap);
    rot_transpose(_H52_Common_53_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H52_Common_54_var._position_absolute = coords_add(_H52_Common_53_var._position_absolute, tc2);
    tc1 = coords_sub(_H52_Common_53_var._position_absolute, _H52_Common_54_var._position_absolute);
    _H52_Common_54_var._position_relative = rot_apply(_H52_Common_54_var._rotation_absolute, tc1);
  } /* H52_Common_54=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H52_Common_54", _H52_Common_54_var._position_absolute, _H52_Common_54_var._rotation_absolute);
  instrument->_position_absolute[54] = _H52_Common_54_var._position_absolute;
  instrument->_position_relative[54] = _H52_Common_54_var._position_relative;
    _H52_Common_54_var._position_relative_is_zero =  coords_test_zero(_H52_Common_54_var._position_relative);
  instrument->counter_N[54]  = instrument->counter_P[54] = instrument->counter_P2[54] = 0;
  instrument->counter_AbsorbProp[54]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0053_H52_Common_54", _H52_Common_54_var._position_absolute, _H52_Common_54_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "w1", "NONE", "COMP_GETPAR ( H52_Common_53 , w2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "h1", "NONE", "COMP_GETPAR ( H52_Common_53 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "w2", "0", "COMP_GETPAR ( H52_Common_53 , w2 ) + 0.052 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "h2", "0", "COMP_GETPAR ( H52_Common_53 , h2 ) + 0.108 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "l", "NONE", "16.068 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "m", "1.0", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0053_H52_Common_54", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H52_Common_54_setpos */

/* component H52_Common_55=Guide_gravity() SETTING, POSITION/ROTATION */
int _H52_Common_55_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H52_Common_55_setpos] component H52_Common_55=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H52_Common_55_var._name, "H52_Common_55", 16384);
  stracpy(_H52_Common_55_var._type, "Guide_gravity", 16384);
  _H52_Common_55_var._index=55;
  int current_setpos_index = 55;
  _H52_Common_55_var._parameters.w1 = COMP_GETPAR ( H52_Common_54 , w2 );
  _H52_Common_55_var._parameters.h1 = COMP_GETPAR ( H52_Common_54 , h2 );
  _H52_Common_55_var._parameters.w2 = COMP_GETPAR ( H52_Common_54 , w2 ) + 0.052 / 16;
  _H52_Common_55_var._parameters.h2 = COMP_GETPAR ( H52_Common_54 , h2 ) + 0.108 / 16;
  _H52_Common_55_var._parameters.l = 16.068 / 16;
  _H52_Common_55_var._parameters.R0 = gR0;
  _H52_Common_55_var._parameters.Qc = gQc;
  _H52_Common_55_var._parameters.alpha = gAlpha;
  _H52_Common_55_var._parameters.m = 3;
  _H52_Common_55_var._parameters.W = gW;
  _H52_Common_55_var._parameters.nslit = 1;
  _H52_Common_55_var._parameters.d = 0.0005;
  _H52_Common_55_var._parameters.mleft = -1;
  _H52_Common_55_var._parameters.mright = -1;
  _H52_Common_55_var._parameters.mtop = -1;
  _H52_Common_55_var._parameters.mbottom = -1;
  _H52_Common_55_var._parameters.nhslit = 1;
  _H52_Common_55_var._parameters.G = 0;
  _H52_Common_55_var._parameters.aleft = -1;
  _H52_Common_55_var._parameters.aright = -1;
  _H52_Common_55_var._parameters.atop = -1;
  _H52_Common_55_var._parameters.abottom = -1;
  _H52_Common_55_var._parameters.wavy = 0;
  _H52_Common_55_var._parameters.wavy_z = 0;
  _H52_Common_55_var._parameters.wavy_tb = 0;
  _H52_Common_55_var._parameters.wavy_lr = 0;
  _H52_Common_55_var._parameters.chamfers = 0;
  _H52_Common_55_var._parameters.chamfers_z = 0;
  _H52_Common_55_var._parameters.chamfers_lr = 0;
  _H52_Common_55_var._parameters.chamfers_tb = 0;
  _H52_Common_55_var._parameters.nelements = 1;
  _H52_Common_55_var._parameters.nu = 0;
  _H52_Common_55_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Common_55_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Common_55_var._parameters.reflect[0]='\0';


  /* component H52_Common_55=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (16.068 / 16 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H52_Common_54_var._rotation_absolute, _H52_Common_55_var._rotation_absolute);
    rot_transpose(_H52_Common_54_var._rotation_absolute, tr1);
    rot_mul(_H52_Common_55_var._rotation_absolute, tr1, _H52_Common_55_var._rotation_relative);
    _H52_Common_55_var._rotation_is_identity =  rot_test_identity(_H52_Common_55_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H52_Common_54 , l ) + gGap);
    rot_transpose(_H52_Common_54_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H52_Common_55_var._position_absolute = coords_add(_H52_Common_54_var._position_absolute, tc2);
    tc1 = coords_sub(_H52_Common_54_var._position_absolute, _H52_Common_55_var._position_absolute);
    _H52_Common_55_var._position_relative = rot_apply(_H52_Common_55_var._rotation_absolute, tc1);
  } /* H52_Common_55=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H52_Common_55", _H52_Common_55_var._position_absolute, _H52_Common_55_var._rotation_absolute);
  instrument->_position_absolute[55] = _H52_Common_55_var._position_absolute;
  instrument->_position_relative[55] = _H52_Common_55_var._position_relative;
    _H52_Common_55_var._position_relative_is_zero =  coords_test_zero(_H52_Common_55_var._position_relative);
  instrument->counter_N[55]  = instrument->counter_P[55] = instrument->counter_P2[55] = 0;
  instrument->counter_AbsorbProp[55]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0054_H52_Common_55", _H52_Common_55_var._position_absolute, _H52_Common_55_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "w1", "NONE", "COMP_GETPAR ( H52_Common_54 , w2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "h1", "NONE", "COMP_GETPAR ( H52_Common_54 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "w2", "0", "COMP_GETPAR ( H52_Common_54 , w2 ) + 0.052 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "h2", "0", "COMP_GETPAR ( H52_Common_54 , h2 ) + 0.108 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "l", "NONE", "16.068 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "m", "1.0", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0054_H52_Common_55", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H52_Common_55_setpos */

/* component H52_Common_56=Guide_gravity() SETTING, POSITION/ROTATION */
int _H52_Common_56_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H52_Common_56_setpos] component H52_Common_56=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H52_Common_56_var._name, "H52_Common_56", 16384);
  stracpy(_H52_Common_56_var._type, "Guide_gravity", 16384);
  _H52_Common_56_var._index=56;
  int current_setpos_index = 56;
  _H52_Common_56_var._parameters.w1 = COMP_GETPAR ( H52_Common_55 , w2 );
  _H52_Common_56_var._parameters.h1 = COMP_GETPAR ( H52_Common_55 , h2 );
  _H52_Common_56_var._parameters.w2 = COMP_GETPAR ( H52_Common_55 , w2 ) + 0.052 / 16;
  _H52_Common_56_var._parameters.h2 = COMP_GETPAR ( H52_Common_55 , h2 ) + 0.108 / 16;
  _H52_Common_56_var._parameters.l = 16.068 / 16;
  _H52_Common_56_var._parameters.R0 = gR0;
  _H52_Common_56_var._parameters.Qc = gQc;
  _H52_Common_56_var._parameters.alpha = gAlpha;
  _H52_Common_56_var._parameters.m = 3;
  _H52_Common_56_var._parameters.W = gW;
  _H52_Common_56_var._parameters.nslit = 1;
  _H52_Common_56_var._parameters.d = 0.0005;
  _H52_Common_56_var._parameters.mleft = -1;
  _H52_Common_56_var._parameters.mright = -1;
  _H52_Common_56_var._parameters.mtop = -1;
  _H52_Common_56_var._parameters.mbottom = -1;
  _H52_Common_56_var._parameters.nhslit = 1;
  _H52_Common_56_var._parameters.G = 0;
  _H52_Common_56_var._parameters.aleft = -1;
  _H52_Common_56_var._parameters.aright = -1;
  _H52_Common_56_var._parameters.atop = -1;
  _H52_Common_56_var._parameters.abottom = -1;
  _H52_Common_56_var._parameters.wavy = 0;
  _H52_Common_56_var._parameters.wavy_z = 0;
  _H52_Common_56_var._parameters.wavy_tb = 0;
  _H52_Common_56_var._parameters.wavy_lr = 0;
  _H52_Common_56_var._parameters.chamfers = 0;
  _H52_Common_56_var._parameters.chamfers_z = 0;
  _H52_Common_56_var._parameters.chamfers_lr = 0;
  _H52_Common_56_var._parameters.chamfers_tb = 0;
  _H52_Common_56_var._parameters.nelements = 1;
  _H52_Common_56_var._parameters.nu = 0;
  _H52_Common_56_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Common_56_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Common_56_var._parameters.reflect[0]='\0';


  /* component H52_Common_56=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (16.068 / 16 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H52_Common_55_var._rotation_absolute, _H52_Common_56_var._rotation_absolute);
    rot_transpose(_H52_Common_55_var._rotation_absolute, tr1);
    rot_mul(_H52_Common_56_var._rotation_absolute, tr1, _H52_Common_56_var._rotation_relative);
    _H52_Common_56_var._rotation_is_identity =  rot_test_identity(_H52_Common_56_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H52_Common_55 , l ) + gGap);
    rot_transpose(_H52_Common_55_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H52_Common_56_var._position_absolute = coords_add(_H52_Common_55_var._position_absolute, tc2);
    tc1 = coords_sub(_H52_Common_55_var._position_absolute, _H52_Common_56_var._position_absolute);
    _H52_Common_56_var._position_relative = rot_apply(_H52_Common_56_var._rotation_absolute, tc1);
  } /* H52_Common_56=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H52_Common_56", _H52_Common_56_var._position_absolute, _H52_Common_56_var._rotation_absolute);
  instrument->_position_absolute[56] = _H52_Common_56_var._position_absolute;
  instrument->_position_relative[56] = _H52_Common_56_var._position_relative;
    _H52_Common_56_var._position_relative_is_zero =  coords_test_zero(_H52_Common_56_var._position_relative);
  instrument->counter_N[56]  = instrument->counter_P[56] = instrument->counter_P2[56] = 0;
  instrument->counter_AbsorbProp[56]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0055_H52_Common_56", _H52_Common_56_var._position_absolute, _H52_Common_56_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "w1", "NONE", "COMP_GETPAR ( H52_Common_55 , w2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "h1", "NONE", "COMP_GETPAR ( H52_Common_55 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "w2", "0", "COMP_GETPAR ( H52_Common_55 , w2 ) + 0.052 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "h2", "0", "COMP_GETPAR ( H52_Common_55 , h2 ) + 0.108 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "l", "NONE", "16.068 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "m", "1.0", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0055_H52_Common_56", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H52_Common_56_setpos */

/* component H52_Common_57=Guide_gravity() SETTING, POSITION/ROTATION */
int _H52_Common_57_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H52_Common_57_setpos] component H52_Common_57=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H52_Common_57_var._name, "H52_Common_57", 16384);
  stracpy(_H52_Common_57_var._type, "Guide_gravity", 16384);
  _H52_Common_57_var._index=57;
  int current_setpos_index = 57;
  _H52_Common_57_var._parameters.w1 = COMP_GETPAR ( H52_Common_56 , w2 );
  _H52_Common_57_var._parameters.h1 = COMP_GETPAR ( H52_Common_56 , h2 );
  _H52_Common_57_var._parameters.w2 = COMP_GETPAR ( H52_Common_56 , w2 ) + 0.052 / 16;
  _H52_Common_57_var._parameters.h2 = COMP_GETPAR ( H52_Common_56 , h2 ) + 0.108 / 16;
  _H52_Common_57_var._parameters.l = 16.068 / 16;
  _H52_Common_57_var._parameters.R0 = gR0;
  _H52_Common_57_var._parameters.Qc = gQc;
  _H52_Common_57_var._parameters.alpha = gAlpha;
  _H52_Common_57_var._parameters.m = 3;
  _H52_Common_57_var._parameters.W = gW;
  _H52_Common_57_var._parameters.nslit = 1;
  _H52_Common_57_var._parameters.d = 0.0005;
  _H52_Common_57_var._parameters.mleft = -1;
  _H52_Common_57_var._parameters.mright = -1;
  _H52_Common_57_var._parameters.mtop = -1;
  _H52_Common_57_var._parameters.mbottom = -1;
  _H52_Common_57_var._parameters.nhslit = 1;
  _H52_Common_57_var._parameters.G = 0;
  _H52_Common_57_var._parameters.aleft = -1;
  _H52_Common_57_var._parameters.aright = -1;
  _H52_Common_57_var._parameters.atop = -1;
  _H52_Common_57_var._parameters.abottom = -1;
  _H52_Common_57_var._parameters.wavy = 0;
  _H52_Common_57_var._parameters.wavy_z = 0;
  _H52_Common_57_var._parameters.wavy_tb = 0;
  _H52_Common_57_var._parameters.wavy_lr = 0;
  _H52_Common_57_var._parameters.chamfers = 0;
  _H52_Common_57_var._parameters.chamfers_z = 0;
  _H52_Common_57_var._parameters.chamfers_lr = 0;
  _H52_Common_57_var._parameters.chamfers_tb = 0;
  _H52_Common_57_var._parameters.nelements = 1;
  _H52_Common_57_var._parameters.nu = 0;
  _H52_Common_57_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Common_57_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Common_57_var._parameters.reflect[0]='\0';


  /* component H52_Common_57=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (16.068 / 16 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H52_Common_56_var._rotation_absolute, _H52_Common_57_var._rotation_absolute);
    rot_transpose(_H52_Common_56_var._rotation_absolute, tr1);
    rot_mul(_H52_Common_57_var._rotation_absolute, tr1, _H52_Common_57_var._rotation_relative);
    _H52_Common_57_var._rotation_is_identity =  rot_test_identity(_H52_Common_57_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H52_Common_56 , l ) + gGap);
    rot_transpose(_H52_Common_56_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H52_Common_57_var._position_absolute = coords_add(_H52_Common_56_var._position_absolute, tc2);
    tc1 = coords_sub(_H52_Common_56_var._position_absolute, _H52_Common_57_var._position_absolute);
    _H52_Common_57_var._position_relative = rot_apply(_H52_Common_57_var._rotation_absolute, tc1);
  } /* H52_Common_57=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H52_Common_57", _H52_Common_57_var._position_absolute, _H52_Common_57_var._rotation_absolute);
  instrument->_position_absolute[57] = _H52_Common_57_var._position_absolute;
  instrument->_position_relative[57] = _H52_Common_57_var._position_relative;
    _H52_Common_57_var._position_relative_is_zero =  coords_test_zero(_H52_Common_57_var._position_relative);
  instrument->counter_N[57]  = instrument->counter_P[57] = instrument->counter_P2[57] = 0;
  instrument->counter_AbsorbProp[57]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0056_H52_Common_57", _H52_Common_57_var._position_absolute, _H52_Common_57_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "w1", "NONE", "COMP_GETPAR ( H52_Common_56 , w2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "h1", "NONE", "COMP_GETPAR ( H52_Common_56 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "w2", "0", "COMP_GETPAR ( H52_Common_56 , w2 ) + 0.052 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "h2", "0", "COMP_GETPAR ( H52_Common_56 , h2 ) + 0.108 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "l", "NONE", "16.068 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "m", "1.0", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0056_H52_Common_57", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H52_Common_57_setpos */

/* component H52_Common_58=Guide_gravity() SETTING, POSITION/ROTATION */
int _H52_Common_58_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H52_Common_58_setpos] component H52_Common_58=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H52_Common_58_var._name, "H52_Common_58", 16384);
  stracpy(_H52_Common_58_var._type, "Guide_gravity", 16384);
  _H52_Common_58_var._index=58;
  int current_setpos_index = 58;
  _H52_Common_58_var._parameters.w1 = COMP_GETPAR ( H52_Common_57 , w2 );
  _H52_Common_58_var._parameters.h1 = COMP_GETPAR ( H52_Common_57 , h2 );
  _H52_Common_58_var._parameters.w2 = COMP_GETPAR ( H52_Common_57 , w2 ) + 0.052 / 16;
  _H52_Common_58_var._parameters.h2 = COMP_GETPAR ( H52_Common_57 , h2 ) + 0.108 / 16;
  _H52_Common_58_var._parameters.l = 16.068 / 16;
  _H52_Common_58_var._parameters.R0 = gR0;
  _H52_Common_58_var._parameters.Qc = gQc;
  _H52_Common_58_var._parameters.alpha = gAlpha;
  _H52_Common_58_var._parameters.m = 3;
  _H52_Common_58_var._parameters.W = gW;
  _H52_Common_58_var._parameters.nslit = 1;
  _H52_Common_58_var._parameters.d = 0.0005;
  _H52_Common_58_var._parameters.mleft = -1;
  _H52_Common_58_var._parameters.mright = -1;
  _H52_Common_58_var._parameters.mtop = -1;
  _H52_Common_58_var._parameters.mbottom = -1;
  _H52_Common_58_var._parameters.nhslit = 1;
  _H52_Common_58_var._parameters.G = 0;
  _H52_Common_58_var._parameters.aleft = -1;
  _H52_Common_58_var._parameters.aright = -1;
  _H52_Common_58_var._parameters.atop = -1;
  _H52_Common_58_var._parameters.abottom = -1;
  _H52_Common_58_var._parameters.wavy = 0;
  _H52_Common_58_var._parameters.wavy_z = 0;
  _H52_Common_58_var._parameters.wavy_tb = 0;
  _H52_Common_58_var._parameters.wavy_lr = 0;
  _H52_Common_58_var._parameters.chamfers = 0;
  _H52_Common_58_var._parameters.chamfers_z = 0;
  _H52_Common_58_var._parameters.chamfers_lr = 0;
  _H52_Common_58_var._parameters.chamfers_tb = 0;
  _H52_Common_58_var._parameters.nelements = 1;
  _H52_Common_58_var._parameters.nu = 0;
  _H52_Common_58_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Common_58_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Common_58_var._parameters.reflect[0]='\0';


  /* component H52_Common_58=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (16.068 / 16 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H52_Common_57_var._rotation_absolute, _H52_Common_58_var._rotation_absolute);
    rot_transpose(_H52_Common_57_var._rotation_absolute, tr1);
    rot_mul(_H52_Common_58_var._rotation_absolute, tr1, _H52_Common_58_var._rotation_relative);
    _H52_Common_58_var._rotation_is_identity =  rot_test_identity(_H52_Common_58_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H52_Common_57 , l ) + gGap);
    rot_transpose(_H52_Common_57_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H52_Common_58_var._position_absolute = coords_add(_H52_Common_57_var._position_absolute, tc2);
    tc1 = coords_sub(_H52_Common_57_var._position_absolute, _H52_Common_58_var._position_absolute);
    _H52_Common_58_var._position_relative = rot_apply(_H52_Common_58_var._rotation_absolute, tc1);
  } /* H52_Common_58=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H52_Common_58", _H52_Common_58_var._position_absolute, _H52_Common_58_var._rotation_absolute);
  instrument->_position_absolute[58] = _H52_Common_58_var._position_absolute;
  instrument->_position_relative[58] = _H52_Common_58_var._position_relative;
    _H52_Common_58_var._position_relative_is_zero =  coords_test_zero(_H52_Common_58_var._position_relative);
  instrument->counter_N[58]  = instrument->counter_P[58] = instrument->counter_P2[58] = 0;
  instrument->counter_AbsorbProp[58]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0057_H52_Common_58", _H52_Common_58_var._position_absolute, _H52_Common_58_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "w1", "NONE", "COMP_GETPAR ( H52_Common_57 , w2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "h1", "NONE", "COMP_GETPAR ( H52_Common_57 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "w2", "0", "COMP_GETPAR ( H52_Common_57 , w2 ) + 0.052 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "h2", "0", "COMP_GETPAR ( H52_Common_57 , h2 ) + 0.108 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "l", "NONE", "16.068 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "m", "1.0", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0057_H52_Common_58", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H52_Common_58_setpos */

/* component H52_Common_59=Guide_gravity() SETTING, POSITION/ROTATION */
int _H52_Common_59_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H52_Common_59_setpos] component H52_Common_59=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H52_Common_59_var._name, "H52_Common_59", 16384);
  stracpy(_H52_Common_59_var._type, "Guide_gravity", 16384);
  _H52_Common_59_var._index=59;
  int current_setpos_index = 59;
  _H52_Common_59_var._parameters.w1 = COMP_GETPAR ( H52_Common_58 , w2 );
  _H52_Common_59_var._parameters.h1 = COMP_GETPAR ( H52_Common_58 , h2 );
  _H52_Common_59_var._parameters.w2 = COMP_GETPAR ( H52_Common_58 , w2 ) + 0.052 / 16;
  _H52_Common_59_var._parameters.h2 = COMP_GETPAR ( H52_Common_58 , h2 ) + 0.108 / 16;
  _H52_Common_59_var._parameters.l = 16.068 / 16;
  _H52_Common_59_var._parameters.R0 = gR0;
  _H52_Common_59_var._parameters.Qc = gQc;
  _H52_Common_59_var._parameters.alpha = gAlpha;
  _H52_Common_59_var._parameters.m = 3;
  _H52_Common_59_var._parameters.W = gW;
  _H52_Common_59_var._parameters.nslit = 1;
  _H52_Common_59_var._parameters.d = 0.0005;
  _H52_Common_59_var._parameters.mleft = -1;
  _H52_Common_59_var._parameters.mright = -1;
  _H52_Common_59_var._parameters.mtop = -1;
  _H52_Common_59_var._parameters.mbottom = -1;
  _H52_Common_59_var._parameters.nhslit = 1;
  _H52_Common_59_var._parameters.G = 0;
  _H52_Common_59_var._parameters.aleft = -1;
  _H52_Common_59_var._parameters.aright = -1;
  _H52_Common_59_var._parameters.atop = -1;
  _H52_Common_59_var._parameters.abottom = -1;
  _H52_Common_59_var._parameters.wavy = 0;
  _H52_Common_59_var._parameters.wavy_z = 0;
  _H52_Common_59_var._parameters.wavy_tb = 0;
  _H52_Common_59_var._parameters.wavy_lr = 0;
  _H52_Common_59_var._parameters.chamfers = 0;
  _H52_Common_59_var._parameters.chamfers_z = 0;
  _H52_Common_59_var._parameters.chamfers_lr = 0;
  _H52_Common_59_var._parameters.chamfers_tb = 0;
  _H52_Common_59_var._parameters.nelements = 1;
  _H52_Common_59_var._parameters.nu = 0;
  _H52_Common_59_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Common_59_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Common_59_var._parameters.reflect[0]='\0';


  /* component H52_Common_59=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (16.068 / 16 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H52_Common_58_var._rotation_absolute, _H52_Common_59_var._rotation_absolute);
    rot_transpose(_H52_Common_58_var._rotation_absolute, tr1);
    rot_mul(_H52_Common_59_var._rotation_absolute, tr1, _H52_Common_59_var._rotation_relative);
    _H52_Common_59_var._rotation_is_identity =  rot_test_identity(_H52_Common_59_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H52_Common_58 , l ) + gGap);
    rot_transpose(_H52_Common_58_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H52_Common_59_var._position_absolute = coords_add(_H52_Common_58_var._position_absolute, tc2);
    tc1 = coords_sub(_H52_Common_58_var._position_absolute, _H52_Common_59_var._position_absolute);
    _H52_Common_59_var._position_relative = rot_apply(_H52_Common_59_var._rotation_absolute, tc1);
  } /* H52_Common_59=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H52_Common_59", _H52_Common_59_var._position_absolute, _H52_Common_59_var._rotation_absolute);
  instrument->_position_absolute[59] = _H52_Common_59_var._position_absolute;
  instrument->_position_relative[59] = _H52_Common_59_var._position_relative;
    _H52_Common_59_var._position_relative_is_zero =  coords_test_zero(_H52_Common_59_var._position_relative);
  instrument->counter_N[59]  = instrument->counter_P[59] = instrument->counter_P2[59] = 0;
  instrument->counter_AbsorbProp[59]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0058_H52_Common_59", _H52_Common_59_var._position_absolute, _H52_Common_59_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "w1", "NONE", "COMP_GETPAR ( H52_Common_58 , w2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "h1", "NONE", "COMP_GETPAR ( H52_Common_58 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "w2", "0", "COMP_GETPAR ( H52_Common_58 , w2 ) + 0.052 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "h2", "0", "COMP_GETPAR ( H52_Common_58 , h2 ) + 0.108 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "l", "NONE", "16.068 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "m", "1.0", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0058_H52_Common_59", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H52_Common_59_setpos */

/* component H52_Common_60=Guide_gravity() SETTING, POSITION/ROTATION */
int _H52_Common_60_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H52_Common_60_setpos] component H52_Common_60=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H52_Common_60_var._name, "H52_Common_60", 16384);
  stracpy(_H52_Common_60_var._type, "Guide_gravity", 16384);
  _H52_Common_60_var._index=60;
  int current_setpos_index = 60;
  _H52_Common_60_var._parameters.w1 = COMP_GETPAR ( H52_Common_59 , w2 );
  _H52_Common_60_var._parameters.h1 = COMP_GETPAR ( H52_Common_59 , h2 );
  _H52_Common_60_var._parameters.w2 = COMP_GETPAR ( H52_Common_59 , w2 ) + 0.052 / 16;
  _H52_Common_60_var._parameters.h2 = COMP_GETPAR ( H52_Common_59 , h2 ) + 0.108 / 16;
  _H52_Common_60_var._parameters.l = 16.068 / 16;
  _H52_Common_60_var._parameters.R0 = gR0;
  _H52_Common_60_var._parameters.Qc = gQc;
  _H52_Common_60_var._parameters.alpha = gAlpha;
  _H52_Common_60_var._parameters.m = 3;
  _H52_Common_60_var._parameters.W = gW;
  _H52_Common_60_var._parameters.nslit = 1;
  _H52_Common_60_var._parameters.d = 0.0005;
  _H52_Common_60_var._parameters.mleft = -1;
  _H52_Common_60_var._parameters.mright = -1;
  _H52_Common_60_var._parameters.mtop = -1;
  _H52_Common_60_var._parameters.mbottom = -1;
  _H52_Common_60_var._parameters.nhslit = 1;
  _H52_Common_60_var._parameters.G = 0;
  _H52_Common_60_var._parameters.aleft = -1;
  _H52_Common_60_var._parameters.aright = -1;
  _H52_Common_60_var._parameters.atop = -1;
  _H52_Common_60_var._parameters.abottom = -1;
  _H52_Common_60_var._parameters.wavy = 0;
  _H52_Common_60_var._parameters.wavy_z = 0;
  _H52_Common_60_var._parameters.wavy_tb = 0;
  _H52_Common_60_var._parameters.wavy_lr = 0;
  _H52_Common_60_var._parameters.chamfers = 0;
  _H52_Common_60_var._parameters.chamfers_z = 0;
  _H52_Common_60_var._parameters.chamfers_lr = 0;
  _H52_Common_60_var._parameters.chamfers_tb = 0;
  _H52_Common_60_var._parameters.nelements = 1;
  _H52_Common_60_var._parameters.nu = 0;
  _H52_Common_60_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Common_60_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Common_60_var._parameters.reflect[0]='\0';


  /* component H52_Common_60=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (16.068 / 16 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H52_Common_59_var._rotation_absolute, _H52_Common_60_var._rotation_absolute);
    rot_transpose(_H52_Common_59_var._rotation_absolute, tr1);
    rot_mul(_H52_Common_60_var._rotation_absolute, tr1, _H52_Common_60_var._rotation_relative);
    _H52_Common_60_var._rotation_is_identity =  rot_test_identity(_H52_Common_60_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H52_Common_59 , l ) + gGap);
    rot_transpose(_H52_Common_59_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H52_Common_60_var._position_absolute = coords_add(_H52_Common_59_var._position_absolute, tc2);
    tc1 = coords_sub(_H52_Common_59_var._position_absolute, _H52_Common_60_var._position_absolute);
    _H52_Common_60_var._position_relative = rot_apply(_H52_Common_60_var._rotation_absolute, tc1);
  } /* H52_Common_60=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H52_Common_60", _H52_Common_60_var._position_absolute, _H52_Common_60_var._rotation_absolute);
  instrument->_position_absolute[60] = _H52_Common_60_var._position_absolute;
  instrument->_position_relative[60] = _H52_Common_60_var._position_relative;
    _H52_Common_60_var._position_relative_is_zero =  coords_test_zero(_H52_Common_60_var._position_relative);
  instrument->counter_N[60]  = instrument->counter_P[60] = instrument->counter_P2[60] = 0;
  instrument->counter_AbsorbProp[60]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0059_H52_Common_60", _H52_Common_60_var._position_absolute, _H52_Common_60_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "w1", "NONE", "COMP_GETPAR ( H52_Common_59 , w2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "h1", "NONE", "COMP_GETPAR ( H52_Common_59 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "w2", "0", "COMP_GETPAR ( H52_Common_59 , w2 ) + 0.052 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "h2", "0", "COMP_GETPAR ( H52_Common_59 , h2 ) + 0.108 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "l", "NONE", "16.068 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "m", "1.0", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0059_H52_Common_60", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H52_Common_60_setpos */

/* component H52_Common_61=Guide_gravity() SETTING, POSITION/ROTATION */
int _H52_Common_61_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H52_Common_61_setpos] component H52_Common_61=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H52_Common_61_var._name, "H52_Common_61", 16384);
  stracpy(_H52_Common_61_var._type, "Guide_gravity", 16384);
  _H52_Common_61_var._index=61;
  int current_setpos_index = 61;
  _H52_Common_61_var._parameters.w1 = COMP_GETPAR ( H52_Common_60 , w2 );
  _H52_Common_61_var._parameters.h1 = COMP_GETPAR ( H52_Common_60 , h2 );
  _H52_Common_61_var._parameters.w2 = COMP_GETPAR ( H52_Common_60 , w2 ) + 0.052 / 16;
  _H52_Common_61_var._parameters.h2 = COMP_GETPAR ( H52_Common_60 , h2 ) + 0.108 / 16;
  _H52_Common_61_var._parameters.l = 16.068 / 16;
  _H52_Common_61_var._parameters.R0 = gR0;
  _H52_Common_61_var._parameters.Qc = gQc;
  _H52_Common_61_var._parameters.alpha = gAlpha;
  _H52_Common_61_var._parameters.m = 3;
  _H52_Common_61_var._parameters.W = gW;
  _H52_Common_61_var._parameters.nslit = 1;
  _H52_Common_61_var._parameters.d = 0.0005;
  _H52_Common_61_var._parameters.mleft = -1;
  _H52_Common_61_var._parameters.mright = -1;
  _H52_Common_61_var._parameters.mtop = -1;
  _H52_Common_61_var._parameters.mbottom = -1;
  _H52_Common_61_var._parameters.nhslit = 1;
  _H52_Common_61_var._parameters.G = 0;
  _H52_Common_61_var._parameters.aleft = -1;
  _H52_Common_61_var._parameters.aright = -1;
  _H52_Common_61_var._parameters.atop = -1;
  _H52_Common_61_var._parameters.abottom = -1;
  _H52_Common_61_var._parameters.wavy = 0;
  _H52_Common_61_var._parameters.wavy_z = 0;
  _H52_Common_61_var._parameters.wavy_tb = 0;
  _H52_Common_61_var._parameters.wavy_lr = 0;
  _H52_Common_61_var._parameters.chamfers = 0;
  _H52_Common_61_var._parameters.chamfers_z = 0;
  _H52_Common_61_var._parameters.chamfers_lr = 0;
  _H52_Common_61_var._parameters.chamfers_tb = 0;
  _H52_Common_61_var._parameters.nelements = 1;
  _H52_Common_61_var._parameters.nu = 0;
  _H52_Common_61_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Common_61_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Common_61_var._parameters.reflect[0]='\0';


  /* component H52_Common_61=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (16.068 / 16 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H52_Common_60_var._rotation_absolute, _H52_Common_61_var._rotation_absolute);
    rot_transpose(_H52_Common_60_var._rotation_absolute, tr1);
    rot_mul(_H52_Common_61_var._rotation_absolute, tr1, _H52_Common_61_var._rotation_relative);
    _H52_Common_61_var._rotation_is_identity =  rot_test_identity(_H52_Common_61_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H52_Common_60 , l ) + gGap);
    rot_transpose(_H52_Common_60_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H52_Common_61_var._position_absolute = coords_add(_H52_Common_60_var._position_absolute, tc2);
    tc1 = coords_sub(_H52_Common_60_var._position_absolute, _H52_Common_61_var._position_absolute);
    _H52_Common_61_var._position_relative = rot_apply(_H52_Common_61_var._rotation_absolute, tc1);
  } /* H52_Common_61=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H52_Common_61", _H52_Common_61_var._position_absolute, _H52_Common_61_var._rotation_absolute);
  instrument->_position_absolute[61] = _H52_Common_61_var._position_absolute;
  instrument->_position_relative[61] = _H52_Common_61_var._position_relative;
    _H52_Common_61_var._position_relative_is_zero =  coords_test_zero(_H52_Common_61_var._position_relative);
  instrument->counter_N[61]  = instrument->counter_P[61] = instrument->counter_P2[61] = 0;
  instrument->counter_AbsorbProp[61]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0060_H52_Common_61", _H52_Common_61_var._position_absolute, _H52_Common_61_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "w1", "NONE", "COMP_GETPAR ( H52_Common_60 , w2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "h1", "NONE", "COMP_GETPAR ( H52_Common_60 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "w2", "0", "COMP_GETPAR ( H52_Common_60 , w2 ) + 0.052 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "h2", "0", "COMP_GETPAR ( H52_Common_60 , h2 ) + 0.108 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "l", "NONE", "16.068 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "m", "1.0", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0060_H52_Common_61", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H52_Common_61_setpos */

/* component H52_Common_62=Guide_gravity() SETTING, POSITION/ROTATION */
int _H52_Common_62_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H52_Common_62_setpos] component H52_Common_62=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H52_Common_62_var._name, "H52_Common_62", 16384);
  stracpy(_H52_Common_62_var._type, "Guide_gravity", 16384);
  _H52_Common_62_var._index=62;
  int current_setpos_index = 62;
  _H52_Common_62_var._parameters.w1 = COMP_GETPAR ( H52_Common_61 , w2 );
  _H52_Common_62_var._parameters.h1 = COMP_GETPAR ( H52_Common_61 , h2 );
  _H52_Common_62_var._parameters.w2 = COMP_GETPAR ( H52_Common_61 , w2 ) + 0.052 / 16;
  _H52_Common_62_var._parameters.h2 = COMP_GETPAR ( H52_Common_61 , h2 ) + 0.108 / 16;
  _H52_Common_62_var._parameters.l = 16.068 / 16;
  _H52_Common_62_var._parameters.R0 = gR0;
  _H52_Common_62_var._parameters.Qc = gQc;
  _H52_Common_62_var._parameters.alpha = gAlpha;
  _H52_Common_62_var._parameters.m = 3;
  _H52_Common_62_var._parameters.W = gW;
  _H52_Common_62_var._parameters.nslit = 1;
  _H52_Common_62_var._parameters.d = 0.0005;
  _H52_Common_62_var._parameters.mleft = -1;
  _H52_Common_62_var._parameters.mright = -1;
  _H52_Common_62_var._parameters.mtop = -1;
  _H52_Common_62_var._parameters.mbottom = -1;
  _H52_Common_62_var._parameters.nhslit = 1;
  _H52_Common_62_var._parameters.G = 0;
  _H52_Common_62_var._parameters.aleft = -1;
  _H52_Common_62_var._parameters.aright = -1;
  _H52_Common_62_var._parameters.atop = -1;
  _H52_Common_62_var._parameters.abottom = -1;
  _H52_Common_62_var._parameters.wavy = 0;
  _H52_Common_62_var._parameters.wavy_z = 0;
  _H52_Common_62_var._parameters.wavy_tb = 0;
  _H52_Common_62_var._parameters.wavy_lr = 0;
  _H52_Common_62_var._parameters.chamfers = 0;
  _H52_Common_62_var._parameters.chamfers_z = 0;
  _H52_Common_62_var._parameters.chamfers_lr = 0;
  _H52_Common_62_var._parameters.chamfers_tb = 0;
  _H52_Common_62_var._parameters.nelements = 1;
  _H52_Common_62_var._parameters.nu = 0;
  _H52_Common_62_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Common_62_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Common_62_var._parameters.reflect[0]='\0';


  /* component H52_Common_62=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (16.068 / 16 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H52_Common_61_var._rotation_absolute, _H52_Common_62_var._rotation_absolute);
    rot_transpose(_H52_Common_61_var._rotation_absolute, tr1);
    rot_mul(_H52_Common_62_var._rotation_absolute, tr1, _H52_Common_62_var._rotation_relative);
    _H52_Common_62_var._rotation_is_identity =  rot_test_identity(_H52_Common_62_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H52_Common_61 , l ) + gGap);
    rot_transpose(_H52_Common_61_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H52_Common_62_var._position_absolute = coords_add(_H52_Common_61_var._position_absolute, tc2);
    tc1 = coords_sub(_H52_Common_61_var._position_absolute, _H52_Common_62_var._position_absolute);
    _H52_Common_62_var._position_relative = rot_apply(_H52_Common_62_var._rotation_absolute, tc1);
  } /* H52_Common_62=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H52_Common_62", _H52_Common_62_var._position_absolute, _H52_Common_62_var._rotation_absolute);
  instrument->_position_absolute[62] = _H52_Common_62_var._position_absolute;
  instrument->_position_relative[62] = _H52_Common_62_var._position_relative;
    _H52_Common_62_var._position_relative_is_zero =  coords_test_zero(_H52_Common_62_var._position_relative);
  instrument->counter_N[62]  = instrument->counter_P[62] = instrument->counter_P2[62] = 0;
  instrument->counter_AbsorbProp[62]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0061_H52_Common_62", _H52_Common_62_var._position_absolute, _H52_Common_62_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "w1", "NONE", "COMP_GETPAR ( H52_Common_61 , w2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "h1", "NONE", "COMP_GETPAR ( H52_Common_61 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "w2", "0", "COMP_GETPAR ( H52_Common_61 , w2 ) + 0.052 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "h2", "0", "COMP_GETPAR ( H52_Common_61 , h2 ) + 0.108 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "l", "NONE", "16.068 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "m", "1.0", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0061_H52_Common_62", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H52_Common_62_setpos */

/* component H52_Common_63=Guide_gravity() SETTING, POSITION/ROTATION */
int _H52_Common_63_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H52_Common_63_setpos] component H52_Common_63=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H52_Common_63_var._name, "H52_Common_63", 16384);
  stracpy(_H52_Common_63_var._type, "Guide_gravity", 16384);
  _H52_Common_63_var._index=63;
  int current_setpos_index = 63;
  _H52_Common_63_var._parameters.w1 = COMP_GETPAR ( H52_Common_62 , w2 );
  _H52_Common_63_var._parameters.h1 = COMP_GETPAR ( H52_Common_62 , h2 );
  _H52_Common_63_var._parameters.w2 = COMP_GETPAR ( H52_Common_62 , w2 ) + 0.052 / 16;
  _H52_Common_63_var._parameters.h2 = COMP_GETPAR ( H52_Common_62 , h2 ) + 0.108 / 16;
  _H52_Common_63_var._parameters.l = 16.068 / 16;
  _H52_Common_63_var._parameters.R0 = gR0;
  _H52_Common_63_var._parameters.Qc = gQc;
  _H52_Common_63_var._parameters.alpha = gAlpha;
  _H52_Common_63_var._parameters.m = 3;
  _H52_Common_63_var._parameters.W = gW;
  _H52_Common_63_var._parameters.nslit = 1;
  _H52_Common_63_var._parameters.d = 0.0005;
  _H52_Common_63_var._parameters.mleft = -1;
  _H52_Common_63_var._parameters.mright = -1;
  _H52_Common_63_var._parameters.mtop = -1;
  _H52_Common_63_var._parameters.mbottom = -1;
  _H52_Common_63_var._parameters.nhslit = 1;
  _H52_Common_63_var._parameters.G = 0;
  _H52_Common_63_var._parameters.aleft = -1;
  _H52_Common_63_var._parameters.aright = -1;
  _H52_Common_63_var._parameters.atop = -1;
  _H52_Common_63_var._parameters.abottom = -1;
  _H52_Common_63_var._parameters.wavy = 0;
  _H52_Common_63_var._parameters.wavy_z = 0;
  _H52_Common_63_var._parameters.wavy_tb = 0;
  _H52_Common_63_var._parameters.wavy_lr = 0;
  _H52_Common_63_var._parameters.chamfers = 0;
  _H52_Common_63_var._parameters.chamfers_z = 0;
  _H52_Common_63_var._parameters.chamfers_lr = 0;
  _H52_Common_63_var._parameters.chamfers_tb = 0;
  _H52_Common_63_var._parameters.nelements = 1;
  _H52_Common_63_var._parameters.nu = 0;
  _H52_Common_63_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Common_63_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Common_63_var._parameters.reflect[0]='\0';


  /* component H52_Common_63=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (16.068 / 16 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H52_Common_62_var._rotation_absolute, _H52_Common_63_var._rotation_absolute);
    rot_transpose(_H52_Common_62_var._rotation_absolute, tr1);
    rot_mul(_H52_Common_63_var._rotation_absolute, tr1, _H52_Common_63_var._rotation_relative);
    _H52_Common_63_var._rotation_is_identity =  rot_test_identity(_H52_Common_63_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H52_Common_62 , l ) + gGap);
    rot_transpose(_H52_Common_62_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H52_Common_63_var._position_absolute = coords_add(_H52_Common_62_var._position_absolute, tc2);
    tc1 = coords_sub(_H52_Common_62_var._position_absolute, _H52_Common_63_var._position_absolute);
    _H52_Common_63_var._position_relative = rot_apply(_H52_Common_63_var._rotation_absolute, tc1);
  } /* H52_Common_63=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H52_Common_63", _H52_Common_63_var._position_absolute, _H52_Common_63_var._rotation_absolute);
  instrument->_position_absolute[63] = _H52_Common_63_var._position_absolute;
  instrument->_position_relative[63] = _H52_Common_63_var._position_relative;
    _H52_Common_63_var._position_relative_is_zero =  coords_test_zero(_H52_Common_63_var._position_relative);
  instrument->counter_N[63]  = instrument->counter_P[63] = instrument->counter_P2[63] = 0;
  instrument->counter_AbsorbProp[63]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0062_H52_Common_63", _H52_Common_63_var._position_absolute, _H52_Common_63_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "w1", "NONE", "COMP_GETPAR ( H52_Common_62 , w2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "h1", "NONE", "COMP_GETPAR ( H52_Common_62 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "w2", "0", "COMP_GETPAR ( H52_Common_62 , w2 ) + 0.052 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "h2", "0", "COMP_GETPAR ( H52_Common_62 , h2 ) + 0.108 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "l", "NONE", "16.068 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "m", "1.0", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0062_H52_Common_63", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H52_Common_63_setpos */

/* component HCS_Al_64=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_64_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_64_setpos] component HCS_Al_64=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_64_var._name, "HCS_Al_64", 16384);
  stracpy(_HCS_Al_64_var._type, "PowderN", 16384);
  _HCS_Al_64_var._index=64;
  int current_setpos_index = 64;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_64_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_64_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_64_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_64_var._parameters.geometry[0]='\0';
  _HCS_Al_64_var._parameters.format[0] = 0;
  _HCS_Al_64_var._parameters.format[1] = 0;
  _HCS_Al_64_var._parameters.format[2] = 0;
  _HCS_Al_64_var._parameters.format[3] = 0;
  _HCS_Al_64_var._parameters.format[4] = 0;
  _HCS_Al_64_var._parameters.format[5] = 0;
  _HCS_Al_64_var._parameters.format[6] = 0;
  _HCS_Al_64_var._parameters.format[7] = 0;
  _HCS_Al_64_var._parameters.format[8] = 0;
  _HCS_Al_64_var._parameters.radius = 0;
  _HCS_Al_64_var._parameters.yheight = 0.24;
  _HCS_Al_64_var._parameters.xwidth = 0.12;
  _HCS_Al_64_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_64_var._parameters.thickness = 0;
  _HCS_Al_64_var._parameters.pack = 1;
  _HCS_Al_64_var._parameters.Vc = 0;
  _HCS_Al_64_var._parameters.sigma_abs = 0;
  _HCS_Al_64_var._parameters.sigma_inc = 0;
  _HCS_Al_64_var._parameters.delta_d_d = 0;
  _HCS_Al_64_var._parameters.p_inc = 0.005;
  _HCS_Al_64_var._parameters.p_transmit = 0.9450;
  _HCS_Al_64_var._parameters.DW = 0;
  _HCS_Al_64_var._parameters.nb_atoms = 1;
  _HCS_Al_64_var._parameters.d_omega = 0;
  _HCS_Al_64_var._parameters.d_phi = 10;
  _HCS_Al_64_var._parameters.tth_sign = 0;
  _HCS_Al_64_var._parameters.p_interact = 0.05;
  _HCS_Al_64_var._parameters.concentric = 0;
  _HCS_Al_64_var._parameters.density = 0;
  _HCS_Al_64_var._parameters.weight = 0;
  _HCS_Al_64_var._parameters.barns = 1;
  _HCS_Al_64_var._parameters.Strain = 0;
  _HCS_Al_64_var._parameters.focus_flip = 0;
  _HCS_Al_64_var._parameters.target_index = 0;
  _HCS_Al_64_var._parameters.order = 1;


  /* component HCS_Al_64=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H52_Common_63_var._rotation_absolute, _HCS_Al_64_var._rotation_absolute);
    rot_transpose(_H52_Common_63_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_64_var._rotation_absolute, tr1, _HCS_Al_64_var._rotation_relative);
    _HCS_Al_64_var._rotation_is_identity =  rot_test_identity(_HCS_Al_64_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H52_Common_63 , l ) + gGap);
    rot_transpose(_H52_Common_63_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_64_var._position_absolute = coords_add(_H52_Common_63_var._position_absolute, tc2);
    tc1 = coords_sub(_H52_Common_63_var._position_absolute, _HCS_Al_64_var._position_absolute);
    _HCS_Al_64_var._position_relative = rot_apply(_HCS_Al_64_var._rotation_absolute, tc1);
  } /* HCS_Al_64=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_64", _HCS_Al_64_var._position_absolute, _HCS_Al_64_var._rotation_absolute);
  instrument->_position_absolute[64] = _HCS_Al_64_var._position_absolute;
  instrument->_position_relative[64] = _HCS_Al_64_var._position_relative;
    _HCS_Al_64_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_64_var._position_relative);
  instrument->counter_N[64]  = instrument->counter_P[64] = instrument->counter_P2[64] = 0;
  instrument->counter_AbsorbProp[64]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0063_HCS_Al_64", _HCS_Al_64_var._position_absolute, _HCS_Al_64_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "yheight", "0", "0.24","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "xwidth", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0063_HCS_Al_64", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_64_setpos */

/* component H52_Common_Out=Monitor_nD() SETTING, POSITION/ROTATION */
int _H52_Common_Out_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H52_Common_Out_setpos] component H52_Common_Out=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H52_Common_Out_var._name, "H52_Common_Out", 16384);
  stracpy(_H52_Common_Out_var._type, "Monitor_nD", 16384);
  _H52_Common_Out_var._index=65;
  int current_setpos_index = 65;
  if("" && strlen(""))
    stracpy(_H52_Common_Out_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H52_Common_Out_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H52_Common_Out_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H52_Common_Out_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H52_Common_Out_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H52_Common_Out_var._parameters.user3[0]='\0';
  _H52_Common_Out_var._parameters.xwidth = 0.120;
  _H52_Common_Out_var._parameters.yheight = 0.240;
  _H52_Common_Out_var._parameters.zdepth = 0;
  _H52_Common_Out_var._parameters.xmin = 0;
  _H52_Common_Out_var._parameters.xmax = 0;
  _H52_Common_Out_var._parameters.ymin = 0;
  _H52_Common_Out_var._parameters.ymax = 0;
  _H52_Common_Out_var._parameters.zmin = 0;
  _H52_Common_Out_var._parameters.zmax = 0;
  _H52_Common_Out_var._parameters.bins = 0;
  _H52_Common_Out_var._parameters.min = -1e40;
  _H52_Common_Out_var._parameters.max = 1e40;
  _H52_Common_Out_var._parameters.restore_neutron = 0;
  _H52_Common_Out_var._parameters.radius = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Common_Out_var._parameters.options, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Common_Out_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Common_Out_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Common_Out_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Common_Out_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Common_Out_var._parameters.geometry[0]='\0';
  _H52_Common_Out_var._parameters.nowritefile = 0;
  _H52_Common_Out_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Common_Out_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Common_Out_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Common_Out_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Common_Out_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H52_Common_Out_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H52_Common_Out_var._parameters.username3[0]='\0';


  /* component H52_Common_Out=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_64_var._rotation_absolute, _H52_Common_Out_var._rotation_absolute);
    rot_transpose(_HCS_Al_64_var._rotation_absolute, tr1);
    rot_mul(_H52_Common_Out_var._rotation_absolute, tr1, _H52_Common_Out_var._rotation_relative);
    _H52_Common_Out_var._rotation_is_identity =  rot_test_identity(_H52_Common_Out_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.01 + gGap);
    rot_transpose(_HCS_Al_64_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H52_Common_Out_var._position_absolute = coords_add(_HCS_Al_64_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_64_var._position_absolute, _H52_Common_Out_var._position_absolute);
    _H52_Common_Out_var._position_relative = rot_apply(_H52_Common_Out_var._rotation_absolute, tc1);
  } /* H52_Common_Out=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H52_Common_Out", _H52_Common_Out_var._position_absolute, _H52_Common_Out_var._rotation_absolute);
  instrument->_position_absolute[65] = _H52_Common_Out_var._position_absolute;
  instrument->_position_relative[65] = _H52_Common_Out_var._position_relative;
    _H52_Common_Out_var._position_relative_is_zero =  coords_test_zero(_H52_Common_Out_var._position_relative);
  instrument->counter_N[65]  = instrument->counter_P[65] = instrument->counter_P2[65] = 0;
  instrument->counter_AbsorbProp[65]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0064_H52_Common_Out", _H52_Common_Out_var._position_absolute, _H52_Common_Out_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "xwidth", "0", "0.120","MCNUM");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "yheight", "0", "0.240","MCNUM");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "restore_neutron", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "options", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0064_H52_Common_Out", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H52_Common_Out_setpos */

/* component H523_origin=Monitor_nD() SETTING, POSITION/ROTATION */
int _H523_origin_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_origin_setpos] component H523_origin=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H523_origin_var._name, "H523_origin", 16384);
  stracpy(_H523_origin_var._type, "Monitor_nD", 16384);
  _H523_origin_var._index=66;
  int current_setpos_index = 66;
  if("" && strlen(""))
    stracpy(_H523_origin_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H523_origin_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H523_origin_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H523_origin_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H523_origin_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H523_origin_var._parameters.user3[0]='\0';
  _H523_origin_var._parameters.xwidth = 0.06;
  _H523_origin_var._parameters.yheight = 0.120;
  _H523_origin_var._parameters.zdepth = 0;
  _H523_origin_var._parameters.xmin = 0;
  _H523_origin_var._parameters.xmax = 0;
  _H523_origin_var._parameters.ymin = 0;
  _H523_origin_var._parameters.ymax = 0;
  _H523_origin_var._parameters.zmin = 0;
  _H523_origin_var._parameters.zmax = 0;
  _H523_origin_var._parameters.bins = 25;
  _H523_origin_var._parameters.min = -1e40;
  _H523_origin_var._parameters.max = 1e40;
  _H523_origin_var._parameters.restore_neutron = 1;
  _H523_origin_var._parameters.radius = 0;
  if("dx limits=[-2 2] dy limits=[-2 2] " && strlen("dx limits=[-2 2] dy limits=[-2 2] "))
    stracpy(_H523_origin_var._parameters.options, "dx limits=[-2 2] dy limits=[-2 2] " ? "dx limits=[-2 2] dy limits=[-2 2] " : "", 16384);
  else 
  _H523_origin_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_origin_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_origin_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_origin_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_origin_var._parameters.geometry[0]='\0';
  _H523_origin_var._parameters.nowritefile = 0;
  _H523_origin_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_origin_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_origin_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_origin_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_origin_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_origin_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_origin_var._parameters.username3[0]='\0';


  /* component H523_origin=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H52_Common_Out_var._rotation_absolute, _H523_origin_var._rotation_absolute);
    rot_transpose(_H52_Common_Out_var._rotation_absolute, tr1);
    rot_mul(_H523_origin_var._rotation_absolute, tr1, _H523_origin_var._rotation_relative);
    _H523_origin_var._rotation_is_identity =  rot_test_identity(_H523_origin_var._rotation_relative);
    tc1 = coords_set(
      0.03, -.06, 0);
    rot_transpose(_H52_Common_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_origin_var._position_absolute = coords_add(_H52_Common_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H52_Common_Out_var._position_absolute, _H523_origin_var._position_absolute);
    _H523_origin_var._position_relative = rot_apply(_H523_origin_var._rotation_absolute, tc1);
  } /* H523_origin=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H523_origin", _H523_origin_var._position_absolute, _H523_origin_var._rotation_absolute);
  instrument->_position_absolute[66] = _H523_origin_var._position_absolute;
  instrument->_position_relative[66] = _H523_origin_var._position_relative;
    _H523_origin_var._position_relative_is_zero =  coords_test_zero(_H523_origin_var._position_relative);
  instrument->counter_N[66]  = instrument->counter_P[66] = instrument->counter_P2[66] = 0;
  instrument->counter_AbsorbProp[66]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0065_H523_origin", _H523_origin_var._position_absolute, _H523_origin_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "yheight", "0", "0.120","MCNUM");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "bins", "0", "25","int");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "options", "NULL", "dx limits=[-2 2] dy limits=[-2 2] ", "char*");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0065_H523_origin", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_origin_setpos */

/* component H521_origin=Monitor_nD() SETTING, POSITION/ROTATION */
int _H521_origin_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_origin_setpos] component H521_origin=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H521_origin_var._name, "H521_origin", 16384);
  stracpy(_H521_origin_var._type, "Monitor_nD", 16384);
  _H521_origin_var._index=67;
  int current_setpos_index = 67;
  if("" && strlen(""))
    stracpy(_H521_origin_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H521_origin_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_origin_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H521_origin_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_origin_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H521_origin_var._parameters.user3[0]='\0';
  _H521_origin_var._parameters.xwidth = 0.06;
  _H521_origin_var._parameters.yheight = 0.120;
  _H521_origin_var._parameters.zdepth = 0;
  _H521_origin_var._parameters.xmin = 0;
  _H521_origin_var._parameters.xmax = 0;
  _H521_origin_var._parameters.ymin = 0;
  _H521_origin_var._parameters.ymax = 0;
  _H521_origin_var._parameters.zmin = 0;
  _H521_origin_var._parameters.zmax = 0;
  _H521_origin_var._parameters.bins = 25;
  _H521_origin_var._parameters.min = -1e40;
  _H521_origin_var._parameters.max = 1e40;
  _H521_origin_var._parameters.restore_neutron = 1;
  _H521_origin_var._parameters.radius = 0;
  if("dx limits=[-2 2] dy limits=[-2 2] " && strlen("dx limits=[-2 2] dy limits=[-2 2] "))
    stracpy(_H521_origin_var._parameters.options, "dx limits=[-2 2] dy limits=[-2 2] " ? "dx limits=[-2 2] dy limits=[-2 2] " : "", 16384);
  else 
  _H521_origin_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_origin_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_origin_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_origin_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_origin_var._parameters.geometry[0]='\0';
  _H521_origin_var._parameters.nowritefile = 0;
  _H521_origin_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_origin_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_origin_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_origin_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_origin_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_origin_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_origin_var._parameters.username3[0]='\0';


  /* component H521_origin=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H52_Common_Out_var._rotation_absolute, _H521_origin_var._rotation_absolute);
    rot_transpose(_H523_origin_var._rotation_absolute, tr1);
    rot_mul(_H521_origin_var._rotation_absolute, tr1, _H521_origin_var._rotation_relative);
    _H521_origin_var._rotation_is_identity =  rot_test_identity(_H521_origin_var._rotation_relative);
    tc1 = coords_set(
      -0.03, -.06, 0);
    rot_transpose(_H52_Common_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_origin_var._position_absolute = coords_add(_H52_Common_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_origin_var._position_absolute, _H521_origin_var._position_absolute);
    _H521_origin_var._position_relative = rot_apply(_H521_origin_var._rotation_absolute, tc1);
  } /* H521_origin=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H521_origin", _H521_origin_var._position_absolute, _H521_origin_var._rotation_absolute);
  instrument->_position_absolute[67] = _H521_origin_var._position_absolute;
  instrument->_position_relative[67] = _H521_origin_var._position_relative;
    _H521_origin_var._position_relative_is_zero =  coords_test_zero(_H521_origin_var._position_relative);
  instrument->counter_N[67]  = instrument->counter_P[67] = instrument->counter_P2[67] = 0;
  instrument->counter_AbsorbProp[67]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0066_H521_origin", _H521_origin_var._position_absolute, _H521_origin_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "yheight", "0", "0.120","MCNUM");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "bins", "0", "25","int");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "options", "NULL", "dx limits=[-2 2] dy limits=[-2 2] ", "char*");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0066_H521_origin", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_origin_setpos */

/* component H522_origin=Monitor_nD() SETTING, POSITION/ROTATION */
int _H522_origin_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_origin_setpos] component H522_origin=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H522_origin_var._name, "H522_origin", 16384);
  stracpy(_H522_origin_var._type, "Monitor_nD", 16384);
  _H522_origin_var._index=68;
  int current_setpos_index = 68;
  if("" && strlen(""))
    stracpy(_H522_origin_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H522_origin_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_origin_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H522_origin_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_origin_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H522_origin_var._parameters.user3[0]='\0';
  _H522_origin_var._parameters.xwidth = 0.12;
  _H522_origin_var._parameters.yheight = 0.12;
  _H522_origin_var._parameters.zdepth = 0;
  _H522_origin_var._parameters.xmin = 0;
  _H522_origin_var._parameters.xmax = 0;
  _H522_origin_var._parameters.ymin = 0;
  _H522_origin_var._parameters.ymax = 0;
  _H522_origin_var._parameters.zmin = 0;
  _H522_origin_var._parameters.zmax = 0;
  _H522_origin_var._parameters.bins = 25;
  _H522_origin_var._parameters.min = -1e40;
  _H522_origin_var._parameters.max = 1e40;
  _H522_origin_var._parameters.restore_neutron = 1;
  _H522_origin_var._parameters.radius = 0;
  if("dx limits=[-2 2] dy limits=[-2 2]" && strlen("dx limits=[-2 2] dy limits=[-2 2]"))
    stracpy(_H522_origin_var._parameters.options, "dx limits=[-2 2] dy limits=[-2 2]" ? "dx limits=[-2 2] dy limits=[-2 2]" : "", 16384);
  else 
  _H522_origin_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_origin_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_origin_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_origin_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_origin_var._parameters.geometry[0]='\0';
  _H522_origin_var._parameters.nowritefile = 0;
  _H522_origin_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_origin_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_origin_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_origin_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_origin_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_origin_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_origin_var._parameters.username3[0]='\0';


  /* component H522_origin=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H52_Common_Out_var._rotation_absolute, _H522_origin_var._rotation_absolute);
    rot_transpose(_H521_origin_var._rotation_absolute, tr1);
    rot_mul(_H522_origin_var._rotation_absolute, tr1, _H522_origin_var._rotation_relative);
    _H522_origin_var._rotation_is_identity =  rot_test_identity(_H522_origin_var._rotation_relative);
    tc1 = coords_set(
      0, 0.06, 0);
    rot_transpose(_H52_Common_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_origin_var._position_absolute = coords_add(_H52_Common_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_origin_var._position_absolute, _H522_origin_var._position_absolute);
    _H522_origin_var._position_relative = rot_apply(_H522_origin_var._rotation_absolute, tc1);
  } /* H522_origin=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H522_origin", _H522_origin_var._position_absolute, _H522_origin_var._rotation_absolute);
  instrument->_position_absolute[68] = _H522_origin_var._position_absolute;
  instrument->_position_relative[68] = _H522_origin_var._position_relative;
    _H522_origin_var._position_relative_is_zero =  coords_test_zero(_H522_origin_var._position_relative);
  instrument->counter_N[68]  = instrument->counter_P[68] = instrument->counter_P2[68] = 0;
  instrument->counter_AbsorbProp[68]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0067_H522_origin", _H522_origin_var._position_absolute, _H522_origin_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "xwidth", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "bins", "0", "25","int");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "options", "NULL", "dx limits=[-2 2] dy limits=[-2 2]", "char*");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0067_H522_origin", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_origin_setpos */

/* component H521_start=Arm() SETTING, POSITION/ROTATION */
int _H521_start_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_start_setpos] component H521_start=Arm() SETTING [Arm:0]");
  stracpy(_H521_start_var._name, "H521_start", 16384);
  stracpy(_H521_start_var._type, "Arm", 16384);
  _H521_start_var._index=69;
  int current_setpos_index = 69;
  /* component H521_start=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_origin_var._rotation_absolute, _H521_start_var._rotation_absolute);
    rot_transpose(_H522_origin_var._rotation_absolute, tr1);
    rot_mul(_H521_start_var._rotation_absolute, tr1, _H521_start_var._rotation_relative);
    _H521_start_var._rotation_is_identity =  rot_test_identity(_H521_start_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H521_origin_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_start_var._position_absolute = coords_add(_H521_origin_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_origin_var._position_absolute, _H521_start_var._position_absolute);
    _H521_start_var._position_relative = rot_apply(_H521_start_var._rotation_absolute, tc1);
  } /* H521_start=Arm() AT ROTATED */
  DEBUG_COMPONENT("H521_start", _H521_start_var._position_absolute, _H521_start_var._rotation_absolute);
  instrument->_position_absolute[69] = _H521_start_var._position_absolute;
  instrument->_position_relative[69] = _H521_start_var._position_relative;
    _H521_start_var._position_relative_is_zero =  coords_test_zero(_H521_start_var._position_relative);
  instrument->counter_N[69]  = instrument->counter_P[69] = instrument->counter_P2[69] = 0;
  instrument->counter_AbsorbProp[69]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0068_H521_start", _H521_start_var._position_absolute, _H521_start_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_start_setpos */

/* component H521_Curved=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_setpos] component H521_Curved=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_var._name, "H521_Curved", 16384);
  stracpy(_H521_Curved_var._type, "Guide_gravity", 16384);
  _H521_Curved_var._index=70;
  int current_setpos_index = 70;
  _H521_Curved_var._parameters.w1 = 0.06;
  _H521_Curved_var._parameters.h1 = 0.12;
  _H521_Curved_var._parameters.w2 = 0.06;
  _H521_Curved_var._parameters.h2 = 0.12 + 0.03 / 35;
  _H521_Curved_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_var._parameters.R0 = gR0;
  _H521_Curved_var._parameters.Qc = gQc;
  _H521_Curved_var._parameters.alpha = gAlpha;
  _H521_Curved_var._parameters.m = 2;
  _H521_Curved_var._parameters.W = gW;
  _H521_Curved_var._parameters.nslit = 1;
  _H521_Curved_var._parameters.d = 0.0005;
  _H521_Curved_var._parameters.mleft = -1;
  _H521_Curved_var._parameters.mright = 2.5;
  _H521_Curved_var._parameters.mtop = -1;
  _H521_Curved_var._parameters.mbottom = -1;
  _H521_Curved_var._parameters.nhslit = 1;
  _H521_Curved_var._parameters.G = 0;
  _H521_Curved_var._parameters.aleft = -1;
  _H521_Curved_var._parameters.aright = -1;
  _H521_Curved_var._parameters.atop = -1;
  _H521_Curved_var._parameters.abottom = -1;
  _H521_Curved_var._parameters.wavy = 0;
  _H521_Curved_var._parameters.wavy_z = 0;
  _H521_Curved_var._parameters.wavy_tb = 0;
  _H521_Curved_var._parameters.wavy_lr = 0;
  _H521_Curved_var._parameters.chamfers = 0;
  _H521_Curved_var._parameters.chamfers_z = 0;
  _H521_Curved_var._parameters.chamfers_lr = 0;
  _H521_Curved_var._parameters.chamfers_tb = 0;
  _H521_Curved_var._parameters.nelements = 1;
  _H521_Curved_var._parameters.nu = 0;
  _H521_Curved_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_var._parameters.reflect[0]='\0';


  /* component H521_Curved=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.05)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_start_var._rotation_absolute, _H521_Curved_var._rotation_absolute);
    rot_transpose(_H521_start_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_var._rotation_absolute, tr1, _H521_Curved_var._rotation_relative);
    _H521_Curved_var._rotation_is_identity =  rot_test_identity(_H521_Curved_var._rotation_relative);
    tc1 = coords_set(
      0, 0, gGap);
    rot_transpose(_H521_start_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_var._position_absolute = coords_add(_H521_start_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_start_var._position_absolute, _H521_Curved_var._position_absolute);
    _H521_Curved_var._position_relative = rot_apply(_H521_Curved_var._rotation_absolute, tc1);
  } /* H521_Curved=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved", _H521_Curved_var._position_absolute, _H521_Curved_var._rotation_absolute);
  instrument->_position_absolute[70] = _H521_Curved_var._position_absolute;
  instrument->_position_relative[70] = _H521_Curved_var._position_relative;
    _H521_Curved_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_var._position_relative);
  instrument->counter_N[70]  = instrument->counter_P[70] = instrument->counter_P2[70] = 0;
  instrument->counter_AbsorbProp[70]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0069_H521_Curved", _H521_Curved_var._position_absolute, _H521_Curved_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "h2", "0", "0.12 + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0069_H521_Curved", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_setpos */

/* component H521_Curved_71=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_71_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_71_setpos] component H521_Curved_71=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_71_var._name, "H521_Curved_71", 16384);
  stracpy(_H521_Curved_71_var._type, "Guide_gravity", 16384);
  _H521_Curved_71_var._index=71;
  int current_setpos_index = 71;
  _H521_Curved_71_var._parameters.w1 = 0.06;
  _H521_Curved_71_var._parameters.h1 = COMP_GETPAR ( H521_Curved , h2 );
  _H521_Curved_71_var._parameters.w2 = 0.06;
  _H521_Curved_71_var._parameters.h2 = COMP_GETPAR ( H521_Curved , h2 ) + 0.03 / 35;
  _H521_Curved_71_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_71_var._parameters.R0 = gR0;
  _H521_Curved_71_var._parameters.Qc = gQc;
  _H521_Curved_71_var._parameters.alpha = gAlpha;
  _H521_Curved_71_var._parameters.m = 2;
  _H521_Curved_71_var._parameters.W = gW;
  _H521_Curved_71_var._parameters.nslit = 1;
  _H521_Curved_71_var._parameters.d = 0.0005;
  _H521_Curved_71_var._parameters.mleft = -1;
  _H521_Curved_71_var._parameters.mright = 2.5;
  _H521_Curved_71_var._parameters.mtop = -1;
  _H521_Curved_71_var._parameters.mbottom = -1;
  _H521_Curved_71_var._parameters.nhslit = 1;
  _H521_Curved_71_var._parameters.G = 0;
  _H521_Curved_71_var._parameters.aleft = -1;
  _H521_Curved_71_var._parameters.aright = -1;
  _H521_Curved_71_var._parameters.atop = -1;
  _H521_Curved_71_var._parameters.abottom = -1;
  _H521_Curved_71_var._parameters.wavy = 0;
  _H521_Curved_71_var._parameters.wavy_z = 0;
  _H521_Curved_71_var._parameters.wavy_tb = 0;
  _H521_Curved_71_var._parameters.wavy_lr = 0;
  _H521_Curved_71_var._parameters.chamfers = 0;
  _H521_Curved_71_var._parameters.chamfers_z = 0;
  _H521_Curved_71_var._parameters.chamfers_lr = 0;
  _H521_Curved_71_var._parameters.chamfers_tb = 0;
  _H521_Curved_71_var._parameters.nelements = 1;
  _H521_Curved_71_var._parameters.nu = 0;
  _H521_Curved_71_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_71_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_71_var._parameters.reflect[0]='\0';


  /* component H521_Curved_71=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_var._rotation_absolute, _H521_Curved_71_var._rotation_absolute);
    rot_transpose(_H521_Curved_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_71_var._rotation_absolute, tr1, _H521_Curved_71_var._rotation_relative);
    _H521_Curved_71_var._rotation_is_identity =  rot_test_identity(_H521_Curved_71_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved , l ) + gGap);
    rot_transpose(_H521_Curved_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_71_var._position_absolute = coords_add(_H521_Curved_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_var._position_absolute, _H521_Curved_71_var._position_absolute);
    _H521_Curved_71_var._position_relative = rot_apply(_H521_Curved_71_var._rotation_absolute, tc1);
  } /* H521_Curved_71=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_71", _H521_Curved_71_var._position_absolute, _H521_Curved_71_var._rotation_absolute);
  instrument->_position_absolute[71] = _H521_Curved_71_var._position_absolute;
  instrument->_position_relative[71] = _H521_Curved_71_var._position_relative;
    _H521_Curved_71_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_71_var._position_relative);
  instrument->counter_N[71]  = instrument->counter_P[71] = instrument->counter_P2[71] = 0;
  instrument->counter_AbsorbProp[71]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0070_H521_Curved_71", _H521_Curved_71_var._position_absolute, _H521_Curved_71_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "h1", "NONE", "COMP_GETPAR ( H521_Curved , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "h2", "0", "COMP_GETPAR ( H521_Curved , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0070_H521_Curved_71", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_71_setpos */

/* component H521_Curved_72=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_72_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_72_setpos] component H521_Curved_72=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_72_var._name, "H521_Curved_72", 16384);
  stracpy(_H521_Curved_72_var._type, "Guide_gravity", 16384);
  _H521_Curved_72_var._index=72;
  int current_setpos_index = 72;
  _H521_Curved_72_var._parameters.w1 = 0.06;
  _H521_Curved_72_var._parameters.h1 = COMP_GETPAR ( H521_Curved_71 , h2 );
  _H521_Curved_72_var._parameters.w2 = 0.06;
  _H521_Curved_72_var._parameters.h2 = COMP_GETPAR ( H521_Curved_71 , h2 ) + 0.03 / 35;
  _H521_Curved_72_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_72_var._parameters.R0 = gR0;
  _H521_Curved_72_var._parameters.Qc = gQc;
  _H521_Curved_72_var._parameters.alpha = gAlpha;
  _H521_Curved_72_var._parameters.m = 2;
  _H521_Curved_72_var._parameters.W = gW;
  _H521_Curved_72_var._parameters.nslit = 1;
  _H521_Curved_72_var._parameters.d = 0.0005;
  _H521_Curved_72_var._parameters.mleft = -1;
  _H521_Curved_72_var._parameters.mright = 2.5;
  _H521_Curved_72_var._parameters.mtop = -1;
  _H521_Curved_72_var._parameters.mbottom = -1;
  _H521_Curved_72_var._parameters.nhslit = 1;
  _H521_Curved_72_var._parameters.G = 0;
  _H521_Curved_72_var._parameters.aleft = -1;
  _H521_Curved_72_var._parameters.aright = -1;
  _H521_Curved_72_var._parameters.atop = -1;
  _H521_Curved_72_var._parameters.abottom = -1;
  _H521_Curved_72_var._parameters.wavy = 0;
  _H521_Curved_72_var._parameters.wavy_z = 0;
  _H521_Curved_72_var._parameters.wavy_tb = 0;
  _H521_Curved_72_var._parameters.wavy_lr = 0;
  _H521_Curved_72_var._parameters.chamfers = 0;
  _H521_Curved_72_var._parameters.chamfers_z = 0;
  _H521_Curved_72_var._parameters.chamfers_lr = 0;
  _H521_Curved_72_var._parameters.chamfers_tb = 0;
  _H521_Curved_72_var._parameters.nelements = 1;
  _H521_Curved_72_var._parameters.nu = 0;
  _H521_Curved_72_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_72_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_72_var._parameters.reflect[0]='\0';


  /* component H521_Curved_72=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_71_var._rotation_absolute, _H521_Curved_72_var._rotation_absolute);
    rot_transpose(_H521_Curved_71_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_72_var._rotation_absolute, tr1, _H521_Curved_72_var._rotation_relative);
    _H521_Curved_72_var._rotation_is_identity =  rot_test_identity(_H521_Curved_72_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_71 , l ) + gGap);
    rot_transpose(_H521_Curved_71_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_72_var._position_absolute = coords_add(_H521_Curved_71_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_71_var._position_absolute, _H521_Curved_72_var._position_absolute);
    _H521_Curved_72_var._position_relative = rot_apply(_H521_Curved_72_var._rotation_absolute, tc1);
  } /* H521_Curved_72=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_72", _H521_Curved_72_var._position_absolute, _H521_Curved_72_var._rotation_absolute);
  instrument->_position_absolute[72] = _H521_Curved_72_var._position_absolute;
  instrument->_position_relative[72] = _H521_Curved_72_var._position_relative;
    _H521_Curved_72_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_72_var._position_relative);
  instrument->counter_N[72]  = instrument->counter_P[72] = instrument->counter_P2[72] = 0;
  instrument->counter_AbsorbProp[72]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0071_H521_Curved_72", _H521_Curved_72_var._position_absolute, _H521_Curved_72_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "h1", "NONE", "COMP_GETPAR ( H521_Curved_71 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "h2", "0", "COMP_GETPAR ( H521_Curved_71 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0071_H521_Curved_72", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_72_setpos */

/* component H521_Curved_73=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_73_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_73_setpos] component H521_Curved_73=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_73_var._name, "H521_Curved_73", 16384);
  stracpy(_H521_Curved_73_var._type, "Guide_gravity", 16384);
  _H521_Curved_73_var._index=73;
  int current_setpos_index = 73;
  _H521_Curved_73_var._parameters.w1 = 0.06;
  _H521_Curved_73_var._parameters.h1 = COMP_GETPAR ( H521_Curved_72 , h2 );
  _H521_Curved_73_var._parameters.w2 = 0.06;
  _H521_Curved_73_var._parameters.h2 = COMP_GETPAR ( H521_Curved_72 , h2 ) + 0.03 / 35;
  _H521_Curved_73_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_73_var._parameters.R0 = gR0;
  _H521_Curved_73_var._parameters.Qc = gQc;
  _H521_Curved_73_var._parameters.alpha = gAlpha;
  _H521_Curved_73_var._parameters.m = 2;
  _H521_Curved_73_var._parameters.W = gW;
  _H521_Curved_73_var._parameters.nslit = 1;
  _H521_Curved_73_var._parameters.d = 0.0005;
  _H521_Curved_73_var._parameters.mleft = -1;
  _H521_Curved_73_var._parameters.mright = 2.5;
  _H521_Curved_73_var._parameters.mtop = -1;
  _H521_Curved_73_var._parameters.mbottom = -1;
  _H521_Curved_73_var._parameters.nhslit = 1;
  _H521_Curved_73_var._parameters.G = 0;
  _H521_Curved_73_var._parameters.aleft = -1;
  _H521_Curved_73_var._parameters.aright = -1;
  _H521_Curved_73_var._parameters.atop = -1;
  _H521_Curved_73_var._parameters.abottom = -1;
  _H521_Curved_73_var._parameters.wavy = 0;
  _H521_Curved_73_var._parameters.wavy_z = 0;
  _H521_Curved_73_var._parameters.wavy_tb = 0;
  _H521_Curved_73_var._parameters.wavy_lr = 0;
  _H521_Curved_73_var._parameters.chamfers = 0;
  _H521_Curved_73_var._parameters.chamfers_z = 0;
  _H521_Curved_73_var._parameters.chamfers_lr = 0;
  _H521_Curved_73_var._parameters.chamfers_tb = 0;
  _H521_Curved_73_var._parameters.nelements = 1;
  _H521_Curved_73_var._parameters.nu = 0;
  _H521_Curved_73_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_73_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_73_var._parameters.reflect[0]='\0';


  /* component H521_Curved_73=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_72_var._rotation_absolute, _H521_Curved_73_var._rotation_absolute);
    rot_transpose(_H521_Curved_72_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_73_var._rotation_absolute, tr1, _H521_Curved_73_var._rotation_relative);
    _H521_Curved_73_var._rotation_is_identity =  rot_test_identity(_H521_Curved_73_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_72 , l ) + gGap);
    rot_transpose(_H521_Curved_72_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_73_var._position_absolute = coords_add(_H521_Curved_72_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_72_var._position_absolute, _H521_Curved_73_var._position_absolute);
    _H521_Curved_73_var._position_relative = rot_apply(_H521_Curved_73_var._rotation_absolute, tc1);
  } /* H521_Curved_73=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_73", _H521_Curved_73_var._position_absolute, _H521_Curved_73_var._rotation_absolute);
  instrument->_position_absolute[73] = _H521_Curved_73_var._position_absolute;
  instrument->_position_relative[73] = _H521_Curved_73_var._position_relative;
    _H521_Curved_73_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_73_var._position_relative);
  instrument->counter_N[73]  = instrument->counter_P[73] = instrument->counter_P2[73] = 0;
  instrument->counter_AbsorbProp[73]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0072_H521_Curved_73", _H521_Curved_73_var._position_absolute, _H521_Curved_73_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "h1", "NONE", "COMP_GETPAR ( H521_Curved_72 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "h2", "0", "COMP_GETPAR ( H521_Curved_72 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0072_H521_Curved_73", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_73_setpos */

/* component H521_Curved_74=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_74_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_74_setpos] component H521_Curved_74=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_74_var._name, "H521_Curved_74", 16384);
  stracpy(_H521_Curved_74_var._type, "Guide_gravity", 16384);
  _H521_Curved_74_var._index=74;
  int current_setpos_index = 74;
  _H521_Curved_74_var._parameters.w1 = 0.06;
  _H521_Curved_74_var._parameters.h1 = COMP_GETPAR ( H521_Curved_73 , h2 );
  _H521_Curved_74_var._parameters.w2 = 0.06;
  _H521_Curved_74_var._parameters.h2 = COMP_GETPAR ( H521_Curved_73 , h2 ) + 0.03 / 35;
  _H521_Curved_74_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_74_var._parameters.R0 = gR0;
  _H521_Curved_74_var._parameters.Qc = gQc;
  _H521_Curved_74_var._parameters.alpha = gAlpha;
  _H521_Curved_74_var._parameters.m = 2;
  _H521_Curved_74_var._parameters.W = gW;
  _H521_Curved_74_var._parameters.nslit = 1;
  _H521_Curved_74_var._parameters.d = 0.0005;
  _H521_Curved_74_var._parameters.mleft = -1;
  _H521_Curved_74_var._parameters.mright = 2.5;
  _H521_Curved_74_var._parameters.mtop = -1;
  _H521_Curved_74_var._parameters.mbottom = -1;
  _H521_Curved_74_var._parameters.nhslit = 1;
  _H521_Curved_74_var._parameters.G = 0;
  _H521_Curved_74_var._parameters.aleft = -1;
  _H521_Curved_74_var._parameters.aright = -1;
  _H521_Curved_74_var._parameters.atop = -1;
  _H521_Curved_74_var._parameters.abottom = -1;
  _H521_Curved_74_var._parameters.wavy = 0;
  _H521_Curved_74_var._parameters.wavy_z = 0;
  _H521_Curved_74_var._parameters.wavy_tb = 0;
  _H521_Curved_74_var._parameters.wavy_lr = 0;
  _H521_Curved_74_var._parameters.chamfers = 0;
  _H521_Curved_74_var._parameters.chamfers_z = 0;
  _H521_Curved_74_var._parameters.chamfers_lr = 0;
  _H521_Curved_74_var._parameters.chamfers_tb = 0;
  _H521_Curved_74_var._parameters.nelements = 1;
  _H521_Curved_74_var._parameters.nu = 0;
  _H521_Curved_74_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_74_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_74_var._parameters.reflect[0]='\0';


  /* component H521_Curved_74=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_73_var._rotation_absolute, _H521_Curved_74_var._rotation_absolute);
    rot_transpose(_H521_Curved_73_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_74_var._rotation_absolute, tr1, _H521_Curved_74_var._rotation_relative);
    _H521_Curved_74_var._rotation_is_identity =  rot_test_identity(_H521_Curved_74_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_73 , l ) + gGap);
    rot_transpose(_H521_Curved_73_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_74_var._position_absolute = coords_add(_H521_Curved_73_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_73_var._position_absolute, _H521_Curved_74_var._position_absolute);
    _H521_Curved_74_var._position_relative = rot_apply(_H521_Curved_74_var._rotation_absolute, tc1);
  } /* H521_Curved_74=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_74", _H521_Curved_74_var._position_absolute, _H521_Curved_74_var._rotation_absolute);
  instrument->_position_absolute[74] = _H521_Curved_74_var._position_absolute;
  instrument->_position_relative[74] = _H521_Curved_74_var._position_relative;
    _H521_Curved_74_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_74_var._position_relative);
  instrument->counter_N[74]  = instrument->counter_P[74] = instrument->counter_P2[74] = 0;
  instrument->counter_AbsorbProp[74]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0073_H521_Curved_74", _H521_Curved_74_var._position_absolute, _H521_Curved_74_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "h1", "NONE", "COMP_GETPAR ( H521_Curved_73 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "h2", "0", "COMP_GETPAR ( H521_Curved_73 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0073_H521_Curved_74", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_74_setpos */

/* component H521_Curved_75=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_75_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_75_setpos] component H521_Curved_75=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_75_var._name, "H521_Curved_75", 16384);
  stracpy(_H521_Curved_75_var._type, "Guide_gravity", 16384);
  _H521_Curved_75_var._index=75;
  int current_setpos_index = 75;
  _H521_Curved_75_var._parameters.w1 = 0.06;
  _H521_Curved_75_var._parameters.h1 = COMP_GETPAR ( H521_Curved_74 , h2 );
  _H521_Curved_75_var._parameters.w2 = 0.06;
  _H521_Curved_75_var._parameters.h2 = COMP_GETPAR ( H521_Curved_74 , h2 ) + 0.03 / 35;
  _H521_Curved_75_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_75_var._parameters.R0 = gR0;
  _H521_Curved_75_var._parameters.Qc = gQc;
  _H521_Curved_75_var._parameters.alpha = gAlpha;
  _H521_Curved_75_var._parameters.m = 2;
  _H521_Curved_75_var._parameters.W = gW;
  _H521_Curved_75_var._parameters.nslit = 1;
  _H521_Curved_75_var._parameters.d = 0.0005;
  _H521_Curved_75_var._parameters.mleft = -1;
  _H521_Curved_75_var._parameters.mright = 2.5;
  _H521_Curved_75_var._parameters.mtop = -1;
  _H521_Curved_75_var._parameters.mbottom = -1;
  _H521_Curved_75_var._parameters.nhslit = 1;
  _H521_Curved_75_var._parameters.G = 0;
  _H521_Curved_75_var._parameters.aleft = -1;
  _H521_Curved_75_var._parameters.aright = -1;
  _H521_Curved_75_var._parameters.atop = -1;
  _H521_Curved_75_var._parameters.abottom = -1;
  _H521_Curved_75_var._parameters.wavy = 0;
  _H521_Curved_75_var._parameters.wavy_z = 0;
  _H521_Curved_75_var._parameters.wavy_tb = 0;
  _H521_Curved_75_var._parameters.wavy_lr = 0;
  _H521_Curved_75_var._parameters.chamfers = 0;
  _H521_Curved_75_var._parameters.chamfers_z = 0;
  _H521_Curved_75_var._parameters.chamfers_lr = 0;
  _H521_Curved_75_var._parameters.chamfers_tb = 0;
  _H521_Curved_75_var._parameters.nelements = 1;
  _H521_Curved_75_var._parameters.nu = 0;
  _H521_Curved_75_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_75_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_75_var._parameters.reflect[0]='\0';


  /* component H521_Curved_75=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_74_var._rotation_absolute, _H521_Curved_75_var._rotation_absolute);
    rot_transpose(_H521_Curved_74_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_75_var._rotation_absolute, tr1, _H521_Curved_75_var._rotation_relative);
    _H521_Curved_75_var._rotation_is_identity =  rot_test_identity(_H521_Curved_75_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_74 , l ) + gGap);
    rot_transpose(_H521_Curved_74_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_75_var._position_absolute = coords_add(_H521_Curved_74_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_74_var._position_absolute, _H521_Curved_75_var._position_absolute);
    _H521_Curved_75_var._position_relative = rot_apply(_H521_Curved_75_var._rotation_absolute, tc1);
  } /* H521_Curved_75=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_75", _H521_Curved_75_var._position_absolute, _H521_Curved_75_var._rotation_absolute);
  instrument->_position_absolute[75] = _H521_Curved_75_var._position_absolute;
  instrument->_position_relative[75] = _H521_Curved_75_var._position_relative;
    _H521_Curved_75_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_75_var._position_relative);
  instrument->counter_N[75]  = instrument->counter_P[75] = instrument->counter_P2[75] = 0;
  instrument->counter_AbsorbProp[75]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0074_H521_Curved_75", _H521_Curved_75_var._position_absolute, _H521_Curved_75_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "h1", "NONE", "COMP_GETPAR ( H521_Curved_74 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "h2", "0", "COMP_GETPAR ( H521_Curved_74 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0074_H521_Curved_75", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_75_setpos */

/* component H521_Curved_76=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_76_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_76_setpos] component H521_Curved_76=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_76_var._name, "H521_Curved_76", 16384);
  stracpy(_H521_Curved_76_var._type, "Guide_gravity", 16384);
  _H521_Curved_76_var._index=76;
  int current_setpos_index = 76;
  _H521_Curved_76_var._parameters.w1 = 0.06;
  _H521_Curved_76_var._parameters.h1 = COMP_GETPAR ( H521_Curved_75 , h2 );
  _H521_Curved_76_var._parameters.w2 = 0.06;
  _H521_Curved_76_var._parameters.h2 = COMP_GETPAR ( H521_Curved_75 , h2 ) + 0.03 / 35;
  _H521_Curved_76_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_76_var._parameters.R0 = gR0;
  _H521_Curved_76_var._parameters.Qc = gQc;
  _H521_Curved_76_var._parameters.alpha = gAlpha;
  _H521_Curved_76_var._parameters.m = 2;
  _H521_Curved_76_var._parameters.W = gW;
  _H521_Curved_76_var._parameters.nslit = 1;
  _H521_Curved_76_var._parameters.d = 0.0005;
  _H521_Curved_76_var._parameters.mleft = -1;
  _H521_Curved_76_var._parameters.mright = 2.5;
  _H521_Curved_76_var._parameters.mtop = -1;
  _H521_Curved_76_var._parameters.mbottom = -1;
  _H521_Curved_76_var._parameters.nhslit = 1;
  _H521_Curved_76_var._parameters.G = 0;
  _H521_Curved_76_var._parameters.aleft = -1;
  _H521_Curved_76_var._parameters.aright = -1;
  _H521_Curved_76_var._parameters.atop = -1;
  _H521_Curved_76_var._parameters.abottom = -1;
  _H521_Curved_76_var._parameters.wavy = 0;
  _H521_Curved_76_var._parameters.wavy_z = 0;
  _H521_Curved_76_var._parameters.wavy_tb = 0;
  _H521_Curved_76_var._parameters.wavy_lr = 0;
  _H521_Curved_76_var._parameters.chamfers = 0;
  _H521_Curved_76_var._parameters.chamfers_z = 0;
  _H521_Curved_76_var._parameters.chamfers_lr = 0;
  _H521_Curved_76_var._parameters.chamfers_tb = 0;
  _H521_Curved_76_var._parameters.nelements = 1;
  _H521_Curved_76_var._parameters.nu = 0;
  _H521_Curved_76_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_76_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_76_var._parameters.reflect[0]='\0';


  /* component H521_Curved_76=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_75_var._rotation_absolute, _H521_Curved_76_var._rotation_absolute);
    rot_transpose(_H521_Curved_75_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_76_var._rotation_absolute, tr1, _H521_Curved_76_var._rotation_relative);
    _H521_Curved_76_var._rotation_is_identity =  rot_test_identity(_H521_Curved_76_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_75 , l ) + gGap);
    rot_transpose(_H521_Curved_75_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_76_var._position_absolute = coords_add(_H521_Curved_75_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_75_var._position_absolute, _H521_Curved_76_var._position_absolute);
    _H521_Curved_76_var._position_relative = rot_apply(_H521_Curved_76_var._rotation_absolute, tc1);
  } /* H521_Curved_76=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_76", _H521_Curved_76_var._position_absolute, _H521_Curved_76_var._rotation_absolute);
  instrument->_position_absolute[76] = _H521_Curved_76_var._position_absolute;
  instrument->_position_relative[76] = _H521_Curved_76_var._position_relative;
    _H521_Curved_76_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_76_var._position_relative);
  instrument->counter_N[76]  = instrument->counter_P[76] = instrument->counter_P2[76] = 0;
  instrument->counter_AbsorbProp[76]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0075_H521_Curved_76", _H521_Curved_76_var._position_absolute, _H521_Curved_76_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "h1", "NONE", "COMP_GETPAR ( H521_Curved_75 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "h2", "0", "COMP_GETPAR ( H521_Curved_75 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0075_H521_Curved_76", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_76_setpos */

/* component H521_Curved_77=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_77_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_77_setpos] component H521_Curved_77=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_77_var._name, "H521_Curved_77", 16384);
  stracpy(_H521_Curved_77_var._type, "Guide_gravity", 16384);
  _H521_Curved_77_var._index=77;
  int current_setpos_index = 77;
  _H521_Curved_77_var._parameters.w1 = 0.06;
  _H521_Curved_77_var._parameters.h1 = COMP_GETPAR ( H521_Curved_76 , h2 );
  _H521_Curved_77_var._parameters.w2 = 0.06;
  _H521_Curved_77_var._parameters.h2 = COMP_GETPAR ( H521_Curved_76 , h2 ) + 0.03 / 35;
  _H521_Curved_77_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_77_var._parameters.R0 = gR0;
  _H521_Curved_77_var._parameters.Qc = gQc;
  _H521_Curved_77_var._parameters.alpha = gAlpha;
  _H521_Curved_77_var._parameters.m = 2;
  _H521_Curved_77_var._parameters.W = gW;
  _H521_Curved_77_var._parameters.nslit = 1;
  _H521_Curved_77_var._parameters.d = 0.0005;
  _H521_Curved_77_var._parameters.mleft = -1;
  _H521_Curved_77_var._parameters.mright = 2.5;
  _H521_Curved_77_var._parameters.mtop = -1;
  _H521_Curved_77_var._parameters.mbottom = -1;
  _H521_Curved_77_var._parameters.nhslit = 1;
  _H521_Curved_77_var._parameters.G = 0;
  _H521_Curved_77_var._parameters.aleft = -1;
  _H521_Curved_77_var._parameters.aright = -1;
  _H521_Curved_77_var._parameters.atop = -1;
  _H521_Curved_77_var._parameters.abottom = -1;
  _H521_Curved_77_var._parameters.wavy = 0;
  _H521_Curved_77_var._parameters.wavy_z = 0;
  _H521_Curved_77_var._parameters.wavy_tb = 0;
  _H521_Curved_77_var._parameters.wavy_lr = 0;
  _H521_Curved_77_var._parameters.chamfers = 0;
  _H521_Curved_77_var._parameters.chamfers_z = 0;
  _H521_Curved_77_var._parameters.chamfers_lr = 0;
  _H521_Curved_77_var._parameters.chamfers_tb = 0;
  _H521_Curved_77_var._parameters.nelements = 1;
  _H521_Curved_77_var._parameters.nu = 0;
  _H521_Curved_77_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_77_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_77_var._parameters.reflect[0]='\0';


  /* component H521_Curved_77=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_76_var._rotation_absolute, _H521_Curved_77_var._rotation_absolute);
    rot_transpose(_H521_Curved_76_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_77_var._rotation_absolute, tr1, _H521_Curved_77_var._rotation_relative);
    _H521_Curved_77_var._rotation_is_identity =  rot_test_identity(_H521_Curved_77_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_76 , l ) + gGap);
    rot_transpose(_H521_Curved_76_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_77_var._position_absolute = coords_add(_H521_Curved_76_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_76_var._position_absolute, _H521_Curved_77_var._position_absolute);
    _H521_Curved_77_var._position_relative = rot_apply(_H521_Curved_77_var._rotation_absolute, tc1);
  } /* H521_Curved_77=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_77", _H521_Curved_77_var._position_absolute, _H521_Curved_77_var._rotation_absolute);
  instrument->_position_absolute[77] = _H521_Curved_77_var._position_absolute;
  instrument->_position_relative[77] = _H521_Curved_77_var._position_relative;
    _H521_Curved_77_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_77_var._position_relative);
  instrument->counter_N[77]  = instrument->counter_P[77] = instrument->counter_P2[77] = 0;
  instrument->counter_AbsorbProp[77]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0076_H521_Curved_77", _H521_Curved_77_var._position_absolute, _H521_Curved_77_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "h1", "NONE", "COMP_GETPAR ( H521_Curved_76 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "h2", "0", "COMP_GETPAR ( H521_Curved_76 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0076_H521_Curved_77", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_77_setpos */

/* component H521_Curved_78=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_78_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_78_setpos] component H521_Curved_78=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_78_var._name, "H521_Curved_78", 16384);
  stracpy(_H521_Curved_78_var._type, "Guide_gravity", 16384);
  _H521_Curved_78_var._index=78;
  int current_setpos_index = 78;
  _H521_Curved_78_var._parameters.w1 = 0.06;
  _H521_Curved_78_var._parameters.h1 = COMP_GETPAR ( H521_Curved_77 , h2 );
  _H521_Curved_78_var._parameters.w2 = 0.06;
  _H521_Curved_78_var._parameters.h2 = COMP_GETPAR ( H521_Curved_77 , h2 ) + 0.03 / 35;
  _H521_Curved_78_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_78_var._parameters.R0 = gR0;
  _H521_Curved_78_var._parameters.Qc = gQc;
  _H521_Curved_78_var._parameters.alpha = gAlpha;
  _H521_Curved_78_var._parameters.m = 2;
  _H521_Curved_78_var._parameters.W = gW;
  _H521_Curved_78_var._parameters.nslit = 1;
  _H521_Curved_78_var._parameters.d = 0.0005;
  _H521_Curved_78_var._parameters.mleft = -1;
  _H521_Curved_78_var._parameters.mright = 2.5;
  _H521_Curved_78_var._parameters.mtop = -1;
  _H521_Curved_78_var._parameters.mbottom = -1;
  _H521_Curved_78_var._parameters.nhslit = 1;
  _H521_Curved_78_var._parameters.G = 0;
  _H521_Curved_78_var._parameters.aleft = -1;
  _H521_Curved_78_var._parameters.aright = -1;
  _H521_Curved_78_var._parameters.atop = -1;
  _H521_Curved_78_var._parameters.abottom = -1;
  _H521_Curved_78_var._parameters.wavy = 0;
  _H521_Curved_78_var._parameters.wavy_z = 0;
  _H521_Curved_78_var._parameters.wavy_tb = 0;
  _H521_Curved_78_var._parameters.wavy_lr = 0;
  _H521_Curved_78_var._parameters.chamfers = 0;
  _H521_Curved_78_var._parameters.chamfers_z = 0;
  _H521_Curved_78_var._parameters.chamfers_lr = 0;
  _H521_Curved_78_var._parameters.chamfers_tb = 0;
  _H521_Curved_78_var._parameters.nelements = 1;
  _H521_Curved_78_var._parameters.nu = 0;
  _H521_Curved_78_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_78_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_78_var._parameters.reflect[0]='\0';


  /* component H521_Curved_78=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_77_var._rotation_absolute, _H521_Curved_78_var._rotation_absolute);
    rot_transpose(_H521_Curved_77_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_78_var._rotation_absolute, tr1, _H521_Curved_78_var._rotation_relative);
    _H521_Curved_78_var._rotation_is_identity =  rot_test_identity(_H521_Curved_78_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_77 , l ) + gGap);
    rot_transpose(_H521_Curved_77_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_78_var._position_absolute = coords_add(_H521_Curved_77_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_77_var._position_absolute, _H521_Curved_78_var._position_absolute);
    _H521_Curved_78_var._position_relative = rot_apply(_H521_Curved_78_var._rotation_absolute, tc1);
  } /* H521_Curved_78=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_78", _H521_Curved_78_var._position_absolute, _H521_Curved_78_var._rotation_absolute);
  instrument->_position_absolute[78] = _H521_Curved_78_var._position_absolute;
  instrument->_position_relative[78] = _H521_Curved_78_var._position_relative;
    _H521_Curved_78_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_78_var._position_relative);
  instrument->counter_N[78]  = instrument->counter_P[78] = instrument->counter_P2[78] = 0;
  instrument->counter_AbsorbProp[78]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0077_H521_Curved_78", _H521_Curved_78_var._position_absolute, _H521_Curved_78_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "h1", "NONE", "COMP_GETPAR ( H521_Curved_77 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "h2", "0", "COMP_GETPAR ( H521_Curved_77 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0077_H521_Curved_78", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_78_setpos */

/* component H521_Curved_79=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_79_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_79_setpos] component H521_Curved_79=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_79_var._name, "H521_Curved_79", 16384);
  stracpy(_H521_Curved_79_var._type, "Guide_gravity", 16384);
  _H521_Curved_79_var._index=79;
  int current_setpos_index = 79;
  _H521_Curved_79_var._parameters.w1 = 0.06;
  _H521_Curved_79_var._parameters.h1 = COMP_GETPAR ( H521_Curved_78 , h2 );
  _H521_Curved_79_var._parameters.w2 = 0.06;
  _H521_Curved_79_var._parameters.h2 = COMP_GETPAR ( H521_Curved_78 , h2 ) + 0.03 / 35;
  _H521_Curved_79_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_79_var._parameters.R0 = gR0;
  _H521_Curved_79_var._parameters.Qc = gQc;
  _H521_Curved_79_var._parameters.alpha = gAlpha;
  _H521_Curved_79_var._parameters.m = 2;
  _H521_Curved_79_var._parameters.W = gW;
  _H521_Curved_79_var._parameters.nslit = 1;
  _H521_Curved_79_var._parameters.d = 0.0005;
  _H521_Curved_79_var._parameters.mleft = -1;
  _H521_Curved_79_var._parameters.mright = 2.5;
  _H521_Curved_79_var._parameters.mtop = -1;
  _H521_Curved_79_var._parameters.mbottom = -1;
  _H521_Curved_79_var._parameters.nhslit = 1;
  _H521_Curved_79_var._parameters.G = 0;
  _H521_Curved_79_var._parameters.aleft = -1;
  _H521_Curved_79_var._parameters.aright = -1;
  _H521_Curved_79_var._parameters.atop = -1;
  _H521_Curved_79_var._parameters.abottom = -1;
  _H521_Curved_79_var._parameters.wavy = 0;
  _H521_Curved_79_var._parameters.wavy_z = 0;
  _H521_Curved_79_var._parameters.wavy_tb = 0;
  _H521_Curved_79_var._parameters.wavy_lr = 0;
  _H521_Curved_79_var._parameters.chamfers = 0;
  _H521_Curved_79_var._parameters.chamfers_z = 0;
  _H521_Curved_79_var._parameters.chamfers_lr = 0;
  _H521_Curved_79_var._parameters.chamfers_tb = 0;
  _H521_Curved_79_var._parameters.nelements = 1;
  _H521_Curved_79_var._parameters.nu = 0;
  _H521_Curved_79_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_79_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_79_var._parameters.reflect[0]='\0';


  /* component H521_Curved_79=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_78_var._rotation_absolute, _H521_Curved_79_var._rotation_absolute);
    rot_transpose(_H521_Curved_78_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_79_var._rotation_absolute, tr1, _H521_Curved_79_var._rotation_relative);
    _H521_Curved_79_var._rotation_is_identity =  rot_test_identity(_H521_Curved_79_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_78 , l ) + gGap);
    rot_transpose(_H521_Curved_78_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_79_var._position_absolute = coords_add(_H521_Curved_78_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_78_var._position_absolute, _H521_Curved_79_var._position_absolute);
    _H521_Curved_79_var._position_relative = rot_apply(_H521_Curved_79_var._rotation_absolute, tc1);
  } /* H521_Curved_79=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_79", _H521_Curved_79_var._position_absolute, _H521_Curved_79_var._rotation_absolute);
  instrument->_position_absolute[79] = _H521_Curved_79_var._position_absolute;
  instrument->_position_relative[79] = _H521_Curved_79_var._position_relative;
    _H521_Curved_79_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_79_var._position_relative);
  instrument->counter_N[79]  = instrument->counter_P[79] = instrument->counter_P2[79] = 0;
  instrument->counter_AbsorbProp[79]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0078_H521_Curved_79", _H521_Curved_79_var._position_absolute, _H521_Curved_79_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "h1", "NONE", "COMP_GETPAR ( H521_Curved_78 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "h2", "0", "COMP_GETPAR ( H521_Curved_78 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0078_H521_Curved_79", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_79_setpos */

/* component H521_Curved_80=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_80_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_80_setpos] component H521_Curved_80=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_80_var._name, "H521_Curved_80", 16384);
  stracpy(_H521_Curved_80_var._type, "Guide_gravity", 16384);
  _H521_Curved_80_var._index=80;
  int current_setpos_index = 80;
  _H521_Curved_80_var._parameters.w1 = 0.06;
  _H521_Curved_80_var._parameters.h1 = COMP_GETPAR ( H521_Curved_79 , h2 );
  _H521_Curved_80_var._parameters.w2 = 0.06;
  _H521_Curved_80_var._parameters.h2 = COMP_GETPAR ( H521_Curved_79 , h2 ) + 0.03 / 35;
  _H521_Curved_80_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_80_var._parameters.R0 = gR0;
  _H521_Curved_80_var._parameters.Qc = gQc;
  _H521_Curved_80_var._parameters.alpha = gAlpha;
  _H521_Curved_80_var._parameters.m = 2;
  _H521_Curved_80_var._parameters.W = gW;
  _H521_Curved_80_var._parameters.nslit = 1;
  _H521_Curved_80_var._parameters.d = 0.0005;
  _H521_Curved_80_var._parameters.mleft = -1;
  _H521_Curved_80_var._parameters.mright = 2.5;
  _H521_Curved_80_var._parameters.mtop = -1;
  _H521_Curved_80_var._parameters.mbottom = -1;
  _H521_Curved_80_var._parameters.nhslit = 1;
  _H521_Curved_80_var._parameters.G = 0;
  _H521_Curved_80_var._parameters.aleft = -1;
  _H521_Curved_80_var._parameters.aright = -1;
  _H521_Curved_80_var._parameters.atop = -1;
  _H521_Curved_80_var._parameters.abottom = -1;
  _H521_Curved_80_var._parameters.wavy = 0;
  _H521_Curved_80_var._parameters.wavy_z = 0;
  _H521_Curved_80_var._parameters.wavy_tb = 0;
  _H521_Curved_80_var._parameters.wavy_lr = 0;
  _H521_Curved_80_var._parameters.chamfers = 0;
  _H521_Curved_80_var._parameters.chamfers_z = 0;
  _H521_Curved_80_var._parameters.chamfers_lr = 0;
  _H521_Curved_80_var._parameters.chamfers_tb = 0;
  _H521_Curved_80_var._parameters.nelements = 1;
  _H521_Curved_80_var._parameters.nu = 0;
  _H521_Curved_80_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_80_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_80_var._parameters.reflect[0]='\0';


  /* component H521_Curved_80=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_79_var._rotation_absolute, _H521_Curved_80_var._rotation_absolute);
    rot_transpose(_H521_Curved_79_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_80_var._rotation_absolute, tr1, _H521_Curved_80_var._rotation_relative);
    _H521_Curved_80_var._rotation_is_identity =  rot_test_identity(_H521_Curved_80_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_79 , l ) + gGap);
    rot_transpose(_H521_Curved_79_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_80_var._position_absolute = coords_add(_H521_Curved_79_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_79_var._position_absolute, _H521_Curved_80_var._position_absolute);
    _H521_Curved_80_var._position_relative = rot_apply(_H521_Curved_80_var._rotation_absolute, tc1);
  } /* H521_Curved_80=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_80", _H521_Curved_80_var._position_absolute, _H521_Curved_80_var._rotation_absolute);
  instrument->_position_absolute[80] = _H521_Curved_80_var._position_absolute;
  instrument->_position_relative[80] = _H521_Curved_80_var._position_relative;
    _H521_Curved_80_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_80_var._position_relative);
  instrument->counter_N[80]  = instrument->counter_P[80] = instrument->counter_P2[80] = 0;
  instrument->counter_AbsorbProp[80]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0079_H521_Curved_80", _H521_Curved_80_var._position_absolute, _H521_Curved_80_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "h1", "NONE", "COMP_GETPAR ( H521_Curved_79 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "h2", "0", "COMP_GETPAR ( H521_Curved_79 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0079_H521_Curved_80", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_80_setpos */

/* component H521_Curved_preVTE=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_preVTE_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_preVTE_setpos] component H521_Curved_preVTE=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_preVTE_var._name, "H521_Curved_preVTE", 16384);
  stracpy(_H521_Curved_preVTE_var._type, "Guide_gravity", 16384);
  _H521_Curved_preVTE_var._index=81;
  int current_setpos_index = 81;
  _H521_Curved_preVTE_var._parameters.w1 = 0.06;
  _H521_Curved_preVTE_var._parameters.h1 = COMP_GETPAR ( H521_Curved_80 , h2 );
  _H521_Curved_preVTE_var._parameters.w2 = 0.06;
  _H521_Curved_preVTE_var._parameters.h2 = COMP_GETPAR ( H521_Curved_80 , h2 ) + 0.03 / 35;
  _H521_Curved_preVTE_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_preVTE_var._parameters.R0 = gR0;
  _H521_Curved_preVTE_var._parameters.Qc = gQc;
  _H521_Curved_preVTE_var._parameters.alpha = gAlpha;
  _H521_Curved_preVTE_var._parameters.m = 2;
  _H521_Curved_preVTE_var._parameters.W = gW;
  _H521_Curved_preVTE_var._parameters.nslit = 1;
  _H521_Curved_preVTE_var._parameters.d = 0.0005;
  _H521_Curved_preVTE_var._parameters.mleft = -1;
  _H521_Curved_preVTE_var._parameters.mright = 2.5;
  _H521_Curved_preVTE_var._parameters.mtop = -1;
  _H521_Curved_preVTE_var._parameters.mbottom = -1;
  _H521_Curved_preVTE_var._parameters.nhslit = 1;
  _H521_Curved_preVTE_var._parameters.G = 0;
  _H521_Curved_preVTE_var._parameters.aleft = -1;
  _H521_Curved_preVTE_var._parameters.aright = -1;
  _H521_Curved_preVTE_var._parameters.atop = -1;
  _H521_Curved_preVTE_var._parameters.abottom = -1;
  _H521_Curved_preVTE_var._parameters.wavy = 0;
  _H521_Curved_preVTE_var._parameters.wavy_z = 0;
  _H521_Curved_preVTE_var._parameters.wavy_tb = 0;
  _H521_Curved_preVTE_var._parameters.wavy_lr = 0;
  _H521_Curved_preVTE_var._parameters.chamfers = 0;
  _H521_Curved_preVTE_var._parameters.chamfers_z = 0;
  _H521_Curved_preVTE_var._parameters.chamfers_lr = 0;
  _H521_Curved_preVTE_var._parameters.chamfers_tb = 0;
  _H521_Curved_preVTE_var._parameters.nelements = 1;
  _H521_Curved_preVTE_var._parameters.nu = 0;
  _H521_Curved_preVTE_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_preVTE_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_preVTE_var._parameters.reflect[0]='\0';


  /* component H521_Curved_preVTE=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_80_var._rotation_absolute, _H521_Curved_preVTE_var._rotation_absolute);
    rot_transpose(_H521_Curved_80_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_preVTE_var._rotation_absolute, tr1, _H521_Curved_preVTE_var._rotation_relative);
    _H521_Curved_preVTE_var._rotation_is_identity =  rot_test_identity(_H521_Curved_preVTE_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_80 , l ) + gGap);
    rot_transpose(_H521_Curved_80_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_preVTE_var._position_absolute = coords_add(_H521_Curved_80_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_80_var._position_absolute, _H521_Curved_preVTE_var._position_absolute);
    _H521_Curved_preVTE_var._position_relative = rot_apply(_H521_Curved_preVTE_var._rotation_absolute, tc1);
  } /* H521_Curved_preVTE=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_preVTE", _H521_Curved_preVTE_var._position_absolute, _H521_Curved_preVTE_var._rotation_absolute);
  instrument->_position_absolute[81] = _H521_Curved_preVTE_var._position_absolute;
  instrument->_position_relative[81] = _H521_Curved_preVTE_var._position_relative;
    _H521_Curved_preVTE_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_preVTE_var._position_relative);
  instrument->counter_N[81]  = instrument->counter_P[81] = instrument->counter_P2[81] = 0;
  instrument->counter_AbsorbProp[81]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0080_H521_Curved_preVTE", _H521_Curved_preVTE_var._position_absolute, _H521_Curved_preVTE_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "h1", "NONE", "COMP_GETPAR ( H521_Curved_80 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "h2", "0", "COMP_GETPAR ( H521_Curved_80 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0080_H521_Curved_preVTE", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_preVTE_setpos */

/* component HCS_Al_82=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_82_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_82_setpos] component HCS_Al_82=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_82_var._name, "HCS_Al_82", 16384);
  stracpy(_HCS_Al_82_var._type, "PowderN", 16384);
  _HCS_Al_82_var._index=82;
  int current_setpos_index = 82;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_82_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_82_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_82_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_82_var._parameters.geometry[0]='\0';
  _HCS_Al_82_var._parameters.format[0] = 0;
  _HCS_Al_82_var._parameters.format[1] = 0;
  _HCS_Al_82_var._parameters.format[2] = 0;
  _HCS_Al_82_var._parameters.format[3] = 0;
  _HCS_Al_82_var._parameters.format[4] = 0;
  _HCS_Al_82_var._parameters.format[5] = 0;
  _HCS_Al_82_var._parameters.format[6] = 0;
  _HCS_Al_82_var._parameters.format[7] = 0;
  _HCS_Al_82_var._parameters.format[8] = 0;
  _HCS_Al_82_var._parameters.radius = 0;
  _HCS_Al_82_var._parameters.yheight = 0.15;
  _HCS_Al_82_var._parameters.xwidth = 0.06;
  _HCS_Al_82_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_82_var._parameters.thickness = 0;
  _HCS_Al_82_var._parameters.pack = 1;
  _HCS_Al_82_var._parameters.Vc = 0;
  _HCS_Al_82_var._parameters.sigma_abs = 0;
  _HCS_Al_82_var._parameters.sigma_inc = 0;
  _HCS_Al_82_var._parameters.delta_d_d = 0;
  _HCS_Al_82_var._parameters.p_inc = 0.005;
  _HCS_Al_82_var._parameters.p_transmit = 0.9450;
  _HCS_Al_82_var._parameters.DW = 0;
  _HCS_Al_82_var._parameters.nb_atoms = 1;
  _HCS_Al_82_var._parameters.d_omega = 0;
  _HCS_Al_82_var._parameters.d_phi = 10;
  _HCS_Al_82_var._parameters.tth_sign = 0;
  _HCS_Al_82_var._parameters.p_interact = 0.05;
  _HCS_Al_82_var._parameters.concentric = 0;
  _HCS_Al_82_var._parameters.density = 0;
  _HCS_Al_82_var._parameters.weight = 0;
  _HCS_Al_82_var._parameters.barns = 1;
  _HCS_Al_82_var._parameters.Strain = 0;
  _HCS_Al_82_var._parameters.focus_flip = 0;
  _HCS_Al_82_var._parameters.target_index = 0;
  _HCS_Al_82_var._parameters.order = 1;


  /* component HCS_Al_82=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_preVTE_var._rotation_absolute, _HCS_Al_82_var._rotation_absolute);
    rot_transpose(_H521_Curved_preVTE_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_82_var._rotation_absolute, tr1, _HCS_Al_82_var._rotation_relative);
    _HCS_Al_82_var._rotation_is_identity =  rot_test_identity(_HCS_Al_82_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_preVTE , l ) + gGap + 0.001);
    rot_transpose(_H521_Curved_preVTE_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_82_var._position_absolute = coords_add(_H521_Curved_preVTE_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_preVTE_var._position_absolute, _HCS_Al_82_var._position_absolute);
    _HCS_Al_82_var._position_relative = rot_apply(_HCS_Al_82_var._rotation_absolute, tc1);
  } /* HCS_Al_82=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_82", _HCS_Al_82_var._position_absolute, _HCS_Al_82_var._rotation_absolute);
  instrument->_position_absolute[82] = _HCS_Al_82_var._position_absolute;
  instrument->_position_relative[82] = _HCS_Al_82_var._position_relative;
    _HCS_Al_82_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_82_var._position_relative);
  instrument->counter_N[82]  = instrument->counter_P[82] = instrument->counter_P2[82] = 0;
  instrument->counter_AbsorbProp[82]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0081_HCS_Al_82", _HCS_Al_82_var._position_absolute, _HCS_Al_82_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "yheight", "0", "0.15","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0081_HCS_Al_82", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_82_setpos */

/* component H521_VTE=Monitor_nD() SETTING, POSITION/ROTATION */
int _H521_VTE_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_VTE_setpos] component H521_VTE=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H521_VTE_var._name, "H521_VTE", 16384);
  stracpy(_H521_VTE_var._type, "Monitor_nD", 16384);
  _H521_VTE_var._index=83;
  int current_setpos_index = 83;
  if("" && strlen(""))
    stracpy(_H521_VTE_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H521_VTE_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_VTE_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H521_VTE_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_VTE_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H521_VTE_var._parameters.user3[0]='\0';
  _H521_VTE_var._parameters.xwidth = 0.06;
  _H521_VTE_var._parameters.yheight = 0.15;
  _H521_VTE_var._parameters.zdepth = 0;
  _H521_VTE_var._parameters.xmin = 0;
  _H521_VTE_var._parameters.xmax = 0;
  _H521_VTE_var._parameters.ymin = 0;
  _H521_VTE_var._parameters.ymax = 0;
  _H521_VTE_var._parameters.zmin = 0;
  _H521_VTE_var._parameters.zmax = 0;
  _H521_VTE_var._parameters.bins = 50;
  _H521_VTE_var._parameters.min = -1e40;
  _H521_VTE_var._parameters.max = 1e40;
  _H521_VTE_var._parameters.restore_neutron = 1;
  _H521_VTE_var._parameters.radius = 0;
  if("x y, slit" && strlen("x y, slit"))
    stracpy(_H521_VTE_var._parameters.options, "x y, slit" ? "x y, slit" : "", 16384);
  else 
  _H521_VTE_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_VTE_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_VTE_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_VTE_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_VTE_var._parameters.geometry[0]='\0';
  _H521_VTE_var._parameters.nowritefile = 0;
  _H521_VTE_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_VTE_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_VTE_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_VTE_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_VTE_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_VTE_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_VTE_var._parameters.username3[0]='\0';


  /* component H521_VTE=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_82_var._rotation_absolute, _H521_VTE_var._rotation_absolute);
    rot_transpose(_HCS_Al_82_var._rotation_absolute, tr1);
    rot_mul(_H521_VTE_var._rotation_absolute, tr1, _H521_VTE_var._rotation_relative);
    _H521_VTE_var._rotation_is_identity =  rot_test_identity(_H521_VTE_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.108 / 2 -0.001);
    rot_transpose(_HCS_Al_82_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_VTE_var._position_absolute = coords_add(_HCS_Al_82_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_82_var._position_absolute, _H521_VTE_var._position_absolute);
    _H521_VTE_var._position_relative = rot_apply(_H521_VTE_var._rotation_absolute, tc1);
  } /* H521_VTE=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H521_VTE", _H521_VTE_var._position_absolute, _H521_VTE_var._rotation_absolute);
  instrument->_position_absolute[83] = _H521_VTE_var._position_absolute;
  instrument->_position_relative[83] = _H521_VTE_var._position_relative;
    _H521_VTE_var._position_relative_is_zero =  coords_test_zero(_H521_VTE_var._position_relative);
  instrument->counter_N[83]  = instrument->counter_P[83] = instrument->counter_P2[83] = 0;
  instrument->counter_AbsorbProp[83]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0082_H521_VTE", _H521_VTE_var._position_absolute, _H521_VTE_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "yheight", "0", "0.15","MCNUM");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "options", "NULL", "x y, slit", "char*");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0082_H521_VTE", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_VTE_setpos */

/* component HCS_Al_84=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_84_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_84_setpos] component HCS_Al_84=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_84_var._name, "HCS_Al_84", 16384);
  stracpy(_HCS_Al_84_var._type, "PowderN", 16384);
  _HCS_Al_84_var._index=84;
  int current_setpos_index = 84;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_84_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_84_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_84_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_84_var._parameters.geometry[0]='\0';
  _HCS_Al_84_var._parameters.format[0] = 0;
  _HCS_Al_84_var._parameters.format[1] = 0;
  _HCS_Al_84_var._parameters.format[2] = 0;
  _HCS_Al_84_var._parameters.format[3] = 0;
  _HCS_Al_84_var._parameters.format[4] = 0;
  _HCS_Al_84_var._parameters.format[5] = 0;
  _HCS_Al_84_var._parameters.format[6] = 0;
  _HCS_Al_84_var._parameters.format[7] = 0;
  _HCS_Al_84_var._parameters.format[8] = 0;
  _HCS_Al_84_var._parameters.radius = 0;
  _HCS_Al_84_var._parameters.yheight = 0.15;
  _HCS_Al_84_var._parameters.xwidth = 0.06;
  _HCS_Al_84_var._parameters.zdepth = 0.002;
  _HCS_Al_84_var._parameters.thickness = 0;
  _HCS_Al_84_var._parameters.pack = 1;
  _HCS_Al_84_var._parameters.Vc = 0;
  _HCS_Al_84_var._parameters.sigma_abs = 0;
  _HCS_Al_84_var._parameters.sigma_inc = 0;
  _HCS_Al_84_var._parameters.delta_d_d = 0;
  _HCS_Al_84_var._parameters.p_inc = 0.005;
  _HCS_Al_84_var._parameters.p_transmit = 0.9450;
  _HCS_Al_84_var._parameters.DW = 0;
  _HCS_Al_84_var._parameters.nb_atoms = 1;
  _HCS_Al_84_var._parameters.d_omega = 0;
  _HCS_Al_84_var._parameters.d_phi = 10;
  _HCS_Al_84_var._parameters.tth_sign = 0;
  _HCS_Al_84_var._parameters.p_interact = 0.05;
  _HCS_Al_84_var._parameters.concentric = 0;
  _HCS_Al_84_var._parameters.density = 0;
  _HCS_Al_84_var._parameters.weight = 0;
  _HCS_Al_84_var._parameters.barns = 1;
  _HCS_Al_84_var._parameters.Strain = 0;
  _HCS_Al_84_var._parameters.focus_flip = 0;
  _HCS_Al_84_var._parameters.target_index = 0;
  _HCS_Al_84_var._parameters.order = 1;


  /* component HCS_Al_84=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_VTE_var._rotation_absolute, _HCS_Al_84_var._rotation_absolute);
    rot_transpose(_H521_VTE_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_84_var._rotation_absolute, tr1, _HCS_Al_84_var._rotation_relative);
    _HCS_Al_84_var._rotation_is_identity =  rot_test_identity(_HCS_Al_84_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.108 / 2 -0.05);
    rot_transpose(_H521_VTE_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_84_var._position_absolute = coords_add(_H521_VTE_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_VTE_var._position_absolute, _HCS_Al_84_var._position_absolute);
    _HCS_Al_84_var._position_relative = rot_apply(_HCS_Al_84_var._rotation_absolute, tc1);
  } /* HCS_Al_84=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_84", _HCS_Al_84_var._position_absolute, _HCS_Al_84_var._rotation_absolute);
  instrument->_position_absolute[84] = _HCS_Al_84_var._position_absolute;
  instrument->_position_relative[84] = _HCS_Al_84_var._position_relative;
    _HCS_Al_84_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_84_var._position_relative);
  instrument->counter_N[84]  = instrument->counter_P[84] = instrument->counter_P2[84] = 0;
  instrument->counter_AbsorbProp[84]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0083_HCS_Al_84", _HCS_Al_84_var._position_absolute, _HCS_Al_84_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "yheight", "0", "0.15","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "zdepth", "0", "0.002","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0083_HCS_Al_84", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_84_setpos */

/* component H521_Curved_85=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_85_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_85_setpos] component H521_Curved_85=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_85_var._name, "H521_Curved_85", 16384);
  stracpy(_H521_Curved_85_var._type, "Guide_gravity", 16384);
  _H521_Curved_85_var._index=85;
  int current_setpos_index = 85;
  _H521_Curved_85_var._parameters.w1 = 0.06;
  _H521_Curved_85_var._parameters.h1 = COMP_GETPAR ( H521_Curved_preVTE , h2 );
  _H521_Curved_85_var._parameters.w2 = 0.06;
  _H521_Curved_85_var._parameters.h2 = COMP_GETPAR ( H521_Curved_preVTE , h2 ) + 0.03 / 35;
  _H521_Curved_85_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_85_var._parameters.R0 = gR0;
  _H521_Curved_85_var._parameters.Qc = gQc;
  _H521_Curved_85_var._parameters.alpha = gAlpha;
  _H521_Curved_85_var._parameters.m = 2;
  _H521_Curved_85_var._parameters.W = gW;
  _H521_Curved_85_var._parameters.nslit = 1;
  _H521_Curved_85_var._parameters.d = 0.0005;
  _H521_Curved_85_var._parameters.mleft = -1;
  _H521_Curved_85_var._parameters.mright = 2.5;
  _H521_Curved_85_var._parameters.mtop = -1;
  _H521_Curved_85_var._parameters.mbottom = -1;
  _H521_Curved_85_var._parameters.nhslit = 1;
  _H521_Curved_85_var._parameters.G = 0;
  _H521_Curved_85_var._parameters.aleft = -1;
  _H521_Curved_85_var._parameters.aright = -1;
  _H521_Curved_85_var._parameters.atop = -1;
  _H521_Curved_85_var._parameters.abottom = -1;
  _H521_Curved_85_var._parameters.wavy = 0;
  _H521_Curved_85_var._parameters.wavy_z = 0;
  _H521_Curved_85_var._parameters.wavy_tb = 0;
  _H521_Curved_85_var._parameters.wavy_lr = 0;
  _H521_Curved_85_var._parameters.chamfers = 0;
  _H521_Curved_85_var._parameters.chamfers_z = 0;
  _H521_Curved_85_var._parameters.chamfers_lr = 0;
  _H521_Curved_85_var._parameters.chamfers_tb = 0;
  _H521_Curved_85_var._parameters.nelements = 1;
  _H521_Curved_85_var._parameters.nu = 0;
  _H521_Curved_85_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_85_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_85_var._parameters.reflect[0]='\0';


  /* component H521_Curved_85=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_84_var._rotation_absolute, _H521_Curved_85_var._rotation_absolute);
    rot_transpose(_HCS_Al_84_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_85_var._rotation_absolute, tr1, _H521_Curved_85_var._rotation_relative);
    _H521_Curved_85_var._rotation_is_identity =  rot_test_identity(_H521_Curved_85_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.003 + gGap);
    rot_transpose(_HCS_Al_84_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_85_var._position_absolute = coords_add(_HCS_Al_84_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_84_var._position_absolute, _H521_Curved_85_var._position_absolute);
    _H521_Curved_85_var._position_relative = rot_apply(_H521_Curved_85_var._rotation_absolute, tc1);
  } /* H521_Curved_85=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_85", _H521_Curved_85_var._position_absolute, _H521_Curved_85_var._rotation_absolute);
  instrument->_position_absolute[85] = _H521_Curved_85_var._position_absolute;
  instrument->_position_relative[85] = _H521_Curved_85_var._position_relative;
    _H521_Curved_85_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_85_var._position_relative);
  instrument->counter_N[85]  = instrument->counter_P[85] = instrument->counter_P2[85] = 0;
  instrument->counter_AbsorbProp[85]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0084_H521_Curved_85", _H521_Curved_85_var._position_absolute, _H521_Curved_85_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "h1", "NONE", "COMP_GETPAR ( H521_Curved_preVTE , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "h2", "0", "COMP_GETPAR ( H521_Curved_preVTE , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0084_H521_Curved_85", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_85_setpos */

/* component H521_Curved_86=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_86_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_86_setpos] component H521_Curved_86=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_86_var._name, "H521_Curved_86", 16384);
  stracpy(_H521_Curved_86_var._type, "Guide_gravity", 16384);
  _H521_Curved_86_var._index=86;
  int current_setpos_index = 86;
  _H521_Curved_86_var._parameters.w1 = 0.06;
  _H521_Curved_86_var._parameters.h1 = COMP_GETPAR ( H521_Curved_85 , h2 );
  _H521_Curved_86_var._parameters.w2 = 0.06;
  _H521_Curved_86_var._parameters.h2 = COMP_GETPAR ( H521_Curved_85 , h2 ) + 0.03 / 35;
  _H521_Curved_86_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_86_var._parameters.R0 = gR0;
  _H521_Curved_86_var._parameters.Qc = gQc;
  _H521_Curved_86_var._parameters.alpha = gAlpha;
  _H521_Curved_86_var._parameters.m = 2;
  _H521_Curved_86_var._parameters.W = gW;
  _H521_Curved_86_var._parameters.nslit = 1;
  _H521_Curved_86_var._parameters.d = 0.0005;
  _H521_Curved_86_var._parameters.mleft = -1;
  _H521_Curved_86_var._parameters.mright = 2.5;
  _H521_Curved_86_var._parameters.mtop = -1;
  _H521_Curved_86_var._parameters.mbottom = -1;
  _H521_Curved_86_var._parameters.nhslit = 1;
  _H521_Curved_86_var._parameters.G = 0;
  _H521_Curved_86_var._parameters.aleft = -1;
  _H521_Curved_86_var._parameters.aright = -1;
  _H521_Curved_86_var._parameters.atop = -1;
  _H521_Curved_86_var._parameters.abottom = -1;
  _H521_Curved_86_var._parameters.wavy = 0;
  _H521_Curved_86_var._parameters.wavy_z = 0;
  _H521_Curved_86_var._parameters.wavy_tb = 0;
  _H521_Curved_86_var._parameters.wavy_lr = 0;
  _H521_Curved_86_var._parameters.chamfers = 0;
  _H521_Curved_86_var._parameters.chamfers_z = 0;
  _H521_Curved_86_var._parameters.chamfers_lr = 0;
  _H521_Curved_86_var._parameters.chamfers_tb = 0;
  _H521_Curved_86_var._parameters.nelements = 1;
  _H521_Curved_86_var._parameters.nu = 0;
  _H521_Curved_86_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_86_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_86_var._parameters.reflect[0]='\0';


  /* component H521_Curved_86=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_85_var._rotation_absolute, _H521_Curved_86_var._rotation_absolute);
    rot_transpose(_H521_Curved_85_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_86_var._rotation_absolute, tr1, _H521_Curved_86_var._rotation_relative);
    _H521_Curved_86_var._rotation_is_identity =  rot_test_identity(_H521_Curved_86_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_85 , l ) + gGap);
    rot_transpose(_H521_Curved_85_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_86_var._position_absolute = coords_add(_H521_Curved_85_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_85_var._position_absolute, _H521_Curved_86_var._position_absolute);
    _H521_Curved_86_var._position_relative = rot_apply(_H521_Curved_86_var._rotation_absolute, tc1);
  } /* H521_Curved_86=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_86", _H521_Curved_86_var._position_absolute, _H521_Curved_86_var._rotation_absolute);
  instrument->_position_absolute[86] = _H521_Curved_86_var._position_absolute;
  instrument->_position_relative[86] = _H521_Curved_86_var._position_relative;
    _H521_Curved_86_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_86_var._position_relative);
  instrument->counter_N[86]  = instrument->counter_P[86] = instrument->counter_P2[86] = 0;
  instrument->counter_AbsorbProp[86]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0085_H521_Curved_86", _H521_Curved_86_var._position_absolute, _H521_Curved_86_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "h1", "NONE", "COMP_GETPAR ( H521_Curved_85 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "h2", "0", "COMP_GETPAR ( H521_Curved_85 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0085_H521_Curved_86", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_86_setpos */

/* component H521_Curved_87=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_87_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_87_setpos] component H521_Curved_87=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_87_var._name, "H521_Curved_87", 16384);
  stracpy(_H521_Curved_87_var._type, "Guide_gravity", 16384);
  _H521_Curved_87_var._index=87;
  int current_setpos_index = 87;
  _H521_Curved_87_var._parameters.w1 = 0.06;
  _H521_Curved_87_var._parameters.h1 = COMP_GETPAR ( H521_Curved_86 , h2 );
  _H521_Curved_87_var._parameters.w2 = 0.06;
  _H521_Curved_87_var._parameters.h2 = COMP_GETPAR ( H521_Curved_86 , h2 ) + 0.03 / 35;
  _H521_Curved_87_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_87_var._parameters.R0 = gR0;
  _H521_Curved_87_var._parameters.Qc = gQc;
  _H521_Curved_87_var._parameters.alpha = gAlpha;
  _H521_Curved_87_var._parameters.m = 2;
  _H521_Curved_87_var._parameters.W = gW;
  _H521_Curved_87_var._parameters.nslit = 1;
  _H521_Curved_87_var._parameters.d = 0.0005;
  _H521_Curved_87_var._parameters.mleft = -1;
  _H521_Curved_87_var._parameters.mright = 2.5;
  _H521_Curved_87_var._parameters.mtop = -1;
  _H521_Curved_87_var._parameters.mbottom = -1;
  _H521_Curved_87_var._parameters.nhslit = 1;
  _H521_Curved_87_var._parameters.G = 0;
  _H521_Curved_87_var._parameters.aleft = -1;
  _H521_Curved_87_var._parameters.aright = -1;
  _H521_Curved_87_var._parameters.atop = -1;
  _H521_Curved_87_var._parameters.abottom = -1;
  _H521_Curved_87_var._parameters.wavy = 0;
  _H521_Curved_87_var._parameters.wavy_z = 0;
  _H521_Curved_87_var._parameters.wavy_tb = 0;
  _H521_Curved_87_var._parameters.wavy_lr = 0;
  _H521_Curved_87_var._parameters.chamfers = 0;
  _H521_Curved_87_var._parameters.chamfers_z = 0;
  _H521_Curved_87_var._parameters.chamfers_lr = 0;
  _H521_Curved_87_var._parameters.chamfers_tb = 0;
  _H521_Curved_87_var._parameters.nelements = 1;
  _H521_Curved_87_var._parameters.nu = 0;
  _H521_Curved_87_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_87_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_87_var._parameters.reflect[0]='\0';


  /* component H521_Curved_87=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_86_var._rotation_absolute, _H521_Curved_87_var._rotation_absolute);
    rot_transpose(_H521_Curved_86_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_87_var._rotation_absolute, tr1, _H521_Curved_87_var._rotation_relative);
    _H521_Curved_87_var._rotation_is_identity =  rot_test_identity(_H521_Curved_87_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_86 , l ) + gGap);
    rot_transpose(_H521_Curved_86_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_87_var._position_absolute = coords_add(_H521_Curved_86_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_86_var._position_absolute, _H521_Curved_87_var._position_absolute);
    _H521_Curved_87_var._position_relative = rot_apply(_H521_Curved_87_var._rotation_absolute, tc1);
  } /* H521_Curved_87=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_87", _H521_Curved_87_var._position_absolute, _H521_Curved_87_var._rotation_absolute);
  instrument->_position_absolute[87] = _H521_Curved_87_var._position_absolute;
  instrument->_position_relative[87] = _H521_Curved_87_var._position_relative;
    _H521_Curved_87_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_87_var._position_relative);
  instrument->counter_N[87]  = instrument->counter_P[87] = instrument->counter_P2[87] = 0;
  instrument->counter_AbsorbProp[87]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0086_H521_Curved_87", _H521_Curved_87_var._position_absolute, _H521_Curved_87_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "h1", "NONE", "COMP_GETPAR ( H521_Curved_86 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "h2", "0", "COMP_GETPAR ( H521_Curved_86 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0086_H521_Curved_87", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_87_setpos */

/* component H521_Curved_88=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_88_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_88_setpos] component H521_Curved_88=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_88_var._name, "H521_Curved_88", 16384);
  stracpy(_H521_Curved_88_var._type, "Guide_gravity", 16384);
  _H521_Curved_88_var._index=88;
  int current_setpos_index = 88;
  _H521_Curved_88_var._parameters.w1 = 0.06;
  _H521_Curved_88_var._parameters.h1 = COMP_GETPAR ( H521_Curved_87 , h2 );
  _H521_Curved_88_var._parameters.w2 = 0.06;
  _H521_Curved_88_var._parameters.h2 = COMP_GETPAR ( H521_Curved_87 , h2 ) + 0.03 / 35;
  _H521_Curved_88_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_88_var._parameters.R0 = gR0;
  _H521_Curved_88_var._parameters.Qc = gQc;
  _H521_Curved_88_var._parameters.alpha = gAlpha;
  _H521_Curved_88_var._parameters.m = 2;
  _H521_Curved_88_var._parameters.W = gW;
  _H521_Curved_88_var._parameters.nslit = 1;
  _H521_Curved_88_var._parameters.d = 0.0005;
  _H521_Curved_88_var._parameters.mleft = -1;
  _H521_Curved_88_var._parameters.mright = 2.5;
  _H521_Curved_88_var._parameters.mtop = -1;
  _H521_Curved_88_var._parameters.mbottom = -1;
  _H521_Curved_88_var._parameters.nhslit = 1;
  _H521_Curved_88_var._parameters.G = 0;
  _H521_Curved_88_var._parameters.aleft = -1;
  _H521_Curved_88_var._parameters.aright = -1;
  _H521_Curved_88_var._parameters.atop = -1;
  _H521_Curved_88_var._parameters.abottom = -1;
  _H521_Curved_88_var._parameters.wavy = 0;
  _H521_Curved_88_var._parameters.wavy_z = 0;
  _H521_Curved_88_var._parameters.wavy_tb = 0;
  _H521_Curved_88_var._parameters.wavy_lr = 0;
  _H521_Curved_88_var._parameters.chamfers = 0;
  _H521_Curved_88_var._parameters.chamfers_z = 0;
  _H521_Curved_88_var._parameters.chamfers_lr = 0;
  _H521_Curved_88_var._parameters.chamfers_tb = 0;
  _H521_Curved_88_var._parameters.nelements = 1;
  _H521_Curved_88_var._parameters.nu = 0;
  _H521_Curved_88_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_88_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_88_var._parameters.reflect[0]='\0';


  /* component H521_Curved_88=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_87_var._rotation_absolute, _H521_Curved_88_var._rotation_absolute);
    rot_transpose(_H521_Curved_87_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_88_var._rotation_absolute, tr1, _H521_Curved_88_var._rotation_relative);
    _H521_Curved_88_var._rotation_is_identity =  rot_test_identity(_H521_Curved_88_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_87 , l ) + gGap);
    rot_transpose(_H521_Curved_87_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_88_var._position_absolute = coords_add(_H521_Curved_87_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_87_var._position_absolute, _H521_Curved_88_var._position_absolute);
    _H521_Curved_88_var._position_relative = rot_apply(_H521_Curved_88_var._rotation_absolute, tc1);
  } /* H521_Curved_88=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_88", _H521_Curved_88_var._position_absolute, _H521_Curved_88_var._rotation_absolute);
  instrument->_position_absolute[88] = _H521_Curved_88_var._position_absolute;
  instrument->_position_relative[88] = _H521_Curved_88_var._position_relative;
    _H521_Curved_88_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_88_var._position_relative);
  instrument->counter_N[88]  = instrument->counter_P[88] = instrument->counter_P2[88] = 0;
  instrument->counter_AbsorbProp[88]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0087_H521_Curved_88", _H521_Curved_88_var._position_absolute, _H521_Curved_88_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "h1", "NONE", "COMP_GETPAR ( H521_Curved_87 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "h2", "0", "COMP_GETPAR ( H521_Curved_87 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0087_H521_Curved_88", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_88_setpos */

/* component H521_Curved_89=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_89_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_89_setpos] component H521_Curved_89=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_89_var._name, "H521_Curved_89", 16384);
  stracpy(_H521_Curved_89_var._type, "Guide_gravity", 16384);
  _H521_Curved_89_var._index=89;
  int current_setpos_index = 89;
  _H521_Curved_89_var._parameters.w1 = 0.06;
  _H521_Curved_89_var._parameters.h1 = COMP_GETPAR ( H521_Curved_88 , h2 );
  _H521_Curved_89_var._parameters.w2 = 0.06;
  _H521_Curved_89_var._parameters.h2 = COMP_GETPAR ( H521_Curved_88 , h2 ) + 0.03 / 35;
  _H521_Curved_89_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_89_var._parameters.R0 = gR0;
  _H521_Curved_89_var._parameters.Qc = gQc;
  _H521_Curved_89_var._parameters.alpha = gAlpha;
  _H521_Curved_89_var._parameters.m = 2;
  _H521_Curved_89_var._parameters.W = gW;
  _H521_Curved_89_var._parameters.nslit = 1;
  _H521_Curved_89_var._parameters.d = 0.0005;
  _H521_Curved_89_var._parameters.mleft = -1;
  _H521_Curved_89_var._parameters.mright = 2.5;
  _H521_Curved_89_var._parameters.mtop = -1;
  _H521_Curved_89_var._parameters.mbottom = -1;
  _H521_Curved_89_var._parameters.nhslit = 1;
  _H521_Curved_89_var._parameters.G = 0;
  _H521_Curved_89_var._parameters.aleft = -1;
  _H521_Curved_89_var._parameters.aright = -1;
  _H521_Curved_89_var._parameters.atop = -1;
  _H521_Curved_89_var._parameters.abottom = -1;
  _H521_Curved_89_var._parameters.wavy = 0;
  _H521_Curved_89_var._parameters.wavy_z = 0;
  _H521_Curved_89_var._parameters.wavy_tb = 0;
  _H521_Curved_89_var._parameters.wavy_lr = 0;
  _H521_Curved_89_var._parameters.chamfers = 0;
  _H521_Curved_89_var._parameters.chamfers_z = 0;
  _H521_Curved_89_var._parameters.chamfers_lr = 0;
  _H521_Curved_89_var._parameters.chamfers_tb = 0;
  _H521_Curved_89_var._parameters.nelements = 1;
  _H521_Curved_89_var._parameters.nu = 0;
  _H521_Curved_89_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_89_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_89_var._parameters.reflect[0]='\0';


  /* component H521_Curved_89=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_88_var._rotation_absolute, _H521_Curved_89_var._rotation_absolute);
    rot_transpose(_H521_Curved_88_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_89_var._rotation_absolute, tr1, _H521_Curved_89_var._rotation_relative);
    _H521_Curved_89_var._rotation_is_identity =  rot_test_identity(_H521_Curved_89_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_88 , l ) + gGap);
    rot_transpose(_H521_Curved_88_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_89_var._position_absolute = coords_add(_H521_Curved_88_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_88_var._position_absolute, _H521_Curved_89_var._position_absolute);
    _H521_Curved_89_var._position_relative = rot_apply(_H521_Curved_89_var._rotation_absolute, tc1);
  } /* H521_Curved_89=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_89", _H521_Curved_89_var._position_absolute, _H521_Curved_89_var._rotation_absolute);
  instrument->_position_absolute[89] = _H521_Curved_89_var._position_absolute;
  instrument->_position_relative[89] = _H521_Curved_89_var._position_relative;
    _H521_Curved_89_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_89_var._position_relative);
  instrument->counter_N[89]  = instrument->counter_P[89] = instrument->counter_P2[89] = 0;
  instrument->counter_AbsorbProp[89]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0088_H521_Curved_89", _H521_Curved_89_var._position_absolute, _H521_Curved_89_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "h1", "NONE", "COMP_GETPAR ( H521_Curved_88 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "h2", "0", "COMP_GETPAR ( H521_Curved_88 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0088_H521_Curved_89", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_89_setpos */

/* component H521_Curved_90=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_90_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_90_setpos] component H521_Curved_90=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_90_var._name, "H521_Curved_90", 16384);
  stracpy(_H521_Curved_90_var._type, "Guide_gravity", 16384);
  _H521_Curved_90_var._index=90;
  int current_setpos_index = 90;
  _H521_Curved_90_var._parameters.w1 = 0.06;
  _H521_Curved_90_var._parameters.h1 = COMP_GETPAR ( H521_Curved_88 , h2 );
  _H521_Curved_90_var._parameters.w2 = 0.06;
  _H521_Curved_90_var._parameters.h2 = COMP_GETPAR ( H521_Curved_88 , h2 ) + 0.03 / 35;
  _H521_Curved_90_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_90_var._parameters.R0 = gR0;
  _H521_Curved_90_var._parameters.Qc = gQc;
  _H521_Curved_90_var._parameters.alpha = gAlpha;
  _H521_Curved_90_var._parameters.m = 2;
  _H521_Curved_90_var._parameters.W = gW;
  _H521_Curved_90_var._parameters.nslit = 1;
  _H521_Curved_90_var._parameters.d = 0.0005;
  _H521_Curved_90_var._parameters.mleft = -1;
  _H521_Curved_90_var._parameters.mright = 2.5;
  _H521_Curved_90_var._parameters.mtop = -1;
  _H521_Curved_90_var._parameters.mbottom = -1;
  _H521_Curved_90_var._parameters.nhslit = 1;
  _H521_Curved_90_var._parameters.G = 0;
  _H521_Curved_90_var._parameters.aleft = -1;
  _H521_Curved_90_var._parameters.aright = -1;
  _H521_Curved_90_var._parameters.atop = -1;
  _H521_Curved_90_var._parameters.abottom = -1;
  _H521_Curved_90_var._parameters.wavy = 0;
  _H521_Curved_90_var._parameters.wavy_z = 0;
  _H521_Curved_90_var._parameters.wavy_tb = 0;
  _H521_Curved_90_var._parameters.wavy_lr = 0;
  _H521_Curved_90_var._parameters.chamfers = 0;
  _H521_Curved_90_var._parameters.chamfers_z = 0;
  _H521_Curved_90_var._parameters.chamfers_lr = 0;
  _H521_Curved_90_var._parameters.chamfers_tb = 0;
  _H521_Curved_90_var._parameters.nelements = 1;
  _H521_Curved_90_var._parameters.nu = 0;
  _H521_Curved_90_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_90_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_90_var._parameters.reflect[0]='\0';


  /* component H521_Curved_90=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (-0.05)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_89_var._rotation_absolute, _H521_Curved_90_var._rotation_absolute);
    rot_transpose(_H521_Curved_89_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_90_var._rotation_absolute, tr1, _H521_Curved_90_var._rotation_relative);
    _H521_Curved_90_var._rotation_is_identity =  rot_test_identity(_H521_Curved_90_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_89 , l ) + gGap);
    rot_transpose(_H521_Curved_89_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_90_var._position_absolute = coords_add(_H521_Curved_89_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_89_var._position_absolute, _H521_Curved_90_var._position_absolute);
    _H521_Curved_90_var._position_relative = rot_apply(_H521_Curved_90_var._rotation_absolute, tc1);
  } /* H521_Curved_90=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_90", _H521_Curved_90_var._position_absolute, _H521_Curved_90_var._rotation_absolute);
  instrument->_position_absolute[90] = _H521_Curved_90_var._position_absolute;
  instrument->_position_relative[90] = _H521_Curved_90_var._position_relative;
    _H521_Curved_90_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_90_var._position_relative);
  instrument->counter_N[90]  = instrument->counter_P[90] = instrument->counter_P2[90] = 0;
  instrument->counter_AbsorbProp[90]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0089_H521_Curved_90", _H521_Curved_90_var._position_absolute, _H521_Curved_90_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "h1", "NONE", "COMP_GETPAR ( H521_Curved_88 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "h2", "0", "COMP_GETPAR ( H521_Curved_88 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0089_H521_Curved_90", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_90_setpos */

/* component H521_Curved_91=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_91_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_91_setpos] component H521_Curved_91=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_91_var._name, "H521_Curved_91", 16384);
  stracpy(_H521_Curved_91_var._type, "Guide_gravity", 16384);
  _H521_Curved_91_var._index=91;
  int current_setpos_index = 91;
  _H521_Curved_91_var._parameters.w1 = 0.06;
  _H521_Curved_91_var._parameters.h1 = COMP_GETPAR ( H521_Curved_90 , h2 );
  _H521_Curved_91_var._parameters.w2 = 0.06;
  _H521_Curved_91_var._parameters.h2 = COMP_GETPAR ( H521_Curved_90 , h2 ) + 0.03 / 35;
  _H521_Curved_91_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_91_var._parameters.R0 = gR0;
  _H521_Curved_91_var._parameters.Qc = gQc;
  _H521_Curved_91_var._parameters.alpha = gAlpha;
  _H521_Curved_91_var._parameters.m = 2;
  _H521_Curved_91_var._parameters.W = gW;
  _H521_Curved_91_var._parameters.nslit = 1;
  _H521_Curved_91_var._parameters.d = 0.0005;
  _H521_Curved_91_var._parameters.mleft = -1;
  _H521_Curved_91_var._parameters.mright = 2.5;
  _H521_Curved_91_var._parameters.mtop = -1;
  _H521_Curved_91_var._parameters.mbottom = -1;
  _H521_Curved_91_var._parameters.nhslit = 1;
  _H521_Curved_91_var._parameters.G = 0;
  _H521_Curved_91_var._parameters.aleft = -1;
  _H521_Curved_91_var._parameters.aright = -1;
  _H521_Curved_91_var._parameters.atop = -1;
  _H521_Curved_91_var._parameters.abottom = -1;
  _H521_Curved_91_var._parameters.wavy = 0;
  _H521_Curved_91_var._parameters.wavy_z = 0;
  _H521_Curved_91_var._parameters.wavy_tb = 0;
  _H521_Curved_91_var._parameters.wavy_lr = 0;
  _H521_Curved_91_var._parameters.chamfers = 0;
  _H521_Curved_91_var._parameters.chamfers_z = 0;
  _H521_Curved_91_var._parameters.chamfers_lr = 0;
  _H521_Curved_91_var._parameters.chamfers_tb = 0;
  _H521_Curved_91_var._parameters.nelements = 1;
  _H521_Curved_91_var._parameters.nu = 0;
  _H521_Curved_91_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_91_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_91_var._parameters.reflect[0]='\0';


  /* component H521_Curved_91=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.05)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_90_var._rotation_absolute, _H521_Curved_91_var._rotation_absolute);
    rot_transpose(_H521_Curved_90_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_91_var._rotation_absolute, tr1, _H521_Curved_91_var._rotation_relative);
    _H521_Curved_91_var._rotation_is_identity =  rot_test_identity(_H521_Curved_91_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_90 , l ) + gGap);
    rot_transpose(_H521_Curved_90_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_91_var._position_absolute = coords_add(_H521_Curved_90_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_90_var._position_absolute, _H521_Curved_91_var._position_absolute);
    _H521_Curved_91_var._position_relative = rot_apply(_H521_Curved_91_var._rotation_absolute, tc1);
  } /* H521_Curved_91=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_91", _H521_Curved_91_var._position_absolute, _H521_Curved_91_var._rotation_absolute);
  instrument->_position_absolute[91] = _H521_Curved_91_var._position_absolute;
  instrument->_position_relative[91] = _H521_Curved_91_var._position_relative;
    _H521_Curved_91_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_91_var._position_relative);
  instrument->counter_N[91]  = instrument->counter_P[91] = instrument->counter_P2[91] = 0;
  instrument->counter_AbsorbProp[91]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0090_H521_Curved_91", _H521_Curved_91_var._position_absolute, _H521_Curved_91_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "h1", "NONE", "COMP_GETPAR ( H521_Curved_90 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "h2", "0", "COMP_GETPAR ( H521_Curved_90 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0090_H521_Curved_91", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_91_setpos */

/* component H521_Curved_92=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_92_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_92_setpos] component H521_Curved_92=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_92_var._name, "H521_Curved_92", 16384);
  stracpy(_H521_Curved_92_var._type, "Guide_gravity", 16384);
  _H521_Curved_92_var._index=92;
  int current_setpos_index = 92;
  _H521_Curved_92_var._parameters.w1 = 0.06;
  _H521_Curved_92_var._parameters.h1 = COMP_GETPAR ( H521_Curved_91 , h2 );
  _H521_Curved_92_var._parameters.w2 = 0.06;
  _H521_Curved_92_var._parameters.h2 = COMP_GETPAR ( H521_Curved_91 , h2 ) + 0.03 / 35;
  _H521_Curved_92_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_92_var._parameters.R0 = gR0;
  _H521_Curved_92_var._parameters.Qc = gQc;
  _H521_Curved_92_var._parameters.alpha = gAlpha;
  _H521_Curved_92_var._parameters.m = 2;
  _H521_Curved_92_var._parameters.W = gW;
  _H521_Curved_92_var._parameters.nslit = 1;
  _H521_Curved_92_var._parameters.d = 0.0005;
  _H521_Curved_92_var._parameters.mleft = -1;
  _H521_Curved_92_var._parameters.mright = 2.5;
  _H521_Curved_92_var._parameters.mtop = -1;
  _H521_Curved_92_var._parameters.mbottom = -1;
  _H521_Curved_92_var._parameters.nhslit = 1;
  _H521_Curved_92_var._parameters.G = 0;
  _H521_Curved_92_var._parameters.aleft = -1;
  _H521_Curved_92_var._parameters.aright = -1;
  _H521_Curved_92_var._parameters.atop = -1;
  _H521_Curved_92_var._parameters.abottom = -1;
  _H521_Curved_92_var._parameters.wavy = 0;
  _H521_Curved_92_var._parameters.wavy_z = 0;
  _H521_Curved_92_var._parameters.wavy_tb = 0;
  _H521_Curved_92_var._parameters.wavy_lr = 0;
  _H521_Curved_92_var._parameters.chamfers = 0;
  _H521_Curved_92_var._parameters.chamfers_z = 0;
  _H521_Curved_92_var._parameters.chamfers_lr = 0;
  _H521_Curved_92_var._parameters.chamfers_tb = 0;
  _H521_Curved_92_var._parameters.nelements = 1;
  _H521_Curved_92_var._parameters.nu = 0;
  _H521_Curved_92_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_92_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_92_var._parameters.reflect[0]='\0';


  /* component H521_Curved_92=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_91_var._rotation_absolute, _H521_Curved_92_var._rotation_absolute);
    rot_transpose(_H521_Curved_91_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_92_var._rotation_absolute, tr1, _H521_Curved_92_var._rotation_relative);
    _H521_Curved_92_var._rotation_is_identity =  rot_test_identity(_H521_Curved_92_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_91 , l ) + gGap);
    rot_transpose(_H521_Curved_91_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_92_var._position_absolute = coords_add(_H521_Curved_91_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_91_var._position_absolute, _H521_Curved_92_var._position_absolute);
    _H521_Curved_92_var._position_relative = rot_apply(_H521_Curved_92_var._rotation_absolute, tc1);
  } /* H521_Curved_92=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_92", _H521_Curved_92_var._position_absolute, _H521_Curved_92_var._rotation_absolute);
  instrument->_position_absolute[92] = _H521_Curved_92_var._position_absolute;
  instrument->_position_relative[92] = _H521_Curved_92_var._position_relative;
    _H521_Curved_92_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_92_var._position_relative);
  instrument->counter_N[92]  = instrument->counter_P[92] = instrument->counter_P2[92] = 0;
  instrument->counter_AbsorbProp[92]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0091_H521_Curved_92", _H521_Curved_92_var._position_absolute, _H521_Curved_92_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "h1", "NONE", "COMP_GETPAR ( H521_Curved_91 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "h2", "0", "COMP_GETPAR ( H521_Curved_91 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0091_H521_Curved_92", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_92_setpos */

/* component H521_Curved_93=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_93_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_93_setpos] component H521_Curved_93=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_93_var._name, "H521_Curved_93", 16384);
  stracpy(_H521_Curved_93_var._type, "Guide_gravity", 16384);
  _H521_Curved_93_var._index=93;
  int current_setpos_index = 93;
  _H521_Curved_93_var._parameters.w1 = 0.06;
  _H521_Curved_93_var._parameters.h1 = COMP_GETPAR ( H521_Curved_92 , h2 );
  _H521_Curved_93_var._parameters.w2 = 0.06;
  _H521_Curved_93_var._parameters.h2 = COMP_GETPAR ( H521_Curved_92 , h2 ) + 0.03 / 35;
  _H521_Curved_93_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_93_var._parameters.R0 = gR0;
  _H521_Curved_93_var._parameters.Qc = gQc;
  _H521_Curved_93_var._parameters.alpha = gAlpha;
  _H521_Curved_93_var._parameters.m = 2;
  _H521_Curved_93_var._parameters.W = gW;
  _H521_Curved_93_var._parameters.nslit = 1;
  _H521_Curved_93_var._parameters.d = 0.0005;
  _H521_Curved_93_var._parameters.mleft = -1;
  _H521_Curved_93_var._parameters.mright = 2.5;
  _H521_Curved_93_var._parameters.mtop = -1;
  _H521_Curved_93_var._parameters.mbottom = -1;
  _H521_Curved_93_var._parameters.nhslit = 1;
  _H521_Curved_93_var._parameters.G = 0;
  _H521_Curved_93_var._parameters.aleft = -1;
  _H521_Curved_93_var._parameters.aright = -1;
  _H521_Curved_93_var._parameters.atop = -1;
  _H521_Curved_93_var._parameters.abottom = -1;
  _H521_Curved_93_var._parameters.wavy = 0;
  _H521_Curved_93_var._parameters.wavy_z = 0;
  _H521_Curved_93_var._parameters.wavy_tb = 0;
  _H521_Curved_93_var._parameters.wavy_lr = 0;
  _H521_Curved_93_var._parameters.chamfers = 0;
  _H521_Curved_93_var._parameters.chamfers_z = 0;
  _H521_Curved_93_var._parameters.chamfers_lr = 0;
  _H521_Curved_93_var._parameters.chamfers_tb = 0;
  _H521_Curved_93_var._parameters.nelements = 1;
  _H521_Curved_93_var._parameters.nu = 0;
  _H521_Curved_93_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_93_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_93_var._parameters.reflect[0]='\0';


  /* component H521_Curved_93=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_92_var._rotation_absolute, _H521_Curved_93_var._rotation_absolute);
    rot_transpose(_H521_Curved_92_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_93_var._rotation_absolute, tr1, _H521_Curved_93_var._rotation_relative);
    _H521_Curved_93_var._rotation_is_identity =  rot_test_identity(_H521_Curved_93_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_92 , l ) + gGap);
    rot_transpose(_H521_Curved_92_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_93_var._position_absolute = coords_add(_H521_Curved_92_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_92_var._position_absolute, _H521_Curved_93_var._position_absolute);
    _H521_Curved_93_var._position_relative = rot_apply(_H521_Curved_93_var._rotation_absolute, tc1);
  } /* H521_Curved_93=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_93", _H521_Curved_93_var._position_absolute, _H521_Curved_93_var._rotation_absolute);
  instrument->_position_absolute[93] = _H521_Curved_93_var._position_absolute;
  instrument->_position_relative[93] = _H521_Curved_93_var._position_relative;
    _H521_Curved_93_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_93_var._position_relative);
  instrument->counter_N[93]  = instrument->counter_P[93] = instrument->counter_P2[93] = 0;
  instrument->counter_AbsorbProp[93]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0092_H521_Curved_93", _H521_Curved_93_var._position_absolute, _H521_Curved_93_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "h1", "NONE", "COMP_GETPAR ( H521_Curved_92 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "h2", "0", "COMP_GETPAR ( H521_Curved_92 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0092_H521_Curved_93", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_93_setpos */

/* component H521_Curved_94=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_94_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_94_setpos] component H521_Curved_94=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_94_var._name, "H521_Curved_94", 16384);
  stracpy(_H521_Curved_94_var._type, "Guide_gravity", 16384);
  _H521_Curved_94_var._index=94;
  int current_setpos_index = 94;
  _H521_Curved_94_var._parameters.w1 = 0.06;
  _H521_Curved_94_var._parameters.h1 = COMP_GETPAR ( H521_Curved_93 , h2 );
  _H521_Curved_94_var._parameters.w2 = 0.06;
  _H521_Curved_94_var._parameters.h2 = COMP_GETPAR ( H521_Curved_93 , h2 ) + 0.03 / 35;
  _H521_Curved_94_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_94_var._parameters.R0 = gR0;
  _H521_Curved_94_var._parameters.Qc = gQc;
  _H521_Curved_94_var._parameters.alpha = gAlpha;
  _H521_Curved_94_var._parameters.m = 2;
  _H521_Curved_94_var._parameters.W = gW;
  _H521_Curved_94_var._parameters.nslit = 1;
  _H521_Curved_94_var._parameters.d = 0.0005;
  _H521_Curved_94_var._parameters.mleft = -1;
  _H521_Curved_94_var._parameters.mright = 2.5;
  _H521_Curved_94_var._parameters.mtop = -1;
  _H521_Curved_94_var._parameters.mbottom = -1;
  _H521_Curved_94_var._parameters.nhslit = 1;
  _H521_Curved_94_var._parameters.G = 0;
  _H521_Curved_94_var._parameters.aleft = -1;
  _H521_Curved_94_var._parameters.aright = -1;
  _H521_Curved_94_var._parameters.atop = -1;
  _H521_Curved_94_var._parameters.abottom = -1;
  _H521_Curved_94_var._parameters.wavy = 0;
  _H521_Curved_94_var._parameters.wavy_z = 0;
  _H521_Curved_94_var._parameters.wavy_tb = 0;
  _H521_Curved_94_var._parameters.wavy_lr = 0;
  _H521_Curved_94_var._parameters.chamfers = 0;
  _H521_Curved_94_var._parameters.chamfers_z = 0;
  _H521_Curved_94_var._parameters.chamfers_lr = 0;
  _H521_Curved_94_var._parameters.chamfers_tb = 0;
  _H521_Curved_94_var._parameters.nelements = 1;
  _H521_Curved_94_var._parameters.nu = 0;
  _H521_Curved_94_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_94_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_94_var._parameters.reflect[0]='\0';


  /* component H521_Curved_94=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_93_var._rotation_absolute, _H521_Curved_94_var._rotation_absolute);
    rot_transpose(_H521_Curved_93_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_94_var._rotation_absolute, tr1, _H521_Curved_94_var._rotation_relative);
    _H521_Curved_94_var._rotation_is_identity =  rot_test_identity(_H521_Curved_94_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_93 , l ) + gGap);
    rot_transpose(_H521_Curved_93_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_94_var._position_absolute = coords_add(_H521_Curved_93_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_93_var._position_absolute, _H521_Curved_94_var._position_absolute);
    _H521_Curved_94_var._position_relative = rot_apply(_H521_Curved_94_var._rotation_absolute, tc1);
  } /* H521_Curved_94=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_94", _H521_Curved_94_var._position_absolute, _H521_Curved_94_var._rotation_absolute);
  instrument->_position_absolute[94] = _H521_Curved_94_var._position_absolute;
  instrument->_position_relative[94] = _H521_Curved_94_var._position_relative;
    _H521_Curved_94_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_94_var._position_relative);
  instrument->counter_N[94]  = instrument->counter_P[94] = instrument->counter_P2[94] = 0;
  instrument->counter_AbsorbProp[94]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0093_H521_Curved_94", _H521_Curved_94_var._position_absolute, _H521_Curved_94_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "h1", "NONE", "COMP_GETPAR ( H521_Curved_93 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "h2", "0", "COMP_GETPAR ( H521_Curved_93 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0093_H521_Curved_94", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_94_setpos */

/* component H521_Curved_95=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_95_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_95_setpos] component H521_Curved_95=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_95_var._name, "H521_Curved_95", 16384);
  stracpy(_H521_Curved_95_var._type, "Guide_gravity", 16384);
  _H521_Curved_95_var._index=95;
  int current_setpos_index = 95;
  _H521_Curved_95_var._parameters.w1 = 0.06;
  _H521_Curved_95_var._parameters.h1 = COMP_GETPAR ( H521_Curved_94 , h2 );
  _H521_Curved_95_var._parameters.w2 = 0.06;
  _H521_Curved_95_var._parameters.h2 = COMP_GETPAR ( H521_Curved_94 , h2 ) + 0.03 / 35;
  _H521_Curved_95_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_95_var._parameters.R0 = gR0;
  _H521_Curved_95_var._parameters.Qc = gQc;
  _H521_Curved_95_var._parameters.alpha = gAlpha;
  _H521_Curved_95_var._parameters.m = 2;
  _H521_Curved_95_var._parameters.W = gW;
  _H521_Curved_95_var._parameters.nslit = 1;
  _H521_Curved_95_var._parameters.d = 0.0005;
  _H521_Curved_95_var._parameters.mleft = -1;
  _H521_Curved_95_var._parameters.mright = 2.5;
  _H521_Curved_95_var._parameters.mtop = -1;
  _H521_Curved_95_var._parameters.mbottom = -1;
  _H521_Curved_95_var._parameters.nhslit = 1;
  _H521_Curved_95_var._parameters.G = 0;
  _H521_Curved_95_var._parameters.aleft = -1;
  _H521_Curved_95_var._parameters.aright = -1;
  _H521_Curved_95_var._parameters.atop = -1;
  _H521_Curved_95_var._parameters.abottom = -1;
  _H521_Curved_95_var._parameters.wavy = 0;
  _H521_Curved_95_var._parameters.wavy_z = 0;
  _H521_Curved_95_var._parameters.wavy_tb = 0;
  _H521_Curved_95_var._parameters.wavy_lr = 0;
  _H521_Curved_95_var._parameters.chamfers = 0;
  _H521_Curved_95_var._parameters.chamfers_z = 0;
  _H521_Curved_95_var._parameters.chamfers_lr = 0;
  _H521_Curved_95_var._parameters.chamfers_tb = 0;
  _H521_Curved_95_var._parameters.nelements = 1;
  _H521_Curved_95_var._parameters.nu = 0;
  _H521_Curved_95_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_95_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_95_var._parameters.reflect[0]='\0';


  /* component H521_Curved_95=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_94_var._rotation_absolute, _H521_Curved_95_var._rotation_absolute);
    rot_transpose(_H521_Curved_94_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_95_var._rotation_absolute, tr1, _H521_Curved_95_var._rotation_relative);
    _H521_Curved_95_var._rotation_is_identity =  rot_test_identity(_H521_Curved_95_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_94 , l ) + gGap);
    rot_transpose(_H521_Curved_94_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_95_var._position_absolute = coords_add(_H521_Curved_94_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_94_var._position_absolute, _H521_Curved_95_var._position_absolute);
    _H521_Curved_95_var._position_relative = rot_apply(_H521_Curved_95_var._rotation_absolute, tc1);
  } /* H521_Curved_95=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_95", _H521_Curved_95_var._position_absolute, _H521_Curved_95_var._rotation_absolute);
  instrument->_position_absolute[95] = _H521_Curved_95_var._position_absolute;
  instrument->_position_relative[95] = _H521_Curved_95_var._position_relative;
    _H521_Curved_95_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_95_var._position_relative);
  instrument->counter_N[95]  = instrument->counter_P[95] = instrument->counter_P2[95] = 0;
  instrument->counter_AbsorbProp[95]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0094_H521_Curved_95", _H521_Curved_95_var._position_absolute, _H521_Curved_95_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "h1", "NONE", "COMP_GETPAR ( H521_Curved_94 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "h2", "0", "COMP_GETPAR ( H521_Curved_94 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0094_H521_Curved_95", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_95_setpos */

/* component H521_Curved_96=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_96_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_96_setpos] component H521_Curved_96=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_96_var._name, "H521_Curved_96", 16384);
  stracpy(_H521_Curved_96_var._type, "Guide_gravity", 16384);
  _H521_Curved_96_var._index=96;
  int current_setpos_index = 96;
  _H521_Curved_96_var._parameters.w1 = 0.06;
  _H521_Curved_96_var._parameters.h1 = COMP_GETPAR ( H521_Curved_95 , h2 );
  _H521_Curved_96_var._parameters.w2 = 0.06;
  _H521_Curved_96_var._parameters.h2 = COMP_GETPAR ( H521_Curved_95 , h2 ) + 0.03 / 35;
  _H521_Curved_96_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_96_var._parameters.R0 = gR0;
  _H521_Curved_96_var._parameters.Qc = gQc;
  _H521_Curved_96_var._parameters.alpha = gAlpha;
  _H521_Curved_96_var._parameters.m = 2;
  _H521_Curved_96_var._parameters.W = gW;
  _H521_Curved_96_var._parameters.nslit = 1;
  _H521_Curved_96_var._parameters.d = 0.0005;
  _H521_Curved_96_var._parameters.mleft = -1;
  _H521_Curved_96_var._parameters.mright = 2.5;
  _H521_Curved_96_var._parameters.mtop = -1;
  _H521_Curved_96_var._parameters.mbottom = -1;
  _H521_Curved_96_var._parameters.nhslit = 1;
  _H521_Curved_96_var._parameters.G = 0;
  _H521_Curved_96_var._parameters.aleft = -1;
  _H521_Curved_96_var._parameters.aright = -1;
  _H521_Curved_96_var._parameters.atop = -1;
  _H521_Curved_96_var._parameters.abottom = -1;
  _H521_Curved_96_var._parameters.wavy = 0;
  _H521_Curved_96_var._parameters.wavy_z = 0;
  _H521_Curved_96_var._parameters.wavy_tb = 0;
  _H521_Curved_96_var._parameters.wavy_lr = 0;
  _H521_Curved_96_var._parameters.chamfers = 0;
  _H521_Curved_96_var._parameters.chamfers_z = 0;
  _H521_Curved_96_var._parameters.chamfers_lr = 0;
  _H521_Curved_96_var._parameters.chamfers_tb = 0;
  _H521_Curved_96_var._parameters.nelements = 1;
  _H521_Curved_96_var._parameters.nu = 0;
  _H521_Curved_96_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_96_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_96_var._parameters.reflect[0]='\0';


  /* component H521_Curved_96=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_95_var._rotation_absolute, _H521_Curved_96_var._rotation_absolute);
    rot_transpose(_H521_Curved_95_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_96_var._rotation_absolute, tr1, _H521_Curved_96_var._rotation_relative);
    _H521_Curved_96_var._rotation_is_identity =  rot_test_identity(_H521_Curved_96_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_95 , l ) + gGap);
    rot_transpose(_H521_Curved_95_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_96_var._position_absolute = coords_add(_H521_Curved_95_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_95_var._position_absolute, _H521_Curved_96_var._position_absolute);
    _H521_Curved_96_var._position_relative = rot_apply(_H521_Curved_96_var._rotation_absolute, tc1);
  } /* H521_Curved_96=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_96", _H521_Curved_96_var._position_absolute, _H521_Curved_96_var._rotation_absolute);
  instrument->_position_absolute[96] = _H521_Curved_96_var._position_absolute;
  instrument->_position_relative[96] = _H521_Curved_96_var._position_relative;
    _H521_Curved_96_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_96_var._position_relative);
  instrument->counter_N[96]  = instrument->counter_P[96] = instrument->counter_P2[96] = 0;
  instrument->counter_AbsorbProp[96]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0095_H521_Curved_96", _H521_Curved_96_var._position_absolute, _H521_Curved_96_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "h1", "NONE", "COMP_GETPAR ( H521_Curved_95 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "h2", "0", "COMP_GETPAR ( H521_Curved_95 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0095_H521_Curved_96", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_96_setpos */

/* component H521_Curved_97=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_97_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_97_setpos] component H521_Curved_97=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_97_var._name, "H521_Curved_97", 16384);
  stracpy(_H521_Curved_97_var._type, "Guide_gravity", 16384);
  _H521_Curved_97_var._index=97;
  int current_setpos_index = 97;
  _H521_Curved_97_var._parameters.w1 = 0.06;
  _H521_Curved_97_var._parameters.h1 = COMP_GETPAR ( H521_Curved_96 , h2 );
  _H521_Curved_97_var._parameters.w2 = 0.06;
  _H521_Curved_97_var._parameters.h2 = COMP_GETPAR ( H521_Curved_96 , h2 ) + 0.03 / 35;
  _H521_Curved_97_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_97_var._parameters.R0 = gR0;
  _H521_Curved_97_var._parameters.Qc = gQc;
  _H521_Curved_97_var._parameters.alpha = gAlpha;
  _H521_Curved_97_var._parameters.m = 2;
  _H521_Curved_97_var._parameters.W = gW;
  _H521_Curved_97_var._parameters.nslit = 1;
  _H521_Curved_97_var._parameters.d = 0.0005;
  _H521_Curved_97_var._parameters.mleft = -1;
  _H521_Curved_97_var._parameters.mright = 2.5;
  _H521_Curved_97_var._parameters.mtop = -1;
  _H521_Curved_97_var._parameters.mbottom = -1;
  _H521_Curved_97_var._parameters.nhslit = 1;
  _H521_Curved_97_var._parameters.G = 0;
  _H521_Curved_97_var._parameters.aleft = -1;
  _H521_Curved_97_var._parameters.aright = -1;
  _H521_Curved_97_var._parameters.atop = -1;
  _H521_Curved_97_var._parameters.abottom = -1;
  _H521_Curved_97_var._parameters.wavy = 0;
  _H521_Curved_97_var._parameters.wavy_z = 0;
  _H521_Curved_97_var._parameters.wavy_tb = 0;
  _H521_Curved_97_var._parameters.wavy_lr = 0;
  _H521_Curved_97_var._parameters.chamfers = 0;
  _H521_Curved_97_var._parameters.chamfers_z = 0;
  _H521_Curved_97_var._parameters.chamfers_lr = 0;
  _H521_Curved_97_var._parameters.chamfers_tb = 0;
  _H521_Curved_97_var._parameters.nelements = 1;
  _H521_Curved_97_var._parameters.nu = 0;
  _H521_Curved_97_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_97_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_97_var._parameters.reflect[0]='\0';


  /* component H521_Curved_97=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_96_var._rotation_absolute, _H521_Curved_97_var._rotation_absolute);
    rot_transpose(_H521_Curved_96_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_97_var._rotation_absolute, tr1, _H521_Curved_97_var._rotation_relative);
    _H521_Curved_97_var._rotation_is_identity =  rot_test_identity(_H521_Curved_97_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_96 , l ) + gGap);
    rot_transpose(_H521_Curved_96_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_97_var._position_absolute = coords_add(_H521_Curved_96_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_96_var._position_absolute, _H521_Curved_97_var._position_absolute);
    _H521_Curved_97_var._position_relative = rot_apply(_H521_Curved_97_var._rotation_absolute, tc1);
  } /* H521_Curved_97=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_97", _H521_Curved_97_var._position_absolute, _H521_Curved_97_var._rotation_absolute);
  instrument->_position_absolute[97] = _H521_Curved_97_var._position_absolute;
  instrument->_position_relative[97] = _H521_Curved_97_var._position_relative;
    _H521_Curved_97_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_97_var._position_relative);
  instrument->counter_N[97]  = instrument->counter_P[97] = instrument->counter_P2[97] = 0;
  instrument->counter_AbsorbProp[97]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0096_H521_Curved_97", _H521_Curved_97_var._position_absolute, _H521_Curved_97_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "h1", "NONE", "COMP_GETPAR ( H521_Curved_96 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "h2", "0", "COMP_GETPAR ( H521_Curved_96 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0096_H521_Curved_97", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_97_setpos */

/* component H521_Curved_98=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_98_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_98_setpos] component H521_Curved_98=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_98_var._name, "H521_Curved_98", 16384);
  stracpy(_H521_Curved_98_var._type, "Guide_gravity", 16384);
  _H521_Curved_98_var._index=98;
  int current_setpos_index = 98;
  _H521_Curved_98_var._parameters.w1 = 0.06;
  _H521_Curved_98_var._parameters.h1 = COMP_GETPAR ( H521_Curved_97 , h2 );
  _H521_Curved_98_var._parameters.w2 = 0.06;
  _H521_Curved_98_var._parameters.h2 = COMP_GETPAR ( H521_Curved_97 , h2 ) + 0.03 / 35;
  _H521_Curved_98_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_98_var._parameters.R0 = gR0;
  _H521_Curved_98_var._parameters.Qc = gQc;
  _H521_Curved_98_var._parameters.alpha = gAlpha;
  _H521_Curved_98_var._parameters.m = 2;
  _H521_Curved_98_var._parameters.W = gW;
  _H521_Curved_98_var._parameters.nslit = 1;
  _H521_Curved_98_var._parameters.d = 0.0005;
  _H521_Curved_98_var._parameters.mleft = -1;
  _H521_Curved_98_var._parameters.mright = 2.5;
  _H521_Curved_98_var._parameters.mtop = -1;
  _H521_Curved_98_var._parameters.mbottom = -1;
  _H521_Curved_98_var._parameters.nhslit = 1;
  _H521_Curved_98_var._parameters.G = 0;
  _H521_Curved_98_var._parameters.aleft = -1;
  _H521_Curved_98_var._parameters.aright = -1;
  _H521_Curved_98_var._parameters.atop = -1;
  _H521_Curved_98_var._parameters.abottom = -1;
  _H521_Curved_98_var._parameters.wavy = 0;
  _H521_Curved_98_var._parameters.wavy_z = 0;
  _H521_Curved_98_var._parameters.wavy_tb = 0;
  _H521_Curved_98_var._parameters.wavy_lr = 0;
  _H521_Curved_98_var._parameters.chamfers = 0;
  _H521_Curved_98_var._parameters.chamfers_z = 0;
  _H521_Curved_98_var._parameters.chamfers_lr = 0;
  _H521_Curved_98_var._parameters.chamfers_tb = 0;
  _H521_Curved_98_var._parameters.nelements = 1;
  _H521_Curved_98_var._parameters.nu = 0;
  _H521_Curved_98_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_98_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_98_var._parameters.reflect[0]='\0';


  /* component H521_Curved_98=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_97_var._rotation_absolute, _H521_Curved_98_var._rotation_absolute);
    rot_transpose(_H521_Curved_97_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_98_var._rotation_absolute, tr1, _H521_Curved_98_var._rotation_relative);
    _H521_Curved_98_var._rotation_is_identity =  rot_test_identity(_H521_Curved_98_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_97 , l ) + gGap);
    rot_transpose(_H521_Curved_97_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_98_var._position_absolute = coords_add(_H521_Curved_97_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_97_var._position_absolute, _H521_Curved_98_var._position_absolute);
    _H521_Curved_98_var._position_relative = rot_apply(_H521_Curved_98_var._rotation_absolute, tc1);
  } /* H521_Curved_98=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_98", _H521_Curved_98_var._position_absolute, _H521_Curved_98_var._rotation_absolute);
  instrument->_position_absolute[98] = _H521_Curved_98_var._position_absolute;
  instrument->_position_relative[98] = _H521_Curved_98_var._position_relative;
    _H521_Curved_98_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_98_var._position_relative);
  instrument->counter_N[98]  = instrument->counter_P[98] = instrument->counter_P2[98] = 0;
  instrument->counter_AbsorbProp[98]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0097_H521_Curved_98", _H521_Curved_98_var._position_absolute, _H521_Curved_98_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "h1", "NONE", "COMP_GETPAR ( H521_Curved_97 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "h2", "0", "COMP_GETPAR ( H521_Curved_97 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0097_H521_Curved_98", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_98_setpos */

/* component H521_Curved_99=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_99_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_99_setpos] component H521_Curved_99=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_99_var._name, "H521_Curved_99", 16384);
  stracpy(_H521_Curved_99_var._type, "Guide_gravity", 16384);
  _H521_Curved_99_var._index=99;
  int current_setpos_index = 99;
  _H521_Curved_99_var._parameters.w1 = 0.06;
  _H521_Curved_99_var._parameters.h1 = COMP_GETPAR ( H521_Curved_98 , h2 );
  _H521_Curved_99_var._parameters.w2 = 0.06;
  _H521_Curved_99_var._parameters.h2 = COMP_GETPAR ( H521_Curved_98 , h2 ) + 0.03 / 35;
  _H521_Curved_99_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_99_var._parameters.R0 = gR0;
  _H521_Curved_99_var._parameters.Qc = gQc;
  _H521_Curved_99_var._parameters.alpha = gAlpha;
  _H521_Curved_99_var._parameters.m = 2;
  _H521_Curved_99_var._parameters.W = gW;
  _H521_Curved_99_var._parameters.nslit = 1;
  _H521_Curved_99_var._parameters.d = 0.0005;
  _H521_Curved_99_var._parameters.mleft = -1;
  _H521_Curved_99_var._parameters.mright = 2.5;
  _H521_Curved_99_var._parameters.mtop = -1;
  _H521_Curved_99_var._parameters.mbottom = -1;
  _H521_Curved_99_var._parameters.nhslit = 1;
  _H521_Curved_99_var._parameters.G = 0;
  _H521_Curved_99_var._parameters.aleft = -1;
  _H521_Curved_99_var._parameters.aright = -1;
  _H521_Curved_99_var._parameters.atop = -1;
  _H521_Curved_99_var._parameters.abottom = -1;
  _H521_Curved_99_var._parameters.wavy = 0;
  _H521_Curved_99_var._parameters.wavy_z = 0;
  _H521_Curved_99_var._parameters.wavy_tb = 0;
  _H521_Curved_99_var._parameters.wavy_lr = 0;
  _H521_Curved_99_var._parameters.chamfers = 0;
  _H521_Curved_99_var._parameters.chamfers_z = 0;
  _H521_Curved_99_var._parameters.chamfers_lr = 0;
  _H521_Curved_99_var._parameters.chamfers_tb = 0;
  _H521_Curved_99_var._parameters.nelements = 1;
  _H521_Curved_99_var._parameters.nu = 0;
  _H521_Curved_99_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_99_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_99_var._parameters.reflect[0]='\0';


  /* component H521_Curved_99=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_98_var._rotation_absolute, _H521_Curved_99_var._rotation_absolute);
    rot_transpose(_H521_Curved_98_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_99_var._rotation_absolute, tr1, _H521_Curved_99_var._rotation_relative);
    _H521_Curved_99_var._rotation_is_identity =  rot_test_identity(_H521_Curved_99_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_98 , l ) + gGap);
    rot_transpose(_H521_Curved_98_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_99_var._position_absolute = coords_add(_H521_Curved_98_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_98_var._position_absolute, _H521_Curved_99_var._position_absolute);
    _H521_Curved_99_var._position_relative = rot_apply(_H521_Curved_99_var._rotation_absolute, tc1);
  } /* H521_Curved_99=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_99", _H521_Curved_99_var._position_absolute, _H521_Curved_99_var._rotation_absolute);
  instrument->_position_absolute[99] = _H521_Curved_99_var._position_absolute;
  instrument->_position_relative[99] = _H521_Curved_99_var._position_relative;
    _H521_Curved_99_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_99_var._position_relative);
  instrument->counter_N[99]  = instrument->counter_P[99] = instrument->counter_P2[99] = 0;
  instrument->counter_AbsorbProp[99]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0098_H521_Curved_99", _H521_Curved_99_var._position_absolute, _H521_Curved_99_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "h1", "NONE", "COMP_GETPAR ( H521_Curved_98 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "h2", "0", "COMP_GETPAR ( H521_Curved_98 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0098_H521_Curved_99", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_99_setpos */

/* component H521_Curved_100=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_100_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_100_setpos] component H521_Curved_100=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_100_var._name, "H521_Curved_100", 16384);
  stracpy(_H521_Curved_100_var._type, "Guide_gravity", 16384);
  _H521_Curved_100_var._index=100;
  int current_setpos_index = 100;
  _H521_Curved_100_var._parameters.w1 = 0.06;
  _H521_Curved_100_var._parameters.h1 = COMP_GETPAR ( H521_Curved_99 , h2 );
  _H521_Curved_100_var._parameters.w2 = 0.06;
  _H521_Curved_100_var._parameters.h2 = COMP_GETPAR ( H521_Curved_99 , h2 ) + 0.03 / 35;
  _H521_Curved_100_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_100_var._parameters.R0 = gR0;
  _H521_Curved_100_var._parameters.Qc = gQc;
  _H521_Curved_100_var._parameters.alpha = gAlpha;
  _H521_Curved_100_var._parameters.m = 2;
  _H521_Curved_100_var._parameters.W = gW;
  _H521_Curved_100_var._parameters.nslit = 1;
  _H521_Curved_100_var._parameters.d = 0.0005;
  _H521_Curved_100_var._parameters.mleft = -1;
  _H521_Curved_100_var._parameters.mright = 2.5;
  _H521_Curved_100_var._parameters.mtop = -1;
  _H521_Curved_100_var._parameters.mbottom = -1;
  _H521_Curved_100_var._parameters.nhslit = 1;
  _H521_Curved_100_var._parameters.G = 0;
  _H521_Curved_100_var._parameters.aleft = -1;
  _H521_Curved_100_var._parameters.aright = -1;
  _H521_Curved_100_var._parameters.atop = -1;
  _H521_Curved_100_var._parameters.abottom = -1;
  _H521_Curved_100_var._parameters.wavy = 0;
  _H521_Curved_100_var._parameters.wavy_z = 0;
  _H521_Curved_100_var._parameters.wavy_tb = 0;
  _H521_Curved_100_var._parameters.wavy_lr = 0;
  _H521_Curved_100_var._parameters.chamfers = 0;
  _H521_Curved_100_var._parameters.chamfers_z = 0;
  _H521_Curved_100_var._parameters.chamfers_lr = 0;
  _H521_Curved_100_var._parameters.chamfers_tb = 0;
  _H521_Curved_100_var._parameters.nelements = 1;
  _H521_Curved_100_var._parameters.nu = 0;
  _H521_Curved_100_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_100_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_100_var._parameters.reflect[0]='\0';


  /* component H521_Curved_100=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_99_var._rotation_absolute, _H521_Curved_100_var._rotation_absolute);
    rot_transpose(_H521_Curved_99_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_100_var._rotation_absolute, tr1, _H521_Curved_100_var._rotation_relative);
    _H521_Curved_100_var._rotation_is_identity =  rot_test_identity(_H521_Curved_100_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_99 , l ) + gGap);
    rot_transpose(_H521_Curved_99_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_100_var._position_absolute = coords_add(_H521_Curved_99_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_99_var._position_absolute, _H521_Curved_100_var._position_absolute);
    _H521_Curved_100_var._position_relative = rot_apply(_H521_Curved_100_var._rotation_absolute, tc1);
  } /* H521_Curved_100=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_100", _H521_Curved_100_var._position_absolute, _H521_Curved_100_var._rotation_absolute);
  instrument->_position_absolute[100] = _H521_Curved_100_var._position_absolute;
  instrument->_position_relative[100] = _H521_Curved_100_var._position_relative;
    _H521_Curved_100_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_100_var._position_relative);
  instrument->counter_N[100]  = instrument->counter_P[100] = instrument->counter_P2[100] = 0;
  instrument->counter_AbsorbProp[100]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0099_H521_Curved_100", _H521_Curved_100_var._position_absolute, _H521_Curved_100_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "h1", "NONE", "COMP_GETPAR ( H521_Curved_99 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "h2", "0", "COMP_GETPAR ( H521_Curved_99 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0099_H521_Curved_100", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_100_setpos */

/* component H521_Curved_101=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_101_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_101_setpos] component H521_Curved_101=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_101_var._name, "H521_Curved_101", 16384);
  stracpy(_H521_Curved_101_var._type, "Guide_gravity", 16384);
  _H521_Curved_101_var._index=101;
  int current_setpos_index = 101;
  _H521_Curved_101_var._parameters.w1 = 0.06;
  _H521_Curved_101_var._parameters.h1 = COMP_GETPAR ( H521_Curved_100 , h2 );
  _H521_Curved_101_var._parameters.w2 = 0.06;
  _H521_Curved_101_var._parameters.h2 = COMP_GETPAR ( H521_Curved_100 , h2 ) + 0.03 / 35;
  _H521_Curved_101_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_101_var._parameters.R0 = gR0;
  _H521_Curved_101_var._parameters.Qc = gQc;
  _H521_Curved_101_var._parameters.alpha = gAlpha;
  _H521_Curved_101_var._parameters.m = 2;
  _H521_Curved_101_var._parameters.W = gW;
  _H521_Curved_101_var._parameters.nslit = 1;
  _H521_Curved_101_var._parameters.d = 0.0005;
  _H521_Curved_101_var._parameters.mleft = -1;
  _H521_Curved_101_var._parameters.mright = 2.5;
  _H521_Curved_101_var._parameters.mtop = -1;
  _H521_Curved_101_var._parameters.mbottom = -1;
  _H521_Curved_101_var._parameters.nhslit = 1;
  _H521_Curved_101_var._parameters.G = 0;
  _H521_Curved_101_var._parameters.aleft = -1;
  _H521_Curved_101_var._parameters.aright = -1;
  _H521_Curved_101_var._parameters.atop = -1;
  _H521_Curved_101_var._parameters.abottom = -1;
  _H521_Curved_101_var._parameters.wavy = 0;
  _H521_Curved_101_var._parameters.wavy_z = 0;
  _H521_Curved_101_var._parameters.wavy_tb = 0;
  _H521_Curved_101_var._parameters.wavy_lr = 0;
  _H521_Curved_101_var._parameters.chamfers = 0;
  _H521_Curved_101_var._parameters.chamfers_z = 0;
  _H521_Curved_101_var._parameters.chamfers_lr = 0;
  _H521_Curved_101_var._parameters.chamfers_tb = 0;
  _H521_Curved_101_var._parameters.nelements = 1;
  _H521_Curved_101_var._parameters.nu = 0;
  _H521_Curved_101_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_101_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_101_var._parameters.reflect[0]='\0';


  /* component H521_Curved_101=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_100_var._rotation_absolute, _H521_Curved_101_var._rotation_absolute);
    rot_transpose(_H521_Curved_100_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_101_var._rotation_absolute, tr1, _H521_Curved_101_var._rotation_relative);
    _H521_Curved_101_var._rotation_is_identity =  rot_test_identity(_H521_Curved_101_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_100 , l ) + gGap);
    rot_transpose(_H521_Curved_100_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_101_var._position_absolute = coords_add(_H521_Curved_100_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_100_var._position_absolute, _H521_Curved_101_var._position_absolute);
    _H521_Curved_101_var._position_relative = rot_apply(_H521_Curved_101_var._rotation_absolute, tc1);
  } /* H521_Curved_101=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_101", _H521_Curved_101_var._position_absolute, _H521_Curved_101_var._rotation_absolute);
  instrument->_position_absolute[101] = _H521_Curved_101_var._position_absolute;
  instrument->_position_relative[101] = _H521_Curved_101_var._position_relative;
    _H521_Curved_101_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_101_var._position_relative);
  instrument->counter_N[101]  = instrument->counter_P[101] = instrument->counter_P2[101] = 0;
  instrument->counter_AbsorbProp[101]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0100_H521_Curved_101", _H521_Curved_101_var._position_absolute, _H521_Curved_101_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "h1", "NONE", "COMP_GETPAR ( H521_Curved_100 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "h2", "0", "COMP_GETPAR ( H521_Curved_100 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0100_H521_Curved_101", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_101_setpos */

/* component H521_Curved_102=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_102_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_102_setpos] component H521_Curved_102=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_102_var._name, "H521_Curved_102", 16384);
  stracpy(_H521_Curved_102_var._type, "Guide_gravity", 16384);
  _H521_Curved_102_var._index=102;
  int current_setpos_index = 102;
  _H521_Curved_102_var._parameters.w1 = 0.06;
  _H521_Curved_102_var._parameters.h1 = COMP_GETPAR ( H521_Curved_101 , h2 );
  _H521_Curved_102_var._parameters.w2 = 0.06;
  _H521_Curved_102_var._parameters.h2 = COMP_GETPAR ( H521_Curved_101 , h2 ) + 0.03 / 35;
  _H521_Curved_102_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_102_var._parameters.R0 = gR0;
  _H521_Curved_102_var._parameters.Qc = gQc;
  _H521_Curved_102_var._parameters.alpha = gAlpha;
  _H521_Curved_102_var._parameters.m = 2;
  _H521_Curved_102_var._parameters.W = gW;
  _H521_Curved_102_var._parameters.nslit = 1;
  _H521_Curved_102_var._parameters.d = 0.0005;
  _H521_Curved_102_var._parameters.mleft = -1;
  _H521_Curved_102_var._parameters.mright = 2.5;
  _H521_Curved_102_var._parameters.mtop = -1;
  _H521_Curved_102_var._parameters.mbottom = -1;
  _H521_Curved_102_var._parameters.nhslit = 1;
  _H521_Curved_102_var._parameters.G = 0;
  _H521_Curved_102_var._parameters.aleft = -1;
  _H521_Curved_102_var._parameters.aright = -1;
  _H521_Curved_102_var._parameters.atop = -1;
  _H521_Curved_102_var._parameters.abottom = -1;
  _H521_Curved_102_var._parameters.wavy = 0;
  _H521_Curved_102_var._parameters.wavy_z = 0;
  _H521_Curved_102_var._parameters.wavy_tb = 0;
  _H521_Curved_102_var._parameters.wavy_lr = 0;
  _H521_Curved_102_var._parameters.chamfers = 0;
  _H521_Curved_102_var._parameters.chamfers_z = 0;
  _H521_Curved_102_var._parameters.chamfers_lr = 0;
  _H521_Curved_102_var._parameters.chamfers_tb = 0;
  _H521_Curved_102_var._parameters.nelements = 1;
  _H521_Curved_102_var._parameters.nu = 0;
  _H521_Curved_102_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_102_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_102_var._parameters.reflect[0]='\0';


  /* component H521_Curved_102=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_101_var._rotation_absolute, _H521_Curved_102_var._rotation_absolute);
    rot_transpose(_H521_Curved_101_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_102_var._rotation_absolute, tr1, _H521_Curved_102_var._rotation_relative);
    _H521_Curved_102_var._rotation_is_identity =  rot_test_identity(_H521_Curved_102_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_101 , l ) + gGap);
    rot_transpose(_H521_Curved_101_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_102_var._position_absolute = coords_add(_H521_Curved_101_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_101_var._position_absolute, _H521_Curved_102_var._position_absolute);
    _H521_Curved_102_var._position_relative = rot_apply(_H521_Curved_102_var._rotation_absolute, tc1);
  } /* H521_Curved_102=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_102", _H521_Curved_102_var._position_absolute, _H521_Curved_102_var._rotation_absolute);
  instrument->_position_absolute[102] = _H521_Curved_102_var._position_absolute;
  instrument->_position_relative[102] = _H521_Curved_102_var._position_relative;
    _H521_Curved_102_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_102_var._position_relative);
  instrument->counter_N[102]  = instrument->counter_P[102] = instrument->counter_P2[102] = 0;
  instrument->counter_AbsorbProp[102]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0101_H521_Curved_102", _H521_Curved_102_var._position_absolute, _H521_Curved_102_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "h1", "NONE", "COMP_GETPAR ( H521_Curved_101 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "h2", "0", "COMP_GETPAR ( H521_Curved_101 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0101_H521_Curved_102", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_102_setpos */

/* component H521_Curved_103=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_103_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_103_setpos] component H521_Curved_103=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_103_var._name, "H521_Curved_103", 16384);
  stracpy(_H521_Curved_103_var._type, "Guide_gravity", 16384);
  _H521_Curved_103_var._index=103;
  int current_setpos_index = 103;
  _H521_Curved_103_var._parameters.w1 = 0.06;
  _H521_Curved_103_var._parameters.h1 = COMP_GETPAR ( H521_Curved_102 , h2 );
  _H521_Curved_103_var._parameters.w2 = 0.06;
  _H521_Curved_103_var._parameters.h2 = COMP_GETPAR ( H521_Curved_102 , h2 ) + 0.03 / 35;
  _H521_Curved_103_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_103_var._parameters.R0 = gR0;
  _H521_Curved_103_var._parameters.Qc = gQc;
  _H521_Curved_103_var._parameters.alpha = gAlpha;
  _H521_Curved_103_var._parameters.m = 2;
  _H521_Curved_103_var._parameters.W = gW;
  _H521_Curved_103_var._parameters.nslit = 1;
  _H521_Curved_103_var._parameters.d = 0.0005;
  _H521_Curved_103_var._parameters.mleft = -1;
  _H521_Curved_103_var._parameters.mright = 2.5;
  _H521_Curved_103_var._parameters.mtop = -1;
  _H521_Curved_103_var._parameters.mbottom = -1;
  _H521_Curved_103_var._parameters.nhslit = 1;
  _H521_Curved_103_var._parameters.G = 0;
  _H521_Curved_103_var._parameters.aleft = -1;
  _H521_Curved_103_var._parameters.aright = -1;
  _H521_Curved_103_var._parameters.atop = -1;
  _H521_Curved_103_var._parameters.abottom = -1;
  _H521_Curved_103_var._parameters.wavy = 0;
  _H521_Curved_103_var._parameters.wavy_z = 0;
  _H521_Curved_103_var._parameters.wavy_tb = 0;
  _H521_Curved_103_var._parameters.wavy_lr = 0;
  _H521_Curved_103_var._parameters.chamfers = 0;
  _H521_Curved_103_var._parameters.chamfers_z = 0;
  _H521_Curved_103_var._parameters.chamfers_lr = 0;
  _H521_Curved_103_var._parameters.chamfers_tb = 0;
  _H521_Curved_103_var._parameters.nelements = 1;
  _H521_Curved_103_var._parameters.nu = 0;
  _H521_Curved_103_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_103_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_103_var._parameters.reflect[0]='\0';


  /* component H521_Curved_103=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_102_var._rotation_absolute, _H521_Curved_103_var._rotation_absolute);
    rot_transpose(_H521_Curved_102_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_103_var._rotation_absolute, tr1, _H521_Curved_103_var._rotation_relative);
    _H521_Curved_103_var._rotation_is_identity =  rot_test_identity(_H521_Curved_103_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_102 , l ) + gGap);
    rot_transpose(_H521_Curved_102_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_103_var._position_absolute = coords_add(_H521_Curved_102_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_102_var._position_absolute, _H521_Curved_103_var._position_absolute);
    _H521_Curved_103_var._position_relative = rot_apply(_H521_Curved_103_var._rotation_absolute, tc1);
  } /* H521_Curved_103=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_103", _H521_Curved_103_var._position_absolute, _H521_Curved_103_var._rotation_absolute);
  instrument->_position_absolute[103] = _H521_Curved_103_var._position_absolute;
  instrument->_position_relative[103] = _H521_Curved_103_var._position_relative;
    _H521_Curved_103_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_103_var._position_relative);
  instrument->counter_N[103]  = instrument->counter_P[103] = instrument->counter_P2[103] = 0;
  instrument->counter_AbsorbProp[103]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0102_H521_Curved_103", _H521_Curved_103_var._position_absolute, _H521_Curved_103_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "h1", "NONE", "COMP_GETPAR ( H521_Curved_102 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "h2", "0", "COMP_GETPAR ( H521_Curved_102 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0102_H521_Curved_103", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_103_setpos */

/* component H521_Curved_104=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_104_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_104_setpos] component H521_Curved_104=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_104_var._name, "H521_Curved_104", 16384);
  stracpy(_H521_Curved_104_var._type, "Guide_gravity", 16384);
  _H521_Curved_104_var._index=104;
  int current_setpos_index = 104;
  _H521_Curved_104_var._parameters.w1 = 0.06;
  _H521_Curved_104_var._parameters.h1 = COMP_GETPAR ( H521_Curved_103 , h2 );
  _H521_Curved_104_var._parameters.w2 = 0.06;
  _H521_Curved_104_var._parameters.h2 = COMP_GETPAR ( H521_Curved_103 , h2 ) + 0.03 / 35;
  _H521_Curved_104_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_104_var._parameters.R0 = gR0;
  _H521_Curved_104_var._parameters.Qc = gQc;
  _H521_Curved_104_var._parameters.alpha = gAlpha;
  _H521_Curved_104_var._parameters.m = 2;
  _H521_Curved_104_var._parameters.W = gW;
  _H521_Curved_104_var._parameters.nslit = 1;
  _H521_Curved_104_var._parameters.d = 0.0005;
  _H521_Curved_104_var._parameters.mleft = -1;
  _H521_Curved_104_var._parameters.mright = 2.5;
  _H521_Curved_104_var._parameters.mtop = -1;
  _H521_Curved_104_var._parameters.mbottom = -1;
  _H521_Curved_104_var._parameters.nhslit = 1;
  _H521_Curved_104_var._parameters.G = 0;
  _H521_Curved_104_var._parameters.aleft = -1;
  _H521_Curved_104_var._parameters.aright = -1;
  _H521_Curved_104_var._parameters.atop = -1;
  _H521_Curved_104_var._parameters.abottom = -1;
  _H521_Curved_104_var._parameters.wavy = 0;
  _H521_Curved_104_var._parameters.wavy_z = 0;
  _H521_Curved_104_var._parameters.wavy_tb = 0;
  _H521_Curved_104_var._parameters.wavy_lr = 0;
  _H521_Curved_104_var._parameters.chamfers = 0;
  _H521_Curved_104_var._parameters.chamfers_z = 0;
  _H521_Curved_104_var._parameters.chamfers_lr = 0;
  _H521_Curved_104_var._parameters.chamfers_tb = 0;
  _H521_Curved_104_var._parameters.nelements = 1;
  _H521_Curved_104_var._parameters.nu = 0;
  _H521_Curved_104_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_104_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_104_var._parameters.reflect[0]='\0';


  /* component H521_Curved_104=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_103_var._rotation_absolute, _H521_Curved_104_var._rotation_absolute);
    rot_transpose(_H521_Curved_103_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_104_var._rotation_absolute, tr1, _H521_Curved_104_var._rotation_relative);
    _H521_Curved_104_var._rotation_is_identity =  rot_test_identity(_H521_Curved_104_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_103 , l ) + gGap);
    rot_transpose(_H521_Curved_103_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_104_var._position_absolute = coords_add(_H521_Curved_103_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_103_var._position_absolute, _H521_Curved_104_var._position_absolute);
    _H521_Curved_104_var._position_relative = rot_apply(_H521_Curved_104_var._rotation_absolute, tc1);
  } /* H521_Curved_104=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_104", _H521_Curved_104_var._position_absolute, _H521_Curved_104_var._rotation_absolute);
  instrument->_position_absolute[104] = _H521_Curved_104_var._position_absolute;
  instrument->_position_relative[104] = _H521_Curved_104_var._position_relative;
    _H521_Curved_104_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_104_var._position_relative);
  instrument->counter_N[104]  = instrument->counter_P[104] = instrument->counter_P2[104] = 0;
  instrument->counter_AbsorbProp[104]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0103_H521_Curved_104", _H521_Curved_104_var._position_absolute, _H521_Curved_104_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "h1", "NONE", "COMP_GETPAR ( H521_Curved_103 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "h2", "0", "COMP_GETPAR ( H521_Curved_103 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0103_H521_Curved_104", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_104_setpos */

/* component H521_Curved_105=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_105_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_105_setpos] component H521_Curved_105=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_105_var._name, "H521_Curved_105", 16384);
  stracpy(_H521_Curved_105_var._type, "Guide_gravity", 16384);
  _H521_Curved_105_var._index=105;
  int current_setpos_index = 105;
  _H521_Curved_105_var._parameters.w1 = 0.06;
  _H521_Curved_105_var._parameters.h1 = COMP_GETPAR ( H521_Curved_104 , h2 );
  _H521_Curved_105_var._parameters.w2 = 0.06;
  _H521_Curved_105_var._parameters.h2 = COMP_GETPAR ( H521_Curved_104 , h2 ) + 0.03 / 35;
  _H521_Curved_105_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_105_var._parameters.R0 = gR0;
  _H521_Curved_105_var._parameters.Qc = gQc;
  _H521_Curved_105_var._parameters.alpha = gAlpha;
  _H521_Curved_105_var._parameters.m = 2;
  _H521_Curved_105_var._parameters.W = gW;
  _H521_Curved_105_var._parameters.nslit = 1;
  _H521_Curved_105_var._parameters.d = 0.0005;
  _H521_Curved_105_var._parameters.mleft = -1;
  _H521_Curved_105_var._parameters.mright = 2.5;
  _H521_Curved_105_var._parameters.mtop = -1;
  _H521_Curved_105_var._parameters.mbottom = -1;
  _H521_Curved_105_var._parameters.nhslit = 1;
  _H521_Curved_105_var._parameters.G = 0;
  _H521_Curved_105_var._parameters.aleft = -1;
  _H521_Curved_105_var._parameters.aright = -1;
  _H521_Curved_105_var._parameters.atop = -1;
  _H521_Curved_105_var._parameters.abottom = -1;
  _H521_Curved_105_var._parameters.wavy = 0;
  _H521_Curved_105_var._parameters.wavy_z = 0;
  _H521_Curved_105_var._parameters.wavy_tb = 0;
  _H521_Curved_105_var._parameters.wavy_lr = 0;
  _H521_Curved_105_var._parameters.chamfers = 0;
  _H521_Curved_105_var._parameters.chamfers_z = 0;
  _H521_Curved_105_var._parameters.chamfers_lr = 0;
  _H521_Curved_105_var._parameters.chamfers_tb = 0;
  _H521_Curved_105_var._parameters.nelements = 1;
  _H521_Curved_105_var._parameters.nu = 0;
  _H521_Curved_105_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_105_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_105_var._parameters.reflect[0]='\0';


  /* component H521_Curved_105=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_104_var._rotation_absolute, _H521_Curved_105_var._rotation_absolute);
    rot_transpose(_H521_Curved_104_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_105_var._rotation_absolute, tr1, _H521_Curved_105_var._rotation_relative);
    _H521_Curved_105_var._rotation_is_identity =  rot_test_identity(_H521_Curved_105_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_104 , l ) + gGap);
    rot_transpose(_H521_Curved_104_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_105_var._position_absolute = coords_add(_H521_Curved_104_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_104_var._position_absolute, _H521_Curved_105_var._position_absolute);
    _H521_Curved_105_var._position_relative = rot_apply(_H521_Curved_105_var._rotation_absolute, tc1);
  } /* H521_Curved_105=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_105", _H521_Curved_105_var._position_absolute, _H521_Curved_105_var._rotation_absolute);
  instrument->_position_absolute[105] = _H521_Curved_105_var._position_absolute;
  instrument->_position_relative[105] = _H521_Curved_105_var._position_relative;
    _H521_Curved_105_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_105_var._position_relative);
  instrument->counter_N[105]  = instrument->counter_P[105] = instrument->counter_P2[105] = 0;
  instrument->counter_AbsorbProp[105]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0104_H521_Curved_105", _H521_Curved_105_var._position_absolute, _H521_Curved_105_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "h1", "NONE", "COMP_GETPAR ( H521_Curved_104 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "h2", "0", "COMP_GETPAR ( H521_Curved_104 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0104_H521_Curved_105", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_105_setpos */

/* component H521_Curved_106=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_106_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_106_setpos] component H521_Curved_106=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_106_var._name, "H521_Curved_106", 16384);
  stracpy(_H521_Curved_106_var._type, "Guide_gravity", 16384);
  _H521_Curved_106_var._index=106;
  int current_setpos_index = 106;
  _H521_Curved_106_var._parameters.w1 = 0.06;
  _H521_Curved_106_var._parameters.h1 = COMP_GETPAR ( H521_Curved_105 , h2 );
  _H521_Curved_106_var._parameters.w2 = 0.06;
  _H521_Curved_106_var._parameters.h2 = COMP_GETPAR ( H521_Curved_105 , h2 ) + 0.03 / 35;
  _H521_Curved_106_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_106_var._parameters.R0 = gR0;
  _H521_Curved_106_var._parameters.Qc = gQc;
  _H521_Curved_106_var._parameters.alpha = gAlpha;
  _H521_Curved_106_var._parameters.m = 2;
  _H521_Curved_106_var._parameters.W = gW;
  _H521_Curved_106_var._parameters.nslit = 1;
  _H521_Curved_106_var._parameters.d = 0.0005;
  _H521_Curved_106_var._parameters.mleft = -1;
  _H521_Curved_106_var._parameters.mright = 2.5;
  _H521_Curved_106_var._parameters.mtop = -1;
  _H521_Curved_106_var._parameters.mbottom = -1;
  _H521_Curved_106_var._parameters.nhslit = 1;
  _H521_Curved_106_var._parameters.G = 0;
  _H521_Curved_106_var._parameters.aleft = -1;
  _H521_Curved_106_var._parameters.aright = -1;
  _H521_Curved_106_var._parameters.atop = -1;
  _H521_Curved_106_var._parameters.abottom = -1;
  _H521_Curved_106_var._parameters.wavy = 0;
  _H521_Curved_106_var._parameters.wavy_z = 0;
  _H521_Curved_106_var._parameters.wavy_tb = 0;
  _H521_Curved_106_var._parameters.wavy_lr = 0;
  _H521_Curved_106_var._parameters.chamfers = 0;
  _H521_Curved_106_var._parameters.chamfers_z = 0;
  _H521_Curved_106_var._parameters.chamfers_lr = 0;
  _H521_Curved_106_var._parameters.chamfers_tb = 0;
  _H521_Curved_106_var._parameters.nelements = 1;
  _H521_Curved_106_var._parameters.nu = 0;
  _H521_Curved_106_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_106_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_106_var._parameters.reflect[0]='\0';


  /* component H521_Curved_106=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_105_var._rotation_absolute, _H521_Curved_106_var._rotation_absolute);
    rot_transpose(_H521_Curved_105_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_106_var._rotation_absolute, tr1, _H521_Curved_106_var._rotation_relative);
    _H521_Curved_106_var._rotation_is_identity =  rot_test_identity(_H521_Curved_106_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_105 , l ) + gGap);
    rot_transpose(_H521_Curved_105_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_106_var._position_absolute = coords_add(_H521_Curved_105_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_105_var._position_absolute, _H521_Curved_106_var._position_absolute);
    _H521_Curved_106_var._position_relative = rot_apply(_H521_Curved_106_var._rotation_absolute, tc1);
  } /* H521_Curved_106=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_106", _H521_Curved_106_var._position_absolute, _H521_Curved_106_var._rotation_absolute);
  instrument->_position_absolute[106] = _H521_Curved_106_var._position_absolute;
  instrument->_position_relative[106] = _H521_Curved_106_var._position_relative;
    _H521_Curved_106_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_106_var._position_relative);
  instrument->counter_N[106]  = instrument->counter_P[106] = instrument->counter_P2[106] = 0;
  instrument->counter_AbsorbProp[106]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0105_H521_Curved_106", _H521_Curved_106_var._position_absolute, _H521_Curved_106_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "h1", "NONE", "COMP_GETPAR ( H521_Curved_105 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "h2", "0", "COMP_GETPAR ( H521_Curved_105 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0105_H521_Curved_106", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_106_setpos */

/* component H521_Curved_107=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Curved_107_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_107_setpos] component H521_Curved_107=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Curved_107_var._name, "H521_Curved_107", 16384);
  stracpy(_H521_Curved_107_var._type, "Guide_gravity", 16384);
  _H521_Curved_107_var._index=107;
  int current_setpos_index = 107;
  _H521_Curved_107_var._parameters.w1 = 0.06;
  _H521_Curved_107_var._parameters.h1 = COMP_GETPAR ( H521_Curved_106 , h2 );
  _H521_Curved_107_var._parameters.w2 = 0.06;
  _H521_Curved_107_var._parameters.h2 = COMP_GETPAR ( H521_Curved_106 , h2 ) + 0.03 / 35;
  _H521_Curved_107_var._parameters.l = 35.0 / 35.0;
  _H521_Curved_107_var._parameters.R0 = gR0;
  _H521_Curved_107_var._parameters.Qc = gQc;
  _H521_Curved_107_var._parameters.alpha = gAlpha;
  _H521_Curved_107_var._parameters.m = 2;
  _H521_Curved_107_var._parameters.W = gW;
  _H521_Curved_107_var._parameters.nslit = 1;
  _H521_Curved_107_var._parameters.d = 0.0005;
  _H521_Curved_107_var._parameters.mleft = -1;
  _H521_Curved_107_var._parameters.mright = 2.5;
  _H521_Curved_107_var._parameters.mtop = -1;
  _H521_Curved_107_var._parameters.mbottom = -1;
  _H521_Curved_107_var._parameters.nhslit = 1;
  _H521_Curved_107_var._parameters.G = 0;
  _H521_Curved_107_var._parameters.aleft = -1;
  _H521_Curved_107_var._parameters.aright = -1;
  _H521_Curved_107_var._parameters.atop = -1;
  _H521_Curved_107_var._parameters.abottom = -1;
  _H521_Curved_107_var._parameters.wavy = 0;
  _H521_Curved_107_var._parameters.wavy_z = 0;
  _H521_Curved_107_var._parameters.wavy_tb = 0;
  _H521_Curved_107_var._parameters.wavy_lr = 0;
  _H521_Curved_107_var._parameters.chamfers = 0;
  _H521_Curved_107_var._parameters.chamfers_z = 0;
  _H521_Curved_107_var._parameters.chamfers_lr = 0;
  _H521_Curved_107_var._parameters.chamfers_tb = 0;
  _H521_Curved_107_var._parameters.nelements = 1;
  _H521_Curved_107_var._parameters.nu = 0;
  _H521_Curved_107_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_107_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_107_var._parameters.reflect[0]='\0';


  /* component H521_Curved_107=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35.0 / 1500 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_106_var._rotation_absolute, _H521_Curved_107_var._rotation_absolute);
    rot_transpose(_H521_Curved_106_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_107_var._rotation_absolute, tr1, _H521_Curved_107_var._rotation_relative);
    _H521_Curved_107_var._rotation_is_identity =  rot_test_identity(_H521_Curved_107_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_106 , l ) + gGap);
    rot_transpose(_H521_Curved_106_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_107_var._position_absolute = coords_add(_H521_Curved_106_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_106_var._position_absolute, _H521_Curved_107_var._position_absolute);
    _H521_Curved_107_var._position_relative = rot_apply(_H521_Curved_107_var._rotation_absolute, tc1);
  } /* H521_Curved_107=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_107", _H521_Curved_107_var._position_absolute, _H521_Curved_107_var._rotation_absolute);
  instrument->_position_absolute[107] = _H521_Curved_107_var._position_absolute;
  instrument->_position_relative[107] = _H521_Curved_107_var._position_relative;
    _H521_Curved_107_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_107_var._position_relative);
  instrument->counter_N[107]  = instrument->counter_P[107] = instrument->counter_P2[107] = 0;
  instrument->counter_AbsorbProp[107]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0106_H521_Curved_107", _H521_Curved_107_var._position_absolute, _H521_Curved_107_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "h1", "NONE", "COMP_GETPAR ( H521_Curved_106 , h2 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "w2", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "h2", "0", "COMP_GETPAR ( H521_Curved_106 , h2 ) + 0.03 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "l", "NONE", "35.0 / 35.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "mright", "-1", "2.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0106_H521_Curved_107", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_107_setpos */

/* component HCS_Al_108=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_108_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_108_setpos] component HCS_Al_108=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_108_var._name, "HCS_Al_108", 16384);
  stracpy(_HCS_Al_108_var._type, "PowderN", 16384);
  _HCS_Al_108_var._index=108;
  int current_setpos_index = 108;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_108_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_108_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_108_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_108_var._parameters.geometry[0]='\0';
  _HCS_Al_108_var._parameters.format[0] = 0;
  _HCS_Al_108_var._parameters.format[1] = 0;
  _HCS_Al_108_var._parameters.format[2] = 0;
  _HCS_Al_108_var._parameters.format[3] = 0;
  _HCS_Al_108_var._parameters.format[4] = 0;
  _HCS_Al_108_var._parameters.format[5] = 0;
  _HCS_Al_108_var._parameters.format[6] = 0;
  _HCS_Al_108_var._parameters.format[7] = 0;
  _HCS_Al_108_var._parameters.format[8] = 0;
  _HCS_Al_108_var._parameters.radius = 0;
  _HCS_Al_108_var._parameters.yheight = 0.15;
  _HCS_Al_108_var._parameters.xwidth = 0.06;
  _HCS_Al_108_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_108_var._parameters.thickness = 0;
  _HCS_Al_108_var._parameters.pack = 1;
  _HCS_Al_108_var._parameters.Vc = 0;
  _HCS_Al_108_var._parameters.sigma_abs = 0;
  _HCS_Al_108_var._parameters.sigma_inc = 0;
  _HCS_Al_108_var._parameters.delta_d_d = 0;
  _HCS_Al_108_var._parameters.p_inc = 0.005;
  _HCS_Al_108_var._parameters.p_transmit = 0.9450;
  _HCS_Al_108_var._parameters.DW = 0;
  _HCS_Al_108_var._parameters.nb_atoms = 1;
  _HCS_Al_108_var._parameters.d_omega = 0;
  _HCS_Al_108_var._parameters.d_phi = 10;
  _HCS_Al_108_var._parameters.tth_sign = 0;
  _HCS_Al_108_var._parameters.p_interact = 0.05;
  _HCS_Al_108_var._parameters.concentric = 0;
  _HCS_Al_108_var._parameters.density = 0;
  _HCS_Al_108_var._parameters.weight = 0;
  _HCS_Al_108_var._parameters.barns = 1;
  _HCS_Al_108_var._parameters.Strain = 0;
  _HCS_Al_108_var._parameters.focus_flip = 0;
  _HCS_Al_108_var._parameters.target_index = 0;
  _HCS_Al_108_var._parameters.order = 1;


  /* component HCS_Al_108=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_107_var._rotation_absolute, _HCS_Al_108_var._rotation_absolute);
    rot_transpose(_H521_Curved_107_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_108_var._rotation_absolute, tr1, _HCS_Al_108_var._rotation_relative);
    _HCS_Al_108_var._rotation_is_identity =  rot_test_identity(_HCS_Al_108_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Curved_107 , l ) + gGap);
    rot_transpose(_H521_Curved_107_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_108_var._position_absolute = coords_add(_H521_Curved_107_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_107_var._position_absolute, _HCS_Al_108_var._position_absolute);
    _HCS_Al_108_var._position_relative = rot_apply(_HCS_Al_108_var._rotation_absolute, tc1);
  } /* HCS_Al_108=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_108", _HCS_Al_108_var._position_absolute, _HCS_Al_108_var._rotation_absolute);
  instrument->_position_absolute[108] = _HCS_Al_108_var._position_absolute;
  instrument->_position_relative[108] = _HCS_Al_108_var._position_relative;
    _HCS_Al_108_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_108_var._position_relative);
  instrument->counter_N[108]  = instrument->counter_P[108] = instrument->counter_P2[108] = 0;
  instrument->counter_AbsorbProp[108]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0107_HCS_Al_108", _HCS_Al_108_var._position_absolute, _HCS_Al_108_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "yheight", "0", "0.15","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0107_HCS_Al_108", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_108_setpos */

/* component H521_Curved_Out=Monitor_nD() SETTING, POSITION/ROTATION */
int _H521_Curved_Out_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Curved_Out_setpos] component H521_Curved_Out=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H521_Curved_Out_var._name, "H521_Curved_Out", 16384);
  stracpy(_H521_Curved_Out_var._type, "Monitor_nD", 16384);
  _H521_Curved_Out_var._index=109;
  int current_setpos_index = 109;
  if("" && strlen(""))
    stracpy(_H521_Curved_Out_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H521_Curved_Out_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_Curved_Out_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H521_Curved_Out_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_Curved_Out_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H521_Curved_Out_var._parameters.user3[0]='\0';
  _H521_Curved_Out_var._parameters.xwidth = 0.06;
  _H521_Curved_Out_var._parameters.yheight = 0.15;
  _H521_Curved_Out_var._parameters.zdepth = 0;
  _H521_Curved_Out_var._parameters.xmin = 0;
  _H521_Curved_Out_var._parameters.xmax = 0;
  _H521_Curved_Out_var._parameters.ymin = 0;
  _H521_Curved_Out_var._parameters.ymax = 0;
  _H521_Curved_Out_var._parameters.zmin = 0;
  _H521_Curved_Out_var._parameters.zmax = 0;
  _H521_Curved_Out_var._parameters.bins = 0;
  _H521_Curved_Out_var._parameters.min = -1e40;
  _H521_Curved_Out_var._parameters.max = 1e40;
  _H521_Curved_Out_var._parameters.restore_neutron = 0;
  _H521_Curved_Out_var._parameters.radius = 0;
  if("x y" && strlen("x y"))
    stracpy(_H521_Curved_Out_var._parameters.options, "x y" ? "x y" : "", 16384);
  else 
  _H521_Curved_Out_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_Out_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_Out_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_Out_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_Out_var._parameters.geometry[0]='\0';
  _H521_Curved_Out_var._parameters.nowritefile = 0;
  _H521_Curved_Out_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_Out_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_Out_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_Out_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_Out_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Curved_Out_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Curved_Out_var._parameters.username3[0]='\0';


  /* component H521_Curved_Out=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_108_var._rotation_absolute, _H521_Curved_Out_var._rotation_absolute);
    rot_transpose(_HCS_Al_108_var._rotation_absolute, tr1);
    rot_mul(_H521_Curved_Out_var._rotation_absolute, tr1, _H521_Curved_Out_var._rotation_relative);
    _H521_Curved_Out_var._rotation_is_identity =  rot_test_identity(_H521_Curved_Out_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.01 + gGap);
    rot_transpose(_HCS_Al_108_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Curved_Out_var._position_absolute = coords_add(_HCS_Al_108_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_108_var._position_absolute, _H521_Curved_Out_var._position_absolute);
    _H521_Curved_Out_var._position_relative = rot_apply(_H521_Curved_Out_var._rotation_absolute, tc1);
  } /* H521_Curved_Out=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H521_Curved_Out", _H521_Curved_Out_var._position_absolute, _H521_Curved_Out_var._rotation_absolute);
  instrument->_position_absolute[109] = _H521_Curved_Out_var._position_absolute;
  instrument->_position_relative[109] = _H521_Curved_Out_var._position_relative;
    _H521_Curved_Out_var._position_relative_is_zero =  coords_test_zero(_H521_Curved_Out_var._position_relative);
  instrument->counter_N[109]  = instrument->counter_P[109] = instrument->counter_P2[109] = 0;
  instrument->counter_AbsorbProp[109]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0108_H521_Curved_Out", _H521_Curved_Out_var._position_absolute, _H521_Curved_Out_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "yheight", "0", "0.15","MCNUM");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "restore_neutron", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "options", "NULL", "x y", "char*");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0108_H521_Curved_Out", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Curved_Out_setpos */

/* component H521_Straight=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_Straight_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Straight_setpos] component H521_Straight=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_Straight_var._name, "H521_Straight", 16384);
  stracpy(_H521_Straight_var._type, "Guide_gravity", 16384);
  _H521_Straight_var._index=110;
  int current_setpos_index = 110;
  _H521_Straight_var._parameters.w1 = 0.06;
  _H521_Straight_var._parameters.h1 = 0.15;
  _H521_Straight_var._parameters.w2 = 0;
  _H521_Straight_var._parameters.h2 = 0;
  _H521_Straight_var._parameters.l = 4;
  _H521_Straight_var._parameters.R0 = 0.995;
  _H521_Straight_var._parameters.Qc = 0.0218;
  _H521_Straight_var._parameters.alpha = 4.38;
  _H521_Straight_var._parameters.m = 2;
  _H521_Straight_var._parameters.W = 0.003;
  _H521_Straight_var._parameters.nslit = 1;
  _H521_Straight_var._parameters.d = 0.0005;
  _H521_Straight_var._parameters.mleft = -1;
  _H521_Straight_var._parameters.mright = -1;
  _H521_Straight_var._parameters.mtop = -1;
  _H521_Straight_var._parameters.mbottom = -1;
  _H521_Straight_var._parameters.nhslit = 1;
  _H521_Straight_var._parameters.G = 0;
  _H521_Straight_var._parameters.aleft = -1;
  _H521_Straight_var._parameters.aright = -1;
  _H521_Straight_var._parameters.atop = -1;
  _H521_Straight_var._parameters.abottom = -1;
  _H521_Straight_var._parameters.wavy = 0;
  _H521_Straight_var._parameters.wavy_z = 0;
  _H521_Straight_var._parameters.wavy_tb = 0;
  _H521_Straight_var._parameters.wavy_lr = 0;
  _H521_Straight_var._parameters.chamfers = 0;
  _H521_Straight_var._parameters.chamfers_z = 0;
  _H521_Straight_var._parameters.chamfers_lr = 0;
  _H521_Straight_var._parameters.chamfers_tb = 0;
  _H521_Straight_var._parameters.nelements = 4;
  _H521_Straight_var._parameters.nu = 0;
  _H521_Straight_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Straight_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Straight_var._parameters.reflect[0]='\0';


  /* component H521_Straight=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_Curved_Out_var._rotation_absolute, _H521_Straight_var._rotation_absolute);
    rot_transpose(_H521_Curved_Out_var._rotation_absolute, tr1);
    rot_mul(_H521_Straight_var._rotation_absolute, tr1, _H521_Straight_var._rotation_relative);
    _H521_Straight_var._rotation_is_identity =  rot_test_identity(_H521_Straight_var._rotation_relative);
    tc1 = coords_set(
      0, 0, gGap);
    rot_transpose(_H521_Curved_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Straight_var._position_absolute = coords_add(_H521_Curved_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Curved_Out_var._position_absolute, _H521_Straight_var._position_absolute);
    _H521_Straight_var._position_relative = rot_apply(_H521_Straight_var._rotation_absolute, tc1);
  } /* H521_Straight=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_Straight", _H521_Straight_var._position_absolute, _H521_Straight_var._rotation_absolute);
  instrument->_position_absolute[110] = _H521_Straight_var._position_absolute;
  instrument->_position_relative[110] = _H521_Straight_var._position_relative;
    _H521_Straight_var._position_relative_is_zero =  coords_test_zero(_H521_Straight_var._position_relative);
  instrument->counter_N[110]  = instrument->counter_P[110] = instrument->counter_P2[110] = 0;
  instrument->counter_AbsorbProp[110]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0109_H521_Straight", _H521_Straight_var._position_absolute, _H521_Straight_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "h1", "NONE", "0.15","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "l", "NONE", "4","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "R0", "0.995", "0.995","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "Qc", "0.0218", "0.0218","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "alpha", "4.38", "4.38","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "W", "0.003", "0.003","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "nelements", "1", "4","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0109_H521_Straight", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Straight_setpos */

/* component H521_Straight_Out=Monitor_nD() SETTING, POSITION/ROTATION */
int _H521_Straight_Out_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_Straight_Out_setpos] component H521_Straight_Out=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H521_Straight_Out_var._name, "H521_Straight_Out", 16384);
  stracpy(_H521_Straight_Out_var._type, "Monitor_nD", 16384);
  _H521_Straight_Out_var._index=111;
  int current_setpos_index = 111;
  if("" && strlen(""))
    stracpy(_H521_Straight_Out_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H521_Straight_Out_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_Straight_Out_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H521_Straight_Out_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_Straight_Out_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H521_Straight_Out_var._parameters.user3[0]='\0';
  _H521_Straight_Out_var._parameters.xwidth = 0.06;
  _H521_Straight_Out_var._parameters.yheight = 0.15;
  _H521_Straight_Out_var._parameters.zdepth = 0;
  _H521_Straight_Out_var._parameters.xmin = 0;
  _H521_Straight_Out_var._parameters.xmax = 0;
  _H521_Straight_Out_var._parameters.ymin = 0;
  _H521_Straight_Out_var._parameters.ymax = 0;
  _H521_Straight_Out_var._parameters.zmin = 0;
  _H521_Straight_Out_var._parameters.zmax = 0;
  _H521_Straight_Out_var._parameters.bins = 0;
  _H521_Straight_Out_var._parameters.min = -1e40;
  _H521_Straight_Out_var._parameters.max = 1e40;
  _H521_Straight_Out_var._parameters.restore_neutron = 0;
  _H521_Straight_Out_var._parameters.radius = 0;
  if("x y" && strlen("x y"))
    stracpy(_H521_Straight_Out_var._parameters.options, "x y" ? "x y" : "", 16384);
  else 
  _H521_Straight_Out_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Straight_Out_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Straight_Out_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Straight_Out_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Straight_Out_var._parameters.geometry[0]='\0';
  _H521_Straight_Out_var._parameters.nowritefile = 0;
  _H521_Straight_Out_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Straight_Out_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Straight_Out_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Straight_Out_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Straight_Out_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_Straight_Out_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_Straight_Out_var._parameters.username3[0]='\0';


  /* component H521_Straight_Out=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_Straight_var._rotation_absolute, _H521_Straight_Out_var._rotation_absolute);
    rot_transpose(_H521_Straight_var._rotation_absolute, tr1);
    rot_mul(_H521_Straight_Out_var._rotation_absolute, tr1, _H521_Straight_Out_var._rotation_relative);
    _H521_Straight_Out_var._rotation_is_identity =  rot_test_identity(_H521_Straight_Out_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H521_Straight , l ) + gGap);
    rot_transpose(_H521_Straight_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_Straight_Out_var._position_absolute = coords_add(_H521_Straight_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Straight_var._position_absolute, _H521_Straight_Out_var._position_absolute);
    _H521_Straight_Out_var._position_relative = rot_apply(_H521_Straight_Out_var._rotation_absolute, tc1);
  } /* H521_Straight_Out=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H521_Straight_Out", _H521_Straight_Out_var._position_absolute, _H521_Straight_Out_var._rotation_absolute);
  instrument->_position_absolute[111] = _H521_Straight_Out_var._position_absolute;
  instrument->_position_relative[111] = _H521_Straight_Out_var._position_relative;
    _H521_Straight_Out_var._position_relative_is_zero =  coords_test_zero(_H521_Straight_Out_var._position_relative);
  instrument->counter_N[111]  = instrument->counter_P[111] = instrument->counter_P2[111] = 0;
  instrument->counter_AbsorbProp[111]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0110_H521_Straight_Out", _H521_Straight_Out_var._position_absolute, _H521_Straight_Out_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "yheight", "0", "0.15","MCNUM");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "restore_neutron", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "options", "NULL", "x y", "char*");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0110_H521_Straight_Out", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_Straight_Out_setpos */

/* component HCS_Al_112=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_112_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_112_setpos] component HCS_Al_112=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_112_var._name, "HCS_Al_112", 16384);
  stracpy(_HCS_Al_112_var._type, "PowderN", 16384);
  _HCS_Al_112_var._index=112;
  int current_setpos_index = 112;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_112_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_112_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_112_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_112_var._parameters.geometry[0]='\0';
  _HCS_Al_112_var._parameters.format[0] = 0;
  _HCS_Al_112_var._parameters.format[1] = 0;
  _HCS_Al_112_var._parameters.format[2] = 0;
  _HCS_Al_112_var._parameters.format[3] = 0;
  _HCS_Al_112_var._parameters.format[4] = 0;
  _HCS_Al_112_var._parameters.format[5] = 0;
  _HCS_Al_112_var._parameters.format[6] = 0;
  _HCS_Al_112_var._parameters.format[7] = 0;
  _HCS_Al_112_var._parameters.format[8] = 0;
  _HCS_Al_112_var._parameters.radius = 0;
  _HCS_Al_112_var._parameters.yheight = 0.15;
  _HCS_Al_112_var._parameters.xwidth = 0.06;
  _HCS_Al_112_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_112_var._parameters.thickness = 0;
  _HCS_Al_112_var._parameters.pack = 1;
  _HCS_Al_112_var._parameters.Vc = 0;
  _HCS_Al_112_var._parameters.sigma_abs = 0;
  _HCS_Al_112_var._parameters.sigma_inc = 0;
  _HCS_Al_112_var._parameters.delta_d_d = 0;
  _HCS_Al_112_var._parameters.p_inc = 0.005;
  _HCS_Al_112_var._parameters.p_transmit = 0.9450;
  _HCS_Al_112_var._parameters.DW = 0;
  _HCS_Al_112_var._parameters.nb_atoms = 1;
  _HCS_Al_112_var._parameters.d_omega = 0;
  _HCS_Al_112_var._parameters.d_phi = 10;
  _HCS_Al_112_var._parameters.tth_sign = 0;
  _HCS_Al_112_var._parameters.p_interact = 0.05;
  _HCS_Al_112_var._parameters.concentric = 0;
  _HCS_Al_112_var._parameters.density = 0;
  _HCS_Al_112_var._parameters.weight = 0;
  _HCS_Al_112_var._parameters.barns = 1;
  _HCS_Al_112_var._parameters.Strain = 0;
  _HCS_Al_112_var._parameters.focus_flip = 0;
  _HCS_Al_112_var._parameters.target_index = 0;
  _HCS_Al_112_var._parameters.order = 1;


  /* component HCS_Al_112=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_Straight_Out_var._rotation_absolute, _HCS_Al_112_var._rotation_absolute);
    rot_transpose(_H521_Straight_Out_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_112_var._rotation_absolute, tr1, _HCS_Al_112_var._rotation_relative);
    _HCS_Al_112_var._rotation_is_identity =  rot_test_identity(_HCS_Al_112_var._rotation_relative);
    tc1 = coords_set(
      0, 0, gGap + 0.001);
    rot_transpose(_H521_Straight_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_112_var._position_absolute = coords_add(_H521_Straight_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_Straight_Out_var._position_absolute, _HCS_Al_112_var._position_absolute);
    _HCS_Al_112_var._position_relative = rot_apply(_HCS_Al_112_var._rotation_absolute, tc1);
  } /* HCS_Al_112=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_112", _HCS_Al_112_var._position_absolute, _HCS_Al_112_var._rotation_absolute);
  instrument->_position_absolute[112] = _HCS_Al_112_var._position_absolute;
  instrument->_position_relative[112] = _HCS_Al_112_var._position_relative;
    _HCS_Al_112_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_112_var._position_relative);
  instrument->counter_N[112]  = instrument->counter_P[112] = instrument->counter_P2[112] = 0;
  instrument->counter_AbsorbProp[112]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0111_HCS_Al_112", _HCS_Al_112_var._position_absolute, _HCS_Al_112_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "yheight", "0", "0.15","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0111_HCS_Al_112", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_112_setpos */

/* component H521_D16_Monochromator_Cradle=Monitor_nD() SETTING, POSITION/ROTATION */
int _H521_D16_Monochromator_Cradle_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_D16_Monochromator_Cradle_setpos] component H521_D16_Monochromator_Cradle=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H521_D16_Monochromator_Cradle_var._name, "H521_D16_Monochromator_Cradle", 16384);
  stracpy(_H521_D16_Monochromator_Cradle_var._type, "Monitor_nD", 16384);
  _H521_D16_Monochromator_Cradle_var._index=113;
  int current_setpos_index = 113;
  if("" && strlen(""))
    stracpy(_H521_D16_Monochromator_Cradle_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H521_D16_Monochromator_Cradle_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_D16_Monochromator_Cradle_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H521_D16_Monochromator_Cradle_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_D16_Monochromator_Cradle_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H521_D16_Monochromator_Cradle_var._parameters.user3[0]='\0';
  _H521_D16_Monochromator_Cradle_var._parameters.xwidth = 0.06;
  _H521_D16_Monochromator_Cradle_var._parameters.yheight = 0.12;
  _H521_D16_Monochromator_Cradle_var._parameters.zdepth = 0;
  _H521_D16_Monochromator_Cradle_var._parameters.xmin = 0;
  _H521_D16_Monochromator_Cradle_var._parameters.xmax = 0;
  _H521_D16_Monochromator_Cradle_var._parameters.ymin = 0;
  _H521_D16_Monochromator_Cradle_var._parameters.ymax = 0;
  _H521_D16_Monochromator_Cradle_var._parameters.zmin = 0;
  _H521_D16_Monochromator_Cradle_var._parameters.zmax = 0;
  _H521_D16_Monochromator_Cradle_var._parameters.bins = 50;
  _H521_D16_Monochromator_Cradle_var._parameters.min = -1e40;
  _H521_D16_Monochromator_Cradle_var._parameters.max = 1e40;
  _H521_D16_Monochromator_Cradle_var._parameters.restore_neutron = 1;
  _H521_D16_Monochromator_Cradle_var._parameters.radius = 0;
  if("x y, slit" && strlen("x y, slit"))
    stracpy(_H521_D16_Monochromator_Cradle_var._parameters.options, "x y, slit" ? "x y, slit" : "", 16384);
  else 
  _H521_D16_Monochromator_Cradle_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Monochromator_Cradle_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Monochromator_Cradle_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Monochromator_Cradle_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Monochromator_Cradle_var._parameters.geometry[0]='\0';
  _H521_D16_Monochromator_Cradle_var._parameters.nowritefile = 0;
  _H521_D16_Monochromator_Cradle_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Monochromator_Cradle_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Monochromator_Cradle_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Monochromator_Cradle_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Monochromator_Cradle_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Monochromator_Cradle_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Monochromator_Cradle_var._parameters.username3[0]='\0';


  /* component H521_D16_Monochromator_Cradle=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_112_var._rotation_absolute, _H521_D16_Monochromator_Cradle_var._rotation_absolute);
    rot_transpose(_HCS_Al_112_var._rotation_absolute, tr1);
    rot_mul(_H521_D16_Monochromator_Cradle_var._rotation_absolute, tr1, _H521_D16_Monochromator_Cradle_var._rotation_relative);
    _H521_D16_Monochromator_Cradle_var._rotation_is_identity =  rot_test_identity(_H521_D16_Monochromator_Cradle_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.200 / 2 -0.001);
    rot_transpose(_HCS_Al_112_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_D16_Monochromator_Cradle_var._position_absolute = coords_add(_HCS_Al_112_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_112_var._position_absolute, _H521_D16_Monochromator_Cradle_var._position_absolute);
    _H521_D16_Monochromator_Cradle_var._position_relative = rot_apply(_H521_D16_Monochromator_Cradle_var._rotation_absolute, tc1);
  } /* H521_D16_Monochromator_Cradle=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H521_D16_Monochromator_Cradle", _H521_D16_Monochromator_Cradle_var._position_absolute, _H521_D16_Monochromator_Cradle_var._rotation_absolute);
  instrument->_position_absolute[113] = _H521_D16_Monochromator_Cradle_var._position_absolute;
  instrument->_position_relative[113] = _H521_D16_Monochromator_Cradle_var._position_relative;
    _H521_D16_Monochromator_Cradle_var._position_relative_is_zero =  coords_test_zero(_H521_D16_Monochromator_Cradle_var._position_relative);
  instrument->counter_N[113]  = instrument->counter_P[113] = instrument->counter_P2[113] = 0;
  instrument->counter_AbsorbProp[113]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", _H521_D16_Monochromator_Cradle_var._position_absolute, _H521_D16_Monochromator_Cradle_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "options", "NULL", "x y, slit", "char*");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0112_H521_D16_Monochromator_Cradle", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_D16_Monochromator_Cradle_setpos */

/* component H521_D16_Monochromator=Monochromator_curved() SETTING, POSITION/ROTATION */
int _H521_D16_Monochromator_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_D16_Monochromator_setpos] component H521_D16_Monochromator=Monochromator_curved() SETTING [Monochromator_curved:0]");
  stracpy(_H521_D16_Monochromator_var._name, "H521_D16_Monochromator", 16384);
  stracpy(_H521_D16_Monochromator_var._type, "Monochromator_curved", 16384);
  _H521_D16_Monochromator_var._index=114;
  int current_setpos_index = 114;
  if("HOPG.rfl" && strlen("HOPG.rfl"))
    stracpy(_H521_D16_Monochromator_var._parameters.reflect, "HOPG.rfl" ? "HOPG.rfl" : "", 16384);
  else 
  _H521_D16_Monochromator_var._parameters.reflect[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Monochromator_var._parameters.transmit, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Monochromator_var._parameters.transmit[0]='\0';
  _H521_D16_Monochromator_var._parameters.zwidth = 0.01;
  _H521_D16_Monochromator_var._parameters.yheight = 0.01;
  _H521_D16_Monochromator_var._parameters.gap = 0.0005;
  _H521_D16_Monochromator_var._parameters.NH = 1;
  _H521_D16_Monochromator_var._parameters.NV = 7;
  _H521_D16_Monochromator_var._parameters.mosaich = 40;
  _H521_D16_Monochromator_var._parameters.mosaicv = 40;
  _H521_D16_Monochromator_var._parameters.r0 = 1;
  _H521_D16_Monochromator_var._parameters.t0 = 1.0;
  _H521_D16_Monochromator_var._parameters.Q = 1.8734;
  _H521_D16_Monochromator_var._parameters.RV = _instrument_var._parameters.D16_RMV;
  _H521_D16_Monochromator_var._parameters.RH = 0;
  _H521_D16_Monochromator_var._parameters.DM = D16_DM;
  _H521_D16_Monochromator_var._parameters.mosaic = 0;
  _H521_D16_Monochromator_var._parameters.width = 0.06;
  _H521_D16_Monochromator_var._parameters.height = 0.12;
  _H521_D16_Monochromator_var._parameters.verbose = 0;
  _H521_D16_Monochromator_var._parameters.order = 0;


  /* component H521_D16_Monochromator=Monochromator_curved() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (D16_A1)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_D16_Monochromator_Cradle_var._rotation_absolute, _H521_D16_Monochromator_var._rotation_absolute);
    rot_transpose(_H521_D16_Monochromator_Cradle_var._rotation_absolute, tr1);
    rot_mul(_H521_D16_Monochromator_var._rotation_absolute, tr1, _H521_D16_Monochromator_var._rotation_relative);
    _H521_D16_Monochromator_var._rotation_is_identity =  rot_test_identity(_H521_D16_Monochromator_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H521_D16_Monochromator_Cradle_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_D16_Monochromator_var._position_absolute = coords_add(_H521_D16_Monochromator_Cradle_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_D16_Monochromator_Cradle_var._position_absolute, _H521_D16_Monochromator_var._position_absolute);
    _H521_D16_Monochromator_var._position_relative = rot_apply(_H521_D16_Monochromator_var._rotation_absolute, tc1);
  } /* H521_D16_Monochromator=Monochromator_curved() AT ROTATED */
  DEBUG_COMPONENT("H521_D16_Monochromator", _H521_D16_Monochromator_var._position_absolute, _H521_D16_Monochromator_var._rotation_absolute);
  instrument->_position_absolute[114] = _H521_D16_Monochromator_var._position_absolute;
  instrument->_position_relative[114] = _H521_D16_Monochromator_var._position_relative;
    _H521_D16_Monochromator_var._position_relative_is_zero =  coords_test_zero(_H521_D16_Monochromator_var._position_relative);
  instrument->counter_N[114]  = instrument->counter_P[114] = instrument->counter_P2[114] = 0;
  instrument->counter_AbsorbProp[114]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0113_H521_D16_Monochromator", _H521_D16_Monochromator_var._position_absolute, _H521_D16_Monochromator_var._rotation_absolute, "Monochromator_curved");
        mccomp_param_nexus(nxhandle,"0113_H521_D16_Monochromator", "reflect", "NULL", "HOPG.rfl", "char*");
        mccomp_param_nexus(nxhandle,"0113_H521_D16_Monochromator", "transmit", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0113_H521_D16_Monochromator", "zwidth", "0.01", "0.01","MCNUM");
        mccomp_param_nexus(nxhandle,"0113_H521_D16_Monochromator", "yheight", "0.01", "0.01","MCNUM");
        mccomp_param_nexus(nxhandle,"0113_H521_D16_Monochromator", "gap", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0113_H521_D16_Monochromator", "NH", "11", "1","int");
        mccomp_param_nexus(nxhandle,"0113_H521_D16_Monochromator", "NV", "11", "7","int");
        mccomp_param_nexus(nxhandle,"0113_H521_D16_Monochromator", "mosaich", "30.0", "40","MCNUM");
        mccomp_param_nexus(nxhandle,"0113_H521_D16_Monochromator", "mosaicv", "30.0", "40","MCNUM");
        mccomp_param_nexus(nxhandle,"0113_H521_D16_Monochromator", "r0", "0.7", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0113_H521_D16_Monochromator", "t0", "1.0", "1.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0113_H521_D16_Monochromator", "Q", "1.8734", "1.8734","MCNUM");
        mccomp_param_nexus(nxhandle,"0113_H521_D16_Monochromator", "RV", "0", "_instrument_var._parameters.D16_RMV","MCNUM");
        mccomp_param_nexus(nxhandle,"0113_H521_D16_Monochromator", "RH", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0113_H521_D16_Monochromator", "DM", "0", "D16_DM","MCNUM");
        mccomp_param_nexus(nxhandle,"0113_H521_D16_Monochromator", "mosaic", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0113_H521_D16_Monochromator", "width", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0113_H521_D16_Monochromator", "height", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0113_H521_D16_Monochromator", "verbose", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0113_H521_D16_Monochromator", "order", "0", "0","MCNUM");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_D16_Monochromator_setpos */

/* component H521_D16_Monochromator_Jumper=Arm() SETTING, POSITION/ROTATION */
int _H521_D16_Monochromator_Jumper_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_D16_Monochromator_Jumper_setpos] component H521_D16_Monochromator_Jumper=Arm() SETTING [Arm:0]");
  stracpy(_H521_D16_Monochromator_Jumper_var._name, "H521_D16_Monochromator_Jumper", 16384);
  stracpy(_H521_D16_Monochromator_Jumper_var._type, "Arm", 16384);
  _H521_D16_Monochromator_Jumper_var._index=115;
  int current_setpos_index = 115;
  /* component H521_D16_Monochromator_Jumper=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_D16_Monochromator_Cradle_var._rotation_absolute, _H521_D16_Monochromator_Jumper_var._rotation_absolute);
    rot_transpose(_H521_D16_Monochromator_var._rotation_absolute, tr1);
    rot_mul(_H521_D16_Monochromator_Jumper_var._rotation_absolute, tr1, _H521_D16_Monochromator_Jumper_var._rotation_relative);
    _H521_D16_Monochromator_Jumper_var._rotation_is_identity =  rot_test_identity(_H521_D16_Monochromator_Jumper_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H521_D16_Monochromator_Cradle_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_D16_Monochromator_Jumper_var._position_absolute = coords_add(_H521_D16_Monochromator_Cradle_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_D16_Monochromator_var._position_absolute, _H521_D16_Monochromator_Jumper_var._position_absolute);
    _H521_D16_Monochromator_Jumper_var._position_relative = rot_apply(_H521_D16_Monochromator_Jumper_var._rotation_absolute, tc1);
  } /* H521_D16_Monochromator_Jumper=Arm() AT ROTATED */
  DEBUG_COMPONENT("H521_D16_Monochromator_Jumper", _H521_D16_Monochromator_Jumper_var._position_absolute, _H521_D16_Monochromator_Jumper_var._rotation_absolute);
  instrument->_position_absolute[115] = _H521_D16_Monochromator_Jumper_var._position_absolute;
  instrument->_position_relative[115] = _H521_D16_Monochromator_Jumper_var._position_relative;
    _H521_D16_Monochromator_Jumper_var._position_relative_is_zero =  coords_test_zero(_H521_D16_Monochromator_Jumper_var._position_relative);
  instrument->counter_N[115]  = instrument->counter_P[115] = instrument->counter_P2[115] = 0;
  instrument->counter_AbsorbProp[115]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0114_H521_D16_Monochromator_Jumper", _H521_D16_Monochromator_Jumper_var._position_absolute, _H521_D16_Monochromator_Jumper_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_D16_Monochromator_Jumper_setpos */

/* component H521_D16_Monochromator_Out=Arm() SETTING, POSITION/ROTATION */
int _H521_D16_Monochromator_Out_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_D16_Monochromator_Out_setpos] component H521_D16_Monochromator_Out=Arm() SETTING [Arm:0]");
  stracpy(_H521_D16_Monochromator_Out_var._name, "H521_D16_Monochromator_Out", 16384);
  stracpy(_H521_D16_Monochromator_Out_var._type, "Arm", 16384);
  _H521_D16_Monochromator_Out_var._index=116;
  int current_setpos_index = 116;
  /* component H521_D16_Monochromator_Out=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (2 * D16_A1)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_D16_Monochromator_Cradle_var._rotation_absolute, _H521_D16_Monochromator_Out_var._rotation_absolute);
    rot_transpose(_H521_D16_Monochromator_Jumper_var._rotation_absolute, tr1);
    rot_mul(_H521_D16_Monochromator_Out_var._rotation_absolute, tr1, _H521_D16_Monochromator_Out_var._rotation_relative);
    _H521_D16_Monochromator_Out_var._rotation_is_identity =  rot_test_identity(_H521_D16_Monochromator_Out_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H521_D16_Monochromator_Cradle_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_D16_Monochromator_Out_var._position_absolute = coords_add(_H521_D16_Monochromator_Cradle_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_D16_Monochromator_Jumper_var._position_absolute, _H521_D16_Monochromator_Out_var._position_absolute);
    _H521_D16_Monochromator_Out_var._position_relative = rot_apply(_H521_D16_Monochromator_Out_var._rotation_absolute, tc1);
  } /* H521_D16_Monochromator_Out=Arm() AT ROTATED */
  DEBUG_COMPONENT("H521_D16_Monochromator_Out", _H521_D16_Monochromator_Out_var._position_absolute, _H521_D16_Monochromator_Out_var._rotation_absolute);
  instrument->_position_absolute[116] = _H521_D16_Monochromator_Out_var._position_absolute;
  instrument->_position_relative[116] = _H521_D16_Monochromator_Out_var._position_relative;
    _H521_D16_Monochromator_Out_var._position_relative_is_zero =  coords_test_zero(_H521_D16_Monochromator_Out_var._position_relative);
  instrument->counter_N[116]  = instrument->counter_P[116] = instrument->counter_P2[116] = 0;
  instrument->counter_AbsorbProp[116]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0115_H521_D16_Monochromator_Out", _H521_D16_Monochromator_Out_var._position_absolute, _H521_D16_Monochromator_Out_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_D16_Monochromator_Out_setpos */

/* component H521_D16_Sample_Div=Monitor_nD() SETTING, POSITION/ROTATION */
int _H521_D16_Sample_Div_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_D16_Sample_Div_setpos] component H521_D16_Sample_Div=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H521_D16_Sample_Div_var._name, "H521_D16_Sample_Div", 16384);
  stracpy(_H521_D16_Sample_Div_var._type, "Monitor_nD", 16384);
  _H521_D16_Sample_Div_var._index=117;
  int current_setpos_index = 117;
  if("" && strlen(""))
    stracpy(_H521_D16_Sample_Div_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H521_D16_Sample_Div_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_D16_Sample_Div_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H521_D16_Sample_Div_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_D16_Sample_Div_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H521_D16_Sample_Div_var._parameters.user3[0]='\0';
  _H521_D16_Sample_Div_var._parameters.xwidth = 0.05;
  _H521_D16_Sample_Div_var._parameters.yheight = 0.05;
  _H521_D16_Sample_Div_var._parameters.zdepth = 0;
  _H521_D16_Sample_Div_var._parameters.xmin = 0;
  _H521_D16_Sample_Div_var._parameters.xmax = 0;
  _H521_D16_Sample_Div_var._parameters.ymin = 0;
  _H521_D16_Sample_Div_var._parameters.ymax = 0;
  _H521_D16_Sample_Div_var._parameters.zmin = 0;
  _H521_D16_Sample_Div_var._parameters.zmax = 0;
  _H521_D16_Sample_Div_var._parameters.bins = 50;
  _H521_D16_Sample_Div_var._parameters.min = -1e40;
  _H521_D16_Sample_Div_var._parameters.max = 1e40;
  _H521_D16_Sample_Div_var._parameters.restore_neutron = 1;
  _H521_D16_Sample_Div_var._parameters.radius = 0;
  if("dx limits=[-2 2], dy limits=[-2 2]" && strlen("dx limits=[-2 2], dy limits=[-2 2]"))
    stracpy(_H521_D16_Sample_Div_var._parameters.options, "dx limits=[-2 2], dy limits=[-2 2]" ? "dx limits=[-2 2], dy limits=[-2 2]" : "", 16384);
  else 
  _H521_D16_Sample_Div_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Sample_Div_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Sample_Div_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Sample_Div_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Sample_Div_var._parameters.geometry[0]='\0';
  _H521_D16_Sample_Div_var._parameters.nowritefile = 0;
  _H521_D16_Sample_Div_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Sample_Div_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Sample_Div_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Sample_Div_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Sample_Div_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Sample_Div_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Sample_Div_var._parameters.username3[0]='\0';


  /* component H521_D16_Sample_Div=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_D16_Monochromator_Out_var._rotation_absolute, _H521_D16_Sample_Div_var._rotation_absolute);
    rot_transpose(_H521_D16_Monochromator_Jumper_var._rotation_absolute, tr1);
    rot_mul(_H521_D16_Sample_Div_var._rotation_absolute, tr1, _H521_D16_Sample_Div_var._rotation_relative);
    _H521_D16_Sample_Div_var._rotation_is_identity =  rot_test_identity(_H521_D16_Sample_Div_var._rotation_relative);
    tc1 = coords_set(
      0, 0, D16_L);
    rot_transpose(_H521_D16_Monochromator_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_D16_Sample_Div_var._position_absolute = coords_add(_H521_D16_Monochromator_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_D16_Monochromator_Jumper_var._position_absolute, _H521_D16_Sample_Div_var._position_absolute);
    _H521_D16_Sample_Div_var._position_relative = rot_apply(_H521_D16_Sample_Div_var._rotation_absolute, tc1);
  } /* H521_D16_Sample_Div=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H521_D16_Sample_Div", _H521_D16_Sample_Div_var._position_absolute, _H521_D16_Sample_Div_var._rotation_absolute);
  instrument->_position_absolute[117] = _H521_D16_Sample_Div_var._position_absolute;
  instrument->_position_relative[117] = _H521_D16_Sample_Div_var._position_relative;
    _H521_D16_Sample_Div_var._position_relative_is_zero =  coords_test_zero(_H521_D16_Sample_Div_var._position_relative);
  instrument->counter_N[117]  = instrument->counter_P[117] = instrument->counter_P2[117] = 0;
  instrument->counter_AbsorbProp[117]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0116_H521_D16_Sample_Div", _H521_D16_Sample_Div_var._position_absolute, _H521_D16_Sample_Div_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "xwidth", "0", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "yheight", "0", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "options", "NULL", "dx limits=[-2 2], dy limits=[-2 2]", "char*");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0116_H521_D16_Sample_Div", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_D16_Sample_Div_setpos */

/* component H521_D16_Sample_XY=Monitor_nD() SETTING, POSITION/ROTATION */
int _H521_D16_Sample_XY_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_D16_Sample_XY_setpos] component H521_D16_Sample_XY=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H521_D16_Sample_XY_var._name, "H521_D16_Sample_XY", 16384);
  stracpy(_H521_D16_Sample_XY_var._type, "Monitor_nD", 16384);
  _H521_D16_Sample_XY_var._index=118;
  int current_setpos_index = 118;
  if("" && strlen(""))
    stracpy(_H521_D16_Sample_XY_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H521_D16_Sample_XY_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_D16_Sample_XY_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H521_D16_Sample_XY_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_D16_Sample_XY_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H521_D16_Sample_XY_var._parameters.user3[0]='\0';
  _H521_D16_Sample_XY_var._parameters.xwidth = 0.1;
  _H521_D16_Sample_XY_var._parameters.yheight = 0.1;
  _H521_D16_Sample_XY_var._parameters.zdepth = 0;
  _H521_D16_Sample_XY_var._parameters.xmin = 0;
  _H521_D16_Sample_XY_var._parameters.xmax = 0;
  _H521_D16_Sample_XY_var._parameters.ymin = 0;
  _H521_D16_Sample_XY_var._parameters.ymax = 0;
  _H521_D16_Sample_XY_var._parameters.zmin = 0;
  _H521_D16_Sample_XY_var._parameters.zmax = 0;
  _H521_D16_Sample_XY_var._parameters.bins = 50;
  _H521_D16_Sample_XY_var._parameters.min = -1e40;
  _H521_D16_Sample_XY_var._parameters.max = 1e40;
  _H521_D16_Sample_XY_var._parameters.restore_neutron = 1;
  _H521_D16_Sample_XY_var._parameters.radius = 0;
  if("x y" && strlen("x y"))
    stracpy(_H521_D16_Sample_XY_var._parameters.options, "x y" ? "x y" : "", 16384);
  else 
  _H521_D16_Sample_XY_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Sample_XY_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Sample_XY_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Sample_XY_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Sample_XY_var._parameters.geometry[0]='\0';
  _H521_D16_Sample_XY_var._parameters.nowritefile = 0;
  _H521_D16_Sample_XY_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Sample_XY_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Sample_XY_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Sample_XY_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Sample_XY_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Sample_XY_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Sample_XY_var._parameters.username3[0]='\0';


  /* component H521_D16_Sample_XY=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_D16_Monochromator_Out_var._rotation_absolute, _H521_D16_Sample_XY_var._rotation_absolute);
    rot_transpose(_H521_D16_Sample_Div_var._rotation_absolute, tr1);
    rot_mul(_H521_D16_Sample_XY_var._rotation_absolute, tr1, _H521_D16_Sample_XY_var._rotation_relative);
    _H521_D16_Sample_XY_var._rotation_is_identity =  rot_test_identity(_H521_D16_Sample_XY_var._rotation_relative);
    tc1 = coords_set(
      0, 0, D16_L);
    rot_transpose(_H521_D16_Monochromator_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_D16_Sample_XY_var._position_absolute = coords_add(_H521_D16_Monochromator_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_D16_Sample_Div_var._position_absolute, _H521_D16_Sample_XY_var._position_absolute);
    _H521_D16_Sample_XY_var._position_relative = rot_apply(_H521_D16_Sample_XY_var._rotation_absolute, tc1);
  } /* H521_D16_Sample_XY=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H521_D16_Sample_XY", _H521_D16_Sample_XY_var._position_absolute, _H521_D16_Sample_XY_var._rotation_absolute);
  instrument->_position_absolute[118] = _H521_D16_Sample_XY_var._position_absolute;
  instrument->_position_relative[118] = _H521_D16_Sample_XY_var._position_relative;
    _H521_D16_Sample_XY_var._position_relative_is_zero =  coords_test_zero(_H521_D16_Sample_XY_var._position_relative);
  instrument->counter_N[118]  = instrument->counter_P[118] = instrument->counter_P2[118] = 0;
  instrument->counter_AbsorbProp[118]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0117_H521_D16_Sample_XY", _H521_D16_Sample_XY_var._position_absolute, _H521_D16_Sample_XY_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "xwidth", "0", "0.1","MCNUM");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "yheight", "0", "0.1","MCNUM");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "options", "NULL", "x y", "char*");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0117_H521_D16_Sample_XY", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_D16_Sample_XY_setpos */

/* component H521_D16_Sample_L=Monitor_nD() SETTING, POSITION/ROTATION */
int _H521_D16_Sample_L_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_D16_Sample_L_setpos] component H521_D16_Sample_L=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H521_D16_Sample_L_var._name, "H521_D16_Sample_L", 16384);
  stracpy(_H521_D16_Sample_L_var._type, "Monitor_nD", 16384);
  _H521_D16_Sample_L_var._index=119;
  int current_setpos_index = 119;
  if("" && strlen(""))
    stracpy(_H521_D16_Sample_L_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H521_D16_Sample_L_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_D16_Sample_L_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H521_D16_Sample_L_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_D16_Sample_L_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H521_D16_Sample_L_var._parameters.user3[0]='\0';
  _H521_D16_Sample_L_var._parameters.xwidth = 0.1;
  _H521_D16_Sample_L_var._parameters.yheight = 0.1;
  _H521_D16_Sample_L_var._parameters.zdepth = 0;
  _H521_D16_Sample_L_var._parameters.xmin = 0;
  _H521_D16_Sample_L_var._parameters.xmax = 0;
  _H521_D16_Sample_L_var._parameters.ymin = 0;
  _H521_D16_Sample_L_var._parameters.ymax = 0;
  _H521_D16_Sample_L_var._parameters.zmin = 0;
  _H521_D16_Sample_L_var._parameters.zmax = 0;
  _H521_D16_Sample_L_var._parameters.bins = 50;
  _H521_D16_Sample_L_var._parameters.min = -1e40;
  _H521_D16_Sample_L_var._parameters.max = 1e40;
  _H521_D16_Sample_L_var._parameters.restore_neutron = 1;
  _H521_D16_Sample_L_var._parameters.radius = 0;
  if("lambda limits=[1 10]" && strlen("lambda limits=[1 10]"))
    stracpy(_H521_D16_Sample_L_var._parameters.options, "lambda limits=[1 10]" ? "lambda limits=[1 10]" : "", 16384);
  else 
  _H521_D16_Sample_L_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Sample_L_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Sample_L_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Sample_L_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Sample_L_var._parameters.geometry[0]='\0';
  _H521_D16_Sample_L_var._parameters.nowritefile = 0;
  _H521_D16_Sample_L_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Sample_L_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Sample_L_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Sample_L_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Sample_L_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Sample_L_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Sample_L_var._parameters.username3[0]='\0';


  /* component H521_D16_Sample_L=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_D16_Monochromator_Out_var._rotation_absolute, _H521_D16_Sample_L_var._rotation_absolute);
    rot_transpose(_H521_D16_Sample_XY_var._rotation_absolute, tr1);
    rot_mul(_H521_D16_Sample_L_var._rotation_absolute, tr1, _H521_D16_Sample_L_var._rotation_relative);
    _H521_D16_Sample_L_var._rotation_is_identity =  rot_test_identity(_H521_D16_Sample_L_var._rotation_relative);
    tc1 = coords_set(
      0, 0, D16_L);
    rot_transpose(_H521_D16_Monochromator_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_D16_Sample_L_var._position_absolute = coords_add(_H521_D16_Monochromator_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_D16_Sample_XY_var._position_absolute, _H521_D16_Sample_L_var._position_absolute);
    _H521_D16_Sample_L_var._position_relative = rot_apply(_H521_D16_Sample_L_var._rotation_absolute, tc1);
  } /* H521_D16_Sample_L=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H521_D16_Sample_L", _H521_D16_Sample_L_var._position_absolute, _H521_D16_Sample_L_var._rotation_absolute);
  instrument->_position_absolute[119] = _H521_D16_Sample_L_var._position_absolute;
  instrument->_position_relative[119] = _H521_D16_Sample_L_var._position_relative;
    _H521_D16_Sample_L_var._position_relative_is_zero =  coords_test_zero(_H521_D16_Sample_L_var._position_relative);
  instrument->counter_N[119]  = instrument->counter_P[119] = instrument->counter_P2[119] = 0;
  instrument->counter_AbsorbProp[119]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0118_H521_D16_Sample_L", _H521_D16_Sample_L_var._position_absolute, _H521_D16_Sample_L_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "xwidth", "0", "0.1","MCNUM");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "yheight", "0", "0.1","MCNUM");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "options", "NULL", "lambda limits=[1 10]", "char*");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0118_H521_D16_Sample_L", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_D16_Sample_L_setpos */

/* component H521_D16_Sample=Isotropic_Sqw() SETTING, POSITION/ROTATION */
int _H521_D16_Sample_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_D16_Sample_setpos] component H521_D16_Sample=Isotropic_Sqw() SETTING [Isotropic_Sqw:0]");
  stracpy(_H521_D16_Sample_var._name, "H521_D16_Sample", 16384);
  stracpy(_H521_D16_Sample_var._type, "Isotropic_Sqw", 16384);
  _H521_D16_Sample_var._index=120;
  int current_setpos_index = 120;
  _H521_D16_Sample_var._parameters.powder_format[0] = 0;
  _H521_D16_Sample_var._parameters.powder_format[1] = 0;
  _H521_D16_Sample_var._parameters.powder_format[2] = 0;
  _H521_D16_Sample_var._parameters.powder_format[3] = 0;
  _H521_D16_Sample_var._parameters.powder_format[4] = 0;
  _H521_D16_Sample_var._parameters.powder_format[5] = 0;
  _H521_D16_Sample_var._parameters.powder_format[6] = 0;
  _H521_D16_Sample_var._parameters.powder_format[7] = 0;
  _H521_D16_Sample_var._parameters.powder_format[8] = 0;
  if(_instrument_var._parameters.D16_sample && strlen(_instrument_var._parameters.D16_sample))
    stracpy(_H521_D16_Sample_var._parameters.Sqw_coh, _instrument_var._parameters.D16_sample ? _instrument_var._parameters.D16_sample : "", 16384);
  else 
  _H521_D16_Sample_var._parameters.Sqw_coh[0]='\0';
  _H521_D16_Sample_var._parameters.Sqw_inc[0]='\0';
  _H521_D16_Sample_var._parameters.geometry[0]='\0';
  _H521_D16_Sample_var._parameters.radius = 0.005;
  _H521_D16_Sample_var._parameters.thickness = 0;
  _H521_D16_Sample_var._parameters.xwidth = 0;
  _H521_D16_Sample_var._parameters.yheight = 0.05;
  _H521_D16_Sample_var._parameters.zdepth = 0;
  _H521_D16_Sample_var._parameters.threshold = 1e-20;
  _H521_D16_Sample_var._parameters.order = 0;
  _H521_D16_Sample_var._parameters.T = 0;
  _H521_D16_Sample_var._parameters.verbose = 1;
  _H521_D16_Sample_var._parameters.d_phi = 30;
  _H521_D16_Sample_var._parameters.concentric = 0;
  _H521_D16_Sample_var._parameters.rho = 0;
  _H521_D16_Sample_var._parameters.sigma_abs = 0;
  _H521_D16_Sample_var._parameters.sigma_coh = 0;
  _H521_D16_Sample_var._parameters.sigma_inc = 0;
  _H521_D16_Sample_var._parameters.classical = -1;
  _H521_D16_Sample_var._parameters.powder_Dd = 0;
  _H521_D16_Sample_var._parameters.powder_DW = 0;
  _H521_D16_Sample_var._parameters.powder_Vc = 0;
  _H521_D16_Sample_var._parameters.density = 0;
  _H521_D16_Sample_var._parameters.weight = 0;
  _H521_D16_Sample_var._parameters.p_interact = -1;
  _H521_D16_Sample_var._parameters.norm = -1;
  _H521_D16_Sample_var._parameters.powder_barns = 1;
  if("Frommhold" && strlen("Frommhold"))
    stracpy(_H521_D16_Sample_var._parameters.quantum_correction, "Frommhold" ? "Frommhold" : "", 16384);
  else 
  _H521_D16_Sample_var._parameters.quantum_correction[0]='\0';


  /* component H521_D16_Sample=Isotropic_Sqw() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_D16_Monochromator_Out_var._rotation_absolute, _H521_D16_Sample_var._rotation_absolute);
    rot_transpose(_H521_D16_Sample_L_var._rotation_absolute, tr1);
    rot_mul(_H521_D16_Sample_var._rotation_absolute, tr1, _H521_D16_Sample_var._rotation_relative);
    _H521_D16_Sample_var._rotation_is_identity =  rot_test_identity(_H521_D16_Sample_var._rotation_relative);
    tc1 = coords_set(
      0, 0, D16_L);
    rot_transpose(_H521_D16_Monochromator_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_D16_Sample_var._position_absolute = coords_add(_H521_D16_Monochromator_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_D16_Sample_L_var._position_absolute, _H521_D16_Sample_var._position_absolute);
    _H521_D16_Sample_var._position_relative = rot_apply(_H521_D16_Sample_var._rotation_absolute, tc1);
  } /* H521_D16_Sample=Isotropic_Sqw() AT ROTATED */
  DEBUG_COMPONENT("H521_D16_Sample", _H521_D16_Sample_var._position_absolute, _H521_D16_Sample_var._rotation_absolute);
  instrument->_position_absolute[120] = _H521_D16_Sample_var._position_absolute;
  instrument->_position_relative[120] = _H521_D16_Sample_var._position_relative;
    _H521_D16_Sample_var._position_relative_is_zero =  coords_test_zero(_H521_D16_Sample_var._position_relative);
  instrument->counter_N[120]  = instrument->counter_P[120] = instrument->counter_P2[120] = 0;
  instrument->counter_AbsorbProp[120]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0119_H521_D16_Sample", _H521_D16_Sample_var._position_absolute, _H521_D16_Sample_var._rotation_absolute, "Isotropic_Sqw");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "powder_format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "Sqw_coh", 0, _instrument_var._parameters.D16_sample, "char*");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "Sqw_inc", 0, NULL, "char*");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "geometry", 0, 0, "char*");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "radius", "0", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "yheight", "0", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "threshold", "1e-20", "1e-20","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "order", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "T", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "verbose", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "d_phi", "0", "30","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "concentric", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "rho", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "sigma_coh", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "classical", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "powder_Dd", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "powder_DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "powder_Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "p_interact", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "norm", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "powder_barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0119_H521_D16_Sample", "quantum_correction", "Frommhold", "Frommhold", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_D16_Sample_setpos */

/* component H521_D16_Detector=Monitor_nD() SETTING, POSITION/ROTATION */
int _H521_D16_Detector_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_D16_Detector_setpos] component H521_D16_Detector=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H521_D16_Detector_var._name, "H521_D16_Detector", 16384);
  stracpy(_H521_D16_Detector_var._type, "Monitor_nD", 16384);
  _H521_D16_Detector_var._index=121;
  int current_setpos_index = 121;
  if("" && strlen(""))
    stracpy(_H521_D16_Detector_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H521_D16_Detector_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_D16_Detector_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H521_D16_Detector_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_D16_Detector_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H521_D16_Detector_var._parameters.user3[0]='\0';
  _H521_D16_Detector_var._parameters.xwidth = 0.32;
  _H521_D16_Detector_var._parameters.yheight = 0.32;
  _H521_D16_Detector_var._parameters.zdepth = 0;
  _H521_D16_Detector_var._parameters.xmin = 0;
  _H521_D16_Detector_var._parameters.xmax = 0;
  _H521_D16_Detector_var._parameters.ymin = 0;
  _H521_D16_Detector_var._parameters.ymax = 0;
  _H521_D16_Detector_var._parameters.zmin = 0;
  _H521_D16_Detector_var._parameters.zmax = 0;
  _H521_D16_Detector_var._parameters.bins = 50;
  _H521_D16_Detector_var._parameters.min = -1e40;
  _H521_D16_Detector_var._parameters.max = 1e40;
  _H521_D16_Detector_var._parameters.restore_neutron = 1;
  _H521_D16_Detector_var._parameters.radius = 0;
  if("x y" && strlen("x y"))
    stracpy(_H521_D16_Detector_var._parameters.options, "x y" ? "x y" : "", 16384);
  else 
  _H521_D16_Detector_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Detector_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Detector_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Detector_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Detector_var._parameters.geometry[0]='\0';
  _H521_D16_Detector_var._parameters.nowritefile = 0;
  _H521_D16_Detector_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Detector_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Detector_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Detector_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Detector_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Detector_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Detector_var._parameters.username3[0]='\0';


  /* component H521_D16_Detector=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_D16_Sample_var._rotation_absolute, _H521_D16_Detector_var._rotation_absolute);
    rot_transpose(_H521_D16_Sample_var._rotation_absolute, tr1);
    rot_mul(_H521_D16_Detector_var._rotation_absolute, tr1, _H521_D16_Detector_var._rotation_relative);
    _H521_D16_Detector_var._rotation_is_identity =  rot_test_identity(_H521_D16_Detector_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 1.1);
    rot_transpose(_H521_D16_Sample_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_D16_Detector_var._position_absolute = coords_add(_H521_D16_Sample_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_D16_Sample_var._position_absolute, _H521_D16_Detector_var._position_absolute);
    _H521_D16_Detector_var._position_relative = rot_apply(_H521_D16_Detector_var._rotation_absolute, tc1);
  } /* H521_D16_Detector=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H521_D16_Detector", _H521_D16_Detector_var._position_absolute, _H521_D16_Detector_var._rotation_absolute);
  instrument->_position_absolute[121] = _H521_D16_Detector_var._position_absolute;
  instrument->_position_relative[121] = _H521_D16_Detector_var._position_relative;
    _H521_D16_Detector_var._position_relative_is_zero =  coords_test_zero(_H521_D16_Detector_var._position_relative);
  instrument->counter_N[121]  = instrument->counter_P[121] = instrument->counter_P2[121] = 0;
  instrument->counter_AbsorbProp[121]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0120_H521_D16_Detector", _H521_D16_Detector_var._position_absolute, _H521_D16_Detector_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "xwidth", "0", "0.32","MCNUM");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "yheight", "0", "0.32","MCNUM");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "options", "NULL", "x y", "char*");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0120_H521_D16_Detector", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_D16_Detector_setpos */

/* component H521_D16_Spectrometer=Monitor_nD() SETTING, POSITION/ROTATION */
int _H521_D16_Spectrometer_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_D16_Spectrometer_setpos] component H521_D16_Spectrometer=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H521_D16_Spectrometer_var._name, "H521_D16_Spectrometer", 16384);
  stracpy(_H521_D16_Spectrometer_var._type, "Monitor_nD", 16384);
  _H521_D16_Spectrometer_var._index=122;
  int current_setpos_index = 122;
  if("" && strlen(""))
    stracpy(_H521_D16_Spectrometer_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H521_D16_Spectrometer_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_D16_Spectrometer_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H521_D16_Spectrometer_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_D16_Spectrometer_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H521_D16_Spectrometer_var._parameters.user3[0]='\0';
  _H521_D16_Spectrometer_var._parameters.xwidth = 0;
  _H521_D16_Spectrometer_var._parameters.yheight = 0.3;
  _H521_D16_Spectrometer_var._parameters.zdepth = 0;
  _H521_D16_Spectrometer_var._parameters.xmin = 0;
  _H521_D16_Spectrometer_var._parameters.xmax = 0;
  _H521_D16_Spectrometer_var._parameters.ymin = 0;
  _H521_D16_Spectrometer_var._parameters.ymax = 0;
  _H521_D16_Spectrometer_var._parameters.zmin = 0;
  _H521_D16_Spectrometer_var._parameters.zmax = 0;
  _H521_D16_Spectrometer_var._parameters.bins = 0;
  _H521_D16_Spectrometer_var._parameters.min = -1e40;
  _H521_D16_Spectrometer_var._parameters.max = 1e40;
  _H521_D16_Spectrometer_var._parameters.restore_neutron = 1;
  _H521_D16_Spectrometer_var._parameters.radius = 0.5;
  if("angle limits=[-150 150] bins=50, energy limits=[0 30], banana" && strlen("angle limits=[-150 150] bins=50, energy limits=[0 30], banana"))
    stracpy(_H521_D16_Spectrometer_var._parameters.options, "angle limits=[-150 150] bins=50, energy limits=[0 30], banana" ? "angle limits=[-150 150] bins=50, energy limits=[0 30], banana" : "", 16384);
  else 
  _H521_D16_Spectrometer_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Spectrometer_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Spectrometer_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Spectrometer_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Spectrometer_var._parameters.geometry[0]='\0';
  _H521_D16_Spectrometer_var._parameters.nowritefile = 0;
  _H521_D16_Spectrometer_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Spectrometer_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Spectrometer_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Spectrometer_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Spectrometer_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Spectrometer_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Spectrometer_var._parameters.username3[0]='\0';


  /* component H521_D16_Spectrometer=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_D16_Sample_var._rotation_absolute, _H521_D16_Spectrometer_var._rotation_absolute);
    rot_transpose(_H521_D16_Detector_var._rotation_absolute, tr1);
    rot_mul(_H521_D16_Spectrometer_var._rotation_absolute, tr1, _H521_D16_Spectrometer_var._rotation_relative);
    _H521_D16_Spectrometer_var._rotation_is_identity =  rot_test_identity(_H521_D16_Spectrometer_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H521_D16_Sample_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_D16_Spectrometer_var._position_absolute = coords_add(_H521_D16_Sample_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_D16_Detector_var._position_absolute, _H521_D16_Spectrometer_var._position_absolute);
    _H521_D16_Spectrometer_var._position_relative = rot_apply(_H521_D16_Spectrometer_var._rotation_absolute, tc1);
  } /* H521_D16_Spectrometer=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H521_D16_Spectrometer", _H521_D16_Spectrometer_var._position_absolute, _H521_D16_Spectrometer_var._rotation_absolute);
  instrument->_position_absolute[122] = _H521_D16_Spectrometer_var._position_absolute;
  instrument->_position_relative[122] = _H521_D16_Spectrometer_var._position_relative;
    _H521_D16_Spectrometer_var._position_relative_is_zero =  coords_test_zero(_H521_D16_Spectrometer_var._position_relative);
  instrument->counter_N[122]  = instrument->counter_P[122] = instrument->counter_P2[122] = 0;
  instrument->counter_AbsorbProp[122]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0121_H521_D16_Spectrometer", _H521_D16_Spectrometer_var._position_absolute, _H521_D16_Spectrometer_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "yheight", "0", "0.3","MCNUM");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "radius", "0", "0.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "options", "NULL", "angle limits=[-150 150] bins=50, energy limits=[0 30], banana", "char*");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0121_H521_D16_Spectrometer", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_D16_Spectrometer_setpos */

/* component H521_D16_Diffractometer=Monitor_nD() SETTING, POSITION/ROTATION */
int _H521_D16_Diffractometer_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_D16_Diffractometer_setpos] component H521_D16_Diffractometer=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H521_D16_Diffractometer_var._name, "H521_D16_Diffractometer", 16384);
  stracpy(_H521_D16_Diffractometer_var._type, "Monitor_nD", 16384);
  _H521_D16_Diffractometer_var._index=123;
  int current_setpos_index = 123;
  if("" && strlen(""))
    stracpy(_H521_D16_Diffractometer_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H521_D16_Diffractometer_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_D16_Diffractometer_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H521_D16_Diffractometer_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_D16_Diffractometer_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H521_D16_Diffractometer_var._parameters.user3[0]='\0';
  _H521_D16_Diffractometer_var._parameters.xwidth = 0;
  _H521_D16_Diffractometer_var._parameters.yheight = 0.3;
  _H521_D16_Diffractometer_var._parameters.zdepth = 0;
  _H521_D16_Diffractometer_var._parameters.xmin = 0;
  _H521_D16_Diffractometer_var._parameters.xmax = 0;
  _H521_D16_Diffractometer_var._parameters.ymin = 0;
  _H521_D16_Diffractometer_var._parameters.ymax = 0;
  _H521_D16_Diffractometer_var._parameters.zmin = 0;
  _H521_D16_Diffractometer_var._parameters.zmax = 0;
  _H521_D16_Diffractometer_var._parameters.bins = 0;
  _H521_D16_Diffractometer_var._parameters.min = -1e40;
  _H521_D16_Diffractometer_var._parameters.max = 1e40;
  _H521_D16_Diffractometer_var._parameters.restore_neutron = 0;
  _H521_D16_Diffractometer_var._parameters.radius = 1;
  if("theta bins=100 limits=[-150 150], y, banana" && strlen("theta bins=100 limits=[-150 150], y, banana"))
    stracpy(_H521_D16_Diffractometer_var._parameters.options, "theta bins=100 limits=[-150 150], y, banana" ? "theta bins=100 limits=[-150 150], y, banana" : "", 16384);
  else 
  _H521_D16_Diffractometer_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Diffractometer_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Diffractometer_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Diffractometer_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Diffractometer_var._parameters.geometry[0]='\0';
  _H521_D16_Diffractometer_var._parameters.nowritefile = 0;
  _H521_D16_Diffractometer_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Diffractometer_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Diffractometer_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Diffractometer_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Diffractometer_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_D16_Diffractometer_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_D16_Diffractometer_var._parameters.username3[0]='\0';


  /* component H521_D16_Diffractometer=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_D16_Sample_var._rotation_absolute, _H521_D16_Diffractometer_var._rotation_absolute);
    rot_transpose(_H521_D16_Spectrometer_var._rotation_absolute, tr1);
    rot_mul(_H521_D16_Diffractometer_var._rotation_absolute, tr1, _H521_D16_Diffractometer_var._rotation_relative);
    _H521_D16_Diffractometer_var._rotation_is_identity =  rot_test_identity(_H521_D16_Diffractometer_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H521_D16_Sample_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_D16_Diffractometer_var._position_absolute = coords_add(_H521_D16_Sample_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_D16_Spectrometer_var._position_absolute, _H521_D16_Diffractometer_var._position_absolute);
    _H521_D16_Diffractometer_var._position_relative = rot_apply(_H521_D16_Diffractometer_var._rotation_absolute, tc1);
  } /* H521_D16_Diffractometer=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H521_D16_Diffractometer", _H521_D16_Diffractometer_var._position_absolute, _H521_D16_Diffractometer_var._rotation_absolute);
  instrument->_position_absolute[123] = _H521_D16_Diffractometer_var._position_absolute;
  instrument->_position_relative[123] = _H521_D16_Diffractometer_var._position_relative;
    _H521_D16_Diffractometer_var._position_relative_is_zero =  coords_test_zero(_H521_D16_Diffractometer_var._position_relative);
  instrument->counter_N[123]  = instrument->counter_P[123] = instrument->counter_P2[123] = 0;
  instrument->counter_AbsorbProp[123]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0122_H521_D16_Diffractometer", _H521_D16_Diffractometer_var._position_absolute, _H521_D16_Diffractometer_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "yheight", "0", "0.3","MCNUM");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "restore_neutron", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "radius", "0", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "options", "NULL", "theta bins=100 limits=[-150 150], y, banana", "char*");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0122_H521_D16_Diffractometer", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_D16_Diffractometer_setpos */

/* component H521_D16_Transmit=Arm() SETTING, POSITION/ROTATION */
int _H521_D16_Transmit_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_D16_Transmit_setpos] component H521_D16_Transmit=Arm() SETTING [Arm:0]");
  stracpy(_H521_D16_Transmit_var._name, "H521_D16_Transmit", 16384);
  stracpy(_H521_D16_Transmit_var._type, "Arm", 16384);
  _H521_D16_Transmit_var._index=124;
  int current_setpos_index = 124;
  /* component H521_D16_Transmit=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_D16_Monochromator_Cradle_var._rotation_absolute, _H521_D16_Transmit_var._rotation_absolute);
    rot_transpose(_H521_D16_Diffractometer_var._rotation_absolute, tr1);
    rot_mul(_H521_D16_Transmit_var._rotation_absolute, tr1, _H521_D16_Transmit_var._rotation_relative);
    _H521_D16_Transmit_var._rotation_is_identity =  rot_test_identity(_H521_D16_Transmit_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H521_D16_Monochromator_Cradle_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_D16_Transmit_var._position_absolute = coords_add(_H521_D16_Monochromator_Cradle_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_D16_Diffractometer_var._position_absolute, _H521_D16_Transmit_var._position_absolute);
    _H521_D16_Transmit_var._position_relative = rot_apply(_H521_D16_Transmit_var._rotation_absolute, tc1);
  } /* H521_D16_Transmit=Arm() AT ROTATED */
  DEBUG_COMPONENT("H521_D16_Transmit", _H521_D16_Transmit_var._position_absolute, _H521_D16_Transmit_var._rotation_absolute);
  instrument->_position_absolute[124] = _H521_D16_Transmit_var._position_absolute;
  instrument->_position_relative[124] = _H521_D16_Transmit_var._position_relative;
    _H521_D16_Transmit_var._position_relative_is_zero =  coords_test_zero(_H521_D16_Transmit_var._position_relative);
  instrument->counter_N[124]  = instrument->counter_P[124] = instrument->counter_P2[124] = 0;
  instrument->counter_AbsorbProp[124]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0123_H521_D16_Transmit", _H521_D16_Transmit_var._position_absolute, _H521_D16_Transmit_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_D16_Transmit_setpos */

/* component HCS_Al_125=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_125_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_125_setpos] component HCS_Al_125=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_125_var._name, "HCS_Al_125", 16384);
  stracpy(_HCS_Al_125_var._type, "PowderN", 16384);
  _HCS_Al_125_var._index=125;
  int current_setpos_index = 125;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_125_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_125_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_125_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_125_var._parameters.geometry[0]='\0';
  _HCS_Al_125_var._parameters.format[0] = 0;
  _HCS_Al_125_var._parameters.format[1] = 0;
  _HCS_Al_125_var._parameters.format[2] = 0;
  _HCS_Al_125_var._parameters.format[3] = 0;
  _HCS_Al_125_var._parameters.format[4] = 0;
  _HCS_Al_125_var._parameters.format[5] = 0;
  _HCS_Al_125_var._parameters.format[6] = 0;
  _HCS_Al_125_var._parameters.format[7] = 0;
  _HCS_Al_125_var._parameters.format[8] = 0;
  _HCS_Al_125_var._parameters.radius = 0;
  _HCS_Al_125_var._parameters.yheight = 0.15;
  _HCS_Al_125_var._parameters.xwidth = 0.06;
  _HCS_Al_125_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_125_var._parameters.thickness = 0;
  _HCS_Al_125_var._parameters.pack = 1;
  _HCS_Al_125_var._parameters.Vc = 0;
  _HCS_Al_125_var._parameters.sigma_abs = 0;
  _HCS_Al_125_var._parameters.sigma_inc = 0;
  _HCS_Al_125_var._parameters.delta_d_d = 0;
  _HCS_Al_125_var._parameters.p_inc = 0.005;
  _HCS_Al_125_var._parameters.p_transmit = 0.9450;
  _HCS_Al_125_var._parameters.DW = 0;
  _HCS_Al_125_var._parameters.nb_atoms = 1;
  _HCS_Al_125_var._parameters.d_omega = 0;
  _HCS_Al_125_var._parameters.d_phi = 10;
  _HCS_Al_125_var._parameters.tth_sign = 0;
  _HCS_Al_125_var._parameters.p_interact = 0.05;
  _HCS_Al_125_var._parameters.concentric = 0;
  _HCS_Al_125_var._parameters.density = 0;
  _HCS_Al_125_var._parameters.weight = 0;
  _HCS_Al_125_var._parameters.barns = 1;
  _HCS_Al_125_var._parameters.Strain = 0;
  _HCS_Al_125_var._parameters.focus_flip = 0;
  _HCS_Al_125_var._parameters.target_index = 0;
  _HCS_Al_125_var._parameters.order = 1;


  /* component HCS_Al_125=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_D16_Transmit_var._rotation_absolute, _HCS_Al_125_var._rotation_absolute);
    rot_transpose(_H521_D16_Transmit_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_125_var._rotation_absolute, tr1, _HCS_Al_125_var._rotation_relative);
    _HCS_Al_125_var._rotation_is_identity =  rot_test_identity(_HCS_Al_125_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.200 / 2 -0.01);
    rot_transpose(_H521_D16_Transmit_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_125_var._position_absolute = coords_add(_H521_D16_Transmit_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_D16_Transmit_var._position_absolute, _HCS_Al_125_var._position_absolute);
    _HCS_Al_125_var._position_relative = rot_apply(_HCS_Al_125_var._rotation_absolute, tc1);
  } /* HCS_Al_125=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_125", _HCS_Al_125_var._position_absolute, _HCS_Al_125_var._rotation_absolute);
  instrument->_position_absolute[125] = _HCS_Al_125_var._position_absolute;
  instrument->_position_relative[125] = _HCS_Al_125_var._position_relative;
    _HCS_Al_125_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_125_var._position_relative);
  instrument->counter_N[125]  = instrument->counter_P[125] = instrument->counter_P2[125] = 0;
  instrument->counter_AbsorbProp[125]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0124_HCS_Al_125", _HCS_Al_125_var._position_absolute, _HCS_Al_125_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "yheight", "0", "0.15","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0124_HCS_Al_125", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_125_setpos */

/* component H521_P6_Start=Arm() SETTING, POSITION/ROTATION */
int _H521_P6_Start_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_P6_Start_setpos] component H521_P6_Start=Arm() SETTING [Arm:0]");
  stracpy(_H521_P6_Start_var._name, "H521_P6_Start", 16384);
  stracpy(_H521_P6_Start_var._type, "Arm", 16384);
  _H521_P6_Start_var._index=126;
  int current_setpos_index = 126;
  /* component H521_P6_Start=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_D16_Transmit_var._rotation_absolute, _H521_P6_Start_var._rotation_absolute);
    rot_transpose(_HCS_Al_125_var._rotation_absolute, tr1);
    rot_mul(_H521_P6_Start_var._rotation_absolute, tr1, _H521_P6_Start_var._rotation_relative);
    _H521_P6_Start_var._rotation_is_identity =  rot_test_identity(_H521_P6_Start_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.200 / 2);
    rot_transpose(_H521_D16_Transmit_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_P6_Start_var._position_absolute = coords_add(_H521_D16_Transmit_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_125_var._position_absolute, _H521_P6_Start_var._position_absolute);
    _H521_P6_Start_var._position_relative = rot_apply(_H521_P6_Start_var._rotation_absolute, tc1);
  } /* H521_P6_Start=Arm() AT ROTATED */
  DEBUG_COMPONENT("H521_P6_Start", _H521_P6_Start_var._position_absolute, _H521_P6_Start_var._rotation_absolute);
  instrument->_position_absolute[126] = _H521_P6_Start_var._position_absolute;
  instrument->_position_relative[126] = _H521_P6_Start_var._position_relative;
    _H521_P6_Start_var._position_relative_is_zero =  coords_test_zero(_H521_P6_Start_var._position_relative);
  instrument->counter_N[126]  = instrument->counter_P[126] = instrument->counter_P2[126] = 0;
  instrument->counter_AbsorbProp[126]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0125_H521_P6_Start", _H521_P6_Start_var._position_absolute, _H521_P6_Start_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_P6_Start_setpos */

/* component H521_P6=Guide_gravity() SETTING, POSITION/ROTATION */
int _H521_P6_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_P6_setpos] component H521_P6=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H521_P6_var._name, "H521_P6", 16384);
  stracpy(_H521_P6_var._type, "Guide_gravity", 16384);
  _H521_P6_var._index=127;
  int current_setpos_index = 127;
  _H521_P6_var._parameters.w1 = 0.06;
  _H521_P6_var._parameters.h1 = 0.15;
  _H521_P6_var._parameters.w2 = 0;
  _H521_P6_var._parameters.h2 = 0.12;
  _H521_P6_var._parameters.l = 19.321;
  _H521_P6_var._parameters.R0 = gR0;
  _H521_P6_var._parameters.Qc = gQc;
  _H521_P6_var._parameters.alpha = gAlpha;
  _H521_P6_var._parameters.m = 3;
  _H521_P6_var._parameters.W = gW;
  _H521_P6_var._parameters.nslit = 1;
  _H521_P6_var._parameters.d = 0.0005;
  _H521_P6_var._parameters.mleft = -1;
  _H521_P6_var._parameters.mright = -1;
  _H521_P6_var._parameters.mtop = -1;
  _H521_P6_var._parameters.mbottom = -1;
  _H521_P6_var._parameters.nhslit = 1;
  _H521_P6_var._parameters.G = 0;
  _H521_P6_var._parameters.aleft = -1;
  _H521_P6_var._parameters.aright = -1;
  _H521_P6_var._parameters.atop = -1;
  _H521_P6_var._parameters.abottom = -1;
  _H521_P6_var._parameters.wavy = 0;
  _H521_P6_var._parameters.wavy_z = 0;
  _H521_P6_var._parameters.wavy_tb = 0;
  _H521_P6_var._parameters.wavy_lr = 0;
  _H521_P6_var._parameters.chamfers = 0;
  _H521_P6_var._parameters.chamfers_z = 0;
  _H521_P6_var._parameters.chamfers_lr = 0;
  _H521_P6_var._parameters.chamfers_tb = 0;
  _H521_P6_var._parameters.nelements = 1;
  _H521_P6_var._parameters.nu = 0;
  _H521_P6_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_P6_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_P6_var._parameters.reflect[0]='\0';


  /* component H521_P6=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_P6_Start_var._rotation_absolute, _H521_P6_var._rotation_absolute);
    rot_transpose(_HCS_Al_125_var._rotation_absolute, tr1);
    rot_mul(_H521_P6_var._rotation_absolute, tr1, _H521_P6_var._rotation_relative);
    _H521_P6_var._rotation_is_identity =  rot_test_identity(_H521_P6_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H521_P6_Start_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_P6_var._position_absolute = coords_add(_H521_P6_Start_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_125_var._position_absolute, _H521_P6_var._position_absolute);
    _H521_P6_var._position_relative = rot_apply(_H521_P6_var._rotation_absolute, tc1);
  } /* H521_P6=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H521_P6", _H521_P6_var._position_absolute, _H521_P6_var._rotation_absolute);
  instrument->_position_absolute[127] = _H521_P6_var._position_absolute;
  instrument->_position_relative[127] = _H521_P6_var._position_relative;
    _H521_P6_var._position_relative_is_zero =  coords_test_zero(_H521_P6_var._position_relative);
  instrument->counter_N[127]  = instrument->counter_P[127] = instrument->counter_P2[127] = 0;
  instrument->counter_AbsorbProp[127]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0126_H521_P6", _H521_P6_var._position_absolute, _H521_P6_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "h1", "NONE", "0.15","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "h2", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "l", "NONE", "19.321","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "m", "1.0", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0126_H521_P6", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_P6_setpos */

/* component HCS_Al_128=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_128_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_128_setpos] component HCS_Al_128=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_128_var._name, "HCS_Al_128", 16384);
  stracpy(_HCS_Al_128_var._type, "PowderN", 16384);
  _HCS_Al_128_var._index=128;
  int current_setpos_index = 128;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_128_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_128_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_128_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_128_var._parameters.geometry[0]='\0';
  _HCS_Al_128_var._parameters.format[0] = 0;
  _HCS_Al_128_var._parameters.format[1] = 0;
  _HCS_Al_128_var._parameters.format[2] = 0;
  _HCS_Al_128_var._parameters.format[3] = 0;
  _HCS_Al_128_var._parameters.format[4] = 0;
  _HCS_Al_128_var._parameters.format[5] = 0;
  _HCS_Al_128_var._parameters.format[6] = 0;
  _HCS_Al_128_var._parameters.format[7] = 0;
  _HCS_Al_128_var._parameters.format[8] = 0;
  _HCS_Al_128_var._parameters.radius = 0;
  _HCS_Al_128_var._parameters.yheight = 0.12;
  _HCS_Al_128_var._parameters.xwidth = 0.06;
  _HCS_Al_128_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_128_var._parameters.thickness = 0;
  _HCS_Al_128_var._parameters.pack = 1;
  _HCS_Al_128_var._parameters.Vc = 0;
  _HCS_Al_128_var._parameters.sigma_abs = 0;
  _HCS_Al_128_var._parameters.sigma_inc = 0;
  _HCS_Al_128_var._parameters.delta_d_d = 0;
  _HCS_Al_128_var._parameters.p_inc = 0.005;
  _HCS_Al_128_var._parameters.p_transmit = 0.9450;
  _HCS_Al_128_var._parameters.DW = 0;
  _HCS_Al_128_var._parameters.nb_atoms = 1;
  _HCS_Al_128_var._parameters.d_omega = 0;
  _HCS_Al_128_var._parameters.d_phi = 10;
  _HCS_Al_128_var._parameters.tth_sign = 0;
  _HCS_Al_128_var._parameters.p_interact = 0.05;
  _HCS_Al_128_var._parameters.concentric = 0;
  _HCS_Al_128_var._parameters.density = 0;
  _HCS_Al_128_var._parameters.weight = 0;
  _HCS_Al_128_var._parameters.barns = 1;
  _HCS_Al_128_var._parameters.Strain = 0;
  _HCS_Al_128_var._parameters.focus_flip = 0;
  _HCS_Al_128_var._parameters.target_index = 0;
  _HCS_Al_128_var._parameters.order = 1;


  /* component HCS_Al_128=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_P6_var._rotation_absolute, _HCS_Al_128_var._rotation_absolute);
    rot_transpose(_H521_P6_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_128_var._rotation_absolute, tr1, _HCS_Al_128_var._rotation_relative);
    _HCS_Al_128_var._rotation_is_identity =  rot_test_identity(_HCS_Al_128_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 19.321 + 0.001);
    rot_transpose(_H521_P6_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_128_var._position_absolute = coords_add(_H521_P6_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_P6_var._position_absolute, _HCS_Al_128_var._position_absolute);
    _HCS_Al_128_var._position_relative = rot_apply(_HCS_Al_128_var._rotation_absolute, tc1);
  } /* HCS_Al_128=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_128", _HCS_Al_128_var._position_absolute, _HCS_Al_128_var._rotation_absolute);
  instrument->_position_absolute[128] = _HCS_Al_128_var._position_absolute;
  instrument->_position_relative[128] = _HCS_Al_128_var._position_relative;
    _HCS_Al_128_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_128_var._position_relative);
  instrument->counter_N[128]  = instrument->counter_P[128] = instrument->counter_P2[128] = 0;
  instrument->counter_AbsorbProp[128]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0127_HCS_Al_128", _HCS_Al_128_var._position_absolute, _HCS_Al_128_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0127_HCS_Al_128", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_128_setpos */

/* component H521_SADAM_Monochromator_Cradle=Monitor_nD() SETTING, POSITION/ROTATION */
int _H521_SADAM_Monochromator_Cradle_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_SADAM_Monochromator_Cradle_setpos] component H521_SADAM_Monochromator_Cradle=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H521_SADAM_Monochromator_Cradle_var._name, "H521_SADAM_Monochromator_Cradle", 16384);
  stracpy(_H521_SADAM_Monochromator_Cradle_var._type, "Monitor_nD", 16384);
  _H521_SADAM_Monochromator_Cradle_var._index=129;
  int current_setpos_index = 129;
  if("" && strlen(""))
    stracpy(_H521_SADAM_Monochromator_Cradle_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H521_SADAM_Monochromator_Cradle_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_SADAM_Monochromator_Cradle_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H521_SADAM_Monochromator_Cradle_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_SADAM_Monochromator_Cradle_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H521_SADAM_Monochromator_Cradle_var._parameters.user3[0]='\0';
  _H521_SADAM_Monochromator_Cradle_var._parameters.xwidth = 0.06;
  _H521_SADAM_Monochromator_Cradle_var._parameters.yheight = 0.12;
  _H521_SADAM_Monochromator_Cradle_var._parameters.zdepth = 0;
  _H521_SADAM_Monochromator_Cradle_var._parameters.xmin = 0;
  _H521_SADAM_Monochromator_Cradle_var._parameters.xmax = 0;
  _H521_SADAM_Monochromator_Cradle_var._parameters.ymin = 0;
  _H521_SADAM_Monochromator_Cradle_var._parameters.ymax = 0;
  _H521_SADAM_Monochromator_Cradle_var._parameters.zmin = 0;
  _H521_SADAM_Monochromator_Cradle_var._parameters.zmax = 0;
  _H521_SADAM_Monochromator_Cradle_var._parameters.bins = 50;
  _H521_SADAM_Monochromator_Cradle_var._parameters.min = -1e40;
  _H521_SADAM_Monochromator_Cradle_var._parameters.max = 1e40;
  _H521_SADAM_Monochromator_Cradle_var._parameters.restore_neutron = 1;
  _H521_SADAM_Monochromator_Cradle_var._parameters.radius = 0;
  if("x y, slit" && strlen("x y, slit"))
    stracpy(_H521_SADAM_Monochromator_Cradle_var._parameters.options, "x y, slit" ? "x y, slit" : "", 16384);
  else 
  _H521_SADAM_Monochromator_Cradle_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Monochromator_Cradle_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Monochromator_Cradle_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Monochromator_Cradle_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Monochromator_Cradle_var._parameters.geometry[0]='\0';
  _H521_SADAM_Monochromator_Cradle_var._parameters.nowritefile = 0;
  _H521_SADAM_Monochromator_Cradle_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Monochromator_Cradle_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Monochromator_Cradle_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Monochromator_Cradle_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Monochromator_Cradle_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Monochromator_Cradle_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Monochromator_Cradle_var._parameters.username3[0]='\0';


  /* component H521_SADAM_Monochromator_Cradle=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_128_var._rotation_absolute, _H521_SADAM_Monochromator_Cradle_var._rotation_absolute);
    rot_transpose(_HCS_Al_128_var._rotation_absolute, tr1);
    rot_mul(_H521_SADAM_Monochromator_Cradle_var._rotation_absolute, tr1, _H521_SADAM_Monochromator_Cradle_var._rotation_relative);
    _H521_SADAM_Monochromator_Cradle_var._rotation_is_identity =  rot_test_identity(_H521_SADAM_Monochromator_Cradle_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.524 / 2 -0.001);
    rot_transpose(_HCS_Al_128_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_SADAM_Monochromator_Cradle_var._position_absolute = coords_add(_HCS_Al_128_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_128_var._position_absolute, _H521_SADAM_Monochromator_Cradle_var._position_absolute);
    _H521_SADAM_Monochromator_Cradle_var._position_relative = rot_apply(_H521_SADAM_Monochromator_Cradle_var._rotation_absolute, tc1);
  } /* H521_SADAM_Monochromator_Cradle=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H521_SADAM_Monochromator_Cradle", _H521_SADAM_Monochromator_Cradle_var._position_absolute, _H521_SADAM_Monochromator_Cradle_var._rotation_absolute);
  instrument->_position_absolute[129] = _H521_SADAM_Monochromator_Cradle_var._position_absolute;
  instrument->_position_relative[129] = _H521_SADAM_Monochromator_Cradle_var._position_relative;
    _H521_SADAM_Monochromator_Cradle_var._position_relative_is_zero =  coords_test_zero(_H521_SADAM_Monochromator_Cradle_var._position_relative);
  instrument->counter_N[129]  = instrument->counter_P[129] = instrument->counter_P2[129] = 0;
  instrument->counter_AbsorbProp[129]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", _H521_SADAM_Monochromator_Cradle_var._position_absolute, _H521_SADAM_Monochromator_Cradle_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "options", "NULL", "x y, slit", "char*");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0128_H521_SADAM_Monochromator_Cradle", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_SADAM_Monochromator_Cradle_setpos */

/* component H521_SADAM_Monochromator=Monochromator_curved() SETTING, POSITION/ROTATION */
int _H521_SADAM_Monochromator_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_SADAM_Monochromator_setpos] component H521_SADAM_Monochromator=Monochromator_curved() SETTING [Monochromator_curved:0]");
  stracpy(_H521_SADAM_Monochromator_var._name, "H521_SADAM_Monochromator", 16384);
  stracpy(_H521_SADAM_Monochromator_var._type, "Monochromator_curved", 16384);
  _H521_SADAM_Monochromator_var._index=130;
  int current_setpos_index = 130;
  if("HOPG.rfl" && strlen("HOPG.rfl"))
    stracpy(_H521_SADAM_Monochromator_var._parameters.reflect, "HOPG.rfl" ? "HOPG.rfl" : "", 16384);
  else 
  _H521_SADAM_Monochromator_var._parameters.reflect[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Monochromator_var._parameters.transmit, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Monochromator_var._parameters.transmit[0]='\0';
  _H521_SADAM_Monochromator_var._parameters.zwidth = 0.01;
  _H521_SADAM_Monochromator_var._parameters.yheight = 0.01;
  _H521_SADAM_Monochromator_var._parameters.gap = 0.0005;
  _H521_SADAM_Monochromator_var._parameters.NH = 1;
  _H521_SADAM_Monochromator_var._parameters.NV = 7;
  _H521_SADAM_Monochromator_var._parameters.mosaich = 40;
  _H521_SADAM_Monochromator_var._parameters.mosaicv = 40;
  _H521_SADAM_Monochromator_var._parameters.r0 = 1;
  _H521_SADAM_Monochromator_var._parameters.t0 = 1.0;
  _H521_SADAM_Monochromator_var._parameters.Q = 1.8734;
  _H521_SADAM_Monochromator_var._parameters.RV = _instrument_var._parameters.SADAM_RMV;
  _H521_SADAM_Monochromator_var._parameters.RH = 0;
  _H521_SADAM_Monochromator_var._parameters.DM = SADAM_DM;
  _H521_SADAM_Monochromator_var._parameters.mosaic = 0;
  _H521_SADAM_Monochromator_var._parameters.width = 0.06;
  _H521_SADAM_Monochromator_var._parameters.height = 0.12;
  _H521_SADAM_Monochromator_var._parameters.verbose = 0;
  _H521_SADAM_Monochromator_var._parameters.order = 0;


  /* component H521_SADAM_Monochromator=Monochromator_curved() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (SADAM_A1)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_SADAM_Monochromator_Cradle_var._rotation_absolute, _H521_SADAM_Monochromator_var._rotation_absolute);
    rot_transpose(_H521_SADAM_Monochromator_Cradle_var._rotation_absolute, tr1);
    rot_mul(_H521_SADAM_Monochromator_var._rotation_absolute, tr1, _H521_SADAM_Monochromator_var._rotation_relative);
    _H521_SADAM_Monochromator_var._rotation_is_identity =  rot_test_identity(_H521_SADAM_Monochromator_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H521_SADAM_Monochromator_Cradle_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_SADAM_Monochromator_var._position_absolute = coords_add(_H521_SADAM_Monochromator_Cradle_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_SADAM_Monochromator_Cradle_var._position_absolute, _H521_SADAM_Monochromator_var._position_absolute);
    _H521_SADAM_Monochromator_var._position_relative = rot_apply(_H521_SADAM_Monochromator_var._rotation_absolute, tc1);
  } /* H521_SADAM_Monochromator=Monochromator_curved() AT ROTATED */
  DEBUG_COMPONENT("H521_SADAM_Monochromator", _H521_SADAM_Monochromator_var._position_absolute, _H521_SADAM_Monochromator_var._rotation_absolute);
  instrument->_position_absolute[130] = _H521_SADAM_Monochromator_var._position_absolute;
  instrument->_position_relative[130] = _H521_SADAM_Monochromator_var._position_relative;
    _H521_SADAM_Monochromator_var._position_relative_is_zero =  coords_test_zero(_H521_SADAM_Monochromator_var._position_relative);
  instrument->counter_N[130]  = instrument->counter_P[130] = instrument->counter_P2[130] = 0;
  instrument->counter_AbsorbProp[130]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0129_H521_SADAM_Monochromator", _H521_SADAM_Monochromator_var._position_absolute, _H521_SADAM_Monochromator_var._rotation_absolute, "Monochromator_curved");
        mccomp_param_nexus(nxhandle,"0129_H521_SADAM_Monochromator", "reflect", "NULL", "HOPG.rfl", "char*");
        mccomp_param_nexus(nxhandle,"0129_H521_SADAM_Monochromator", "transmit", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0129_H521_SADAM_Monochromator", "zwidth", "0.01", "0.01","MCNUM");
        mccomp_param_nexus(nxhandle,"0129_H521_SADAM_Monochromator", "yheight", "0.01", "0.01","MCNUM");
        mccomp_param_nexus(nxhandle,"0129_H521_SADAM_Monochromator", "gap", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0129_H521_SADAM_Monochromator", "NH", "11", "1","int");
        mccomp_param_nexus(nxhandle,"0129_H521_SADAM_Monochromator", "NV", "11", "7","int");
        mccomp_param_nexus(nxhandle,"0129_H521_SADAM_Monochromator", "mosaich", "30.0", "40","MCNUM");
        mccomp_param_nexus(nxhandle,"0129_H521_SADAM_Monochromator", "mosaicv", "30.0", "40","MCNUM");
        mccomp_param_nexus(nxhandle,"0129_H521_SADAM_Monochromator", "r0", "0.7", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0129_H521_SADAM_Monochromator", "t0", "1.0", "1.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0129_H521_SADAM_Monochromator", "Q", "1.8734", "1.8734","MCNUM");
        mccomp_param_nexus(nxhandle,"0129_H521_SADAM_Monochromator", "RV", "0", "_instrument_var._parameters.SADAM_RMV","MCNUM");
        mccomp_param_nexus(nxhandle,"0129_H521_SADAM_Monochromator", "RH", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0129_H521_SADAM_Monochromator", "DM", "0", "SADAM_DM","MCNUM");
        mccomp_param_nexus(nxhandle,"0129_H521_SADAM_Monochromator", "mosaic", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0129_H521_SADAM_Monochromator", "width", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0129_H521_SADAM_Monochromator", "height", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0129_H521_SADAM_Monochromator", "verbose", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0129_H521_SADAM_Monochromator", "order", "0", "0","MCNUM");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_SADAM_Monochromator_setpos */

/* component H521_SADAM_Monochromator_Out=Arm() SETTING, POSITION/ROTATION */
int _H521_SADAM_Monochromator_Out_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_SADAM_Monochromator_Out_setpos] component H521_SADAM_Monochromator_Out=Arm() SETTING [Arm:0]");
  stracpy(_H521_SADAM_Monochromator_Out_var._name, "H521_SADAM_Monochromator_Out", 16384);
  stracpy(_H521_SADAM_Monochromator_Out_var._type, "Arm", 16384);
  _H521_SADAM_Monochromator_Out_var._index=131;
  int current_setpos_index = 131;
  /* component H521_SADAM_Monochromator_Out=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (2 * SADAM_A1)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H521_SADAM_Monochromator_Cradle_var._rotation_absolute, _H521_SADAM_Monochromator_Out_var._rotation_absolute);
    rot_transpose(_H521_SADAM_Monochromator_var._rotation_absolute, tr1);
    rot_mul(_H521_SADAM_Monochromator_Out_var._rotation_absolute, tr1, _H521_SADAM_Monochromator_Out_var._rotation_relative);
    _H521_SADAM_Monochromator_Out_var._rotation_is_identity =  rot_test_identity(_H521_SADAM_Monochromator_Out_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H521_SADAM_Monochromator_Cradle_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_SADAM_Monochromator_Out_var._position_absolute = coords_add(_H521_SADAM_Monochromator_Cradle_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_SADAM_Monochromator_var._position_absolute, _H521_SADAM_Monochromator_Out_var._position_absolute);
    _H521_SADAM_Monochromator_Out_var._position_relative = rot_apply(_H521_SADAM_Monochromator_Out_var._rotation_absolute, tc1);
  } /* H521_SADAM_Monochromator_Out=Arm() AT ROTATED */
  DEBUG_COMPONENT("H521_SADAM_Monochromator_Out", _H521_SADAM_Monochromator_Out_var._position_absolute, _H521_SADAM_Monochromator_Out_var._rotation_absolute);
  instrument->_position_absolute[131] = _H521_SADAM_Monochromator_Out_var._position_absolute;
  instrument->_position_relative[131] = _H521_SADAM_Monochromator_Out_var._position_relative;
    _H521_SADAM_Monochromator_Out_var._position_relative_is_zero =  coords_test_zero(_H521_SADAM_Monochromator_Out_var._position_relative);
  instrument->counter_N[131]  = instrument->counter_P[131] = instrument->counter_P2[131] = 0;
  instrument->counter_AbsorbProp[131]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0130_H521_SADAM_Monochromator_Out", _H521_SADAM_Monochromator_Out_var._position_absolute, _H521_SADAM_Monochromator_Out_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_SADAM_Monochromator_Out_setpos */

/* component H521_SADAM_Sample_Div=Monitor_nD() SETTING, POSITION/ROTATION */
int _H521_SADAM_Sample_Div_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_SADAM_Sample_Div_setpos] component H521_SADAM_Sample_Div=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H521_SADAM_Sample_Div_var._name, "H521_SADAM_Sample_Div", 16384);
  stracpy(_H521_SADAM_Sample_Div_var._type, "Monitor_nD", 16384);
  _H521_SADAM_Sample_Div_var._index=132;
  int current_setpos_index = 132;
  if("" && strlen(""))
    stracpy(_H521_SADAM_Sample_Div_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H521_SADAM_Sample_Div_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_SADAM_Sample_Div_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H521_SADAM_Sample_Div_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_SADAM_Sample_Div_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H521_SADAM_Sample_Div_var._parameters.user3[0]='\0';
  _H521_SADAM_Sample_Div_var._parameters.xwidth = 0.05;
  _H521_SADAM_Sample_Div_var._parameters.yheight = 0.05;
  _H521_SADAM_Sample_Div_var._parameters.zdepth = 0;
  _H521_SADAM_Sample_Div_var._parameters.xmin = 0;
  _H521_SADAM_Sample_Div_var._parameters.xmax = 0;
  _H521_SADAM_Sample_Div_var._parameters.ymin = 0;
  _H521_SADAM_Sample_Div_var._parameters.ymax = 0;
  _H521_SADAM_Sample_Div_var._parameters.zmin = 0;
  _H521_SADAM_Sample_Div_var._parameters.zmax = 0;
  _H521_SADAM_Sample_Div_var._parameters.bins = 50;
  _H521_SADAM_Sample_Div_var._parameters.min = -1e40;
  _H521_SADAM_Sample_Div_var._parameters.max = 1e40;
  _H521_SADAM_Sample_Div_var._parameters.restore_neutron = 1;
  _H521_SADAM_Sample_Div_var._parameters.radius = 0;
  if("dx limits=[-2 2], dy limits=[-2 2]" && strlen("dx limits=[-2 2], dy limits=[-2 2]"))
    stracpy(_H521_SADAM_Sample_Div_var._parameters.options, "dx limits=[-2 2], dy limits=[-2 2]" ? "dx limits=[-2 2], dy limits=[-2 2]" : "", 16384);
  else 
  _H521_SADAM_Sample_Div_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Sample_Div_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Sample_Div_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Sample_Div_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Sample_Div_var._parameters.geometry[0]='\0';
  _H521_SADAM_Sample_Div_var._parameters.nowritefile = 0;
  _H521_SADAM_Sample_Div_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Sample_Div_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Sample_Div_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Sample_Div_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Sample_Div_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Sample_Div_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Sample_Div_var._parameters.username3[0]='\0';


  /* component H521_SADAM_Sample_Div=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_SADAM_Monochromator_Out_var._rotation_absolute, _H521_SADAM_Sample_Div_var._rotation_absolute);
    rot_transpose(_H521_SADAM_Monochromator_var._rotation_absolute, tr1);
    rot_mul(_H521_SADAM_Sample_Div_var._rotation_absolute, tr1, _H521_SADAM_Sample_Div_var._rotation_relative);
    _H521_SADAM_Sample_Div_var._rotation_is_identity =  rot_test_identity(_H521_SADAM_Sample_Div_var._rotation_relative);
    tc1 = coords_set(
      0, 0, SADAM_L);
    rot_transpose(_H521_SADAM_Monochromator_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_SADAM_Sample_Div_var._position_absolute = coords_add(_H521_SADAM_Monochromator_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_SADAM_Monochromator_var._position_absolute, _H521_SADAM_Sample_Div_var._position_absolute);
    _H521_SADAM_Sample_Div_var._position_relative = rot_apply(_H521_SADAM_Sample_Div_var._rotation_absolute, tc1);
  } /* H521_SADAM_Sample_Div=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H521_SADAM_Sample_Div", _H521_SADAM_Sample_Div_var._position_absolute, _H521_SADAM_Sample_Div_var._rotation_absolute);
  instrument->_position_absolute[132] = _H521_SADAM_Sample_Div_var._position_absolute;
  instrument->_position_relative[132] = _H521_SADAM_Sample_Div_var._position_relative;
    _H521_SADAM_Sample_Div_var._position_relative_is_zero =  coords_test_zero(_H521_SADAM_Sample_Div_var._position_relative);
  instrument->counter_N[132]  = instrument->counter_P[132] = instrument->counter_P2[132] = 0;
  instrument->counter_AbsorbProp[132]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", _H521_SADAM_Sample_Div_var._position_absolute, _H521_SADAM_Sample_Div_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "xwidth", "0", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "yheight", "0", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "options", "NULL", "dx limits=[-2 2], dy limits=[-2 2]", "char*");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0131_H521_SADAM_Sample_Div", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_SADAM_Sample_Div_setpos */

/* component H521_SADAM_Sample_XY=Monitor_nD() SETTING, POSITION/ROTATION */
int _H521_SADAM_Sample_XY_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_SADAM_Sample_XY_setpos] component H521_SADAM_Sample_XY=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H521_SADAM_Sample_XY_var._name, "H521_SADAM_Sample_XY", 16384);
  stracpy(_H521_SADAM_Sample_XY_var._type, "Monitor_nD", 16384);
  _H521_SADAM_Sample_XY_var._index=133;
  int current_setpos_index = 133;
  if("" && strlen(""))
    stracpy(_H521_SADAM_Sample_XY_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H521_SADAM_Sample_XY_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_SADAM_Sample_XY_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H521_SADAM_Sample_XY_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_SADAM_Sample_XY_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H521_SADAM_Sample_XY_var._parameters.user3[0]='\0';
  _H521_SADAM_Sample_XY_var._parameters.xwidth = 0.1;
  _H521_SADAM_Sample_XY_var._parameters.yheight = 0.1;
  _H521_SADAM_Sample_XY_var._parameters.zdepth = 0;
  _H521_SADAM_Sample_XY_var._parameters.xmin = 0;
  _H521_SADAM_Sample_XY_var._parameters.xmax = 0;
  _H521_SADAM_Sample_XY_var._parameters.ymin = 0;
  _H521_SADAM_Sample_XY_var._parameters.ymax = 0;
  _H521_SADAM_Sample_XY_var._parameters.zmin = 0;
  _H521_SADAM_Sample_XY_var._parameters.zmax = 0;
  _H521_SADAM_Sample_XY_var._parameters.bins = 50;
  _H521_SADAM_Sample_XY_var._parameters.min = -1e40;
  _H521_SADAM_Sample_XY_var._parameters.max = 1e40;
  _H521_SADAM_Sample_XY_var._parameters.restore_neutron = 1;
  _H521_SADAM_Sample_XY_var._parameters.radius = 0;
  if("x y" && strlen("x y"))
    stracpy(_H521_SADAM_Sample_XY_var._parameters.options, "x y" ? "x y" : "", 16384);
  else 
  _H521_SADAM_Sample_XY_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Sample_XY_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Sample_XY_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Sample_XY_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Sample_XY_var._parameters.geometry[0]='\0';
  _H521_SADAM_Sample_XY_var._parameters.nowritefile = 0;
  _H521_SADAM_Sample_XY_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Sample_XY_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Sample_XY_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Sample_XY_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Sample_XY_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Sample_XY_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Sample_XY_var._parameters.username3[0]='\0';


  /* component H521_SADAM_Sample_XY=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_SADAM_Monochromator_Out_var._rotation_absolute, _H521_SADAM_Sample_XY_var._rotation_absolute);
    rot_transpose(_H521_SADAM_Sample_Div_var._rotation_absolute, tr1);
    rot_mul(_H521_SADAM_Sample_XY_var._rotation_absolute, tr1, _H521_SADAM_Sample_XY_var._rotation_relative);
    _H521_SADAM_Sample_XY_var._rotation_is_identity =  rot_test_identity(_H521_SADAM_Sample_XY_var._rotation_relative);
    tc1 = coords_set(
      0, 0, SADAM_L);
    rot_transpose(_H521_SADAM_Monochromator_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_SADAM_Sample_XY_var._position_absolute = coords_add(_H521_SADAM_Monochromator_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_SADAM_Sample_Div_var._position_absolute, _H521_SADAM_Sample_XY_var._position_absolute);
    _H521_SADAM_Sample_XY_var._position_relative = rot_apply(_H521_SADAM_Sample_XY_var._rotation_absolute, tc1);
  } /* H521_SADAM_Sample_XY=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H521_SADAM_Sample_XY", _H521_SADAM_Sample_XY_var._position_absolute, _H521_SADAM_Sample_XY_var._rotation_absolute);
  instrument->_position_absolute[133] = _H521_SADAM_Sample_XY_var._position_absolute;
  instrument->_position_relative[133] = _H521_SADAM_Sample_XY_var._position_relative;
    _H521_SADAM_Sample_XY_var._position_relative_is_zero =  coords_test_zero(_H521_SADAM_Sample_XY_var._position_relative);
  instrument->counter_N[133]  = instrument->counter_P[133] = instrument->counter_P2[133] = 0;
  instrument->counter_AbsorbProp[133]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", _H521_SADAM_Sample_XY_var._position_absolute, _H521_SADAM_Sample_XY_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "xwidth", "0", "0.1","MCNUM");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "yheight", "0", "0.1","MCNUM");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "options", "NULL", "x y", "char*");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0132_H521_SADAM_Sample_XY", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_SADAM_Sample_XY_setpos */

/* component H521_SADAM_Sample_L=Monitor_nD() SETTING, POSITION/ROTATION */
int _H521_SADAM_Sample_L_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_SADAM_Sample_L_setpos] component H521_SADAM_Sample_L=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H521_SADAM_Sample_L_var._name, "H521_SADAM_Sample_L", 16384);
  stracpy(_H521_SADAM_Sample_L_var._type, "Monitor_nD", 16384);
  _H521_SADAM_Sample_L_var._index=134;
  int current_setpos_index = 134;
  if("" && strlen(""))
    stracpy(_H521_SADAM_Sample_L_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H521_SADAM_Sample_L_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_SADAM_Sample_L_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H521_SADAM_Sample_L_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_SADAM_Sample_L_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H521_SADAM_Sample_L_var._parameters.user3[0]='\0';
  _H521_SADAM_Sample_L_var._parameters.xwidth = 0.1;
  _H521_SADAM_Sample_L_var._parameters.yheight = 0.1;
  _H521_SADAM_Sample_L_var._parameters.zdepth = 0;
  _H521_SADAM_Sample_L_var._parameters.xmin = 0;
  _H521_SADAM_Sample_L_var._parameters.xmax = 0;
  _H521_SADAM_Sample_L_var._parameters.ymin = 0;
  _H521_SADAM_Sample_L_var._parameters.ymax = 0;
  _H521_SADAM_Sample_L_var._parameters.zmin = 0;
  _H521_SADAM_Sample_L_var._parameters.zmax = 0;
  _H521_SADAM_Sample_L_var._parameters.bins = 50;
  _H521_SADAM_Sample_L_var._parameters.min = -1e40;
  _H521_SADAM_Sample_L_var._parameters.max = 1e40;
  _H521_SADAM_Sample_L_var._parameters.restore_neutron = 1;
  _H521_SADAM_Sample_L_var._parameters.radius = 0;
  if("lambda limits=[1 10]" && strlen("lambda limits=[1 10]"))
    stracpy(_H521_SADAM_Sample_L_var._parameters.options, "lambda limits=[1 10]" ? "lambda limits=[1 10]" : "", 16384);
  else 
  _H521_SADAM_Sample_L_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Sample_L_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Sample_L_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Sample_L_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Sample_L_var._parameters.geometry[0]='\0';
  _H521_SADAM_Sample_L_var._parameters.nowritefile = 0;
  _H521_SADAM_Sample_L_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Sample_L_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Sample_L_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Sample_L_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Sample_L_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Sample_L_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Sample_L_var._parameters.username3[0]='\0';


  /* component H521_SADAM_Sample_L=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_SADAM_Monochromator_Out_var._rotation_absolute, _H521_SADAM_Sample_L_var._rotation_absolute);
    rot_transpose(_H521_SADAM_Sample_XY_var._rotation_absolute, tr1);
    rot_mul(_H521_SADAM_Sample_L_var._rotation_absolute, tr1, _H521_SADAM_Sample_L_var._rotation_relative);
    _H521_SADAM_Sample_L_var._rotation_is_identity =  rot_test_identity(_H521_SADAM_Sample_L_var._rotation_relative);
    tc1 = coords_set(
      0, 0, SADAM_L);
    rot_transpose(_H521_SADAM_Monochromator_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_SADAM_Sample_L_var._position_absolute = coords_add(_H521_SADAM_Monochromator_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_SADAM_Sample_XY_var._position_absolute, _H521_SADAM_Sample_L_var._position_absolute);
    _H521_SADAM_Sample_L_var._position_relative = rot_apply(_H521_SADAM_Sample_L_var._rotation_absolute, tc1);
  } /* H521_SADAM_Sample_L=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H521_SADAM_Sample_L", _H521_SADAM_Sample_L_var._position_absolute, _H521_SADAM_Sample_L_var._rotation_absolute);
  instrument->_position_absolute[134] = _H521_SADAM_Sample_L_var._position_absolute;
  instrument->_position_relative[134] = _H521_SADAM_Sample_L_var._position_relative;
    _H521_SADAM_Sample_L_var._position_relative_is_zero =  coords_test_zero(_H521_SADAM_Sample_L_var._position_relative);
  instrument->counter_N[134]  = instrument->counter_P[134] = instrument->counter_P2[134] = 0;
  instrument->counter_AbsorbProp[134]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0133_H521_SADAM_Sample_L", _H521_SADAM_Sample_L_var._position_absolute, _H521_SADAM_Sample_L_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "xwidth", "0", "0.1","MCNUM");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "yheight", "0", "0.1","MCNUM");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "options", "NULL", "lambda limits=[1 10]", "char*");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0133_H521_SADAM_Sample_L", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_SADAM_Sample_L_setpos */

/* component H521_SADAM_Sample=Isotropic_Sqw() SETTING, POSITION/ROTATION */
int _H521_SADAM_Sample_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_SADAM_Sample_setpos] component H521_SADAM_Sample=Isotropic_Sqw() SETTING [Isotropic_Sqw:0]");
  stracpy(_H521_SADAM_Sample_var._name, "H521_SADAM_Sample", 16384);
  stracpy(_H521_SADAM_Sample_var._type, "Isotropic_Sqw", 16384);
  _H521_SADAM_Sample_var._index=135;
  int current_setpos_index = 135;
  _H521_SADAM_Sample_var._parameters.powder_format[0] = 0;
  _H521_SADAM_Sample_var._parameters.powder_format[1] = 0;
  _H521_SADAM_Sample_var._parameters.powder_format[2] = 0;
  _H521_SADAM_Sample_var._parameters.powder_format[3] = 0;
  _H521_SADAM_Sample_var._parameters.powder_format[4] = 0;
  _H521_SADAM_Sample_var._parameters.powder_format[5] = 0;
  _H521_SADAM_Sample_var._parameters.powder_format[6] = 0;
  _H521_SADAM_Sample_var._parameters.powder_format[7] = 0;
  _H521_SADAM_Sample_var._parameters.powder_format[8] = 0;
  if(_instrument_var._parameters.SADAM_sample && strlen(_instrument_var._parameters.SADAM_sample))
    stracpy(_H521_SADAM_Sample_var._parameters.Sqw_coh, _instrument_var._parameters.SADAM_sample ? _instrument_var._parameters.SADAM_sample : "", 16384);
  else 
  _H521_SADAM_Sample_var._parameters.Sqw_coh[0]='\0';
  _H521_SADAM_Sample_var._parameters.Sqw_inc[0]='\0';
  _H521_SADAM_Sample_var._parameters.geometry[0]='\0';
  _H521_SADAM_Sample_var._parameters.radius = 0.005;
  _H521_SADAM_Sample_var._parameters.thickness = 0;
  _H521_SADAM_Sample_var._parameters.xwidth = 0;
  _H521_SADAM_Sample_var._parameters.yheight = 0.05;
  _H521_SADAM_Sample_var._parameters.zdepth = 0;
  _H521_SADAM_Sample_var._parameters.threshold = 1e-20;
  _H521_SADAM_Sample_var._parameters.order = 0;
  _H521_SADAM_Sample_var._parameters.T = 0;
  _H521_SADAM_Sample_var._parameters.verbose = 1;
  _H521_SADAM_Sample_var._parameters.d_phi = 30;
  _H521_SADAM_Sample_var._parameters.concentric = 0;
  _H521_SADAM_Sample_var._parameters.rho = 0;
  _H521_SADAM_Sample_var._parameters.sigma_abs = 0;
  _H521_SADAM_Sample_var._parameters.sigma_coh = 0;
  _H521_SADAM_Sample_var._parameters.sigma_inc = 0;
  _H521_SADAM_Sample_var._parameters.classical = -1;
  _H521_SADAM_Sample_var._parameters.powder_Dd = 0;
  _H521_SADAM_Sample_var._parameters.powder_DW = 0;
  _H521_SADAM_Sample_var._parameters.powder_Vc = 0;
  _H521_SADAM_Sample_var._parameters.density = 0;
  _H521_SADAM_Sample_var._parameters.weight = 0;
  _H521_SADAM_Sample_var._parameters.p_interact = -1;
  _H521_SADAM_Sample_var._parameters.norm = -1;
  _H521_SADAM_Sample_var._parameters.powder_barns = 1;
  if("Frommhold" && strlen("Frommhold"))
    stracpy(_H521_SADAM_Sample_var._parameters.quantum_correction, "Frommhold" ? "Frommhold" : "", 16384);
  else 
  _H521_SADAM_Sample_var._parameters.quantum_correction[0]='\0';


  /* component H521_SADAM_Sample=Isotropic_Sqw() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_SADAM_Monochromator_Out_var._rotation_absolute, _H521_SADAM_Sample_var._rotation_absolute);
    rot_transpose(_H521_SADAM_Sample_L_var._rotation_absolute, tr1);
    rot_mul(_H521_SADAM_Sample_var._rotation_absolute, tr1, _H521_SADAM_Sample_var._rotation_relative);
    _H521_SADAM_Sample_var._rotation_is_identity =  rot_test_identity(_H521_SADAM_Sample_var._rotation_relative);
    tc1 = coords_set(
      0, 0, SADAM_L);
    rot_transpose(_H521_SADAM_Monochromator_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_SADAM_Sample_var._position_absolute = coords_add(_H521_SADAM_Monochromator_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_SADAM_Sample_L_var._position_absolute, _H521_SADAM_Sample_var._position_absolute);
    _H521_SADAM_Sample_var._position_relative = rot_apply(_H521_SADAM_Sample_var._rotation_absolute, tc1);
  } /* H521_SADAM_Sample=Isotropic_Sqw() AT ROTATED */
  DEBUG_COMPONENT("H521_SADAM_Sample", _H521_SADAM_Sample_var._position_absolute, _H521_SADAM_Sample_var._rotation_absolute);
  instrument->_position_absolute[135] = _H521_SADAM_Sample_var._position_absolute;
  instrument->_position_relative[135] = _H521_SADAM_Sample_var._position_relative;
    _H521_SADAM_Sample_var._position_relative_is_zero =  coords_test_zero(_H521_SADAM_Sample_var._position_relative);
  instrument->counter_N[135]  = instrument->counter_P[135] = instrument->counter_P2[135] = 0;
  instrument->counter_AbsorbProp[135]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0134_H521_SADAM_Sample", _H521_SADAM_Sample_var._position_absolute, _H521_SADAM_Sample_var._rotation_absolute, "Isotropic_Sqw");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "powder_format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "Sqw_coh", 0, _instrument_var._parameters.SADAM_sample, "char*");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "Sqw_inc", 0, NULL, "char*");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "geometry", 0, 0, "char*");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "radius", "0", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "yheight", "0", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "threshold", "1e-20", "1e-20","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "order", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "T", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "verbose", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "d_phi", "0", "30","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "concentric", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "rho", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "sigma_coh", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "classical", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "powder_Dd", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "powder_DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "powder_Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "p_interact", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "norm", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "powder_barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0134_H521_SADAM_Sample", "quantum_correction", "Frommhold", "Frommhold", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_SADAM_Sample_setpos */

/* component H521_SADAM_Detector=Monitor_nD() SETTING, POSITION/ROTATION */
int _H521_SADAM_Detector_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_SADAM_Detector_setpos] component H521_SADAM_Detector=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H521_SADAM_Detector_var._name, "H521_SADAM_Detector", 16384);
  stracpy(_H521_SADAM_Detector_var._type, "Monitor_nD", 16384);
  _H521_SADAM_Detector_var._index=136;
  int current_setpos_index = 136;
  if("" && strlen(""))
    stracpy(_H521_SADAM_Detector_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H521_SADAM_Detector_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_SADAM_Detector_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H521_SADAM_Detector_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_SADAM_Detector_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H521_SADAM_Detector_var._parameters.user3[0]='\0';
  _H521_SADAM_Detector_var._parameters.xwidth = 0.32;
  _H521_SADAM_Detector_var._parameters.yheight = 0.32;
  _H521_SADAM_Detector_var._parameters.zdepth = 0;
  _H521_SADAM_Detector_var._parameters.xmin = 0;
  _H521_SADAM_Detector_var._parameters.xmax = 0;
  _H521_SADAM_Detector_var._parameters.ymin = 0;
  _H521_SADAM_Detector_var._parameters.ymax = 0;
  _H521_SADAM_Detector_var._parameters.zmin = 0;
  _H521_SADAM_Detector_var._parameters.zmax = 0;
  _H521_SADAM_Detector_var._parameters.bins = 50;
  _H521_SADAM_Detector_var._parameters.min = -1e40;
  _H521_SADAM_Detector_var._parameters.max = 1e40;
  _H521_SADAM_Detector_var._parameters.restore_neutron = 1;
  _H521_SADAM_Detector_var._parameters.radius = 0;
  if("x y" && strlen("x y"))
    stracpy(_H521_SADAM_Detector_var._parameters.options, "x y" ? "x y" : "", 16384);
  else 
  _H521_SADAM_Detector_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Detector_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Detector_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Detector_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Detector_var._parameters.geometry[0]='\0';
  _H521_SADAM_Detector_var._parameters.nowritefile = 0;
  _H521_SADAM_Detector_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Detector_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Detector_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Detector_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Detector_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Detector_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Detector_var._parameters.username3[0]='\0';


  /* component H521_SADAM_Detector=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_SADAM_Sample_var._rotation_absolute, _H521_SADAM_Detector_var._rotation_absolute);
    rot_transpose(_H521_SADAM_Sample_var._rotation_absolute, tr1);
    rot_mul(_H521_SADAM_Detector_var._rotation_absolute, tr1, _H521_SADAM_Detector_var._rotation_relative);
    _H521_SADAM_Detector_var._rotation_is_identity =  rot_test_identity(_H521_SADAM_Detector_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 1.1);
    rot_transpose(_H521_SADAM_Sample_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_SADAM_Detector_var._position_absolute = coords_add(_H521_SADAM_Sample_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_SADAM_Sample_var._position_absolute, _H521_SADAM_Detector_var._position_absolute);
    _H521_SADAM_Detector_var._position_relative = rot_apply(_H521_SADAM_Detector_var._rotation_absolute, tc1);
  } /* H521_SADAM_Detector=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H521_SADAM_Detector", _H521_SADAM_Detector_var._position_absolute, _H521_SADAM_Detector_var._rotation_absolute);
  instrument->_position_absolute[136] = _H521_SADAM_Detector_var._position_absolute;
  instrument->_position_relative[136] = _H521_SADAM_Detector_var._position_relative;
    _H521_SADAM_Detector_var._position_relative_is_zero =  coords_test_zero(_H521_SADAM_Detector_var._position_relative);
  instrument->counter_N[136]  = instrument->counter_P[136] = instrument->counter_P2[136] = 0;
  instrument->counter_AbsorbProp[136]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0135_H521_SADAM_Detector", _H521_SADAM_Detector_var._position_absolute, _H521_SADAM_Detector_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "xwidth", "0", "0.32","MCNUM");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "yheight", "0", "0.32","MCNUM");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "options", "NULL", "x y", "char*");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0135_H521_SADAM_Detector", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_SADAM_Detector_setpos */

/* component H521_SADAM_Spectrometer=Monitor_nD() SETTING, POSITION/ROTATION */
int _H521_SADAM_Spectrometer_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_SADAM_Spectrometer_setpos] component H521_SADAM_Spectrometer=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H521_SADAM_Spectrometer_var._name, "H521_SADAM_Spectrometer", 16384);
  stracpy(_H521_SADAM_Spectrometer_var._type, "Monitor_nD", 16384);
  _H521_SADAM_Spectrometer_var._index=137;
  int current_setpos_index = 137;
  if("" && strlen(""))
    stracpy(_H521_SADAM_Spectrometer_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H521_SADAM_Spectrometer_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_SADAM_Spectrometer_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H521_SADAM_Spectrometer_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_SADAM_Spectrometer_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H521_SADAM_Spectrometer_var._parameters.user3[0]='\0';
  _H521_SADAM_Spectrometer_var._parameters.xwidth = 0;
  _H521_SADAM_Spectrometer_var._parameters.yheight = 0.3;
  _H521_SADAM_Spectrometer_var._parameters.zdepth = 0;
  _H521_SADAM_Spectrometer_var._parameters.xmin = 0;
  _H521_SADAM_Spectrometer_var._parameters.xmax = 0;
  _H521_SADAM_Spectrometer_var._parameters.ymin = 0;
  _H521_SADAM_Spectrometer_var._parameters.ymax = 0;
  _H521_SADAM_Spectrometer_var._parameters.zmin = 0;
  _H521_SADAM_Spectrometer_var._parameters.zmax = 0;
  _H521_SADAM_Spectrometer_var._parameters.bins = 0;
  _H521_SADAM_Spectrometer_var._parameters.min = -1e40;
  _H521_SADAM_Spectrometer_var._parameters.max = 1e40;
  _H521_SADAM_Spectrometer_var._parameters.restore_neutron = 1;
  _H521_SADAM_Spectrometer_var._parameters.radius = 0.5;
  if("angle limits=[-150 150] bins=50, energy limits=[0 30], banana" && strlen("angle limits=[-150 150] bins=50, energy limits=[0 30], banana"))
    stracpy(_H521_SADAM_Spectrometer_var._parameters.options, "angle limits=[-150 150] bins=50, energy limits=[0 30], banana" ? "angle limits=[-150 150] bins=50, energy limits=[0 30], banana" : "", 16384);
  else 
  _H521_SADAM_Spectrometer_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Spectrometer_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Spectrometer_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Spectrometer_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Spectrometer_var._parameters.geometry[0]='\0';
  _H521_SADAM_Spectrometer_var._parameters.nowritefile = 0;
  _H521_SADAM_Spectrometer_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Spectrometer_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Spectrometer_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Spectrometer_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Spectrometer_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Spectrometer_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Spectrometer_var._parameters.username3[0]='\0';


  /* component H521_SADAM_Spectrometer=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_SADAM_Sample_var._rotation_absolute, _H521_SADAM_Spectrometer_var._rotation_absolute);
    rot_transpose(_H521_SADAM_Detector_var._rotation_absolute, tr1);
    rot_mul(_H521_SADAM_Spectrometer_var._rotation_absolute, tr1, _H521_SADAM_Spectrometer_var._rotation_relative);
    _H521_SADAM_Spectrometer_var._rotation_is_identity =  rot_test_identity(_H521_SADAM_Spectrometer_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H521_SADAM_Sample_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_SADAM_Spectrometer_var._position_absolute = coords_add(_H521_SADAM_Sample_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_SADAM_Detector_var._position_absolute, _H521_SADAM_Spectrometer_var._position_absolute);
    _H521_SADAM_Spectrometer_var._position_relative = rot_apply(_H521_SADAM_Spectrometer_var._rotation_absolute, tc1);
  } /* H521_SADAM_Spectrometer=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H521_SADAM_Spectrometer", _H521_SADAM_Spectrometer_var._position_absolute, _H521_SADAM_Spectrometer_var._rotation_absolute);
  instrument->_position_absolute[137] = _H521_SADAM_Spectrometer_var._position_absolute;
  instrument->_position_relative[137] = _H521_SADAM_Spectrometer_var._position_relative;
    _H521_SADAM_Spectrometer_var._position_relative_is_zero =  coords_test_zero(_H521_SADAM_Spectrometer_var._position_relative);
  instrument->counter_N[137]  = instrument->counter_P[137] = instrument->counter_P2[137] = 0;
  instrument->counter_AbsorbProp[137]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", _H521_SADAM_Spectrometer_var._position_absolute, _H521_SADAM_Spectrometer_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "yheight", "0", "0.3","MCNUM");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "radius", "0", "0.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "options", "NULL", "angle limits=[-150 150] bins=50, energy limits=[0 30], banana", "char*");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0136_H521_SADAM_Spectrometer", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_SADAM_Spectrometer_setpos */

/* component H521_SADAM_Diffractometer=Monitor_nD() SETTING, POSITION/ROTATION */
int _H521_SADAM_Diffractometer_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_SADAM_Diffractometer_setpos] component H521_SADAM_Diffractometer=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H521_SADAM_Diffractometer_var._name, "H521_SADAM_Diffractometer", 16384);
  stracpy(_H521_SADAM_Diffractometer_var._type, "Monitor_nD", 16384);
  _H521_SADAM_Diffractometer_var._index=138;
  int current_setpos_index = 138;
  if("" && strlen(""))
    stracpy(_H521_SADAM_Diffractometer_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H521_SADAM_Diffractometer_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_SADAM_Diffractometer_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H521_SADAM_Diffractometer_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H521_SADAM_Diffractometer_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H521_SADAM_Diffractometer_var._parameters.user3[0]='\0';
  _H521_SADAM_Diffractometer_var._parameters.xwidth = 0;
  _H521_SADAM_Diffractometer_var._parameters.yheight = 0.3;
  _H521_SADAM_Diffractometer_var._parameters.zdepth = 0;
  _H521_SADAM_Diffractometer_var._parameters.xmin = 0;
  _H521_SADAM_Diffractometer_var._parameters.xmax = 0;
  _H521_SADAM_Diffractometer_var._parameters.ymin = 0;
  _H521_SADAM_Diffractometer_var._parameters.ymax = 0;
  _H521_SADAM_Diffractometer_var._parameters.zmin = 0;
  _H521_SADAM_Diffractometer_var._parameters.zmax = 0;
  _H521_SADAM_Diffractometer_var._parameters.bins = 0;
  _H521_SADAM_Diffractometer_var._parameters.min = -1e40;
  _H521_SADAM_Diffractometer_var._parameters.max = 1e40;
  _H521_SADAM_Diffractometer_var._parameters.restore_neutron = 0;
  _H521_SADAM_Diffractometer_var._parameters.radius = 1;
  if("theta bins=100 limits=[-150 150], y, banana" && strlen("theta bins=100 limits=[-150 150], y, banana"))
    stracpy(_H521_SADAM_Diffractometer_var._parameters.options, "theta bins=100 limits=[-150 150], y, banana" ? "theta bins=100 limits=[-150 150], y, banana" : "", 16384);
  else 
  _H521_SADAM_Diffractometer_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Diffractometer_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Diffractometer_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Diffractometer_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Diffractometer_var._parameters.geometry[0]='\0';
  _H521_SADAM_Diffractometer_var._parameters.nowritefile = 0;
  _H521_SADAM_Diffractometer_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Diffractometer_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Diffractometer_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Diffractometer_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Diffractometer_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H521_SADAM_Diffractometer_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H521_SADAM_Diffractometer_var._parameters.username3[0]='\0';


  /* component H521_SADAM_Diffractometer=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_SADAM_Sample_var._rotation_absolute, _H521_SADAM_Diffractometer_var._rotation_absolute);
    rot_transpose(_H521_SADAM_Spectrometer_var._rotation_absolute, tr1);
    rot_mul(_H521_SADAM_Diffractometer_var._rotation_absolute, tr1, _H521_SADAM_Diffractometer_var._rotation_relative);
    _H521_SADAM_Diffractometer_var._rotation_is_identity =  rot_test_identity(_H521_SADAM_Diffractometer_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H521_SADAM_Sample_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_SADAM_Diffractometer_var._position_absolute = coords_add(_H521_SADAM_Sample_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_SADAM_Spectrometer_var._position_absolute, _H521_SADAM_Diffractometer_var._position_absolute);
    _H521_SADAM_Diffractometer_var._position_relative = rot_apply(_H521_SADAM_Diffractometer_var._rotation_absolute, tc1);
  } /* H521_SADAM_Diffractometer=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H521_SADAM_Diffractometer", _H521_SADAM_Diffractometer_var._position_absolute, _H521_SADAM_Diffractometer_var._rotation_absolute);
  instrument->_position_absolute[138] = _H521_SADAM_Diffractometer_var._position_absolute;
  instrument->_position_relative[138] = _H521_SADAM_Diffractometer_var._position_relative;
    _H521_SADAM_Diffractometer_var._position_relative_is_zero =  coords_test_zero(_H521_SADAM_Diffractometer_var._position_relative);
  instrument->counter_N[138]  = instrument->counter_P[138] = instrument->counter_P2[138] = 0;
  instrument->counter_AbsorbProp[138]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", _H521_SADAM_Diffractometer_var._position_absolute, _H521_SADAM_Diffractometer_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "yheight", "0", "0.3","MCNUM");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "restore_neutron", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "radius", "0", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "options", "NULL", "theta bins=100 limits=[-150 150], y, banana", "char*");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0137_H521_SADAM_Diffractometer", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_SADAM_Diffractometer_setpos */

/* component H522_start=Arm() SETTING, POSITION/ROTATION */
int _H522_start_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_start_setpos] component H522_start=Arm() SETTING [Arm:0]");
  stracpy(_H522_start_var._name, "H522_start", 16384);
  stracpy(_H522_start_var._type, "Arm", 16384);
  _H522_start_var._index=139;
  int current_setpos_index = 139;
  /* component H522_start=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H522_origin_var._rotation_absolute, _H522_start_var._rotation_absolute);
    rot_transpose(_H521_SADAM_Diffractometer_var._rotation_absolute, tr1);
    rot_mul(_H522_start_var._rotation_absolute, tr1, _H522_start_var._rotation_relative);
    _H522_start_var._rotation_is_identity =  rot_test_identity(_H522_start_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H522_origin_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_start_var._position_absolute = coords_add(_H522_origin_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_SADAM_Diffractometer_var._position_absolute, _H522_start_var._position_absolute);
    _H522_start_var._position_relative = rot_apply(_H522_start_var._rotation_absolute, tc1);
  } /* H522_start=Arm() AT ROTATED */
  DEBUG_COMPONENT("H522_start", _H522_start_var._position_absolute, _H522_start_var._rotation_absolute);
  instrument->_position_absolute[139] = _H522_start_var._position_absolute;
  instrument->_position_relative[139] = _H522_start_var._position_relative;
    _H522_start_var._position_relative_is_zero =  coords_test_zero(_H522_start_var._position_relative);
  instrument->counter_N[139]  = instrument->counter_P[139] = instrument->counter_P2[139] = 0;
  instrument->counter_AbsorbProp[139]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0138_H522_start", _H522_start_var._position_absolute, _H522_start_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_start_setpos */

/* component H522_Curved=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_setpos] component H522_Curved=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_var._name, "H522_Curved", 16384);
  stracpy(_H522_Curved_var._type, "Guide_gravity", 16384);
  _H522_Curved_var._index=140;
  int current_setpos_index = 140;
  _H522_Curved_var._parameters.w1 = 0.12;
  _H522_Curved_var._parameters.h1 = 0.12;
  _H522_Curved_var._parameters.w2 = 0;
  _H522_Curved_var._parameters.h2 = 0;
  _H522_Curved_var._parameters.l = 35.0 / 35;
  _H522_Curved_var._parameters.R0 = gR0;
  _H522_Curved_var._parameters.Qc = gQc;
  _H522_Curved_var._parameters.alpha = gAlpha;
  _H522_Curved_var._parameters.m = 2;
  _H522_Curved_var._parameters.W = gW;
  _H522_Curved_var._parameters.nslit = 1;
  _H522_Curved_var._parameters.d = 0.0005;
  _H522_Curved_var._parameters.mleft = -1;
  _H522_Curved_var._parameters.mright = -1;
  _H522_Curved_var._parameters.mtop = -1;
  _H522_Curved_var._parameters.mbottom = -1;
  _H522_Curved_var._parameters.nhslit = 1;
  _H522_Curved_var._parameters.G = 0;
  _H522_Curved_var._parameters.aleft = -1;
  _H522_Curved_var._parameters.aright = -1;
  _H522_Curved_var._parameters.atop = -1;
  _H522_Curved_var._parameters.abottom = -1;
  _H522_Curved_var._parameters.wavy = 0;
  _H522_Curved_var._parameters.wavy_z = 0;
  _H522_Curved_var._parameters.wavy_tb = 0;
  _H522_Curved_var._parameters.wavy_lr = 0;
  _H522_Curved_var._parameters.chamfers = 0;
  _H522_Curved_var._parameters.chamfers_z = 0;
  _H522_Curved_var._parameters.chamfers_lr = 0;
  _H522_Curved_var._parameters.chamfers_tb = 0;
  _H522_Curved_var._parameters.nelements = 1;
  _H522_Curved_var._parameters.nu = 0;
  _H522_Curved_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_var._parameters.reflect[0]='\0';


  /* component H522_Curved=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_start_var._rotation_absolute, _H522_Curved_var._rotation_absolute);
    rot_transpose(_H522_start_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_var._rotation_absolute, tr1, _H522_Curved_var._rotation_relative);
    _H522_Curved_var._rotation_is_identity =  rot_test_identity(_H522_Curved_var._rotation_relative);
    tc1 = coords_set(
      0, 0, gGap);
    rot_transpose(_H522_start_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_var._position_absolute = coords_add(_H522_start_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_start_var._position_absolute, _H522_Curved_var._position_absolute);
    _H522_Curved_var._position_relative = rot_apply(_H522_Curved_var._rotation_absolute, tc1);
  } /* H522_Curved=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved", _H522_Curved_var._position_absolute, _H522_Curved_var._rotation_absolute);
  instrument->_position_absolute[140] = _H522_Curved_var._position_absolute;
  instrument->_position_relative[140] = _H522_Curved_var._position_relative;
    _H522_Curved_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_var._position_relative);
  instrument->counter_N[140]  = instrument->counter_P[140] = instrument->counter_P2[140] = 0;
  instrument->counter_AbsorbProp[140]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0139_H522_Curved", _H522_Curved_var._position_absolute, _H522_Curved_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0139_H522_Curved", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_setpos */

/* component H522_Curved_141=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_141_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_141_setpos] component H522_Curved_141=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_141_var._name, "H522_Curved_141", 16384);
  stracpy(_H522_Curved_141_var._type, "Guide_gravity", 16384);
  _H522_Curved_141_var._index=141;
  int current_setpos_index = 141;
  _H522_Curved_141_var._parameters.w1 = 0.12;
  _H522_Curved_141_var._parameters.h1 = 0.12;
  _H522_Curved_141_var._parameters.w2 = 0;
  _H522_Curved_141_var._parameters.h2 = 0;
  _H522_Curved_141_var._parameters.l = 35.0 / 35;
  _H522_Curved_141_var._parameters.R0 = gR0;
  _H522_Curved_141_var._parameters.Qc = gQc;
  _H522_Curved_141_var._parameters.alpha = gAlpha;
  _H522_Curved_141_var._parameters.m = 2;
  _H522_Curved_141_var._parameters.W = gW;
  _H522_Curved_141_var._parameters.nslit = 1;
  _H522_Curved_141_var._parameters.d = 0.0005;
  _H522_Curved_141_var._parameters.mleft = -1;
  _H522_Curved_141_var._parameters.mright = -1;
  _H522_Curved_141_var._parameters.mtop = -1;
  _H522_Curved_141_var._parameters.mbottom = -1;
  _H522_Curved_141_var._parameters.nhslit = 1;
  _H522_Curved_141_var._parameters.G = 0;
  _H522_Curved_141_var._parameters.aleft = -1;
  _H522_Curved_141_var._parameters.aright = -1;
  _H522_Curved_141_var._parameters.atop = -1;
  _H522_Curved_141_var._parameters.abottom = -1;
  _H522_Curved_141_var._parameters.wavy = 0;
  _H522_Curved_141_var._parameters.wavy_z = 0;
  _H522_Curved_141_var._parameters.wavy_tb = 0;
  _H522_Curved_141_var._parameters.wavy_lr = 0;
  _H522_Curved_141_var._parameters.chamfers = 0;
  _H522_Curved_141_var._parameters.chamfers_z = 0;
  _H522_Curved_141_var._parameters.chamfers_lr = 0;
  _H522_Curved_141_var._parameters.chamfers_tb = 0;
  _H522_Curved_141_var._parameters.nelements = 1;
  _H522_Curved_141_var._parameters.nu = 0;
  _H522_Curved_141_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_141_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_141_var._parameters.reflect[0]='\0';


  /* component H522_Curved_141=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_var._rotation_absolute, _H522_Curved_141_var._rotation_absolute);
    rot_transpose(_H522_Curved_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_141_var._rotation_absolute, tr1, _H522_Curved_141_var._rotation_relative);
    _H522_Curved_141_var._rotation_is_identity =  rot_test_identity(_H522_Curved_141_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved , l ) + gGap);
    rot_transpose(_H522_Curved_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_141_var._position_absolute = coords_add(_H522_Curved_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_var._position_absolute, _H522_Curved_141_var._position_absolute);
    _H522_Curved_141_var._position_relative = rot_apply(_H522_Curved_141_var._rotation_absolute, tc1);
  } /* H522_Curved_141=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_141", _H522_Curved_141_var._position_absolute, _H522_Curved_141_var._rotation_absolute);
  instrument->_position_absolute[141] = _H522_Curved_141_var._position_absolute;
  instrument->_position_relative[141] = _H522_Curved_141_var._position_relative;
    _H522_Curved_141_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_141_var._position_relative);
  instrument->counter_N[141]  = instrument->counter_P[141] = instrument->counter_P2[141] = 0;
  instrument->counter_AbsorbProp[141]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0140_H522_Curved_141", _H522_Curved_141_var._position_absolute, _H522_Curved_141_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0140_H522_Curved_141", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_141_setpos */

/* component H522_Curved_142=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_142_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_142_setpos] component H522_Curved_142=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_142_var._name, "H522_Curved_142", 16384);
  stracpy(_H522_Curved_142_var._type, "Guide_gravity", 16384);
  _H522_Curved_142_var._index=142;
  int current_setpos_index = 142;
  _H522_Curved_142_var._parameters.w1 = 0.12;
  _H522_Curved_142_var._parameters.h1 = 0.12;
  _H522_Curved_142_var._parameters.w2 = 0;
  _H522_Curved_142_var._parameters.h2 = 0;
  _H522_Curved_142_var._parameters.l = 35.0 / 35;
  _H522_Curved_142_var._parameters.R0 = gR0;
  _H522_Curved_142_var._parameters.Qc = gQc;
  _H522_Curved_142_var._parameters.alpha = gAlpha;
  _H522_Curved_142_var._parameters.m = 2;
  _H522_Curved_142_var._parameters.W = gW;
  _H522_Curved_142_var._parameters.nslit = 1;
  _H522_Curved_142_var._parameters.d = 0.0005;
  _H522_Curved_142_var._parameters.mleft = -1;
  _H522_Curved_142_var._parameters.mright = -1;
  _H522_Curved_142_var._parameters.mtop = -1;
  _H522_Curved_142_var._parameters.mbottom = -1;
  _H522_Curved_142_var._parameters.nhslit = 1;
  _H522_Curved_142_var._parameters.G = 0;
  _H522_Curved_142_var._parameters.aleft = -1;
  _H522_Curved_142_var._parameters.aright = -1;
  _H522_Curved_142_var._parameters.atop = -1;
  _H522_Curved_142_var._parameters.abottom = -1;
  _H522_Curved_142_var._parameters.wavy = 0;
  _H522_Curved_142_var._parameters.wavy_z = 0;
  _H522_Curved_142_var._parameters.wavy_tb = 0;
  _H522_Curved_142_var._parameters.wavy_lr = 0;
  _H522_Curved_142_var._parameters.chamfers = 0;
  _H522_Curved_142_var._parameters.chamfers_z = 0;
  _H522_Curved_142_var._parameters.chamfers_lr = 0;
  _H522_Curved_142_var._parameters.chamfers_tb = 0;
  _H522_Curved_142_var._parameters.nelements = 1;
  _H522_Curved_142_var._parameters.nu = 0;
  _H522_Curved_142_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_142_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_142_var._parameters.reflect[0]='\0';


  /* component H522_Curved_142=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_141_var._rotation_absolute, _H522_Curved_142_var._rotation_absolute);
    rot_transpose(_H522_Curved_141_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_142_var._rotation_absolute, tr1, _H522_Curved_142_var._rotation_relative);
    _H522_Curved_142_var._rotation_is_identity =  rot_test_identity(_H522_Curved_142_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_141 , l ) + gGap);
    rot_transpose(_H522_Curved_141_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_142_var._position_absolute = coords_add(_H522_Curved_141_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_141_var._position_absolute, _H522_Curved_142_var._position_absolute);
    _H522_Curved_142_var._position_relative = rot_apply(_H522_Curved_142_var._rotation_absolute, tc1);
  } /* H522_Curved_142=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_142", _H522_Curved_142_var._position_absolute, _H522_Curved_142_var._rotation_absolute);
  instrument->_position_absolute[142] = _H522_Curved_142_var._position_absolute;
  instrument->_position_relative[142] = _H522_Curved_142_var._position_relative;
    _H522_Curved_142_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_142_var._position_relative);
  instrument->counter_N[142]  = instrument->counter_P[142] = instrument->counter_P2[142] = 0;
  instrument->counter_AbsorbProp[142]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0141_H522_Curved_142", _H522_Curved_142_var._position_absolute, _H522_Curved_142_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0141_H522_Curved_142", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_142_setpos */

/* component H522_Curved_143=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_143_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_143_setpos] component H522_Curved_143=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_143_var._name, "H522_Curved_143", 16384);
  stracpy(_H522_Curved_143_var._type, "Guide_gravity", 16384);
  _H522_Curved_143_var._index=143;
  int current_setpos_index = 143;
  _H522_Curved_143_var._parameters.w1 = 0.12;
  _H522_Curved_143_var._parameters.h1 = 0.12;
  _H522_Curved_143_var._parameters.w2 = 0;
  _H522_Curved_143_var._parameters.h2 = 0;
  _H522_Curved_143_var._parameters.l = 35.0 / 35;
  _H522_Curved_143_var._parameters.R0 = gR0;
  _H522_Curved_143_var._parameters.Qc = gQc;
  _H522_Curved_143_var._parameters.alpha = gAlpha;
  _H522_Curved_143_var._parameters.m = 2;
  _H522_Curved_143_var._parameters.W = gW;
  _H522_Curved_143_var._parameters.nslit = 1;
  _H522_Curved_143_var._parameters.d = 0.0005;
  _H522_Curved_143_var._parameters.mleft = -1;
  _H522_Curved_143_var._parameters.mright = -1;
  _H522_Curved_143_var._parameters.mtop = -1;
  _H522_Curved_143_var._parameters.mbottom = -1;
  _H522_Curved_143_var._parameters.nhslit = 1;
  _H522_Curved_143_var._parameters.G = 0;
  _H522_Curved_143_var._parameters.aleft = -1;
  _H522_Curved_143_var._parameters.aright = -1;
  _H522_Curved_143_var._parameters.atop = -1;
  _H522_Curved_143_var._parameters.abottom = -1;
  _H522_Curved_143_var._parameters.wavy = 0;
  _H522_Curved_143_var._parameters.wavy_z = 0;
  _H522_Curved_143_var._parameters.wavy_tb = 0;
  _H522_Curved_143_var._parameters.wavy_lr = 0;
  _H522_Curved_143_var._parameters.chamfers = 0;
  _H522_Curved_143_var._parameters.chamfers_z = 0;
  _H522_Curved_143_var._parameters.chamfers_lr = 0;
  _H522_Curved_143_var._parameters.chamfers_tb = 0;
  _H522_Curved_143_var._parameters.nelements = 1;
  _H522_Curved_143_var._parameters.nu = 0;
  _H522_Curved_143_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_143_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_143_var._parameters.reflect[0]='\0';


  /* component H522_Curved_143=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_142_var._rotation_absolute, _H522_Curved_143_var._rotation_absolute);
    rot_transpose(_H522_Curved_142_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_143_var._rotation_absolute, tr1, _H522_Curved_143_var._rotation_relative);
    _H522_Curved_143_var._rotation_is_identity =  rot_test_identity(_H522_Curved_143_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_142 , l ) + gGap);
    rot_transpose(_H522_Curved_142_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_143_var._position_absolute = coords_add(_H522_Curved_142_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_142_var._position_absolute, _H522_Curved_143_var._position_absolute);
    _H522_Curved_143_var._position_relative = rot_apply(_H522_Curved_143_var._rotation_absolute, tc1);
  } /* H522_Curved_143=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_143", _H522_Curved_143_var._position_absolute, _H522_Curved_143_var._rotation_absolute);
  instrument->_position_absolute[143] = _H522_Curved_143_var._position_absolute;
  instrument->_position_relative[143] = _H522_Curved_143_var._position_relative;
    _H522_Curved_143_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_143_var._position_relative);
  instrument->counter_N[143]  = instrument->counter_P[143] = instrument->counter_P2[143] = 0;
  instrument->counter_AbsorbProp[143]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0142_H522_Curved_143", _H522_Curved_143_var._position_absolute, _H522_Curved_143_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0142_H522_Curved_143", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_143_setpos */

/* component H522_Curved_144=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_144_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_144_setpos] component H522_Curved_144=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_144_var._name, "H522_Curved_144", 16384);
  stracpy(_H522_Curved_144_var._type, "Guide_gravity", 16384);
  _H522_Curved_144_var._index=144;
  int current_setpos_index = 144;
  _H522_Curved_144_var._parameters.w1 = 0.12;
  _H522_Curved_144_var._parameters.h1 = 0.12;
  _H522_Curved_144_var._parameters.w2 = 0;
  _H522_Curved_144_var._parameters.h2 = 0;
  _H522_Curved_144_var._parameters.l = 35.0 / 35;
  _H522_Curved_144_var._parameters.R0 = gR0;
  _H522_Curved_144_var._parameters.Qc = gQc;
  _H522_Curved_144_var._parameters.alpha = gAlpha;
  _H522_Curved_144_var._parameters.m = 2;
  _H522_Curved_144_var._parameters.W = gW;
  _H522_Curved_144_var._parameters.nslit = 1;
  _H522_Curved_144_var._parameters.d = 0.0005;
  _H522_Curved_144_var._parameters.mleft = -1;
  _H522_Curved_144_var._parameters.mright = -1;
  _H522_Curved_144_var._parameters.mtop = -1;
  _H522_Curved_144_var._parameters.mbottom = -1;
  _H522_Curved_144_var._parameters.nhslit = 1;
  _H522_Curved_144_var._parameters.G = 0;
  _H522_Curved_144_var._parameters.aleft = -1;
  _H522_Curved_144_var._parameters.aright = -1;
  _H522_Curved_144_var._parameters.atop = -1;
  _H522_Curved_144_var._parameters.abottom = -1;
  _H522_Curved_144_var._parameters.wavy = 0;
  _H522_Curved_144_var._parameters.wavy_z = 0;
  _H522_Curved_144_var._parameters.wavy_tb = 0;
  _H522_Curved_144_var._parameters.wavy_lr = 0;
  _H522_Curved_144_var._parameters.chamfers = 0;
  _H522_Curved_144_var._parameters.chamfers_z = 0;
  _H522_Curved_144_var._parameters.chamfers_lr = 0;
  _H522_Curved_144_var._parameters.chamfers_tb = 0;
  _H522_Curved_144_var._parameters.nelements = 1;
  _H522_Curved_144_var._parameters.nu = 0;
  _H522_Curved_144_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_144_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_144_var._parameters.reflect[0]='\0';


  /* component H522_Curved_144=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_143_var._rotation_absolute, _H522_Curved_144_var._rotation_absolute);
    rot_transpose(_H522_Curved_143_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_144_var._rotation_absolute, tr1, _H522_Curved_144_var._rotation_relative);
    _H522_Curved_144_var._rotation_is_identity =  rot_test_identity(_H522_Curved_144_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_143 , l ) + gGap);
    rot_transpose(_H522_Curved_143_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_144_var._position_absolute = coords_add(_H522_Curved_143_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_143_var._position_absolute, _H522_Curved_144_var._position_absolute);
    _H522_Curved_144_var._position_relative = rot_apply(_H522_Curved_144_var._rotation_absolute, tc1);
  } /* H522_Curved_144=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_144", _H522_Curved_144_var._position_absolute, _H522_Curved_144_var._rotation_absolute);
  instrument->_position_absolute[144] = _H522_Curved_144_var._position_absolute;
  instrument->_position_relative[144] = _H522_Curved_144_var._position_relative;
    _H522_Curved_144_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_144_var._position_relative);
  instrument->counter_N[144]  = instrument->counter_P[144] = instrument->counter_P2[144] = 0;
  instrument->counter_AbsorbProp[144]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0143_H522_Curved_144", _H522_Curved_144_var._position_absolute, _H522_Curved_144_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0143_H522_Curved_144", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_144_setpos */

/* component H522_Curved_145=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_145_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_145_setpos] component H522_Curved_145=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_145_var._name, "H522_Curved_145", 16384);
  stracpy(_H522_Curved_145_var._type, "Guide_gravity", 16384);
  _H522_Curved_145_var._index=145;
  int current_setpos_index = 145;
  _H522_Curved_145_var._parameters.w1 = 0.12;
  _H522_Curved_145_var._parameters.h1 = 0.12;
  _H522_Curved_145_var._parameters.w2 = 0;
  _H522_Curved_145_var._parameters.h2 = 0;
  _H522_Curved_145_var._parameters.l = 35.0 / 35;
  _H522_Curved_145_var._parameters.R0 = gR0;
  _H522_Curved_145_var._parameters.Qc = gQc;
  _H522_Curved_145_var._parameters.alpha = gAlpha;
  _H522_Curved_145_var._parameters.m = 2;
  _H522_Curved_145_var._parameters.W = gW;
  _H522_Curved_145_var._parameters.nslit = 1;
  _H522_Curved_145_var._parameters.d = 0.0005;
  _H522_Curved_145_var._parameters.mleft = -1;
  _H522_Curved_145_var._parameters.mright = -1;
  _H522_Curved_145_var._parameters.mtop = -1;
  _H522_Curved_145_var._parameters.mbottom = -1;
  _H522_Curved_145_var._parameters.nhslit = 1;
  _H522_Curved_145_var._parameters.G = 0;
  _H522_Curved_145_var._parameters.aleft = -1;
  _H522_Curved_145_var._parameters.aright = -1;
  _H522_Curved_145_var._parameters.atop = -1;
  _H522_Curved_145_var._parameters.abottom = -1;
  _H522_Curved_145_var._parameters.wavy = 0;
  _H522_Curved_145_var._parameters.wavy_z = 0;
  _H522_Curved_145_var._parameters.wavy_tb = 0;
  _H522_Curved_145_var._parameters.wavy_lr = 0;
  _H522_Curved_145_var._parameters.chamfers = 0;
  _H522_Curved_145_var._parameters.chamfers_z = 0;
  _H522_Curved_145_var._parameters.chamfers_lr = 0;
  _H522_Curved_145_var._parameters.chamfers_tb = 0;
  _H522_Curved_145_var._parameters.nelements = 1;
  _H522_Curved_145_var._parameters.nu = 0;
  _H522_Curved_145_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_145_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_145_var._parameters.reflect[0]='\0';


  /* component H522_Curved_145=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_144_var._rotation_absolute, _H522_Curved_145_var._rotation_absolute);
    rot_transpose(_H522_Curved_144_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_145_var._rotation_absolute, tr1, _H522_Curved_145_var._rotation_relative);
    _H522_Curved_145_var._rotation_is_identity =  rot_test_identity(_H522_Curved_145_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_144 , l ) + gGap);
    rot_transpose(_H522_Curved_144_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_145_var._position_absolute = coords_add(_H522_Curved_144_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_144_var._position_absolute, _H522_Curved_145_var._position_absolute);
    _H522_Curved_145_var._position_relative = rot_apply(_H522_Curved_145_var._rotation_absolute, tc1);
  } /* H522_Curved_145=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_145", _H522_Curved_145_var._position_absolute, _H522_Curved_145_var._rotation_absolute);
  instrument->_position_absolute[145] = _H522_Curved_145_var._position_absolute;
  instrument->_position_relative[145] = _H522_Curved_145_var._position_relative;
    _H522_Curved_145_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_145_var._position_relative);
  instrument->counter_N[145]  = instrument->counter_P[145] = instrument->counter_P2[145] = 0;
  instrument->counter_AbsorbProp[145]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0144_H522_Curved_145", _H522_Curved_145_var._position_absolute, _H522_Curved_145_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0144_H522_Curved_145", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_145_setpos */

/* component H522_Curved_146=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_146_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_146_setpos] component H522_Curved_146=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_146_var._name, "H522_Curved_146", 16384);
  stracpy(_H522_Curved_146_var._type, "Guide_gravity", 16384);
  _H522_Curved_146_var._index=146;
  int current_setpos_index = 146;
  _H522_Curved_146_var._parameters.w1 = 0.12;
  _H522_Curved_146_var._parameters.h1 = 0.12;
  _H522_Curved_146_var._parameters.w2 = 0;
  _H522_Curved_146_var._parameters.h2 = 0;
  _H522_Curved_146_var._parameters.l = 35.0 / 35;
  _H522_Curved_146_var._parameters.R0 = gR0;
  _H522_Curved_146_var._parameters.Qc = gQc;
  _H522_Curved_146_var._parameters.alpha = gAlpha;
  _H522_Curved_146_var._parameters.m = 2;
  _H522_Curved_146_var._parameters.W = gW;
  _H522_Curved_146_var._parameters.nslit = 1;
  _H522_Curved_146_var._parameters.d = 0.0005;
  _H522_Curved_146_var._parameters.mleft = -1;
  _H522_Curved_146_var._parameters.mright = -1;
  _H522_Curved_146_var._parameters.mtop = -1;
  _H522_Curved_146_var._parameters.mbottom = -1;
  _H522_Curved_146_var._parameters.nhslit = 1;
  _H522_Curved_146_var._parameters.G = 0;
  _H522_Curved_146_var._parameters.aleft = -1;
  _H522_Curved_146_var._parameters.aright = -1;
  _H522_Curved_146_var._parameters.atop = -1;
  _H522_Curved_146_var._parameters.abottom = -1;
  _H522_Curved_146_var._parameters.wavy = 0;
  _H522_Curved_146_var._parameters.wavy_z = 0;
  _H522_Curved_146_var._parameters.wavy_tb = 0;
  _H522_Curved_146_var._parameters.wavy_lr = 0;
  _H522_Curved_146_var._parameters.chamfers = 0;
  _H522_Curved_146_var._parameters.chamfers_z = 0;
  _H522_Curved_146_var._parameters.chamfers_lr = 0;
  _H522_Curved_146_var._parameters.chamfers_tb = 0;
  _H522_Curved_146_var._parameters.nelements = 1;
  _H522_Curved_146_var._parameters.nu = 0;
  _H522_Curved_146_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_146_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_146_var._parameters.reflect[0]='\0';


  /* component H522_Curved_146=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_145_var._rotation_absolute, _H522_Curved_146_var._rotation_absolute);
    rot_transpose(_H522_Curved_145_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_146_var._rotation_absolute, tr1, _H522_Curved_146_var._rotation_relative);
    _H522_Curved_146_var._rotation_is_identity =  rot_test_identity(_H522_Curved_146_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_145 , l ) + gGap);
    rot_transpose(_H522_Curved_145_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_146_var._position_absolute = coords_add(_H522_Curved_145_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_145_var._position_absolute, _H522_Curved_146_var._position_absolute);
    _H522_Curved_146_var._position_relative = rot_apply(_H522_Curved_146_var._rotation_absolute, tc1);
  } /* H522_Curved_146=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_146", _H522_Curved_146_var._position_absolute, _H522_Curved_146_var._rotation_absolute);
  instrument->_position_absolute[146] = _H522_Curved_146_var._position_absolute;
  instrument->_position_relative[146] = _H522_Curved_146_var._position_relative;
    _H522_Curved_146_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_146_var._position_relative);
  instrument->counter_N[146]  = instrument->counter_P[146] = instrument->counter_P2[146] = 0;
  instrument->counter_AbsorbProp[146]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0145_H522_Curved_146", _H522_Curved_146_var._position_absolute, _H522_Curved_146_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0145_H522_Curved_146", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_146_setpos */

/* component H522_Curved_147=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_147_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_147_setpos] component H522_Curved_147=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_147_var._name, "H522_Curved_147", 16384);
  stracpy(_H522_Curved_147_var._type, "Guide_gravity", 16384);
  _H522_Curved_147_var._index=147;
  int current_setpos_index = 147;
  _H522_Curved_147_var._parameters.w1 = 0.12;
  _H522_Curved_147_var._parameters.h1 = 0.12;
  _H522_Curved_147_var._parameters.w2 = 0;
  _H522_Curved_147_var._parameters.h2 = 0;
  _H522_Curved_147_var._parameters.l = 35.0 / 35;
  _H522_Curved_147_var._parameters.R0 = gR0;
  _H522_Curved_147_var._parameters.Qc = gQc;
  _H522_Curved_147_var._parameters.alpha = gAlpha;
  _H522_Curved_147_var._parameters.m = 2;
  _H522_Curved_147_var._parameters.W = gW;
  _H522_Curved_147_var._parameters.nslit = 1;
  _H522_Curved_147_var._parameters.d = 0.0005;
  _H522_Curved_147_var._parameters.mleft = -1;
  _H522_Curved_147_var._parameters.mright = -1;
  _H522_Curved_147_var._parameters.mtop = -1;
  _H522_Curved_147_var._parameters.mbottom = -1;
  _H522_Curved_147_var._parameters.nhslit = 1;
  _H522_Curved_147_var._parameters.G = 0;
  _H522_Curved_147_var._parameters.aleft = -1;
  _H522_Curved_147_var._parameters.aright = -1;
  _H522_Curved_147_var._parameters.atop = -1;
  _H522_Curved_147_var._parameters.abottom = -1;
  _H522_Curved_147_var._parameters.wavy = 0;
  _H522_Curved_147_var._parameters.wavy_z = 0;
  _H522_Curved_147_var._parameters.wavy_tb = 0;
  _H522_Curved_147_var._parameters.wavy_lr = 0;
  _H522_Curved_147_var._parameters.chamfers = 0;
  _H522_Curved_147_var._parameters.chamfers_z = 0;
  _H522_Curved_147_var._parameters.chamfers_lr = 0;
  _H522_Curved_147_var._parameters.chamfers_tb = 0;
  _H522_Curved_147_var._parameters.nelements = 1;
  _H522_Curved_147_var._parameters.nu = 0;
  _H522_Curved_147_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_147_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_147_var._parameters.reflect[0]='\0';


  /* component H522_Curved_147=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_146_var._rotation_absolute, _H522_Curved_147_var._rotation_absolute);
    rot_transpose(_H522_Curved_146_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_147_var._rotation_absolute, tr1, _H522_Curved_147_var._rotation_relative);
    _H522_Curved_147_var._rotation_is_identity =  rot_test_identity(_H522_Curved_147_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_146 , l ) + gGap);
    rot_transpose(_H522_Curved_146_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_147_var._position_absolute = coords_add(_H522_Curved_146_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_146_var._position_absolute, _H522_Curved_147_var._position_absolute);
    _H522_Curved_147_var._position_relative = rot_apply(_H522_Curved_147_var._rotation_absolute, tc1);
  } /* H522_Curved_147=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_147", _H522_Curved_147_var._position_absolute, _H522_Curved_147_var._rotation_absolute);
  instrument->_position_absolute[147] = _H522_Curved_147_var._position_absolute;
  instrument->_position_relative[147] = _H522_Curved_147_var._position_relative;
    _H522_Curved_147_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_147_var._position_relative);
  instrument->counter_N[147]  = instrument->counter_P[147] = instrument->counter_P2[147] = 0;
  instrument->counter_AbsorbProp[147]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0146_H522_Curved_147", _H522_Curved_147_var._position_absolute, _H522_Curved_147_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0146_H522_Curved_147", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_147_setpos */

/* component H522_Curved_148=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_148_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_148_setpos] component H522_Curved_148=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_148_var._name, "H522_Curved_148", 16384);
  stracpy(_H522_Curved_148_var._type, "Guide_gravity", 16384);
  _H522_Curved_148_var._index=148;
  int current_setpos_index = 148;
  _H522_Curved_148_var._parameters.w1 = 0.12;
  _H522_Curved_148_var._parameters.h1 = 0.12;
  _H522_Curved_148_var._parameters.w2 = 0;
  _H522_Curved_148_var._parameters.h2 = 0;
  _H522_Curved_148_var._parameters.l = 35.0 / 35;
  _H522_Curved_148_var._parameters.R0 = gR0;
  _H522_Curved_148_var._parameters.Qc = gQc;
  _H522_Curved_148_var._parameters.alpha = gAlpha;
  _H522_Curved_148_var._parameters.m = 2;
  _H522_Curved_148_var._parameters.W = gW;
  _H522_Curved_148_var._parameters.nslit = 1;
  _H522_Curved_148_var._parameters.d = 0.0005;
  _H522_Curved_148_var._parameters.mleft = -1;
  _H522_Curved_148_var._parameters.mright = -1;
  _H522_Curved_148_var._parameters.mtop = -1;
  _H522_Curved_148_var._parameters.mbottom = -1;
  _H522_Curved_148_var._parameters.nhslit = 1;
  _H522_Curved_148_var._parameters.G = 0;
  _H522_Curved_148_var._parameters.aleft = -1;
  _H522_Curved_148_var._parameters.aright = -1;
  _H522_Curved_148_var._parameters.atop = -1;
  _H522_Curved_148_var._parameters.abottom = -1;
  _H522_Curved_148_var._parameters.wavy = 0;
  _H522_Curved_148_var._parameters.wavy_z = 0;
  _H522_Curved_148_var._parameters.wavy_tb = 0;
  _H522_Curved_148_var._parameters.wavy_lr = 0;
  _H522_Curved_148_var._parameters.chamfers = 0;
  _H522_Curved_148_var._parameters.chamfers_z = 0;
  _H522_Curved_148_var._parameters.chamfers_lr = 0;
  _H522_Curved_148_var._parameters.chamfers_tb = 0;
  _H522_Curved_148_var._parameters.nelements = 1;
  _H522_Curved_148_var._parameters.nu = 0;
  _H522_Curved_148_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_148_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_148_var._parameters.reflect[0]='\0';


  /* component H522_Curved_148=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_147_var._rotation_absolute, _H522_Curved_148_var._rotation_absolute);
    rot_transpose(_H522_Curved_147_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_148_var._rotation_absolute, tr1, _H522_Curved_148_var._rotation_relative);
    _H522_Curved_148_var._rotation_is_identity =  rot_test_identity(_H522_Curved_148_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_147 , l ) + gGap);
    rot_transpose(_H522_Curved_147_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_148_var._position_absolute = coords_add(_H522_Curved_147_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_147_var._position_absolute, _H522_Curved_148_var._position_absolute);
    _H522_Curved_148_var._position_relative = rot_apply(_H522_Curved_148_var._rotation_absolute, tc1);
  } /* H522_Curved_148=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_148", _H522_Curved_148_var._position_absolute, _H522_Curved_148_var._rotation_absolute);
  instrument->_position_absolute[148] = _H522_Curved_148_var._position_absolute;
  instrument->_position_relative[148] = _H522_Curved_148_var._position_relative;
    _H522_Curved_148_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_148_var._position_relative);
  instrument->counter_N[148]  = instrument->counter_P[148] = instrument->counter_P2[148] = 0;
  instrument->counter_AbsorbProp[148]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0147_H522_Curved_148", _H522_Curved_148_var._position_absolute, _H522_Curved_148_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0147_H522_Curved_148", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_148_setpos */

/* component H522_Curved_149=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_149_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_149_setpos] component H522_Curved_149=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_149_var._name, "H522_Curved_149", 16384);
  stracpy(_H522_Curved_149_var._type, "Guide_gravity", 16384);
  _H522_Curved_149_var._index=149;
  int current_setpos_index = 149;
  _H522_Curved_149_var._parameters.w1 = 0.12;
  _H522_Curved_149_var._parameters.h1 = 0.12;
  _H522_Curved_149_var._parameters.w2 = 0;
  _H522_Curved_149_var._parameters.h2 = 0;
  _H522_Curved_149_var._parameters.l = 35.0 / 35;
  _H522_Curved_149_var._parameters.R0 = gR0;
  _H522_Curved_149_var._parameters.Qc = gQc;
  _H522_Curved_149_var._parameters.alpha = gAlpha;
  _H522_Curved_149_var._parameters.m = 2;
  _H522_Curved_149_var._parameters.W = gW;
  _H522_Curved_149_var._parameters.nslit = 1;
  _H522_Curved_149_var._parameters.d = 0.0005;
  _H522_Curved_149_var._parameters.mleft = -1;
  _H522_Curved_149_var._parameters.mright = -1;
  _H522_Curved_149_var._parameters.mtop = -1;
  _H522_Curved_149_var._parameters.mbottom = -1;
  _H522_Curved_149_var._parameters.nhslit = 1;
  _H522_Curved_149_var._parameters.G = 0;
  _H522_Curved_149_var._parameters.aleft = -1;
  _H522_Curved_149_var._parameters.aright = -1;
  _H522_Curved_149_var._parameters.atop = -1;
  _H522_Curved_149_var._parameters.abottom = -1;
  _H522_Curved_149_var._parameters.wavy = 0;
  _H522_Curved_149_var._parameters.wavy_z = 0;
  _H522_Curved_149_var._parameters.wavy_tb = 0;
  _H522_Curved_149_var._parameters.wavy_lr = 0;
  _H522_Curved_149_var._parameters.chamfers = 0;
  _H522_Curved_149_var._parameters.chamfers_z = 0;
  _H522_Curved_149_var._parameters.chamfers_lr = 0;
  _H522_Curved_149_var._parameters.chamfers_tb = 0;
  _H522_Curved_149_var._parameters.nelements = 1;
  _H522_Curved_149_var._parameters.nu = 0;
  _H522_Curved_149_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_149_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_149_var._parameters.reflect[0]='\0';


  /* component H522_Curved_149=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_148_var._rotation_absolute, _H522_Curved_149_var._rotation_absolute);
    rot_transpose(_H522_Curved_148_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_149_var._rotation_absolute, tr1, _H522_Curved_149_var._rotation_relative);
    _H522_Curved_149_var._rotation_is_identity =  rot_test_identity(_H522_Curved_149_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_148 , l ) + gGap);
    rot_transpose(_H522_Curved_148_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_149_var._position_absolute = coords_add(_H522_Curved_148_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_148_var._position_absolute, _H522_Curved_149_var._position_absolute);
    _H522_Curved_149_var._position_relative = rot_apply(_H522_Curved_149_var._rotation_absolute, tc1);
  } /* H522_Curved_149=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_149", _H522_Curved_149_var._position_absolute, _H522_Curved_149_var._rotation_absolute);
  instrument->_position_absolute[149] = _H522_Curved_149_var._position_absolute;
  instrument->_position_relative[149] = _H522_Curved_149_var._position_relative;
    _H522_Curved_149_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_149_var._position_relative);
  instrument->counter_N[149]  = instrument->counter_P[149] = instrument->counter_P2[149] = 0;
  instrument->counter_AbsorbProp[149]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0148_H522_Curved_149", _H522_Curved_149_var._position_absolute, _H522_Curved_149_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0148_H522_Curved_149", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_149_setpos */

/* component HCS_Al_150=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_150_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_150_setpos] component HCS_Al_150=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_150_var._name, "HCS_Al_150", 16384);
  stracpy(_HCS_Al_150_var._type, "PowderN", 16384);
  _HCS_Al_150_var._index=150;
  int current_setpos_index = 150;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_150_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_150_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_150_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_150_var._parameters.geometry[0]='\0';
  _HCS_Al_150_var._parameters.format[0] = 0;
  _HCS_Al_150_var._parameters.format[1] = 0;
  _HCS_Al_150_var._parameters.format[2] = 0;
  _HCS_Al_150_var._parameters.format[3] = 0;
  _HCS_Al_150_var._parameters.format[4] = 0;
  _HCS_Al_150_var._parameters.format[5] = 0;
  _HCS_Al_150_var._parameters.format[6] = 0;
  _HCS_Al_150_var._parameters.format[7] = 0;
  _HCS_Al_150_var._parameters.format[8] = 0;
  _HCS_Al_150_var._parameters.radius = 0;
  _HCS_Al_150_var._parameters.yheight = 0.12;
  _HCS_Al_150_var._parameters.xwidth = 0.12;
  _HCS_Al_150_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_150_var._parameters.thickness = 0;
  _HCS_Al_150_var._parameters.pack = 1;
  _HCS_Al_150_var._parameters.Vc = 0;
  _HCS_Al_150_var._parameters.sigma_abs = 0;
  _HCS_Al_150_var._parameters.sigma_inc = 0;
  _HCS_Al_150_var._parameters.delta_d_d = 0;
  _HCS_Al_150_var._parameters.p_inc = 0.005;
  _HCS_Al_150_var._parameters.p_transmit = 0.9450;
  _HCS_Al_150_var._parameters.DW = 0;
  _HCS_Al_150_var._parameters.nb_atoms = 1;
  _HCS_Al_150_var._parameters.d_omega = 0;
  _HCS_Al_150_var._parameters.d_phi = 10;
  _HCS_Al_150_var._parameters.tth_sign = 0;
  _HCS_Al_150_var._parameters.p_interact = 0.05;
  _HCS_Al_150_var._parameters.concentric = 0;
  _HCS_Al_150_var._parameters.density = 0;
  _HCS_Al_150_var._parameters.weight = 0;
  _HCS_Al_150_var._parameters.barns = 1;
  _HCS_Al_150_var._parameters.Strain = 0;
  _HCS_Al_150_var._parameters.focus_flip = 0;
  _HCS_Al_150_var._parameters.target_index = 0;
  _HCS_Al_150_var._parameters.order = 1;


  /* component HCS_Al_150=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_149_var._rotation_absolute, _HCS_Al_150_var._rotation_absolute);
    rot_transpose(_H522_Curved_149_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_150_var._rotation_absolute, tr1, _HCS_Al_150_var._rotation_relative);
    _HCS_Al_150_var._rotation_is_identity =  rot_test_identity(_HCS_Al_150_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_149 , l ) + gGap + 0.001);
    rot_transpose(_H522_Curved_149_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_150_var._position_absolute = coords_add(_H522_Curved_149_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_149_var._position_absolute, _HCS_Al_150_var._position_absolute);
    _HCS_Al_150_var._position_relative = rot_apply(_HCS_Al_150_var._rotation_absolute, tc1);
  } /* HCS_Al_150=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_150", _HCS_Al_150_var._position_absolute, _HCS_Al_150_var._rotation_absolute);
  instrument->_position_absolute[150] = _HCS_Al_150_var._position_absolute;
  instrument->_position_relative[150] = _HCS_Al_150_var._position_relative;
    _HCS_Al_150_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_150_var._position_relative);
  instrument->counter_N[150]  = instrument->counter_P[150] = instrument->counter_P2[150] = 0;
  instrument->counter_AbsorbProp[150]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0149_HCS_Al_150", _HCS_Al_150_var._position_absolute, _HCS_Al_150_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "xwidth", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0149_HCS_Al_150", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_150_setpos */

/* component H522_VTE=Monitor_nD() SETTING, POSITION/ROTATION */
int _H522_VTE_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_VTE_setpos] component H522_VTE=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H522_VTE_var._name, "H522_VTE", 16384);
  stracpy(_H522_VTE_var._type, "Monitor_nD", 16384);
  _H522_VTE_var._index=151;
  int current_setpos_index = 151;
  if("" && strlen(""))
    stracpy(_H522_VTE_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H522_VTE_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_VTE_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H522_VTE_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_VTE_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H522_VTE_var._parameters.user3[0]='\0';
  _H522_VTE_var._parameters.xwidth = 0.12;
  _H522_VTE_var._parameters.yheight = 0.12;
  _H522_VTE_var._parameters.zdepth = 0;
  _H522_VTE_var._parameters.xmin = 0;
  _H522_VTE_var._parameters.xmax = 0;
  _H522_VTE_var._parameters.ymin = 0;
  _H522_VTE_var._parameters.ymax = 0;
  _H522_VTE_var._parameters.zmin = 0;
  _H522_VTE_var._parameters.zmax = 0;
  _H522_VTE_var._parameters.bins = 50;
  _H522_VTE_var._parameters.min = -1e40;
  _H522_VTE_var._parameters.max = 1e40;
  _H522_VTE_var._parameters.restore_neutron = 1;
  _H522_VTE_var._parameters.radius = 0;
  if("x y, slit" && strlen("x y, slit"))
    stracpy(_H522_VTE_var._parameters.options, "x y, slit" ? "x y, slit" : "", 16384);
  else 
  _H522_VTE_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_VTE_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_VTE_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_VTE_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_VTE_var._parameters.geometry[0]='\0';
  _H522_VTE_var._parameters.nowritefile = 0;
  _H522_VTE_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_VTE_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_VTE_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_VTE_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_VTE_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_VTE_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_VTE_var._parameters.username3[0]='\0';


  /* component H522_VTE=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_150_var._rotation_absolute, _H522_VTE_var._rotation_absolute);
    rot_transpose(_HCS_Al_150_var._rotation_absolute, tr1);
    rot_mul(_H522_VTE_var._rotation_absolute, tr1, _H522_VTE_var._rotation_relative);
    _H522_VTE_var._rotation_is_identity =  rot_test_identity(_H522_VTE_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.108 / 2 -0.001);
    rot_transpose(_HCS_Al_150_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_VTE_var._position_absolute = coords_add(_HCS_Al_150_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_150_var._position_absolute, _H522_VTE_var._position_absolute);
    _H522_VTE_var._position_relative = rot_apply(_H522_VTE_var._rotation_absolute, tc1);
  } /* H522_VTE=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H522_VTE", _H522_VTE_var._position_absolute, _H522_VTE_var._rotation_absolute);
  instrument->_position_absolute[151] = _H522_VTE_var._position_absolute;
  instrument->_position_relative[151] = _H522_VTE_var._position_relative;
    _H522_VTE_var._position_relative_is_zero =  coords_test_zero(_H522_VTE_var._position_relative);
  instrument->counter_N[151]  = instrument->counter_P[151] = instrument->counter_P2[151] = 0;
  instrument->counter_AbsorbProp[151]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0150_H522_VTE", _H522_VTE_var._position_absolute, _H522_VTE_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "xwidth", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "options", "NULL", "x y, slit", "char*");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0150_H522_VTE", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_VTE_setpos */

/* component HCS_Al_152=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_152_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_152_setpos] component HCS_Al_152=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_152_var._name, "HCS_Al_152", 16384);
  stracpy(_HCS_Al_152_var._type, "PowderN", 16384);
  _HCS_Al_152_var._index=152;
  int current_setpos_index = 152;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_152_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_152_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_152_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_152_var._parameters.geometry[0]='\0';
  _HCS_Al_152_var._parameters.format[0] = 0;
  _HCS_Al_152_var._parameters.format[1] = 0;
  _HCS_Al_152_var._parameters.format[2] = 0;
  _HCS_Al_152_var._parameters.format[3] = 0;
  _HCS_Al_152_var._parameters.format[4] = 0;
  _HCS_Al_152_var._parameters.format[5] = 0;
  _HCS_Al_152_var._parameters.format[6] = 0;
  _HCS_Al_152_var._parameters.format[7] = 0;
  _HCS_Al_152_var._parameters.format[8] = 0;
  _HCS_Al_152_var._parameters.radius = 0;
  _HCS_Al_152_var._parameters.yheight = 0.12;
  _HCS_Al_152_var._parameters.xwidth = 0.12;
  _HCS_Al_152_var._parameters.zdepth = 0.002;
  _HCS_Al_152_var._parameters.thickness = 0;
  _HCS_Al_152_var._parameters.pack = 1;
  _HCS_Al_152_var._parameters.Vc = 0;
  _HCS_Al_152_var._parameters.sigma_abs = 0;
  _HCS_Al_152_var._parameters.sigma_inc = 0;
  _HCS_Al_152_var._parameters.delta_d_d = 0;
  _HCS_Al_152_var._parameters.p_inc = 0.005;
  _HCS_Al_152_var._parameters.p_transmit = 0.9450;
  _HCS_Al_152_var._parameters.DW = 0;
  _HCS_Al_152_var._parameters.nb_atoms = 1;
  _HCS_Al_152_var._parameters.d_omega = 0;
  _HCS_Al_152_var._parameters.d_phi = 10;
  _HCS_Al_152_var._parameters.tth_sign = 0;
  _HCS_Al_152_var._parameters.p_interact = 0.05;
  _HCS_Al_152_var._parameters.concentric = 0;
  _HCS_Al_152_var._parameters.density = 0;
  _HCS_Al_152_var._parameters.weight = 0;
  _HCS_Al_152_var._parameters.barns = 1;
  _HCS_Al_152_var._parameters.Strain = 0;
  _HCS_Al_152_var._parameters.focus_flip = 0;
  _HCS_Al_152_var._parameters.target_index = 0;
  _HCS_Al_152_var._parameters.order = 1;


  /* component HCS_Al_152=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H522_VTE_var._rotation_absolute, _HCS_Al_152_var._rotation_absolute);
    rot_transpose(_H522_VTE_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_152_var._rotation_absolute, tr1, _HCS_Al_152_var._rotation_relative);
    _HCS_Al_152_var._rotation_is_identity =  rot_test_identity(_HCS_Al_152_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.108 / 2 -0.05);
    rot_transpose(_H522_VTE_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_152_var._position_absolute = coords_add(_H522_VTE_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_VTE_var._position_absolute, _HCS_Al_152_var._position_absolute);
    _HCS_Al_152_var._position_relative = rot_apply(_HCS_Al_152_var._rotation_absolute, tc1);
  } /* HCS_Al_152=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_152", _HCS_Al_152_var._position_absolute, _HCS_Al_152_var._rotation_absolute);
  instrument->_position_absolute[152] = _HCS_Al_152_var._position_absolute;
  instrument->_position_relative[152] = _HCS_Al_152_var._position_relative;
    _HCS_Al_152_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_152_var._position_relative);
  instrument->counter_N[152]  = instrument->counter_P[152] = instrument->counter_P2[152] = 0;
  instrument->counter_AbsorbProp[152]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0151_HCS_Al_152", _HCS_Al_152_var._position_absolute, _HCS_Al_152_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "xwidth", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "zdepth", "0", "0.002","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0151_HCS_Al_152", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_152_setpos */

/* component H523_Curved_153=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_153_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_153_setpos] component H523_Curved_153=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_153_var._name, "H523_Curved_153", 16384);
  stracpy(_H523_Curved_153_var._type, "Guide_gravity", 16384);
  _H523_Curved_153_var._index=153;
  int current_setpos_index = 153;
  _H523_Curved_153_var._parameters.w1 = 0.12;
  _H523_Curved_153_var._parameters.h1 = 0.12;
  _H523_Curved_153_var._parameters.w2 = 0;
  _H523_Curved_153_var._parameters.h2 = 0;
  _H523_Curved_153_var._parameters.l = 35.0 / 35;
  _H523_Curved_153_var._parameters.R0 = gR0;
  _H523_Curved_153_var._parameters.Qc = gQc;
  _H523_Curved_153_var._parameters.alpha = gAlpha;
  _H523_Curved_153_var._parameters.m = 2;
  _H523_Curved_153_var._parameters.W = gW;
  _H523_Curved_153_var._parameters.nslit = 1;
  _H523_Curved_153_var._parameters.d = 0.0005;
  _H523_Curved_153_var._parameters.mleft = -1;
  _H523_Curved_153_var._parameters.mright = -1;
  _H523_Curved_153_var._parameters.mtop = -1;
  _H523_Curved_153_var._parameters.mbottom = -1;
  _H523_Curved_153_var._parameters.nhslit = 1;
  _H523_Curved_153_var._parameters.G = 0;
  _H523_Curved_153_var._parameters.aleft = -1;
  _H523_Curved_153_var._parameters.aright = -1;
  _H523_Curved_153_var._parameters.atop = -1;
  _H523_Curved_153_var._parameters.abottom = -1;
  _H523_Curved_153_var._parameters.wavy = 0;
  _H523_Curved_153_var._parameters.wavy_z = 0;
  _H523_Curved_153_var._parameters.wavy_tb = 0;
  _H523_Curved_153_var._parameters.wavy_lr = 0;
  _H523_Curved_153_var._parameters.chamfers = 0;
  _H523_Curved_153_var._parameters.chamfers_z = 0;
  _H523_Curved_153_var._parameters.chamfers_lr = 0;
  _H523_Curved_153_var._parameters.chamfers_tb = 0;
  _H523_Curved_153_var._parameters.nelements = 1;
  _H523_Curved_153_var._parameters.nu = 0;
  _H523_Curved_153_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_153_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_153_var._parameters.reflect[0]='\0';


  /* component H523_Curved_153=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_152_var._rotation_absolute, _H523_Curved_153_var._rotation_absolute);
    rot_transpose(_HCS_Al_152_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_153_var._rotation_absolute, tr1, _H523_Curved_153_var._rotation_relative);
    _H523_Curved_153_var._rotation_is_identity =  rot_test_identity(_H523_Curved_153_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.003 + gGap);
    rot_transpose(_HCS_Al_152_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_153_var._position_absolute = coords_add(_HCS_Al_152_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_152_var._position_absolute, _H523_Curved_153_var._position_absolute);
    _H523_Curved_153_var._position_relative = rot_apply(_H523_Curved_153_var._rotation_absolute, tc1);
  } /* H523_Curved_153=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_153", _H523_Curved_153_var._position_absolute, _H523_Curved_153_var._rotation_absolute);
  instrument->_position_absolute[153] = _H523_Curved_153_var._position_absolute;
  instrument->_position_relative[153] = _H523_Curved_153_var._position_relative;
    _H523_Curved_153_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_153_var._position_relative);
  instrument->counter_N[153]  = instrument->counter_P[153] = instrument->counter_P2[153] = 0;
  instrument->counter_AbsorbProp[153]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0152_H523_Curved_153", _H523_Curved_153_var._position_absolute, _H523_Curved_153_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0152_H523_Curved_153", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_153_setpos */

/* component H523_Curved_154=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_154_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_154_setpos] component H523_Curved_154=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_154_var._name, "H523_Curved_154", 16384);
  stracpy(_H523_Curved_154_var._type, "Guide_gravity", 16384);
  _H523_Curved_154_var._index=154;
  int current_setpos_index = 154;
  _H523_Curved_154_var._parameters.w1 = 0.12;
  _H523_Curved_154_var._parameters.h1 = 0.12;
  _H523_Curved_154_var._parameters.w2 = 0;
  _H523_Curved_154_var._parameters.h2 = 0;
  _H523_Curved_154_var._parameters.l = 35.0 / 35;
  _H523_Curved_154_var._parameters.R0 = gR0;
  _H523_Curved_154_var._parameters.Qc = gQc;
  _H523_Curved_154_var._parameters.alpha = gAlpha;
  _H523_Curved_154_var._parameters.m = 2;
  _H523_Curved_154_var._parameters.W = gW;
  _H523_Curved_154_var._parameters.nslit = 1;
  _H523_Curved_154_var._parameters.d = 0.0005;
  _H523_Curved_154_var._parameters.mleft = -1;
  _H523_Curved_154_var._parameters.mright = -1;
  _H523_Curved_154_var._parameters.mtop = -1;
  _H523_Curved_154_var._parameters.mbottom = -1;
  _H523_Curved_154_var._parameters.nhslit = 1;
  _H523_Curved_154_var._parameters.G = 0;
  _H523_Curved_154_var._parameters.aleft = -1;
  _H523_Curved_154_var._parameters.aright = -1;
  _H523_Curved_154_var._parameters.atop = -1;
  _H523_Curved_154_var._parameters.abottom = -1;
  _H523_Curved_154_var._parameters.wavy = 0;
  _H523_Curved_154_var._parameters.wavy_z = 0;
  _H523_Curved_154_var._parameters.wavy_tb = 0;
  _H523_Curved_154_var._parameters.wavy_lr = 0;
  _H523_Curved_154_var._parameters.chamfers = 0;
  _H523_Curved_154_var._parameters.chamfers_z = 0;
  _H523_Curved_154_var._parameters.chamfers_lr = 0;
  _H523_Curved_154_var._parameters.chamfers_tb = 0;
  _H523_Curved_154_var._parameters.nelements = 1;
  _H523_Curved_154_var._parameters.nu = 0;
  _H523_Curved_154_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_154_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_154_var._parameters.reflect[0]='\0';


  /* component H523_Curved_154=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_153_var._rotation_absolute, _H523_Curved_154_var._rotation_absolute);
    rot_transpose(_H523_Curved_153_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_154_var._rotation_absolute, tr1, _H523_Curved_154_var._rotation_relative);
    _H523_Curved_154_var._rotation_is_identity =  rot_test_identity(_H523_Curved_154_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_153 , l ) + gGap);
    rot_transpose(_H523_Curved_153_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_154_var._position_absolute = coords_add(_H523_Curved_153_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_153_var._position_absolute, _H523_Curved_154_var._position_absolute);
    _H523_Curved_154_var._position_relative = rot_apply(_H523_Curved_154_var._rotation_absolute, tc1);
  } /* H523_Curved_154=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_154", _H523_Curved_154_var._position_absolute, _H523_Curved_154_var._rotation_absolute);
  instrument->_position_absolute[154] = _H523_Curved_154_var._position_absolute;
  instrument->_position_relative[154] = _H523_Curved_154_var._position_relative;
    _H523_Curved_154_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_154_var._position_relative);
  instrument->counter_N[154]  = instrument->counter_P[154] = instrument->counter_P2[154] = 0;
  instrument->counter_AbsorbProp[154]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0153_H523_Curved_154", _H523_Curved_154_var._position_absolute, _H523_Curved_154_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0153_H523_Curved_154", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_154_setpos */

/* component H523_Curved_155=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_155_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_155_setpos] component H523_Curved_155=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_155_var._name, "H523_Curved_155", 16384);
  stracpy(_H523_Curved_155_var._type, "Guide_gravity", 16384);
  _H523_Curved_155_var._index=155;
  int current_setpos_index = 155;
  _H523_Curved_155_var._parameters.w1 = 0.12;
  _H523_Curved_155_var._parameters.h1 = 0.12;
  _H523_Curved_155_var._parameters.w2 = 0;
  _H523_Curved_155_var._parameters.h2 = 0;
  _H523_Curved_155_var._parameters.l = 35.0 / 35;
  _H523_Curved_155_var._parameters.R0 = gR0;
  _H523_Curved_155_var._parameters.Qc = gQc;
  _H523_Curved_155_var._parameters.alpha = gAlpha;
  _H523_Curved_155_var._parameters.m = 2;
  _H523_Curved_155_var._parameters.W = gW;
  _H523_Curved_155_var._parameters.nslit = 1;
  _H523_Curved_155_var._parameters.d = 0.0005;
  _H523_Curved_155_var._parameters.mleft = -1;
  _H523_Curved_155_var._parameters.mright = -1;
  _H523_Curved_155_var._parameters.mtop = -1;
  _H523_Curved_155_var._parameters.mbottom = -1;
  _H523_Curved_155_var._parameters.nhslit = 1;
  _H523_Curved_155_var._parameters.G = 0;
  _H523_Curved_155_var._parameters.aleft = -1;
  _H523_Curved_155_var._parameters.aright = -1;
  _H523_Curved_155_var._parameters.atop = -1;
  _H523_Curved_155_var._parameters.abottom = -1;
  _H523_Curved_155_var._parameters.wavy = 0;
  _H523_Curved_155_var._parameters.wavy_z = 0;
  _H523_Curved_155_var._parameters.wavy_tb = 0;
  _H523_Curved_155_var._parameters.wavy_lr = 0;
  _H523_Curved_155_var._parameters.chamfers = 0;
  _H523_Curved_155_var._parameters.chamfers_z = 0;
  _H523_Curved_155_var._parameters.chamfers_lr = 0;
  _H523_Curved_155_var._parameters.chamfers_tb = 0;
  _H523_Curved_155_var._parameters.nelements = 1;
  _H523_Curved_155_var._parameters.nu = 0;
  _H523_Curved_155_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_155_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_155_var._parameters.reflect[0]='\0';


  /* component H523_Curved_155=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_154_var._rotation_absolute, _H523_Curved_155_var._rotation_absolute);
    rot_transpose(_H523_Curved_154_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_155_var._rotation_absolute, tr1, _H523_Curved_155_var._rotation_relative);
    _H523_Curved_155_var._rotation_is_identity =  rot_test_identity(_H523_Curved_155_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_154 , l ) + gGap);
    rot_transpose(_H523_Curved_154_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_155_var._position_absolute = coords_add(_H523_Curved_154_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_154_var._position_absolute, _H523_Curved_155_var._position_absolute);
    _H523_Curved_155_var._position_relative = rot_apply(_H523_Curved_155_var._rotation_absolute, tc1);
  } /* H523_Curved_155=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_155", _H523_Curved_155_var._position_absolute, _H523_Curved_155_var._rotation_absolute);
  instrument->_position_absolute[155] = _H523_Curved_155_var._position_absolute;
  instrument->_position_relative[155] = _H523_Curved_155_var._position_relative;
    _H523_Curved_155_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_155_var._position_relative);
  instrument->counter_N[155]  = instrument->counter_P[155] = instrument->counter_P2[155] = 0;
  instrument->counter_AbsorbProp[155]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0154_H523_Curved_155", _H523_Curved_155_var._position_absolute, _H523_Curved_155_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0154_H523_Curved_155", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_155_setpos */

/* component H523_Curved_156=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_156_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_156_setpos] component H523_Curved_156=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_156_var._name, "H523_Curved_156", 16384);
  stracpy(_H523_Curved_156_var._type, "Guide_gravity", 16384);
  _H523_Curved_156_var._index=156;
  int current_setpos_index = 156;
  _H523_Curved_156_var._parameters.w1 = 0.12;
  _H523_Curved_156_var._parameters.h1 = 0.12;
  _H523_Curved_156_var._parameters.w2 = 0;
  _H523_Curved_156_var._parameters.h2 = 0;
  _H523_Curved_156_var._parameters.l = 35.0 / 35;
  _H523_Curved_156_var._parameters.R0 = gR0;
  _H523_Curved_156_var._parameters.Qc = gQc;
  _H523_Curved_156_var._parameters.alpha = gAlpha;
  _H523_Curved_156_var._parameters.m = 2;
  _H523_Curved_156_var._parameters.W = gW;
  _H523_Curved_156_var._parameters.nslit = 1;
  _H523_Curved_156_var._parameters.d = 0.0005;
  _H523_Curved_156_var._parameters.mleft = -1;
  _H523_Curved_156_var._parameters.mright = -1;
  _H523_Curved_156_var._parameters.mtop = -1;
  _H523_Curved_156_var._parameters.mbottom = -1;
  _H523_Curved_156_var._parameters.nhslit = 1;
  _H523_Curved_156_var._parameters.G = 0;
  _H523_Curved_156_var._parameters.aleft = -1;
  _H523_Curved_156_var._parameters.aright = -1;
  _H523_Curved_156_var._parameters.atop = -1;
  _H523_Curved_156_var._parameters.abottom = -1;
  _H523_Curved_156_var._parameters.wavy = 0;
  _H523_Curved_156_var._parameters.wavy_z = 0;
  _H523_Curved_156_var._parameters.wavy_tb = 0;
  _H523_Curved_156_var._parameters.wavy_lr = 0;
  _H523_Curved_156_var._parameters.chamfers = 0;
  _H523_Curved_156_var._parameters.chamfers_z = 0;
  _H523_Curved_156_var._parameters.chamfers_lr = 0;
  _H523_Curved_156_var._parameters.chamfers_tb = 0;
  _H523_Curved_156_var._parameters.nelements = 1;
  _H523_Curved_156_var._parameters.nu = 0;
  _H523_Curved_156_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_156_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_156_var._parameters.reflect[0]='\0';


  /* component H523_Curved_156=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_155_var._rotation_absolute, _H523_Curved_156_var._rotation_absolute);
    rot_transpose(_H523_Curved_155_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_156_var._rotation_absolute, tr1, _H523_Curved_156_var._rotation_relative);
    _H523_Curved_156_var._rotation_is_identity =  rot_test_identity(_H523_Curved_156_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_155 , l ) + gGap);
    rot_transpose(_H523_Curved_155_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_156_var._position_absolute = coords_add(_H523_Curved_155_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_155_var._position_absolute, _H523_Curved_156_var._position_absolute);
    _H523_Curved_156_var._position_relative = rot_apply(_H523_Curved_156_var._rotation_absolute, tc1);
  } /* H523_Curved_156=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_156", _H523_Curved_156_var._position_absolute, _H523_Curved_156_var._rotation_absolute);
  instrument->_position_absolute[156] = _H523_Curved_156_var._position_absolute;
  instrument->_position_relative[156] = _H523_Curved_156_var._position_relative;
    _H523_Curved_156_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_156_var._position_relative);
  instrument->counter_N[156]  = instrument->counter_P[156] = instrument->counter_P2[156] = 0;
  instrument->counter_AbsorbProp[156]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0155_H523_Curved_156", _H523_Curved_156_var._position_absolute, _H523_Curved_156_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0155_H523_Curved_156", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_156_setpos */

/* component H523_Curved_157=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_157_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_157_setpos] component H523_Curved_157=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_157_var._name, "H523_Curved_157", 16384);
  stracpy(_H523_Curved_157_var._type, "Guide_gravity", 16384);
  _H523_Curved_157_var._index=157;
  int current_setpos_index = 157;
  _H523_Curved_157_var._parameters.w1 = 0.12;
  _H523_Curved_157_var._parameters.h1 = 0.12;
  _H523_Curved_157_var._parameters.w2 = 0;
  _H523_Curved_157_var._parameters.h2 = 0;
  _H523_Curved_157_var._parameters.l = 35.0 / 35;
  _H523_Curved_157_var._parameters.R0 = gR0;
  _H523_Curved_157_var._parameters.Qc = gQc;
  _H523_Curved_157_var._parameters.alpha = gAlpha;
  _H523_Curved_157_var._parameters.m = 2;
  _H523_Curved_157_var._parameters.W = gW;
  _H523_Curved_157_var._parameters.nslit = 1;
  _H523_Curved_157_var._parameters.d = 0.0005;
  _H523_Curved_157_var._parameters.mleft = -1;
  _H523_Curved_157_var._parameters.mright = -1;
  _H523_Curved_157_var._parameters.mtop = -1;
  _H523_Curved_157_var._parameters.mbottom = -1;
  _H523_Curved_157_var._parameters.nhslit = 1;
  _H523_Curved_157_var._parameters.G = 0;
  _H523_Curved_157_var._parameters.aleft = -1;
  _H523_Curved_157_var._parameters.aright = -1;
  _H523_Curved_157_var._parameters.atop = -1;
  _H523_Curved_157_var._parameters.abottom = -1;
  _H523_Curved_157_var._parameters.wavy = 0;
  _H523_Curved_157_var._parameters.wavy_z = 0;
  _H523_Curved_157_var._parameters.wavy_tb = 0;
  _H523_Curved_157_var._parameters.wavy_lr = 0;
  _H523_Curved_157_var._parameters.chamfers = 0;
  _H523_Curved_157_var._parameters.chamfers_z = 0;
  _H523_Curved_157_var._parameters.chamfers_lr = 0;
  _H523_Curved_157_var._parameters.chamfers_tb = 0;
  _H523_Curved_157_var._parameters.nelements = 1;
  _H523_Curved_157_var._parameters.nu = 0;
  _H523_Curved_157_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_157_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_157_var._parameters.reflect[0]='\0';


  /* component H523_Curved_157=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_156_var._rotation_absolute, _H523_Curved_157_var._rotation_absolute);
    rot_transpose(_H523_Curved_156_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_157_var._rotation_absolute, tr1, _H523_Curved_157_var._rotation_relative);
    _H523_Curved_157_var._rotation_is_identity =  rot_test_identity(_H523_Curved_157_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_156 , l ) + gGap);
    rot_transpose(_H523_Curved_156_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_157_var._position_absolute = coords_add(_H523_Curved_156_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_156_var._position_absolute, _H523_Curved_157_var._position_absolute);
    _H523_Curved_157_var._position_relative = rot_apply(_H523_Curved_157_var._rotation_absolute, tc1);
  } /* H523_Curved_157=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_157", _H523_Curved_157_var._position_absolute, _H523_Curved_157_var._rotation_absolute);
  instrument->_position_absolute[157] = _H523_Curved_157_var._position_absolute;
  instrument->_position_relative[157] = _H523_Curved_157_var._position_relative;
    _H523_Curved_157_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_157_var._position_relative);
  instrument->counter_N[157]  = instrument->counter_P[157] = instrument->counter_P2[157] = 0;
  instrument->counter_AbsorbProp[157]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0156_H523_Curved_157", _H523_Curved_157_var._position_absolute, _H523_Curved_157_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0156_H523_Curved_157", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_157_setpos */

/* component H522_Curved_158=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_158_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_158_setpos] component H522_Curved_158=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_158_var._name, "H522_Curved_158", 16384);
  stracpy(_H522_Curved_158_var._type, "Guide_gravity", 16384);
  _H522_Curved_158_var._index=158;
  int current_setpos_index = 158;
  _H522_Curved_158_var._parameters.w1 = 0.12;
  _H522_Curved_158_var._parameters.h1 = 0.12;
  _H522_Curved_158_var._parameters.w2 = 0;
  _H522_Curved_158_var._parameters.h2 = 0;
  _H522_Curved_158_var._parameters.l = 35.0 / 35;
  _H522_Curved_158_var._parameters.R0 = gR0;
  _H522_Curved_158_var._parameters.Qc = gQc;
  _H522_Curved_158_var._parameters.alpha = gAlpha;
  _H522_Curved_158_var._parameters.m = 2;
  _H522_Curved_158_var._parameters.W = gW;
  _H522_Curved_158_var._parameters.nslit = 1;
  _H522_Curved_158_var._parameters.d = 0.0005;
  _H522_Curved_158_var._parameters.mleft = -1;
  _H522_Curved_158_var._parameters.mright = -1;
  _H522_Curved_158_var._parameters.mtop = -1;
  _H522_Curved_158_var._parameters.mbottom = -1;
  _H522_Curved_158_var._parameters.nhslit = 1;
  _H522_Curved_158_var._parameters.G = 0;
  _H522_Curved_158_var._parameters.aleft = -1;
  _H522_Curved_158_var._parameters.aright = -1;
  _H522_Curved_158_var._parameters.atop = -1;
  _H522_Curved_158_var._parameters.abottom = -1;
  _H522_Curved_158_var._parameters.wavy = 0;
  _H522_Curved_158_var._parameters.wavy_z = 0;
  _H522_Curved_158_var._parameters.wavy_tb = 0;
  _H522_Curved_158_var._parameters.wavy_lr = 0;
  _H522_Curved_158_var._parameters.chamfers = 0;
  _H522_Curved_158_var._parameters.chamfers_z = 0;
  _H522_Curved_158_var._parameters.chamfers_lr = 0;
  _H522_Curved_158_var._parameters.chamfers_tb = 0;
  _H522_Curved_158_var._parameters.nelements = 1;
  _H522_Curved_158_var._parameters.nu = 0;
  _H522_Curved_158_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_158_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_158_var._parameters.reflect[0]='\0';


  /* component H522_Curved_158=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_157_var._rotation_absolute, _H522_Curved_158_var._rotation_absolute);
    rot_transpose(_H523_Curved_157_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_158_var._rotation_absolute, tr1, _H522_Curved_158_var._rotation_relative);
    _H522_Curved_158_var._rotation_is_identity =  rot_test_identity(_H522_Curved_158_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_157 , l ) + gGap);
    rot_transpose(_H523_Curved_157_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_158_var._position_absolute = coords_add(_H523_Curved_157_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_157_var._position_absolute, _H522_Curved_158_var._position_absolute);
    _H522_Curved_158_var._position_relative = rot_apply(_H522_Curved_158_var._rotation_absolute, tc1);
  } /* H522_Curved_158=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_158", _H522_Curved_158_var._position_absolute, _H522_Curved_158_var._rotation_absolute);
  instrument->_position_absolute[158] = _H522_Curved_158_var._position_absolute;
  instrument->_position_relative[158] = _H522_Curved_158_var._position_relative;
    _H522_Curved_158_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_158_var._position_relative);
  instrument->counter_N[158]  = instrument->counter_P[158] = instrument->counter_P2[158] = 0;
  instrument->counter_AbsorbProp[158]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0157_H522_Curved_158", _H522_Curved_158_var._position_absolute, _H522_Curved_158_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0157_H522_Curved_158", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_158_setpos */

/* component H522_Curved_159=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_159_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_159_setpos] component H522_Curved_159=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_159_var._name, "H522_Curved_159", 16384);
  stracpy(_H522_Curved_159_var._type, "Guide_gravity", 16384);
  _H522_Curved_159_var._index=159;
  int current_setpos_index = 159;
  _H522_Curved_159_var._parameters.w1 = 0.12;
  _H522_Curved_159_var._parameters.h1 = 0.12;
  _H522_Curved_159_var._parameters.w2 = 0;
  _H522_Curved_159_var._parameters.h2 = 0;
  _H522_Curved_159_var._parameters.l = 35.0 / 35;
  _H522_Curved_159_var._parameters.R0 = gR0;
  _H522_Curved_159_var._parameters.Qc = gQc;
  _H522_Curved_159_var._parameters.alpha = gAlpha;
  _H522_Curved_159_var._parameters.m = 2;
  _H522_Curved_159_var._parameters.W = gW;
  _H522_Curved_159_var._parameters.nslit = 1;
  _H522_Curved_159_var._parameters.d = 0.0005;
  _H522_Curved_159_var._parameters.mleft = -1;
  _H522_Curved_159_var._parameters.mright = -1;
  _H522_Curved_159_var._parameters.mtop = -1;
  _H522_Curved_159_var._parameters.mbottom = -1;
  _H522_Curved_159_var._parameters.nhslit = 1;
  _H522_Curved_159_var._parameters.G = 0;
  _H522_Curved_159_var._parameters.aleft = -1;
  _H522_Curved_159_var._parameters.aright = -1;
  _H522_Curved_159_var._parameters.atop = -1;
  _H522_Curved_159_var._parameters.abottom = -1;
  _H522_Curved_159_var._parameters.wavy = 0;
  _H522_Curved_159_var._parameters.wavy_z = 0;
  _H522_Curved_159_var._parameters.wavy_tb = 0;
  _H522_Curved_159_var._parameters.wavy_lr = 0;
  _H522_Curved_159_var._parameters.chamfers = 0;
  _H522_Curved_159_var._parameters.chamfers_z = 0;
  _H522_Curved_159_var._parameters.chamfers_lr = 0;
  _H522_Curved_159_var._parameters.chamfers_tb = 0;
  _H522_Curved_159_var._parameters.nelements = 1;
  _H522_Curved_159_var._parameters.nu = 0;
  _H522_Curved_159_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_159_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_159_var._parameters.reflect[0]='\0';


  /* component H522_Curved_159=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_158_var._rotation_absolute, _H522_Curved_159_var._rotation_absolute);
    rot_transpose(_H522_Curved_158_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_159_var._rotation_absolute, tr1, _H522_Curved_159_var._rotation_relative);
    _H522_Curved_159_var._rotation_is_identity =  rot_test_identity(_H522_Curved_159_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_158 , l ) + gGap);
    rot_transpose(_H522_Curved_158_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_159_var._position_absolute = coords_add(_H522_Curved_158_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_158_var._position_absolute, _H522_Curved_159_var._position_absolute);
    _H522_Curved_159_var._position_relative = rot_apply(_H522_Curved_159_var._rotation_absolute, tc1);
  } /* H522_Curved_159=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_159", _H522_Curved_159_var._position_absolute, _H522_Curved_159_var._rotation_absolute);
  instrument->_position_absolute[159] = _H522_Curved_159_var._position_absolute;
  instrument->_position_relative[159] = _H522_Curved_159_var._position_relative;
    _H522_Curved_159_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_159_var._position_relative);
  instrument->counter_N[159]  = instrument->counter_P[159] = instrument->counter_P2[159] = 0;
  instrument->counter_AbsorbProp[159]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0158_H522_Curved_159", _H522_Curved_159_var._position_absolute, _H522_Curved_159_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0158_H522_Curved_159", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_159_setpos */

/* component H522_Curved_160=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_160_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_160_setpos] component H522_Curved_160=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_160_var._name, "H522_Curved_160", 16384);
  stracpy(_H522_Curved_160_var._type, "Guide_gravity", 16384);
  _H522_Curved_160_var._index=160;
  int current_setpos_index = 160;
  _H522_Curved_160_var._parameters.w1 = 0.12;
  _H522_Curved_160_var._parameters.h1 = 0.12;
  _H522_Curved_160_var._parameters.w2 = 0;
  _H522_Curved_160_var._parameters.h2 = 0;
  _H522_Curved_160_var._parameters.l = 35.0 / 35;
  _H522_Curved_160_var._parameters.R0 = gR0;
  _H522_Curved_160_var._parameters.Qc = gQc;
  _H522_Curved_160_var._parameters.alpha = gAlpha;
  _H522_Curved_160_var._parameters.m = 2;
  _H522_Curved_160_var._parameters.W = gW;
  _H522_Curved_160_var._parameters.nslit = 1;
  _H522_Curved_160_var._parameters.d = 0.0005;
  _H522_Curved_160_var._parameters.mleft = -1;
  _H522_Curved_160_var._parameters.mright = -1;
  _H522_Curved_160_var._parameters.mtop = -1;
  _H522_Curved_160_var._parameters.mbottom = -1;
  _H522_Curved_160_var._parameters.nhslit = 1;
  _H522_Curved_160_var._parameters.G = 0;
  _H522_Curved_160_var._parameters.aleft = -1;
  _H522_Curved_160_var._parameters.aright = -1;
  _H522_Curved_160_var._parameters.atop = -1;
  _H522_Curved_160_var._parameters.abottom = -1;
  _H522_Curved_160_var._parameters.wavy = 0;
  _H522_Curved_160_var._parameters.wavy_z = 0;
  _H522_Curved_160_var._parameters.wavy_tb = 0;
  _H522_Curved_160_var._parameters.wavy_lr = 0;
  _H522_Curved_160_var._parameters.chamfers = 0;
  _H522_Curved_160_var._parameters.chamfers_z = 0;
  _H522_Curved_160_var._parameters.chamfers_lr = 0;
  _H522_Curved_160_var._parameters.chamfers_tb = 0;
  _H522_Curved_160_var._parameters.nelements = 1;
  _H522_Curved_160_var._parameters.nu = 0;
  _H522_Curved_160_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_160_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_160_var._parameters.reflect[0]='\0';


  /* component H522_Curved_160=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_159_var._rotation_absolute, _H522_Curved_160_var._rotation_absolute);
    rot_transpose(_H522_Curved_159_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_160_var._rotation_absolute, tr1, _H522_Curved_160_var._rotation_relative);
    _H522_Curved_160_var._rotation_is_identity =  rot_test_identity(_H522_Curved_160_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_159 , l ) + gGap);
    rot_transpose(_H522_Curved_159_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_160_var._position_absolute = coords_add(_H522_Curved_159_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_159_var._position_absolute, _H522_Curved_160_var._position_absolute);
    _H522_Curved_160_var._position_relative = rot_apply(_H522_Curved_160_var._rotation_absolute, tc1);
  } /* H522_Curved_160=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_160", _H522_Curved_160_var._position_absolute, _H522_Curved_160_var._rotation_absolute);
  instrument->_position_absolute[160] = _H522_Curved_160_var._position_absolute;
  instrument->_position_relative[160] = _H522_Curved_160_var._position_relative;
    _H522_Curved_160_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_160_var._position_relative);
  instrument->counter_N[160]  = instrument->counter_P[160] = instrument->counter_P2[160] = 0;
  instrument->counter_AbsorbProp[160]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0159_H522_Curved_160", _H522_Curved_160_var._position_absolute, _H522_Curved_160_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0159_H522_Curved_160", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_160_setpos */

/* component H522_Curved_161=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_161_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_161_setpos] component H522_Curved_161=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_161_var._name, "H522_Curved_161", 16384);
  stracpy(_H522_Curved_161_var._type, "Guide_gravity", 16384);
  _H522_Curved_161_var._index=161;
  int current_setpos_index = 161;
  _H522_Curved_161_var._parameters.w1 = 0.12;
  _H522_Curved_161_var._parameters.h1 = 0.12;
  _H522_Curved_161_var._parameters.w2 = 0;
  _H522_Curved_161_var._parameters.h2 = 0;
  _H522_Curved_161_var._parameters.l = 35.0 / 35;
  _H522_Curved_161_var._parameters.R0 = gR0;
  _H522_Curved_161_var._parameters.Qc = gQc;
  _H522_Curved_161_var._parameters.alpha = gAlpha;
  _H522_Curved_161_var._parameters.m = 2;
  _H522_Curved_161_var._parameters.W = gW;
  _H522_Curved_161_var._parameters.nslit = 1;
  _H522_Curved_161_var._parameters.d = 0.0005;
  _H522_Curved_161_var._parameters.mleft = -1;
  _H522_Curved_161_var._parameters.mright = -1;
  _H522_Curved_161_var._parameters.mtop = -1;
  _H522_Curved_161_var._parameters.mbottom = -1;
  _H522_Curved_161_var._parameters.nhslit = 1;
  _H522_Curved_161_var._parameters.G = 0;
  _H522_Curved_161_var._parameters.aleft = -1;
  _H522_Curved_161_var._parameters.aright = -1;
  _H522_Curved_161_var._parameters.atop = -1;
  _H522_Curved_161_var._parameters.abottom = -1;
  _H522_Curved_161_var._parameters.wavy = 0;
  _H522_Curved_161_var._parameters.wavy_z = 0;
  _H522_Curved_161_var._parameters.wavy_tb = 0;
  _H522_Curved_161_var._parameters.wavy_lr = 0;
  _H522_Curved_161_var._parameters.chamfers = 0;
  _H522_Curved_161_var._parameters.chamfers_z = 0;
  _H522_Curved_161_var._parameters.chamfers_lr = 0;
  _H522_Curved_161_var._parameters.chamfers_tb = 0;
  _H522_Curved_161_var._parameters.nelements = 1;
  _H522_Curved_161_var._parameters.nu = 0;
  _H522_Curved_161_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_161_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_161_var._parameters.reflect[0]='\0';


  /* component H522_Curved_161=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_160_var._rotation_absolute, _H522_Curved_161_var._rotation_absolute);
    rot_transpose(_H522_Curved_160_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_161_var._rotation_absolute, tr1, _H522_Curved_161_var._rotation_relative);
    _H522_Curved_161_var._rotation_is_identity =  rot_test_identity(_H522_Curved_161_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_160 , l ) + gGap);
    rot_transpose(_H522_Curved_160_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_161_var._position_absolute = coords_add(_H522_Curved_160_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_160_var._position_absolute, _H522_Curved_161_var._position_absolute);
    _H522_Curved_161_var._position_relative = rot_apply(_H522_Curved_161_var._rotation_absolute, tc1);
  } /* H522_Curved_161=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_161", _H522_Curved_161_var._position_absolute, _H522_Curved_161_var._rotation_absolute);
  instrument->_position_absolute[161] = _H522_Curved_161_var._position_absolute;
  instrument->_position_relative[161] = _H522_Curved_161_var._position_relative;
    _H522_Curved_161_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_161_var._position_relative);
  instrument->counter_N[161]  = instrument->counter_P[161] = instrument->counter_P2[161] = 0;
  instrument->counter_AbsorbProp[161]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0160_H522_Curved_161", _H522_Curved_161_var._position_absolute, _H522_Curved_161_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0160_H522_Curved_161", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_161_setpos */

/* component H522_Curved_162=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_162_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_162_setpos] component H522_Curved_162=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_162_var._name, "H522_Curved_162", 16384);
  stracpy(_H522_Curved_162_var._type, "Guide_gravity", 16384);
  _H522_Curved_162_var._index=162;
  int current_setpos_index = 162;
  _H522_Curved_162_var._parameters.w1 = 0.12;
  _H522_Curved_162_var._parameters.h1 = 0.12;
  _H522_Curved_162_var._parameters.w2 = 0;
  _H522_Curved_162_var._parameters.h2 = 0;
  _H522_Curved_162_var._parameters.l = 35.0 / 35;
  _H522_Curved_162_var._parameters.R0 = gR0;
  _H522_Curved_162_var._parameters.Qc = gQc;
  _H522_Curved_162_var._parameters.alpha = gAlpha;
  _H522_Curved_162_var._parameters.m = 2;
  _H522_Curved_162_var._parameters.W = gW;
  _H522_Curved_162_var._parameters.nslit = 1;
  _H522_Curved_162_var._parameters.d = 0.0005;
  _H522_Curved_162_var._parameters.mleft = -1;
  _H522_Curved_162_var._parameters.mright = -1;
  _H522_Curved_162_var._parameters.mtop = -1;
  _H522_Curved_162_var._parameters.mbottom = -1;
  _H522_Curved_162_var._parameters.nhslit = 1;
  _H522_Curved_162_var._parameters.G = 0;
  _H522_Curved_162_var._parameters.aleft = -1;
  _H522_Curved_162_var._parameters.aright = -1;
  _H522_Curved_162_var._parameters.atop = -1;
  _H522_Curved_162_var._parameters.abottom = -1;
  _H522_Curved_162_var._parameters.wavy = 0;
  _H522_Curved_162_var._parameters.wavy_z = 0;
  _H522_Curved_162_var._parameters.wavy_tb = 0;
  _H522_Curved_162_var._parameters.wavy_lr = 0;
  _H522_Curved_162_var._parameters.chamfers = 0;
  _H522_Curved_162_var._parameters.chamfers_z = 0;
  _H522_Curved_162_var._parameters.chamfers_lr = 0;
  _H522_Curved_162_var._parameters.chamfers_tb = 0;
  _H522_Curved_162_var._parameters.nelements = 1;
  _H522_Curved_162_var._parameters.nu = 0;
  _H522_Curved_162_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_162_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_162_var._parameters.reflect[0]='\0';


  /* component H522_Curved_162=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_161_var._rotation_absolute, _H522_Curved_162_var._rotation_absolute);
    rot_transpose(_H522_Curved_161_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_162_var._rotation_absolute, tr1, _H522_Curved_162_var._rotation_relative);
    _H522_Curved_162_var._rotation_is_identity =  rot_test_identity(_H522_Curved_162_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_161 , l ) + gGap);
    rot_transpose(_H522_Curved_161_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_162_var._position_absolute = coords_add(_H522_Curved_161_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_161_var._position_absolute, _H522_Curved_162_var._position_absolute);
    _H522_Curved_162_var._position_relative = rot_apply(_H522_Curved_162_var._rotation_absolute, tc1);
  } /* H522_Curved_162=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_162", _H522_Curved_162_var._position_absolute, _H522_Curved_162_var._rotation_absolute);
  instrument->_position_absolute[162] = _H522_Curved_162_var._position_absolute;
  instrument->_position_relative[162] = _H522_Curved_162_var._position_relative;
    _H522_Curved_162_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_162_var._position_relative);
  instrument->counter_N[162]  = instrument->counter_P[162] = instrument->counter_P2[162] = 0;
  instrument->counter_AbsorbProp[162]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0161_H522_Curved_162", _H522_Curved_162_var._position_absolute, _H522_Curved_162_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0161_H522_Curved_162", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_162_setpos */

/* component H522_Curved_163=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_163_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_163_setpos] component H522_Curved_163=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_163_var._name, "H522_Curved_163", 16384);
  stracpy(_H522_Curved_163_var._type, "Guide_gravity", 16384);
  _H522_Curved_163_var._index=163;
  int current_setpos_index = 163;
  _H522_Curved_163_var._parameters.w1 = 0.12;
  _H522_Curved_163_var._parameters.h1 = 0.12;
  _H522_Curved_163_var._parameters.w2 = 0;
  _H522_Curved_163_var._parameters.h2 = 0;
  _H522_Curved_163_var._parameters.l = 35.0 / 35;
  _H522_Curved_163_var._parameters.R0 = gR0;
  _H522_Curved_163_var._parameters.Qc = gQc;
  _H522_Curved_163_var._parameters.alpha = gAlpha;
  _H522_Curved_163_var._parameters.m = 2;
  _H522_Curved_163_var._parameters.W = gW;
  _H522_Curved_163_var._parameters.nslit = 1;
  _H522_Curved_163_var._parameters.d = 0.0005;
  _H522_Curved_163_var._parameters.mleft = -1;
  _H522_Curved_163_var._parameters.mright = -1;
  _H522_Curved_163_var._parameters.mtop = -1;
  _H522_Curved_163_var._parameters.mbottom = -1;
  _H522_Curved_163_var._parameters.nhslit = 1;
  _H522_Curved_163_var._parameters.G = 0;
  _H522_Curved_163_var._parameters.aleft = -1;
  _H522_Curved_163_var._parameters.aright = -1;
  _H522_Curved_163_var._parameters.atop = -1;
  _H522_Curved_163_var._parameters.abottom = -1;
  _H522_Curved_163_var._parameters.wavy = 0;
  _H522_Curved_163_var._parameters.wavy_z = 0;
  _H522_Curved_163_var._parameters.wavy_tb = 0;
  _H522_Curved_163_var._parameters.wavy_lr = 0;
  _H522_Curved_163_var._parameters.chamfers = 0;
  _H522_Curved_163_var._parameters.chamfers_z = 0;
  _H522_Curved_163_var._parameters.chamfers_lr = 0;
  _H522_Curved_163_var._parameters.chamfers_tb = 0;
  _H522_Curved_163_var._parameters.nelements = 1;
  _H522_Curved_163_var._parameters.nu = 0;
  _H522_Curved_163_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_163_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_163_var._parameters.reflect[0]='\0';


  /* component H522_Curved_163=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_162_var._rotation_absolute, _H522_Curved_163_var._rotation_absolute);
    rot_transpose(_H522_Curved_162_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_163_var._rotation_absolute, tr1, _H522_Curved_163_var._rotation_relative);
    _H522_Curved_163_var._rotation_is_identity =  rot_test_identity(_H522_Curved_163_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_162 , l ) + gGap);
    rot_transpose(_H522_Curved_162_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_163_var._position_absolute = coords_add(_H522_Curved_162_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_162_var._position_absolute, _H522_Curved_163_var._position_absolute);
    _H522_Curved_163_var._position_relative = rot_apply(_H522_Curved_163_var._rotation_absolute, tc1);
  } /* H522_Curved_163=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_163", _H522_Curved_163_var._position_absolute, _H522_Curved_163_var._rotation_absolute);
  instrument->_position_absolute[163] = _H522_Curved_163_var._position_absolute;
  instrument->_position_relative[163] = _H522_Curved_163_var._position_relative;
    _H522_Curved_163_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_163_var._position_relative);
  instrument->counter_N[163]  = instrument->counter_P[163] = instrument->counter_P2[163] = 0;
  instrument->counter_AbsorbProp[163]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0162_H522_Curved_163", _H522_Curved_163_var._position_absolute, _H522_Curved_163_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0162_H522_Curved_163", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_163_setpos */

/* component H522_Curved_164=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_164_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_164_setpos] component H522_Curved_164=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_164_var._name, "H522_Curved_164", 16384);
  stracpy(_H522_Curved_164_var._type, "Guide_gravity", 16384);
  _H522_Curved_164_var._index=164;
  int current_setpos_index = 164;
  _H522_Curved_164_var._parameters.w1 = 0.12;
  _H522_Curved_164_var._parameters.h1 = 0.12;
  _H522_Curved_164_var._parameters.w2 = 0;
  _H522_Curved_164_var._parameters.h2 = 0;
  _H522_Curved_164_var._parameters.l = 35.0 / 35;
  _H522_Curved_164_var._parameters.R0 = gR0;
  _H522_Curved_164_var._parameters.Qc = gQc;
  _H522_Curved_164_var._parameters.alpha = gAlpha;
  _H522_Curved_164_var._parameters.m = 2;
  _H522_Curved_164_var._parameters.W = gW;
  _H522_Curved_164_var._parameters.nslit = 1;
  _H522_Curved_164_var._parameters.d = 0.0005;
  _H522_Curved_164_var._parameters.mleft = -1;
  _H522_Curved_164_var._parameters.mright = -1;
  _H522_Curved_164_var._parameters.mtop = -1;
  _H522_Curved_164_var._parameters.mbottom = -1;
  _H522_Curved_164_var._parameters.nhslit = 1;
  _H522_Curved_164_var._parameters.G = 0;
  _H522_Curved_164_var._parameters.aleft = -1;
  _H522_Curved_164_var._parameters.aright = -1;
  _H522_Curved_164_var._parameters.atop = -1;
  _H522_Curved_164_var._parameters.abottom = -1;
  _H522_Curved_164_var._parameters.wavy = 0;
  _H522_Curved_164_var._parameters.wavy_z = 0;
  _H522_Curved_164_var._parameters.wavy_tb = 0;
  _H522_Curved_164_var._parameters.wavy_lr = 0;
  _H522_Curved_164_var._parameters.chamfers = 0;
  _H522_Curved_164_var._parameters.chamfers_z = 0;
  _H522_Curved_164_var._parameters.chamfers_lr = 0;
  _H522_Curved_164_var._parameters.chamfers_tb = 0;
  _H522_Curved_164_var._parameters.nelements = 1;
  _H522_Curved_164_var._parameters.nu = 0;
  _H522_Curved_164_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_164_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_164_var._parameters.reflect[0]='\0';


  /* component H522_Curved_164=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_163_var._rotation_absolute, _H522_Curved_164_var._rotation_absolute);
    rot_transpose(_H522_Curved_163_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_164_var._rotation_absolute, tr1, _H522_Curved_164_var._rotation_relative);
    _H522_Curved_164_var._rotation_is_identity =  rot_test_identity(_H522_Curved_164_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_163 , l ) + gGap);
    rot_transpose(_H522_Curved_163_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_164_var._position_absolute = coords_add(_H522_Curved_163_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_163_var._position_absolute, _H522_Curved_164_var._position_absolute);
    _H522_Curved_164_var._position_relative = rot_apply(_H522_Curved_164_var._rotation_absolute, tc1);
  } /* H522_Curved_164=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_164", _H522_Curved_164_var._position_absolute, _H522_Curved_164_var._rotation_absolute);
  instrument->_position_absolute[164] = _H522_Curved_164_var._position_absolute;
  instrument->_position_relative[164] = _H522_Curved_164_var._position_relative;
    _H522_Curved_164_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_164_var._position_relative);
  instrument->counter_N[164]  = instrument->counter_P[164] = instrument->counter_P2[164] = 0;
  instrument->counter_AbsorbProp[164]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0163_H522_Curved_164", _H522_Curved_164_var._position_absolute, _H522_Curved_164_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0163_H522_Curved_164", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_164_setpos */

/* component H522_Curved_165=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_165_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_165_setpos] component H522_Curved_165=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_165_var._name, "H522_Curved_165", 16384);
  stracpy(_H522_Curved_165_var._type, "Guide_gravity", 16384);
  _H522_Curved_165_var._index=165;
  int current_setpos_index = 165;
  _H522_Curved_165_var._parameters.w1 = 0.12;
  _H522_Curved_165_var._parameters.h1 = 0.12;
  _H522_Curved_165_var._parameters.w2 = 0;
  _H522_Curved_165_var._parameters.h2 = 0;
  _H522_Curved_165_var._parameters.l = 35.0 / 35;
  _H522_Curved_165_var._parameters.R0 = gR0;
  _H522_Curved_165_var._parameters.Qc = gQc;
  _H522_Curved_165_var._parameters.alpha = gAlpha;
  _H522_Curved_165_var._parameters.m = 2;
  _H522_Curved_165_var._parameters.W = gW;
  _H522_Curved_165_var._parameters.nslit = 1;
  _H522_Curved_165_var._parameters.d = 0.0005;
  _H522_Curved_165_var._parameters.mleft = -1;
  _H522_Curved_165_var._parameters.mright = -1;
  _H522_Curved_165_var._parameters.mtop = -1;
  _H522_Curved_165_var._parameters.mbottom = -1;
  _H522_Curved_165_var._parameters.nhslit = 1;
  _H522_Curved_165_var._parameters.G = 0;
  _H522_Curved_165_var._parameters.aleft = -1;
  _H522_Curved_165_var._parameters.aright = -1;
  _H522_Curved_165_var._parameters.atop = -1;
  _H522_Curved_165_var._parameters.abottom = -1;
  _H522_Curved_165_var._parameters.wavy = 0;
  _H522_Curved_165_var._parameters.wavy_z = 0;
  _H522_Curved_165_var._parameters.wavy_tb = 0;
  _H522_Curved_165_var._parameters.wavy_lr = 0;
  _H522_Curved_165_var._parameters.chamfers = 0;
  _H522_Curved_165_var._parameters.chamfers_z = 0;
  _H522_Curved_165_var._parameters.chamfers_lr = 0;
  _H522_Curved_165_var._parameters.chamfers_tb = 0;
  _H522_Curved_165_var._parameters.nelements = 1;
  _H522_Curved_165_var._parameters.nu = 0;
  _H522_Curved_165_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_165_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_165_var._parameters.reflect[0]='\0';


  /* component H522_Curved_165=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_164_var._rotation_absolute, _H522_Curved_165_var._rotation_absolute);
    rot_transpose(_H522_Curved_164_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_165_var._rotation_absolute, tr1, _H522_Curved_165_var._rotation_relative);
    _H522_Curved_165_var._rotation_is_identity =  rot_test_identity(_H522_Curved_165_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_164 , l ) + gGap);
    rot_transpose(_H522_Curved_164_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_165_var._position_absolute = coords_add(_H522_Curved_164_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_164_var._position_absolute, _H522_Curved_165_var._position_absolute);
    _H522_Curved_165_var._position_relative = rot_apply(_H522_Curved_165_var._rotation_absolute, tc1);
  } /* H522_Curved_165=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_165", _H522_Curved_165_var._position_absolute, _H522_Curved_165_var._rotation_absolute);
  instrument->_position_absolute[165] = _H522_Curved_165_var._position_absolute;
  instrument->_position_relative[165] = _H522_Curved_165_var._position_relative;
    _H522_Curved_165_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_165_var._position_relative);
  instrument->counter_N[165]  = instrument->counter_P[165] = instrument->counter_P2[165] = 0;
  instrument->counter_AbsorbProp[165]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0164_H522_Curved_165", _H522_Curved_165_var._position_absolute, _H522_Curved_165_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0164_H522_Curved_165", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_165_setpos */

/* component H522_Curved_166=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_166_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_166_setpos] component H522_Curved_166=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_166_var._name, "H522_Curved_166", 16384);
  stracpy(_H522_Curved_166_var._type, "Guide_gravity", 16384);
  _H522_Curved_166_var._index=166;
  int current_setpos_index = 166;
  _H522_Curved_166_var._parameters.w1 = 0.12;
  _H522_Curved_166_var._parameters.h1 = 0.12;
  _H522_Curved_166_var._parameters.w2 = 0;
  _H522_Curved_166_var._parameters.h2 = 0;
  _H522_Curved_166_var._parameters.l = 35.0 / 35;
  _H522_Curved_166_var._parameters.R0 = gR0;
  _H522_Curved_166_var._parameters.Qc = gQc;
  _H522_Curved_166_var._parameters.alpha = gAlpha;
  _H522_Curved_166_var._parameters.m = 2;
  _H522_Curved_166_var._parameters.W = gW;
  _H522_Curved_166_var._parameters.nslit = 1;
  _H522_Curved_166_var._parameters.d = 0.0005;
  _H522_Curved_166_var._parameters.mleft = -1;
  _H522_Curved_166_var._parameters.mright = -1;
  _H522_Curved_166_var._parameters.mtop = -1;
  _H522_Curved_166_var._parameters.mbottom = -1;
  _H522_Curved_166_var._parameters.nhslit = 1;
  _H522_Curved_166_var._parameters.G = 0;
  _H522_Curved_166_var._parameters.aleft = -1;
  _H522_Curved_166_var._parameters.aright = -1;
  _H522_Curved_166_var._parameters.atop = -1;
  _H522_Curved_166_var._parameters.abottom = -1;
  _H522_Curved_166_var._parameters.wavy = 0;
  _H522_Curved_166_var._parameters.wavy_z = 0;
  _H522_Curved_166_var._parameters.wavy_tb = 0;
  _H522_Curved_166_var._parameters.wavy_lr = 0;
  _H522_Curved_166_var._parameters.chamfers = 0;
  _H522_Curved_166_var._parameters.chamfers_z = 0;
  _H522_Curved_166_var._parameters.chamfers_lr = 0;
  _H522_Curved_166_var._parameters.chamfers_tb = 0;
  _H522_Curved_166_var._parameters.nelements = 1;
  _H522_Curved_166_var._parameters.nu = 0;
  _H522_Curved_166_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_166_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_166_var._parameters.reflect[0]='\0';


  /* component H522_Curved_166=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_165_var._rotation_absolute, _H522_Curved_166_var._rotation_absolute);
    rot_transpose(_H522_Curved_165_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_166_var._rotation_absolute, tr1, _H522_Curved_166_var._rotation_relative);
    _H522_Curved_166_var._rotation_is_identity =  rot_test_identity(_H522_Curved_166_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_165 , l ) + gGap);
    rot_transpose(_H522_Curved_165_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_166_var._position_absolute = coords_add(_H522_Curved_165_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_165_var._position_absolute, _H522_Curved_166_var._position_absolute);
    _H522_Curved_166_var._position_relative = rot_apply(_H522_Curved_166_var._rotation_absolute, tc1);
  } /* H522_Curved_166=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_166", _H522_Curved_166_var._position_absolute, _H522_Curved_166_var._rotation_absolute);
  instrument->_position_absolute[166] = _H522_Curved_166_var._position_absolute;
  instrument->_position_relative[166] = _H522_Curved_166_var._position_relative;
    _H522_Curved_166_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_166_var._position_relative);
  instrument->counter_N[166]  = instrument->counter_P[166] = instrument->counter_P2[166] = 0;
  instrument->counter_AbsorbProp[166]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0165_H522_Curved_166", _H522_Curved_166_var._position_absolute, _H522_Curved_166_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0165_H522_Curved_166", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_166_setpos */

/* component H522_Curved_167=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_167_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_167_setpos] component H522_Curved_167=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_167_var._name, "H522_Curved_167", 16384);
  stracpy(_H522_Curved_167_var._type, "Guide_gravity", 16384);
  _H522_Curved_167_var._index=167;
  int current_setpos_index = 167;
  _H522_Curved_167_var._parameters.w1 = 0.12;
  _H522_Curved_167_var._parameters.h1 = 0.12;
  _H522_Curved_167_var._parameters.w2 = 0;
  _H522_Curved_167_var._parameters.h2 = 0;
  _H522_Curved_167_var._parameters.l = 35.0 / 35;
  _H522_Curved_167_var._parameters.R0 = gR0;
  _H522_Curved_167_var._parameters.Qc = gQc;
  _H522_Curved_167_var._parameters.alpha = gAlpha;
  _H522_Curved_167_var._parameters.m = 2;
  _H522_Curved_167_var._parameters.W = gW;
  _H522_Curved_167_var._parameters.nslit = 1;
  _H522_Curved_167_var._parameters.d = 0.0005;
  _H522_Curved_167_var._parameters.mleft = -1;
  _H522_Curved_167_var._parameters.mright = -1;
  _H522_Curved_167_var._parameters.mtop = -1;
  _H522_Curved_167_var._parameters.mbottom = -1;
  _H522_Curved_167_var._parameters.nhslit = 1;
  _H522_Curved_167_var._parameters.G = 0;
  _H522_Curved_167_var._parameters.aleft = -1;
  _H522_Curved_167_var._parameters.aright = -1;
  _H522_Curved_167_var._parameters.atop = -1;
  _H522_Curved_167_var._parameters.abottom = -1;
  _H522_Curved_167_var._parameters.wavy = 0;
  _H522_Curved_167_var._parameters.wavy_z = 0;
  _H522_Curved_167_var._parameters.wavy_tb = 0;
  _H522_Curved_167_var._parameters.wavy_lr = 0;
  _H522_Curved_167_var._parameters.chamfers = 0;
  _H522_Curved_167_var._parameters.chamfers_z = 0;
  _H522_Curved_167_var._parameters.chamfers_lr = 0;
  _H522_Curved_167_var._parameters.chamfers_tb = 0;
  _H522_Curved_167_var._parameters.nelements = 1;
  _H522_Curved_167_var._parameters.nu = 0;
  _H522_Curved_167_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_167_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_167_var._parameters.reflect[0]='\0';


  /* component H522_Curved_167=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_166_var._rotation_absolute, _H522_Curved_167_var._rotation_absolute);
    rot_transpose(_H522_Curved_166_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_167_var._rotation_absolute, tr1, _H522_Curved_167_var._rotation_relative);
    _H522_Curved_167_var._rotation_is_identity =  rot_test_identity(_H522_Curved_167_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_166 , l ) + gGap);
    rot_transpose(_H522_Curved_166_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_167_var._position_absolute = coords_add(_H522_Curved_166_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_166_var._position_absolute, _H522_Curved_167_var._position_absolute);
    _H522_Curved_167_var._position_relative = rot_apply(_H522_Curved_167_var._rotation_absolute, tc1);
  } /* H522_Curved_167=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_167", _H522_Curved_167_var._position_absolute, _H522_Curved_167_var._rotation_absolute);
  instrument->_position_absolute[167] = _H522_Curved_167_var._position_absolute;
  instrument->_position_relative[167] = _H522_Curved_167_var._position_relative;
    _H522_Curved_167_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_167_var._position_relative);
  instrument->counter_N[167]  = instrument->counter_P[167] = instrument->counter_P2[167] = 0;
  instrument->counter_AbsorbProp[167]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0166_H522_Curved_167", _H522_Curved_167_var._position_absolute, _H522_Curved_167_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0166_H522_Curved_167", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_167_setpos */

/* component H522_Curved_168=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_168_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_168_setpos] component H522_Curved_168=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_168_var._name, "H522_Curved_168", 16384);
  stracpy(_H522_Curved_168_var._type, "Guide_gravity", 16384);
  _H522_Curved_168_var._index=168;
  int current_setpos_index = 168;
  _H522_Curved_168_var._parameters.w1 = 0.12;
  _H522_Curved_168_var._parameters.h1 = 0.12;
  _H522_Curved_168_var._parameters.w2 = 0;
  _H522_Curved_168_var._parameters.h2 = 0;
  _H522_Curved_168_var._parameters.l = 35.0 / 35;
  _H522_Curved_168_var._parameters.R0 = gR0;
  _H522_Curved_168_var._parameters.Qc = gQc;
  _H522_Curved_168_var._parameters.alpha = gAlpha;
  _H522_Curved_168_var._parameters.m = 2;
  _H522_Curved_168_var._parameters.W = gW;
  _H522_Curved_168_var._parameters.nslit = 1;
  _H522_Curved_168_var._parameters.d = 0.0005;
  _H522_Curved_168_var._parameters.mleft = -1;
  _H522_Curved_168_var._parameters.mright = -1;
  _H522_Curved_168_var._parameters.mtop = -1;
  _H522_Curved_168_var._parameters.mbottom = -1;
  _H522_Curved_168_var._parameters.nhslit = 1;
  _H522_Curved_168_var._parameters.G = 0;
  _H522_Curved_168_var._parameters.aleft = -1;
  _H522_Curved_168_var._parameters.aright = -1;
  _H522_Curved_168_var._parameters.atop = -1;
  _H522_Curved_168_var._parameters.abottom = -1;
  _H522_Curved_168_var._parameters.wavy = 0;
  _H522_Curved_168_var._parameters.wavy_z = 0;
  _H522_Curved_168_var._parameters.wavy_tb = 0;
  _H522_Curved_168_var._parameters.wavy_lr = 0;
  _H522_Curved_168_var._parameters.chamfers = 0;
  _H522_Curved_168_var._parameters.chamfers_z = 0;
  _H522_Curved_168_var._parameters.chamfers_lr = 0;
  _H522_Curved_168_var._parameters.chamfers_tb = 0;
  _H522_Curved_168_var._parameters.nelements = 1;
  _H522_Curved_168_var._parameters.nu = 0;
  _H522_Curved_168_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_168_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_168_var._parameters.reflect[0]='\0';


  /* component H522_Curved_168=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_167_var._rotation_absolute, _H522_Curved_168_var._rotation_absolute);
    rot_transpose(_H522_Curved_167_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_168_var._rotation_absolute, tr1, _H522_Curved_168_var._rotation_relative);
    _H522_Curved_168_var._rotation_is_identity =  rot_test_identity(_H522_Curved_168_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_167 , l ) + gGap);
    rot_transpose(_H522_Curved_167_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_168_var._position_absolute = coords_add(_H522_Curved_167_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_167_var._position_absolute, _H522_Curved_168_var._position_absolute);
    _H522_Curved_168_var._position_relative = rot_apply(_H522_Curved_168_var._rotation_absolute, tc1);
  } /* H522_Curved_168=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_168", _H522_Curved_168_var._position_absolute, _H522_Curved_168_var._rotation_absolute);
  instrument->_position_absolute[168] = _H522_Curved_168_var._position_absolute;
  instrument->_position_relative[168] = _H522_Curved_168_var._position_relative;
    _H522_Curved_168_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_168_var._position_relative);
  instrument->counter_N[168]  = instrument->counter_P[168] = instrument->counter_P2[168] = 0;
  instrument->counter_AbsorbProp[168]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0167_H522_Curved_168", _H522_Curved_168_var._position_absolute, _H522_Curved_168_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0167_H522_Curved_168", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_168_setpos */

/* component H522_Curved_169=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_169_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_169_setpos] component H522_Curved_169=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_169_var._name, "H522_Curved_169", 16384);
  stracpy(_H522_Curved_169_var._type, "Guide_gravity", 16384);
  _H522_Curved_169_var._index=169;
  int current_setpos_index = 169;
  _H522_Curved_169_var._parameters.w1 = 0.12;
  _H522_Curved_169_var._parameters.h1 = 0.12;
  _H522_Curved_169_var._parameters.w2 = 0;
  _H522_Curved_169_var._parameters.h2 = 0;
  _H522_Curved_169_var._parameters.l = 35.0 / 35;
  _H522_Curved_169_var._parameters.R0 = gR0;
  _H522_Curved_169_var._parameters.Qc = gQc;
  _H522_Curved_169_var._parameters.alpha = gAlpha;
  _H522_Curved_169_var._parameters.m = 2;
  _H522_Curved_169_var._parameters.W = gW;
  _H522_Curved_169_var._parameters.nslit = 1;
  _H522_Curved_169_var._parameters.d = 0.0005;
  _H522_Curved_169_var._parameters.mleft = -1;
  _H522_Curved_169_var._parameters.mright = -1;
  _H522_Curved_169_var._parameters.mtop = -1;
  _H522_Curved_169_var._parameters.mbottom = -1;
  _H522_Curved_169_var._parameters.nhslit = 1;
  _H522_Curved_169_var._parameters.G = 0;
  _H522_Curved_169_var._parameters.aleft = -1;
  _H522_Curved_169_var._parameters.aright = -1;
  _H522_Curved_169_var._parameters.atop = -1;
  _H522_Curved_169_var._parameters.abottom = -1;
  _H522_Curved_169_var._parameters.wavy = 0;
  _H522_Curved_169_var._parameters.wavy_z = 0;
  _H522_Curved_169_var._parameters.wavy_tb = 0;
  _H522_Curved_169_var._parameters.wavy_lr = 0;
  _H522_Curved_169_var._parameters.chamfers = 0;
  _H522_Curved_169_var._parameters.chamfers_z = 0;
  _H522_Curved_169_var._parameters.chamfers_lr = 0;
  _H522_Curved_169_var._parameters.chamfers_tb = 0;
  _H522_Curved_169_var._parameters.nelements = 1;
  _H522_Curved_169_var._parameters.nu = 0;
  _H522_Curved_169_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_169_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_169_var._parameters.reflect[0]='\0';


  /* component H522_Curved_169=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_168_var._rotation_absolute, _H522_Curved_169_var._rotation_absolute);
    rot_transpose(_H522_Curved_168_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_169_var._rotation_absolute, tr1, _H522_Curved_169_var._rotation_relative);
    _H522_Curved_169_var._rotation_is_identity =  rot_test_identity(_H522_Curved_169_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_168 , l ) + gGap);
    rot_transpose(_H522_Curved_168_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_169_var._position_absolute = coords_add(_H522_Curved_168_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_168_var._position_absolute, _H522_Curved_169_var._position_absolute);
    _H522_Curved_169_var._position_relative = rot_apply(_H522_Curved_169_var._rotation_absolute, tc1);
  } /* H522_Curved_169=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_169", _H522_Curved_169_var._position_absolute, _H522_Curved_169_var._rotation_absolute);
  instrument->_position_absolute[169] = _H522_Curved_169_var._position_absolute;
  instrument->_position_relative[169] = _H522_Curved_169_var._position_relative;
    _H522_Curved_169_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_169_var._position_relative);
  instrument->counter_N[169]  = instrument->counter_P[169] = instrument->counter_P2[169] = 0;
  instrument->counter_AbsorbProp[169]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0168_H522_Curved_169", _H522_Curved_169_var._position_absolute, _H522_Curved_169_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0168_H522_Curved_169", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_169_setpos */

/* component H522_Curved_170=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_170_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_170_setpos] component H522_Curved_170=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_170_var._name, "H522_Curved_170", 16384);
  stracpy(_H522_Curved_170_var._type, "Guide_gravity", 16384);
  _H522_Curved_170_var._index=170;
  int current_setpos_index = 170;
  _H522_Curved_170_var._parameters.w1 = 0.12;
  _H522_Curved_170_var._parameters.h1 = 0.12;
  _H522_Curved_170_var._parameters.w2 = 0;
  _H522_Curved_170_var._parameters.h2 = 0;
  _H522_Curved_170_var._parameters.l = 35.0 / 35;
  _H522_Curved_170_var._parameters.R0 = gR0;
  _H522_Curved_170_var._parameters.Qc = gQc;
  _H522_Curved_170_var._parameters.alpha = gAlpha;
  _H522_Curved_170_var._parameters.m = 2;
  _H522_Curved_170_var._parameters.W = gW;
  _H522_Curved_170_var._parameters.nslit = 1;
  _H522_Curved_170_var._parameters.d = 0.0005;
  _H522_Curved_170_var._parameters.mleft = -1;
  _H522_Curved_170_var._parameters.mright = -1;
  _H522_Curved_170_var._parameters.mtop = -1;
  _H522_Curved_170_var._parameters.mbottom = -1;
  _H522_Curved_170_var._parameters.nhslit = 1;
  _H522_Curved_170_var._parameters.G = 0;
  _H522_Curved_170_var._parameters.aleft = -1;
  _H522_Curved_170_var._parameters.aright = -1;
  _H522_Curved_170_var._parameters.atop = -1;
  _H522_Curved_170_var._parameters.abottom = -1;
  _H522_Curved_170_var._parameters.wavy = 0;
  _H522_Curved_170_var._parameters.wavy_z = 0;
  _H522_Curved_170_var._parameters.wavy_tb = 0;
  _H522_Curved_170_var._parameters.wavy_lr = 0;
  _H522_Curved_170_var._parameters.chamfers = 0;
  _H522_Curved_170_var._parameters.chamfers_z = 0;
  _H522_Curved_170_var._parameters.chamfers_lr = 0;
  _H522_Curved_170_var._parameters.chamfers_tb = 0;
  _H522_Curved_170_var._parameters.nelements = 1;
  _H522_Curved_170_var._parameters.nu = 0;
  _H522_Curved_170_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_170_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_170_var._parameters.reflect[0]='\0';


  /* component H522_Curved_170=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_169_var._rotation_absolute, _H522_Curved_170_var._rotation_absolute);
    rot_transpose(_H522_Curved_169_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_170_var._rotation_absolute, tr1, _H522_Curved_170_var._rotation_relative);
    _H522_Curved_170_var._rotation_is_identity =  rot_test_identity(_H522_Curved_170_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_169 , l ) + gGap);
    rot_transpose(_H522_Curved_169_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_170_var._position_absolute = coords_add(_H522_Curved_169_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_169_var._position_absolute, _H522_Curved_170_var._position_absolute);
    _H522_Curved_170_var._position_relative = rot_apply(_H522_Curved_170_var._rotation_absolute, tc1);
  } /* H522_Curved_170=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_170", _H522_Curved_170_var._position_absolute, _H522_Curved_170_var._rotation_absolute);
  instrument->_position_absolute[170] = _H522_Curved_170_var._position_absolute;
  instrument->_position_relative[170] = _H522_Curved_170_var._position_relative;
    _H522_Curved_170_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_170_var._position_relative);
  instrument->counter_N[170]  = instrument->counter_P[170] = instrument->counter_P2[170] = 0;
  instrument->counter_AbsorbProp[170]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0169_H522_Curved_170", _H522_Curved_170_var._position_absolute, _H522_Curved_170_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0169_H522_Curved_170", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_170_setpos */

/* component H522_Curved_171=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_171_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_171_setpos] component H522_Curved_171=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_171_var._name, "H522_Curved_171", 16384);
  stracpy(_H522_Curved_171_var._type, "Guide_gravity", 16384);
  _H522_Curved_171_var._index=171;
  int current_setpos_index = 171;
  _H522_Curved_171_var._parameters.w1 = 0.12;
  _H522_Curved_171_var._parameters.h1 = 0.12;
  _H522_Curved_171_var._parameters.w2 = 0;
  _H522_Curved_171_var._parameters.h2 = 0;
  _H522_Curved_171_var._parameters.l = 35.0 / 35;
  _H522_Curved_171_var._parameters.R0 = gR0;
  _H522_Curved_171_var._parameters.Qc = gQc;
  _H522_Curved_171_var._parameters.alpha = gAlpha;
  _H522_Curved_171_var._parameters.m = 2;
  _H522_Curved_171_var._parameters.W = gW;
  _H522_Curved_171_var._parameters.nslit = 1;
  _H522_Curved_171_var._parameters.d = 0.0005;
  _H522_Curved_171_var._parameters.mleft = -1;
  _H522_Curved_171_var._parameters.mright = -1;
  _H522_Curved_171_var._parameters.mtop = -1;
  _H522_Curved_171_var._parameters.mbottom = -1;
  _H522_Curved_171_var._parameters.nhslit = 1;
  _H522_Curved_171_var._parameters.G = 0;
  _H522_Curved_171_var._parameters.aleft = -1;
  _H522_Curved_171_var._parameters.aright = -1;
  _H522_Curved_171_var._parameters.atop = -1;
  _H522_Curved_171_var._parameters.abottom = -1;
  _H522_Curved_171_var._parameters.wavy = 0;
  _H522_Curved_171_var._parameters.wavy_z = 0;
  _H522_Curved_171_var._parameters.wavy_tb = 0;
  _H522_Curved_171_var._parameters.wavy_lr = 0;
  _H522_Curved_171_var._parameters.chamfers = 0;
  _H522_Curved_171_var._parameters.chamfers_z = 0;
  _H522_Curved_171_var._parameters.chamfers_lr = 0;
  _H522_Curved_171_var._parameters.chamfers_tb = 0;
  _H522_Curved_171_var._parameters.nelements = 1;
  _H522_Curved_171_var._parameters.nu = 0;
  _H522_Curved_171_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_171_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_171_var._parameters.reflect[0]='\0';


  /* component H522_Curved_171=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_170_var._rotation_absolute, _H522_Curved_171_var._rotation_absolute);
    rot_transpose(_H522_Curved_170_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_171_var._rotation_absolute, tr1, _H522_Curved_171_var._rotation_relative);
    _H522_Curved_171_var._rotation_is_identity =  rot_test_identity(_H522_Curved_171_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_170 , l ) + gGap);
    rot_transpose(_H522_Curved_170_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_171_var._position_absolute = coords_add(_H522_Curved_170_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_170_var._position_absolute, _H522_Curved_171_var._position_absolute);
    _H522_Curved_171_var._position_relative = rot_apply(_H522_Curved_171_var._rotation_absolute, tc1);
  } /* H522_Curved_171=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_171", _H522_Curved_171_var._position_absolute, _H522_Curved_171_var._rotation_absolute);
  instrument->_position_absolute[171] = _H522_Curved_171_var._position_absolute;
  instrument->_position_relative[171] = _H522_Curved_171_var._position_relative;
    _H522_Curved_171_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_171_var._position_relative);
  instrument->counter_N[171]  = instrument->counter_P[171] = instrument->counter_P2[171] = 0;
  instrument->counter_AbsorbProp[171]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0170_H522_Curved_171", _H522_Curved_171_var._position_absolute, _H522_Curved_171_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0170_H522_Curved_171", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_171_setpos */

/* component H522_Curved_172=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_172_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_172_setpos] component H522_Curved_172=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_172_var._name, "H522_Curved_172", 16384);
  stracpy(_H522_Curved_172_var._type, "Guide_gravity", 16384);
  _H522_Curved_172_var._index=172;
  int current_setpos_index = 172;
  _H522_Curved_172_var._parameters.w1 = 0.12;
  _H522_Curved_172_var._parameters.h1 = 0.12;
  _H522_Curved_172_var._parameters.w2 = 0;
  _H522_Curved_172_var._parameters.h2 = 0;
  _H522_Curved_172_var._parameters.l = 35.0 / 35;
  _H522_Curved_172_var._parameters.R0 = gR0;
  _H522_Curved_172_var._parameters.Qc = gQc;
  _H522_Curved_172_var._parameters.alpha = gAlpha;
  _H522_Curved_172_var._parameters.m = 2;
  _H522_Curved_172_var._parameters.W = gW;
  _H522_Curved_172_var._parameters.nslit = 1;
  _H522_Curved_172_var._parameters.d = 0.0005;
  _H522_Curved_172_var._parameters.mleft = -1;
  _H522_Curved_172_var._parameters.mright = -1;
  _H522_Curved_172_var._parameters.mtop = -1;
  _H522_Curved_172_var._parameters.mbottom = -1;
  _H522_Curved_172_var._parameters.nhslit = 1;
  _H522_Curved_172_var._parameters.G = 0;
  _H522_Curved_172_var._parameters.aleft = -1;
  _H522_Curved_172_var._parameters.aright = -1;
  _H522_Curved_172_var._parameters.atop = -1;
  _H522_Curved_172_var._parameters.abottom = -1;
  _H522_Curved_172_var._parameters.wavy = 0;
  _H522_Curved_172_var._parameters.wavy_z = 0;
  _H522_Curved_172_var._parameters.wavy_tb = 0;
  _H522_Curved_172_var._parameters.wavy_lr = 0;
  _H522_Curved_172_var._parameters.chamfers = 0;
  _H522_Curved_172_var._parameters.chamfers_z = 0;
  _H522_Curved_172_var._parameters.chamfers_lr = 0;
  _H522_Curved_172_var._parameters.chamfers_tb = 0;
  _H522_Curved_172_var._parameters.nelements = 1;
  _H522_Curved_172_var._parameters.nu = 0;
  _H522_Curved_172_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_172_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_172_var._parameters.reflect[0]='\0';


  /* component H522_Curved_172=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_171_var._rotation_absolute, _H522_Curved_172_var._rotation_absolute);
    rot_transpose(_H522_Curved_171_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_172_var._rotation_absolute, tr1, _H522_Curved_172_var._rotation_relative);
    _H522_Curved_172_var._rotation_is_identity =  rot_test_identity(_H522_Curved_172_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_171 , l ) + gGap);
    rot_transpose(_H522_Curved_171_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_172_var._position_absolute = coords_add(_H522_Curved_171_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_171_var._position_absolute, _H522_Curved_172_var._position_absolute);
    _H522_Curved_172_var._position_relative = rot_apply(_H522_Curved_172_var._rotation_absolute, tc1);
  } /* H522_Curved_172=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_172", _H522_Curved_172_var._position_absolute, _H522_Curved_172_var._rotation_absolute);
  instrument->_position_absolute[172] = _H522_Curved_172_var._position_absolute;
  instrument->_position_relative[172] = _H522_Curved_172_var._position_relative;
    _H522_Curved_172_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_172_var._position_relative);
  instrument->counter_N[172]  = instrument->counter_P[172] = instrument->counter_P2[172] = 0;
  instrument->counter_AbsorbProp[172]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0171_H522_Curved_172", _H522_Curved_172_var._position_absolute, _H522_Curved_172_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0171_H522_Curved_172", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_172_setpos */

/* component H522_Curved_173=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_173_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_173_setpos] component H522_Curved_173=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_173_var._name, "H522_Curved_173", 16384);
  stracpy(_H522_Curved_173_var._type, "Guide_gravity", 16384);
  _H522_Curved_173_var._index=173;
  int current_setpos_index = 173;
  _H522_Curved_173_var._parameters.w1 = 0.12;
  _H522_Curved_173_var._parameters.h1 = 0.12;
  _H522_Curved_173_var._parameters.w2 = 0;
  _H522_Curved_173_var._parameters.h2 = 0;
  _H522_Curved_173_var._parameters.l = 35.0 / 35;
  _H522_Curved_173_var._parameters.R0 = gR0;
  _H522_Curved_173_var._parameters.Qc = gQc;
  _H522_Curved_173_var._parameters.alpha = gAlpha;
  _H522_Curved_173_var._parameters.m = 2;
  _H522_Curved_173_var._parameters.W = gW;
  _H522_Curved_173_var._parameters.nslit = 1;
  _H522_Curved_173_var._parameters.d = 0.0005;
  _H522_Curved_173_var._parameters.mleft = -1;
  _H522_Curved_173_var._parameters.mright = -1;
  _H522_Curved_173_var._parameters.mtop = -1;
  _H522_Curved_173_var._parameters.mbottom = -1;
  _H522_Curved_173_var._parameters.nhslit = 1;
  _H522_Curved_173_var._parameters.G = 0;
  _H522_Curved_173_var._parameters.aleft = -1;
  _H522_Curved_173_var._parameters.aright = -1;
  _H522_Curved_173_var._parameters.atop = -1;
  _H522_Curved_173_var._parameters.abottom = -1;
  _H522_Curved_173_var._parameters.wavy = 0;
  _H522_Curved_173_var._parameters.wavy_z = 0;
  _H522_Curved_173_var._parameters.wavy_tb = 0;
  _H522_Curved_173_var._parameters.wavy_lr = 0;
  _H522_Curved_173_var._parameters.chamfers = 0;
  _H522_Curved_173_var._parameters.chamfers_z = 0;
  _H522_Curved_173_var._parameters.chamfers_lr = 0;
  _H522_Curved_173_var._parameters.chamfers_tb = 0;
  _H522_Curved_173_var._parameters.nelements = 1;
  _H522_Curved_173_var._parameters.nu = 0;
  _H522_Curved_173_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_173_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_173_var._parameters.reflect[0]='\0';


  /* component H522_Curved_173=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_172_var._rotation_absolute, _H522_Curved_173_var._rotation_absolute);
    rot_transpose(_H522_Curved_172_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_173_var._rotation_absolute, tr1, _H522_Curved_173_var._rotation_relative);
    _H522_Curved_173_var._rotation_is_identity =  rot_test_identity(_H522_Curved_173_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_172 , l ) + gGap);
    rot_transpose(_H522_Curved_172_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_173_var._position_absolute = coords_add(_H522_Curved_172_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_172_var._position_absolute, _H522_Curved_173_var._position_absolute);
    _H522_Curved_173_var._position_relative = rot_apply(_H522_Curved_173_var._rotation_absolute, tc1);
  } /* H522_Curved_173=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_173", _H522_Curved_173_var._position_absolute, _H522_Curved_173_var._rotation_absolute);
  instrument->_position_absolute[173] = _H522_Curved_173_var._position_absolute;
  instrument->_position_relative[173] = _H522_Curved_173_var._position_relative;
    _H522_Curved_173_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_173_var._position_relative);
  instrument->counter_N[173]  = instrument->counter_P[173] = instrument->counter_P2[173] = 0;
  instrument->counter_AbsorbProp[173]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0172_H522_Curved_173", _H522_Curved_173_var._position_absolute, _H522_Curved_173_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0172_H522_Curved_173", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_173_setpos */

/* component H522_Curved_174=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_174_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_174_setpos] component H522_Curved_174=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_174_var._name, "H522_Curved_174", 16384);
  stracpy(_H522_Curved_174_var._type, "Guide_gravity", 16384);
  _H522_Curved_174_var._index=174;
  int current_setpos_index = 174;
  _H522_Curved_174_var._parameters.w1 = 0.12;
  _H522_Curved_174_var._parameters.h1 = 0.12;
  _H522_Curved_174_var._parameters.w2 = 0;
  _H522_Curved_174_var._parameters.h2 = 0;
  _H522_Curved_174_var._parameters.l = 35.0 / 35;
  _H522_Curved_174_var._parameters.R0 = gR0;
  _H522_Curved_174_var._parameters.Qc = gQc;
  _H522_Curved_174_var._parameters.alpha = gAlpha;
  _H522_Curved_174_var._parameters.m = 2;
  _H522_Curved_174_var._parameters.W = gW;
  _H522_Curved_174_var._parameters.nslit = 1;
  _H522_Curved_174_var._parameters.d = 0.0005;
  _H522_Curved_174_var._parameters.mleft = -1;
  _H522_Curved_174_var._parameters.mright = -1;
  _H522_Curved_174_var._parameters.mtop = -1;
  _H522_Curved_174_var._parameters.mbottom = -1;
  _H522_Curved_174_var._parameters.nhslit = 1;
  _H522_Curved_174_var._parameters.G = 0;
  _H522_Curved_174_var._parameters.aleft = -1;
  _H522_Curved_174_var._parameters.aright = -1;
  _H522_Curved_174_var._parameters.atop = -1;
  _H522_Curved_174_var._parameters.abottom = -1;
  _H522_Curved_174_var._parameters.wavy = 0;
  _H522_Curved_174_var._parameters.wavy_z = 0;
  _H522_Curved_174_var._parameters.wavy_tb = 0;
  _H522_Curved_174_var._parameters.wavy_lr = 0;
  _H522_Curved_174_var._parameters.chamfers = 0;
  _H522_Curved_174_var._parameters.chamfers_z = 0;
  _H522_Curved_174_var._parameters.chamfers_lr = 0;
  _H522_Curved_174_var._parameters.chamfers_tb = 0;
  _H522_Curved_174_var._parameters.nelements = 1;
  _H522_Curved_174_var._parameters.nu = 0;
  _H522_Curved_174_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_174_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_174_var._parameters.reflect[0]='\0';


  /* component H522_Curved_174=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_173_var._rotation_absolute, _H522_Curved_174_var._rotation_absolute);
    rot_transpose(_H522_Curved_173_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_174_var._rotation_absolute, tr1, _H522_Curved_174_var._rotation_relative);
    _H522_Curved_174_var._rotation_is_identity =  rot_test_identity(_H522_Curved_174_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_173 , l ) + gGap);
    rot_transpose(_H522_Curved_173_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_174_var._position_absolute = coords_add(_H522_Curved_173_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_173_var._position_absolute, _H522_Curved_174_var._position_absolute);
    _H522_Curved_174_var._position_relative = rot_apply(_H522_Curved_174_var._rotation_absolute, tc1);
  } /* H522_Curved_174=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_174", _H522_Curved_174_var._position_absolute, _H522_Curved_174_var._rotation_absolute);
  instrument->_position_absolute[174] = _H522_Curved_174_var._position_absolute;
  instrument->_position_relative[174] = _H522_Curved_174_var._position_relative;
    _H522_Curved_174_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_174_var._position_relative);
  instrument->counter_N[174]  = instrument->counter_P[174] = instrument->counter_P2[174] = 0;
  instrument->counter_AbsorbProp[174]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0173_H522_Curved_174", _H522_Curved_174_var._position_absolute, _H522_Curved_174_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0173_H522_Curved_174", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_174_setpos */

/* component H522_Curved_175=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_175_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_175_setpos] component H522_Curved_175=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_175_var._name, "H522_Curved_175", 16384);
  stracpy(_H522_Curved_175_var._type, "Guide_gravity", 16384);
  _H522_Curved_175_var._index=175;
  int current_setpos_index = 175;
  _H522_Curved_175_var._parameters.w1 = 0.12;
  _H522_Curved_175_var._parameters.h1 = 0.12;
  _H522_Curved_175_var._parameters.w2 = 0;
  _H522_Curved_175_var._parameters.h2 = 0;
  _H522_Curved_175_var._parameters.l = 35.0 / 35;
  _H522_Curved_175_var._parameters.R0 = gR0;
  _H522_Curved_175_var._parameters.Qc = gQc;
  _H522_Curved_175_var._parameters.alpha = gAlpha;
  _H522_Curved_175_var._parameters.m = 2;
  _H522_Curved_175_var._parameters.W = gW;
  _H522_Curved_175_var._parameters.nslit = 1;
  _H522_Curved_175_var._parameters.d = 0.0005;
  _H522_Curved_175_var._parameters.mleft = -1;
  _H522_Curved_175_var._parameters.mright = -1;
  _H522_Curved_175_var._parameters.mtop = -1;
  _H522_Curved_175_var._parameters.mbottom = -1;
  _H522_Curved_175_var._parameters.nhslit = 1;
  _H522_Curved_175_var._parameters.G = 0;
  _H522_Curved_175_var._parameters.aleft = -1;
  _H522_Curved_175_var._parameters.aright = -1;
  _H522_Curved_175_var._parameters.atop = -1;
  _H522_Curved_175_var._parameters.abottom = -1;
  _H522_Curved_175_var._parameters.wavy = 0;
  _H522_Curved_175_var._parameters.wavy_z = 0;
  _H522_Curved_175_var._parameters.wavy_tb = 0;
  _H522_Curved_175_var._parameters.wavy_lr = 0;
  _H522_Curved_175_var._parameters.chamfers = 0;
  _H522_Curved_175_var._parameters.chamfers_z = 0;
  _H522_Curved_175_var._parameters.chamfers_lr = 0;
  _H522_Curved_175_var._parameters.chamfers_tb = 0;
  _H522_Curved_175_var._parameters.nelements = 1;
  _H522_Curved_175_var._parameters.nu = 0;
  _H522_Curved_175_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_175_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_175_var._parameters.reflect[0]='\0';


  /* component H522_Curved_175=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_174_var._rotation_absolute, _H522_Curved_175_var._rotation_absolute);
    rot_transpose(_H522_Curved_174_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_175_var._rotation_absolute, tr1, _H522_Curved_175_var._rotation_relative);
    _H522_Curved_175_var._rotation_is_identity =  rot_test_identity(_H522_Curved_175_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_174 , l ) + gGap);
    rot_transpose(_H522_Curved_174_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_175_var._position_absolute = coords_add(_H522_Curved_174_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_174_var._position_absolute, _H522_Curved_175_var._position_absolute);
    _H522_Curved_175_var._position_relative = rot_apply(_H522_Curved_175_var._rotation_absolute, tc1);
  } /* H522_Curved_175=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_175", _H522_Curved_175_var._position_absolute, _H522_Curved_175_var._rotation_absolute);
  instrument->_position_absolute[175] = _H522_Curved_175_var._position_absolute;
  instrument->_position_relative[175] = _H522_Curved_175_var._position_relative;
    _H522_Curved_175_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_175_var._position_relative);
  instrument->counter_N[175]  = instrument->counter_P[175] = instrument->counter_P2[175] = 0;
  instrument->counter_AbsorbProp[175]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0174_H522_Curved_175", _H522_Curved_175_var._position_absolute, _H522_Curved_175_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0174_H522_Curved_175", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_175_setpos */

/* component H522_Curved_176=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_176_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_176_setpos] component H522_Curved_176=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_176_var._name, "H522_Curved_176", 16384);
  stracpy(_H522_Curved_176_var._type, "Guide_gravity", 16384);
  _H522_Curved_176_var._index=176;
  int current_setpos_index = 176;
  _H522_Curved_176_var._parameters.w1 = 0.12;
  _H522_Curved_176_var._parameters.h1 = 0.12;
  _H522_Curved_176_var._parameters.w2 = 0;
  _H522_Curved_176_var._parameters.h2 = 0;
  _H522_Curved_176_var._parameters.l = 35.0 / 35;
  _H522_Curved_176_var._parameters.R0 = gR0;
  _H522_Curved_176_var._parameters.Qc = gQc;
  _H522_Curved_176_var._parameters.alpha = gAlpha;
  _H522_Curved_176_var._parameters.m = 2;
  _H522_Curved_176_var._parameters.W = gW;
  _H522_Curved_176_var._parameters.nslit = 1;
  _H522_Curved_176_var._parameters.d = 0.0005;
  _H522_Curved_176_var._parameters.mleft = -1;
  _H522_Curved_176_var._parameters.mright = -1;
  _H522_Curved_176_var._parameters.mtop = -1;
  _H522_Curved_176_var._parameters.mbottom = -1;
  _H522_Curved_176_var._parameters.nhslit = 1;
  _H522_Curved_176_var._parameters.G = 0;
  _H522_Curved_176_var._parameters.aleft = -1;
  _H522_Curved_176_var._parameters.aright = -1;
  _H522_Curved_176_var._parameters.atop = -1;
  _H522_Curved_176_var._parameters.abottom = -1;
  _H522_Curved_176_var._parameters.wavy = 0;
  _H522_Curved_176_var._parameters.wavy_z = 0;
  _H522_Curved_176_var._parameters.wavy_tb = 0;
  _H522_Curved_176_var._parameters.wavy_lr = 0;
  _H522_Curved_176_var._parameters.chamfers = 0;
  _H522_Curved_176_var._parameters.chamfers_z = 0;
  _H522_Curved_176_var._parameters.chamfers_lr = 0;
  _H522_Curved_176_var._parameters.chamfers_tb = 0;
  _H522_Curved_176_var._parameters.nelements = 1;
  _H522_Curved_176_var._parameters.nu = 0;
  _H522_Curved_176_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_176_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_176_var._parameters.reflect[0]='\0';


  /* component H522_Curved_176=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_175_var._rotation_absolute, _H522_Curved_176_var._rotation_absolute);
    rot_transpose(_H522_Curved_175_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_176_var._rotation_absolute, tr1, _H522_Curved_176_var._rotation_relative);
    _H522_Curved_176_var._rotation_is_identity =  rot_test_identity(_H522_Curved_176_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_175 , l ) + gGap);
    rot_transpose(_H522_Curved_175_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_176_var._position_absolute = coords_add(_H522_Curved_175_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_175_var._position_absolute, _H522_Curved_176_var._position_absolute);
    _H522_Curved_176_var._position_relative = rot_apply(_H522_Curved_176_var._rotation_absolute, tc1);
  } /* H522_Curved_176=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_176", _H522_Curved_176_var._position_absolute, _H522_Curved_176_var._rotation_absolute);
  instrument->_position_absolute[176] = _H522_Curved_176_var._position_absolute;
  instrument->_position_relative[176] = _H522_Curved_176_var._position_relative;
    _H522_Curved_176_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_176_var._position_relative);
  instrument->counter_N[176]  = instrument->counter_P[176] = instrument->counter_P2[176] = 0;
  instrument->counter_AbsorbProp[176]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0175_H522_Curved_176", _H522_Curved_176_var._position_absolute, _H522_Curved_176_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0175_H522_Curved_176", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_176_setpos */

/* component H522_Curved_177=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Curved_177_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_177_setpos] component H522_Curved_177=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Curved_177_var._name, "H522_Curved_177", 16384);
  stracpy(_H522_Curved_177_var._type, "Guide_gravity", 16384);
  _H522_Curved_177_var._index=177;
  int current_setpos_index = 177;
  _H522_Curved_177_var._parameters.w1 = 0.12;
  _H522_Curved_177_var._parameters.h1 = 0.12;
  _H522_Curved_177_var._parameters.w2 = 0;
  _H522_Curved_177_var._parameters.h2 = 0;
  _H522_Curved_177_var._parameters.l = 35.0 / 35;
  _H522_Curved_177_var._parameters.R0 = gR0;
  _H522_Curved_177_var._parameters.Qc = gQc;
  _H522_Curved_177_var._parameters.alpha = gAlpha;
  _H522_Curved_177_var._parameters.m = 2;
  _H522_Curved_177_var._parameters.W = gW;
  _H522_Curved_177_var._parameters.nslit = 1;
  _H522_Curved_177_var._parameters.d = 0.0005;
  _H522_Curved_177_var._parameters.mleft = -1;
  _H522_Curved_177_var._parameters.mright = -1;
  _H522_Curved_177_var._parameters.mtop = -1;
  _H522_Curved_177_var._parameters.mbottom = -1;
  _H522_Curved_177_var._parameters.nhslit = 1;
  _H522_Curved_177_var._parameters.G = 0;
  _H522_Curved_177_var._parameters.aleft = -1;
  _H522_Curved_177_var._parameters.aright = -1;
  _H522_Curved_177_var._parameters.atop = -1;
  _H522_Curved_177_var._parameters.abottom = -1;
  _H522_Curved_177_var._parameters.wavy = 0;
  _H522_Curved_177_var._parameters.wavy_z = 0;
  _H522_Curved_177_var._parameters.wavy_tb = 0;
  _H522_Curved_177_var._parameters.wavy_lr = 0;
  _H522_Curved_177_var._parameters.chamfers = 0;
  _H522_Curved_177_var._parameters.chamfers_z = 0;
  _H522_Curved_177_var._parameters.chamfers_lr = 0;
  _H522_Curved_177_var._parameters.chamfers_tb = 0;
  _H522_Curved_177_var._parameters.nelements = 1;
  _H522_Curved_177_var._parameters.nu = 0;
  _H522_Curved_177_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_177_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_177_var._parameters.reflect[0]='\0';


  /* component H522_Curved_177=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (35.0 / 35 / 4000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_176_var._rotation_absolute, _H522_Curved_177_var._rotation_absolute);
    rot_transpose(_H522_Curved_176_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_177_var._rotation_absolute, tr1, _H522_Curved_177_var._rotation_relative);
    _H522_Curved_177_var._rotation_is_identity =  rot_test_identity(_H522_Curved_177_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_176 , l ) + gGap);
    rot_transpose(_H522_Curved_176_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_177_var._position_absolute = coords_add(_H522_Curved_176_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_176_var._position_absolute, _H522_Curved_177_var._position_absolute);
    _H522_Curved_177_var._position_relative = rot_apply(_H522_Curved_177_var._rotation_absolute, tc1);
  } /* H522_Curved_177=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_177", _H522_Curved_177_var._position_absolute, _H522_Curved_177_var._rotation_absolute);
  instrument->_position_absolute[177] = _H522_Curved_177_var._position_absolute;
  instrument->_position_relative[177] = _H522_Curved_177_var._position_relative;
    _H522_Curved_177_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_177_var._position_relative);
  instrument->counter_N[177]  = instrument->counter_P[177] = instrument->counter_P2[177] = 0;
  instrument->counter_AbsorbProp[177]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0176_H522_Curved_177", _H522_Curved_177_var._position_absolute, _H522_Curved_177_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "w1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "l", "NONE", "35.0 / 35","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "m", "1.0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0176_H522_Curved_177", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_177_setpos */

/* component HCS_Al_178=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_178_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_178_setpos] component HCS_Al_178=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_178_var._name, "HCS_Al_178", 16384);
  stracpy(_HCS_Al_178_var._type, "PowderN", 16384);
  _HCS_Al_178_var._index=178;
  int current_setpos_index = 178;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_178_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_178_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_178_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_178_var._parameters.geometry[0]='\0';
  _HCS_Al_178_var._parameters.format[0] = 0;
  _HCS_Al_178_var._parameters.format[1] = 0;
  _HCS_Al_178_var._parameters.format[2] = 0;
  _HCS_Al_178_var._parameters.format[3] = 0;
  _HCS_Al_178_var._parameters.format[4] = 0;
  _HCS_Al_178_var._parameters.format[5] = 0;
  _HCS_Al_178_var._parameters.format[6] = 0;
  _HCS_Al_178_var._parameters.format[7] = 0;
  _HCS_Al_178_var._parameters.format[8] = 0;
  _HCS_Al_178_var._parameters.radius = 0;
  _HCS_Al_178_var._parameters.yheight = 0.12;
  _HCS_Al_178_var._parameters.xwidth = 0.12;
  _HCS_Al_178_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_178_var._parameters.thickness = 0;
  _HCS_Al_178_var._parameters.pack = 1;
  _HCS_Al_178_var._parameters.Vc = 0;
  _HCS_Al_178_var._parameters.sigma_abs = 0;
  _HCS_Al_178_var._parameters.sigma_inc = 0;
  _HCS_Al_178_var._parameters.delta_d_d = 0;
  _HCS_Al_178_var._parameters.p_inc = 0.005;
  _HCS_Al_178_var._parameters.p_transmit = 0.9450;
  _HCS_Al_178_var._parameters.DW = 0;
  _HCS_Al_178_var._parameters.nb_atoms = 1;
  _HCS_Al_178_var._parameters.d_omega = 0;
  _HCS_Al_178_var._parameters.d_phi = 10;
  _HCS_Al_178_var._parameters.tth_sign = 0;
  _HCS_Al_178_var._parameters.p_interact = 0.05;
  _HCS_Al_178_var._parameters.concentric = 0;
  _HCS_Al_178_var._parameters.density = 0;
  _HCS_Al_178_var._parameters.weight = 0;
  _HCS_Al_178_var._parameters.barns = 1;
  _HCS_Al_178_var._parameters.Strain = 0;
  _HCS_Al_178_var._parameters.focus_flip = 0;
  _HCS_Al_178_var._parameters.target_index = 0;
  _HCS_Al_178_var._parameters.order = 1;


  /* component HCS_Al_178=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_177_var._rotation_absolute, _HCS_Al_178_var._rotation_absolute);
    rot_transpose(_H522_Curved_177_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_178_var._rotation_absolute, tr1, _HCS_Al_178_var._rotation_relative);
    _HCS_Al_178_var._rotation_is_identity =  rot_test_identity(_HCS_Al_178_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H522_Curved_177 , l ) + gGap + 0.001);
    rot_transpose(_H522_Curved_177_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_178_var._position_absolute = coords_add(_H522_Curved_177_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_177_var._position_absolute, _HCS_Al_178_var._position_absolute);
    _HCS_Al_178_var._position_relative = rot_apply(_HCS_Al_178_var._rotation_absolute, tc1);
  } /* HCS_Al_178=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_178", _HCS_Al_178_var._position_absolute, _HCS_Al_178_var._rotation_absolute);
  instrument->_position_absolute[178] = _HCS_Al_178_var._position_absolute;
  instrument->_position_relative[178] = _HCS_Al_178_var._position_relative;
    _HCS_Al_178_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_178_var._position_relative);
  instrument->counter_N[178]  = instrument->counter_P[178] = instrument->counter_P2[178] = 0;
  instrument->counter_AbsorbProp[178]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0177_HCS_Al_178", _HCS_Al_178_var._position_absolute, _HCS_Al_178_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "xwidth", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0177_HCS_Al_178", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_178_setpos */

/* component H522_Curved_Out_XY=Monitor_nD() SETTING, POSITION/ROTATION */
int _H522_Curved_Out_XY_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_Out_XY_setpos] component H522_Curved_Out_XY=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H522_Curved_Out_XY_var._name, "H522_Curved_Out_XY", 16384);
  stracpy(_H522_Curved_Out_XY_var._type, "Monitor_nD", 16384);
  _H522_Curved_Out_XY_var._index=179;
  int current_setpos_index = 179;
  if("" && strlen(""))
    stracpy(_H522_Curved_Out_XY_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H522_Curved_Out_XY_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_Curved_Out_XY_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H522_Curved_Out_XY_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_Curved_Out_XY_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H522_Curved_Out_XY_var._parameters.user3[0]='\0';
  _H522_Curved_Out_XY_var._parameters.xwidth = 0.12;
  _H522_Curved_Out_XY_var._parameters.yheight = 0.12;
  _H522_Curved_Out_XY_var._parameters.zdepth = 0;
  _H522_Curved_Out_XY_var._parameters.xmin = 0;
  _H522_Curved_Out_XY_var._parameters.xmax = 0;
  _H522_Curved_Out_XY_var._parameters.ymin = 0;
  _H522_Curved_Out_XY_var._parameters.ymax = 0;
  _H522_Curved_Out_XY_var._parameters.zmin = 0;
  _H522_Curved_Out_XY_var._parameters.zmax = 0;
  _H522_Curved_Out_XY_var._parameters.bins = 0;
  _H522_Curved_Out_XY_var._parameters.min = -1e40;
  _H522_Curved_Out_XY_var._parameters.max = 1e40;
  _H522_Curved_Out_XY_var._parameters.restore_neutron = 1;
  _H522_Curved_Out_XY_var._parameters.radius = 0;
  if("x y" && strlen("x y"))
    stracpy(_H522_Curved_Out_XY_var._parameters.options, "x y" ? "x y" : "", 16384);
  else 
  _H522_Curved_Out_XY_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_Out_XY_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_Out_XY_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_Out_XY_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_Out_XY_var._parameters.geometry[0]='\0';
  _H522_Curved_Out_XY_var._parameters.nowritefile = 0;
  _H522_Curved_Out_XY_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_Out_XY_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_Out_XY_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_Out_XY_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_Out_XY_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_Out_XY_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_Out_XY_var._parameters.username3[0]='\0';


  /* component H522_Curved_Out_XY=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_178_var._rotation_absolute, _H522_Curved_Out_XY_var._rotation_absolute);
    rot_transpose(_HCS_Al_178_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_Out_XY_var._rotation_absolute, tr1, _H522_Curved_Out_XY_var._rotation_relative);
    _H522_Curved_Out_XY_var._rotation_is_identity =  rot_test_identity(_H522_Curved_Out_XY_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.01 + gGap);
    rot_transpose(_HCS_Al_178_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_Out_XY_var._position_absolute = coords_add(_HCS_Al_178_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_178_var._position_absolute, _H522_Curved_Out_XY_var._position_absolute);
    _H522_Curved_Out_XY_var._position_relative = rot_apply(_H522_Curved_Out_XY_var._rotation_absolute, tc1);
  } /* H522_Curved_Out_XY=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_Out_XY", _H522_Curved_Out_XY_var._position_absolute, _H522_Curved_Out_XY_var._rotation_absolute);
  instrument->_position_absolute[179] = _H522_Curved_Out_XY_var._position_absolute;
  instrument->_position_relative[179] = _H522_Curved_Out_XY_var._position_relative;
    _H522_Curved_Out_XY_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_Out_XY_var._position_relative);
  instrument->counter_N[179]  = instrument->counter_P[179] = instrument->counter_P2[179] = 0;
  instrument->counter_AbsorbProp[179]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0178_H522_Curved_Out_XY", _H522_Curved_Out_XY_var._position_absolute, _H522_Curved_Out_XY_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "xwidth", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "options", "NULL", "x y", "char*");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0178_H522_Curved_Out_XY", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_Out_XY_setpos */

/* component H522_Curved_Out_XL=Monitor_nD() SETTING, POSITION/ROTATION */
int _H522_Curved_Out_XL_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Curved_Out_XL_setpos] component H522_Curved_Out_XL=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H522_Curved_Out_XL_var._name, "H522_Curved_Out_XL", 16384);
  stracpy(_H522_Curved_Out_XL_var._type, "Monitor_nD", 16384);
  _H522_Curved_Out_XL_var._index=180;
  int current_setpos_index = 180;
  if("" && strlen(""))
    stracpy(_H522_Curved_Out_XL_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H522_Curved_Out_XL_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_Curved_Out_XL_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H522_Curved_Out_XL_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_Curved_Out_XL_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H522_Curved_Out_XL_var._parameters.user3[0]='\0';
  _H522_Curved_Out_XL_var._parameters.xwidth = 0.12;
  _H522_Curved_Out_XL_var._parameters.yheight = 0.12;
  _H522_Curved_Out_XL_var._parameters.zdepth = 0;
  _H522_Curved_Out_XL_var._parameters.xmin = 0;
  _H522_Curved_Out_XL_var._parameters.xmax = 0;
  _H522_Curved_Out_XL_var._parameters.ymin = 0;
  _H522_Curved_Out_XL_var._parameters.ymax = 0;
  _H522_Curved_Out_XL_var._parameters.zmin = 0;
  _H522_Curved_Out_XL_var._parameters.zmax = 0;
  _H522_Curved_Out_XL_var._parameters.bins = 50;
  _H522_Curved_Out_XL_var._parameters.min = -1e40;
  _H522_Curved_Out_XL_var._parameters.max = 1e40;
  _H522_Curved_Out_XL_var._parameters.restore_neutron = 1;
  _H522_Curved_Out_XL_var._parameters.radius = 0;
  if("x, lambda limits=[1 10]" && strlen("x, lambda limits=[1 10]"))
    stracpy(_H522_Curved_Out_XL_var._parameters.options, "x, lambda limits=[1 10]" ? "x, lambda limits=[1 10]" : "", 16384);
  else 
  _H522_Curved_Out_XL_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_Out_XL_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_Out_XL_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_Out_XL_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_Out_XL_var._parameters.geometry[0]='\0';
  _H522_Curved_Out_XL_var._parameters.nowritefile = 0;
  _H522_Curved_Out_XL_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_Out_XL_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_Out_XL_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_Out_XL_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_Out_XL_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Curved_Out_XL_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Curved_Out_XL_var._parameters.username3[0]='\0';


  /* component H522_Curved_Out_XL=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_Out_XY_var._rotation_absolute, _H522_Curved_Out_XL_var._rotation_absolute);
    rot_transpose(_H522_Curved_Out_XY_var._rotation_absolute, tr1);
    rot_mul(_H522_Curved_Out_XL_var._rotation_absolute, tr1, _H522_Curved_Out_XL_var._rotation_relative);
    _H522_Curved_Out_XL_var._rotation_is_identity =  rot_test_identity(_H522_Curved_Out_XL_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H522_Curved_Out_XY_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Curved_Out_XL_var._position_absolute = coords_add(_H522_Curved_Out_XY_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_Out_XY_var._position_absolute, _H522_Curved_Out_XL_var._position_absolute);
    _H522_Curved_Out_XL_var._position_relative = rot_apply(_H522_Curved_Out_XL_var._rotation_absolute, tc1);
  } /* H522_Curved_Out_XL=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H522_Curved_Out_XL", _H522_Curved_Out_XL_var._position_absolute, _H522_Curved_Out_XL_var._rotation_absolute);
  instrument->_position_absolute[180] = _H522_Curved_Out_XL_var._position_absolute;
  instrument->_position_relative[180] = _H522_Curved_Out_XL_var._position_relative;
    _H522_Curved_Out_XL_var._position_relative_is_zero =  coords_test_zero(_H522_Curved_Out_XL_var._position_relative);
  instrument->counter_N[180]  = instrument->counter_P[180] = instrument->counter_P2[180] = 0;
  instrument->counter_AbsorbProp[180]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0179_H522_Curved_Out_XL", _H522_Curved_Out_XL_var._position_absolute, _H522_Curved_Out_XL_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "xwidth", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "options", "NULL", "x, lambda limits=[1 10]", "char*");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0179_H522_Curved_Out_XL", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Curved_Out_XL_setpos */

/* component WASP_Vselector=V_selector() SETTING, POSITION/ROTATION */
int _WASP_Vselector_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_WASP_Vselector_setpos] component WASP_Vselector=V_selector() SETTING [V_selector:0]");
  stracpy(_WASP_Vselector_var._name, "WASP_Vselector", 16384);
  stracpy(_WASP_Vselector_var._type, "V_selector", 16384);
  _WASP_Vselector_var._index=181;
  int current_setpos_index = 181;
  _WASP_Vselector_var._parameters.xwidth = 0.12;
  _WASP_Vselector_var._parameters.yheight = 0.085;
  _WASP_Vselector_var._parameters.zdepth = 0.60;
  _WASP_Vselector_var._parameters.radius = 0.43 / 2;
  _WASP_Vselector_var._parameters.alpha = 14.2;
  _WASP_Vselector_var._parameters.length = 0.5;
  _WASP_Vselector_var._parameters.d = 0.0004;
  _WASP_Vselector_var._parameters.nu = WASP_nu;
  _WASP_Vselector_var._parameters.nslit = 144;


  /* component WASP_Vselector=V_selector() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (0)*DEG2RAD, (-90)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_Out_XL_var._rotation_absolute, _WASP_Vselector_var._rotation_absolute);
    rot_transpose(_H522_Curved_Out_XL_var._rotation_absolute, tr1);
    rot_mul(_WASP_Vselector_var._rotation_absolute, tr1, _WASP_Vselector_var._rotation_relative);
    _WASP_Vselector_var._rotation_is_identity =  rot_test_identity(_WASP_Vselector_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.31);
    rot_transpose(_H522_Curved_Out_XL_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _WASP_Vselector_var._position_absolute = coords_add(_H522_Curved_Out_XL_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Curved_Out_XL_var._position_absolute, _WASP_Vselector_var._position_absolute);
    _WASP_Vselector_var._position_relative = rot_apply(_WASP_Vselector_var._rotation_absolute, tc1);
  } /* WASP_Vselector=V_selector() AT ROTATED */
  DEBUG_COMPONENT("WASP_Vselector", _WASP_Vselector_var._position_absolute, _WASP_Vselector_var._rotation_absolute);
  instrument->_position_absolute[181] = _WASP_Vselector_var._position_absolute;
  instrument->_position_relative[181] = _WASP_Vselector_var._position_relative;
    _WASP_Vselector_var._position_relative_is_zero =  coords_test_zero(_WASP_Vselector_var._position_relative);
  instrument->counter_N[181]  = instrument->counter_P[181] = instrument->counter_P2[181] = 0;
  instrument->counter_AbsorbProp[181]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0180_WASP_Vselector", _WASP_Vselector_var._position_absolute, _WASP_Vselector_var._rotation_absolute, "V_selector");
        mccomp_param_nexus(nxhandle,"0180_WASP_Vselector", "xwidth", "0.03", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0180_WASP_Vselector", "yheight", "0.05", "0.085","MCNUM");
        mccomp_param_nexus(nxhandle,"0180_WASP_Vselector", "zdepth", "0.30", "0.60","MCNUM");
        mccomp_param_nexus(nxhandle,"0180_WASP_Vselector", "radius", "0.12", "0.43 / 2","MCNUM");
        mccomp_param_nexus(nxhandle,"0180_WASP_Vselector", "alpha", "48.298", "14.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0180_WASP_Vselector", "length", "0.25", "0.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0180_WASP_Vselector", "d", "0.0004", "0.0004","MCNUM");
        mccomp_param_nexus(nxhandle,"0180_WASP_Vselector", "nu", "300", "WASP_nu","MCNUM");
        mccomp_param_nexus(nxhandle,"0180_WASP_Vselector", "nslit", "72", "144","MCNUM");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _WASP_Vselector_setpos */

/* component HCS_Al_182=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_182_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_182_setpos] component HCS_Al_182=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_182_var._name, "HCS_Al_182", 16384);
  stracpy(_HCS_Al_182_var._type, "PowderN", 16384);
  _HCS_Al_182_var._index=182;
  int current_setpos_index = 182;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_182_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_182_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_182_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_182_var._parameters.geometry[0]='\0';
  _HCS_Al_182_var._parameters.format[0] = 0;
  _HCS_Al_182_var._parameters.format[1] = 0;
  _HCS_Al_182_var._parameters.format[2] = 0;
  _HCS_Al_182_var._parameters.format[3] = 0;
  _HCS_Al_182_var._parameters.format[4] = 0;
  _HCS_Al_182_var._parameters.format[5] = 0;
  _HCS_Al_182_var._parameters.format[6] = 0;
  _HCS_Al_182_var._parameters.format[7] = 0;
  _HCS_Al_182_var._parameters.format[8] = 0;
  _HCS_Al_182_var._parameters.radius = 0;
  _HCS_Al_182_var._parameters.yheight = 0.12;
  _HCS_Al_182_var._parameters.xwidth = 0.12;
  _HCS_Al_182_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_182_var._parameters.thickness = 0;
  _HCS_Al_182_var._parameters.pack = 1;
  _HCS_Al_182_var._parameters.Vc = 0;
  _HCS_Al_182_var._parameters.sigma_abs = 0;
  _HCS_Al_182_var._parameters.sigma_inc = 0;
  _HCS_Al_182_var._parameters.delta_d_d = 0;
  _HCS_Al_182_var._parameters.p_inc = 0.005;
  _HCS_Al_182_var._parameters.p_transmit = 0.9450;
  _HCS_Al_182_var._parameters.DW = 0;
  _HCS_Al_182_var._parameters.nb_atoms = 1;
  _HCS_Al_182_var._parameters.d_omega = 0;
  _HCS_Al_182_var._parameters.d_phi = 10;
  _HCS_Al_182_var._parameters.tth_sign = 0;
  _HCS_Al_182_var._parameters.p_interact = 0.05;
  _HCS_Al_182_var._parameters.concentric = 0;
  _HCS_Al_182_var._parameters.density = 0;
  _HCS_Al_182_var._parameters.weight = 0;
  _HCS_Al_182_var._parameters.barns = 1;
  _HCS_Al_182_var._parameters.Strain = 0;
  _HCS_Al_182_var._parameters.focus_flip = 0;
  _HCS_Al_182_var._parameters.target_index = 0;
  _HCS_Al_182_var._parameters.order = 1;


  /* component HCS_Al_182=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H522_Curved_Out_XL_var._rotation_absolute, _HCS_Al_182_var._rotation_absolute);
    rot_transpose(_WASP_Vselector_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_182_var._rotation_absolute, tr1, _HCS_Al_182_var._rotation_relative);
    _HCS_Al_182_var._rotation_is_identity =  rot_test_identity(_HCS_Al_182_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.62);
    rot_transpose(_H522_Curved_Out_XL_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_182_var._position_absolute = coords_add(_H522_Curved_Out_XL_var._position_absolute, tc2);
    tc1 = coords_sub(_WASP_Vselector_var._position_absolute, _HCS_Al_182_var._position_absolute);
    _HCS_Al_182_var._position_relative = rot_apply(_HCS_Al_182_var._rotation_absolute, tc1);
  } /* HCS_Al_182=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_182", _HCS_Al_182_var._position_absolute, _HCS_Al_182_var._rotation_absolute);
  instrument->_position_absolute[182] = _HCS_Al_182_var._position_absolute;
  instrument->_position_relative[182] = _HCS_Al_182_var._position_relative;
    _HCS_Al_182_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_182_var._position_relative);
  instrument->counter_N[182]  = instrument->counter_P[182] = instrument->counter_P2[182] = 0;
  instrument->counter_AbsorbProp[182]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0181_HCS_Al_182", _HCS_Al_182_var._position_absolute, _HCS_Al_182_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "xwidth", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0181_HCS_Al_182", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_182_setpos */

/* component H522_Straight=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Straight_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Straight_setpos] component H522_Straight=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Straight_var._name, "H522_Straight", 16384);
  stracpy(_H522_Straight_var._type, "Guide_gravity", 16384);
  _H522_Straight_var._index=183;
  int current_setpos_index = 183;
  _H522_Straight_var._parameters.w1 = 0.075;
  _H522_Straight_var._parameters.h1 = 0.12;
  _H522_Straight_var._parameters.w2 = 0;
  _H522_Straight_var._parameters.h2 = 0;
  _H522_Straight_var._parameters.l = 25.77;
  _H522_Straight_var._parameters.R0 = 0.995;
  _H522_Straight_var._parameters.Qc = 0.0218;
  _H522_Straight_var._parameters.alpha = 4.38;
  _H522_Straight_var._parameters.m = 1.0;
  _H522_Straight_var._parameters.W = 0.003;
  _H522_Straight_var._parameters.nslit = 1;
  _H522_Straight_var._parameters.d = 0.0005;
  _H522_Straight_var._parameters.mleft = -1;
  _H522_Straight_var._parameters.mright = -1;
  _H522_Straight_var._parameters.mtop = -1;
  _H522_Straight_var._parameters.mbottom = -1;
  _H522_Straight_var._parameters.nhslit = 1;
  _H522_Straight_var._parameters.G = 0;
  _H522_Straight_var._parameters.aleft = -1;
  _H522_Straight_var._parameters.aright = -1;
  _H522_Straight_var._parameters.atop = -1;
  _H522_Straight_var._parameters.abottom = -1;
  _H522_Straight_var._parameters.wavy = 0;
  _H522_Straight_var._parameters.wavy_z = 0;
  _H522_Straight_var._parameters.wavy_tb = 0;
  _H522_Straight_var._parameters.wavy_lr = 0;
  _H522_Straight_var._parameters.chamfers = 0;
  _H522_Straight_var._parameters.chamfers_z = 0;
  _H522_Straight_var._parameters.chamfers_lr = 0;
  _H522_Straight_var._parameters.chamfers_tb = 0;
  _H522_Straight_var._parameters.nelements = 1;
  _H522_Straight_var._parameters.nu = 0;
  _H522_Straight_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Straight_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Straight_var._parameters.reflect[0]='\0';


  /* component H522_Straight=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_182_var._rotation_absolute, _H522_Straight_var._rotation_absolute);
    rot_transpose(_HCS_Al_182_var._rotation_absolute, tr1);
    rot_mul(_H522_Straight_var._rotation_absolute, tr1, _H522_Straight_var._rotation_relative);
    _H522_Straight_var._rotation_is_identity =  rot_test_identity(_H522_Straight_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.01);
    rot_transpose(_HCS_Al_182_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Straight_var._position_absolute = coords_add(_HCS_Al_182_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_182_var._position_absolute, _H522_Straight_var._position_absolute);
    _H522_Straight_var._position_relative = rot_apply(_H522_Straight_var._rotation_absolute, tc1);
  } /* H522_Straight=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Straight", _H522_Straight_var._position_absolute, _H522_Straight_var._rotation_absolute);
  instrument->_position_absolute[183] = _H522_Straight_var._position_absolute;
  instrument->_position_relative[183] = _H522_Straight_var._position_relative;
    _H522_Straight_var._position_relative_is_zero =  coords_test_zero(_H522_Straight_var._position_relative);
  instrument->counter_N[183]  = instrument->counter_P[183] = instrument->counter_P2[183] = 0;
  instrument->counter_AbsorbProp[183]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0182_H522_Straight", _H522_Straight_var._position_absolute, _H522_Straight_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "w1", "NONE", "0.075","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "l", "NONE", "25.77","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "R0", "0.995", "0.995","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "Qc", "0.0218", "0.0218","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "alpha", "4.38", "4.38","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "m", "1.0", "1.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "W", "0.003", "0.003","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0182_H522_Straight", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Straight_setpos */

/* component HCS_Al_184=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_184_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_184_setpos] component HCS_Al_184=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_184_var._name, "HCS_Al_184", 16384);
  stracpy(_HCS_Al_184_var._type, "PowderN", 16384);
  _HCS_Al_184_var._index=184;
  int current_setpos_index = 184;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_184_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_184_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_184_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_184_var._parameters.geometry[0]='\0';
  _HCS_Al_184_var._parameters.format[0] = 0;
  _HCS_Al_184_var._parameters.format[1] = 0;
  _HCS_Al_184_var._parameters.format[2] = 0;
  _HCS_Al_184_var._parameters.format[3] = 0;
  _HCS_Al_184_var._parameters.format[4] = 0;
  _HCS_Al_184_var._parameters.format[5] = 0;
  _HCS_Al_184_var._parameters.format[6] = 0;
  _HCS_Al_184_var._parameters.format[7] = 0;
  _HCS_Al_184_var._parameters.format[8] = 0;
  _HCS_Al_184_var._parameters.radius = 0;
  _HCS_Al_184_var._parameters.yheight = 0.12;
  _HCS_Al_184_var._parameters.xwidth = 0.075;
  _HCS_Al_184_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_184_var._parameters.thickness = 0;
  _HCS_Al_184_var._parameters.pack = 1;
  _HCS_Al_184_var._parameters.Vc = 0;
  _HCS_Al_184_var._parameters.sigma_abs = 0;
  _HCS_Al_184_var._parameters.sigma_inc = 0;
  _HCS_Al_184_var._parameters.delta_d_d = 0;
  _HCS_Al_184_var._parameters.p_inc = 0.005;
  _HCS_Al_184_var._parameters.p_transmit = 0.9450;
  _HCS_Al_184_var._parameters.DW = 0;
  _HCS_Al_184_var._parameters.nb_atoms = 1;
  _HCS_Al_184_var._parameters.d_omega = 0;
  _HCS_Al_184_var._parameters.d_phi = 10;
  _HCS_Al_184_var._parameters.tth_sign = 0;
  _HCS_Al_184_var._parameters.p_interact = 0.05;
  _HCS_Al_184_var._parameters.concentric = 0;
  _HCS_Al_184_var._parameters.density = 0;
  _HCS_Al_184_var._parameters.weight = 0;
  _HCS_Al_184_var._parameters.barns = 1;
  _HCS_Al_184_var._parameters.Strain = 0;
  _HCS_Al_184_var._parameters.focus_flip = 0;
  _HCS_Al_184_var._parameters.target_index = 0;
  _HCS_Al_184_var._parameters.order = 1;


  /* component HCS_Al_184=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H522_Straight_var._rotation_absolute, _HCS_Al_184_var._rotation_absolute);
    rot_transpose(_H522_Straight_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_184_var._rotation_absolute, tr1, _HCS_Al_184_var._rotation_relative);
    _HCS_Al_184_var._rotation_is_identity =  rot_test_identity(_HCS_Al_184_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 25.77);
    rot_transpose(_H522_Straight_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_184_var._position_absolute = coords_add(_H522_Straight_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Straight_var._position_absolute, _HCS_Al_184_var._position_absolute);
    _HCS_Al_184_var._position_relative = rot_apply(_HCS_Al_184_var._rotation_absolute, tc1);
  } /* HCS_Al_184=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_184", _HCS_Al_184_var._position_absolute, _HCS_Al_184_var._rotation_absolute);
  instrument->_position_absolute[184] = _HCS_Al_184_var._position_absolute;
  instrument->_position_relative[184] = _HCS_Al_184_var._position_relative;
    _HCS_Al_184_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_184_var._position_relative);
  instrument->counter_N[184]  = instrument->counter_P[184] = instrument->counter_P2[184] = 0;
  instrument->counter_AbsorbProp[184]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0183_HCS_Al_184", _HCS_Al_184_var._position_absolute, _HCS_Al_184_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "xwidth", "0", "0.075","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0183_HCS_Al_184", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_184_setpos */

/* component H522_Vsel_L=Monitor_nD() SETTING, POSITION/ROTATION */
int _H522_Vsel_L_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Vsel_L_setpos] component H522_Vsel_L=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H522_Vsel_L_var._name, "H522_Vsel_L", 16384);
  stracpy(_H522_Vsel_L_var._type, "Monitor_nD", 16384);
  _H522_Vsel_L_var._index=185;
  int current_setpos_index = 185;
  if("" && strlen(""))
    stracpy(_H522_Vsel_L_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H522_Vsel_L_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_Vsel_L_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H522_Vsel_L_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_Vsel_L_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H522_Vsel_L_var._parameters.user3[0]='\0';
  _H522_Vsel_L_var._parameters.xwidth = 0.075;
  _H522_Vsel_L_var._parameters.yheight = 0.12;
  _H522_Vsel_L_var._parameters.zdepth = 0;
  _H522_Vsel_L_var._parameters.xmin = 0;
  _H522_Vsel_L_var._parameters.xmax = 0;
  _H522_Vsel_L_var._parameters.ymin = 0;
  _H522_Vsel_L_var._parameters.ymax = 0;
  _H522_Vsel_L_var._parameters.zmin = 0;
  _H522_Vsel_L_var._parameters.zmax = 0;
  _H522_Vsel_L_var._parameters.bins = 50;
  _H522_Vsel_L_var._parameters.min = -1e40;
  _H522_Vsel_L_var._parameters.max = 1e40;
  _H522_Vsel_L_var._parameters.restore_neutron = 0;
  _H522_Vsel_L_var._parameters.radius = 0;
  if("slit lambda limits=[1 10]" && strlen("slit lambda limits=[1 10]"))
    stracpy(_H522_Vsel_L_var._parameters.options, "slit lambda limits=[1 10]" ? "slit lambda limits=[1 10]" : "", 16384);
  else 
  _H522_Vsel_L_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Vsel_L_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Vsel_L_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Vsel_L_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Vsel_L_var._parameters.geometry[0]='\0';
  _H522_Vsel_L_var._parameters.nowritefile = 0;
  _H522_Vsel_L_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Vsel_L_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Vsel_L_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Vsel_L_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Vsel_L_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Vsel_L_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Vsel_L_var._parameters.username3[0]='\0';


  /* component H522_Vsel_L=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_184_var._rotation_absolute, _H522_Vsel_L_var._rotation_absolute);
    rot_transpose(_HCS_Al_184_var._rotation_absolute, tr1);
    rot_mul(_H522_Vsel_L_var._rotation_absolute, tr1, _H522_Vsel_L_var._rotation_relative);
    _H522_Vsel_L_var._rotation_is_identity =  rot_test_identity(_H522_Vsel_L_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.01);
    rot_transpose(_HCS_Al_184_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Vsel_L_var._position_absolute = coords_add(_HCS_Al_184_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_184_var._position_absolute, _H522_Vsel_L_var._position_absolute);
    _H522_Vsel_L_var._position_relative = rot_apply(_H522_Vsel_L_var._rotation_absolute, tc1);
  } /* H522_Vsel_L=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H522_Vsel_L", _H522_Vsel_L_var._position_absolute, _H522_Vsel_L_var._rotation_absolute);
  instrument->_position_absolute[185] = _H522_Vsel_L_var._position_absolute;
  instrument->_position_relative[185] = _H522_Vsel_L_var._position_relative;
    _H522_Vsel_L_var._position_relative_is_zero =  coords_test_zero(_H522_Vsel_L_var._position_relative);
  instrument->counter_N[185]  = instrument->counter_P[185] = instrument->counter_P2[185] = 0;
  instrument->counter_AbsorbProp[185]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0184_H522_Vsel_L", _H522_Vsel_L_var._position_absolute, _H522_Vsel_L_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "xwidth", "0", "0.075","MCNUM");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "restore_neutron", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "options", "NULL", "slit lambda limits=[1 10]", "char*");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0184_H522_Vsel_L", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Vsel_L_setpos */

/* component H522_mirror_centre=Arm() SETTING, POSITION/ROTATION */
int _H522_mirror_centre_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_mirror_centre_setpos] component H522_mirror_centre=Arm() SETTING [Arm:0]");
  stracpy(_H522_mirror_centre_var._name, "H522_mirror_centre", 16384);
  stracpy(_H522_mirror_centre_var._type, "Arm", 16384);
  _H522_mirror_centre_var._index=186;
  int current_setpos_index = 186;
  /* component H522_mirror_centre=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H522_Vsel_L_var._rotation_absolute, _H522_mirror_centre_var._rotation_absolute);
    rot_transpose(_H522_Vsel_L_var._rotation_absolute, tr1);
    rot_mul(_H522_mirror_centre_var._rotation_absolute, tr1, _H522_mirror_centre_var._rotation_relative);
    _H522_mirror_centre_var._rotation_is_identity =  rot_test_identity(_H522_mirror_centre_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 4.8 / 2);
    rot_transpose(_H522_Vsel_L_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_mirror_centre_var._position_absolute = coords_add(_H522_Vsel_L_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Vsel_L_var._position_absolute, _H522_mirror_centre_var._position_absolute);
    _H522_mirror_centre_var._position_relative = rot_apply(_H522_mirror_centre_var._rotation_absolute, tc1);
  } /* H522_mirror_centre=Arm() AT ROTATED */
  DEBUG_COMPONENT("H522_mirror_centre", _H522_mirror_centre_var._position_absolute, _H522_mirror_centre_var._rotation_absolute);
  instrument->_position_absolute[186] = _H522_mirror_centre_var._position_absolute;
  instrument->_position_relative[186] = _H522_mirror_centre_var._position_relative;
    _H522_mirror_centre_var._position_relative_is_zero =  coords_test_zero(_H522_mirror_centre_var._position_relative);
  instrument->counter_N[186]  = instrument->counter_P[186] = instrument->counter_P2[186] = 0;
  instrument->counter_AbsorbProp[186]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0185_H522_mirror_centre", _H522_mirror_centre_var._position_absolute, _H522_mirror_centre_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_mirror_centre_setpos */

/* component WASP_polariser=Pol_mirror() SETTING, POSITION/ROTATION */
int _WASP_polariser_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_WASP_polariser_setpos] component WASP_polariser=Pol_mirror() SETTING [Pol_mirror:0]");
  stracpy(_WASP_polariser_var._name, "WASP_polariser", 16384);
  stracpy(_WASP_polariser_var._type, "Pol_mirror", 16384);
  _WASP_polariser_var._index=187;
  int current_setpos_index = 187;
  _WASP_polariser_var._parameters.rUpPar[0] = 1;
  _WASP_polariser_var._parameters.rUpPar[1] = 0.0219;
  _WASP_polariser_var._parameters.rUpPar[2] = 4.07;
  _WASP_polariser_var._parameters.rUpPar[3] = 3.2;
  _WASP_polariser_var._parameters.rUpPar[4] = 0.003;
  _WASP_polariser_var._parameters.rDownPar[0] = 0.1;
  _WASP_polariser_var._parameters.rDownPar[1] = 0.0219;
  _WASP_polariser_var._parameters.rDownPar[2] = 4.07;
  _WASP_polariser_var._parameters.rDownPar[3] = 3.2;
  _WASP_polariser_var._parameters.rDownPar[4] = 0.003;
  if("" && strlen(""))
    stracpy(_WASP_polariser_var._parameters.rUpData, "" ? "" : "", 16384);
  else 
  _WASP_polariser_var._parameters.rUpData[0]='\0';
  if("" && strlen(""))
    stracpy(_WASP_polariser_var._parameters.rDownData, "" ? "" : "", 16384);
  else 
  _WASP_polariser_var._parameters.rDownData[0]='\0';
  _WASP_polariser_var._parameters.p_reflect = 0.95;
  _WASP_polariser_var._parameters.zwidth = 4.8;
  _WASP_polariser_var._parameters.yheight = 0.12;


  /* component WASP_polariser=Pol_mirror() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-0.89)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_mirror_centre_var._rotation_absolute, _WASP_polariser_var._rotation_absolute);
    rot_transpose(_H522_mirror_centre_var._rotation_absolute, tr1);
    rot_mul(_WASP_polariser_var._rotation_absolute, tr1, _WASP_polariser_var._rotation_relative);
    _WASP_polariser_var._rotation_is_identity =  rot_test_identity(_WASP_polariser_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H522_mirror_centre_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _WASP_polariser_var._position_absolute = coords_add(_H522_mirror_centre_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_mirror_centre_var._position_absolute, _WASP_polariser_var._position_absolute);
    _WASP_polariser_var._position_relative = rot_apply(_WASP_polariser_var._rotation_absolute, tc1);
  } /* WASP_polariser=Pol_mirror() AT ROTATED */
  DEBUG_COMPONENT("WASP_polariser", _WASP_polariser_var._position_absolute, _WASP_polariser_var._rotation_absolute);
  instrument->_position_absolute[187] = _WASP_polariser_var._position_absolute;
  instrument->_position_relative[187] = _WASP_polariser_var._position_relative;
    _WASP_polariser_var._position_relative_is_zero =  coords_test_zero(_WASP_polariser_var._position_relative);
  instrument->counter_N[187]  = instrument->counter_P[187] = instrument->counter_P2[187] = 0;
  instrument->counter_AbsorbProp[187]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0186_WASP_polariser", _WASP_polariser_var._position_absolute, _WASP_polariser_var._rotation_absolute, "Pol_mirror");
        mccomp_param_nexus(nxhandle,"0186_WASP_polariser", "rUpPar", "{ 0.99 , 0.0219 , 6.07 , 2.0 , 0.003 }", "{ 1.0 , 0.0219 , 4.07 , 3.2 , 0.003 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0186_WASP_polariser", "rDownPar", "{ 0.99 , 0.0219 , 6.07 , 2.0 , 0.003 }", "{ 0.1 , 0.0219 , 4.07 , 3.2 , 0.003 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0186_WASP_polariser", "rUpData", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0186_WASP_polariser", "rDownData", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0186_WASP_polariser", "p_reflect", "-1", "0.95","MCNUM");
        mccomp_param_nexus(nxhandle,"0186_WASP_polariser", "zwidth", "NONE", "4.8","MCNUM");
        mccomp_param_nexus(nxhandle,"0186_WASP_polariser", "yheight", "NONE", "0.12","MCNUM");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _WASP_polariser_setpos */

/* component H522_mirror_outdir=Arm() SETTING, POSITION/ROTATION */
int _H522_mirror_outdir_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_mirror_outdir_setpos] component H522_mirror_outdir=Arm() SETTING [Arm:0]");
  stracpy(_H522_mirror_outdir_var._name, "H522_mirror_outdir", 16384);
  stracpy(_H522_mirror_outdir_var._type, "Arm", 16384);
  _H522_mirror_outdir_var._index=188;
  int current_setpos_index = 188;
  /* component H522_mirror_outdir=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-0.89 * 2)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H522_mirror_centre_var._rotation_absolute, _H522_mirror_outdir_var._rotation_absolute);
    rot_transpose(_WASP_polariser_var._rotation_absolute, tr1);
    rot_mul(_H522_mirror_outdir_var._rotation_absolute, tr1, _H522_mirror_outdir_var._rotation_relative);
    _H522_mirror_outdir_var._rotation_is_identity =  rot_test_identity(_H522_mirror_outdir_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H522_mirror_centre_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_mirror_outdir_var._position_absolute = coords_add(_H522_mirror_centre_var._position_absolute, tc2);
    tc1 = coords_sub(_WASP_polariser_var._position_absolute, _H522_mirror_outdir_var._position_absolute);
    _H522_mirror_outdir_var._position_relative = rot_apply(_H522_mirror_outdir_var._rotation_absolute, tc1);
  } /* H522_mirror_outdir=Arm() AT ROTATED */
  DEBUG_COMPONENT("H522_mirror_outdir", _H522_mirror_outdir_var._position_absolute, _H522_mirror_outdir_var._rotation_absolute);
  instrument->_position_absolute[188] = _H522_mirror_outdir_var._position_absolute;
  instrument->_position_relative[188] = _H522_mirror_outdir_var._position_relative;
    _H522_mirror_outdir_var._position_relative_is_zero =  coords_test_zero(_H522_mirror_outdir_var._position_relative);
  instrument->counter_N[188]  = instrument->counter_P[188] = instrument->counter_P2[188] = 0;
  instrument->counter_AbsorbProp[188]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0187_H522_mirror_outdir", _H522_mirror_outdir_var._position_absolute, _H522_mirror_outdir_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_mirror_outdir_setpos */

/* component H522_mirror_ReflectXY=Monitor_nD() SETTING, POSITION/ROTATION */
int _H522_mirror_ReflectXY_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_mirror_ReflectXY_setpos] component H522_mirror_ReflectXY=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H522_mirror_ReflectXY_var._name, "H522_mirror_ReflectXY", 16384);
  stracpy(_H522_mirror_ReflectXY_var._type, "Monitor_nD", 16384);
  _H522_mirror_ReflectXY_var._index=189;
  int current_setpos_index = 189;
  if("" && strlen(""))
    stracpy(_H522_mirror_ReflectXY_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H522_mirror_ReflectXY_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_mirror_ReflectXY_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H522_mirror_ReflectXY_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_mirror_ReflectXY_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H522_mirror_ReflectXY_var._parameters.user3[0]='\0';
  _H522_mirror_ReflectXY_var._parameters.xwidth = 0.075;
  _H522_mirror_ReflectXY_var._parameters.yheight = 0.12;
  _H522_mirror_ReflectXY_var._parameters.zdepth = 0;
  _H522_mirror_ReflectXY_var._parameters.xmin = 0;
  _H522_mirror_ReflectXY_var._parameters.xmax = 0;
  _H522_mirror_ReflectXY_var._parameters.ymin = 0;
  _H522_mirror_ReflectXY_var._parameters.ymax = 0;
  _H522_mirror_ReflectXY_var._parameters.zmin = 0;
  _H522_mirror_ReflectXY_var._parameters.zmax = 0;
  _H522_mirror_ReflectXY_var._parameters.bins = 50;
  _H522_mirror_ReflectXY_var._parameters.min = -1e40;
  _H522_mirror_ReflectXY_var._parameters.max = 1e40;
  _H522_mirror_ReflectXY_var._parameters.restore_neutron = 1;
  _H522_mirror_ReflectXY_var._parameters.radius = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_mirror_ReflectXY_var._parameters.options, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_mirror_ReflectXY_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_mirror_ReflectXY_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_mirror_ReflectXY_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_mirror_ReflectXY_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_mirror_ReflectXY_var._parameters.geometry[0]='\0';
  _H522_mirror_ReflectXY_var._parameters.nowritefile = 0;
  _H522_mirror_ReflectXY_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_mirror_ReflectXY_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_mirror_ReflectXY_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_mirror_ReflectXY_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_mirror_ReflectXY_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_mirror_ReflectXY_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_mirror_ReflectXY_var._parameters.username3[0]='\0';


  /* component H522_mirror_ReflectXY=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H522_mirror_outdir_var._rotation_absolute, _H522_mirror_ReflectXY_var._rotation_absolute);
    rot_transpose(_WASP_polariser_var._rotation_absolute, tr1);
    rot_mul(_H522_mirror_ReflectXY_var._rotation_absolute, tr1, _H522_mirror_ReflectXY_var._rotation_relative);
    _H522_mirror_ReflectXY_var._rotation_is_identity =  rot_test_identity(_H522_mirror_ReflectXY_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 4.8 / 2);
    rot_transpose(_H522_mirror_outdir_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_mirror_ReflectXY_var._position_absolute = coords_add(_H522_mirror_outdir_var._position_absolute, tc2);
    tc1 = coords_sub(_WASP_polariser_var._position_absolute, _H522_mirror_ReflectXY_var._position_absolute);
    _H522_mirror_ReflectXY_var._position_relative = rot_apply(_H522_mirror_ReflectXY_var._rotation_absolute, tc1);
  } /* H522_mirror_ReflectXY=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H522_mirror_ReflectXY", _H522_mirror_ReflectXY_var._position_absolute, _H522_mirror_ReflectXY_var._rotation_absolute);
  instrument->_position_absolute[189] = _H522_mirror_ReflectXY_var._position_absolute;
  instrument->_position_relative[189] = _H522_mirror_ReflectXY_var._position_relative;
    _H522_mirror_ReflectXY_var._position_relative_is_zero =  coords_test_zero(_H522_mirror_ReflectXY_var._position_relative);
  instrument->counter_N[189]  = instrument->counter_P[189] = instrument->counter_P2[189] = 0;
  instrument->counter_AbsorbProp[189]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0188_H522_mirror_ReflectXY", _H522_mirror_ReflectXY_var._position_absolute, _H522_mirror_ReflectXY_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "xwidth", "0", "0.075","MCNUM");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "options", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0188_H522_mirror_ReflectXY", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_mirror_ReflectXY_setpos */

/* component H522_mirror_TransmitXY=Monitor_nD() SETTING, POSITION/ROTATION */
int _H522_mirror_TransmitXY_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_mirror_TransmitXY_setpos] component H522_mirror_TransmitXY=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H522_mirror_TransmitXY_var._name, "H522_mirror_TransmitXY", 16384);
  stracpy(_H522_mirror_TransmitXY_var._type, "Monitor_nD", 16384);
  _H522_mirror_TransmitXY_var._index=190;
  int current_setpos_index = 190;
  if("" && strlen(""))
    stracpy(_H522_mirror_TransmitXY_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H522_mirror_TransmitXY_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_mirror_TransmitXY_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H522_mirror_TransmitXY_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_mirror_TransmitXY_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H522_mirror_TransmitXY_var._parameters.user3[0]='\0';
  _H522_mirror_TransmitXY_var._parameters.xwidth = 0.075;
  _H522_mirror_TransmitXY_var._parameters.yheight = 0.12;
  _H522_mirror_TransmitXY_var._parameters.zdepth = 0;
  _H522_mirror_TransmitXY_var._parameters.xmin = 0;
  _H522_mirror_TransmitXY_var._parameters.xmax = 0;
  _H522_mirror_TransmitXY_var._parameters.ymin = 0;
  _H522_mirror_TransmitXY_var._parameters.ymax = 0;
  _H522_mirror_TransmitXY_var._parameters.zmin = 0;
  _H522_mirror_TransmitXY_var._parameters.zmax = 0;
  _H522_mirror_TransmitXY_var._parameters.bins = 50;
  _H522_mirror_TransmitXY_var._parameters.min = -1e40;
  _H522_mirror_TransmitXY_var._parameters.max = 1e40;
  _H522_mirror_TransmitXY_var._parameters.restore_neutron = 1;
  _H522_mirror_TransmitXY_var._parameters.radius = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_mirror_TransmitXY_var._parameters.options, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_mirror_TransmitXY_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_mirror_TransmitXY_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_mirror_TransmitXY_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_mirror_TransmitXY_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_mirror_TransmitXY_var._parameters.geometry[0]='\0';
  _H522_mirror_TransmitXY_var._parameters.nowritefile = 0;
  _H522_mirror_TransmitXY_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_mirror_TransmitXY_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_mirror_TransmitXY_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_mirror_TransmitXY_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_mirror_TransmitXY_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_mirror_TransmitXY_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_mirror_TransmitXY_var._parameters.username3[0]='\0';


  /* component H522_mirror_TransmitXY=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H522_mirror_centre_var._rotation_absolute, _H522_mirror_TransmitXY_var._rotation_absolute);
    rot_transpose(_H522_mirror_ReflectXY_var._rotation_absolute, tr1);
    rot_mul(_H522_mirror_TransmitXY_var._rotation_absolute, tr1, _H522_mirror_TransmitXY_var._rotation_relative);
    _H522_mirror_TransmitXY_var._rotation_is_identity =  rot_test_identity(_H522_mirror_TransmitXY_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 4.8 / 2);
    rot_transpose(_H522_mirror_centre_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_mirror_TransmitXY_var._position_absolute = coords_add(_H522_mirror_centre_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_mirror_ReflectXY_var._position_absolute, _H522_mirror_TransmitXY_var._position_absolute);
    _H522_mirror_TransmitXY_var._position_relative = rot_apply(_H522_mirror_TransmitXY_var._rotation_absolute, tc1);
  } /* H522_mirror_TransmitXY=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H522_mirror_TransmitXY", _H522_mirror_TransmitXY_var._position_absolute, _H522_mirror_TransmitXY_var._rotation_absolute);
  instrument->_position_absolute[190] = _H522_mirror_TransmitXY_var._position_absolute;
  instrument->_position_relative[190] = _H522_mirror_TransmitXY_var._position_relative;
    _H522_mirror_TransmitXY_var._position_relative_is_zero =  coords_test_zero(_H522_mirror_TransmitXY_var._position_relative);
  instrument->counter_N[190]  = instrument->counter_P[190] = instrument->counter_P2[190] = 0;
  instrument->counter_AbsorbProp[190]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0189_H522_mirror_TransmitXY", _H522_mirror_TransmitXY_var._position_absolute, _H522_mirror_TransmitXY_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "xwidth", "0", "0.075","MCNUM");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "options", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0189_H522_mirror_TransmitXY", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_mirror_TransmitXY_setpos */

/* component H522_mirror_outdXY=Monitor_nD() SETTING, POSITION/ROTATION */
int _H522_mirror_outdXY_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_mirror_outdXY_setpos] component H522_mirror_outdXY=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H522_mirror_outdXY_var._name, "H522_mirror_outdXY", 16384);
  stracpy(_H522_mirror_outdXY_var._type, "Monitor_nD", 16384);
  _H522_mirror_outdXY_var._index=191;
  int current_setpos_index = 191;
  if("" && strlen(""))
    stracpy(_H522_mirror_outdXY_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H522_mirror_outdXY_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_mirror_outdXY_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H522_mirror_outdXY_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_mirror_outdXY_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H522_mirror_outdXY_var._parameters.user3[0]='\0';
  _H522_mirror_outdXY_var._parameters.xwidth = 0.075;
  _H522_mirror_outdXY_var._parameters.yheight = 0.12;
  _H522_mirror_outdXY_var._parameters.zdepth = 0;
  _H522_mirror_outdXY_var._parameters.xmin = 0;
  _H522_mirror_outdXY_var._parameters.xmax = 0;
  _H522_mirror_outdXY_var._parameters.ymin = 0;
  _H522_mirror_outdXY_var._parameters.ymax = 0;
  _H522_mirror_outdXY_var._parameters.zmin = 0;
  _H522_mirror_outdXY_var._parameters.zmax = 0;
  _H522_mirror_outdXY_var._parameters.bins = 50;
  _H522_mirror_outdXY_var._parameters.min = -1e40;
  _H522_mirror_outdXY_var._parameters.max = 1e40;
  _H522_mirror_outdXY_var._parameters.restore_neutron = 1;
  _H522_mirror_outdXY_var._parameters.radius = 0;
  if("dx limits=[-2 2], dy limits=[-2 2]" && strlen("dx limits=[-2 2], dy limits=[-2 2]"))
    stracpy(_H522_mirror_outdXY_var._parameters.options, "dx limits=[-2 2], dy limits=[-2 2]" ? "dx limits=[-2 2], dy limits=[-2 2]" : "", 16384);
  else 
  _H522_mirror_outdXY_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_mirror_outdXY_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_mirror_outdXY_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_mirror_outdXY_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_mirror_outdXY_var._parameters.geometry[0]='\0';
  _H522_mirror_outdXY_var._parameters.nowritefile = 0;
  _H522_mirror_outdXY_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_mirror_outdXY_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_mirror_outdXY_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_mirror_outdXY_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_mirror_outdXY_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_mirror_outdXY_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_mirror_outdXY_var._parameters.username3[0]='\0';


  /* component H522_mirror_outdXY=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H522_mirror_ReflectXY_var._rotation_absolute, _H522_mirror_outdXY_var._rotation_absolute);
    rot_transpose(_H522_mirror_TransmitXY_var._rotation_absolute, tr1);
    rot_mul(_H522_mirror_outdXY_var._rotation_absolute, tr1, _H522_mirror_outdXY_var._rotation_relative);
    _H522_mirror_outdXY_var._rotation_is_identity =  rot_test_identity(_H522_mirror_outdXY_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H522_mirror_ReflectXY_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_mirror_outdXY_var._position_absolute = coords_add(_H522_mirror_ReflectXY_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_mirror_TransmitXY_var._position_absolute, _H522_mirror_outdXY_var._position_absolute);
    _H522_mirror_outdXY_var._position_relative = rot_apply(_H522_mirror_outdXY_var._rotation_absolute, tc1);
  } /* H522_mirror_outdXY=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H522_mirror_outdXY", _H522_mirror_outdXY_var._position_absolute, _H522_mirror_outdXY_var._rotation_absolute);
  instrument->_position_absolute[191] = _H522_mirror_outdXY_var._position_absolute;
  instrument->_position_relative[191] = _H522_mirror_outdXY_var._position_relative;
    _H522_mirror_outdXY_var._position_relative_is_zero =  coords_test_zero(_H522_mirror_outdXY_var._position_relative);
  instrument->counter_N[191]  = instrument->counter_P[191] = instrument->counter_P2[191] = 0;
  instrument->counter_AbsorbProp[191]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0190_H522_mirror_outdXY", _H522_mirror_outdXY_var._position_absolute, _H522_mirror_outdXY_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "xwidth", "0", "0.075","MCNUM");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "options", "NULL", "dx limits=[-2 2], dy limits=[-2 2]", "char*");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0190_H522_mirror_outdXY", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_mirror_outdXY_setpos */

/* component WASP_Vpolariser=Pol_guide_vmirror() SETTING, POSITION/ROTATION */
int _WASP_Vpolariser_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_WASP_Vpolariser_setpos] component WASP_Vpolariser=Pol_guide_vmirror() SETTING [Pol_guide_vmirror:0]");
  stracpy(_WASP_Vpolariser_var._name, "WASP_Vpolariser", 16384);
  stracpy(_WASP_Vpolariser_var._type, "Pol_guide_vmirror", 16384);
  _WASP_Vpolariser_var._index=192;
  int current_setpos_index = 192;
  _WASP_Vpolariser_var._parameters.nvs = 1;
  _WASP_Vpolariser_var._parameters.xwidth = 0.075;
  _WASP_Vpolariser_var._parameters.yheight = 0.12;
  _WASP_Vpolariser_var._parameters.length = 1.210;
  _WASP_Vpolariser_var._parameters.rR0 = 1.0;
  _WASP_Vpolariser_var._parameters.rQc = 0.0217;
  _WASP_Vpolariser_var._parameters.ralpha = 6.5;
  _WASP_Vpolariser_var._parameters.rmSM = 2;
  _WASP_Vpolariser_var._parameters.rW = 0.00157;
  _WASP_Vpolariser_var._parameters.rbeta = 80;
  _WASP_Vpolariser_var._parameters.rUpR0 = 1.0;
  _WASP_Vpolariser_var._parameters.rUpQc = 0.0217;
  _WASP_Vpolariser_var._parameters.rUpalpha = 2.47;
  _WASP_Vpolariser_var._parameters.rUpmSM = 4;
  _WASP_Vpolariser_var._parameters.rUpW = 0.0014;
  _WASP_Vpolariser_var._parameters.rUpbeta = 0;
  _WASP_Vpolariser_var._parameters.rDownR0 = 1.0;
  _WASP_Vpolariser_var._parameters.rDownQc = 0.0217;
  _WASP_Vpolariser_var._parameters.rDownalpha = 1;
  _WASP_Vpolariser_var._parameters.rDownmSM = 0.65;
  _WASP_Vpolariser_var._parameters.rDownW = 0.003;
  _WASP_Vpolariser_var._parameters.rDownbeta = 0;
  _WASP_Vpolariser_var._parameters.debug = 0;
  _WASP_Vpolariser_var._parameters.allow_inside_start = 0;
  _WASP_Vpolariser_var._parameters.rPar[0] = 1;
  _WASP_Vpolariser_var._parameters.rPar[1] = 2;
  _WASP_Vpolariser_var._parameters.rPar[2] = 0;
  _WASP_Vpolariser_var._parameters.rPar[3] = 0.0219;
  _WASP_Vpolariser_var._parameters.rPar[4] = 4.07;
  _WASP_Vpolariser_var._parameters.rPar[5] = 1;
  _WASP_Vpolariser_var._parameters.rPar[6] = 0.003;
  _WASP_Vpolariser_var._parameters.rUpPar[0] = 1;
  _WASP_Vpolariser_var._parameters.rUpPar[1] = 3.2;
  _WASP_Vpolariser_var._parameters.rUpPar[2] = 0;
  _WASP_Vpolariser_var._parameters.rUpPar[3] = 0.0219;
  _WASP_Vpolariser_var._parameters.rUpPar[4] = 4.07;
  _WASP_Vpolariser_var._parameters.rUpPar[5] = 1;
  _WASP_Vpolariser_var._parameters.rUpPar[6] = 0.003;
  _WASP_Vpolariser_var._parameters.rDownPar[0] = 1;
  _WASP_Vpolariser_var._parameters.rDownPar[1] = 0.4;
  _WASP_Vpolariser_var._parameters.rDownPar[2] = 0;
  _WASP_Vpolariser_var._parameters.rDownPar[3] = 0.0219;
  _WASP_Vpolariser_var._parameters.rDownPar[4] = 4.07;
  _WASP_Vpolariser_var._parameters.rDownPar[5] = 1;
  _WASP_Vpolariser_var._parameters.rDownPar[6] = 0.003;
  if("" && strlen(""))
    stracpy(_WASP_Vpolariser_var._parameters.rParFile, "" ? "" : "", 16384);
  else 
  _WASP_Vpolariser_var._parameters.rParFile[0]='\0';
  if("" && strlen(""))
    stracpy(_WASP_Vpolariser_var._parameters.rUpParFile, "" ? "" : "", 16384);
  else 
  _WASP_Vpolariser_var._parameters.rUpParFile[0]='\0';
  if("" && strlen(""))
    stracpy(_WASP_Vpolariser_var._parameters.rDownParFile, "" ? "" : "", 16384);
  else 
  _WASP_Vpolariser_var._parameters.rDownParFile[0]='\0';
  _WASP_Vpolariser_var._parameters.inputType = 0;


  /* component WASP_Vpolariser=Pol_guide_vmirror() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H522_mirror_outdXY_var._rotation_absolute, _WASP_Vpolariser_var._rotation_absolute);
    rot_transpose(_H522_mirror_outdXY_var._rotation_absolute, tr1);
    rot_mul(_WASP_Vpolariser_var._rotation_absolute, tr1, _WASP_Vpolariser_var._rotation_relative);
    _WASP_Vpolariser_var._rotation_is_identity =  rot_test_identity(_WASP_Vpolariser_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.01);
    rot_transpose(_H522_mirror_outdXY_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _WASP_Vpolariser_var._position_absolute = coords_add(_H522_mirror_outdXY_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_mirror_outdXY_var._position_absolute, _WASP_Vpolariser_var._position_absolute);
    _WASP_Vpolariser_var._position_relative = rot_apply(_WASP_Vpolariser_var._rotation_absolute, tc1);
  } /* WASP_Vpolariser=Pol_guide_vmirror() AT ROTATED */
  DEBUG_COMPONENT("WASP_Vpolariser", _WASP_Vpolariser_var._position_absolute, _WASP_Vpolariser_var._rotation_absolute);
  instrument->_position_absolute[192] = _WASP_Vpolariser_var._position_absolute;
  instrument->_position_relative[192] = _WASP_Vpolariser_var._position_relative;
    _WASP_Vpolariser_var._position_relative_is_zero =  coords_test_zero(_WASP_Vpolariser_var._position_relative);
  instrument->counter_N[192]  = instrument->counter_P[192] = instrument->counter_P2[192] = 0;
  instrument->counter_AbsorbProp[192]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0191_WASP_Vpolariser", _WASP_Vpolariser_var._position_absolute, _WASP_Vpolariser_var._rotation_absolute, "Pol_guide_vmirror");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "nvs", "1", "1","int");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "xwidth", "0.1", "0.075","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "yheight", "0.1", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "length", "0.5", "1.210","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rR0", "1.0", "1.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rQc", "0.0217", "0.0217","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "ralpha", "6.5", "6.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rmSM", "2", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rW", "0.00157", "0.00157","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rbeta", "80", "80","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rUpR0", "1.0", "1.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rUpQc", "0.0217", "0.0217","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rUpalpha", "2.47", "2.47","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rUpmSM", "4", "4","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rUpW", "0.0014", "0.0014","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rUpbeta", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rDownR0", "1.0", "1.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rDownQc", "0.0217", "0.0217","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rDownalpha", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rDownmSM", "0.65", "0.65","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rDownW", "0.003", "0.003","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rDownbeta", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "debug", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "allow_inside_start", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rPar", "{ 1.0 , 0.0217 , 6.5 , 2 , 0.00157 , 80 }", "{ 1 , 2.0 * 0.0219 , 4.07 , 1 , 0.003 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rUpPar", "{ 1.0 , 0.0217 , 2.47 , 4 , 0.0014 }", "{ 1 , 3.2 * 0.0219 , 4.07 , 1 , 0.003 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rDownPar", "{ 1.0 , 0.0217 , 1 , 0.65 , 0.003 }", "{ 1 , 0.4 * 0.0219 , 4.07 , 1 , 0.003 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rParFile", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rUpParFile", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "rDownParFile", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0191_WASP_Vpolariser", "inputType", "0", "0","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _WASP_Vpolariser_setpos */

/* component H522_Straight_Last=Guide_gravity() SETTING, POSITION/ROTATION */
int _H522_Straight_Last_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_Straight_Last_setpos] component H522_Straight_Last=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H522_Straight_Last_var._name, "H522_Straight_Last", 16384);
  stracpy(_H522_Straight_Last_var._type, "Guide_gravity", 16384);
  _H522_Straight_Last_var._index=193;
  int current_setpos_index = 193;
  _H522_Straight_Last_var._parameters.w1 = 0.075;
  _H522_Straight_Last_var._parameters.h1 = 0.12;
  _H522_Straight_Last_var._parameters.w2 = 0;
  _H522_Straight_Last_var._parameters.h2 = 0;
  _H522_Straight_Last_var._parameters.l = 1.76;
  _H522_Straight_Last_var._parameters.R0 = 0.995;
  _H522_Straight_Last_var._parameters.Qc = 0.0218;
  _H522_Straight_Last_var._parameters.alpha = 4.38;
  _H522_Straight_Last_var._parameters.m = 1.0;
  _H522_Straight_Last_var._parameters.W = 0.003;
  _H522_Straight_Last_var._parameters.nslit = 1;
  _H522_Straight_Last_var._parameters.d = 0.0005;
  _H522_Straight_Last_var._parameters.mleft = -1;
  _H522_Straight_Last_var._parameters.mright = -1;
  _H522_Straight_Last_var._parameters.mtop = -1;
  _H522_Straight_Last_var._parameters.mbottom = -1;
  _H522_Straight_Last_var._parameters.nhslit = 1;
  _H522_Straight_Last_var._parameters.G = 0;
  _H522_Straight_Last_var._parameters.aleft = -1;
  _H522_Straight_Last_var._parameters.aright = -1;
  _H522_Straight_Last_var._parameters.atop = -1;
  _H522_Straight_Last_var._parameters.abottom = -1;
  _H522_Straight_Last_var._parameters.wavy = 0;
  _H522_Straight_Last_var._parameters.wavy_z = 0;
  _H522_Straight_Last_var._parameters.wavy_tb = 0;
  _H522_Straight_Last_var._parameters.wavy_lr = 0;
  _H522_Straight_Last_var._parameters.chamfers = 0;
  _H522_Straight_Last_var._parameters.chamfers_z = 0;
  _H522_Straight_Last_var._parameters.chamfers_lr = 0;
  _H522_Straight_Last_var._parameters.chamfers_tb = 0;
  _H522_Straight_Last_var._parameters.nelements = 1;
  _H522_Straight_Last_var._parameters.nu = 0;
  _H522_Straight_Last_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_Straight_Last_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_Straight_Last_var._parameters.reflect[0]='\0';


  /* component H522_Straight_Last=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _WASP_Vpolariser_var._rotation_absolute, _H522_Straight_Last_var._rotation_absolute);
    rot_transpose(_WASP_Vpolariser_var._rotation_absolute, tr1);
    rot_mul(_H522_Straight_Last_var._rotation_absolute, tr1, _H522_Straight_Last_var._rotation_relative);
    _H522_Straight_Last_var._rotation_is_identity =  rot_test_identity(_H522_Straight_Last_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 1.21 + 0.01);
    rot_transpose(_WASP_Vpolariser_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_Straight_Last_var._position_absolute = coords_add(_WASP_Vpolariser_var._position_absolute, tc2);
    tc1 = coords_sub(_WASP_Vpolariser_var._position_absolute, _H522_Straight_Last_var._position_absolute);
    _H522_Straight_Last_var._position_relative = rot_apply(_H522_Straight_Last_var._rotation_absolute, tc1);
  } /* H522_Straight_Last=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H522_Straight_Last", _H522_Straight_Last_var._position_absolute, _H522_Straight_Last_var._rotation_absolute);
  instrument->_position_absolute[193] = _H522_Straight_Last_var._position_absolute;
  instrument->_position_relative[193] = _H522_Straight_Last_var._position_relative;
    _H522_Straight_Last_var._position_relative_is_zero =  coords_test_zero(_H522_Straight_Last_var._position_relative);
  instrument->counter_N[193]  = instrument->counter_P[193] = instrument->counter_P2[193] = 0;
  instrument->counter_AbsorbProp[193]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0192_H522_Straight_Last", _H522_Straight_Last_var._position_absolute, _H522_Straight_Last_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "w1", "NONE", "0.075","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "l", "NONE", "1.76","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "R0", "0.995", "0.995","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "Qc", "0.0218", "0.0218","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "alpha", "4.38", "4.38","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "m", "1.0", "1.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "W", "0.003", "0.003","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0192_H522_Straight_Last", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_Straight_Last_setpos */

/* component H522_WASP_Sample_Div=Monitor_nD() SETTING, POSITION/ROTATION */
int _H522_WASP_Sample_Div_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_WASP_Sample_Div_setpos] component H522_WASP_Sample_Div=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H522_WASP_Sample_Div_var._name, "H522_WASP_Sample_Div", 16384);
  stracpy(_H522_WASP_Sample_Div_var._type, "Monitor_nD", 16384);
  _H522_WASP_Sample_Div_var._index=194;
  int current_setpos_index = 194;
  if("" && strlen(""))
    stracpy(_H522_WASP_Sample_Div_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H522_WASP_Sample_Div_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_WASP_Sample_Div_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H522_WASP_Sample_Div_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_WASP_Sample_Div_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H522_WASP_Sample_Div_var._parameters.user3[0]='\0';
  _H522_WASP_Sample_Div_var._parameters.xwidth = 0.02;
  _H522_WASP_Sample_Div_var._parameters.yheight = 0.05;
  _H522_WASP_Sample_Div_var._parameters.zdepth = 0;
  _H522_WASP_Sample_Div_var._parameters.xmin = 0;
  _H522_WASP_Sample_Div_var._parameters.xmax = 0;
  _H522_WASP_Sample_Div_var._parameters.ymin = 0;
  _H522_WASP_Sample_Div_var._parameters.ymax = 0;
  _H522_WASP_Sample_Div_var._parameters.zmin = 0;
  _H522_WASP_Sample_Div_var._parameters.zmax = 0;
  _H522_WASP_Sample_Div_var._parameters.bins = 100;
  _H522_WASP_Sample_Div_var._parameters.min = -1e40;
  _H522_WASP_Sample_Div_var._parameters.max = 1e40;
  _H522_WASP_Sample_Div_var._parameters.restore_neutron = 1;
  _H522_WASP_Sample_Div_var._parameters.radius = 0;
  if("dx limits=[-2 2], dy limits=[-2 2]" && strlen("dx limits=[-2 2], dy limits=[-2 2]"))
    stracpy(_H522_WASP_Sample_Div_var._parameters.options, "dx limits=[-2 2], dy limits=[-2 2]" ? "dx limits=[-2 2], dy limits=[-2 2]" : "", 16384);
  else 
  _H522_WASP_Sample_Div_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Sample_Div_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Sample_Div_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Sample_Div_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Sample_Div_var._parameters.geometry[0]='\0';
  _H522_WASP_Sample_Div_var._parameters.nowritefile = 0;
  _H522_WASP_Sample_Div_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Sample_Div_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Sample_Div_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Sample_Div_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Sample_Div_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Sample_Div_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Sample_Div_var._parameters.username3[0]='\0';


  /* component H522_WASP_Sample_Div=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H522_Straight_Last_var._rotation_absolute, _H522_WASP_Sample_Div_var._rotation_absolute);
    rot_transpose(_H522_Straight_Last_var._rotation_absolute, tr1);
    rot_mul(_H522_WASP_Sample_Div_var._rotation_absolute, tr1, _H522_WASP_Sample_Div_var._rotation_relative);
    _H522_WASP_Sample_Div_var._rotation_is_identity =  rot_test_identity(_H522_WASP_Sample_Div_var._rotation_relative);
    tc1 = coords_set(
      0, 0, WASP_L + 1.76);
    rot_transpose(_H522_Straight_Last_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_WASP_Sample_Div_var._position_absolute = coords_add(_H522_Straight_Last_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_Straight_Last_var._position_absolute, _H522_WASP_Sample_Div_var._position_absolute);
    _H522_WASP_Sample_Div_var._position_relative = rot_apply(_H522_WASP_Sample_Div_var._rotation_absolute, tc1);
  } /* H522_WASP_Sample_Div=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H522_WASP_Sample_Div", _H522_WASP_Sample_Div_var._position_absolute, _H522_WASP_Sample_Div_var._rotation_absolute);
  instrument->_position_absolute[194] = _H522_WASP_Sample_Div_var._position_absolute;
  instrument->_position_relative[194] = _H522_WASP_Sample_Div_var._position_relative;
    _H522_WASP_Sample_Div_var._position_relative_is_zero =  coords_test_zero(_H522_WASP_Sample_Div_var._position_relative);
  instrument->counter_N[194]  = instrument->counter_P[194] = instrument->counter_P2[194] = 0;
  instrument->counter_AbsorbProp[194]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0193_H522_WASP_Sample_Div", _H522_WASP_Sample_Div_var._position_absolute, _H522_WASP_Sample_Div_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "xwidth", "0", "0.02","MCNUM");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "yheight", "0", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "bins", "0", "100","int");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "options", "NULL", "dx limits=[-2 2], dy limits=[-2 2]", "char*");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0193_H522_WASP_Sample_Div", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_WASP_Sample_Div_setpos */

/* component H522_WASP_Sample_XY=Monitor_nD() SETTING, POSITION/ROTATION */
int _H522_WASP_Sample_XY_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_WASP_Sample_XY_setpos] component H522_WASP_Sample_XY=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H522_WASP_Sample_XY_var._name, "H522_WASP_Sample_XY", 16384);
  stracpy(_H522_WASP_Sample_XY_var._type, "Monitor_nD", 16384);
  _H522_WASP_Sample_XY_var._index=195;
  int current_setpos_index = 195;
  if("" && strlen(""))
    stracpy(_H522_WASP_Sample_XY_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H522_WASP_Sample_XY_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_WASP_Sample_XY_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H522_WASP_Sample_XY_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_WASP_Sample_XY_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H522_WASP_Sample_XY_var._parameters.user3[0]='\0';
  _H522_WASP_Sample_XY_var._parameters.xwidth = 0.02;
  _H522_WASP_Sample_XY_var._parameters.yheight = 0.05;
  _H522_WASP_Sample_XY_var._parameters.zdepth = 0;
  _H522_WASP_Sample_XY_var._parameters.xmin = 0;
  _H522_WASP_Sample_XY_var._parameters.xmax = 0;
  _H522_WASP_Sample_XY_var._parameters.ymin = 0;
  _H522_WASP_Sample_XY_var._parameters.ymax = 0;
  _H522_WASP_Sample_XY_var._parameters.zmin = 0;
  _H522_WASP_Sample_XY_var._parameters.zmax = 0;
  _H522_WASP_Sample_XY_var._parameters.bins = 50;
  _H522_WASP_Sample_XY_var._parameters.min = -1e40;
  _H522_WASP_Sample_XY_var._parameters.max = 1e40;
  _H522_WASP_Sample_XY_var._parameters.restore_neutron = 1;
  _H522_WASP_Sample_XY_var._parameters.radius = 0;
  if("x y" && strlen("x y"))
    stracpy(_H522_WASP_Sample_XY_var._parameters.options, "x y" ? "x y" : "", 16384);
  else 
  _H522_WASP_Sample_XY_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Sample_XY_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Sample_XY_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Sample_XY_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Sample_XY_var._parameters.geometry[0]='\0';
  _H522_WASP_Sample_XY_var._parameters.nowritefile = 0;
  _H522_WASP_Sample_XY_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Sample_XY_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Sample_XY_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Sample_XY_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Sample_XY_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Sample_XY_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Sample_XY_var._parameters.username3[0]='\0';


  /* component H522_WASP_Sample_XY=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H522_Straight_Last_var._rotation_absolute, _H522_WASP_Sample_XY_var._rotation_absolute);
    rot_transpose(_H522_WASP_Sample_Div_var._rotation_absolute, tr1);
    rot_mul(_H522_WASP_Sample_XY_var._rotation_absolute, tr1, _H522_WASP_Sample_XY_var._rotation_relative);
    _H522_WASP_Sample_XY_var._rotation_is_identity =  rot_test_identity(_H522_WASP_Sample_XY_var._rotation_relative);
    tc1 = coords_set(
      0, 0, WASP_L + 1.76);
    rot_transpose(_H522_Straight_Last_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_WASP_Sample_XY_var._position_absolute = coords_add(_H522_Straight_Last_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_WASP_Sample_Div_var._position_absolute, _H522_WASP_Sample_XY_var._position_absolute);
    _H522_WASP_Sample_XY_var._position_relative = rot_apply(_H522_WASP_Sample_XY_var._rotation_absolute, tc1);
  } /* H522_WASP_Sample_XY=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H522_WASP_Sample_XY", _H522_WASP_Sample_XY_var._position_absolute, _H522_WASP_Sample_XY_var._rotation_absolute);
  instrument->_position_absolute[195] = _H522_WASP_Sample_XY_var._position_absolute;
  instrument->_position_relative[195] = _H522_WASP_Sample_XY_var._position_relative;
    _H522_WASP_Sample_XY_var._position_relative_is_zero =  coords_test_zero(_H522_WASP_Sample_XY_var._position_relative);
  instrument->counter_N[195]  = instrument->counter_P[195] = instrument->counter_P2[195] = 0;
  instrument->counter_AbsorbProp[195]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0194_H522_WASP_Sample_XY", _H522_WASP_Sample_XY_var._position_absolute, _H522_WASP_Sample_XY_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "xwidth", "0", "0.02","MCNUM");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "yheight", "0", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "options", "NULL", "x y", "char*");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0194_H522_WASP_Sample_XY", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_WASP_Sample_XY_setpos */

/* component H522_WASP_Sample_L=Monitor_nD() SETTING, POSITION/ROTATION */
int _H522_WASP_Sample_L_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_WASP_Sample_L_setpos] component H522_WASP_Sample_L=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H522_WASP_Sample_L_var._name, "H522_WASP_Sample_L", 16384);
  stracpy(_H522_WASP_Sample_L_var._type, "Monitor_nD", 16384);
  _H522_WASP_Sample_L_var._index=196;
  int current_setpos_index = 196;
  if("" && strlen(""))
    stracpy(_H522_WASP_Sample_L_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H522_WASP_Sample_L_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_WASP_Sample_L_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H522_WASP_Sample_L_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_WASP_Sample_L_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H522_WASP_Sample_L_var._parameters.user3[0]='\0';
  _H522_WASP_Sample_L_var._parameters.xwidth = 0.02;
  _H522_WASP_Sample_L_var._parameters.yheight = 0.05;
  _H522_WASP_Sample_L_var._parameters.zdepth = 0;
  _H522_WASP_Sample_L_var._parameters.xmin = 0;
  _H522_WASP_Sample_L_var._parameters.xmax = 0;
  _H522_WASP_Sample_L_var._parameters.ymin = 0;
  _H522_WASP_Sample_L_var._parameters.ymax = 0;
  _H522_WASP_Sample_L_var._parameters.zmin = 0;
  _H522_WASP_Sample_L_var._parameters.zmax = 0;
  _H522_WASP_Sample_L_var._parameters.bins = 50;
  _H522_WASP_Sample_L_var._parameters.min = -1e40;
  _H522_WASP_Sample_L_var._parameters.max = 1e40;
  _H522_WASP_Sample_L_var._parameters.restore_neutron = 1;
  _H522_WASP_Sample_L_var._parameters.radius = 0;
  if("wavelength limits=[1 10]" && strlen("wavelength limits=[1 10]"))
    stracpy(_H522_WASP_Sample_L_var._parameters.options, "wavelength limits=[1 10]" ? "wavelength limits=[1 10]" : "", 16384);
  else 
  _H522_WASP_Sample_L_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Sample_L_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Sample_L_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Sample_L_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Sample_L_var._parameters.geometry[0]='\0';
  _H522_WASP_Sample_L_var._parameters.nowritefile = 0;
  _H522_WASP_Sample_L_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Sample_L_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Sample_L_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Sample_L_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Sample_L_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Sample_L_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Sample_L_var._parameters.username3[0]='\0';


  /* component H522_WASP_Sample_L=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H522_Straight_Last_var._rotation_absolute, _H522_WASP_Sample_L_var._rotation_absolute);
    rot_transpose(_H522_WASP_Sample_XY_var._rotation_absolute, tr1);
    rot_mul(_H522_WASP_Sample_L_var._rotation_absolute, tr1, _H522_WASP_Sample_L_var._rotation_relative);
    _H522_WASP_Sample_L_var._rotation_is_identity =  rot_test_identity(_H522_WASP_Sample_L_var._rotation_relative);
    tc1 = coords_set(
      0, 0, WASP_L + 1.76);
    rot_transpose(_H522_Straight_Last_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_WASP_Sample_L_var._position_absolute = coords_add(_H522_Straight_Last_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_WASP_Sample_XY_var._position_absolute, _H522_WASP_Sample_L_var._position_absolute);
    _H522_WASP_Sample_L_var._position_relative = rot_apply(_H522_WASP_Sample_L_var._rotation_absolute, tc1);
  } /* H522_WASP_Sample_L=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H522_WASP_Sample_L", _H522_WASP_Sample_L_var._position_absolute, _H522_WASP_Sample_L_var._rotation_absolute);
  instrument->_position_absolute[196] = _H522_WASP_Sample_L_var._position_absolute;
  instrument->_position_relative[196] = _H522_WASP_Sample_L_var._position_relative;
    _H522_WASP_Sample_L_var._position_relative_is_zero =  coords_test_zero(_H522_WASP_Sample_L_var._position_relative);
  instrument->counter_N[196]  = instrument->counter_P[196] = instrument->counter_P2[196] = 0;
  instrument->counter_AbsorbProp[196]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0195_H522_WASP_Sample_L", _H522_WASP_Sample_L_var._position_absolute, _H522_WASP_Sample_L_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "xwidth", "0", "0.02","MCNUM");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "yheight", "0", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "options", "NULL", "wavelength limits=[1 10]", "char*");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0195_H522_WASP_Sample_L", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_WASP_Sample_L_setpos */

/* component H522_WASP_Sample=Incoherent() SETTING, POSITION/ROTATION */
int _H522_WASP_Sample_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_WASP_Sample_setpos] component H522_WASP_Sample=Incoherent() SETTING [Incoherent:0]");
  stracpy(_H522_WASP_Sample_var._name, "H522_WASP_Sample", 16384);
  stracpy(_H522_WASP_Sample_var._type, "Incoherent", 16384);
  _H522_WASP_Sample_var._index=197;
  int current_setpos_index = 197;
  _H522_WASP_Sample_var._parameters.geometry[0]='\0';
  _H522_WASP_Sample_var._parameters.radius = 0.02;
  _H522_WASP_Sample_var._parameters.xwidth = 0;
  _H522_WASP_Sample_var._parameters.yheight = 0.04;
  _H522_WASP_Sample_var._parameters.zdepth = 0;
  _H522_WASP_Sample_var._parameters.thickness = 0;
  _H522_WASP_Sample_var._parameters.target_x = 0;
  _H522_WASP_Sample_var._parameters.target_y = 0;
  _H522_WASP_Sample_var._parameters.target_z = 0;
  _H522_WASP_Sample_var._parameters.focus_r = 0;
  _H522_WASP_Sample_var._parameters.focus_xw = 0;
  _H522_WASP_Sample_var._parameters.focus_yh = 0;
  _H522_WASP_Sample_var._parameters.focus_aw = 180;
  _H522_WASP_Sample_var._parameters.focus_ah = 30;
  _H522_WASP_Sample_var._parameters.target_index = + 1;
  _H522_WASP_Sample_var._parameters.pack = 1;
  _H522_WASP_Sample_var._parameters.p_interact = 1;
  _H522_WASP_Sample_var._parameters.f_QE = 0;
  _H522_WASP_Sample_var._parameters.gamma = 0;
  _H522_WASP_Sample_var._parameters.Etrans = 0;
  _H522_WASP_Sample_var._parameters.deltaE = 0;
  _H522_WASP_Sample_var._parameters.sigma_abs = 5.08;
  _H522_WASP_Sample_var._parameters.sigma_inc = 5.08;
  _H522_WASP_Sample_var._parameters.Vc = 13.827;
  _H522_WASP_Sample_var._parameters.concentric = 0;
  _H522_WASP_Sample_var._parameters.order = 0;


  /* component H522_WASP_Sample=Incoherent() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H522_Straight_Last_var._rotation_absolute, _H522_WASP_Sample_var._rotation_absolute);
    rot_transpose(_H522_WASP_Sample_L_var._rotation_absolute, tr1);
    rot_mul(_H522_WASP_Sample_var._rotation_absolute, tr1, _H522_WASP_Sample_var._rotation_relative);
    _H522_WASP_Sample_var._rotation_is_identity =  rot_test_identity(_H522_WASP_Sample_var._rotation_relative);
    tc1 = coords_set(
      0, 0, WASP_L + 1.76);
    rot_transpose(_H522_Straight_Last_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_WASP_Sample_var._position_absolute = coords_add(_H522_Straight_Last_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_WASP_Sample_L_var._position_absolute, _H522_WASP_Sample_var._position_absolute);
    _H522_WASP_Sample_var._position_relative = rot_apply(_H522_WASP_Sample_var._rotation_absolute, tc1);
  } /* H522_WASP_Sample=Incoherent() AT ROTATED */
  DEBUG_COMPONENT("H522_WASP_Sample", _H522_WASP_Sample_var._position_absolute, _H522_WASP_Sample_var._rotation_absolute);
  instrument->_position_absolute[197] = _H522_WASP_Sample_var._position_absolute;
  instrument->_position_relative[197] = _H522_WASP_Sample_var._position_relative;
    _H522_WASP_Sample_var._position_relative_is_zero =  coords_test_zero(_H522_WASP_Sample_var._position_relative);
  instrument->counter_N[197]  = instrument->counter_P[197] = instrument->counter_P2[197] = 0;
  instrument->counter_AbsorbProp[197]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0196_H522_WASP_Sample", _H522_WASP_Sample_var._position_absolute, _H522_WASP_Sample_var._rotation_absolute, "Incoherent");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "geometry", 0, 0, "char*");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "radius", "0", "0.02","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "yheight", "0", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "target_x", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "target_y", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "target_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "focus_r", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "focus_xw", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "focus_yh", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "focus_aw", "0", "180","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "focus_ah", "0", "30","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "target_index", "0", "+ 1","int");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "p_interact", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "f_QE", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "gamma", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "Etrans", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "deltaE", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "sigma_abs", "5.08", "5.08","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "sigma_inc", "5.08", "5.08","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "Vc", "13.827", "13.827","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0196_H522_WASP_Sample", "order", "0", "0","MCNUM");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_WASP_Sample_setpos */

/* component H522_WASP_Detector=Monitor_nD() SETTING, POSITION/ROTATION */
int _H522_WASP_Detector_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_WASP_Detector_setpos] component H522_WASP_Detector=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H522_WASP_Detector_var._name, "H522_WASP_Detector", 16384);
  stracpy(_H522_WASP_Detector_var._type, "Monitor_nD", 16384);
  _H522_WASP_Detector_var._index=198;
  int current_setpos_index = 198;
  if("" && strlen(""))
    stracpy(_H522_WASP_Detector_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H522_WASP_Detector_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_WASP_Detector_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H522_WASP_Detector_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_WASP_Detector_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H522_WASP_Detector_var._parameters.user3[0]='\0';
  _H522_WASP_Detector_var._parameters.xwidth = 0.32;
  _H522_WASP_Detector_var._parameters.yheight = 0.32;
  _H522_WASP_Detector_var._parameters.zdepth = 0;
  _H522_WASP_Detector_var._parameters.xmin = 0;
  _H522_WASP_Detector_var._parameters.xmax = 0;
  _H522_WASP_Detector_var._parameters.ymin = 0;
  _H522_WASP_Detector_var._parameters.ymax = 0;
  _H522_WASP_Detector_var._parameters.zmin = 0;
  _H522_WASP_Detector_var._parameters.zmax = 0;
  _H522_WASP_Detector_var._parameters.bins = 32;
  _H522_WASP_Detector_var._parameters.min = -1e40;
  _H522_WASP_Detector_var._parameters.max = 1e40;
  _H522_WASP_Detector_var._parameters.restore_neutron = 1;
  _H522_WASP_Detector_var._parameters.radius = 0;
  if("x y" && strlen("x y"))
    stracpy(_H522_WASP_Detector_var._parameters.options, "x y" ? "x y" : "", 16384);
  else 
  _H522_WASP_Detector_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Detector_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Detector_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Detector_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Detector_var._parameters.geometry[0]='\0';
  _H522_WASP_Detector_var._parameters.nowritefile = 0;
  _H522_WASP_Detector_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Detector_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Detector_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Detector_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Detector_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Detector_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Detector_var._parameters.username3[0]='\0';


  /* component H522_WASP_Detector=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H522_WASP_Sample_var._rotation_absolute, _H522_WASP_Detector_var._rotation_absolute);
    rot_transpose(_H522_WASP_Sample_var._rotation_absolute, tr1);
    rot_mul(_H522_WASP_Detector_var._rotation_absolute, tr1, _H522_WASP_Detector_var._rotation_relative);
    _H522_WASP_Detector_var._rotation_is_identity =  rot_test_identity(_H522_WASP_Detector_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 4.6);
    rot_transpose(_H522_WASP_Sample_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_WASP_Detector_var._position_absolute = coords_add(_H522_WASP_Sample_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_WASP_Sample_var._position_absolute, _H522_WASP_Detector_var._position_absolute);
    _H522_WASP_Detector_var._position_relative = rot_apply(_H522_WASP_Detector_var._rotation_absolute, tc1);
  } /* H522_WASP_Detector=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H522_WASP_Detector", _H522_WASP_Detector_var._position_absolute, _H522_WASP_Detector_var._rotation_absolute);
  instrument->_position_absolute[198] = _H522_WASP_Detector_var._position_absolute;
  instrument->_position_relative[198] = _H522_WASP_Detector_var._position_relative;
    _H522_WASP_Detector_var._position_relative_is_zero =  coords_test_zero(_H522_WASP_Detector_var._position_relative);
  instrument->counter_N[198]  = instrument->counter_P[198] = instrument->counter_P2[198] = 0;
  instrument->counter_AbsorbProp[198]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0197_H522_WASP_Detector", _H522_WASP_Detector_var._position_absolute, _H522_WASP_Detector_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "xwidth", "0", "0.32","MCNUM");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "yheight", "0", "0.32","MCNUM");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "bins", "0", "32","int");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "options", "NULL", "x y", "char*");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0197_H522_WASP_Detector", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_WASP_Detector_setpos */

/* component H522_WASP_Spectrometer=Monitor_nD() SETTING, POSITION/ROTATION */
int _H522_WASP_Spectrometer_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_WASP_Spectrometer_setpos] component H522_WASP_Spectrometer=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H522_WASP_Spectrometer_var._name, "H522_WASP_Spectrometer", 16384);
  stracpy(_H522_WASP_Spectrometer_var._type, "Monitor_nD", 16384);
  _H522_WASP_Spectrometer_var._index=199;
  int current_setpos_index = 199;
  if("" && strlen(""))
    stracpy(_H522_WASP_Spectrometer_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H522_WASP_Spectrometer_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_WASP_Spectrometer_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H522_WASP_Spectrometer_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_WASP_Spectrometer_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H522_WASP_Spectrometer_var._parameters.user3[0]='\0';
  _H522_WASP_Spectrometer_var._parameters.xwidth = 0;
  _H522_WASP_Spectrometer_var._parameters.yheight = 0.3;
  _H522_WASP_Spectrometer_var._parameters.zdepth = 0;
  _H522_WASP_Spectrometer_var._parameters.xmin = 0;
  _H522_WASP_Spectrometer_var._parameters.xmax = 0;
  _H522_WASP_Spectrometer_var._parameters.ymin = 0;
  _H522_WASP_Spectrometer_var._parameters.ymax = 0;
  _H522_WASP_Spectrometer_var._parameters.zmin = 0;
  _H522_WASP_Spectrometer_var._parameters.zmax = 0;
  _H522_WASP_Spectrometer_var._parameters.bins = 0;
  _H522_WASP_Spectrometer_var._parameters.min = -1e40;
  _H522_WASP_Spectrometer_var._parameters.max = 1e40;
  _H522_WASP_Spectrometer_var._parameters.restore_neutron = 1;
  _H522_WASP_Spectrometer_var._parameters.radius = 3;
  if("angle limits=[-170 170] bins=50, energy limits=[0 5], banana" && strlen("angle limits=[-170 170] bins=50, energy limits=[0 5], banana"))
    stracpy(_H522_WASP_Spectrometer_var._parameters.options, "angle limits=[-170 170] bins=50, energy limits=[0 5], banana" ? "angle limits=[-170 170] bins=50, energy limits=[0 5], banana" : "", 16384);
  else 
  _H522_WASP_Spectrometer_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Spectrometer_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Spectrometer_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Spectrometer_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Spectrometer_var._parameters.geometry[0]='\0';
  _H522_WASP_Spectrometer_var._parameters.nowritefile = 0;
  _H522_WASP_Spectrometer_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Spectrometer_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Spectrometer_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Spectrometer_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Spectrometer_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Spectrometer_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Spectrometer_var._parameters.username3[0]='\0';


  /* component H522_WASP_Spectrometer=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H522_WASP_Sample_var._rotation_absolute, _H522_WASP_Spectrometer_var._rotation_absolute);
    rot_transpose(_H522_WASP_Detector_var._rotation_absolute, tr1);
    rot_mul(_H522_WASP_Spectrometer_var._rotation_absolute, tr1, _H522_WASP_Spectrometer_var._rotation_relative);
    _H522_WASP_Spectrometer_var._rotation_is_identity =  rot_test_identity(_H522_WASP_Spectrometer_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H522_WASP_Sample_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_WASP_Spectrometer_var._position_absolute = coords_add(_H522_WASP_Sample_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_WASP_Detector_var._position_absolute, _H522_WASP_Spectrometer_var._position_absolute);
    _H522_WASP_Spectrometer_var._position_relative = rot_apply(_H522_WASP_Spectrometer_var._rotation_absolute, tc1);
  } /* H522_WASP_Spectrometer=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H522_WASP_Spectrometer", _H522_WASP_Spectrometer_var._position_absolute, _H522_WASP_Spectrometer_var._rotation_absolute);
  instrument->_position_absolute[199] = _H522_WASP_Spectrometer_var._position_absolute;
  instrument->_position_relative[199] = _H522_WASP_Spectrometer_var._position_relative;
    _H522_WASP_Spectrometer_var._position_relative_is_zero =  coords_test_zero(_H522_WASP_Spectrometer_var._position_relative);
  instrument->counter_N[199]  = instrument->counter_P[199] = instrument->counter_P2[199] = 0;
  instrument->counter_AbsorbProp[199]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0198_H522_WASP_Spectrometer", _H522_WASP_Spectrometer_var._position_absolute, _H522_WASP_Spectrometer_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "yheight", "0", "0.3","MCNUM");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "radius", "0", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "options", "NULL", "angle limits=[-170 170] bins=50, energy limits=[0 5], banana", "char*");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0198_H522_WASP_Spectrometer", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_WASP_Spectrometer_setpos */

/* component H522_WASP_Diffractometer=Monitor_nD() SETTING, POSITION/ROTATION */
int _H522_WASP_Diffractometer_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H522_WASP_Diffractometer_setpos] component H522_WASP_Diffractometer=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H522_WASP_Diffractometer_var._name, "H522_WASP_Diffractometer", 16384);
  stracpy(_H522_WASP_Diffractometer_var._type, "Monitor_nD", 16384);
  _H522_WASP_Diffractometer_var._index=200;
  int current_setpos_index = 200;
  if("" && strlen(""))
    stracpy(_H522_WASP_Diffractometer_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H522_WASP_Diffractometer_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_WASP_Diffractometer_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H522_WASP_Diffractometer_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H522_WASP_Diffractometer_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H522_WASP_Diffractometer_var._parameters.user3[0]='\0';
  _H522_WASP_Diffractometer_var._parameters.xwidth = 0;
  _H522_WASP_Diffractometer_var._parameters.yheight = 0.3;
  _H522_WASP_Diffractometer_var._parameters.zdepth = 0;
  _H522_WASP_Diffractometer_var._parameters.xmin = 0;
  _H522_WASP_Diffractometer_var._parameters.xmax = 0;
  _H522_WASP_Diffractometer_var._parameters.ymin = 0;
  _H522_WASP_Diffractometer_var._parameters.ymax = 0;
  _H522_WASP_Diffractometer_var._parameters.zmin = 0;
  _H522_WASP_Diffractometer_var._parameters.zmax = 0;
  _H522_WASP_Diffractometer_var._parameters.bins = 0;
  _H522_WASP_Diffractometer_var._parameters.min = -1e40;
  _H522_WASP_Diffractometer_var._parameters.max = 1e40;
  _H522_WASP_Diffractometer_var._parameters.restore_neutron = 0;
  _H522_WASP_Diffractometer_var._parameters.radius = 3.5;
  if("theta bins=100 limits=[-170 170], y, banana" && strlen("theta bins=100 limits=[-170 170], y, banana"))
    stracpy(_H522_WASP_Diffractometer_var._parameters.options, "theta bins=100 limits=[-170 170], y, banana" ? "theta bins=100 limits=[-170 170], y, banana" : "", 16384);
  else 
  _H522_WASP_Diffractometer_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Diffractometer_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Diffractometer_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Diffractometer_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Diffractometer_var._parameters.geometry[0]='\0';
  _H522_WASP_Diffractometer_var._parameters.nowritefile = 0;
  _H522_WASP_Diffractometer_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Diffractometer_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Diffractometer_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Diffractometer_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Diffractometer_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H522_WASP_Diffractometer_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H522_WASP_Diffractometer_var._parameters.username3[0]='\0';


  /* component H522_WASP_Diffractometer=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H522_WASP_Sample_var._rotation_absolute, _H522_WASP_Diffractometer_var._rotation_absolute);
    rot_transpose(_H522_WASP_Spectrometer_var._rotation_absolute, tr1);
    rot_mul(_H522_WASP_Diffractometer_var._rotation_absolute, tr1, _H522_WASP_Diffractometer_var._rotation_relative);
    _H522_WASP_Diffractometer_var._rotation_is_identity =  rot_test_identity(_H522_WASP_Diffractometer_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H522_WASP_Sample_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H522_WASP_Diffractometer_var._position_absolute = coords_add(_H522_WASP_Sample_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_WASP_Spectrometer_var._position_absolute, _H522_WASP_Diffractometer_var._position_absolute);
    _H522_WASP_Diffractometer_var._position_relative = rot_apply(_H522_WASP_Diffractometer_var._rotation_absolute, tc1);
  } /* H522_WASP_Diffractometer=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H522_WASP_Diffractometer", _H522_WASP_Diffractometer_var._position_absolute, _H522_WASP_Diffractometer_var._rotation_absolute);
  instrument->_position_absolute[200] = _H522_WASP_Diffractometer_var._position_absolute;
  instrument->_position_relative[200] = _H522_WASP_Diffractometer_var._position_relative;
    _H522_WASP_Diffractometer_var._position_relative_is_zero =  coords_test_zero(_H522_WASP_Diffractometer_var._position_relative);
  instrument->counter_N[200]  = instrument->counter_P[200] = instrument->counter_P2[200] = 0;
  instrument->counter_AbsorbProp[200]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0199_H522_WASP_Diffractometer", _H522_WASP_Diffractometer_var._position_absolute, _H522_WASP_Diffractometer_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "yheight", "0", "0.3","MCNUM");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "restore_neutron", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "radius", "0", "3.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "options", "NULL", "theta bins=100 limits=[-170 170], y, banana", "char*");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0199_H522_WASP_Diffractometer", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H522_WASP_Diffractometer_setpos */

/* component H523_start=Arm() SETTING, POSITION/ROTATION */
int _H523_start_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_start_setpos] component H523_start=Arm() SETTING [Arm:0]");
  stracpy(_H523_start_var._name, "H523_start", 16384);
  stracpy(_H523_start_var._type, "Arm", 16384);
  _H523_start_var._index=201;
  int current_setpos_index = 201;
  /* component H523_start=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H523_origin_var._rotation_absolute, _H523_start_var._rotation_absolute);
    rot_transpose(_H522_WASP_Diffractometer_var._rotation_absolute, tr1);
    rot_mul(_H523_start_var._rotation_absolute, tr1, _H523_start_var._rotation_relative);
    _H523_start_var._rotation_is_identity =  rot_test_identity(_H523_start_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H523_origin_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_start_var._position_absolute = coords_add(_H523_origin_var._position_absolute, tc2);
    tc1 = coords_sub(_H522_WASP_Diffractometer_var._position_absolute, _H523_start_var._position_absolute);
    _H523_start_var._position_relative = rot_apply(_H523_start_var._rotation_absolute, tc1);
  } /* H523_start=Arm() AT ROTATED */
  DEBUG_COMPONENT("H523_start", _H523_start_var._position_absolute, _H523_start_var._rotation_absolute);
  instrument->_position_absolute[201] = _H523_start_var._position_absolute;
  instrument->_position_relative[201] = _H523_start_var._position_relative;
    _H523_start_var._position_relative_is_zero =  coords_test_zero(_H523_start_var._position_relative);
  instrument->counter_N[201]  = instrument->counter_P[201] = instrument->counter_P2[201] = 0;
  instrument->counter_AbsorbProp[201]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0200_H523_start", _H523_start_var._position_absolute, _H523_start_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_start_setpos */

/* component H523_Curved=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_setpos] component H523_Curved=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_var._name, "H523_Curved", 16384);
  stracpy(_H523_Curved_var._type, "Guide_gravity", 16384);
  _H523_Curved_var._index=202;
  int current_setpos_index = 202;
  _H523_Curved_var._parameters.w1 = 0.06;
  _H523_Curved_var._parameters.h1 = 0.12;
  _H523_Curved_var._parameters.w2 = 0;
  _H523_Curved_var._parameters.h2 = 0;
  _H523_Curved_var._parameters.l = 50.0 / 25;
  _H523_Curved_var._parameters.R0 = gR0;
  _H523_Curved_var._parameters.Qc = gQc;
  _H523_Curved_var._parameters.alpha = gAlpha;
  _H523_Curved_var._parameters.m = 1.2;
  _H523_Curved_var._parameters.W = gW;
  _H523_Curved_var._parameters.nslit = 1;
  _H523_Curved_var._parameters.d = 0.0005;
  _H523_Curved_var._parameters.mleft = -1;
  _H523_Curved_var._parameters.mright = 1.5;
  _H523_Curved_var._parameters.mtop = -1;
  _H523_Curved_var._parameters.mbottom = -1;
  _H523_Curved_var._parameters.nhslit = 1;
  _H523_Curved_var._parameters.G = 0;
  _H523_Curved_var._parameters.aleft = -1;
  _H523_Curved_var._parameters.aright = -1;
  _H523_Curved_var._parameters.atop = -1;
  _H523_Curved_var._parameters.abottom = -1;
  _H523_Curved_var._parameters.wavy = 0;
  _H523_Curved_var._parameters.wavy_z = 0;
  _H523_Curved_var._parameters.wavy_tb = 0;
  _H523_Curved_var._parameters.wavy_lr = 0;
  _H523_Curved_var._parameters.chamfers = 0;
  _H523_Curved_var._parameters.chamfers_z = 0;
  _H523_Curved_var._parameters.chamfers_lr = 0;
  _H523_Curved_var._parameters.chamfers_tb = 0;
  _H523_Curved_var._parameters.nelements = 1;
  _H523_Curved_var._parameters.nu = 0;
  _H523_Curved_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_var._parameters.reflect[0]='\0';


  /* component H523_Curved=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_start_var._rotation_absolute, _H523_Curved_var._rotation_absolute);
    rot_transpose(_H523_start_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_var._rotation_absolute, tr1, _H523_Curved_var._rotation_relative);
    _H523_Curved_var._rotation_is_identity =  rot_test_identity(_H523_Curved_var._rotation_relative);
    tc1 = coords_set(
      0, 0, gGap);
    rot_transpose(_H523_start_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_var._position_absolute = coords_add(_H523_start_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_start_var._position_absolute, _H523_Curved_var._position_absolute);
    _H523_Curved_var._position_relative = rot_apply(_H523_Curved_var._rotation_absolute, tc1);
  } /* H523_Curved=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved", _H523_Curved_var._position_absolute, _H523_Curved_var._rotation_absolute);
  instrument->_position_absolute[202] = _H523_Curved_var._position_absolute;
  instrument->_position_relative[202] = _H523_Curved_var._position_relative;
    _H523_Curved_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_var._position_relative);
  instrument->counter_N[202]  = instrument->counter_P[202] = instrument->counter_P2[202] = 0;
  instrument->counter_AbsorbProp[202]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0201_H523_Curved", _H523_Curved_var._position_absolute, _H523_Curved_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0201_H523_Curved", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_setpos */

/* component H523_Curved_203=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_203_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_203_setpos] component H523_Curved_203=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_203_var._name, "H523_Curved_203", 16384);
  stracpy(_H523_Curved_203_var._type, "Guide_gravity", 16384);
  _H523_Curved_203_var._index=203;
  int current_setpos_index = 203;
  _H523_Curved_203_var._parameters.w1 = 0.06;
  _H523_Curved_203_var._parameters.h1 = 0.12;
  _H523_Curved_203_var._parameters.w2 = 0;
  _H523_Curved_203_var._parameters.h2 = 0;
  _H523_Curved_203_var._parameters.l = 50.0 / 25;
  _H523_Curved_203_var._parameters.R0 = gR0;
  _H523_Curved_203_var._parameters.Qc = gQc;
  _H523_Curved_203_var._parameters.alpha = gAlpha;
  _H523_Curved_203_var._parameters.m = 1.2;
  _H523_Curved_203_var._parameters.W = gW;
  _H523_Curved_203_var._parameters.nslit = 1;
  _H523_Curved_203_var._parameters.d = 0.0005;
  _H523_Curved_203_var._parameters.mleft = -1;
  _H523_Curved_203_var._parameters.mright = 1.5;
  _H523_Curved_203_var._parameters.mtop = -1;
  _H523_Curved_203_var._parameters.mbottom = -1;
  _H523_Curved_203_var._parameters.nhslit = 1;
  _H523_Curved_203_var._parameters.G = 0;
  _H523_Curved_203_var._parameters.aleft = -1;
  _H523_Curved_203_var._parameters.aright = -1;
  _H523_Curved_203_var._parameters.atop = -1;
  _H523_Curved_203_var._parameters.abottom = -1;
  _H523_Curved_203_var._parameters.wavy = 0;
  _H523_Curved_203_var._parameters.wavy_z = 0;
  _H523_Curved_203_var._parameters.wavy_tb = 0;
  _H523_Curved_203_var._parameters.wavy_lr = 0;
  _H523_Curved_203_var._parameters.chamfers = 0;
  _H523_Curved_203_var._parameters.chamfers_z = 0;
  _H523_Curved_203_var._parameters.chamfers_lr = 0;
  _H523_Curved_203_var._parameters.chamfers_tb = 0;
  _H523_Curved_203_var._parameters.nelements = 1;
  _H523_Curved_203_var._parameters.nu = 0;
  _H523_Curved_203_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_203_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_203_var._parameters.reflect[0]='\0';


  /* component H523_Curved_203=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_var._rotation_absolute, _H523_Curved_203_var._rotation_absolute);
    rot_transpose(_H523_Curved_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_203_var._rotation_absolute, tr1, _H523_Curved_203_var._rotation_relative);
    _H523_Curved_203_var._rotation_is_identity =  rot_test_identity(_H523_Curved_203_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved , l ) + gGap);
    rot_transpose(_H523_Curved_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_203_var._position_absolute = coords_add(_H523_Curved_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_var._position_absolute, _H523_Curved_203_var._position_absolute);
    _H523_Curved_203_var._position_relative = rot_apply(_H523_Curved_203_var._rotation_absolute, tc1);
  } /* H523_Curved_203=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_203", _H523_Curved_203_var._position_absolute, _H523_Curved_203_var._rotation_absolute);
  instrument->_position_absolute[203] = _H523_Curved_203_var._position_absolute;
  instrument->_position_relative[203] = _H523_Curved_203_var._position_relative;
    _H523_Curved_203_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_203_var._position_relative);
  instrument->counter_N[203]  = instrument->counter_P[203] = instrument->counter_P2[203] = 0;
  instrument->counter_AbsorbProp[203]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0202_H523_Curved_203", _H523_Curved_203_var._position_absolute, _H523_Curved_203_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0202_H523_Curved_203", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_203_setpos */

/* component H523_Curved_204=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_204_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_204_setpos] component H523_Curved_204=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_204_var._name, "H523_Curved_204", 16384);
  stracpy(_H523_Curved_204_var._type, "Guide_gravity", 16384);
  _H523_Curved_204_var._index=204;
  int current_setpos_index = 204;
  _H523_Curved_204_var._parameters.w1 = 0.06;
  _H523_Curved_204_var._parameters.h1 = 0.12;
  _H523_Curved_204_var._parameters.w2 = 0;
  _H523_Curved_204_var._parameters.h2 = 0;
  _H523_Curved_204_var._parameters.l = 50.0 / 25;
  _H523_Curved_204_var._parameters.R0 = gR0;
  _H523_Curved_204_var._parameters.Qc = gQc;
  _H523_Curved_204_var._parameters.alpha = gAlpha;
  _H523_Curved_204_var._parameters.m = 1.2;
  _H523_Curved_204_var._parameters.W = gW;
  _H523_Curved_204_var._parameters.nslit = 1;
  _H523_Curved_204_var._parameters.d = 0.0005;
  _H523_Curved_204_var._parameters.mleft = -1;
  _H523_Curved_204_var._parameters.mright = 1.5;
  _H523_Curved_204_var._parameters.mtop = -1;
  _H523_Curved_204_var._parameters.mbottom = -1;
  _H523_Curved_204_var._parameters.nhslit = 1;
  _H523_Curved_204_var._parameters.G = 0;
  _H523_Curved_204_var._parameters.aleft = -1;
  _H523_Curved_204_var._parameters.aright = -1;
  _H523_Curved_204_var._parameters.atop = -1;
  _H523_Curved_204_var._parameters.abottom = -1;
  _H523_Curved_204_var._parameters.wavy = 0;
  _H523_Curved_204_var._parameters.wavy_z = 0;
  _H523_Curved_204_var._parameters.wavy_tb = 0;
  _H523_Curved_204_var._parameters.wavy_lr = 0;
  _H523_Curved_204_var._parameters.chamfers = 0;
  _H523_Curved_204_var._parameters.chamfers_z = 0;
  _H523_Curved_204_var._parameters.chamfers_lr = 0;
  _H523_Curved_204_var._parameters.chamfers_tb = 0;
  _H523_Curved_204_var._parameters.nelements = 1;
  _H523_Curved_204_var._parameters.nu = 0;
  _H523_Curved_204_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_204_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_204_var._parameters.reflect[0]='\0';


  /* component H523_Curved_204=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_203_var._rotation_absolute, _H523_Curved_204_var._rotation_absolute);
    rot_transpose(_H523_Curved_203_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_204_var._rotation_absolute, tr1, _H523_Curved_204_var._rotation_relative);
    _H523_Curved_204_var._rotation_is_identity =  rot_test_identity(_H523_Curved_204_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_203 , l ) + gGap);
    rot_transpose(_H523_Curved_203_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_204_var._position_absolute = coords_add(_H523_Curved_203_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_203_var._position_absolute, _H523_Curved_204_var._position_absolute);
    _H523_Curved_204_var._position_relative = rot_apply(_H523_Curved_204_var._rotation_absolute, tc1);
  } /* H523_Curved_204=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_204", _H523_Curved_204_var._position_absolute, _H523_Curved_204_var._rotation_absolute);
  instrument->_position_absolute[204] = _H523_Curved_204_var._position_absolute;
  instrument->_position_relative[204] = _H523_Curved_204_var._position_relative;
    _H523_Curved_204_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_204_var._position_relative);
  instrument->counter_N[204]  = instrument->counter_P[204] = instrument->counter_P2[204] = 0;
  instrument->counter_AbsorbProp[204]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0203_H523_Curved_204", _H523_Curved_204_var._position_absolute, _H523_Curved_204_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0203_H523_Curved_204", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_204_setpos */

/* component H523_Curved_205=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_205_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_205_setpos] component H523_Curved_205=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_205_var._name, "H523_Curved_205", 16384);
  stracpy(_H523_Curved_205_var._type, "Guide_gravity", 16384);
  _H523_Curved_205_var._index=205;
  int current_setpos_index = 205;
  _H523_Curved_205_var._parameters.w1 = 0.06;
  _H523_Curved_205_var._parameters.h1 = 0.12;
  _H523_Curved_205_var._parameters.w2 = 0;
  _H523_Curved_205_var._parameters.h2 = 0;
  _H523_Curved_205_var._parameters.l = 50.0 / 25;
  _H523_Curved_205_var._parameters.R0 = gR0;
  _H523_Curved_205_var._parameters.Qc = gQc;
  _H523_Curved_205_var._parameters.alpha = gAlpha;
  _H523_Curved_205_var._parameters.m = 1.2;
  _H523_Curved_205_var._parameters.W = gW;
  _H523_Curved_205_var._parameters.nslit = 1;
  _H523_Curved_205_var._parameters.d = 0.0005;
  _H523_Curved_205_var._parameters.mleft = -1;
  _H523_Curved_205_var._parameters.mright = 1.5;
  _H523_Curved_205_var._parameters.mtop = -1;
  _H523_Curved_205_var._parameters.mbottom = -1;
  _H523_Curved_205_var._parameters.nhslit = 1;
  _H523_Curved_205_var._parameters.G = 0;
  _H523_Curved_205_var._parameters.aleft = -1;
  _H523_Curved_205_var._parameters.aright = -1;
  _H523_Curved_205_var._parameters.atop = -1;
  _H523_Curved_205_var._parameters.abottom = -1;
  _H523_Curved_205_var._parameters.wavy = 0;
  _H523_Curved_205_var._parameters.wavy_z = 0;
  _H523_Curved_205_var._parameters.wavy_tb = 0;
  _H523_Curved_205_var._parameters.wavy_lr = 0;
  _H523_Curved_205_var._parameters.chamfers = 0;
  _H523_Curved_205_var._parameters.chamfers_z = 0;
  _H523_Curved_205_var._parameters.chamfers_lr = 0;
  _H523_Curved_205_var._parameters.chamfers_tb = 0;
  _H523_Curved_205_var._parameters.nelements = 1;
  _H523_Curved_205_var._parameters.nu = 0;
  _H523_Curved_205_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_205_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_205_var._parameters.reflect[0]='\0';


  /* component H523_Curved_205=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_204_var._rotation_absolute, _H523_Curved_205_var._rotation_absolute);
    rot_transpose(_H523_Curved_204_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_205_var._rotation_absolute, tr1, _H523_Curved_205_var._rotation_relative);
    _H523_Curved_205_var._rotation_is_identity =  rot_test_identity(_H523_Curved_205_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_204 , l ) + gGap);
    rot_transpose(_H523_Curved_204_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_205_var._position_absolute = coords_add(_H523_Curved_204_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_204_var._position_absolute, _H523_Curved_205_var._position_absolute);
    _H523_Curved_205_var._position_relative = rot_apply(_H523_Curved_205_var._rotation_absolute, tc1);
  } /* H523_Curved_205=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_205", _H523_Curved_205_var._position_absolute, _H523_Curved_205_var._rotation_absolute);
  instrument->_position_absolute[205] = _H523_Curved_205_var._position_absolute;
  instrument->_position_relative[205] = _H523_Curved_205_var._position_relative;
    _H523_Curved_205_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_205_var._position_relative);
  instrument->counter_N[205]  = instrument->counter_P[205] = instrument->counter_P2[205] = 0;
  instrument->counter_AbsorbProp[205]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0204_H523_Curved_205", _H523_Curved_205_var._position_absolute, _H523_Curved_205_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0204_H523_Curved_205", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_205_setpos */

/* component H523_Curved_206=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_206_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_206_setpos] component H523_Curved_206=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_206_var._name, "H523_Curved_206", 16384);
  stracpy(_H523_Curved_206_var._type, "Guide_gravity", 16384);
  _H523_Curved_206_var._index=206;
  int current_setpos_index = 206;
  _H523_Curved_206_var._parameters.w1 = 0.06;
  _H523_Curved_206_var._parameters.h1 = 0.12;
  _H523_Curved_206_var._parameters.w2 = 0;
  _H523_Curved_206_var._parameters.h2 = 0;
  _H523_Curved_206_var._parameters.l = 50.0 / 25;
  _H523_Curved_206_var._parameters.R0 = gR0;
  _H523_Curved_206_var._parameters.Qc = gQc;
  _H523_Curved_206_var._parameters.alpha = gAlpha;
  _H523_Curved_206_var._parameters.m = 1.2;
  _H523_Curved_206_var._parameters.W = gW;
  _H523_Curved_206_var._parameters.nslit = 1;
  _H523_Curved_206_var._parameters.d = 0.0005;
  _H523_Curved_206_var._parameters.mleft = -1;
  _H523_Curved_206_var._parameters.mright = 1.5;
  _H523_Curved_206_var._parameters.mtop = -1;
  _H523_Curved_206_var._parameters.mbottom = -1;
  _H523_Curved_206_var._parameters.nhslit = 1;
  _H523_Curved_206_var._parameters.G = 0;
  _H523_Curved_206_var._parameters.aleft = -1;
  _H523_Curved_206_var._parameters.aright = -1;
  _H523_Curved_206_var._parameters.atop = -1;
  _H523_Curved_206_var._parameters.abottom = -1;
  _H523_Curved_206_var._parameters.wavy = 0;
  _H523_Curved_206_var._parameters.wavy_z = 0;
  _H523_Curved_206_var._parameters.wavy_tb = 0;
  _H523_Curved_206_var._parameters.wavy_lr = 0;
  _H523_Curved_206_var._parameters.chamfers = 0;
  _H523_Curved_206_var._parameters.chamfers_z = 0;
  _H523_Curved_206_var._parameters.chamfers_lr = 0;
  _H523_Curved_206_var._parameters.chamfers_tb = 0;
  _H523_Curved_206_var._parameters.nelements = 1;
  _H523_Curved_206_var._parameters.nu = 0;
  _H523_Curved_206_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_206_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_206_var._parameters.reflect[0]='\0';


  /* component H523_Curved_206=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_205_var._rotation_absolute, _H523_Curved_206_var._rotation_absolute);
    rot_transpose(_H523_Curved_205_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_206_var._rotation_absolute, tr1, _H523_Curved_206_var._rotation_relative);
    _H523_Curved_206_var._rotation_is_identity =  rot_test_identity(_H523_Curved_206_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_205 , l ) + gGap);
    rot_transpose(_H523_Curved_205_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_206_var._position_absolute = coords_add(_H523_Curved_205_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_205_var._position_absolute, _H523_Curved_206_var._position_absolute);
    _H523_Curved_206_var._position_relative = rot_apply(_H523_Curved_206_var._rotation_absolute, tc1);
  } /* H523_Curved_206=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_206", _H523_Curved_206_var._position_absolute, _H523_Curved_206_var._rotation_absolute);
  instrument->_position_absolute[206] = _H523_Curved_206_var._position_absolute;
  instrument->_position_relative[206] = _H523_Curved_206_var._position_relative;
    _H523_Curved_206_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_206_var._position_relative);
  instrument->counter_N[206]  = instrument->counter_P[206] = instrument->counter_P2[206] = 0;
  instrument->counter_AbsorbProp[206]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0205_H523_Curved_206", _H523_Curved_206_var._position_absolute, _H523_Curved_206_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0205_H523_Curved_206", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_206_setpos */

/* component HCS_Al_207=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_207_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_207_setpos] component HCS_Al_207=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_207_var._name, "HCS_Al_207", 16384);
  stracpy(_HCS_Al_207_var._type, "PowderN", 16384);
  _HCS_Al_207_var._index=207;
  int current_setpos_index = 207;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_207_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_207_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_207_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_207_var._parameters.geometry[0]='\0';
  _HCS_Al_207_var._parameters.format[0] = 0;
  _HCS_Al_207_var._parameters.format[1] = 0;
  _HCS_Al_207_var._parameters.format[2] = 0;
  _HCS_Al_207_var._parameters.format[3] = 0;
  _HCS_Al_207_var._parameters.format[4] = 0;
  _HCS_Al_207_var._parameters.format[5] = 0;
  _HCS_Al_207_var._parameters.format[6] = 0;
  _HCS_Al_207_var._parameters.format[7] = 0;
  _HCS_Al_207_var._parameters.format[8] = 0;
  _HCS_Al_207_var._parameters.radius = 0;
  _HCS_Al_207_var._parameters.yheight = 0.12;
  _HCS_Al_207_var._parameters.xwidth = 0.06;
  _HCS_Al_207_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_207_var._parameters.thickness = 0;
  _HCS_Al_207_var._parameters.pack = 1;
  _HCS_Al_207_var._parameters.Vc = 0;
  _HCS_Al_207_var._parameters.sigma_abs = 0;
  _HCS_Al_207_var._parameters.sigma_inc = 0;
  _HCS_Al_207_var._parameters.delta_d_d = 0;
  _HCS_Al_207_var._parameters.p_inc = 0.005;
  _HCS_Al_207_var._parameters.p_transmit = 0.9450;
  _HCS_Al_207_var._parameters.DW = 0;
  _HCS_Al_207_var._parameters.nb_atoms = 1;
  _HCS_Al_207_var._parameters.d_omega = 0;
  _HCS_Al_207_var._parameters.d_phi = 10;
  _HCS_Al_207_var._parameters.tth_sign = 0;
  _HCS_Al_207_var._parameters.p_interact = 0.05;
  _HCS_Al_207_var._parameters.concentric = 0;
  _HCS_Al_207_var._parameters.density = 0;
  _HCS_Al_207_var._parameters.weight = 0;
  _HCS_Al_207_var._parameters.barns = 1;
  _HCS_Al_207_var._parameters.Strain = 0;
  _HCS_Al_207_var._parameters.focus_flip = 0;
  _HCS_Al_207_var._parameters.target_index = 0;
  _HCS_Al_207_var._parameters.order = 1;


  /* component HCS_Al_207=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_206_var._rotation_absolute, _HCS_Al_207_var._rotation_absolute);
    rot_transpose(_H523_Curved_206_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_207_var._rotation_absolute, tr1, _HCS_Al_207_var._rotation_relative);
    _HCS_Al_207_var._rotation_is_identity =  rot_test_identity(_HCS_Al_207_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_206 , l ) + gGap + 0.001);
    rot_transpose(_H523_Curved_206_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_207_var._position_absolute = coords_add(_H523_Curved_206_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_206_var._position_absolute, _HCS_Al_207_var._position_absolute);
    _HCS_Al_207_var._position_relative = rot_apply(_HCS_Al_207_var._rotation_absolute, tc1);
  } /* HCS_Al_207=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_207", _HCS_Al_207_var._position_absolute, _HCS_Al_207_var._rotation_absolute);
  instrument->_position_absolute[207] = _HCS_Al_207_var._position_absolute;
  instrument->_position_relative[207] = _HCS_Al_207_var._position_relative;
    _HCS_Al_207_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_207_var._position_relative);
  instrument->counter_N[207]  = instrument->counter_P[207] = instrument->counter_P2[207] = 0;
  instrument->counter_AbsorbProp[207]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0206_HCS_Al_207", _HCS_Al_207_var._position_absolute, _HCS_Al_207_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0206_HCS_Al_207", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_207_setpos */

/* component H523_VTE=Monitor_nD() SETTING, POSITION/ROTATION */
int _H523_VTE_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_VTE_setpos] component H523_VTE=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H523_VTE_var._name, "H523_VTE", 16384);
  stracpy(_H523_VTE_var._type, "Monitor_nD", 16384);
  _H523_VTE_var._index=208;
  int current_setpos_index = 208;
  if("" && strlen(""))
    stracpy(_H523_VTE_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H523_VTE_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H523_VTE_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H523_VTE_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H523_VTE_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H523_VTE_var._parameters.user3[0]='\0';
  _H523_VTE_var._parameters.xwidth = 0.06;
  _H523_VTE_var._parameters.yheight = 0.12;
  _H523_VTE_var._parameters.zdepth = 0;
  _H523_VTE_var._parameters.xmin = 0;
  _H523_VTE_var._parameters.xmax = 0;
  _H523_VTE_var._parameters.ymin = 0;
  _H523_VTE_var._parameters.ymax = 0;
  _H523_VTE_var._parameters.zmin = 0;
  _H523_VTE_var._parameters.zmax = 0;
  _H523_VTE_var._parameters.bins = 50;
  _H523_VTE_var._parameters.min = -1e40;
  _H523_VTE_var._parameters.max = 1e40;
  _H523_VTE_var._parameters.restore_neutron = 1;
  _H523_VTE_var._parameters.radius = 0;
  if("x y, slit" && strlen("x y, slit"))
    stracpy(_H523_VTE_var._parameters.options, "x y, slit" ? "x y, slit" : "", 16384);
  else 
  _H523_VTE_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_VTE_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_VTE_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_VTE_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_VTE_var._parameters.geometry[0]='\0';
  _H523_VTE_var._parameters.nowritefile = 0;
  _H523_VTE_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_VTE_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_VTE_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_VTE_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_VTE_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_VTE_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_VTE_var._parameters.username3[0]='\0';


  /* component H523_VTE=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_207_var._rotation_absolute, _H523_VTE_var._rotation_absolute);
    rot_transpose(_HCS_Al_207_var._rotation_absolute, tr1);
    rot_mul(_H523_VTE_var._rotation_absolute, tr1, _H523_VTE_var._rotation_relative);
    _H523_VTE_var._rotation_is_identity =  rot_test_identity(_H523_VTE_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.108 / 2 -0.001);
    rot_transpose(_HCS_Al_207_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_VTE_var._position_absolute = coords_add(_HCS_Al_207_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_207_var._position_absolute, _H523_VTE_var._position_absolute);
    _H523_VTE_var._position_relative = rot_apply(_H523_VTE_var._rotation_absolute, tc1);
  } /* H523_VTE=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H523_VTE", _H523_VTE_var._position_absolute, _H523_VTE_var._rotation_absolute);
  instrument->_position_absolute[208] = _H523_VTE_var._position_absolute;
  instrument->_position_relative[208] = _H523_VTE_var._position_relative;
    _H523_VTE_var._position_relative_is_zero =  coords_test_zero(_H523_VTE_var._position_relative);
  instrument->counter_N[208]  = instrument->counter_P[208] = instrument->counter_P2[208] = 0;
  instrument->counter_AbsorbProp[208]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0207_H523_VTE", _H523_VTE_var._position_absolute, _H523_VTE_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "options", "NULL", "x y, slit", "char*");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0207_H523_VTE", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_VTE_setpos */

/* component HCS_Al_209=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_209_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_209_setpos] component HCS_Al_209=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_209_var._name, "HCS_Al_209", 16384);
  stracpy(_HCS_Al_209_var._type, "PowderN", 16384);
  _HCS_Al_209_var._index=209;
  int current_setpos_index = 209;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_209_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_209_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_209_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_209_var._parameters.geometry[0]='\0';
  _HCS_Al_209_var._parameters.format[0] = 0;
  _HCS_Al_209_var._parameters.format[1] = 0;
  _HCS_Al_209_var._parameters.format[2] = 0;
  _HCS_Al_209_var._parameters.format[3] = 0;
  _HCS_Al_209_var._parameters.format[4] = 0;
  _HCS_Al_209_var._parameters.format[5] = 0;
  _HCS_Al_209_var._parameters.format[6] = 0;
  _HCS_Al_209_var._parameters.format[7] = 0;
  _HCS_Al_209_var._parameters.format[8] = 0;
  _HCS_Al_209_var._parameters.radius = 0;
  _HCS_Al_209_var._parameters.yheight = 0.12;
  _HCS_Al_209_var._parameters.xwidth = 0.06;
  _HCS_Al_209_var._parameters.zdepth = 0.002;
  _HCS_Al_209_var._parameters.thickness = 0;
  _HCS_Al_209_var._parameters.pack = 1;
  _HCS_Al_209_var._parameters.Vc = 0;
  _HCS_Al_209_var._parameters.sigma_abs = 0;
  _HCS_Al_209_var._parameters.sigma_inc = 0;
  _HCS_Al_209_var._parameters.delta_d_d = 0;
  _HCS_Al_209_var._parameters.p_inc = 0.005;
  _HCS_Al_209_var._parameters.p_transmit = 0.9450;
  _HCS_Al_209_var._parameters.DW = 0;
  _HCS_Al_209_var._parameters.nb_atoms = 1;
  _HCS_Al_209_var._parameters.d_omega = 0;
  _HCS_Al_209_var._parameters.d_phi = 10;
  _HCS_Al_209_var._parameters.tth_sign = 0;
  _HCS_Al_209_var._parameters.p_interact = 0.05;
  _HCS_Al_209_var._parameters.concentric = 0;
  _HCS_Al_209_var._parameters.density = 0;
  _HCS_Al_209_var._parameters.weight = 0;
  _HCS_Al_209_var._parameters.barns = 1;
  _HCS_Al_209_var._parameters.Strain = 0;
  _HCS_Al_209_var._parameters.focus_flip = 0;
  _HCS_Al_209_var._parameters.target_index = 0;
  _HCS_Al_209_var._parameters.order = 1;


  /* component HCS_Al_209=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H523_VTE_var._rotation_absolute, _HCS_Al_209_var._rotation_absolute);
    rot_transpose(_H523_VTE_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_209_var._rotation_absolute, tr1, _HCS_Al_209_var._rotation_relative);
    _HCS_Al_209_var._rotation_is_identity =  rot_test_identity(_HCS_Al_209_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.108 / 2 -0.05);
    rot_transpose(_H523_VTE_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_209_var._position_absolute = coords_add(_H523_VTE_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_VTE_var._position_absolute, _HCS_Al_209_var._position_absolute);
    _HCS_Al_209_var._position_relative = rot_apply(_HCS_Al_209_var._rotation_absolute, tc1);
  } /* HCS_Al_209=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_209", _HCS_Al_209_var._position_absolute, _HCS_Al_209_var._rotation_absolute);
  instrument->_position_absolute[209] = _HCS_Al_209_var._position_absolute;
  instrument->_position_relative[209] = _HCS_Al_209_var._position_relative;
    _HCS_Al_209_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_209_var._position_relative);
  instrument->counter_N[209]  = instrument->counter_P[209] = instrument->counter_P2[209] = 0;
  instrument->counter_AbsorbProp[209]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0208_HCS_Al_209", _HCS_Al_209_var._position_absolute, _HCS_Al_209_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "zdepth", "0", "0.002","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0208_HCS_Al_209", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_209_setpos */

/* component H523_Curved_210=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_210_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_210_setpos] component H523_Curved_210=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_210_var._name, "H523_Curved_210", 16384);
  stracpy(_H523_Curved_210_var._type, "Guide_gravity", 16384);
  _H523_Curved_210_var._index=210;
  int current_setpos_index = 210;
  _H523_Curved_210_var._parameters.w1 = 0.06;
  _H523_Curved_210_var._parameters.h1 = 0.12;
  _H523_Curved_210_var._parameters.w2 = 0;
  _H523_Curved_210_var._parameters.h2 = 0;
  _H523_Curved_210_var._parameters.l = 50.0 / 25;
  _H523_Curved_210_var._parameters.R0 = gR0;
  _H523_Curved_210_var._parameters.Qc = gQc;
  _H523_Curved_210_var._parameters.alpha = gAlpha;
  _H523_Curved_210_var._parameters.m = 1.2;
  _H523_Curved_210_var._parameters.W = gW;
  _H523_Curved_210_var._parameters.nslit = 1;
  _H523_Curved_210_var._parameters.d = 0.0005;
  _H523_Curved_210_var._parameters.mleft = -1;
  _H523_Curved_210_var._parameters.mright = 1.5;
  _H523_Curved_210_var._parameters.mtop = -1;
  _H523_Curved_210_var._parameters.mbottom = -1;
  _H523_Curved_210_var._parameters.nhslit = 1;
  _H523_Curved_210_var._parameters.G = 0;
  _H523_Curved_210_var._parameters.aleft = -1;
  _H523_Curved_210_var._parameters.aright = -1;
  _H523_Curved_210_var._parameters.atop = -1;
  _H523_Curved_210_var._parameters.abottom = -1;
  _H523_Curved_210_var._parameters.wavy = 0;
  _H523_Curved_210_var._parameters.wavy_z = 0;
  _H523_Curved_210_var._parameters.wavy_tb = 0;
  _H523_Curved_210_var._parameters.wavy_lr = 0;
  _H523_Curved_210_var._parameters.chamfers = 0;
  _H523_Curved_210_var._parameters.chamfers_z = 0;
  _H523_Curved_210_var._parameters.chamfers_lr = 0;
  _H523_Curved_210_var._parameters.chamfers_tb = 0;
  _H523_Curved_210_var._parameters.nelements = 1;
  _H523_Curved_210_var._parameters.nu = 0;
  _H523_Curved_210_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_210_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_210_var._parameters.reflect[0]='\0';


  /* component H523_Curved_210=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_209_var._rotation_absolute, _H523_Curved_210_var._rotation_absolute);
    rot_transpose(_HCS_Al_209_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_210_var._rotation_absolute, tr1, _H523_Curved_210_var._rotation_relative);
    _H523_Curved_210_var._rotation_is_identity =  rot_test_identity(_H523_Curved_210_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.003 + gGap);
    rot_transpose(_HCS_Al_209_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_210_var._position_absolute = coords_add(_HCS_Al_209_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_209_var._position_absolute, _H523_Curved_210_var._position_absolute);
    _H523_Curved_210_var._position_relative = rot_apply(_H523_Curved_210_var._rotation_absolute, tc1);
  } /* H523_Curved_210=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_210", _H523_Curved_210_var._position_absolute, _H523_Curved_210_var._rotation_absolute);
  instrument->_position_absolute[210] = _H523_Curved_210_var._position_absolute;
  instrument->_position_relative[210] = _H523_Curved_210_var._position_relative;
    _H523_Curved_210_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_210_var._position_relative);
  instrument->counter_N[210]  = instrument->counter_P[210] = instrument->counter_P2[210] = 0;
  instrument->counter_AbsorbProp[210]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0209_H523_Curved_210", _H523_Curved_210_var._position_absolute, _H523_Curved_210_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0209_H523_Curved_210", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_210_setpos */

/* component H523_Curved_211=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_211_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_211_setpos] component H523_Curved_211=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_211_var._name, "H523_Curved_211", 16384);
  stracpy(_H523_Curved_211_var._type, "Guide_gravity", 16384);
  _H523_Curved_211_var._index=211;
  int current_setpos_index = 211;
  _H523_Curved_211_var._parameters.w1 = 0.06;
  _H523_Curved_211_var._parameters.h1 = 0.12;
  _H523_Curved_211_var._parameters.w2 = 0;
  _H523_Curved_211_var._parameters.h2 = 0;
  _H523_Curved_211_var._parameters.l = 50.0 / 25;
  _H523_Curved_211_var._parameters.R0 = gR0;
  _H523_Curved_211_var._parameters.Qc = gQc;
  _H523_Curved_211_var._parameters.alpha = gAlpha;
  _H523_Curved_211_var._parameters.m = 1.2;
  _H523_Curved_211_var._parameters.W = gW;
  _H523_Curved_211_var._parameters.nslit = 1;
  _H523_Curved_211_var._parameters.d = 0.0005;
  _H523_Curved_211_var._parameters.mleft = -1;
  _H523_Curved_211_var._parameters.mright = 1.5;
  _H523_Curved_211_var._parameters.mtop = -1;
  _H523_Curved_211_var._parameters.mbottom = -1;
  _H523_Curved_211_var._parameters.nhslit = 1;
  _H523_Curved_211_var._parameters.G = 0;
  _H523_Curved_211_var._parameters.aleft = -1;
  _H523_Curved_211_var._parameters.aright = -1;
  _H523_Curved_211_var._parameters.atop = -1;
  _H523_Curved_211_var._parameters.abottom = -1;
  _H523_Curved_211_var._parameters.wavy = 0;
  _H523_Curved_211_var._parameters.wavy_z = 0;
  _H523_Curved_211_var._parameters.wavy_tb = 0;
  _H523_Curved_211_var._parameters.wavy_lr = 0;
  _H523_Curved_211_var._parameters.chamfers = 0;
  _H523_Curved_211_var._parameters.chamfers_z = 0;
  _H523_Curved_211_var._parameters.chamfers_lr = 0;
  _H523_Curved_211_var._parameters.chamfers_tb = 0;
  _H523_Curved_211_var._parameters.nelements = 1;
  _H523_Curved_211_var._parameters.nu = 0;
  _H523_Curved_211_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_211_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_211_var._parameters.reflect[0]='\0';


  /* component H523_Curved_211=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_210_var._rotation_absolute, _H523_Curved_211_var._rotation_absolute);
    rot_transpose(_H523_Curved_210_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_211_var._rotation_absolute, tr1, _H523_Curved_211_var._rotation_relative);
    _H523_Curved_211_var._rotation_is_identity =  rot_test_identity(_H523_Curved_211_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_210 , l ) + gGap);
    rot_transpose(_H523_Curved_210_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_211_var._position_absolute = coords_add(_H523_Curved_210_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_210_var._position_absolute, _H523_Curved_211_var._position_absolute);
    _H523_Curved_211_var._position_relative = rot_apply(_H523_Curved_211_var._rotation_absolute, tc1);
  } /* H523_Curved_211=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_211", _H523_Curved_211_var._position_absolute, _H523_Curved_211_var._rotation_absolute);
  instrument->_position_absolute[211] = _H523_Curved_211_var._position_absolute;
  instrument->_position_relative[211] = _H523_Curved_211_var._position_relative;
    _H523_Curved_211_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_211_var._position_relative);
  instrument->counter_N[211]  = instrument->counter_P[211] = instrument->counter_P2[211] = 0;
  instrument->counter_AbsorbProp[211]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0210_H523_Curved_211", _H523_Curved_211_var._position_absolute, _H523_Curved_211_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0210_H523_Curved_211", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_211_setpos */

/* component H523_Curved_212=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_212_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_212_setpos] component H523_Curved_212=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_212_var._name, "H523_Curved_212", 16384);
  stracpy(_H523_Curved_212_var._type, "Guide_gravity", 16384);
  _H523_Curved_212_var._index=212;
  int current_setpos_index = 212;
  _H523_Curved_212_var._parameters.w1 = 0.06;
  _H523_Curved_212_var._parameters.h1 = 0.12;
  _H523_Curved_212_var._parameters.w2 = 0;
  _H523_Curved_212_var._parameters.h2 = 0;
  _H523_Curved_212_var._parameters.l = 50.0 / 25;
  _H523_Curved_212_var._parameters.R0 = gR0;
  _H523_Curved_212_var._parameters.Qc = gQc;
  _H523_Curved_212_var._parameters.alpha = gAlpha;
  _H523_Curved_212_var._parameters.m = 1.2;
  _H523_Curved_212_var._parameters.W = gW;
  _H523_Curved_212_var._parameters.nslit = 1;
  _H523_Curved_212_var._parameters.d = 0.0005;
  _H523_Curved_212_var._parameters.mleft = -1;
  _H523_Curved_212_var._parameters.mright = 1.5;
  _H523_Curved_212_var._parameters.mtop = -1;
  _H523_Curved_212_var._parameters.mbottom = -1;
  _H523_Curved_212_var._parameters.nhslit = 1;
  _H523_Curved_212_var._parameters.G = 0;
  _H523_Curved_212_var._parameters.aleft = -1;
  _H523_Curved_212_var._parameters.aright = -1;
  _H523_Curved_212_var._parameters.atop = -1;
  _H523_Curved_212_var._parameters.abottom = -1;
  _H523_Curved_212_var._parameters.wavy = 0;
  _H523_Curved_212_var._parameters.wavy_z = 0;
  _H523_Curved_212_var._parameters.wavy_tb = 0;
  _H523_Curved_212_var._parameters.wavy_lr = 0;
  _H523_Curved_212_var._parameters.chamfers = 0;
  _H523_Curved_212_var._parameters.chamfers_z = 0;
  _H523_Curved_212_var._parameters.chamfers_lr = 0;
  _H523_Curved_212_var._parameters.chamfers_tb = 0;
  _H523_Curved_212_var._parameters.nelements = 1;
  _H523_Curved_212_var._parameters.nu = 0;
  _H523_Curved_212_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_212_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_212_var._parameters.reflect[0]='\0';


  /* component H523_Curved_212=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_211_var._rotation_absolute, _H523_Curved_212_var._rotation_absolute);
    rot_transpose(_H523_Curved_211_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_212_var._rotation_absolute, tr1, _H523_Curved_212_var._rotation_relative);
    _H523_Curved_212_var._rotation_is_identity =  rot_test_identity(_H523_Curved_212_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_211 , l ) + gGap);
    rot_transpose(_H523_Curved_211_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_212_var._position_absolute = coords_add(_H523_Curved_211_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_211_var._position_absolute, _H523_Curved_212_var._position_absolute);
    _H523_Curved_212_var._position_relative = rot_apply(_H523_Curved_212_var._rotation_absolute, tc1);
  } /* H523_Curved_212=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_212", _H523_Curved_212_var._position_absolute, _H523_Curved_212_var._rotation_absolute);
  instrument->_position_absolute[212] = _H523_Curved_212_var._position_absolute;
  instrument->_position_relative[212] = _H523_Curved_212_var._position_relative;
    _H523_Curved_212_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_212_var._position_relative);
  instrument->counter_N[212]  = instrument->counter_P[212] = instrument->counter_P2[212] = 0;
  instrument->counter_AbsorbProp[212]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0211_H523_Curved_212", _H523_Curved_212_var._position_absolute, _H523_Curved_212_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0211_H523_Curved_212", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_212_setpos */

/* component H523_Curved_213=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_213_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_213_setpos] component H523_Curved_213=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_213_var._name, "H523_Curved_213", 16384);
  stracpy(_H523_Curved_213_var._type, "Guide_gravity", 16384);
  _H523_Curved_213_var._index=213;
  int current_setpos_index = 213;
  _H523_Curved_213_var._parameters.w1 = 0.06;
  _H523_Curved_213_var._parameters.h1 = 0.12;
  _H523_Curved_213_var._parameters.w2 = 0;
  _H523_Curved_213_var._parameters.h2 = 0;
  _H523_Curved_213_var._parameters.l = 50.0 / 25;
  _H523_Curved_213_var._parameters.R0 = gR0;
  _H523_Curved_213_var._parameters.Qc = gQc;
  _H523_Curved_213_var._parameters.alpha = gAlpha;
  _H523_Curved_213_var._parameters.m = 1.2;
  _H523_Curved_213_var._parameters.W = gW;
  _H523_Curved_213_var._parameters.nslit = 1;
  _H523_Curved_213_var._parameters.d = 0.0005;
  _H523_Curved_213_var._parameters.mleft = -1;
  _H523_Curved_213_var._parameters.mright = 1.5;
  _H523_Curved_213_var._parameters.mtop = -1;
  _H523_Curved_213_var._parameters.mbottom = -1;
  _H523_Curved_213_var._parameters.nhslit = 1;
  _H523_Curved_213_var._parameters.G = 0;
  _H523_Curved_213_var._parameters.aleft = -1;
  _H523_Curved_213_var._parameters.aright = -1;
  _H523_Curved_213_var._parameters.atop = -1;
  _H523_Curved_213_var._parameters.abottom = -1;
  _H523_Curved_213_var._parameters.wavy = 0;
  _H523_Curved_213_var._parameters.wavy_z = 0;
  _H523_Curved_213_var._parameters.wavy_tb = 0;
  _H523_Curved_213_var._parameters.wavy_lr = 0;
  _H523_Curved_213_var._parameters.chamfers = 0;
  _H523_Curved_213_var._parameters.chamfers_z = 0;
  _H523_Curved_213_var._parameters.chamfers_lr = 0;
  _H523_Curved_213_var._parameters.chamfers_tb = 0;
  _H523_Curved_213_var._parameters.nelements = 1;
  _H523_Curved_213_var._parameters.nu = 0;
  _H523_Curved_213_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_213_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_213_var._parameters.reflect[0]='\0';


  /* component H523_Curved_213=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_212_var._rotation_absolute, _H523_Curved_213_var._rotation_absolute);
    rot_transpose(_H523_Curved_212_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_213_var._rotation_absolute, tr1, _H523_Curved_213_var._rotation_relative);
    _H523_Curved_213_var._rotation_is_identity =  rot_test_identity(_H523_Curved_213_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_212 , l ) + gGap);
    rot_transpose(_H523_Curved_212_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_213_var._position_absolute = coords_add(_H523_Curved_212_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_212_var._position_absolute, _H523_Curved_213_var._position_absolute);
    _H523_Curved_213_var._position_relative = rot_apply(_H523_Curved_213_var._rotation_absolute, tc1);
  } /* H523_Curved_213=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_213", _H523_Curved_213_var._position_absolute, _H523_Curved_213_var._rotation_absolute);
  instrument->_position_absolute[213] = _H523_Curved_213_var._position_absolute;
  instrument->_position_relative[213] = _H523_Curved_213_var._position_relative;
    _H523_Curved_213_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_213_var._position_relative);
  instrument->counter_N[213]  = instrument->counter_P[213] = instrument->counter_P2[213] = 0;
  instrument->counter_AbsorbProp[213]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0212_H523_Curved_213", _H523_Curved_213_var._position_absolute, _H523_Curved_213_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0212_H523_Curved_213", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_213_setpos */

/* component H523_Curved_214=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_214_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_214_setpos] component H523_Curved_214=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_214_var._name, "H523_Curved_214", 16384);
  stracpy(_H523_Curved_214_var._type, "Guide_gravity", 16384);
  _H523_Curved_214_var._index=214;
  int current_setpos_index = 214;
  _H523_Curved_214_var._parameters.w1 = 0.06;
  _H523_Curved_214_var._parameters.h1 = 0.12;
  _H523_Curved_214_var._parameters.w2 = 0;
  _H523_Curved_214_var._parameters.h2 = 0;
  _H523_Curved_214_var._parameters.l = 50.0 / 25;
  _H523_Curved_214_var._parameters.R0 = gR0;
  _H523_Curved_214_var._parameters.Qc = gQc;
  _H523_Curved_214_var._parameters.alpha = gAlpha;
  _H523_Curved_214_var._parameters.m = 1.2;
  _H523_Curved_214_var._parameters.W = gW;
  _H523_Curved_214_var._parameters.nslit = 1;
  _H523_Curved_214_var._parameters.d = 0.0005;
  _H523_Curved_214_var._parameters.mleft = -1;
  _H523_Curved_214_var._parameters.mright = 1.5;
  _H523_Curved_214_var._parameters.mtop = -1;
  _H523_Curved_214_var._parameters.mbottom = -1;
  _H523_Curved_214_var._parameters.nhslit = 1;
  _H523_Curved_214_var._parameters.G = 0;
  _H523_Curved_214_var._parameters.aleft = -1;
  _H523_Curved_214_var._parameters.aright = -1;
  _H523_Curved_214_var._parameters.atop = -1;
  _H523_Curved_214_var._parameters.abottom = -1;
  _H523_Curved_214_var._parameters.wavy = 0;
  _H523_Curved_214_var._parameters.wavy_z = 0;
  _H523_Curved_214_var._parameters.wavy_tb = 0;
  _H523_Curved_214_var._parameters.wavy_lr = 0;
  _H523_Curved_214_var._parameters.chamfers = 0;
  _H523_Curved_214_var._parameters.chamfers_z = 0;
  _H523_Curved_214_var._parameters.chamfers_lr = 0;
  _H523_Curved_214_var._parameters.chamfers_tb = 0;
  _H523_Curved_214_var._parameters.nelements = 1;
  _H523_Curved_214_var._parameters.nu = 0;
  _H523_Curved_214_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_214_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_214_var._parameters.reflect[0]='\0';


  /* component H523_Curved_214=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_213_var._rotation_absolute, _H523_Curved_214_var._rotation_absolute);
    rot_transpose(_H523_Curved_213_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_214_var._rotation_absolute, tr1, _H523_Curved_214_var._rotation_relative);
    _H523_Curved_214_var._rotation_is_identity =  rot_test_identity(_H523_Curved_214_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_213 , l ) + gGap);
    rot_transpose(_H523_Curved_213_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_214_var._position_absolute = coords_add(_H523_Curved_213_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_213_var._position_absolute, _H523_Curved_214_var._position_absolute);
    _H523_Curved_214_var._position_relative = rot_apply(_H523_Curved_214_var._rotation_absolute, tc1);
  } /* H523_Curved_214=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_214", _H523_Curved_214_var._position_absolute, _H523_Curved_214_var._rotation_absolute);
  instrument->_position_absolute[214] = _H523_Curved_214_var._position_absolute;
  instrument->_position_relative[214] = _H523_Curved_214_var._position_relative;
    _H523_Curved_214_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_214_var._position_relative);
  instrument->counter_N[214]  = instrument->counter_P[214] = instrument->counter_P2[214] = 0;
  instrument->counter_AbsorbProp[214]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0213_H523_Curved_214", _H523_Curved_214_var._position_absolute, _H523_Curved_214_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0213_H523_Curved_214", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_214_setpos */

/* component H523_Curved_215=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_215_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_215_setpos] component H523_Curved_215=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_215_var._name, "H523_Curved_215", 16384);
  stracpy(_H523_Curved_215_var._type, "Guide_gravity", 16384);
  _H523_Curved_215_var._index=215;
  int current_setpos_index = 215;
  _H523_Curved_215_var._parameters.w1 = 0.06;
  _H523_Curved_215_var._parameters.h1 = 0.12;
  _H523_Curved_215_var._parameters.w2 = 0;
  _H523_Curved_215_var._parameters.h2 = 0;
  _H523_Curved_215_var._parameters.l = 50.0 / 25;
  _H523_Curved_215_var._parameters.R0 = gR0;
  _H523_Curved_215_var._parameters.Qc = gQc;
  _H523_Curved_215_var._parameters.alpha = gAlpha;
  _H523_Curved_215_var._parameters.m = 1.2;
  _H523_Curved_215_var._parameters.W = gW;
  _H523_Curved_215_var._parameters.nslit = 1;
  _H523_Curved_215_var._parameters.d = 0.0005;
  _H523_Curved_215_var._parameters.mleft = -1;
  _H523_Curved_215_var._parameters.mright = 1.5;
  _H523_Curved_215_var._parameters.mtop = -1;
  _H523_Curved_215_var._parameters.mbottom = -1;
  _H523_Curved_215_var._parameters.nhslit = 1;
  _H523_Curved_215_var._parameters.G = 0;
  _H523_Curved_215_var._parameters.aleft = -1;
  _H523_Curved_215_var._parameters.aright = -1;
  _H523_Curved_215_var._parameters.atop = -1;
  _H523_Curved_215_var._parameters.abottom = -1;
  _H523_Curved_215_var._parameters.wavy = 0;
  _H523_Curved_215_var._parameters.wavy_z = 0;
  _H523_Curved_215_var._parameters.wavy_tb = 0;
  _H523_Curved_215_var._parameters.wavy_lr = 0;
  _H523_Curved_215_var._parameters.chamfers = 0;
  _H523_Curved_215_var._parameters.chamfers_z = 0;
  _H523_Curved_215_var._parameters.chamfers_lr = 0;
  _H523_Curved_215_var._parameters.chamfers_tb = 0;
  _H523_Curved_215_var._parameters.nelements = 1;
  _H523_Curved_215_var._parameters.nu = 0;
  _H523_Curved_215_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_215_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_215_var._parameters.reflect[0]='\0';


  /* component H523_Curved_215=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_214_var._rotation_absolute, _H523_Curved_215_var._rotation_absolute);
    rot_transpose(_H523_Curved_214_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_215_var._rotation_absolute, tr1, _H523_Curved_215_var._rotation_relative);
    _H523_Curved_215_var._rotation_is_identity =  rot_test_identity(_H523_Curved_215_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_214 , l ) + gGap);
    rot_transpose(_H523_Curved_214_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_215_var._position_absolute = coords_add(_H523_Curved_214_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_214_var._position_absolute, _H523_Curved_215_var._position_absolute);
    _H523_Curved_215_var._position_relative = rot_apply(_H523_Curved_215_var._rotation_absolute, tc1);
  } /* H523_Curved_215=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_215", _H523_Curved_215_var._position_absolute, _H523_Curved_215_var._rotation_absolute);
  instrument->_position_absolute[215] = _H523_Curved_215_var._position_absolute;
  instrument->_position_relative[215] = _H523_Curved_215_var._position_relative;
    _H523_Curved_215_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_215_var._position_relative);
  instrument->counter_N[215]  = instrument->counter_P[215] = instrument->counter_P2[215] = 0;
  instrument->counter_AbsorbProp[215]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0214_H523_Curved_215", _H523_Curved_215_var._position_absolute, _H523_Curved_215_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0214_H523_Curved_215", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_215_setpos */

/* component H523_Curved_216=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_216_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_216_setpos] component H523_Curved_216=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_216_var._name, "H523_Curved_216", 16384);
  stracpy(_H523_Curved_216_var._type, "Guide_gravity", 16384);
  _H523_Curved_216_var._index=216;
  int current_setpos_index = 216;
  _H523_Curved_216_var._parameters.w1 = 0.06;
  _H523_Curved_216_var._parameters.h1 = 0.12;
  _H523_Curved_216_var._parameters.w2 = 0;
  _H523_Curved_216_var._parameters.h2 = 0;
  _H523_Curved_216_var._parameters.l = 50.0 / 25;
  _H523_Curved_216_var._parameters.R0 = gR0;
  _H523_Curved_216_var._parameters.Qc = gQc;
  _H523_Curved_216_var._parameters.alpha = gAlpha;
  _H523_Curved_216_var._parameters.m = 1.2;
  _H523_Curved_216_var._parameters.W = gW;
  _H523_Curved_216_var._parameters.nslit = 1;
  _H523_Curved_216_var._parameters.d = 0.0005;
  _H523_Curved_216_var._parameters.mleft = -1;
  _H523_Curved_216_var._parameters.mright = 1.5;
  _H523_Curved_216_var._parameters.mtop = -1;
  _H523_Curved_216_var._parameters.mbottom = -1;
  _H523_Curved_216_var._parameters.nhslit = 1;
  _H523_Curved_216_var._parameters.G = 0;
  _H523_Curved_216_var._parameters.aleft = -1;
  _H523_Curved_216_var._parameters.aright = -1;
  _H523_Curved_216_var._parameters.atop = -1;
  _H523_Curved_216_var._parameters.abottom = -1;
  _H523_Curved_216_var._parameters.wavy = 0;
  _H523_Curved_216_var._parameters.wavy_z = 0;
  _H523_Curved_216_var._parameters.wavy_tb = 0;
  _H523_Curved_216_var._parameters.wavy_lr = 0;
  _H523_Curved_216_var._parameters.chamfers = 0;
  _H523_Curved_216_var._parameters.chamfers_z = 0;
  _H523_Curved_216_var._parameters.chamfers_lr = 0;
  _H523_Curved_216_var._parameters.chamfers_tb = 0;
  _H523_Curved_216_var._parameters.nelements = 1;
  _H523_Curved_216_var._parameters.nu = 0;
  _H523_Curved_216_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_216_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_216_var._parameters.reflect[0]='\0';


  /* component H523_Curved_216=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_215_var._rotation_absolute, _H523_Curved_216_var._rotation_absolute);
    rot_transpose(_H523_Curved_215_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_216_var._rotation_absolute, tr1, _H523_Curved_216_var._rotation_relative);
    _H523_Curved_216_var._rotation_is_identity =  rot_test_identity(_H523_Curved_216_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_215 , l ) + gGap);
    rot_transpose(_H523_Curved_215_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_216_var._position_absolute = coords_add(_H523_Curved_215_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_215_var._position_absolute, _H523_Curved_216_var._position_absolute);
    _H523_Curved_216_var._position_relative = rot_apply(_H523_Curved_216_var._rotation_absolute, tc1);
  } /* H523_Curved_216=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_216", _H523_Curved_216_var._position_absolute, _H523_Curved_216_var._rotation_absolute);
  instrument->_position_absolute[216] = _H523_Curved_216_var._position_absolute;
  instrument->_position_relative[216] = _H523_Curved_216_var._position_relative;
    _H523_Curved_216_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_216_var._position_relative);
  instrument->counter_N[216]  = instrument->counter_P[216] = instrument->counter_P2[216] = 0;
  instrument->counter_AbsorbProp[216]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0215_H523_Curved_216", _H523_Curved_216_var._position_absolute, _H523_Curved_216_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0215_H523_Curved_216", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_216_setpos */

/* component H523_Curved_217=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_217_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_217_setpos] component H523_Curved_217=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_217_var._name, "H523_Curved_217", 16384);
  stracpy(_H523_Curved_217_var._type, "Guide_gravity", 16384);
  _H523_Curved_217_var._index=217;
  int current_setpos_index = 217;
  _H523_Curved_217_var._parameters.w1 = 0.06;
  _H523_Curved_217_var._parameters.h1 = 0.12;
  _H523_Curved_217_var._parameters.w2 = 0;
  _H523_Curved_217_var._parameters.h2 = 0;
  _H523_Curved_217_var._parameters.l = 50.0 / 25;
  _H523_Curved_217_var._parameters.R0 = gR0;
  _H523_Curved_217_var._parameters.Qc = gQc;
  _H523_Curved_217_var._parameters.alpha = gAlpha;
  _H523_Curved_217_var._parameters.m = 1.2;
  _H523_Curved_217_var._parameters.W = gW;
  _H523_Curved_217_var._parameters.nslit = 1;
  _H523_Curved_217_var._parameters.d = 0.0005;
  _H523_Curved_217_var._parameters.mleft = -1;
  _H523_Curved_217_var._parameters.mright = 1.5;
  _H523_Curved_217_var._parameters.mtop = -1;
  _H523_Curved_217_var._parameters.mbottom = -1;
  _H523_Curved_217_var._parameters.nhslit = 1;
  _H523_Curved_217_var._parameters.G = 0;
  _H523_Curved_217_var._parameters.aleft = -1;
  _H523_Curved_217_var._parameters.aright = -1;
  _H523_Curved_217_var._parameters.atop = -1;
  _H523_Curved_217_var._parameters.abottom = -1;
  _H523_Curved_217_var._parameters.wavy = 0;
  _H523_Curved_217_var._parameters.wavy_z = 0;
  _H523_Curved_217_var._parameters.wavy_tb = 0;
  _H523_Curved_217_var._parameters.wavy_lr = 0;
  _H523_Curved_217_var._parameters.chamfers = 0;
  _H523_Curved_217_var._parameters.chamfers_z = 0;
  _H523_Curved_217_var._parameters.chamfers_lr = 0;
  _H523_Curved_217_var._parameters.chamfers_tb = 0;
  _H523_Curved_217_var._parameters.nelements = 1;
  _H523_Curved_217_var._parameters.nu = 0;
  _H523_Curved_217_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_217_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_217_var._parameters.reflect[0]='\0';


  /* component H523_Curved_217=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_216_var._rotation_absolute, _H523_Curved_217_var._rotation_absolute);
    rot_transpose(_H523_Curved_216_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_217_var._rotation_absolute, tr1, _H523_Curved_217_var._rotation_relative);
    _H523_Curved_217_var._rotation_is_identity =  rot_test_identity(_H523_Curved_217_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_216 , l ) + gGap);
    rot_transpose(_H523_Curved_216_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_217_var._position_absolute = coords_add(_H523_Curved_216_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_216_var._position_absolute, _H523_Curved_217_var._position_absolute);
    _H523_Curved_217_var._position_relative = rot_apply(_H523_Curved_217_var._rotation_absolute, tc1);
  } /* H523_Curved_217=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_217", _H523_Curved_217_var._position_absolute, _H523_Curved_217_var._rotation_absolute);
  instrument->_position_absolute[217] = _H523_Curved_217_var._position_absolute;
  instrument->_position_relative[217] = _H523_Curved_217_var._position_relative;
    _H523_Curved_217_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_217_var._position_relative);
  instrument->counter_N[217]  = instrument->counter_P[217] = instrument->counter_P2[217] = 0;
  instrument->counter_AbsorbProp[217]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0216_H523_Curved_217", _H523_Curved_217_var._position_absolute, _H523_Curved_217_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0216_H523_Curved_217", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_217_setpos */

/* component H523_Curved_218=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_218_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_218_setpos] component H523_Curved_218=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_218_var._name, "H523_Curved_218", 16384);
  stracpy(_H523_Curved_218_var._type, "Guide_gravity", 16384);
  _H523_Curved_218_var._index=218;
  int current_setpos_index = 218;
  _H523_Curved_218_var._parameters.w1 = 0.06;
  _H523_Curved_218_var._parameters.h1 = 0.12;
  _H523_Curved_218_var._parameters.w2 = 0;
  _H523_Curved_218_var._parameters.h2 = 0;
  _H523_Curved_218_var._parameters.l = 50.0 / 25;
  _H523_Curved_218_var._parameters.R0 = gR0;
  _H523_Curved_218_var._parameters.Qc = gQc;
  _H523_Curved_218_var._parameters.alpha = gAlpha;
  _H523_Curved_218_var._parameters.m = 1.2;
  _H523_Curved_218_var._parameters.W = gW;
  _H523_Curved_218_var._parameters.nslit = 1;
  _H523_Curved_218_var._parameters.d = 0.0005;
  _H523_Curved_218_var._parameters.mleft = -1;
  _H523_Curved_218_var._parameters.mright = 1.5;
  _H523_Curved_218_var._parameters.mtop = -1;
  _H523_Curved_218_var._parameters.mbottom = -1;
  _H523_Curved_218_var._parameters.nhslit = 1;
  _H523_Curved_218_var._parameters.G = 0;
  _H523_Curved_218_var._parameters.aleft = -1;
  _H523_Curved_218_var._parameters.aright = -1;
  _H523_Curved_218_var._parameters.atop = -1;
  _H523_Curved_218_var._parameters.abottom = -1;
  _H523_Curved_218_var._parameters.wavy = 0;
  _H523_Curved_218_var._parameters.wavy_z = 0;
  _H523_Curved_218_var._parameters.wavy_tb = 0;
  _H523_Curved_218_var._parameters.wavy_lr = 0;
  _H523_Curved_218_var._parameters.chamfers = 0;
  _H523_Curved_218_var._parameters.chamfers_z = 0;
  _H523_Curved_218_var._parameters.chamfers_lr = 0;
  _H523_Curved_218_var._parameters.chamfers_tb = 0;
  _H523_Curved_218_var._parameters.nelements = 1;
  _H523_Curved_218_var._parameters.nu = 0;
  _H523_Curved_218_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_218_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_218_var._parameters.reflect[0]='\0';


  /* component H523_Curved_218=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_217_var._rotation_absolute, _H523_Curved_218_var._rotation_absolute);
    rot_transpose(_H523_Curved_217_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_218_var._rotation_absolute, tr1, _H523_Curved_218_var._rotation_relative);
    _H523_Curved_218_var._rotation_is_identity =  rot_test_identity(_H523_Curved_218_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_217 , l ) + gGap);
    rot_transpose(_H523_Curved_217_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_218_var._position_absolute = coords_add(_H523_Curved_217_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_217_var._position_absolute, _H523_Curved_218_var._position_absolute);
    _H523_Curved_218_var._position_relative = rot_apply(_H523_Curved_218_var._rotation_absolute, tc1);
  } /* H523_Curved_218=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_218", _H523_Curved_218_var._position_absolute, _H523_Curved_218_var._rotation_absolute);
  instrument->_position_absolute[218] = _H523_Curved_218_var._position_absolute;
  instrument->_position_relative[218] = _H523_Curved_218_var._position_relative;
    _H523_Curved_218_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_218_var._position_relative);
  instrument->counter_N[218]  = instrument->counter_P[218] = instrument->counter_P2[218] = 0;
  instrument->counter_AbsorbProp[218]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0217_H523_Curved_218", _H523_Curved_218_var._position_absolute, _H523_Curved_218_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0217_H523_Curved_218", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_218_setpos */

/* component H523_Curved_219=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_219_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_219_setpos] component H523_Curved_219=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_219_var._name, "H523_Curved_219", 16384);
  stracpy(_H523_Curved_219_var._type, "Guide_gravity", 16384);
  _H523_Curved_219_var._index=219;
  int current_setpos_index = 219;
  _H523_Curved_219_var._parameters.w1 = 0.06;
  _H523_Curved_219_var._parameters.h1 = 0.12;
  _H523_Curved_219_var._parameters.w2 = 0;
  _H523_Curved_219_var._parameters.h2 = 0;
  _H523_Curved_219_var._parameters.l = 50.0 / 25;
  _H523_Curved_219_var._parameters.R0 = gR0;
  _H523_Curved_219_var._parameters.Qc = gQc;
  _H523_Curved_219_var._parameters.alpha = gAlpha;
  _H523_Curved_219_var._parameters.m = 1.2;
  _H523_Curved_219_var._parameters.W = gW;
  _H523_Curved_219_var._parameters.nslit = 1;
  _H523_Curved_219_var._parameters.d = 0.0005;
  _H523_Curved_219_var._parameters.mleft = -1;
  _H523_Curved_219_var._parameters.mright = 1.5;
  _H523_Curved_219_var._parameters.mtop = -1;
  _H523_Curved_219_var._parameters.mbottom = -1;
  _H523_Curved_219_var._parameters.nhslit = 1;
  _H523_Curved_219_var._parameters.G = 0;
  _H523_Curved_219_var._parameters.aleft = -1;
  _H523_Curved_219_var._parameters.aright = -1;
  _H523_Curved_219_var._parameters.atop = -1;
  _H523_Curved_219_var._parameters.abottom = -1;
  _H523_Curved_219_var._parameters.wavy = 0;
  _H523_Curved_219_var._parameters.wavy_z = 0;
  _H523_Curved_219_var._parameters.wavy_tb = 0;
  _H523_Curved_219_var._parameters.wavy_lr = 0;
  _H523_Curved_219_var._parameters.chamfers = 0;
  _H523_Curved_219_var._parameters.chamfers_z = 0;
  _H523_Curved_219_var._parameters.chamfers_lr = 0;
  _H523_Curved_219_var._parameters.chamfers_tb = 0;
  _H523_Curved_219_var._parameters.nelements = 1;
  _H523_Curved_219_var._parameters.nu = 0;
  _H523_Curved_219_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_219_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_219_var._parameters.reflect[0]='\0';


  /* component H523_Curved_219=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_218_var._rotation_absolute, _H523_Curved_219_var._rotation_absolute);
    rot_transpose(_H523_Curved_218_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_219_var._rotation_absolute, tr1, _H523_Curved_219_var._rotation_relative);
    _H523_Curved_219_var._rotation_is_identity =  rot_test_identity(_H523_Curved_219_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_218 , l ) + gGap);
    rot_transpose(_H523_Curved_218_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_219_var._position_absolute = coords_add(_H523_Curved_218_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_218_var._position_absolute, _H523_Curved_219_var._position_absolute);
    _H523_Curved_219_var._position_relative = rot_apply(_H523_Curved_219_var._rotation_absolute, tc1);
  } /* H523_Curved_219=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_219", _H523_Curved_219_var._position_absolute, _H523_Curved_219_var._rotation_absolute);
  instrument->_position_absolute[219] = _H523_Curved_219_var._position_absolute;
  instrument->_position_relative[219] = _H523_Curved_219_var._position_relative;
    _H523_Curved_219_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_219_var._position_relative);
  instrument->counter_N[219]  = instrument->counter_P[219] = instrument->counter_P2[219] = 0;
  instrument->counter_AbsorbProp[219]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0218_H523_Curved_219", _H523_Curved_219_var._position_absolute, _H523_Curved_219_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0218_H523_Curved_219", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_219_setpos */

/* component H523_Curved_220=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_220_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_220_setpos] component H523_Curved_220=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_220_var._name, "H523_Curved_220", 16384);
  stracpy(_H523_Curved_220_var._type, "Guide_gravity", 16384);
  _H523_Curved_220_var._index=220;
  int current_setpos_index = 220;
  _H523_Curved_220_var._parameters.w1 = 0.06;
  _H523_Curved_220_var._parameters.h1 = 0.12;
  _H523_Curved_220_var._parameters.w2 = 0;
  _H523_Curved_220_var._parameters.h2 = 0;
  _H523_Curved_220_var._parameters.l = 50.0 / 25;
  _H523_Curved_220_var._parameters.R0 = gR0;
  _H523_Curved_220_var._parameters.Qc = gQc;
  _H523_Curved_220_var._parameters.alpha = gAlpha;
  _H523_Curved_220_var._parameters.m = 1.2;
  _H523_Curved_220_var._parameters.W = gW;
  _H523_Curved_220_var._parameters.nslit = 1;
  _H523_Curved_220_var._parameters.d = 0.0005;
  _H523_Curved_220_var._parameters.mleft = -1;
  _H523_Curved_220_var._parameters.mright = 1.5;
  _H523_Curved_220_var._parameters.mtop = -1;
  _H523_Curved_220_var._parameters.mbottom = -1;
  _H523_Curved_220_var._parameters.nhslit = 1;
  _H523_Curved_220_var._parameters.G = 0;
  _H523_Curved_220_var._parameters.aleft = -1;
  _H523_Curved_220_var._parameters.aright = -1;
  _H523_Curved_220_var._parameters.atop = -1;
  _H523_Curved_220_var._parameters.abottom = -1;
  _H523_Curved_220_var._parameters.wavy = 0;
  _H523_Curved_220_var._parameters.wavy_z = 0;
  _H523_Curved_220_var._parameters.wavy_tb = 0;
  _H523_Curved_220_var._parameters.wavy_lr = 0;
  _H523_Curved_220_var._parameters.chamfers = 0;
  _H523_Curved_220_var._parameters.chamfers_z = 0;
  _H523_Curved_220_var._parameters.chamfers_lr = 0;
  _H523_Curved_220_var._parameters.chamfers_tb = 0;
  _H523_Curved_220_var._parameters.nelements = 1;
  _H523_Curved_220_var._parameters.nu = 0;
  _H523_Curved_220_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_220_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_220_var._parameters.reflect[0]='\0';


  /* component H523_Curved_220=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_219_var._rotation_absolute, _H523_Curved_220_var._rotation_absolute);
    rot_transpose(_H523_Curved_219_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_220_var._rotation_absolute, tr1, _H523_Curved_220_var._rotation_relative);
    _H523_Curved_220_var._rotation_is_identity =  rot_test_identity(_H523_Curved_220_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_219 , l ) + gGap);
    rot_transpose(_H523_Curved_219_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_220_var._position_absolute = coords_add(_H523_Curved_219_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_219_var._position_absolute, _H523_Curved_220_var._position_absolute);
    _H523_Curved_220_var._position_relative = rot_apply(_H523_Curved_220_var._rotation_absolute, tc1);
  } /* H523_Curved_220=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_220", _H523_Curved_220_var._position_absolute, _H523_Curved_220_var._rotation_absolute);
  instrument->_position_absolute[220] = _H523_Curved_220_var._position_absolute;
  instrument->_position_relative[220] = _H523_Curved_220_var._position_relative;
    _H523_Curved_220_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_220_var._position_relative);
  instrument->counter_N[220]  = instrument->counter_P[220] = instrument->counter_P2[220] = 0;
  instrument->counter_AbsorbProp[220]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0219_H523_Curved_220", _H523_Curved_220_var._position_absolute, _H523_Curved_220_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0219_H523_Curved_220", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_220_setpos */

/* component H523_Curved_221=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_221_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_221_setpos] component H523_Curved_221=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_221_var._name, "H523_Curved_221", 16384);
  stracpy(_H523_Curved_221_var._type, "Guide_gravity", 16384);
  _H523_Curved_221_var._index=221;
  int current_setpos_index = 221;
  _H523_Curved_221_var._parameters.w1 = 0.06;
  _H523_Curved_221_var._parameters.h1 = 0.12;
  _H523_Curved_221_var._parameters.w2 = 0;
  _H523_Curved_221_var._parameters.h2 = 0;
  _H523_Curved_221_var._parameters.l = 50.0 / 25;
  _H523_Curved_221_var._parameters.R0 = gR0;
  _H523_Curved_221_var._parameters.Qc = gQc;
  _H523_Curved_221_var._parameters.alpha = gAlpha;
  _H523_Curved_221_var._parameters.m = 1.2;
  _H523_Curved_221_var._parameters.W = gW;
  _H523_Curved_221_var._parameters.nslit = 1;
  _H523_Curved_221_var._parameters.d = 0.0005;
  _H523_Curved_221_var._parameters.mleft = -1;
  _H523_Curved_221_var._parameters.mright = 1.5;
  _H523_Curved_221_var._parameters.mtop = -1;
  _H523_Curved_221_var._parameters.mbottom = -1;
  _H523_Curved_221_var._parameters.nhslit = 1;
  _H523_Curved_221_var._parameters.G = 0;
  _H523_Curved_221_var._parameters.aleft = -1;
  _H523_Curved_221_var._parameters.aright = -1;
  _H523_Curved_221_var._parameters.atop = -1;
  _H523_Curved_221_var._parameters.abottom = -1;
  _H523_Curved_221_var._parameters.wavy = 0;
  _H523_Curved_221_var._parameters.wavy_z = 0;
  _H523_Curved_221_var._parameters.wavy_tb = 0;
  _H523_Curved_221_var._parameters.wavy_lr = 0;
  _H523_Curved_221_var._parameters.chamfers = 0;
  _H523_Curved_221_var._parameters.chamfers_z = 0;
  _H523_Curved_221_var._parameters.chamfers_lr = 0;
  _H523_Curved_221_var._parameters.chamfers_tb = 0;
  _H523_Curved_221_var._parameters.nelements = 1;
  _H523_Curved_221_var._parameters.nu = 0;
  _H523_Curved_221_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_221_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_221_var._parameters.reflect[0]='\0';


  /* component H523_Curved_221=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_220_var._rotation_absolute, _H523_Curved_221_var._rotation_absolute);
    rot_transpose(_H523_Curved_220_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_221_var._rotation_absolute, tr1, _H523_Curved_221_var._rotation_relative);
    _H523_Curved_221_var._rotation_is_identity =  rot_test_identity(_H523_Curved_221_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_220 , l ) + gGap);
    rot_transpose(_H523_Curved_220_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_221_var._position_absolute = coords_add(_H523_Curved_220_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_220_var._position_absolute, _H523_Curved_221_var._position_absolute);
    _H523_Curved_221_var._position_relative = rot_apply(_H523_Curved_221_var._rotation_absolute, tc1);
  } /* H523_Curved_221=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_221", _H523_Curved_221_var._position_absolute, _H523_Curved_221_var._rotation_absolute);
  instrument->_position_absolute[221] = _H523_Curved_221_var._position_absolute;
  instrument->_position_relative[221] = _H523_Curved_221_var._position_relative;
    _H523_Curved_221_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_221_var._position_relative);
  instrument->counter_N[221]  = instrument->counter_P[221] = instrument->counter_P2[221] = 0;
  instrument->counter_AbsorbProp[221]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0220_H523_Curved_221", _H523_Curved_221_var._position_absolute, _H523_Curved_221_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0220_H523_Curved_221", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_221_setpos */

/* component H523_Curved_222=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_222_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_222_setpos] component H523_Curved_222=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_222_var._name, "H523_Curved_222", 16384);
  stracpy(_H523_Curved_222_var._type, "Guide_gravity", 16384);
  _H523_Curved_222_var._index=222;
  int current_setpos_index = 222;
  _H523_Curved_222_var._parameters.w1 = 0.06;
  _H523_Curved_222_var._parameters.h1 = 0.12;
  _H523_Curved_222_var._parameters.w2 = 0;
  _H523_Curved_222_var._parameters.h2 = 0;
  _H523_Curved_222_var._parameters.l = 50.0 / 25;
  _H523_Curved_222_var._parameters.R0 = gR0;
  _H523_Curved_222_var._parameters.Qc = gQc;
  _H523_Curved_222_var._parameters.alpha = gAlpha;
  _H523_Curved_222_var._parameters.m = 1.2;
  _H523_Curved_222_var._parameters.W = gW;
  _H523_Curved_222_var._parameters.nslit = 1;
  _H523_Curved_222_var._parameters.d = 0.0005;
  _H523_Curved_222_var._parameters.mleft = -1;
  _H523_Curved_222_var._parameters.mright = 1.5;
  _H523_Curved_222_var._parameters.mtop = -1;
  _H523_Curved_222_var._parameters.mbottom = -1;
  _H523_Curved_222_var._parameters.nhslit = 1;
  _H523_Curved_222_var._parameters.G = 0;
  _H523_Curved_222_var._parameters.aleft = -1;
  _H523_Curved_222_var._parameters.aright = -1;
  _H523_Curved_222_var._parameters.atop = -1;
  _H523_Curved_222_var._parameters.abottom = -1;
  _H523_Curved_222_var._parameters.wavy = 0;
  _H523_Curved_222_var._parameters.wavy_z = 0;
  _H523_Curved_222_var._parameters.wavy_tb = 0;
  _H523_Curved_222_var._parameters.wavy_lr = 0;
  _H523_Curved_222_var._parameters.chamfers = 0;
  _H523_Curved_222_var._parameters.chamfers_z = 0;
  _H523_Curved_222_var._parameters.chamfers_lr = 0;
  _H523_Curved_222_var._parameters.chamfers_tb = 0;
  _H523_Curved_222_var._parameters.nelements = 1;
  _H523_Curved_222_var._parameters.nu = 0;
  _H523_Curved_222_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_222_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_222_var._parameters.reflect[0]='\0';


  /* component H523_Curved_222=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_221_var._rotation_absolute, _H523_Curved_222_var._rotation_absolute);
    rot_transpose(_H523_Curved_221_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_222_var._rotation_absolute, tr1, _H523_Curved_222_var._rotation_relative);
    _H523_Curved_222_var._rotation_is_identity =  rot_test_identity(_H523_Curved_222_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_221 , l ) + gGap);
    rot_transpose(_H523_Curved_221_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_222_var._position_absolute = coords_add(_H523_Curved_221_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_221_var._position_absolute, _H523_Curved_222_var._position_absolute);
    _H523_Curved_222_var._position_relative = rot_apply(_H523_Curved_222_var._rotation_absolute, tc1);
  } /* H523_Curved_222=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_222", _H523_Curved_222_var._position_absolute, _H523_Curved_222_var._rotation_absolute);
  instrument->_position_absolute[222] = _H523_Curved_222_var._position_absolute;
  instrument->_position_relative[222] = _H523_Curved_222_var._position_relative;
    _H523_Curved_222_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_222_var._position_relative);
  instrument->counter_N[222]  = instrument->counter_P[222] = instrument->counter_P2[222] = 0;
  instrument->counter_AbsorbProp[222]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0221_H523_Curved_222", _H523_Curved_222_var._position_absolute, _H523_Curved_222_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0221_H523_Curved_222", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_222_setpos */

/* component H523_Curved_223=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_223_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_223_setpos] component H523_Curved_223=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_223_var._name, "H523_Curved_223", 16384);
  stracpy(_H523_Curved_223_var._type, "Guide_gravity", 16384);
  _H523_Curved_223_var._index=223;
  int current_setpos_index = 223;
  _H523_Curved_223_var._parameters.w1 = 0.06;
  _H523_Curved_223_var._parameters.h1 = 0.12;
  _H523_Curved_223_var._parameters.w2 = 0;
  _H523_Curved_223_var._parameters.h2 = 0;
  _H523_Curved_223_var._parameters.l = 50.0 / 25;
  _H523_Curved_223_var._parameters.R0 = gR0;
  _H523_Curved_223_var._parameters.Qc = gQc;
  _H523_Curved_223_var._parameters.alpha = gAlpha;
  _H523_Curved_223_var._parameters.m = 1.2;
  _H523_Curved_223_var._parameters.W = gW;
  _H523_Curved_223_var._parameters.nslit = 1;
  _H523_Curved_223_var._parameters.d = 0.0005;
  _H523_Curved_223_var._parameters.mleft = -1;
  _H523_Curved_223_var._parameters.mright = 1.5;
  _H523_Curved_223_var._parameters.mtop = -1;
  _H523_Curved_223_var._parameters.mbottom = -1;
  _H523_Curved_223_var._parameters.nhslit = 1;
  _H523_Curved_223_var._parameters.G = 0;
  _H523_Curved_223_var._parameters.aleft = -1;
  _H523_Curved_223_var._parameters.aright = -1;
  _H523_Curved_223_var._parameters.atop = -1;
  _H523_Curved_223_var._parameters.abottom = -1;
  _H523_Curved_223_var._parameters.wavy = 0;
  _H523_Curved_223_var._parameters.wavy_z = 0;
  _H523_Curved_223_var._parameters.wavy_tb = 0;
  _H523_Curved_223_var._parameters.wavy_lr = 0;
  _H523_Curved_223_var._parameters.chamfers = 0;
  _H523_Curved_223_var._parameters.chamfers_z = 0;
  _H523_Curved_223_var._parameters.chamfers_lr = 0;
  _H523_Curved_223_var._parameters.chamfers_tb = 0;
  _H523_Curved_223_var._parameters.nelements = 1;
  _H523_Curved_223_var._parameters.nu = 0;
  _H523_Curved_223_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_223_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_223_var._parameters.reflect[0]='\0';


  /* component H523_Curved_223=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_222_var._rotation_absolute, _H523_Curved_223_var._rotation_absolute);
    rot_transpose(_H523_Curved_222_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_223_var._rotation_absolute, tr1, _H523_Curved_223_var._rotation_relative);
    _H523_Curved_223_var._rotation_is_identity =  rot_test_identity(_H523_Curved_223_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_222 , l ) + gGap);
    rot_transpose(_H523_Curved_222_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_223_var._position_absolute = coords_add(_H523_Curved_222_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_222_var._position_absolute, _H523_Curved_223_var._position_absolute);
    _H523_Curved_223_var._position_relative = rot_apply(_H523_Curved_223_var._rotation_absolute, tc1);
  } /* H523_Curved_223=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_223", _H523_Curved_223_var._position_absolute, _H523_Curved_223_var._rotation_absolute);
  instrument->_position_absolute[223] = _H523_Curved_223_var._position_absolute;
  instrument->_position_relative[223] = _H523_Curved_223_var._position_relative;
    _H523_Curved_223_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_223_var._position_relative);
  instrument->counter_N[223]  = instrument->counter_P[223] = instrument->counter_P2[223] = 0;
  instrument->counter_AbsorbProp[223]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0222_H523_Curved_223", _H523_Curved_223_var._position_absolute, _H523_Curved_223_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0222_H523_Curved_223", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_223_setpos */

/* component H523_Curved_224=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_224_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_224_setpos] component H523_Curved_224=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_224_var._name, "H523_Curved_224", 16384);
  stracpy(_H523_Curved_224_var._type, "Guide_gravity", 16384);
  _H523_Curved_224_var._index=224;
  int current_setpos_index = 224;
  _H523_Curved_224_var._parameters.w1 = 0.06;
  _H523_Curved_224_var._parameters.h1 = 0.12;
  _H523_Curved_224_var._parameters.w2 = 0;
  _H523_Curved_224_var._parameters.h2 = 0;
  _H523_Curved_224_var._parameters.l = 50.0 / 25;
  _H523_Curved_224_var._parameters.R0 = gR0;
  _H523_Curved_224_var._parameters.Qc = gQc;
  _H523_Curved_224_var._parameters.alpha = gAlpha;
  _H523_Curved_224_var._parameters.m = 1.2;
  _H523_Curved_224_var._parameters.W = gW;
  _H523_Curved_224_var._parameters.nslit = 1;
  _H523_Curved_224_var._parameters.d = 0.0005;
  _H523_Curved_224_var._parameters.mleft = -1;
  _H523_Curved_224_var._parameters.mright = 1.5;
  _H523_Curved_224_var._parameters.mtop = -1;
  _H523_Curved_224_var._parameters.mbottom = -1;
  _H523_Curved_224_var._parameters.nhslit = 1;
  _H523_Curved_224_var._parameters.G = 0;
  _H523_Curved_224_var._parameters.aleft = -1;
  _H523_Curved_224_var._parameters.aright = -1;
  _H523_Curved_224_var._parameters.atop = -1;
  _H523_Curved_224_var._parameters.abottom = -1;
  _H523_Curved_224_var._parameters.wavy = 0;
  _H523_Curved_224_var._parameters.wavy_z = 0;
  _H523_Curved_224_var._parameters.wavy_tb = 0;
  _H523_Curved_224_var._parameters.wavy_lr = 0;
  _H523_Curved_224_var._parameters.chamfers = 0;
  _H523_Curved_224_var._parameters.chamfers_z = 0;
  _H523_Curved_224_var._parameters.chamfers_lr = 0;
  _H523_Curved_224_var._parameters.chamfers_tb = 0;
  _H523_Curved_224_var._parameters.nelements = 1;
  _H523_Curved_224_var._parameters.nu = 0;
  _H523_Curved_224_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_224_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_224_var._parameters.reflect[0]='\0';


  /* component H523_Curved_224=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_223_var._rotation_absolute, _H523_Curved_224_var._rotation_absolute);
    rot_transpose(_H523_Curved_223_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_224_var._rotation_absolute, tr1, _H523_Curved_224_var._rotation_relative);
    _H523_Curved_224_var._rotation_is_identity =  rot_test_identity(_H523_Curved_224_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_223 , l ) + gGap);
    rot_transpose(_H523_Curved_223_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_224_var._position_absolute = coords_add(_H523_Curved_223_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_223_var._position_absolute, _H523_Curved_224_var._position_absolute);
    _H523_Curved_224_var._position_relative = rot_apply(_H523_Curved_224_var._rotation_absolute, tc1);
  } /* H523_Curved_224=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_224", _H523_Curved_224_var._position_absolute, _H523_Curved_224_var._rotation_absolute);
  instrument->_position_absolute[224] = _H523_Curved_224_var._position_absolute;
  instrument->_position_relative[224] = _H523_Curved_224_var._position_relative;
    _H523_Curved_224_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_224_var._position_relative);
  instrument->counter_N[224]  = instrument->counter_P[224] = instrument->counter_P2[224] = 0;
  instrument->counter_AbsorbProp[224]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0223_H523_Curved_224", _H523_Curved_224_var._position_absolute, _H523_Curved_224_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0223_H523_Curved_224", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_224_setpos */

/* component H523_Curved_225=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_225_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_225_setpos] component H523_Curved_225=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_225_var._name, "H523_Curved_225", 16384);
  stracpy(_H523_Curved_225_var._type, "Guide_gravity", 16384);
  _H523_Curved_225_var._index=225;
  int current_setpos_index = 225;
  _H523_Curved_225_var._parameters.w1 = 0.06;
  _H523_Curved_225_var._parameters.h1 = 0.12;
  _H523_Curved_225_var._parameters.w2 = 0;
  _H523_Curved_225_var._parameters.h2 = 0;
  _H523_Curved_225_var._parameters.l = 50.0 / 25;
  _H523_Curved_225_var._parameters.R0 = gR0;
  _H523_Curved_225_var._parameters.Qc = gQc;
  _H523_Curved_225_var._parameters.alpha = gAlpha;
  _H523_Curved_225_var._parameters.m = 1.2;
  _H523_Curved_225_var._parameters.W = gW;
  _H523_Curved_225_var._parameters.nslit = 1;
  _H523_Curved_225_var._parameters.d = 0.0005;
  _H523_Curved_225_var._parameters.mleft = -1;
  _H523_Curved_225_var._parameters.mright = 1.5;
  _H523_Curved_225_var._parameters.mtop = -1;
  _H523_Curved_225_var._parameters.mbottom = -1;
  _H523_Curved_225_var._parameters.nhslit = 1;
  _H523_Curved_225_var._parameters.G = 0;
  _H523_Curved_225_var._parameters.aleft = -1;
  _H523_Curved_225_var._parameters.aright = -1;
  _H523_Curved_225_var._parameters.atop = -1;
  _H523_Curved_225_var._parameters.abottom = -1;
  _H523_Curved_225_var._parameters.wavy = 0;
  _H523_Curved_225_var._parameters.wavy_z = 0;
  _H523_Curved_225_var._parameters.wavy_tb = 0;
  _H523_Curved_225_var._parameters.wavy_lr = 0;
  _H523_Curved_225_var._parameters.chamfers = 0;
  _H523_Curved_225_var._parameters.chamfers_z = 0;
  _H523_Curved_225_var._parameters.chamfers_lr = 0;
  _H523_Curved_225_var._parameters.chamfers_tb = 0;
  _H523_Curved_225_var._parameters.nelements = 1;
  _H523_Curved_225_var._parameters.nu = 0;
  _H523_Curved_225_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_225_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_225_var._parameters.reflect[0]='\0';


  /* component H523_Curved_225=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_224_var._rotation_absolute, _H523_Curved_225_var._rotation_absolute);
    rot_transpose(_H523_Curved_224_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_225_var._rotation_absolute, tr1, _H523_Curved_225_var._rotation_relative);
    _H523_Curved_225_var._rotation_is_identity =  rot_test_identity(_H523_Curved_225_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_224 , l ) + gGap);
    rot_transpose(_H523_Curved_224_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_225_var._position_absolute = coords_add(_H523_Curved_224_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_224_var._position_absolute, _H523_Curved_225_var._position_absolute);
    _H523_Curved_225_var._position_relative = rot_apply(_H523_Curved_225_var._rotation_absolute, tc1);
  } /* H523_Curved_225=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_225", _H523_Curved_225_var._position_absolute, _H523_Curved_225_var._rotation_absolute);
  instrument->_position_absolute[225] = _H523_Curved_225_var._position_absolute;
  instrument->_position_relative[225] = _H523_Curved_225_var._position_relative;
    _H523_Curved_225_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_225_var._position_relative);
  instrument->counter_N[225]  = instrument->counter_P[225] = instrument->counter_P2[225] = 0;
  instrument->counter_AbsorbProp[225]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0224_H523_Curved_225", _H523_Curved_225_var._position_absolute, _H523_Curved_225_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0224_H523_Curved_225", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_225_setpos */

/* component H523_Curved_226=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_226_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_226_setpos] component H523_Curved_226=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_226_var._name, "H523_Curved_226", 16384);
  stracpy(_H523_Curved_226_var._type, "Guide_gravity", 16384);
  _H523_Curved_226_var._index=226;
  int current_setpos_index = 226;
  _H523_Curved_226_var._parameters.w1 = 0.06;
  _H523_Curved_226_var._parameters.h1 = 0.12;
  _H523_Curved_226_var._parameters.w2 = 0;
  _H523_Curved_226_var._parameters.h2 = 0;
  _H523_Curved_226_var._parameters.l = 50.0 / 25;
  _H523_Curved_226_var._parameters.R0 = gR0;
  _H523_Curved_226_var._parameters.Qc = gQc;
  _H523_Curved_226_var._parameters.alpha = gAlpha;
  _H523_Curved_226_var._parameters.m = 1.2;
  _H523_Curved_226_var._parameters.W = gW;
  _H523_Curved_226_var._parameters.nslit = 1;
  _H523_Curved_226_var._parameters.d = 0.0005;
  _H523_Curved_226_var._parameters.mleft = -1;
  _H523_Curved_226_var._parameters.mright = 1.5;
  _H523_Curved_226_var._parameters.mtop = -1;
  _H523_Curved_226_var._parameters.mbottom = -1;
  _H523_Curved_226_var._parameters.nhslit = 1;
  _H523_Curved_226_var._parameters.G = 0;
  _H523_Curved_226_var._parameters.aleft = -1;
  _H523_Curved_226_var._parameters.aright = -1;
  _H523_Curved_226_var._parameters.atop = -1;
  _H523_Curved_226_var._parameters.abottom = -1;
  _H523_Curved_226_var._parameters.wavy = 0;
  _H523_Curved_226_var._parameters.wavy_z = 0;
  _H523_Curved_226_var._parameters.wavy_tb = 0;
  _H523_Curved_226_var._parameters.wavy_lr = 0;
  _H523_Curved_226_var._parameters.chamfers = 0;
  _H523_Curved_226_var._parameters.chamfers_z = 0;
  _H523_Curved_226_var._parameters.chamfers_lr = 0;
  _H523_Curved_226_var._parameters.chamfers_tb = 0;
  _H523_Curved_226_var._parameters.nelements = 1;
  _H523_Curved_226_var._parameters.nu = 0;
  _H523_Curved_226_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_226_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_226_var._parameters.reflect[0]='\0';


  /* component H523_Curved_226=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_225_var._rotation_absolute, _H523_Curved_226_var._rotation_absolute);
    rot_transpose(_H523_Curved_225_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_226_var._rotation_absolute, tr1, _H523_Curved_226_var._rotation_relative);
    _H523_Curved_226_var._rotation_is_identity =  rot_test_identity(_H523_Curved_226_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_225 , l ) + gGap);
    rot_transpose(_H523_Curved_225_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_226_var._position_absolute = coords_add(_H523_Curved_225_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_225_var._position_absolute, _H523_Curved_226_var._position_absolute);
    _H523_Curved_226_var._position_relative = rot_apply(_H523_Curved_226_var._rotation_absolute, tc1);
  } /* H523_Curved_226=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_226", _H523_Curved_226_var._position_absolute, _H523_Curved_226_var._rotation_absolute);
  instrument->_position_absolute[226] = _H523_Curved_226_var._position_absolute;
  instrument->_position_relative[226] = _H523_Curved_226_var._position_relative;
    _H523_Curved_226_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_226_var._position_relative);
  instrument->counter_N[226]  = instrument->counter_P[226] = instrument->counter_P2[226] = 0;
  instrument->counter_AbsorbProp[226]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0225_H523_Curved_226", _H523_Curved_226_var._position_absolute, _H523_Curved_226_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0225_H523_Curved_226", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_226_setpos */

/* component H523_Curved_227=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_227_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_227_setpos] component H523_Curved_227=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_227_var._name, "H523_Curved_227", 16384);
  stracpy(_H523_Curved_227_var._type, "Guide_gravity", 16384);
  _H523_Curved_227_var._index=227;
  int current_setpos_index = 227;
  _H523_Curved_227_var._parameters.w1 = 0.06;
  _H523_Curved_227_var._parameters.h1 = 0.12;
  _H523_Curved_227_var._parameters.w2 = 0;
  _H523_Curved_227_var._parameters.h2 = 0;
  _H523_Curved_227_var._parameters.l = 50.0 / 25;
  _H523_Curved_227_var._parameters.R0 = gR0;
  _H523_Curved_227_var._parameters.Qc = gQc;
  _H523_Curved_227_var._parameters.alpha = gAlpha;
  _H523_Curved_227_var._parameters.m = 1.2;
  _H523_Curved_227_var._parameters.W = gW;
  _H523_Curved_227_var._parameters.nslit = 1;
  _H523_Curved_227_var._parameters.d = 0.0005;
  _H523_Curved_227_var._parameters.mleft = -1;
  _H523_Curved_227_var._parameters.mright = 1.5;
  _H523_Curved_227_var._parameters.mtop = -1;
  _H523_Curved_227_var._parameters.mbottom = -1;
  _H523_Curved_227_var._parameters.nhslit = 1;
  _H523_Curved_227_var._parameters.G = 0;
  _H523_Curved_227_var._parameters.aleft = -1;
  _H523_Curved_227_var._parameters.aright = -1;
  _H523_Curved_227_var._parameters.atop = -1;
  _H523_Curved_227_var._parameters.abottom = -1;
  _H523_Curved_227_var._parameters.wavy = 0;
  _H523_Curved_227_var._parameters.wavy_z = 0;
  _H523_Curved_227_var._parameters.wavy_tb = 0;
  _H523_Curved_227_var._parameters.wavy_lr = 0;
  _H523_Curved_227_var._parameters.chamfers = 0;
  _H523_Curved_227_var._parameters.chamfers_z = 0;
  _H523_Curved_227_var._parameters.chamfers_lr = 0;
  _H523_Curved_227_var._parameters.chamfers_tb = 0;
  _H523_Curved_227_var._parameters.nelements = 1;
  _H523_Curved_227_var._parameters.nu = 0;
  _H523_Curved_227_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_227_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_227_var._parameters.reflect[0]='\0';


  /* component H523_Curved_227=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_226_var._rotation_absolute, _H523_Curved_227_var._rotation_absolute);
    rot_transpose(_H523_Curved_226_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_227_var._rotation_absolute, tr1, _H523_Curved_227_var._rotation_relative);
    _H523_Curved_227_var._rotation_is_identity =  rot_test_identity(_H523_Curved_227_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_226 , l ) + gGap);
    rot_transpose(_H523_Curved_226_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_227_var._position_absolute = coords_add(_H523_Curved_226_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_226_var._position_absolute, _H523_Curved_227_var._position_absolute);
    _H523_Curved_227_var._position_relative = rot_apply(_H523_Curved_227_var._rotation_absolute, tc1);
  } /* H523_Curved_227=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_227", _H523_Curved_227_var._position_absolute, _H523_Curved_227_var._rotation_absolute);
  instrument->_position_absolute[227] = _H523_Curved_227_var._position_absolute;
  instrument->_position_relative[227] = _H523_Curved_227_var._position_relative;
    _H523_Curved_227_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_227_var._position_relative);
  instrument->counter_N[227]  = instrument->counter_P[227] = instrument->counter_P2[227] = 0;
  instrument->counter_AbsorbProp[227]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0226_H523_Curved_227", _H523_Curved_227_var._position_absolute, _H523_Curved_227_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0226_H523_Curved_227", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_227_setpos */

/* component H523_Curved_228=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_228_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_228_setpos] component H523_Curved_228=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_228_var._name, "H523_Curved_228", 16384);
  stracpy(_H523_Curved_228_var._type, "Guide_gravity", 16384);
  _H523_Curved_228_var._index=228;
  int current_setpos_index = 228;
  _H523_Curved_228_var._parameters.w1 = 0.06;
  _H523_Curved_228_var._parameters.h1 = 0.12;
  _H523_Curved_228_var._parameters.w2 = 0;
  _H523_Curved_228_var._parameters.h2 = 0;
  _H523_Curved_228_var._parameters.l = 50.0 / 25;
  _H523_Curved_228_var._parameters.R0 = gR0;
  _H523_Curved_228_var._parameters.Qc = gQc;
  _H523_Curved_228_var._parameters.alpha = gAlpha;
  _H523_Curved_228_var._parameters.m = 1.2;
  _H523_Curved_228_var._parameters.W = gW;
  _H523_Curved_228_var._parameters.nslit = 1;
  _H523_Curved_228_var._parameters.d = 0.0005;
  _H523_Curved_228_var._parameters.mleft = -1;
  _H523_Curved_228_var._parameters.mright = 1.5;
  _H523_Curved_228_var._parameters.mtop = -1;
  _H523_Curved_228_var._parameters.mbottom = -1;
  _H523_Curved_228_var._parameters.nhslit = 1;
  _H523_Curved_228_var._parameters.G = 0;
  _H523_Curved_228_var._parameters.aleft = -1;
  _H523_Curved_228_var._parameters.aright = -1;
  _H523_Curved_228_var._parameters.atop = -1;
  _H523_Curved_228_var._parameters.abottom = -1;
  _H523_Curved_228_var._parameters.wavy = 0;
  _H523_Curved_228_var._parameters.wavy_z = 0;
  _H523_Curved_228_var._parameters.wavy_tb = 0;
  _H523_Curved_228_var._parameters.wavy_lr = 0;
  _H523_Curved_228_var._parameters.chamfers = 0;
  _H523_Curved_228_var._parameters.chamfers_z = 0;
  _H523_Curved_228_var._parameters.chamfers_lr = 0;
  _H523_Curved_228_var._parameters.chamfers_tb = 0;
  _H523_Curved_228_var._parameters.nelements = 1;
  _H523_Curved_228_var._parameters.nu = 0;
  _H523_Curved_228_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_228_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_228_var._parameters.reflect[0]='\0';


  /* component H523_Curved_228=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_227_var._rotation_absolute, _H523_Curved_228_var._rotation_absolute);
    rot_transpose(_H523_Curved_227_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_228_var._rotation_absolute, tr1, _H523_Curved_228_var._rotation_relative);
    _H523_Curved_228_var._rotation_is_identity =  rot_test_identity(_H523_Curved_228_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_227 , l ) + gGap);
    rot_transpose(_H523_Curved_227_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_228_var._position_absolute = coords_add(_H523_Curved_227_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_227_var._position_absolute, _H523_Curved_228_var._position_absolute);
    _H523_Curved_228_var._position_relative = rot_apply(_H523_Curved_228_var._rotation_absolute, tc1);
  } /* H523_Curved_228=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_228", _H523_Curved_228_var._position_absolute, _H523_Curved_228_var._rotation_absolute);
  instrument->_position_absolute[228] = _H523_Curved_228_var._position_absolute;
  instrument->_position_relative[228] = _H523_Curved_228_var._position_relative;
    _H523_Curved_228_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_228_var._position_relative);
  instrument->counter_N[228]  = instrument->counter_P[228] = instrument->counter_P2[228] = 0;
  instrument->counter_AbsorbProp[228]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0227_H523_Curved_228", _H523_Curved_228_var._position_absolute, _H523_Curved_228_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0227_H523_Curved_228", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_228_setpos */

/* component H523_Curved_229=Guide_gravity() SETTING, POSITION/ROTATION */
int _H523_Curved_229_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_Curved_229_setpos] component H523_Curved_229=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H523_Curved_229_var._name, "H523_Curved_229", 16384);
  stracpy(_H523_Curved_229_var._type, "Guide_gravity", 16384);
  _H523_Curved_229_var._index=229;
  int current_setpos_index = 229;
  _H523_Curved_229_var._parameters.w1 = 0.06;
  _H523_Curved_229_var._parameters.h1 = 0.12;
  _H523_Curved_229_var._parameters.w2 = 0;
  _H523_Curved_229_var._parameters.h2 = 0;
  _H523_Curved_229_var._parameters.l = 50.0 / 25;
  _H523_Curved_229_var._parameters.R0 = gR0;
  _H523_Curved_229_var._parameters.Qc = gQc;
  _H523_Curved_229_var._parameters.alpha = gAlpha;
  _H523_Curved_229_var._parameters.m = 1.2;
  _H523_Curved_229_var._parameters.W = gW;
  _H523_Curved_229_var._parameters.nslit = 1;
  _H523_Curved_229_var._parameters.d = 0.0005;
  _H523_Curved_229_var._parameters.mleft = -1;
  _H523_Curved_229_var._parameters.mright = 1.5;
  _H523_Curved_229_var._parameters.mtop = -1;
  _H523_Curved_229_var._parameters.mbottom = -1;
  _H523_Curved_229_var._parameters.nhslit = 1;
  _H523_Curved_229_var._parameters.G = 0;
  _H523_Curved_229_var._parameters.aleft = -1;
  _H523_Curved_229_var._parameters.aright = -1;
  _H523_Curved_229_var._parameters.atop = -1;
  _H523_Curved_229_var._parameters.abottom = -1;
  _H523_Curved_229_var._parameters.wavy = 0;
  _H523_Curved_229_var._parameters.wavy_z = 0;
  _H523_Curved_229_var._parameters.wavy_tb = 0;
  _H523_Curved_229_var._parameters.wavy_lr = 0;
  _H523_Curved_229_var._parameters.chamfers = 0;
  _H523_Curved_229_var._parameters.chamfers_z = 0;
  _H523_Curved_229_var._parameters.chamfers_lr = 0;
  _H523_Curved_229_var._parameters.chamfers_tb = 0;
  _H523_Curved_229_var._parameters.nelements = 1;
  _H523_Curved_229_var._parameters.nu = 0;
  _H523_Curved_229_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_Curved_229_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_Curved_229_var._parameters.reflect[0]='\0';


  /* component H523_Curved_229=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (50.0 / 25.0 / 800 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_228_var._rotation_absolute, _H523_Curved_229_var._rotation_absolute);
    rot_transpose(_H523_Curved_228_var._rotation_absolute, tr1);
    rot_mul(_H523_Curved_229_var._rotation_absolute, tr1, _H523_Curved_229_var._rotation_relative);
    _H523_Curved_229_var._rotation_is_identity =  rot_test_identity(_H523_Curved_229_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_228 , l ) + gGap);
    rot_transpose(_H523_Curved_228_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_Curved_229_var._position_absolute = coords_add(_H523_Curved_228_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_228_var._position_absolute, _H523_Curved_229_var._position_absolute);
    _H523_Curved_229_var._position_relative = rot_apply(_H523_Curved_229_var._rotation_absolute, tc1);
  } /* H523_Curved_229=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H523_Curved_229", _H523_Curved_229_var._position_absolute, _H523_Curved_229_var._rotation_absolute);
  instrument->_position_absolute[229] = _H523_Curved_229_var._position_absolute;
  instrument->_position_relative[229] = _H523_Curved_229_var._position_relative;
    _H523_Curved_229_var._position_relative_is_zero =  coords_test_zero(_H523_Curved_229_var._position_relative);
  instrument->counter_N[229]  = instrument->counter_P[229] = instrument->counter_P2[229] = 0;
  instrument->counter_AbsorbProp[229]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0228_H523_Curved_229", _H523_Curved_229_var._position_absolute, _H523_Curved_229_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "w1", "NONE", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "l", "NONE", "50.0 / 25","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "mright", "-1", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0228_H523_Curved_229", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_Curved_229_setpos */

/* component HCS_Al_230=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_230_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_230_setpos] component HCS_Al_230=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_230_var._name, "HCS_Al_230", 16384);
  stracpy(_HCS_Al_230_var._type, "PowderN", 16384);
  _HCS_Al_230_var._index=230;
  int current_setpos_index = 230;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_230_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_230_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_230_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_230_var._parameters.geometry[0]='\0';
  _HCS_Al_230_var._parameters.format[0] = 0;
  _HCS_Al_230_var._parameters.format[1] = 0;
  _HCS_Al_230_var._parameters.format[2] = 0;
  _HCS_Al_230_var._parameters.format[3] = 0;
  _HCS_Al_230_var._parameters.format[4] = 0;
  _HCS_Al_230_var._parameters.format[5] = 0;
  _HCS_Al_230_var._parameters.format[6] = 0;
  _HCS_Al_230_var._parameters.format[7] = 0;
  _HCS_Al_230_var._parameters.format[8] = 0;
  _HCS_Al_230_var._parameters.radius = 0;
  _HCS_Al_230_var._parameters.yheight = 0.12;
  _HCS_Al_230_var._parameters.xwidth = 0.06;
  _HCS_Al_230_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_230_var._parameters.thickness = 0;
  _HCS_Al_230_var._parameters.pack = 1;
  _HCS_Al_230_var._parameters.Vc = 0;
  _HCS_Al_230_var._parameters.sigma_abs = 0;
  _HCS_Al_230_var._parameters.sigma_inc = 0;
  _HCS_Al_230_var._parameters.delta_d_d = 0;
  _HCS_Al_230_var._parameters.p_inc = 0.005;
  _HCS_Al_230_var._parameters.p_transmit = 0.9450;
  _HCS_Al_230_var._parameters.DW = 0;
  _HCS_Al_230_var._parameters.nb_atoms = 1;
  _HCS_Al_230_var._parameters.d_omega = 0;
  _HCS_Al_230_var._parameters.d_phi = 10;
  _HCS_Al_230_var._parameters.tth_sign = 0;
  _HCS_Al_230_var._parameters.p_interact = 0.05;
  _HCS_Al_230_var._parameters.concentric = 0;
  _HCS_Al_230_var._parameters.density = 0;
  _HCS_Al_230_var._parameters.weight = 0;
  _HCS_Al_230_var._parameters.barns = 1;
  _HCS_Al_230_var._parameters.Strain = 0;
  _HCS_Al_230_var._parameters.focus_flip = 0;
  _HCS_Al_230_var._parameters.target_index = 0;
  _HCS_Al_230_var._parameters.order = 1;


  /* component HCS_Al_230=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H523_Curved_229_var._rotation_absolute, _HCS_Al_230_var._rotation_absolute);
    rot_transpose(_H523_Curved_229_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_230_var._rotation_absolute, tr1, _HCS_Al_230_var._rotation_relative);
    _HCS_Al_230_var._rotation_is_identity =  rot_test_identity(_HCS_Al_230_var._rotation_relative);
    tc1 = coords_set(
      0, 0, COMP_GETPAR ( H523_Curved_229 , l ) + gGap);
    rot_transpose(_H523_Curved_229_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_230_var._position_absolute = coords_add(_H523_Curved_229_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_Curved_229_var._position_absolute, _HCS_Al_230_var._position_absolute);
    _HCS_Al_230_var._position_relative = rot_apply(_HCS_Al_230_var._rotation_absolute, tc1);
  } /* HCS_Al_230=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_230", _HCS_Al_230_var._position_absolute, _HCS_Al_230_var._rotation_absolute);
  instrument->_position_absolute[230] = _HCS_Al_230_var._position_absolute;
  instrument->_position_relative[230] = _HCS_Al_230_var._position_relative;
    _HCS_Al_230_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_230_var._position_relative);
  instrument->counter_N[230]  = instrument->counter_P[230] = instrument->counter_P2[230] = 0;
  instrument->counter_AbsorbProp[230]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0229_HCS_Al_230", _HCS_Al_230_var._position_absolute, _HCS_Al_230_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0229_HCS_Al_230", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_230_setpos */

/* component H523_CryoEDM_In=Arm() SETTING, POSITION/ROTATION */
int _H523_CryoEDM_In_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_CryoEDM_In_setpos] component H523_CryoEDM_In=Arm() SETTING [Arm:0]");
  stracpy(_H523_CryoEDM_In_var._name, "H523_CryoEDM_In", 16384);
  stracpy(_H523_CryoEDM_In_var._type, "Arm", 16384);
  _H523_CryoEDM_In_var._index=231;
  int current_setpos_index = 231;
  /* component H523_CryoEDM_In=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_230_var._rotation_absolute, _H523_CryoEDM_In_var._rotation_absolute);
    rot_transpose(_HCS_Al_230_var._rotation_absolute, tr1);
    rot_mul(_H523_CryoEDM_In_var._rotation_absolute, tr1, _H523_CryoEDM_In_var._rotation_relative);
    _H523_CryoEDM_In_var._rotation_is_identity =  rot_test_identity(_H523_CryoEDM_In_var._rotation_relative);
    tc1 = coords_set(
      0, 0, CryoEDM_L);
    rot_transpose(_HCS_Al_230_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_CryoEDM_In_var._position_absolute = coords_add(_HCS_Al_230_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_230_var._position_absolute, _H523_CryoEDM_In_var._position_absolute);
    _H523_CryoEDM_In_var._position_relative = rot_apply(_H523_CryoEDM_In_var._rotation_absolute, tc1);
  } /* H523_CryoEDM_In=Arm() AT ROTATED */
  DEBUG_COMPONENT("H523_CryoEDM_In", _H523_CryoEDM_In_var._position_absolute, _H523_CryoEDM_In_var._rotation_absolute);
  instrument->_position_absolute[231] = _H523_CryoEDM_In_var._position_absolute;
  instrument->_position_relative[231] = _H523_CryoEDM_In_var._position_relative;
    _H523_CryoEDM_In_var._position_relative_is_zero =  coords_test_zero(_H523_CryoEDM_In_var._position_relative);
  instrument->counter_N[231]  = instrument->counter_P[231] = instrument->counter_P2[231] = 0;
  instrument->counter_AbsorbProp[231]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0230_H523_CryoEDM_In", _H523_CryoEDM_In_var._position_absolute, _H523_CryoEDM_In_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_CryoEDM_In_setpos */

/* component H523_CryoEDM_In_L=Monitor_nD() SETTING, POSITION/ROTATION */
int _H523_CryoEDM_In_L_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_CryoEDM_In_L_setpos] component H523_CryoEDM_In_L=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H523_CryoEDM_In_L_var._name, "H523_CryoEDM_In_L", 16384);
  stracpy(_H523_CryoEDM_In_L_var._type, "Monitor_nD", 16384);
  _H523_CryoEDM_In_L_var._index=232;
  int current_setpos_index = 232;
  if("" && strlen(""))
    stracpy(_H523_CryoEDM_In_L_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H523_CryoEDM_In_L_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H523_CryoEDM_In_L_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H523_CryoEDM_In_L_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H523_CryoEDM_In_L_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H523_CryoEDM_In_L_var._parameters.user3[0]='\0';
  _H523_CryoEDM_In_L_var._parameters.xwidth = 0.06;
  _H523_CryoEDM_In_L_var._parameters.yheight = 0.12;
  _H523_CryoEDM_In_L_var._parameters.zdepth = 0;
  _H523_CryoEDM_In_L_var._parameters.xmin = 0;
  _H523_CryoEDM_In_L_var._parameters.xmax = 0;
  _H523_CryoEDM_In_L_var._parameters.ymin = 0;
  _H523_CryoEDM_In_L_var._parameters.ymax = 0;
  _H523_CryoEDM_In_L_var._parameters.zmin = 0;
  _H523_CryoEDM_In_L_var._parameters.zmax = 0;
  _H523_CryoEDM_In_L_var._parameters.bins = 100;
  _H523_CryoEDM_In_L_var._parameters.min = -1e40;
  _H523_CryoEDM_In_L_var._parameters.max = 1e40;
  _H523_CryoEDM_In_L_var._parameters.restore_neutron = 1;
  _H523_CryoEDM_In_L_var._parameters.radius = 0;
  if("lambda limits=[1 10]" && strlen("lambda limits=[1 10]"))
    stracpy(_H523_CryoEDM_In_L_var._parameters.options, "lambda limits=[1 10]" ? "lambda limits=[1 10]" : "", 16384);
  else 
  _H523_CryoEDM_In_L_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_In_L_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_In_L_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_In_L_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_In_L_var._parameters.geometry[0]='\0';
  _H523_CryoEDM_In_L_var._parameters.nowritefile = 0;
  _H523_CryoEDM_In_L_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_In_L_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_In_L_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_In_L_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_In_L_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_In_L_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_In_L_var._parameters.username3[0]='\0';


  /* component H523_CryoEDM_In_L=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H523_CryoEDM_In_var._rotation_absolute, _H523_CryoEDM_In_L_var._rotation_absolute);
    rot_transpose(_HCS_Al_230_var._rotation_absolute, tr1);
    rot_mul(_H523_CryoEDM_In_L_var._rotation_absolute, tr1, _H523_CryoEDM_In_L_var._rotation_relative);
    _H523_CryoEDM_In_L_var._rotation_is_identity =  rot_test_identity(_H523_CryoEDM_In_L_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H523_CryoEDM_In_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_CryoEDM_In_L_var._position_absolute = coords_add(_H523_CryoEDM_In_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_230_var._position_absolute, _H523_CryoEDM_In_L_var._position_absolute);
    _H523_CryoEDM_In_L_var._position_relative = rot_apply(_H523_CryoEDM_In_L_var._rotation_absolute, tc1);
  } /* H523_CryoEDM_In_L=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H523_CryoEDM_In_L", _H523_CryoEDM_In_L_var._position_absolute, _H523_CryoEDM_In_L_var._rotation_absolute);
  instrument->_position_absolute[232] = _H523_CryoEDM_In_L_var._position_absolute;
  instrument->_position_relative[232] = _H523_CryoEDM_In_L_var._position_relative;
    _H523_CryoEDM_In_L_var._position_relative_is_zero =  coords_test_zero(_H523_CryoEDM_In_L_var._position_relative);
  instrument->counter_N[232]  = instrument->counter_P[232] = instrument->counter_P2[232] = 0;
  instrument->counter_AbsorbProp[232]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0231_H523_CryoEDM_In_L", _H523_CryoEDM_In_L_var._position_absolute, _H523_CryoEDM_In_L_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "bins", "0", "100","int");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "options", "NULL", "lambda limits=[1 10]", "char*");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0231_H523_CryoEDM_In_L", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_CryoEDM_In_L_setpos */

/* component H523_CryoEDM_mirror_center=Arm() SETTING, POSITION/ROTATION */
int _H523_CryoEDM_mirror_center_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_CryoEDM_mirror_center_setpos] component H523_CryoEDM_mirror_center=Arm() SETTING [Arm:0]");
  stracpy(_H523_CryoEDM_mirror_center_var._name, "H523_CryoEDM_mirror_center", 16384);
  stracpy(_H523_CryoEDM_mirror_center_var._type, "Arm", 16384);
  _H523_CryoEDM_mirror_center_var._index=233;
  int current_setpos_index = 233;
  /* component H523_CryoEDM_mirror_center=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H523_CryoEDM_In_var._rotation_absolute, _H523_CryoEDM_mirror_center_var._rotation_absolute);
    rot_transpose(_H523_CryoEDM_In_L_var._rotation_absolute, tr1);
    rot_mul(_H523_CryoEDM_mirror_center_var._rotation_absolute, tr1, _H523_CryoEDM_mirror_center_var._rotation_relative);
    _H523_CryoEDM_mirror_center_var._rotation_is_identity =  rot_test_identity(_H523_CryoEDM_mirror_center_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 2.45 / 2);
    rot_transpose(_H523_CryoEDM_In_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_CryoEDM_mirror_center_var._position_absolute = coords_add(_H523_CryoEDM_In_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_CryoEDM_In_L_var._position_absolute, _H523_CryoEDM_mirror_center_var._position_absolute);
    _H523_CryoEDM_mirror_center_var._position_relative = rot_apply(_H523_CryoEDM_mirror_center_var._rotation_absolute, tc1);
  } /* H523_CryoEDM_mirror_center=Arm() AT ROTATED */
  DEBUG_COMPONENT("H523_CryoEDM_mirror_center", _H523_CryoEDM_mirror_center_var._position_absolute, _H523_CryoEDM_mirror_center_var._rotation_absolute);
  instrument->_position_absolute[233] = _H523_CryoEDM_mirror_center_var._position_absolute;
  instrument->_position_relative[233] = _H523_CryoEDM_mirror_center_var._position_relative;
    _H523_CryoEDM_mirror_center_var._position_relative_is_zero =  coords_test_zero(_H523_CryoEDM_mirror_center_var._position_relative);
  instrument->counter_N[233]  = instrument->counter_P[233] = instrument->counter_P2[233] = 0;
  instrument->counter_AbsorbProp[233]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0232_H523_CryoEDM_mirror_center", _H523_CryoEDM_mirror_center_var._position_absolute, _H523_CryoEDM_mirror_center_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_CryoEDM_mirror_center_setpos */

/* component H523_CryoEDM_polariser=Pol_mirror() SETTING, POSITION/ROTATION */
int _H523_CryoEDM_polariser_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_CryoEDM_polariser_setpos] component H523_CryoEDM_polariser=Pol_mirror() SETTING [Pol_mirror:0]");
  stracpy(_H523_CryoEDM_polariser_var._name, "H523_CryoEDM_polariser", 16384);
  stracpy(_H523_CryoEDM_polariser_var._type, "Pol_mirror", 16384);
  _H523_CryoEDM_polariser_var._index=234;
  int current_setpos_index = 234;
  _H523_CryoEDM_polariser_var._parameters.rUpPar[0] = 1;
  _H523_CryoEDM_polariser_var._parameters.rUpPar[1] = 0.0219;
  _H523_CryoEDM_polariser_var._parameters.rUpPar[2] = 4.07;
  _H523_CryoEDM_polariser_var._parameters.rUpPar[3] = 3.2;
  _H523_CryoEDM_polariser_var._parameters.rUpPar[4] = 0.003;
  _H523_CryoEDM_polariser_var._parameters.rDownPar[0] = 0.1;
  _H523_CryoEDM_polariser_var._parameters.rDownPar[1] = 0.0219;
  _H523_CryoEDM_polariser_var._parameters.rDownPar[2] = 4.07;
  _H523_CryoEDM_polariser_var._parameters.rDownPar[3] = 3.2;
  _H523_CryoEDM_polariser_var._parameters.rDownPar[4] = 0.003;
  if("" && strlen(""))
    stracpy(_H523_CryoEDM_polariser_var._parameters.rUpData, "" ? "" : "", 16384);
  else 
  _H523_CryoEDM_polariser_var._parameters.rUpData[0]='\0';
  if("" && strlen(""))
    stracpy(_H523_CryoEDM_polariser_var._parameters.rDownData, "" ? "" : "", 16384);
  else 
  _H523_CryoEDM_polariser_var._parameters.rDownData[0]='\0';
  _H523_CryoEDM_polariser_var._parameters.p_reflect = 0.95;
  _H523_CryoEDM_polariser_var._parameters.zwidth = 2.45;
  _H523_CryoEDM_polariser_var._parameters.yheight = 0.055;


  /* component H523_CryoEDM_polariser=Pol_mirror() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (2)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_CryoEDM_mirror_center_var._rotation_absolute, _H523_CryoEDM_polariser_var._rotation_absolute);
    rot_transpose(_H523_CryoEDM_In_L_var._rotation_absolute, tr1);
    rot_mul(_H523_CryoEDM_polariser_var._rotation_absolute, tr1, _H523_CryoEDM_polariser_var._rotation_relative);
    _H523_CryoEDM_polariser_var._rotation_is_identity =  rot_test_identity(_H523_CryoEDM_polariser_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H523_CryoEDM_mirror_center_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_CryoEDM_polariser_var._position_absolute = coords_add(_H523_CryoEDM_mirror_center_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_CryoEDM_In_L_var._position_absolute, _H523_CryoEDM_polariser_var._position_absolute);
    _H523_CryoEDM_polariser_var._position_relative = rot_apply(_H523_CryoEDM_polariser_var._rotation_absolute, tc1);
  } /* H523_CryoEDM_polariser=Pol_mirror() AT ROTATED */
  DEBUG_COMPONENT("H523_CryoEDM_polariser", _H523_CryoEDM_polariser_var._position_absolute, _H523_CryoEDM_polariser_var._rotation_absolute);
  instrument->_position_absolute[234] = _H523_CryoEDM_polariser_var._position_absolute;
  instrument->_position_relative[234] = _H523_CryoEDM_polariser_var._position_relative;
    _H523_CryoEDM_polariser_var._position_relative_is_zero =  coords_test_zero(_H523_CryoEDM_polariser_var._position_relative);
  instrument->counter_N[234]  = instrument->counter_P[234] = instrument->counter_P2[234] = 0;
  instrument->counter_AbsorbProp[234]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0233_H523_CryoEDM_polariser", _H523_CryoEDM_polariser_var._position_absolute, _H523_CryoEDM_polariser_var._rotation_absolute, "Pol_mirror");
        mccomp_param_nexus(nxhandle,"0233_H523_CryoEDM_polariser", "rUpPar", "{ 0.99 , 0.0219 , 6.07 , 2.0 , 0.003 }", "{ 1.0 , 0.0219 , 4.07 , 3.2 , 0.003 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0233_H523_CryoEDM_polariser", "rDownPar", "{ 0.99 , 0.0219 , 6.07 , 2.0 , 0.003 }", "{ 0.1 , 0.0219 , 4.07 , 3.2 , 0.003 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0233_H523_CryoEDM_polariser", "rUpData", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0233_H523_CryoEDM_polariser", "rDownData", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0233_H523_CryoEDM_polariser", "p_reflect", "-1", "0.95","MCNUM");
        mccomp_param_nexus(nxhandle,"0233_H523_CryoEDM_polariser", "zwidth", "NONE", "2.45","MCNUM");
        mccomp_param_nexus(nxhandle,"0233_H523_CryoEDM_polariser", "yheight", "NONE", "0.055","MCNUM");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_CryoEDM_polariser_setpos */

/* component H523_CryoEDM_mirror_outdir=Arm() SETTING, POSITION/ROTATION */
int _H523_CryoEDM_mirror_outdir_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_CryoEDM_mirror_outdir_setpos] component H523_CryoEDM_mirror_outdir=Arm() SETTING [Arm:0]");
  stracpy(_H523_CryoEDM_mirror_outdir_var._name, "H523_CryoEDM_mirror_outdir", 16384);
  stracpy(_H523_CryoEDM_mirror_outdir_var._type, "Arm", 16384);
  _H523_CryoEDM_mirror_outdir_var._index=235;
  int current_setpos_index = 235;
  /* component H523_CryoEDM_mirror_outdir=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (4)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H523_CryoEDM_mirror_center_var._rotation_absolute, _H523_CryoEDM_mirror_outdir_var._rotation_absolute);
    rot_transpose(_H523_CryoEDM_polariser_var._rotation_absolute, tr1);
    rot_mul(_H523_CryoEDM_mirror_outdir_var._rotation_absolute, tr1, _H523_CryoEDM_mirror_outdir_var._rotation_relative);
    _H523_CryoEDM_mirror_outdir_var._rotation_is_identity =  rot_test_identity(_H523_CryoEDM_mirror_outdir_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H523_CryoEDM_mirror_center_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_CryoEDM_mirror_outdir_var._position_absolute = coords_add(_H523_CryoEDM_mirror_center_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_CryoEDM_polariser_var._position_absolute, _H523_CryoEDM_mirror_outdir_var._position_absolute);
    _H523_CryoEDM_mirror_outdir_var._position_relative = rot_apply(_H523_CryoEDM_mirror_outdir_var._rotation_absolute, tc1);
  } /* H523_CryoEDM_mirror_outdir=Arm() AT ROTATED */
  DEBUG_COMPONENT("H523_CryoEDM_mirror_outdir", _H523_CryoEDM_mirror_outdir_var._position_absolute, _H523_CryoEDM_mirror_outdir_var._rotation_absolute);
  instrument->_position_absolute[235] = _H523_CryoEDM_mirror_outdir_var._position_absolute;
  instrument->_position_relative[235] = _H523_CryoEDM_mirror_outdir_var._position_relative;
    _H523_CryoEDM_mirror_outdir_var._position_relative_is_zero =  coords_test_zero(_H523_CryoEDM_mirror_outdir_var._position_relative);
  instrument->counter_N[235]  = instrument->counter_P[235] = instrument->counter_P2[235] = 0;
  instrument->counter_AbsorbProp[235]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0234_H523_CryoEDM_mirror_outdir", _H523_CryoEDM_mirror_outdir_var._position_absolute, _H523_CryoEDM_mirror_outdir_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_CryoEDM_mirror_outdir_setpos */

/* component H523_CryoEDM_mirror_ReflectXY=Monitor_nD() SETTING, POSITION/ROTATION */
int _H523_CryoEDM_mirror_ReflectXY_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_CryoEDM_mirror_ReflectXY_setpos] component H523_CryoEDM_mirror_ReflectXY=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H523_CryoEDM_mirror_ReflectXY_var._name, "H523_CryoEDM_mirror_ReflectXY", 16384);
  stracpy(_H523_CryoEDM_mirror_ReflectXY_var._type, "Monitor_nD", 16384);
  _H523_CryoEDM_mirror_ReflectXY_var._index=236;
  int current_setpos_index = 236;
  if("" && strlen(""))
    stracpy(_H523_CryoEDM_mirror_ReflectXY_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H523_CryoEDM_mirror_ReflectXY_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H523_CryoEDM_mirror_ReflectXY_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.user3[0]='\0';
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.xwidth = 0.04;
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.yheight = 0.055;
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.zdepth = 0;
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.xmin = 0;
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.xmax = 0;
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.ymin = 0;
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.ymax = 0;
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.zmin = 0;
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.zmax = 0;
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.bins = 50;
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.min = -1e40;
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.max = 1e40;
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.restore_neutron = 1;
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.radius = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_mirror_ReflectXY_var._parameters.options, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_mirror_ReflectXY_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_mirror_ReflectXY_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.geometry[0]='\0';
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.nowritefile = 0;
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_mirror_ReflectXY_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_mirror_ReflectXY_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_mirror_ReflectXY_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_mirror_ReflectXY_var._parameters.username3[0]='\0';


  /* component H523_CryoEDM_mirror_ReflectXY=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H523_CryoEDM_mirror_outdir_var._rotation_absolute, _H523_CryoEDM_mirror_ReflectXY_var._rotation_absolute);
    rot_transpose(_H523_CryoEDM_polariser_var._rotation_absolute, tr1);
    rot_mul(_H523_CryoEDM_mirror_ReflectXY_var._rotation_absolute, tr1, _H523_CryoEDM_mirror_ReflectXY_var._rotation_relative);
    _H523_CryoEDM_mirror_ReflectXY_var._rotation_is_identity =  rot_test_identity(_H523_CryoEDM_mirror_ReflectXY_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 2.5 / 2);
    rot_transpose(_H523_CryoEDM_mirror_outdir_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_CryoEDM_mirror_ReflectXY_var._position_absolute = coords_add(_H523_CryoEDM_mirror_outdir_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_CryoEDM_polariser_var._position_absolute, _H523_CryoEDM_mirror_ReflectXY_var._position_absolute);
    _H523_CryoEDM_mirror_ReflectXY_var._position_relative = rot_apply(_H523_CryoEDM_mirror_ReflectXY_var._rotation_absolute, tc1);
  } /* H523_CryoEDM_mirror_ReflectXY=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H523_CryoEDM_mirror_ReflectXY", _H523_CryoEDM_mirror_ReflectXY_var._position_absolute, _H523_CryoEDM_mirror_ReflectXY_var._rotation_absolute);
  instrument->_position_absolute[236] = _H523_CryoEDM_mirror_ReflectXY_var._position_absolute;
  instrument->_position_relative[236] = _H523_CryoEDM_mirror_ReflectXY_var._position_relative;
    _H523_CryoEDM_mirror_ReflectXY_var._position_relative_is_zero =  coords_test_zero(_H523_CryoEDM_mirror_ReflectXY_var._position_relative);
  instrument->counter_N[236]  = instrument->counter_P[236] = instrument->counter_P2[236] = 0;
  instrument->counter_AbsorbProp[236]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", _H523_CryoEDM_mirror_ReflectXY_var._position_absolute, _H523_CryoEDM_mirror_ReflectXY_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "xwidth", "0", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "yheight", "0", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "options", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0235_H523_CryoEDM_mirror_ReflectXY", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_CryoEDM_mirror_ReflectXY_setpos */

/* component H523_CryoEDM_mirror_TransmitXY=Monitor_nD() SETTING, POSITION/ROTATION */
int _H523_CryoEDM_mirror_TransmitXY_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_CryoEDM_mirror_TransmitXY_setpos] component H523_CryoEDM_mirror_TransmitXY=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H523_CryoEDM_mirror_TransmitXY_var._name, "H523_CryoEDM_mirror_TransmitXY", 16384);
  stracpy(_H523_CryoEDM_mirror_TransmitXY_var._type, "Monitor_nD", 16384);
  _H523_CryoEDM_mirror_TransmitXY_var._index=237;
  int current_setpos_index = 237;
  if("" && strlen(""))
    stracpy(_H523_CryoEDM_mirror_TransmitXY_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H523_CryoEDM_mirror_TransmitXY_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H523_CryoEDM_mirror_TransmitXY_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.user3[0]='\0';
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.xwidth = 0.04;
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.yheight = 0.055;
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.zdepth = 0;
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.xmin = 0;
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.xmax = 0;
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.ymin = 0;
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.ymax = 0;
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.zmin = 0;
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.zmax = 0;
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.bins = 50;
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.min = -1e40;
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.max = 1e40;
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.restore_neutron = 1;
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.radius = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_mirror_TransmitXY_var._parameters.options, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_mirror_TransmitXY_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_mirror_TransmitXY_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.geometry[0]='\0';
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.nowritefile = 0;
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_mirror_TransmitXY_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_mirror_TransmitXY_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_mirror_TransmitXY_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_mirror_TransmitXY_var._parameters.username3[0]='\0';


  /* component H523_CryoEDM_mirror_TransmitXY=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H523_CryoEDM_mirror_center_var._rotation_absolute, _H523_CryoEDM_mirror_TransmitXY_var._rotation_absolute);
    rot_transpose(_H523_CryoEDM_mirror_ReflectXY_var._rotation_absolute, tr1);
    rot_mul(_H523_CryoEDM_mirror_TransmitXY_var._rotation_absolute, tr1, _H523_CryoEDM_mirror_TransmitXY_var._rotation_relative);
    _H523_CryoEDM_mirror_TransmitXY_var._rotation_is_identity =  rot_test_identity(_H523_CryoEDM_mirror_TransmitXY_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 2.5 / 2);
    rot_transpose(_H523_CryoEDM_mirror_center_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_CryoEDM_mirror_TransmitXY_var._position_absolute = coords_add(_H523_CryoEDM_mirror_center_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_CryoEDM_mirror_ReflectXY_var._position_absolute, _H523_CryoEDM_mirror_TransmitXY_var._position_absolute);
    _H523_CryoEDM_mirror_TransmitXY_var._position_relative = rot_apply(_H523_CryoEDM_mirror_TransmitXY_var._rotation_absolute, tc1);
  } /* H523_CryoEDM_mirror_TransmitXY=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H523_CryoEDM_mirror_TransmitXY", _H523_CryoEDM_mirror_TransmitXY_var._position_absolute, _H523_CryoEDM_mirror_TransmitXY_var._rotation_absolute);
  instrument->_position_absolute[237] = _H523_CryoEDM_mirror_TransmitXY_var._position_absolute;
  instrument->_position_relative[237] = _H523_CryoEDM_mirror_TransmitXY_var._position_relative;
    _H523_CryoEDM_mirror_TransmitXY_var._position_relative_is_zero =  coords_test_zero(_H523_CryoEDM_mirror_TransmitXY_var._position_relative);
  instrument->counter_N[237]  = instrument->counter_P[237] = instrument->counter_P2[237] = 0;
  instrument->counter_AbsorbProp[237]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", _H523_CryoEDM_mirror_TransmitXY_var._position_absolute, _H523_CryoEDM_mirror_TransmitXY_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "xwidth", "0", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "yheight", "0", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "options", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0236_H523_CryoEDM_mirror_TransmitXY", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_CryoEDM_mirror_TransmitXY_setpos */

/* component H523_CryoEDM_Sample_L=Monitor_nD() SETTING, POSITION/ROTATION */
int _H523_CryoEDM_Sample_L_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_CryoEDM_Sample_L_setpos] component H523_CryoEDM_Sample_L=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H523_CryoEDM_Sample_L_var._name, "H523_CryoEDM_Sample_L", 16384);
  stracpy(_H523_CryoEDM_Sample_L_var._type, "Monitor_nD", 16384);
  _H523_CryoEDM_Sample_L_var._index=238;
  int current_setpos_index = 238;
  if("" && strlen(""))
    stracpy(_H523_CryoEDM_Sample_L_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H523_CryoEDM_Sample_L_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H523_CryoEDM_Sample_L_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H523_CryoEDM_Sample_L_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H523_CryoEDM_Sample_L_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H523_CryoEDM_Sample_L_var._parameters.user3[0]='\0';
  _H523_CryoEDM_Sample_L_var._parameters.xwidth = 0.06;
  _H523_CryoEDM_Sample_L_var._parameters.yheight = 0.12;
  _H523_CryoEDM_Sample_L_var._parameters.zdepth = 0;
  _H523_CryoEDM_Sample_L_var._parameters.xmin = 0;
  _H523_CryoEDM_Sample_L_var._parameters.xmax = 0;
  _H523_CryoEDM_Sample_L_var._parameters.ymin = 0;
  _H523_CryoEDM_Sample_L_var._parameters.ymax = 0;
  _H523_CryoEDM_Sample_L_var._parameters.zmin = 0;
  _H523_CryoEDM_Sample_L_var._parameters.zmax = 0;
  _H523_CryoEDM_Sample_L_var._parameters.bins = 100;
  _H523_CryoEDM_Sample_L_var._parameters.min = -1e40;
  _H523_CryoEDM_Sample_L_var._parameters.max = 1e40;
  _H523_CryoEDM_Sample_L_var._parameters.restore_neutron = 1;
  _H523_CryoEDM_Sample_L_var._parameters.radius = 0;
  if("lambda limits=[1 10]" && strlen("lambda limits=[1 10]"))
    stracpy(_H523_CryoEDM_Sample_L_var._parameters.options, "lambda limits=[1 10]" ? "lambda limits=[1 10]" : "", 16384);
  else 
  _H523_CryoEDM_Sample_L_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_Sample_L_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_Sample_L_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_Sample_L_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_Sample_L_var._parameters.geometry[0]='\0';
  _H523_CryoEDM_Sample_L_var._parameters.nowritefile = 0;
  _H523_CryoEDM_Sample_L_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_Sample_L_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_Sample_L_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_Sample_L_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_Sample_L_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_Sample_L_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_Sample_L_var._parameters.username3[0]='\0';


  /* component H523_CryoEDM_Sample_L=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H523_CryoEDM_mirror_outdir_var._rotation_absolute, _H523_CryoEDM_Sample_L_var._rotation_absolute);
    rot_transpose(_H523_CryoEDM_mirror_TransmitXY_var._rotation_absolute, tr1);
    rot_mul(_H523_CryoEDM_Sample_L_var._rotation_absolute, tr1, _H523_CryoEDM_Sample_L_var._rotation_relative);
    _H523_CryoEDM_Sample_L_var._rotation_is_identity =  rot_test_identity(_H523_CryoEDM_Sample_L_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 2.45 / 2 + 0.2);
    rot_transpose(_H523_CryoEDM_mirror_outdir_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_CryoEDM_Sample_L_var._position_absolute = coords_add(_H523_CryoEDM_mirror_outdir_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_CryoEDM_mirror_TransmitXY_var._position_absolute, _H523_CryoEDM_Sample_L_var._position_absolute);
    _H523_CryoEDM_Sample_L_var._position_relative = rot_apply(_H523_CryoEDM_Sample_L_var._rotation_absolute, tc1);
  } /* H523_CryoEDM_Sample_L=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H523_CryoEDM_Sample_L", _H523_CryoEDM_Sample_L_var._position_absolute, _H523_CryoEDM_Sample_L_var._rotation_absolute);
  instrument->_position_absolute[238] = _H523_CryoEDM_Sample_L_var._position_absolute;
  instrument->_position_relative[238] = _H523_CryoEDM_Sample_L_var._position_relative;
    _H523_CryoEDM_Sample_L_var._position_relative_is_zero =  coords_test_zero(_H523_CryoEDM_Sample_L_var._position_relative);
  instrument->counter_N[238]  = instrument->counter_P[238] = instrument->counter_P2[238] = 0;
  instrument->counter_AbsorbProp[238]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", _H523_CryoEDM_Sample_L_var._position_absolute, _H523_CryoEDM_Sample_L_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "bins", "0", "100","int");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "options", "NULL", "lambda limits=[1 10]", "char*");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0237_H523_CryoEDM_Sample_L", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_CryoEDM_Sample_L_setpos */

/* component H523_CryoEDM_Sample_Div=Monitor_nD() SETTING, POSITION/ROTATION */
int _H523_CryoEDM_Sample_Div_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_CryoEDM_Sample_Div_setpos] component H523_CryoEDM_Sample_Div=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H523_CryoEDM_Sample_Div_var._name, "H523_CryoEDM_Sample_Div", 16384);
  stracpy(_H523_CryoEDM_Sample_Div_var._type, "Monitor_nD", 16384);
  _H523_CryoEDM_Sample_Div_var._index=239;
  int current_setpos_index = 239;
  if("" && strlen(""))
    stracpy(_H523_CryoEDM_Sample_Div_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H523_CryoEDM_Sample_Div_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H523_CryoEDM_Sample_Div_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H523_CryoEDM_Sample_Div_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H523_CryoEDM_Sample_Div_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H523_CryoEDM_Sample_Div_var._parameters.user3[0]='\0';
  _H523_CryoEDM_Sample_Div_var._parameters.xwidth = 0.06;
  _H523_CryoEDM_Sample_Div_var._parameters.yheight = 0.12;
  _H523_CryoEDM_Sample_Div_var._parameters.zdepth = 0;
  _H523_CryoEDM_Sample_Div_var._parameters.xmin = 0;
  _H523_CryoEDM_Sample_Div_var._parameters.xmax = 0;
  _H523_CryoEDM_Sample_Div_var._parameters.ymin = 0;
  _H523_CryoEDM_Sample_Div_var._parameters.ymax = 0;
  _H523_CryoEDM_Sample_Div_var._parameters.zmin = 0;
  _H523_CryoEDM_Sample_Div_var._parameters.zmax = 0;
  _H523_CryoEDM_Sample_Div_var._parameters.bins = 100;
  _H523_CryoEDM_Sample_Div_var._parameters.min = -1e40;
  _H523_CryoEDM_Sample_Div_var._parameters.max = 1e40;
  _H523_CryoEDM_Sample_Div_var._parameters.restore_neutron = 1;
  _H523_CryoEDM_Sample_Div_var._parameters.radius = 0;
  if("dx limits=[-2 2], dy limits=[-2 2]" && strlen("dx limits=[-2 2], dy limits=[-2 2]"))
    stracpy(_H523_CryoEDM_Sample_Div_var._parameters.options, "dx limits=[-2 2], dy limits=[-2 2]" ? "dx limits=[-2 2], dy limits=[-2 2]" : "", 16384);
  else 
  _H523_CryoEDM_Sample_Div_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_Sample_Div_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_Sample_Div_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_Sample_Div_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_Sample_Div_var._parameters.geometry[0]='\0';
  _H523_CryoEDM_Sample_Div_var._parameters.nowritefile = 0;
  _H523_CryoEDM_Sample_Div_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_Sample_Div_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_Sample_Div_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_Sample_Div_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_Sample_Div_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_Sample_Div_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_Sample_Div_var._parameters.username3[0]='\0';


  /* component H523_CryoEDM_Sample_Div=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H523_CryoEDM_Sample_L_var._rotation_absolute, _H523_CryoEDM_Sample_Div_var._rotation_absolute);
    rot_transpose(_H523_CryoEDM_Sample_L_var._rotation_absolute, tr1);
    rot_mul(_H523_CryoEDM_Sample_Div_var._rotation_absolute, tr1, _H523_CryoEDM_Sample_Div_var._rotation_relative);
    _H523_CryoEDM_Sample_Div_var._rotation_is_identity =  rot_test_identity(_H523_CryoEDM_Sample_Div_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H523_CryoEDM_Sample_L_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_CryoEDM_Sample_Div_var._position_absolute = coords_add(_H523_CryoEDM_Sample_L_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_CryoEDM_Sample_L_var._position_absolute, _H523_CryoEDM_Sample_Div_var._position_absolute);
    _H523_CryoEDM_Sample_Div_var._position_relative = rot_apply(_H523_CryoEDM_Sample_Div_var._rotation_absolute, tc1);
  } /* H523_CryoEDM_Sample_Div=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H523_CryoEDM_Sample_Div", _H523_CryoEDM_Sample_Div_var._position_absolute, _H523_CryoEDM_Sample_Div_var._rotation_absolute);
  instrument->_position_absolute[239] = _H523_CryoEDM_Sample_Div_var._position_absolute;
  instrument->_position_relative[239] = _H523_CryoEDM_Sample_Div_var._position_relative;
    _H523_CryoEDM_Sample_Div_var._position_relative_is_zero =  coords_test_zero(_H523_CryoEDM_Sample_Div_var._position_relative);
  instrument->counter_N[239]  = instrument->counter_P[239] = instrument->counter_P2[239] = 0;
  instrument->counter_AbsorbProp[239]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", _H523_CryoEDM_Sample_Div_var._position_absolute, _H523_CryoEDM_Sample_Div_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "bins", "0", "100","int");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "options", "NULL", "dx limits=[-2 2], dy limits=[-2 2]", "char*");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0238_H523_CryoEDM_Sample_Div", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_CryoEDM_Sample_Div_setpos */

/* component H523_CryoEDM_Sample_XY=Monitor_nD() SETTING, POSITION/ROTATION */
int _H523_CryoEDM_Sample_XY_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H523_CryoEDM_Sample_XY_setpos] component H523_CryoEDM_Sample_XY=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H523_CryoEDM_Sample_XY_var._name, "H523_CryoEDM_Sample_XY", 16384);
  stracpy(_H523_CryoEDM_Sample_XY_var._type, "Monitor_nD", 16384);
  _H523_CryoEDM_Sample_XY_var._index=240;
  int current_setpos_index = 240;
  if("" && strlen(""))
    stracpy(_H523_CryoEDM_Sample_XY_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H523_CryoEDM_Sample_XY_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H523_CryoEDM_Sample_XY_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H523_CryoEDM_Sample_XY_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H523_CryoEDM_Sample_XY_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H523_CryoEDM_Sample_XY_var._parameters.user3[0]='\0';
  _H523_CryoEDM_Sample_XY_var._parameters.xwidth = 0.06;
  _H523_CryoEDM_Sample_XY_var._parameters.yheight = 0.12;
  _H523_CryoEDM_Sample_XY_var._parameters.zdepth = 0;
  _H523_CryoEDM_Sample_XY_var._parameters.xmin = 0;
  _H523_CryoEDM_Sample_XY_var._parameters.xmax = 0;
  _H523_CryoEDM_Sample_XY_var._parameters.ymin = 0;
  _H523_CryoEDM_Sample_XY_var._parameters.ymax = 0;
  _H523_CryoEDM_Sample_XY_var._parameters.zmin = 0;
  _H523_CryoEDM_Sample_XY_var._parameters.zmax = 0;
  _H523_CryoEDM_Sample_XY_var._parameters.bins = 100;
  _H523_CryoEDM_Sample_XY_var._parameters.min = -1e40;
  _H523_CryoEDM_Sample_XY_var._parameters.max = 1e40;
  _H523_CryoEDM_Sample_XY_var._parameters.restore_neutron = 1;
  _H523_CryoEDM_Sample_XY_var._parameters.radius = 0;
  if("x y" && strlen("x y"))
    stracpy(_H523_CryoEDM_Sample_XY_var._parameters.options, "x y" ? "x y" : "", 16384);
  else 
  _H523_CryoEDM_Sample_XY_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_Sample_XY_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_Sample_XY_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_Sample_XY_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_Sample_XY_var._parameters.geometry[0]='\0';
  _H523_CryoEDM_Sample_XY_var._parameters.nowritefile = 0;
  _H523_CryoEDM_Sample_XY_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_Sample_XY_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_Sample_XY_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_Sample_XY_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_Sample_XY_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H523_CryoEDM_Sample_XY_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H523_CryoEDM_Sample_XY_var._parameters.username3[0]='\0';


  /* component H523_CryoEDM_Sample_XY=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H523_CryoEDM_Sample_L_var._rotation_absolute, _H523_CryoEDM_Sample_XY_var._rotation_absolute);
    rot_transpose(_H523_CryoEDM_Sample_Div_var._rotation_absolute, tr1);
    rot_mul(_H523_CryoEDM_Sample_XY_var._rotation_absolute, tr1, _H523_CryoEDM_Sample_XY_var._rotation_relative);
    _H523_CryoEDM_Sample_XY_var._rotation_is_identity =  rot_test_identity(_H523_CryoEDM_Sample_XY_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H523_CryoEDM_Sample_L_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H523_CryoEDM_Sample_XY_var._position_absolute = coords_add(_H523_CryoEDM_Sample_L_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_CryoEDM_Sample_Div_var._position_absolute, _H523_CryoEDM_Sample_XY_var._position_absolute);
    _H523_CryoEDM_Sample_XY_var._position_relative = rot_apply(_H523_CryoEDM_Sample_XY_var._rotation_absolute, tc1);
  } /* H523_CryoEDM_Sample_XY=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H523_CryoEDM_Sample_XY", _H523_CryoEDM_Sample_XY_var._position_absolute, _H523_CryoEDM_Sample_XY_var._rotation_absolute);
  instrument->_position_absolute[240] = _H523_CryoEDM_Sample_XY_var._position_absolute;
  instrument->_position_relative[240] = _H523_CryoEDM_Sample_XY_var._position_relative;
    _H523_CryoEDM_Sample_XY_var._position_relative_is_zero =  coords_test_zero(_H523_CryoEDM_Sample_XY_var._position_relative);
  instrument->counter_N[240]  = instrument->counter_P[240] = instrument->counter_P2[240] = 0;
  instrument->counter_AbsorbProp[240]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", _H523_CryoEDM_Sample_XY_var._position_absolute, _H523_CryoEDM_Sample_XY_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "bins", "0", "100","int");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "options", "NULL", "x y", "char*");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0239_H523_CryoEDM_Sample_XY", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H523_CryoEDM_Sample_XY_setpos */

/* component H51_start=Arm() SETTING, POSITION/ROTATION */
int _H51_start_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H51_start_setpos] component H51_start=Arm() SETTING [Arm:0]");
  stracpy(_H51_start_var._name, "H51_start", 16384);
  stracpy(_H51_start_var._type, "Arm", 16384);
  _H51_start_var._index=241;
  int current_setpos_index = 241;
  /* component H51_start=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H51_origin_var._rotation_absolute, _H51_start_var._rotation_absolute);
    rot_transpose(_H523_CryoEDM_Sample_XY_var._rotation_absolute, tr1);
    rot_mul(_H51_start_var._rotation_absolute, tr1, _H51_start_var._rotation_relative);
    _H51_start_var._rotation_is_identity =  rot_test_identity(_H51_start_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H51_origin_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H51_start_var._position_absolute = coords_add(_H51_origin_var._position_absolute, tc2);
    tc1 = coords_sub(_H523_CryoEDM_Sample_XY_var._position_absolute, _H51_start_var._position_absolute);
    _H51_start_var._position_relative = rot_apply(_H51_start_var._rotation_absolute, tc1);
  } /* H51_start=Arm() AT ROTATED */
  DEBUG_COMPONENT("H51_start", _H51_start_var._position_absolute, _H51_start_var._rotation_absolute);
  instrument->_position_absolute[241] = _H51_start_var._position_absolute;
  instrument->_position_relative[241] = _H51_start_var._position_relative;
    _H51_start_var._position_relative_is_zero =  coords_test_zero(_H51_start_var._position_relative);
  instrument->counter_N[241]  = instrument->counter_P[241] = instrument->counter_P2[241] = 0;
  instrument->counter_AbsorbProp[241]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0240_H51_start", _H51_start_var._position_absolute, _H51_start_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H51_start_setpos */

/* component H51_inpile=Guide_gravity() SETTING, POSITION/ROTATION */
int _H51_inpile_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H51_inpile_setpos] component H51_inpile=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H51_inpile_var._name, "H51_inpile", 16384);
  stracpy(_H51_inpile_var._type, "Guide_gravity", 16384);
  _H51_inpile_var._index=242;
  int current_setpos_index = 242;
  _H51_inpile_var._parameters.w1 = 0.04;
  _H51_inpile_var._parameters.h1 = 0.12;
  _H51_inpile_var._parameters.w2 = 0;
  _H51_inpile_var._parameters.h2 = 0;
  _H51_inpile_var._parameters.l = 4.930 -3.155;
  _H51_inpile_var._parameters.R0 = gR0;
  _H51_inpile_var._parameters.Qc = gQc;
  _H51_inpile_var._parameters.alpha = gAlpha;
  _H51_inpile_var._parameters.m = 1.2;
  _H51_inpile_var._parameters.W = gW;
  _H51_inpile_var._parameters.nslit = 1;
  _H51_inpile_var._parameters.d = 0.0005;
  _H51_inpile_var._parameters.mleft = -1;
  _H51_inpile_var._parameters.mright = -1;
  _H51_inpile_var._parameters.mtop = -1;
  _H51_inpile_var._parameters.mbottom = -1;
  _H51_inpile_var._parameters.nhslit = 1;
  _H51_inpile_var._parameters.G = 0;
  _H51_inpile_var._parameters.aleft = -1;
  _H51_inpile_var._parameters.aright = -1;
  _H51_inpile_var._parameters.atop = -1;
  _H51_inpile_var._parameters.abottom = -1;
  _H51_inpile_var._parameters.wavy = 0;
  _H51_inpile_var._parameters.wavy_z = 0;
  _H51_inpile_var._parameters.wavy_tb = 0;
  _H51_inpile_var._parameters.wavy_lr = 0;
  _H51_inpile_var._parameters.chamfers = 0;
  _H51_inpile_var._parameters.chamfers_z = 0;
  _H51_inpile_var._parameters.chamfers_lr = 0;
  _H51_inpile_var._parameters.chamfers_tb = 0;
  _H51_inpile_var._parameters.nelements = 1;
  _H51_inpile_var._parameters.nu = 0;
  _H51_inpile_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H51_inpile_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_inpile_var._parameters.reflect[0]='\0';


  /* component H51_inpile=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H51_start_var._rotation_absolute, _H51_inpile_var._rotation_absolute);
    rot_transpose(_H51_start_var._rotation_absolute, tr1);
    rot_mul(_H51_inpile_var._rotation_absolute, tr1, _H51_inpile_var._rotation_relative);
    _H51_inpile_var._rotation_is_identity =  rot_test_identity(_H51_inpile_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H51_start_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H51_inpile_var._position_absolute = coords_add(_H51_start_var._position_absolute, tc2);
    tc1 = coords_sub(_H51_start_var._position_absolute, _H51_inpile_var._position_absolute);
    _H51_inpile_var._position_relative = rot_apply(_H51_inpile_var._rotation_absolute, tc1);
  } /* H51_inpile=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H51_inpile", _H51_inpile_var._position_absolute, _H51_inpile_var._rotation_absolute);
  instrument->_position_absolute[242] = _H51_inpile_var._position_absolute;
  instrument->_position_relative[242] = _H51_inpile_var._position_relative;
    _H51_inpile_var._position_relative_is_zero =  coords_test_zero(_H51_inpile_var._position_relative);
  instrument->counter_N[242]  = instrument->counter_P[242] = instrument->counter_P2[242] = 0;
  instrument->counter_AbsorbProp[242]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0241_H51_inpile", _H51_inpile_var._position_absolute, _H51_inpile_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "l", "NONE", "4.930 -3.155","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0241_H51_inpile", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H51_inpile_setpos */

/* component H51_Obt_1=Guide_gravity() SETTING, POSITION/ROTATION */
int _H51_Obt_1_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H51_Obt_1_setpos] component H51_Obt_1=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H51_Obt_1_var._name, "H51_Obt_1", 16384);
  stracpy(_H51_Obt_1_var._type, "Guide_gravity", 16384);
  _H51_Obt_1_var._index=243;
  int current_setpos_index = 243;
  _H51_Obt_1_var._parameters.w1 = 0.04;
  _H51_Obt_1_var._parameters.h1 = 0.12;
  _H51_Obt_1_var._parameters.w2 = 0;
  _H51_Obt_1_var._parameters.h2 = 0;
  _H51_Obt_1_var._parameters.l = 0.863;
  _H51_Obt_1_var._parameters.R0 = gR0;
  _H51_Obt_1_var._parameters.Qc = gQc;
  _H51_Obt_1_var._parameters.alpha = gAlpha;
  _H51_Obt_1_var._parameters.m = 1.2;
  _H51_Obt_1_var._parameters.W = gW;
  _H51_Obt_1_var._parameters.nslit = 1;
  _H51_Obt_1_var._parameters.d = 0.0005;
  _H51_Obt_1_var._parameters.mleft = -1;
  _H51_Obt_1_var._parameters.mright = -1;
  _H51_Obt_1_var._parameters.mtop = -1;
  _H51_Obt_1_var._parameters.mbottom = -1;
  _H51_Obt_1_var._parameters.nhslit = 1;
  _H51_Obt_1_var._parameters.G = 0;
  _H51_Obt_1_var._parameters.aleft = -1;
  _H51_Obt_1_var._parameters.aright = -1;
  _H51_Obt_1_var._parameters.atop = -1;
  _H51_Obt_1_var._parameters.abottom = -1;
  _H51_Obt_1_var._parameters.wavy = 0;
  _H51_Obt_1_var._parameters.wavy_z = 0;
  _H51_Obt_1_var._parameters.wavy_tb = 0;
  _H51_Obt_1_var._parameters.wavy_lr = 0;
  _H51_Obt_1_var._parameters.chamfers = 0;
  _H51_Obt_1_var._parameters.chamfers_z = 0;
  _H51_Obt_1_var._parameters.chamfers_lr = 0;
  _H51_Obt_1_var._parameters.chamfers_tb = 0;
  _H51_Obt_1_var._parameters.nelements = 1;
  _H51_Obt_1_var._parameters.nu = 0;
  _H51_Obt_1_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H51_Obt_1_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_Obt_1_var._parameters.reflect[0]='\0';


  /* component H51_Obt_1=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H51_inpile_var._rotation_absolute, _H51_Obt_1_var._rotation_absolute);
    rot_transpose(_H51_inpile_var._rotation_absolute, tr1);
    rot_mul(_H51_Obt_1_var._rotation_absolute, tr1, _H51_Obt_1_var._rotation_relative);
    _H51_Obt_1_var._rotation_is_identity =  rot_test_identity(_H51_Obt_1_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 4.930 -3.155 + 0.025);
    rot_transpose(_H51_inpile_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H51_Obt_1_var._position_absolute = coords_add(_H51_inpile_var._position_absolute, tc2);
    tc1 = coords_sub(_H51_inpile_var._position_absolute, _H51_Obt_1_var._position_absolute);
    _H51_Obt_1_var._position_relative = rot_apply(_H51_Obt_1_var._rotation_absolute, tc1);
  } /* H51_Obt_1=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H51_Obt_1", _H51_Obt_1_var._position_absolute, _H51_Obt_1_var._rotation_absolute);
  instrument->_position_absolute[243] = _H51_Obt_1_var._position_absolute;
  instrument->_position_relative[243] = _H51_Obt_1_var._position_relative;
    _H51_Obt_1_var._position_relative_is_zero =  coords_test_zero(_H51_Obt_1_var._position_relative);
  instrument->counter_N[243]  = instrument->counter_P[243] = instrument->counter_P2[243] = 0;
  instrument->counter_AbsorbProp[243]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0242_H51_Obt_1", _H51_Obt_1_var._position_absolute, _H51_Obt_1_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "l", "NONE", "0.863","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0242_H51_Obt_1", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H51_Obt_1_setpos */

/* component H51_Obt_2=Guide_gravity() SETTING, POSITION/ROTATION */
int _H51_Obt_2_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H51_Obt_2_setpos] component H51_Obt_2=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H51_Obt_2_var._name, "H51_Obt_2", 16384);
  stracpy(_H51_Obt_2_var._type, "Guide_gravity", 16384);
  _H51_Obt_2_var._index=244;
  int current_setpos_index = 244;
  _H51_Obt_2_var._parameters.w1 = 0.04;
  _H51_Obt_2_var._parameters.h1 = 0.12;
  _H51_Obt_2_var._parameters.w2 = 0;
  _H51_Obt_2_var._parameters.h2 = 0;
  _H51_Obt_2_var._parameters.l = 1.433;
  _H51_Obt_2_var._parameters.R0 = gR0;
  _H51_Obt_2_var._parameters.Qc = gQc;
  _H51_Obt_2_var._parameters.alpha = gAlpha;
  _H51_Obt_2_var._parameters.m = 1.2;
  _H51_Obt_2_var._parameters.W = gW;
  _H51_Obt_2_var._parameters.nslit = 1;
  _H51_Obt_2_var._parameters.d = 0.0005;
  _H51_Obt_2_var._parameters.mleft = -1;
  _H51_Obt_2_var._parameters.mright = -1;
  _H51_Obt_2_var._parameters.mtop = -1;
  _H51_Obt_2_var._parameters.mbottom = -1;
  _H51_Obt_2_var._parameters.nhslit = 1;
  _H51_Obt_2_var._parameters.G = 0;
  _H51_Obt_2_var._parameters.aleft = -1;
  _H51_Obt_2_var._parameters.aright = -1;
  _H51_Obt_2_var._parameters.atop = -1;
  _H51_Obt_2_var._parameters.abottom = -1;
  _H51_Obt_2_var._parameters.wavy = 0;
  _H51_Obt_2_var._parameters.wavy_z = 0;
  _H51_Obt_2_var._parameters.wavy_tb = 0;
  _H51_Obt_2_var._parameters.wavy_lr = 0;
  _H51_Obt_2_var._parameters.chamfers = 0;
  _H51_Obt_2_var._parameters.chamfers_z = 0;
  _H51_Obt_2_var._parameters.chamfers_lr = 0;
  _H51_Obt_2_var._parameters.chamfers_tb = 0;
  _H51_Obt_2_var._parameters.nelements = 1;
  _H51_Obt_2_var._parameters.nu = 0;
  _H51_Obt_2_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H51_Obt_2_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_Obt_2_var._parameters.reflect[0]='\0';


  /* component H51_Obt_2=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H51_Obt_1_var._rotation_absolute, _H51_Obt_2_var._rotation_absolute);
    rot_transpose(_H51_Obt_1_var._rotation_absolute, tr1);
    rot_mul(_H51_Obt_2_var._rotation_absolute, tr1, _H51_Obt_2_var._rotation_relative);
    _H51_Obt_2_var._rotation_is_identity =  rot_test_identity(_H51_Obt_2_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.863 + 0.012);
    rot_transpose(_H51_Obt_1_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H51_Obt_2_var._position_absolute = coords_add(_H51_Obt_1_var._position_absolute, tc2);
    tc1 = coords_sub(_H51_Obt_1_var._position_absolute, _H51_Obt_2_var._position_absolute);
    _H51_Obt_2_var._position_relative = rot_apply(_H51_Obt_2_var._rotation_absolute, tc1);
  } /* H51_Obt_2=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H51_Obt_2", _H51_Obt_2_var._position_absolute, _H51_Obt_2_var._rotation_absolute);
  instrument->_position_absolute[244] = _H51_Obt_2_var._position_absolute;
  instrument->_position_relative[244] = _H51_Obt_2_var._position_relative;
    _H51_Obt_2_var._position_relative_is_zero =  coords_test_zero(_H51_Obt_2_var._position_relative);
  instrument->counter_N[244]  = instrument->counter_P[244] = instrument->counter_P2[244] = 0;
  instrument->counter_AbsorbProp[244]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0243_H51_Obt_2", _H51_Obt_2_var._position_absolute, _H51_Obt_2_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "l", "NONE", "1.433","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0243_H51_Obt_2", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H51_Obt_2_setpos */

/* component H51_Obt_3=Guide_gravity() SETTING, POSITION/ROTATION */
int _H51_Obt_3_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H51_Obt_3_setpos] component H51_Obt_3=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H51_Obt_3_var._name, "H51_Obt_3", 16384);
  stracpy(_H51_Obt_3_var._type, "Guide_gravity", 16384);
  _H51_Obt_3_var._index=245;
  int current_setpos_index = 245;
  _H51_Obt_3_var._parameters.w1 = 0.04;
  _H51_Obt_3_var._parameters.h1 = 0.12;
  _H51_Obt_3_var._parameters.w2 = 0;
  _H51_Obt_3_var._parameters.h2 = 0;
  _H51_Obt_3_var._parameters.l = 0.745;
  _H51_Obt_3_var._parameters.R0 = gR0;
  _H51_Obt_3_var._parameters.Qc = gQc;
  _H51_Obt_3_var._parameters.alpha = gAlpha;
  _H51_Obt_3_var._parameters.m = 1.2;
  _H51_Obt_3_var._parameters.W = gW;
  _H51_Obt_3_var._parameters.nslit = 1;
  _H51_Obt_3_var._parameters.d = 0.0005;
  _H51_Obt_3_var._parameters.mleft = -1;
  _H51_Obt_3_var._parameters.mright = -1;
  _H51_Obt_3_var._parameters.mtop = -1;
  _H51_Obt_3_var._parameters.mbottom = -1;
  _H51_Obt_3_var._parameters.nhslit = 1;
  _H51_Obt_3_var._parameters.G = 0;
  _H51_Obt_3_var._parameters.aleft = -1;
  _H51_Obt_3_var._parameters.aright = -1;
  _H51_Obt_3_var._parameters.atop = -1;
  _H51_Obt_3_var._parameters.abottom = -1;
  _H51_Obt_3_var._parameters.wavy = 0;
  _H51_Obt_3_var._parameters.wavy_z = 0;
  _H51_Obt_3_var._parameters.wavy_tb = 0;
  _H51_Obt_3_var._parameters.wavy_lr = 0;
  _H51_Obt_3_var._parameters.chamfers = 0;
  _H51_Obt_3_var._parameters.chamfers_z = 0;
  _H51_Obt_3_var._parameters.chamfers_lr = 0;
  _H51_Obt_3_var._parameters.chamfers_tb = 0;
  _H51_Obt_3_var._parameters.nelements = 1;
  _H51_Obt_3_var._parameters.nu = 0;
  _H51_Obt_3_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H51_Obt_3_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_Obt_3_var._parameters.reflect[0]='\0';


  /* component H51_Obt_3=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H51_Obt_2_var._rotation_absolute, _H51_Obt_3_var._rotation_absolute);
    rot_transpose(_H51_Obt_2_var._rotation_absolute, tr1);
    rot_mul(_H51_Obt_3_var._rotation_absolute, tr1, _H51_Obt_3_var._rotation_relative);
    _H51_Obt_3_var._rotation_is_identity =  rot_test_identity(_H51_Obt_3_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 1.433 + 0.012);
    rot_transpose(_H51_Obt_2_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H51_Obt_3_var._position_absolute = coords_add(_H51_Obt_2_var._position_absolute, tc2);
    tc1 = coords_sub(_H51_Obt_2_var._position_absolute, _H51_Obt_3_var._position_absolute);
    _H51_Obt_3_var._position_relative = rot_apply(_H51_Obt_3_var._rotation_absolute, tc1);
  } /* H51_Obt_3=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H51_Obt_3", _H51_Obt_3_var._position_absolute, _H51_Obt_3_var._rotation_absolute);
  instrument->_position_absolute[245] = _H51_Obt_3_var._position_absolute;
  instrument->_position_relative[245] = _H51_Obt_3_var._position_relative;
    _H51_Obt_3_var._position_relative_is_zero =  coords_test_zero(_H51_Obt_3_var._position_relative);
  instrument->counter_N[245]  = instrument->counter_P[245] = instrument->counter_P2[245] = 0;
  instrument->counter_AbsorbProp[245]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0244_H51_Obt_3", _H51_Obt_3_var._position_absolute, _H51_Obt_3_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "l", "NONE", "0.745","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0244_H51_Obt_3", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H51_Obt_3_setpos */

/* component HCS_Al_246=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_246_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_246_setpos] component HCS_Al_246=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_246_var._name, "HCS_Al_246", 16384);
  stracpy(_HCS_Al_246_var._type, "PowderN", 16384);
  _HCS_Al_246_var._index=246;
  int current_setpos_index = 246;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_246_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_246_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_246_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_246_var._parameters.geometry[0]='\0';
  _HCS_Al_246_var._parameters.format[0] = 0;
  _HCS_Al_246_var._parameters.format[1] = 0;
  _HCS_Al_246_var._parameters.format[2] = 0;
  _HCS_Al_246_var._parameters.format[3] = 0;
  _HCS_Al_246_var._parameters.format[4] = 0;
  _HCS_Al_246_var._parameters.format[5] = 0;
  _HCS_Al_246_var._parameters.format[6] = 0;
  _HCS_Al_246_var._parameters.format[7] = 0;
  _HCS_Al_246_var._parameters.format[8] = 0;
  _HCS_Al_246_var._parameters.radius = 0;
  _HCS_Al_246_var._parameters.yheight = 0.12;
  _HCS_Al_246_var._parameters.xwidth = 0.04;
  _HCS_Al_246_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_246_var._parameters.thickness = 0;
  _HCS_Al_246_var._parameters.pack = 1;
  _HCS_Al_246_var._parameters.Vc = 0;
  _HCS_Al_246_var._parameters.sigma_abs = 0;
  _HCS_Al_246_var._parameters.sigma_inc = 0;
  _HCS_Al_246_var._parameters.delta_d_d = 0;
  _HCS_Al_246_var._parameters.p_inc = 0.005;
  _HCS_Al_246_var._parameters.p_transmit = 0.9450;
  _HCS_Al_246_var._parameters.DW = 0;
  _HCS_Al_246_var._parameters.nb_atoms = 1;
  _HCS_Al_246_var._parameters.d_omega = 0;
  _HCS_Al_246_var._parameters.d_phi = 10;
  _HCS_Al_246_var._parameters.tth_sign = 0;
  _HCS_Al_246_var._parameters.p_interact = 0.05;
  _HCS_Al_246_var._parameters.concentric = 0;
  _HCS_Al_246_var._parameters.density = 0;
  _HCS_Al_246_var._parameters.weight = 0;
  _HCS_Al_246_var._parameters.barns = 1;
  _HCS_Al_246_var._parameters.Strain = 0;
  _HCS_Al_246_var._parameters.focus_flip = 0;
  _HCS_Al_246_var._parameters.target_index = 0;
  _HCS_Al_246_var._parameters.order = 1;


  /* component HCS_Al_246=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H51_Obt_3_var._rotation_absolute, _HCS_Al_246_var._rotation_absolute);
    rot_transpose(_H51_Obt_3_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_246_var._rotation_absolute, tr1, _HCS_Al_246_var._rotation_relative);
    _HCS_Al_246_var._rotation_is_identity =  rot_test_identity(_HCS_Al_246_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.745 + 0.01);
    rot_transpose(_H51_Obt_3_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_246_var._position_absolute = coords_add(_H51_Obt_3_var._position_absolute, tc2);
    tc1 = coords_sub(_H51_Obt_3_var._position_absolute, _HCS_Al_246_var._position_absolute);
    _HCS_Al_246_var._position_relative = rot_apply(_HCS_Al_246_var._rotation_absolute, tc1);
  } /* HCS_Al_246=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_246", _HCS_Al_246_var._position_absolute, _HCS_Al_246_var._rotation_absolute);
  instrument->_position_absolute[246] = _HCS_Al_246_var._position_absolute;
  instrument->_position_relative[246] = _HCS_Al_246_var._position_relative;
    _HCS_Al_246_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_246_var._position_relative);
  instrument->counter_N[246]  = instrument->counter_P[246] = instrument->counter_P2[246] = 0;
  instrument->counter_AbsorbProp[246]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0245_HCS_Al_246", _HCS_Al_246_var._position_absolute, _HCS_Al_246_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "xwidth", "0", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0245_HCS_Al_246", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_246_setpos */

/* component H51_Obt_Out=Monitor_nD() SETTING, POSITION/ROTATION */
int _H51_Obt_Out_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H51_Obt_Out_setpos] component H51_Obt_Out=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H51_Obt_Out_var._name, "H51_Obt_Out", 16384);
  stracpy(_H51_Obt_Out_var._type, "Monitor_nD", 16384);
  _H51_Obt_Out_var._index=247;
  int current_setpos_index = 247;
  if("" && strlen(""))
    stracpy(_H51_Obt_Out_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H51_Obt_Out_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H51_Obt_Out_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H51_Obt_Out_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H51_Obt_Out_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H51_Obt_Out_var._parameters.user3[0]='\0';
  _H51_Obt_Out_var._parameters.xwidth = 0.04;
  _H51_Obt_Out_var._parameters.yheight = 0.12;
  _H51_Obt_Out_var._parameters.zdepth = 0;
  _H51_Obt_Out_var._parameters.xmin = 0;
  _H51_Obt_Out_var._parameters.xmax = 0;
  _H51_Obt_Out_var._parameters.ymin = 0;
  _H51_Obt_Out_var._parameters.ymax = 0;
  _H51_Obt_Out_var._parameters.zmin = 0;
  _H51_Obt_Out_var._parameters.zmax = 0;
  _H51_Obt_Out_var._parameters.bins = 50;
  _H51_Obt_Out_var._parameters.min = -1e40;
  _H51_Obt_Out_var._parameters.max = 1e40;
  _H51_Obt_Out_var._parameters.restore_neutron = 1;
  _H51_Obt_Out_var._parameters.radius = 0;
  if("x y, slit" && strlen("x y, slit"))
    stracpy(_H51_Obt_Out_var._parameters.options, "x y, slit" ? "x y, slit" : "", 16384);
  else 
  _H51_Obt_Out_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_Obt_Out_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_Obt_Out_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_Obt_Out_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_Obt_Out_var._parameters.geometry[0]='\0';
  _H51_Obt_Out_var._parameters.nowritefile = 0;
  _H51_Obt_Out_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H51_Obt_Out_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_Obt_Out_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_Obt_Out_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_Obt_Out_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_Obt_Out_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_Obt_Out_var._parameters.username3[0]='\0';


  /* component H51_Obt_Out=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_246_var._rotation_absolute, _H51_Obt_Out_var._rotation_absolute);
    rot_transpose(_HCS_Al_246_var._rotation_absolute, tr1);
    rot_mul(_H51_Obt_Out_var._rotation_absolute, tr1, _H51_Obt_Out_var._rotation_relative);
    _H51_Obt_Out_var._rotation_is_identity =  rot_test_identity(_H51_Obt_Out_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.06);
    rot_transpose(_HCS_Al_246_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H51_Obt_Out_var._position_absolute = coords_add(_HCS_Al_246_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_246_var._position_absolute, _H51_Obt_Out_var._position_absolute);
    _H51_Obt_Out_var._position_relative = rot_apply(_H51_Obt_Out_var._rotation_absolute, tc1);
  } /* H51_Obt_Out=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H51_Obt_Out", _H51_Obt_Out_var._position_absolute, _H51_Obt_Out_var._rotation_absolute);
  instrument->_position_absolute[247] = _H51_Obt_Out_var._position_absolute;
  instrument->_position_relative[247] = _H51_Obt_Out_var._position_relative;
    _H51_Obt_Out_var._position_relative_is_zero =  coords_test_zero(_H51_Obt_Out_var._position_relative);
  instrument->counter_N[247]  = instrument->counter_P[247] = instrument->counter_P2[247] = 0;
  instrument->counter_AbsorbProp[247]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0246_H51_Obt_Out", _H51_Obt_Out_var._position_absolute, _H51_Obt_Out_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "xwidth", "0", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "options", "NULL", "x y, slit", "char*");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0246_H51_Obt_Out", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H51_Obt_Out_setpos */

/* component HCS_Al_248=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_248_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_248_setpos] component HCS_Al_248=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_248_var._name, "HCS_Al_248", 16384);
  stracpy(_HCS_Al_248_var._type, "PowderN", 16384);
  _HCS_Al_248_var._index=248;
  int current_setpos_index = 248;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_248_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_248_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_248_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_248_var._parameters.geometry[0]='\0';
  _HCS_Al_248_var._parameters.format[0] = 0;
  _HCS_Al_248_var._parameters.format[1] = 0;
  _HCS_Al_248_var._parameters.format[2] = 0;
  _HCS_Al_248_var._parameters.format[3] = 0;
  _HCS_Al_248_var._parameters.format[4] = 0;
  _HCS_Al_248_var._parameters.format[5] = 0;
  _HCS_Al_248_var._parameters.format[6] = 0;
  _HCS_Al_248_var._parameters.format[7] = 0;
  _HCS_Al_248_var._parameters.format[8] = 0;
  _HCS_Al_248_var._parameters.radius = 0;
  _HCS_Al_248_var._parameters.yheight = 0.12;
  _HCS_Al_248_var._parameters.xwidth = 0.04;
  _HCS_Al_248_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_248_var._parameters.thickness = 0;
  _HCS_Al_248_var._parameters.pack = 1;
  _HCS_Al_248_var._parameters.Vc = 0;
  _HCS_Al_248_var._parameters.sigma_abs = 0;
  _HCS_Al_248_var._parameters.sigma_inc = 0;
  _HCS_Al_248_var._parameters.delta_d_d = 0;
  _HCS_Al_248_var._parameters.p_inc = 0.005;
  _HCS_Al_248_var._parameters.p_transmit = 0.9450;
  _HCS_Al_248_var._parameters.DW = 0;
  _HCS_Al_248_var._parameters.nb_atoms = 1;
  _HCS_Al_248_var._parameters.d_omega = 0;
  _HCS_Al_248_var._parameters.d_phi = 10;
  _HCS_Al_248_var._parameters.tth_sign = 0;
  _HCS_Al_248_var._parameters.p_interact = 0.05;
  _HCS_Al_248_var._parameters.concentric = 0;
  _HCS_Al_248_var._parameters.density = 0;
  _HCS_Al_248_var._parameters.weight = 0;
  _HCS_Al_248_var._parameters.barns = 1;
  _HCS_Al_248_var._parameters.Strain = 0;
  _HCS_Al_248_var._parameters.focus_flip = 0;
  _HCS_Al_248_var._parameters.target_index = 0;
  _HCS_Al_248_var._parameters.order = 1;


  /* component HCS_Al_248=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H51_Obt_Out_var._rotation_absolute, _HCS_Al_248_var._rotation_absolute);
    rot_transpose(_H51_Obt_Out_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_248_var._rotation_absolute, tr1, _HCS_Al_248_var._rotation_relative);
    _HCS_Al_248_var._rotation_is_identity =  rot_test_identity(_HCS_Al_248_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H51_Obt_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_248_var._position_absolute = coords_add(_H51_Obt_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H51_Obt_Out_var._position_absolute, _HCS_Al_248_var._position_absolute);
    _HCS_Al_248_var._position_relative = rot_apply(_HCS_Al_248_var._rotation_absolute, tc1);
  } /* HCS_Al_248=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_248", _HCS_Al_248_var._position_absolute, _HCS_Al_248_var._rotation_absolute);
  instrument->_position_absolute[248] = _HCS_Al_248_var._position_absolute;
  instrument->_position_relative[248] = _HCS_Al_248_var._position_relative;
    _HCS_Al_248_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_248_var._position_relative);
  instrument->counter_N[248]  = instrument->counter_P[248] = instrument->counter_P2[248] = 0;
  instrument->counter_AbsorbProp[248]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0247_HCS_Al_248", _HCS_Al_248_var._position_absolute, _HCS_Al_248_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "xwidth", "0", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0247_HCS_Al_248", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_248_setpos */

/* component H51_S2=Guide_gravity() SETTING, POSITION/ROTATION */
int _H51_S2_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H51_S2_setpos] component H51_S2=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H51_S2_var._name, "H51_S2", 16384);
  stracpy(_H51_S2_var._type, "Guide_gravity", 16384);
  _H51_S2_var._index=249;
  int current_setpos_index = 249;
  _H51_S2_var._parameters.w1 = 0.04;
  _H51_S2_var._parameters.h1 = 0.12;
  _H51_S2_var._parameters.w2 = 0;
  _H51_S2_var._parameters.h2 = 0;
  _H51_S2_var._parameters.l = 2.5 / 3;
  _H51_S2_var._parameters.R0 = gR0;
  _H51_S2_var._parameters.Qc = gQc;
  _H51_S2_var._parameters.alpha = gAlpha;
  _H51_S2_var._parameters.m = 1.2;
  _H51_S2_var._parameters.W = gW;
  _H51_S2_var._parameters.nslit = 1;
  _H51_S2_var._parameters.d = 0.0005;
  _H51_S2_var._parameters.mleft = -1;
  _H51_S2_var._parameters.mright = -1;
  _H51_S2_var._parameters.mtop = -1;
  _H51_S2_var._parameters.mbottom = -1;
  _H51_S2_var._parameters.nhslit = 1;
  _H51_S2_var._parameters.G = 0;
  _H51_S2_var._parameters.aleft = -1;
  _H51_S2_var._parameters.aright = -1;
  _H51_S2_var._parameters.atop = -1;
  _H51_S2_var._parameters.abottom = -1;
  _H51_S2_var._parameters.wavy = 0;
  _H51_S2_var._parameters.wavy_z = 0;
  _H51_S2_var._parameters.wavy_tb = 0;
  _H51_S2_var._parameters.wavy_lr = 0;
  _H51_S2_var._parameters.chamfers = 0;
  _H51_S2_var._parameters.chamfers_z = 0;
  _H51_S2_var._parameters.chamfers_lr = 0;
  _H51_S2_var._parameters.chamfers_tb = 0;
  _H51_S2_var._parameters.nelements = 1;
  _H51_S2_var._parameters.nu = 0;
  _H51_S2_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H51_S2_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_S2_var._parameters.reflect[0]='\0';


  /* component H51_S2=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_248_var._rotation_absolute, _H51_S2_var._rotation_absolute);
    rot_transpose(_HCS_Al_248_var._rotation_absolute, tr1);
    rot_mul(_H51_S2_var._rotation_absolute, tr1, _H51_S2_var._rotation_relative);
    _H51_S2_var._rotation_is_identity =  rot_test_identity(_H51_S2_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.05);
    rot_transpose(_HCS_Al_248_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H51_S2_var._position_absolute = coords_add(_HCS_Al_248_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_248_var._position_absolute, _H51_S2_var._position_absolute);
    _H51_S2_var._position_relative = rot_apply(_H51_S2_var._rotation_absolute, tc1);
  } /* H51_S2=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H51_S2", _H51_S2_var._position_absolute, _H51_S2_var._rotation_absolute);
  instrument->_position_absolute[249] = _H51_S2_var._position_absolute;
  instrument->_position_relative[249] = _H51_S2_var._position_relative;
    _H51_S2_var._position_relative_is_zero =  coords_test_zero(_H51_S2_var._position_relative);
  instrument->counter_N[249]  = instrument->counter_P[249] = instrument->counter_P2[249] = 0;
  instrument->counter_AbsorbProp[249]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0248_H51_S2", _H51_S2_var._position_absolute, _H51_S2_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "l", "NONE", "2.5 / 3","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0248_H51_S2", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H51_S2_setpos */

/* component H51_S2_250=Guide_gravity() SETTING, POSITION/ROTATION */
int _H51_S2_250_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H51_S2_250_setpos] component H51_S2_250=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H51_S2_250_var._name, "H51_S2_250", 16384);
  stracpy(_H51_S2_250_var._type, "Guide_gravity", 16384);
  _H51_S2_250_var._index=250;
  int current_setpos_index = 250;
  _H51_S2_250_var._parameters.w1 = 0.04;
  _H51_S2_250_var._parameters.h1 = 0.12;
  _H51_S2_250_var._parameters.w2 = 0;
  _H51_S2_250_var._parameters.h2 = 0;
  _H51_S2_250_var._parameters.l = 2.5 / 3;
  _H51_S2_250_var._parameters.R0 = gR0;
  _H51_S2_250_var._parameters.Qc = gQc;
  _H51_S2_250_var._parameters.alpha = gAlpha;
  _H51_S2_250_var._parameters.m = 1.2;
  _H51_S2_250_var._parameters.W = gW;
  _H51_S2_250_var._parameters.nslit = 1;
  _H51_S2_250_var._parameters.d = 0.0005;
  _H51_S2_250_var._parameters.mleft = -1;
  _H51_S2_250_var._parameters.mright = -1;
  _H51_S2_250_var._parameters.mtop = -1;
  _H51_S2_250_var._parameters.mbottom = -1;
  _H51_S2_250_var._parameters.nhslit = 1;
  _H51_S2_250_var._parameters.G = 0;
  _H51_S2_250_var._parameters.aleft = -1;
  _H51_S2_250_var._parameters.aright = -1;
  _H51_S2_250_var._parameters.atop = -1;
  _H51_S2_250_var._parameters.abottom = -1;
  _H51_S2_250_var._parameters.wavy = 0;
  _H51_S2_250_var._parameters.wavy_z = 0;
  _H51_S2_250_var._parameters.wavy_tb = 0;
  _H51_S2_250_var._parameters.wavy_lr = 0;
  _H51_S2_250_var._parameters.chamfers = 0;
  _H51_S2_250_var._parameters.chamfers_z = 0;
  _H51_S2_250_var._parameters.chamfers_lr = 0;
  _H51_S2_250_var._parameters.chamfers_tb = 0;
  _H51_S2_250_var._parameters.nelements = 1;
  _H51_S2_250_var._parameters.nu = 0;
  _H51_S2_250_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H51_S2_250_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_S2_250_var._parameters.reflect[0]='\0';


  /* component H51_S2_250=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-2.5 / 3 / 3000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H51_S2_var._rotation_absolute, _H51_S2_250_var._rotation_absolute);
    rot_transpose(_H51_S2_var._rotation_absolute, tr1);
    rot_mul(_H51_S2_250_var._rotation_absolute, tr1, _H51_S2_250_var._rotation_relative);
    _H51_S2_250_var._rotation_is_identity =  rot_test_identity(_H51_S2_250_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 2.5 / 3);
    rot_transpose(_H51_S2_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H51_S2_250_var._position_absolute = coords_add(_H51_S2_var._position_absolute, tc2);
    tc1 = coords_sub(_H51_S2_var._position_absolute, _H51_S2_250_var._position_absolute);
    _H51_S2_250_var._position_relative = rot_apply(_H51_S2_250_var._rotation_absolute, tc1);
  } /* H51_S2_250=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H51_S2_250", _H51_S2_250_var._position_absolute, _H51_S2_250_var._rotation_absolute);
  instrument->_position_absolute[250] = _H51_S2_250_var._position_absolute;
  instrument->_position_relative[250] = _H51_S2_250_var._position_relative;
    _H51_S2_250_var._position_relative_is_zero =  coords_test_zero(_H51_S2_250_var._position_relative);
  instrument->counter_N[250]  = instrument->counter_P[250] = instrument->counter_P2[250] = 0;
  instrument->counter_AbsorbProp[250]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0249_H51_S2_250", _H51_S2_250_var._position_absolute, _H51_S2_250_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "l", "NONE", "2.5 / 3","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0249_H51_S2_250", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H51_S2_250_setpos */

/* component H51_S2_251=Guide_gravity() SETTING, POSITION/ROTATION */
int _H51_S2_251_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H51_S2_251_setpos] component H51_S2_251=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H51_S2_251_var._name, "H51_S2_251", 16384);
  stracpy(_H51_S2_251_var._type, "Guide_gravity", 16384);
  _H51_S2_251_var._index=251;
  int current_setpos_index = 251;
  _H51_S2_251_var._parameters.w1 = 0.04;
  _H51_S2_251_var._parameters.h1 = 0.12;
  _H51_S2_251_var._parameters.w2 = 0;
  _H51_S2_251_var._parameters.h2 = 0;
  _H51_S2_251_var._parameters.l = 2.5 / 3;
  _H51_S2_251_var._parameters.R0 = gR0;
  _H51_S2_251_var._parameters.Qc = gQc;
  _H51_S2_251_var._parameters.alpha = gAlpha;
  _H51_S2_251_var._parameters.m = 1.2;
  _H51_S2_251_var._parameters.W = gW;
  _H51_S2_251_var._parameters.nslit = 1;
  _H51_S2_251_var._parameters.d = 0.0005;
  _H51_S2_251_var._parameters.mleft = -1;
  _H51_S2_251_var._parameters.mright = -1;
  _H51_S2_251_var._parameters.mtop = -1;
  _H51_S2_251_var._parameters.mbottom = -1;
  _H51_S2_251_var._parameters.nhslit = 1;
  _H51_S2_251_var._parameters.G = 0;
  _H51_S2_251_var._parameters.aleft = -1;
  _H51_S2_251_var._parameters.aright = -1;
  _H51_S2_251_var._parameters.atop = -1;
  _H51_S2_251_var._parameters.abottom = -1;
  _H51_S2_251_var._parameters.wavy = 0;
  _H51_S2_251_var._parameters.wavy_z = 0;
  _H51_S2_251_var._parameters.wavy_tb = 0;
  _H51_S2_251_var._parameters.wavy_lr = 0;
  _H51_S2_251_var._parameters.chamfers = 0;
  _H51_S2_251_var._parameters.chamfers_z = 0;
  _H51_S2_251_var._parameters.chamfers_lr = 0;
  _H51_S2_251_var._parameters.chamfers_tb = 0;
  _H51_S2_251_var._parameters.nelements = 1;
  _H51_S2_251_var._parameters.nu = 0;
  _H51_S2_251_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H51_S2_251_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_S2_251_var._parameters.reflect[0]='\0';


  /* component H51_S2_251=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-2.5 / 3 / 3000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H51_S2_250_var._rotation_absolute, _H51_S2_251_var._rotation_absolute);
    rot_transpose(_H51_S2_250_var._rotation_absolute, tr1);
    rot_mul(_H51_S2_251_var._rotation_absolute, tr1, _H51_S2_251_var._rotation_relative);
    _H51_S2_251_var._rotation_is_identity =  rot_test_identity(_H51_S2_251_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 2.5 / 3);
    rot_transpose(_H51_S2_250_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H51_S2_251_var._position_absolute = coords_add(_H51_S2_250_var._position_absolute, tc2);
    tc1 = coords_sub(_H51_S2_250_var._position_absolute, _H51_S2_251_var._position_absolute);
    _H51_S2_251_var._position_relative = rot_apply(_H51_S2_251_var._rotation_absolute, tc1);
  } /* H51_S2_251=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H51_S2_251", _H51_S2_251_var._position_absolute, _H51_S2_251_var._rotation_absolute);
  instrument->_position_absolute[251] = _H51_S2_251_var._position_absolute;
  instrument->_position_relative[251] = _H51_S2_251_var._position_relative;
    _H51_S2_251_var._position_relative_is_zero =  coords_test_zero(_H51_S2_251_var._position_relative);
  instrument->counter_N[251]  = instrument->counter_P[251] = instrument->counter_P2[251] = 0;
  instrument->counter_AbsorbProp[251]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0250_H51_S2_251", _H51_S2_251_var._position_absolute, _H51_S2_251_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "h1", "NONE", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "l", "NONE", "2.5 / 3","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0250_H51_S2_251", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H51_S2_251_setpos */

/* component HCS_Al_H51=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_H51_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_H51_setpos] component HCS_Al_H51=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_H51_var._name, "HCS_Al_H51", 16384);
  stracpy(_HCS_Al_H51_var._type, "PowderN", 16384);
  _HCS_Al_H51_var._index=252;
  int current_setpos_index = 252;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_H51_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_H51_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_H51_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_H51_var._parameters.geometry[0]='\0';
  _HCS_Al_H51_var._parameters.format[0] = 0;
  _HCS_Al_H51_var._parameters.format[1] = 0;
  _HCS_Al_H51_var._parameters.format[2] = 0;
  _HCS_Al_H51_var._parameters.format[3] = 0;
  _HCS_Al_H51_var._parameters.format[4] = 0;
  _HCS_Al_H51_var._parameters.format[5] = 0;
  _HCS_Al_H51_var._parameters.format[6] = 0;
  _HCS_Al_H51_var._parameters.format[7] = 0;
  _HCS_Al_H51_var._parameters.format[8] = 0;
  _HCS_Al_H51_var._parameters.radius = 0;
  _HCS_Al_H51_var._parameters.yheight = 0.12;
  _HCS_Al_H51_var._parameters.xwidth = 0.04;
  _HCS_Al_H51_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_H51_var._parameters.thickness = 0;
  _HCS_Al_H51_var._parameters.pack = 1;
  _HCS_Al_H51_var._parameters.Vc = 0;
  _HCS_Al_H51_var._parameters.sigma_abs = 0;
  _HCS_Al_H51_var._parameters.sigma_inc = 0;
  _HCS_Al_H51_var._parameters.delta_d_d = 0;
  _HCS_Al_H51_var._parameters.p_inc = 0.005;
  _HCS_Al_H51_var._parameters.p_transmit = 0.9450;
  _HCS_Al_H51_var._parameters.DW = 0;
  _HCS_Al_H51_var._parameters.nb_atoms = 1;
  _HCS_Al_H51_var._parameters.d_omega = 0;
  _HCS_Al_H51_var._parameters.d_phi = 10;
  _HCS_Al_H51_var._parameters.tth_sign = 0;
  _HCS_Al_H51_var._parameters.p_interact = 0.05;
  _HCS_Al_H51_var._parameters.concentric = 0;
  _HCS_Al_H51_var._parameters.density = 0;
  _HCS_Al_H51_var._parameters.weight = 0;
  _HCS_Al_H51_var._parameters.barns = 1;
  _HCS_Al_H51_var._parameters.Strain = 0;
  _HCS_Al_H51_var._parameters.focus_flip = 0;
  _HCS_Al_H51_var._parameters.target_index = 0;
  _HCS_Al_H51_var._parameters.order = 1;


  /* component HCS_Al_H51=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H51_S2_251_var._rotation_absolute, _HCS_Al_H51_var._rotation_absolute);
    rot_transpose(_H51_S2_251_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_H51_var._rotation_absolute, tr1, _HCS_Al_H51_var._rotation_relative);
    _HCS_Al_H51_var._rotation_is_identity =  rot_test_identity(_HCS_Al_H51_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 2.5 / 3 + 0.01);
    rot_transpose(_H51_S2_251_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_H51_var._position_absolute = coords_add(_H51_S2_251_var._position_absolute, tc2);
    tc1 = coords_sub(_H51_S2_251_var._position_absolute, _HCS_Al_H51_var._position_absolute);
    _HCS_Al_H51_var._position_relative = rot_apply(_HCS_Al_H51_var._rotation_absolute, tc1);
  } /* HCS_Al_H51=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_H51", _HCS_Al_H51_var._position_absolute, _HCS_Al_H51_var._rotation_absolute);
  instrument->_position_absolute[252] = _HCS_Al_H51_var._position_absolute;
  instrument->_position_relative[252] = _HCS_Al_H51_var._position_relative;
    _HCS_Al_H51_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_H51_var._position_relative);
  instrument->counter_N[252]  = instrument->counter_P[252] = instrument->counter_P2[252] = 0;
  instrument->counter_AbsorbProp[252]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0251_HCS_Al_H51", _HCS_Al_H51_var._position_absolute, _HCS_Al_H51_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "xwidth", "0", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0251_HCS_Al_H51", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_H51_setpos */

/* component H51_S2_Out=Monitor_nD() SETTING, POSITION/ROTATION */
int _H51_S2_Out_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H51_S2_Out_setpos] component H51_S2_Out=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H51_S2_Out_var._name, "H51_S2_Out", 16384);
  stracpy(_H51_S2_Out_var._type, "Monitor_nD", 16384);
  _H51_S2_Out_var._index=253;
  int current_setpos_index = 253;
  if("" && strlen(""))
    stracpy(_H51_S2_Out_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H51_S2_Out_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H51_S2_Out_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H51_S2_Out_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H51_S2_Out_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H51_S2_Out_var._parameters.user3[0]='\0';
  _H51_S2_Out_var._parameters.xwidth = 0.04;
  _H51_S2_Out_var._parameters.yheight = 0.12;
  _H51_S2_Out_var._parameters.zdepth = 0;
  _H51_S2_Out_var._parameters.xmin = 0;
  _H51_S2_Out_var._parameters.xmax = 0;
  _H51_S2_Out_var._parameters.ymin = 0;
  _H51_S2_Out_var._parameters.ymax = 0;
  _H51_S2_Out_var._parameters.zmin = 0;
  _H51_S2_Out_var._parameters.zmax = 0;
  _H51_S2_Out_var._parameters.bins = 50;
  _H51_S2_Out_var._parameters.min = -1e40;
  _H51_S2_Out_var._parameters.max = 1e40;
  _H51_S2_Out_var._parameters.restore_neutron = 0;
  _H51_S2_Out_var._parameters.radius = 0;
  if("x y, slit" && strlen("x y, slit"))
    stracpy(_H51_S2_Out_var._parameters.options, "x y, slit" ? "x y, slit" : "", 16384);
  else 
  _H51_S2_Out_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_S2_Out_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_S2_Out_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_S2_Out_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_S2_Out_var._parameters.geometry[0]='\0';
  _H51_S2_Out_var._parameters.nowritefile = 0;
  _H51_S2_Out_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H51_S2_Out_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_S2_Out_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_S2_Out_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_S2_Out_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_S2_Out_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_S2_Out_var._parameters.username3[0]='\0';


  /* component H51_S2_Out=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_H51_var._rotation_absolute, _H51_S2_Out_var._rotation_absolute);
    rot_transpose(_HCS_Al_H51_var._rotation_absolute, tr1);
    rot_mul(_H51_S2_Out_var._rotation_absolute, tr1, _H51_S2_Out_var._rotation_relative);
    _H51_S2_Out_var._rotation_is_identity =  rot_test_identity(_H51_S2_Out_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.05);
    rot_transpose(_HCS_Al_H51_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H51_S2_Out_var._position_absolute = coords_add(_HCS_Al_H51_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_H51_var._position_absolute, _H51_S2_Out_var._position_absolute);
    _H51_S2_Out_var._position_relative = rot_apply(_H51_S2_Out_var._rotation_absolute, tc1);
  } /* H51_S2_Out=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H51_S2_Out", _H51_S2_Out_var._position_absolute, _H51_S2_Out_var._rotation_absolute);
  instrument->_position_absolute[253] = _H51_S2_Out_var._position_absolute;
  instrument->_position_relative[253] = _H51_S2_Out_var._position_relative;
    _H51_S2_Out_var._position_relative_is_zero =  coords_test_zero(_H51_S2_Out_var._position_relative);
  instrument->counter_N[253]  = instrument->counter_P[253] = instrument->counter_P2[253] = 0;
  instrument->counter_AbsorbProp[253]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0252_H51_S2_Out", _H51_S2_Out_var._position_absolute, _H51_S2_Out_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "xwidth", "0", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "restore_neutron", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "options", "NULL", "x y, slit", "char*");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0252_H51_S2_Out", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H51_S2_Out_setpos */

/* component H51_split_2=Monitor_nD() SETTING, POSITION/ROTATION */
int _H51_split_2_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H51_split_2_setpos] component H51_split_2=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H51_split_2_var._name, "H51_split_2", 16384);
  stracpy(_H51_split_2_var._type, "Monitor_nD", 16384);
  _H51_split_2_var._index=254;
  int current_setpos_index = 254;
  if("" && strlen(""))
    stracpy(_H51_split_2_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H51_split_2_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H51_split_2_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H51_split_2_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H51_split_2_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H51_split_2_var._parameters.user3[0]='\0';
  _H51_split_2_var._parameters.xwidth = 0.04;
  _H51_split_2_var._parameters.yheight = 0.055;
  _H51_split_2_var._parameters.zdepth = 0;
  _H51_split_2_var._parameters.xmin = 0;
  _H51_split_2_var._parameters.xmax = 0;
  _H51_split_2_var._parameters.ymin = 0;
  _H51_split_2_var._parameters.ymax = 0;
  _H51_split_2_var._parameters.zmin = 0;
  _H51_split_2_var._parameters.zmax = 0;
  _H51_split_2_var._parameters.bins = 50;
  _H51_split_2_var._parameters.min = -1e40;
  _H51_split_2_var._parameters.max = 1e40;
  _H51_split_2_var._parameters.restore_neutron = 1;
  _H51_split_2_var._parameters.radius = 0;
  if("x y, slit" && strlen("x y, slit"))
    stracpy(_H51_split_2_var._parameters.options, "x y, slit" ? "x y, slit" : "", 16384);
  else 
  _H51_split_2_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_split_2_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_split_2_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_split_2_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_split_2_var._parameters.geometry[0]='\0';
  _H51_split_2_var._parameters.nowritefile = 0;
  _H51_split_2_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H51_split_2_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_split_2_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_split_2_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_split_2_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_split_2_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_split_2_var._parameters.username3[0]='\0';


  /* component H51_split_2=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H51_S2_Out_var._rotation_absolute, _H51_split_2_var._rotation_absolute);
    rot_transpose(_H51_S2_Out_var._rotation_absolute, tr1);
    rot_mul(_H51_split_2_var._rotation_absolute, tr1, _H51_split_2_var._rotation_relative);
    _H51_split_2_var._rotation_is_identity =  rot_test_identity(_H51_split_2_var._rotation_relative);
    tc1 = coords_set(
      0, 0.12 / 2 -0.055 / 2, 0);
    rot_transpose(_H51_S2_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H51_split_2_var._position_absolute = coords_add(_H51_S2_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H51_S2_Out_var._position_absolute, _H51_split_2_var._position_absolute);
    _H51_split_2_var._position_relative = rot_apply(_H51_split_2_var._rotation_absolute, tc1);
  } /* H51_split_2=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H51_split_2", _H51_split_2_var._position_absolute, _H51_split_2_var._rotation_absolute);
  instrument->_position_absolute[254] = _H51_split_2_var._position_absolute;
  instrument->_position_relative[254] = _H51_split_2_var._position_relative;
    _H51_split_2_var._position_relative_is_zero =  coords_test_zero(_H51_split_2_var._position_relative);
  instrument->counter_N[254]  = instrument->counter_P[254] = instrument->counter_P2[254] = 0;
  instrument->counter_AbsorbProp[254]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0253_H51_split_2", _H51_split_2_var._position_absolute, _H51_split_2_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "xwidth", "0", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "yheight", "0", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "options", "NULL", "x y, slit", "char*");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0253_H51_split_2", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H51_split_2_setpos */

/* component H51_split_1=Monitor_nD() SETTING, POSITION/ROTATION */
int _H51_split_1_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H51_split_1_setpos] component H51_split_1=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H51_split_1_var._name, "H51_split_1", 16384);
  stracpy(_H51_split_1_var._type, "Monitor_nD", 16384);
  _H51_split_1_var._index=255;
  int current_setpos_index = 255;
  if("" && strlen(""))
    stracpy(_H51_split_1_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H51_split_1_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H51_split_1_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H51_split_1_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H51_split_1_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H51_split_1_var._parameters.user3[0]='\0';
  _H51_split_1_var._parameters.xwidth = 0.04;
  _H51_split_1_var._parameters.yheight = 0.055;
  _H51_split_1_var._parameters.zdepth = 0;
  _H51_split_1_var._parameters.xmin = 0;
  _H51_split_1_var._parameters.xmax = 0;
  _H51_split_1_var._parameters.ymin = 0;
  _H51_split_1_var._parameters.ymax = 0;
  _H51_split_1_var._parameters.zmin = 0;
  _H51_split_1_var._parameters.zmax = 0;
  _H51_split_1_var._parameters.bins = 50;
  _H51_split_1_var._parameters.min = -1e40;
  _H51_split_1_var._parameters.max = 1e40;
  _H51_split_1_var._parameters.restore_neutron = 1;
  _H51_split_1_var._parameters.radius = 0;
  if("x y, slit" && strlen("x y, slit"))
    stracpy(_H51_split_1_var._parameters.options, "x y, slit" ? "x y, slit" : "", 16384);
  else 
  _H51_split_1_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_split_1_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_split_1_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_split_1_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_split_1_var._parameters.geometry[0]='\0';
  _H51_split_1_var._parameters.nowritefile = 0;
  _H51_split_1_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H51_split_1_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_split_1_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_split_1_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_split_1_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_split_1_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_split_1_var._parameters.username3[0]='\0';


  /* component H51_split_1=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H51_S2_Out_var._rotation_absolute, _H51_split_1_var._rotation_absolute);
    rot_transpose(_H51_split_2_var._rotation_absolute, tr1);
    rot_mul(_H51_split_1_var._rotation_absolute, tr1, _H51_split_1_var._rotation_relative);
    _H51_split_1_var._rotation_is_identity =  rot_test_identity(_H51_split_1_var._rotation_relative);
    tc1 = coords_set(
      0, -0.12 / 2 + 0.055 / 2, 0);
    rot_transpose(_H51_S2_Out_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H51_split_1_var._position_absolute = coords_add(_H51_S2_Out_var._position_absolute, tc2);
    tc1 = coords_sub(_H51_split_2_var._position_absolute, _H51_split_1_var._position_absolute);
    _H51_split_1_var._position_relative = rot_apply(_H51_split_1_var._rotation_absolute, tc1);
  } /* H51_split_1=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H51_split_1", _H51_split_1_var._position_absolute, _H51_split_1_var._rotation_absolute);
  instrument->_position_absolute[255] = _H51_split_1_var._position_absolute;
  instrument->_position_relative[255] = _H51_split_1_var._position_relative;
    _H51_split_1_var._position_relative_is_zero =  coords_test_zero(_H51_split_1_var._position_relative);
  instrument->counter_N[255]  = instrument->counter_P[255] = instrument->counter_P2[255] = 0;
  instrument->counter_AbsorbProp[255]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0254_H51_split_1", _H51_split_1_var._position_absolute, _H51_split_1_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "xwidth", "0", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "yheight", "0", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "options", "NULL", "x y, slit", "char*");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0254_H51_split_1", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H51_split_1_setpos */

/* component H511_Start=Arm() SETTING, POSITION/ROTATION */
int _H511_Start_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H511_Start_setpos] component H511_Start=Arm() SETTING [Arm:0]");
  stracpy(_H511_Start_var._name, "H511_Start", 16384);
  stracpy(_H511_Start_var._type, "Arm", 16384);
  _H511_Start_var._index=256;
  int current_setpos_index = 256;
  /* component H511_Start=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H51_split_1_var._rotation_absolute, _H511_Start_var._rotation_absolute);
    rot_transpose(_H51_split_1_var._rotation_absolute, tr1);
    rot_mul(_H511_Start_var._rotation_absolute, tr1, _H511_Start_var._rotation_relative);
    _H511_Start_var._rotation_is_identity =  rot_test_identity(_H511_Start_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H51_split_1_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H511_Start_var._position_absolute = coords_add(_H51_split_1_var._position_absolute, tc2);
    tc1 = coords_sub(_H51_split_1_var._position_absolute, _H511_Start_var._position_absolute);
    _H511_Start_var._position_relative = rot_apply(_H511_Start_var._rotation_absolute, tc1);
  } /* H511_Start=Arm() AT ROTATED */
  DEBUG_COMPONENT("H511_Start", _H511_Start_var._position_absolute, _H511_Start_var._rotation_absolute);
  instrument->_position_absolute[256] = _H511_Start_var._position_absolute;
  instrument->_position_relative[256] = _H511_Start_var._position_relative;
    _H511_Start_var._position_relative_is_zero =  coords_test_zero(_H511_Start_var._position_relative);
  instrument->counter_N[256]  = instrument->counter_P[256] = instrument->counter_P2[256] = 0;
  instrument->counter_AbsorbProp[256]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0255_H511_Start", _H511_Start_var._position_absolute, _H511_Start_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H511_Start_setpos */

/* component H511_mirror_centre=Arm() SETTING, POSITION/ROTATION */
int _H511_mirror_centre_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H511_mirror_centre_setpos] component H511_mirror_centre=Arm() SETTING [Arm:0]");
  stracpy(_H511_mirror_centre_var._name, "H511_mirror_centre", 16384);
  stracpy(_H511_mirror_centre_var._type, "Arm", 16384);
  _H511_mirror_centre_var._index=257;
  int current_setpos_index = 257;
  /* component H511_mirror_centre=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H511_Start_var._rotation_absolute, _H511_mirror_centre_var._rotation_absolute);
    rot_transpose(_H511_Start_var._rotation_absolute, tr1);
    rot_mul(_H511_mirror_centre_var._rotation_absolute, tr1, _H511_mirror_centre_var._rotation_relative);
    _H511_mirror_centre_var._rotation_is_identity =  rot_test_identity(_H511_mirror_centre_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.75);
    rot_transpose(_H511_Start_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H511_mirror_centre_var._position_absolute = coords_add(_H511_Start_var._position_absolute, tc2);
    tc1 = coords_sub(_H511_Start_var._position_absolute, _H511_mirror_centre_var._position_absolute);
    _H511_mirror_centre_var._position_relative = rot_apply(_H511_mirror_centre_var._rotation_absolute, tc1);
  } /* H511_mirror_centre=Arm() AT ROTATED */
  DEBUG_COMPONENT("H511_mirror_centre", _H511_mirror_centre_var._position_absolute, _H511_mirror_centre_var._rotation_absolute);
  instrument->_position_absolute[257] = _H511_mirror_centre_var._position_absolute;
  instrument->_position_relative[257] = _H511_mirror_centre_var._position_relative;
    _H511_mirror_centre_var._position_relative_is_zero =  coords_test_zero(_H511_mirror_centre_var._position_relative);
  instrument->counter_N[257]  = instrument->counter_P[257] = instrument->counter_P2[257] = 0;
  instrument->counter_AbsorbProp[257]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0256_H511_mirror_centre", _H511_mirror_centre_var._position_absolute, _H511_mirror_centre_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H511_mirror_centre_setpos */

/* component IN15_polariser=Pol_mirror() SETTING, POSITION/ROTATION */
int _IN15_polariser_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_IN15_polariser_setpos] component IN15_polariser=Pol_mirror() SETTING [Pol_mirror:0]");
  stracpy(_IN15_polariser_var._name, "IN15_polariser", 16384);
  stracpy(_IN15_polariser_var._type, "Pol_mirror", 16384);
  _IN15_polariser_var._index=258;
  int current_setpos_index = 258;
  _IN15_polariser_var._parameters.rUpPar[0] = 1;
  _IN15_polariser_var._parameters.rUpPar[1] = 0.0219;
  _IN15_polariser_var._parameters.rUpPar[2] = 4.07;
  _IN15_polariser_var._parameters.rUpPar[3] = 3.2;
  _IN15_polariser_var._parameters.rUpPar[4] = 0.003;
  _IN15_polariser_var._parameters.rDownPar[0] = 0.1;
  _IN15_polariser_var._parameters.rDownPar[1] = 0.0219;
  _IN15_polariser_var._parameters.rDownPar[2] = 4.07;
  _IN15_polariser_var._parameters.rDownPar[3] = 3.2;
  _IN15_polariser_var._parameters.rDownPar[4] = 0.003;
  if("" && strlen(""))
    stracpy(_IN15_polariser_var._parameters.rUpData, "" ? "" : "", 16384);
  else 
  _IN15_polariser_var._parameters.rUpData[0]='\0';
  if("" && strlen(""))
    stracpy(_IN15_polariser_var._parameters.rDownData, "" ? "" : "", 16384);
  else 
  _IN15_polariser_var._parameters.rDownData[0]='\0';
  _IN15_polariser_var._parameters.p_reflect = 0.95;
  _IN15_polariser_var._parameters.zwidth = 1.5;
  _IN15_polariser_var._parameters.yheight = 0.055;


  /* component IN15_polariser=Pol_mirror() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-1.5)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H511_mirror_centre_var._rotation_absolute, _IN15_polariser_var._rotation_absolute);
    rot_transpose(_H511_mirror_centre_var._rotation_absolute, tr1);
    rot_mul(_IN15_polariser_var._rotation_absolute, tr1, _IN15_polariser_var._rotation_relative);
    _IN15_polariser_var._rotation_is_identity =  rot_test_identity(_IN15_polariser_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H511_mirror_centre_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _IN15_polariser_var._position_absolute = coords_add(_H511_mirror_centre_var._position_absolute, tc2);
    tc1 = coords_sub(_H511_mirror_centre_var._position_absolute, _IN15_polariser_var._position_absolute);
    _IN15_polariser_var._position_relative = rot_apply(_IN15_polariser_var._rotation_absolute, tc1);
  } /* IN15_polariser=Pol_mirror() AT ROTATED */
  DEBUG_COMPONENT("IN15_polariser", _IN15_polariser_var._position_absolute, _IN15_polariser_var._rotation_absolute);
  instrument->_position_absolute[258] = _IN15_polariser_var._position_absolute;
  instrument->_position_relative[258] = _IN15_polariser_var._position_relative;
    _IN15_polariser_var._position_relative_is_zero =  coords_test_zero(_IN15_polariser_var._position_relative);
  instrument->counter_N[258]  = instrument->counter_P[258] = instrument->counter_P2[258] = 0;
  instrument->counter_AbsorbProp[258]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0257_IN15_polariser", _IN15_polariser_var._position_absolute, _IN15_polariser_var._rotation_absolute, "Pol_mirror");
        mccomp_param_nexus(nxhandle,"0257_IN15_polariser", "rUpPar", "{ 0.99 , 0.0219 , 6.07 , 2.0 , 0.003 }", "{ 1.0 , 0.0219 , 4.07 , 3.2 , 0.003 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0257_IN15_polariser", "rDownPar", "{ 0.99 , 0.0219 , 6.07 , 2.0 , 0.003 }", "{ 0.1 , 0.0219 , 4.07 , 3.2 , 0.003 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0257_IN15_polariser", "rUpData", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0257_IN15_polariser", "rDownData", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0257_IN15_polariser", "p_reflect", "-1", "0.95","MCNUM");
        mccomp_param_nexus(nxhandle,"0257_IN15_polariser", "zwidth", "NONE", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0257_IN15_polariser", "yheight", "NONE", "0.055","MCNUM");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _IN15_polariser_setpos */

/* component H511_mirror_outdir=Arm() SETTING, POSITION/ROTATION */
int _H511_mirror_outdir_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H511_mirror_outdir_setpos] component H511_mirror_outdir=Arm() SETTING [Arm:0]");
  stracpy(_H511_mirror_outdir_var._name, "H511_mirror_outdir", 16384);
  stracpy(_H511_mirror_outdir_var._type, "Arm", 16384);
  _H511_mirror_outdir_var._index=259;
  int current_setpos_index = 259;
  /* component H511_mirror_outdir=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-3)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H511_mirror_centre_var._rotation_absolute, _H511_mirror_outdir_var._rotation_absolute);
    rot_transpose(_IN15_polariser_var._rotation_absolute, tr1);
    rot_mul(_H511_mirror_outdir_var._rotation_absolute, tr1, _H511_mirror_outdir_var._rotation_relative);
    _H511_mirror_outdir_var._rotation_is_identity =  rot_test_identity(_H511_mirror_outdir_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H511_mirror_centre_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H511_mirror_outdir_var._position_absolute = coords_add(_H511_mirror_centre_var._position_absolute, tc2);
    tc1 = coords_sub(_IN15_polariser_var._position_absolute, _H511_mirror_outdir_var._position_absolute);
    _H511_mirror_outdir_var._position_relative = rot_apply(_H511_mirror_outdir_var._rotation_absolute, tc1);
  } /* H511_mirror_outdir=Arm() AT ROTATED */
  DEBUG_COMPONENT("H511_mirror_outdir", _H511_mirror_outdir_var._position_absolute, _H511_mirror_outdir_var._rotation_absolute);
  instrument->_position_absolute[259] = _H511_mirror_outdir_var._position_absolute;
  instrument->_position_relative[259] = _H511_mirror_outdir_var._position_relative;
    _H511_mirror_outdir_var._position_relative_is_zero =  coords_test_zero(_H511_mirror_outdir_var._position_relative);
  instrument->counter_N[259]  = instrument->counter_P[259] = instrument->counter_P2[259] = 0;
  instrument->counter_AbsorbProp[259]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0258_H511_mirror_outdir", _H511_mirror_outdir_var._position_absolute, _H511_mirror_outdir_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H511_mirror_outdir_setpos */

/* component H511_mirror_ReflectXY=Monitor_nD() SETTING, POSITION/ROTATION */
int _H511_mirror_ReflectXY_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H511_mirror_ReflectXY_setpos] component H511_mirror_ReflectXY=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H511_mirror_ReflectXY_var._name, "H511_mirror_ReflectXY", 16384);
  stracpy(_H511_mirror_ReflectXY_var._type, "Monitor_nD", 16384);
  _H511_mirror_ReflectXY_var._index=260;
  int current_setpos_index = 260;
  if("" && strlen(""))
    stracpy(_H511_mirror_ReflectXY_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H511_mirror_ReflectXY_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H511_mirror_ReflectXY_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H511_mirror_ReflectXY_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H511_mirror_ReflectXY_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H511_mirror_ReflectXY_var._parameters.user3[0]='\0';
  _H511_mirror_ReflectXY_var._parameters.xwidth = 0.04;
  _H511_mirror_ReflectXY_var._parameters.yheight = 0.055;
  _H511_mirror_ReflectXY_var._parameters.zdepth = 0;
  _H511_mirror_ReflectXY_var._parameters.xmin = 0;
  _H511_mirror_ReflectXY_var._parameters.xmax = 0;
  _H511_mirror_ReflectXY_var._parameters.ymin = 0;
  _H511_mirror_ReflectXY_var._parameters.ymax = 0;
  _H511_mirror_ReflectXY_var._parameters.zmin = 0;
  _H511_mirror_ReflectXY_var._parameters.zmax = 0;
  _H511_mirror_ReflectXY_var._parameters.bins = 50;
  _H511_mirror_ReflectXY_var._parameters.min = -1e40;
  _H511_mirror_ReflectXY_var._parameters.max = 1e40;
  _H511_mirror_ReflectXY_var._parameters.restore_neutron = 1;
  _H511_mirror_ReflectXY_var._parameters.radius = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H511_mirror_ReflectXY_var._parameters.options, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_mirror_ReflectXY_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_mirror_ReflectXY_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_mirror_ReflectXY_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_mirror_ReflectXY_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_mirror_ReflectXY_var._parameters.geometry[0]='\0';
  _H511_mirror_ReflectXY_var._parameters.nowritefile = 0;
  _H511_mirror_ReflectXY_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H511_mirror_ReflectXY_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_mirror_ReflectXY_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_mirror_ReflectXY_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_mirror_ReflectXY_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_mirror_ReflectXY_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_mirror_ReflectXY_var._parameters.username3[0]='\0';


  /* component H511_mirror_ReflectXY=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H511_mirror_outdir_var._rotation_absolute, _H511_mirror_ReflectXY_var._rotation_absolute);
    rot_transpose(_IN15_polariser_var._rotation_absolute, tr1);
    rot_mul(_H511_mirror_ReflectXY_var._rotation_absolute, tr1, _H511_mirror_ReflectXY_var._rotation_relative);
    _H511_mirror_ReflectXY_var._rotation_is_identity =  rot_test_identity(_H511_mirror_ReflectXY_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.755);
    rot_transpose(_H511_mirror_outdir_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H511_mirror_ReflectXY_var._position_absolute = coords_add(_H511_mirror_outdir_var._position_absolute, tc2);
    tc1 = coords_sub(_IN15_polariser_var._position_absolute, _H511_mirror_ReflectXY_var._position_absolute);
    _H511_mirror_ReflectXY_var._position_relative = rot_apply(_H511_mirror_ReflectXY_var._rotation_absolute, tc1);
  } /* H511_mirror_ReflectXY=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H511_mirror_ReflectXY", _H511_mirror_ReflectXY_var._position_absolute, _H511_mirror_ReflectXY_var._rotation_absolute);
  instrument->_position_absolute[260] = _H511_mirror_ReflectXY_var._position_absolute;
  instrument->_position_relative[260] = _H511_mirror_ReflectXY_var._position_relative;
    _H511_mirror_ReflectXY_var._position_relative_is_zero =  coords_test_zero(_H511_mirror_ReflectXY_var._position_relative);
  instrument->counter_N[260]  = instrument->counter_P[260] = instrument->counter_P2[260] = 0;
  instrument->counter_AbsorbProp[260]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0259_H511_mirror_ReflectXY", _H511_mirror_ReflectXY_var._position_absolute, _H511_mirror_ReflectXY_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "xwidth", "0", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "yheight", "0", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "options", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0259_H511_mirror_ReflectXY", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H511_mirror_ReflectXY_setpos */

/* component H511_mirror_TransmitXY=Monitor_nD() SETTING, POSITION/ROTATION */
int _H511_mirror_TransmitXY_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H511_mirror_TransmitXY_setpos] component H511_mirror_TransmitXY=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H511_mirror_TransmitXY_var._name, "H511_mirror_TransmitXY", 16384);
  stracpy(_H511_mirror_TransmitXY_var._type, "Monitor_nD", 16384);
  _H511_mirror_TransmitXY_var._index=261;
  int current_setpos_index = 261;
  if("" && strlen(""))
    stracpy(_H511_mirror_TransmitXY_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H511_mirror_TransmitXY_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H511_mirror_TransmitXY_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H511_mirror_TransmitXY_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H511_mirror_TransmitXY_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H511_mirror_TransmitXY_var._parameters.user3[0]='\0';
  _H511_mirror_TransmitXY_var._parameters.xwidth = 0.04;
  _H511_mirror_TransmitXY_var._parameters.yheight = 0.055;
  _H511_mirror_TransmitXY_var._parameters.zdepth = 0;
  _H511_mirror_TransmitXY_var._parameters.xmin = 0;
  _H511_mirror_TransmitXY_var._parameters.xmax = 0;
  _H511_mirror_TransmitXY_var._parameters.ymin = 0;
  _H511_mirror_TransmitXY_var._parameters.ymax = 0;
  _H511_mirror_TransmitXY_var._parameters.zmin = 0;
  _H511_mirror_TransmitXY_var._parameters.zmax = 0;
  _H511_mirror_TransmitXY_var._parameters.bins = 50;
  _H511_mirror_TransmitXY_var._parameters.min = -1e40;
  _H511_mirror_TransmitXY_var._parameters.max = 1e40;
  _H511_mirror_TransmitXY_var._parameters.restore_neutron = 1;
  _H511_mirror_TransmitXY_var._parameters.radius = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H511_mirror_TransmitXY_var._parameters.options, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_mirror_TransmitXY_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_mirror_TransmitXY_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_mirror_TransmitXY_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_mirror_TransmitXY_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_mirror_TransmitXY_var._parameters.geometry[0]='\0';
  _H511_mirror_TransmitXY_var._parameters.nowritefile = 0;
  _H511_mirror_TransmitXY_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H511_mirror_TransmitXY_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_mirror_TransmitXY_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_mirror_TransmitXY_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_mirror_TransmitXY_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_mirror_TransmitXY_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_mirror_TransmitXY_var._parameters.username3[0]='\0';


  /* component H511_mirror_TransmitXY=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H511_mirror_centre_var._rotation_absolute, _H511_mirror_TransmitXY_var._rotation_absolute);
    rot_transpose(_H511_mirror_ReflectXY_var._rotation_absolute, tr1);
    rot_mul(_H511_mirror_TransmitXY_var._rotation_absolute, tr1, _H511_mirror_TransmitXY_var._rotation_relative);
    _H511_mirror_TransmitXY_var._rotation_is_identity =  rot_test_identity(_H511_mirror_TransmitXY_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.755);
    rot_transpose(_H511_mirror_centre_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H511_mirror_TransmitXY_var._position_absolute = coords_add(_H511_mirror_centre_var._position_absolute, tc2);
    tc1 = coords_sub(_H511_mirror_ReflectXY_var._position_absolute, _H511_mirror_TransmitXY_var._position_absolute);
    _H511_mirror_TransmitXY_var._position_relative = rot_apply(_H511_mirror_TransmitXY_var._rotation_absolute, tc1);
  } /* H511_mirror_TransmitXY=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H511_mirror_TransmitXY", _H511_mirror_TransmitXY_var._position_absolute, _H511_mirror_TransmitXY_var._rotation_absolute);
  instrument->_position_absolute[261] = _H511_mirror_TransmitXY_var._position_absolute;
  instrument->_position_relative[261] = _H511_mirror_TransmitXY_var._position_relative;
    _H511_mirror_TransmitXY_var._position_relative_is_zero =  coords_test_zero(_H511_mirror_TransmitXY_var._position_relative);
  instrument->counter_N[261]  = instrument->counter_P[261] = instrument->counter_P2[261] = 0;
  instrument->counter_AbsorbProp[261]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0260_H511_mirror_TransmitXY", _H511_mirror_TransmitXY_var._position_absolute, _H511_mirror_TransmitXY_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "xwidth", "0", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "yheight", "0", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "options", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0260_H511_mirror_TransmitXY", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H511_mirror_TransmitXY_setpos */

/* component H511_mirror_outdXY=Monitor_nD() SETTING, POSITION/ROTATION */
int _H511_mirror_outdXY_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H511_mirror_outdXY_setpos] component H511_mirror_outdXY=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H511_mirror_outdXY_var._name, "H511_mirror_outdXY", 16384);
  stracpy(_H511_mirror_outdXY_var._type, "Monitor_nD", 16384);
  _H511_mirror_outdXY_var._index=262;
  int current_setpos_index = 262;
  if("" && strlen(""))
    stracpy(_H511_mirror_outdXY_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H511_mirror_outdXY_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H511_mirror_outdXY_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H511_mirror_outdXY_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H511_mirror_outdXY_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H511_mirror_outdXY_var._parameters.user3[0]='\0';
  _H511_mirror_outdXY_var._parameters.xwidth = 0.04;
  _H511_mirror_outdXY_var._parameters.yheight = 0.055;
  _H511_mirror_outdXY_var._parameters.zdepth = 0;
  _H511_mirror_outdXY_var._parameters.xmin = 0;
  _H511_mirror_outdXY_var._parameters.xmax = 0;
  _H511_mirror_outdXY_var._parameters.ymin = 0;
  _H511_mirror_outdXY_var._parameters.ymax = 0;
  _H511_mirror_outdXY_var._parameters.zmin = 0;
  _H511_mirror_outdXY_var._parameters.zmax = 0;
  _H511_mirror_outdXY_var._parameters.bins = 50;
  _H511_mirror_outdXY_var._parameters.min = -1e40;
  _H511_mirror_outdXY_var._parameters.max = 1e40;
  _H511_mirror_outdXY_var._parameters.restore_neutron = 1;
  _H511_mirror_outdXY_var._parameters.radius = 0;
  if("dx limits=[-2 2], dy limits=[-2 2]" && strlen("dx limits=[-2 2], dy limits=[-2 2]"))
    stracpy(_H511_mirror_outdXY_var._parameters.options, "dx limits=[-2 2], dy limits=[-2 2]" ? "dx limits=[-2 2], dy limits=[-2 2]" : "", 16384);
  else 
  _H511_mirror_outdXY_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_mirror_outdXY_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_mirror_outdXY_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_mirror_outdXY_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_mirror_outdXY_var._parameters.geometry[0]='\0';
  _H511_mirror_outdXY_var._parameters.nowritefile = 0;
  _H511_mirror_outdXY_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H511_mirror_outdXY_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_mirror_outdXY_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_mirror_outdXY_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_mirror_outdXY_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_mirror_outdXY_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_mirror_outdXY_var._parameters.username3[0]='\0';


  /* component H511_mirror_outdXY=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H511_mirror_ReflectXY_var._rotation_absolute, _H511_mirror_outdXY_var._rotation_absolute);
    rot_transpose(_H511_mirror_TransmitXY_var._rotation_absolute, tr1);
    rot_mul(_H511_mirror_outdXY_var._rotation_absolute, tr1, _H511_mirror_outdXY_var._rotation_relative);
    _H511_mirror_outdXY_var._rotation_is_identity =  rot_test_identity(_H511_mirror_outdXY_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H511_mirror_ReflectXY_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H511_mirror_outdXY_var._position_absolute = coords_add(_H511_mirror_ReflectXY_var._position_absolute, tc2);
    tc1 = coords_sub(_H511_mirror_TransmitXY_var._position_absolute, _H511_mirror_outdXY_var._position_absolute);
    _H511_mirror_outdXY_var._position_relative = rot_apply(_H511_mirror_outdXY_var._rotation_absolute, tc1);
  } /* H511_mirror_outdXY=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H511_mirror_outdXY", _H511_mirror_outdXY_var._position_absolute, _H511_mirror_outdXY_var._rotation_absolute);
  instrument->_position_absolute[262] = _H511_mirror_outdXY_var._position_absolute;
  instrument->_position_relative[262] = _H511_mirror_outdXY_var._position_relative;
    _H511_mirror_outdXY_var._position_relative_is_zero =  coords_test_zero(_H511_mirror_outdXY_var._position_relative);
  instrument->counter_N[262]  = instrument->counter_P[262] = instrument->counter_P2[262] = 0;
  instrument->counter_AbsorbProp[262]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0261_H511_mirror_outdXY", _H511_mirror_outdXY_var._position_absolute, _H511_mirror_outdXY_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "xwidth", "0", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "yheight", "0", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "options", "NULL", "dx limits=[-2 2], dy limits=[-2 2]", "char*");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0261_H511_mirror_outdXY", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H511_mirror_outdXY_setpos */

/* component H511_S3=Guide_gravity() SETTING, POSITION/ROTATION */
int _H511_S3_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H511_S3_setpos] component H511_S3=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H511_S3_var._name, "H511_S3", 16384);
  stracpy(_H511_S3_var._type, "Guide_gravity", 16384);
  _H511_S3_var._index=263;
  int current_setpos_index = 263;
  _H511_S3_var._parameters.w1 = 0.04;
  _H511_S3_var._parameters.h1 = 0.055;
  _H511_S3_var._parameters.w2 = 0;
  _H511_S3_var._parameters.h2 = 0;
  _H511_S3_var._parameters.l = 3;
  _H511_S3_var._parameters.R0 = gR0;
  _H511_S3_var._parameters.Qc = gQc;
  _H511_S3_var._parameters.alpha = gAlpha;
  _H511_S3_var._parameters.m = 1.2;
  _H511_S3_var._parameters.W = gW;
  _H511_S3_var._parameters.nslit = 1;
  _H511_S3_var._parameters.d = 0.0005;
  _H511_S3_var._parameters.mleft = -1;
  _H511_S3_var._parameters.mright = -1;
  _H511_S3_var._parameters.mtop = -1;
  _H511_S3_var._parameters.mbottom = -1;
  _H511_S3_var._parameters.nhslit = 1;
  _H511_S3_var._parameters.G = 0;
  _H511_S3_var._parameters.aleft = -1;
  _H511_S3_var._parameters.aright = -1;
  _H511_S3_var._parameters.atop = -1;
  _H511_S3_var._parameters.abottom = -1;
  _H511_S3_var._parameters.wavy = 0;
  _H511_S3_var._parameters.wavy_z = 0;
  _H511_S3_var._parameters.wavy_tb = 0;
  _H511_S3_var._parameters.wavy_lr = 0;
  _H511_S3_var._parameters.chamfers = 0;
  _H511_S3_var._parameters.chamfers_z = 0;
  _H511_S3_var._parameters.chamfers_lr = 0;
  _H511_S3_var._parameters.chamfers_tb = 0;
  _H511_S3_var._parameters.nelements = 2;
  _H511_S3_var._parameters.nu = 0;
  _H511_S3_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H511_S3_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_S3_var._parameters.reflect[0]='\0';


  /* component H511_S3=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H511_mirror_outdir_var._rotation_absolute, _H511_S3_var._rotation_absolute);
    rot_transpose(_H511_mirror_outdXY_var._rotation_absolute, tr1);
    rot_mul(_H511_S3_var._rotation_absolute, tr1, _H511_S3_var._rotation_relative);
    _H511_S3_var._rotation_is_identity =  rot_test_identity(_H511_S3_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.755);
    rot_transpose(_H511_mirror_outdir_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H511_S3_var._position_absolute = coords_add(_H511_mirror_outdir_var._position_absolute, tc2);
    tc1 = coords_sub(_H511_mirror_outdXY_var._position_absolute, _H511_S3_var._position_absolute);
    _H511_S3_var._position_relative = rot_apply(_H511_S3_var._rotation_absolute, tc1);
  } /* H511_S3=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H511_S3", _H511_S3_var._position_absolute, _H511_S3_var._rotation_absolute);
  instrument->_position_absolute[263] = _H511_S3_var._position_absolute;
  instrument->_position_relative[263] = _H511_S3_var._position_relative;
    _H511_S3_var._position_relative_is_zero =  coords_test_zero(_H511_S3_var._position_relative);
  instrument->counter_N[263]  = instrument->counter_P[263] = instrument->counter_P2[263] = 0;
  instrument->counter_AbsorbProp[263]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0262_H511_S3", _H511_S3_var._position_absolute, _H511_S3_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "l", "NONE", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "nelements", "1", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0262_H511_S3", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H511_S3_setpos */

/* component H511_S9=Guide_gravity() SETTING, POSITION/ROTATION */
int _H511_S9_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H511_S9_setpos] component H511_S9=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H511_S9_var._name, "H511_S9", 16384);
  stracpy(_H511_S9_var._type, "Guide_gravity", 16384);
  _H511_S9_var._index=264;
  int current_setpos_index = 264;
  _H511_S9_var._parameters.w1 = 0.04;
  _H511_S9_var._parameters.h1 = 0.055;
  _H511_S9_var._parameters.w2 = 0;
  _H511_S9_var._parameters.h2 = 0;
  _H511_S9_var._parameters.l = 16.483 -0.05;
  _H511_S9_var._parameters.R0 = gR0;
  _H511_S9_var._parameters.Qc = gQc;
  _H511_S9_var._parameters.alpha = gAlpha;
  _H511_S9_var._parameters.m = 1;
  _H511_S9_var._parameters.W = gW;
  _H511_S9_var._parameters.nslit = 1;
  _H511_S9_var._parameters.d = 0.0005;
  _H511_S9_var._parameters.mleft = -1;
  _H511_S9_var._parameters.mright = -1;
  _H511_S9_var._parameters.mtop = -1;
  _H511_S9_var._parameters.mbottom = -1;
  _H511_S9_var._parameters.nhslit = 1;
  _H511_S9_var._parameters.G = 0;
  _H511_S9_var._parameters.aleft = -1;
  _H511_S9_var._parameters.aright = -1;
  _H511_S9_var._parameters.atop = -1;
  _H511_S9_var._parameters.abottom = -1;
  _H511_S9_var._parameters.wavy = 0;
  _H511_S9_var._parameters.wavy_z = 0;
  _H511_S9_var._parameters.wavy_tb = 0;
  _H511_S9_var._parameters.wavy_lr = 0;
  _H511_S9_var._parameters.chamfers = 0;
  _H511_S9_var._parameters.chamfers_z = 0;
  _H511_S9_var._parameters.chamfers_lr = 0;
  _H511_S9_var._parameters.chamfers_tb = 0;
  _H511_S9_var._parameters.nelements = 13;
  _H511_S9_var._parameters.nu = 0;
  _H511_S9_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H511_S9_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_S9_var._parameters.reflect[0]='\0';


  /* component H511_S9=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H511_S3_var._rotation_absolute, _H511_S9_var._rotation_absolute);
    rot_transpose(_H511_S3_var._rotation_absolute, tr1);
    rot_mul(_H511_S9_var._rotation_absolute, tr1, _H511_S9_var._rotation_relative);
    _H511_S9_var._rotation_is_identity =  rot_test_identity(_H511_S9_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 3.005);
    rot_transpose(_H511_S3_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H511_S9_var._position_absolute = coords_add(_H511_S3_var._position_absolute, tc2);
    tc1 = coords_sub(_H511_S3_var._position_absolute, _H511_S9_var._position_absolute);
    _H511_S9_var._position_relative = rot_apply(_H511_S9_var._rotation_absolute, tc1);
  } /* H511_S9=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H511_S9", _H511_S9_var._position_absolute, _H511_S9_var._rotation_absolute);
  instrument->_position_absolute[264] = _H511_S9_var._position_absolute;
  instrument->_position_relative[264] = _H511_S9_var._position_relative;
    _H511_S9_var._position_relative_is_zero =  coords_test_zero(_H511_S9_var._position_relative);
  instrument->counter_N[264]  = instrument->counter_P[264] = instrument->counter_P2[264] = 0;
  instrument->counter_AbsorbProp[264]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0263_H511_S9", _H511_S9_var._position_absolute, _H511_S9_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "l", "NONE", "16.483 -0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "m", "1.0", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "nelements", "1", "13","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0263_H511_S9", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H511_S9_setpos */

/* component HCS_Al_265=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_265_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_265_setpos] component HCS_Al_265=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_265_var._name, "HCS_Al_265", 16384);
  stracpy(_HCS_Al_265_var._type, "PowderN", 16384);
  _HCS_Al_265_var._index=265;
  int current_setpos_index = 265;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_265_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_265_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_265_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_265_var._parameters.geometry[0]='\0';
  _HCS_Al_265_var._parameters.format[0] = 0;
  _HCS_Al_265_var._parameters.format[1] = 0;
  _HCS_Al_265_var._parameters.format[2] = 0;
  _HCS_Al_265_var._parameters.format[3] = 0;
  _HCS_Al_265_var._parameters.format[4] = 0;
  _HCS_Al_265_var._parameters.format[5] = 0;
  _HCS_Al_265_var._parameters.format[6] = 0;
  _HCS_Al_265_var._parameters.format[7] = 0;
  _HCS_Al_265_var._parameters.format[8] = 0;
  _HCS_Al_265_var._parameters.radius = 0;
  _HCS_Al_265_var._parameters.yheight = 0.12;
  _HCS_Al_265_var._parameters.xwidth = 0.04;
  _HCS_Al_265_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_265_var._parameters.thickness = 0;
  _HCS_Al_265_var._parameters.pack = 1;
  _HCS_Al_265_var._parameters.Vc = 0;
  _HCS_Al_265_var._parameters.sigma_abs = 0;
  _HCS_Al_265_var._parameters.sigma_inc = 0;
  _HCS_Al_265_var._parameters.delta_d_d = 0;
  _HCS_Al_265_var._parameters.p_inc = 0.005;
  _HCS_Al_265_var._parameters.p_transmit = 0.9450;
  _HCS_Al_265_var._parameters.DW = 0;
  _HCS_Al_265_var._parameters.nb_atoms = 1;
  _HCS_Al_265_var._parameters.d_omega = 0;
  _HCS_Al_265_var._parameters.d_phi = 10;
  _HCS_Al_265_var._parameters.tth_sign = 0;
  _HCS_Al_265_var._parameters.p_interact = 0.05;
  _HCS_Al_265_var._parameters.concentric = 0;
  _HCS_Al_265_var._parameters.density = 0;
  _HCS_Al_265_var._parameters.weight = 0;
  _HCS_Al_265_var._parameters.barns = 1;
  _HCS_Al_265_var._parameters.Strain = 0;
  _HCS_Al_265_var._parameters.focus_flip = 0;
  _HCS_Al_265_var._parameters.target_index = 0;
  _HCS_Al_265_var._parameters.order = 1;


  /* component HCS_Al_265=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H511_S9_var._rotation_absolute, _HCS_Al_265_var._rotation_absolute);
    rot_transpose(_H511_S9_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_265_var._rotation_absolute, tr1, _HCS_Al_265_var._rotation_relative);
    _HCS_Al_265_var._rotation_is_identity =  rot_test_identity(_HCS_Al_265_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 16.483 + 0.001 -0.05);
    rot_transpose(_H511_S9_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_265_var._position_absolute = coords_add(_H511_S9_var._position_absolute, tc2);
    tc1 = coords_sub(_H511_S9_var._position_absolute, _HCS_Al_265_var._position_absolute);
    _HCS_Al_265_var._position_relative = rot_apply(_HCS_Al_265_var._rotation_absolute, tc1);
  } /* HCS_Al_265=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_265", _HCS_Al_265_var._position_absolute, _HCS_Al_265_var._rotation_absolute);
  instrument->_position_absolute[265] = _HCS_Al_265_var._position_absolute;
  instrument->_position_relative[265] = _HCS_Al_265_var._position_relative;
    _HCS_Al_265_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_265_var._position_relative);
  instrument->counter_N[265]  = instrument->counter_P[265] = instrument->counter_P2[265] = 0;
  instrument->counter_AbsorbProp[265]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0264_HCS_Al_265", _HCS_Al_265_var._position_absolute, _HCS_Al_265_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "xwidth", "0", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0264_HCS_Al_265", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_265_setpos */

/* component H511_VTE=Monitor_nD() SETTING, POSITION/ROTATION */
int _H511_VTE_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H511_VTE_setpos] component H511_VTE=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H511_VTE_var._name, "H511_VTE", 16384);
  stracpy(_H511_VTE_var._type, "Monitor_nD", 16384);
  _H511_VTE_var._index=266;
  int current_setpos_index = 266;
  if("" && strlen(""))
    stracpy(_H511_VTE_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H511_VTE_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H511_VTE_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H511_VTE_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H511_VTE_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H511_VTE_var._parameters.user3[0]='\0';
  _H511_VTE_var._parameters.xwidth = 0.06;
  _H511_VTE_var._parameters.yheight = 0.12;
  _H511_VTE_var._parameters.zdepth = 0;
  _H511_VTE_var._parameters.xmin = 0;
  _H511_VTE_var._parameters.xmax = 0;
  _H511_VTE_var._parameters.ymin = 0;
  _H511_VTE_var._parameters.ymax = 0;
  _H511_VTE_var._parameters.zmin = 0;
  _H511_VTE_var._parameters.zmax = 0;
  _H511_VTE_var._parameters.bins = 50;
  _H511_VTE_var._parameters.min = -1e40;
  _H511_VTE_var._parameters.max = 1e40;
  _H511_VTE_var._parameters.restore_neutron = 1;
  _H511_VTE_var._parameters.radius = 0;
  if("x y, slit" && strlen("x y, slit"))
    stracpy(_H511_VTE_var._parameters.options, "x y, slit" ? "x y, slit" : "", 16384);
  else 
  _H511_VTE_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_VTE_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_VTE_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_VTE_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_VTE_var._parameters.geometry[0]='\0';
  _H511_VTE_var._parameters.nowritefile = 0;
  _H511_VTE_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H511_VTE_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_VTE_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_VTE_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_VTE_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_VTE_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_VTE_var._parameters.username3[0]='\0';


  /* component H511_VTE=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_265_var._rotation_absolute, _H511_VTE_var._rotation_absolute);
    rot_transpose(_HCS_Al_265_var._rotation_absolute, tr1);
    rot_mul(_H511_VTE_var._rotation_absolute, tr1, _H511_VTE_var._rotation_relative);
    _H511_VTE_var._rotation_is_identity =  rot_test_identity(_H511_VTE_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.108 / 2 -0.001);
    rot_transpose(_HCS_Al_265_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H511_VTE_var._position_absolute = coords_add(_HCS_Al_265_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_265_var._position_absolute, _H511_VTE_var._position_absolute);
    _H511_VTE_var._position_relative = rot_apply(_H511_VTE_var._rotation_absolute, tc1);
  } /* H511_VTE=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H511_VTE", _H511_VTE_var._position_absolute, _H511_VTE_var._rotation_absolute);
  instrument->_position_absolute[266] = _H511_VTE_var._position_absolute;
  instrument->_position_relative[266] = _H511_VTE_var._position_relative;
    _H511_VTE_var._position_relative_is_zero =  coords_test_zero(_H511_VTE_var._position_relative);
  instrument->counter_N[266]  = instrument->counter_P[266] = instrument->counter_P2[266] = 0;
  instrument->counter_AbsorbProp[266]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0265_H511_VTE", _H511_VTE_var._position_absolute, _H511_VTE_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "options", "NULL", "x y, slit", "char*");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0265_H511_VTE", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H511_VTE_setpos */

/* component HCS_Al_267=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_267_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_267_setpos] component HCS_Al_267=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_267_var._name, "HCS_Al_267", 16384);
  stracpy(_HCS_Al_267_var._type, "PowderN", 16384);
  _HCS_Al_267_var._index=267;
  int current_setpos_index = 267;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_267_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_267_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_267_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_267_var._parameters.geometry[0]='\0';
  _HCS_Al_267_var._parameters.format[0] = 0;
  _HCS_Al_267_var._parameters.format[1] = 0;
  _HCS_Al_267_var._parameters.format[2] = 0;
  _HCS_Al_267_var._parameters.format[3] = 0;
  _HCS_Al_267_var._parameters.format[4] = 0;
  _HCS_Al_267_var._parameters.format[5] = 0;
  _HCS_Al_267_var._parameters.format[6] = 0;
  _HCS_Al_267_var._parameters.format[7] = 0;
  _HCS_Al_267_var._parameters.format[8] = 0;
  _HCS_Al_267_var._parameters.radius = 0;
  _HCS_Al_267_var._parameters.yheight = 0.12;
  _HCS_Al_267_var._parameters.xwidth = 0.04;
  _HCS_Al_267_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_267_var._parameters.thickness = 0.002;
  _HCS_Al_267_var._parameters.pack = 1;
  _HCS_Al_267_var._parameters.Vc = 0;
  _HCS_Al_267_var._parameters.sigma_abs = 0;
  _HCS_Al_267_var._parameters.sigma_inc = 0;
  _HCS_Al_267_var._parameters.delta_d_d = 0;
  _HCS_Al_267_var._parameters.p_inc = 0.005;
  _HCS_Al_267_var._parameters.p_transmit = 0.9450;
  _HCS_Al_267_var._parameters.DW = 0;
  _HCS_Al_267_var._parameters.nb_atoms = 1;
  _HCS_Al_267_var._parameters.d_omega = 0;
  _HCS_Al_267_var._parameters.d_phi = 10;
  _HCS_Al_267_var._parameters.tth_sign = 0;
  _HCS_Al_267_var._parameters.p_interact = 0.05;
  _HCS_Al_267_var._parameters.concentric = 0;
  _HCS_Al_267_var._parameters.density = 0;
  _HCS_Al_267_var._parameters.weight = 0;
  _HCS_Al_267_var._parameters.barns = 1;
  _HCS_Al_267_var._parameters.Strain = 0;
  _HCS_Al_267_var._parameters.focus_flip = 0;
  _HCS_Al_267_var._parameters.target_index = 0;
  _HCS_Al_267_var._parameters.order = 1;


  /* component HCS_Al_267=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H511_VTE_var._rotation_absolute, _HCS_Al_267_var._rotation_absolute);
    rot_transpose(_H511_VTE_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_267_var._rotation_absolute, tr1, _HCS_Al_267_var._rotation_relative);
    _HCS_Al_267_var._rotation_is_identity =  rot_test_identity(_HCS_Al_267_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.108 / 2 -0.05);
    rot_transpose(_H511_VTE_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_267_var._position_absolute = coords_add(_H511_VTE_var._position_absolute, tc2);
    tc1 = coords_sub(_H511_VTE_var._position_absolute, _HCS_Al_267_var._position_absolute);
    _HCS_Al_267_var._position_relative = rot_apply(_HCS_Al_267_var._rotation_absolute, tc1);
  } /* HCS_Al_267=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_267", _HCS_Al_267_var._position_absolute, _HCS_Al_267_var._rotation_absolute);
  instrument->_position_absolute[267] = _HCS_Al_267_var._position_absolute;
  instrument->_position_relative[267] = _HCS_Al_267_var._position_relative;
    _HCS_Al_267_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_267_var._position_relative);
  instrument->counter_N[267]  = instrument->counter_P[267] = instrument->counter_P2[267] = 0;
  instrument->counter_AbsorbProp[267]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0266_HCS_Al_267", _HCS_Al_267_var._position_absolute, _HCS_Al_267_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "xwidth", "0", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "thickness", "0", "0.002","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0266_HCS_Al_267", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_267_setpos */

/* component H511_S10=Guide_gravity() SETTING, POSITION/ROTATION */
int _H511_S10_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H511_S10_setpos] component H511_S10=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H511_S10_var._name, "H511_S10", 16384);
  stracpy(_H511_S10_var._type, "Guide_gravity", 16384);
  _H511_S10_var._index=268;
  int current_setpos_index = 268;
  _H511_S10_var._parameters.w1 = 0.04;
  _H511_S10_var._parameters.h1 = 0.055;
  _H511_S10_var._parameters.w2 = 0;
  _H511_S10_var._parameters.h2 = 0;
  _H511_S10_var._parameters.l = 1;
  _H511_S10_var._parameters.R0 = gR0;
  _H511_S10_var._parameters.Qc = gQc;
  _H511_S10_var._parameters.alpha = gAlpha;
  _H511_S10_var._parameters.m = 1;
  _H511_S10_var._parameters.W = gW;
  _H511_S10_var._parameters.nslit = 1;
  _H511_S10_var._parameters.d = 0.0005;
  _H511_S10_var._parameters.mleft = -1;
  _H511_S10_var._parameters.mright = -1;
  _H511_S10_var._parameters.mtop = -1;
  _H511_S10_var._parameters.mbottom = -1;
  _H511_S10_var._parameters.nhslit = 1;
  _H511_S10_var._parameters.G = 0;
  _H511_S10_var._parameters.aleft = -1;
  _H511_S10_var._parameters.aright = -1;
  _H511_S10_var._parameters.atop = -1;
  _H511_S10_var._parameters.abottom = -1;
  _H511_S10_var._parameters.wavy = 0;
  _H511_S10_var._parameters.wavy_z = 0;
  _H511_S10_var._parameters.wavy_tb = 0;
  _H511_S10_var._parameters.wavy_lr = 0;
  _H511_S10_var._parameters.chamfers = 0;
  _H511_S10_var._parameters.chamfers_z = 0;
  _H511_S10_var._parameters.chamfers_lr = 0;
  _H511_S10_var._parameters.chamfers_tb = 0;
  _H511_S10_var._parameters.nelements = 1;
  _H511_S10_var._parameters.nu = 0;
  _H511_S10_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H511_S10_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_S10_var._parameters.reflect[0]='\0';


  /* component H511_S10=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_267_var._rotation_absolute, _H511_S10_var._rotation_absolute);
    rot_transpose(_HCS_Al_267_var._rotation_absolute, tr1);
    rot_mul(_H511_S10_var._rotation_absolute, tr1, _H511_S10_var._rotation_relative);
    _H511_S10_var._rotation_is_identity =  rot_test_identity(_H511_S10_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.05);
    rot_transpose(_HCS_Al_267_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H511_S10_var._position_absolute = coords_add(_HCS_Al_267_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_267_var._position_absolute, _H511_S10_var._position_absolute);
    _H511_S10_var._position_relative = rot_apply(_H511_S10_var._rotation_absolute, tc1);
  } /* H511_S10=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H511_S10", _H511_S10_var._position_absolute, _H511_S10_var._rotation_absolute);
  instrument->_position_absolute[268] = _H511_S10_var._position_absolute;
  instrument->_position_relative[268] = _H511_S10_var._position_relative;
    _H511_S10_var._position_relative_is_zero =  coords_test_zero(_H511_S10_var._position_relative);
  instrument->counter_N[268]  = instrument->counter_P[268] = instrument->counter_P2[268] = 0;
  instrument->counter_AbsorbProp[268]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0267_H511_S10", _H511_S10_var._position_absolute, _H511_S10_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "l", "NONE", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "m", "1.0", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0267_H511_S10", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H511_S10_setpos */

/* component IN15_Vselector=V_selector() SETTING, POSITION/ROTATION */
int _IN15_Vselector_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_IN15_Vselector_setpos] component IN15_Vselector=V_selector() SETTING [V_selector:0]");
  stracpy(_IN15_Vselector_var._name, "IN15_Vselector", 16384);
  stracpy(_IN15_Vselector_var._type, "V_selector", 16384);
  _IN15_Vselector_var._index=269;
  int current_setpos_index = 269;
  _IN15_Vselector_var._parameters.xwidth = 0.04;
  _IN15_Vselector_var._parameters.yheight = 0.055;
  _IN15_Vselector_var._parameters.zdepth = 0.30;
  _IN15_Vselector_var._parameters.radius = 0.12;
  _IN15_Vselector_var._parameters.alpha = 64.4;
  _IN15_Vselector_var._parameters.length = 0.25;
  _IN15_Vselector_var._parameters.d = 0.0004;
  _IN15_Vselector_var._parameters.nu = IN15_nu;
  _IN15_Vselector_var._parameters.nslit = 36;


  /* component IN15_Vselector=V_selector() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H511_S10_var._rotation_absolute, _IN15_Vselector_var._rotation_absolute);
    rot_transpose(_H511_S10_var._rotation_absolute, tr1);
    rot_mul(_IN15_Vselector_var._rotation_absolute, tr1, _IN15_Vselector_var._rotation_relative);
    _IN15_Vselector_var._rotation_is_identity =  rot_test_identity(_IN15_Vselector_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 1 + 0.3);
    rot_transpose(_H511_S10_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _IN15_Vselector_var._position_absolute = coords_add(_H511_S10_var._position_absolute, tc2);
    tc1 = coords_sub(_H511_S10_var._position_absolute, _IN15_Vselector_var._position_absolute);
    _IN15_Vselector_var._position_relative = rot_apply(_IN15_Vselector_var._rotation_absolute, tc1);
  } /* IN15_Vselector=V_selector() AT ROTATED */
  DEBUG_COMPONENT("IN15_Vselector", _IN15_Vselector_var._position_absolute, _IN15_Vselector_var._rotation_absolute);
  instrument->_position_absolute[269] = _IN15_Vselector_var._position_absolute;
  instrument->_position_relative[269] = _IN15_Vselector_var._position_relative;
    _IN15_Vselector_var._position_relative_is_zero =  coords_test_zero(_IN15_Vselector_var._position_relative);
  instrument->counter_N[269]  = instrument->counter_P[269] = instrument->counter_P2[269] = 0;
  instrument->counter_AbsorbProp[269]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0268_IN15_Vselector", _IN15_Vselector_var._position_absolute, _IN15_Vselector_var._rotation_absolute, "V_selector");
        mccomp_param_nexus(nxhandle,"0268_IN15_Vselector", "xwidth", "0.03", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0268_IN15_Vselector", "yheight", "0.05", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0268_IN15_Vselector", "zdepth", "0.30", "0.30","MCNUM");
        mccomp_param_nexus(nxhandle,"0268_IN15_Vselector", "radius", "0.12", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0268_IN15_Vselector", "alpha", "48.298", "64.4","MCNUM");
        mccomp_param_nexus(nxhandle,"0268_IN15_Vselector", "length", "0.25", "0.25","MCNUM");
        mccomp_param_nexus(nxhandle,"0268_IN15_Vselector", "d", "0.0004", "0.0004","MCNUM");
        mccomp_param_nexus(nxhandle,"0268_IN15_Vselector", "nu", "300", "IN15_nu","MCNUM");
        mccomp_param_nexus(nxhandle,"0268_IN15_Vselector", "nslit", "72", "36","MCNUM");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _IN15_Vselector_setpos */

/* component H511_BeforeV=Guide_gravity() SETTING, POSITION/ROTATION */
int _H511_BeforeV_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H511_BeforeV_setpos] component H511_BeforeV=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H511_BeforeV_var._name, "H511_BeforeV", 16384);
  stracpy(_H511_BeforeV_var._type, "Guide_gravity", 16384);
  _H511_BeforeV_var._index=270;
  int current_setpos_index = 270;
  _H511_BeforeV_var._parameters.w1 = 0.04;
  _H511_BeforeV_var._parameters.h1 = 0.055;
  _H511_BeforeV_var._parameters.w2 = 0;
  _H511_BeforeV_var._parameters.h2 = 0;
  _H511_BeforeV_var._parameters.l = 9.5;
  _H511_BeforeV_var._parameters.R0 = gR0;
  _H511_BeforeV_var._parameters.Qc = gQc;
  _H511_BeforeV_var._parameters.alpha = gAlpha;
  _H511_BeforeV_var._parameters.m = 1;
  _H511_BeforeV_var._parameters.W = gW;
  _H511_BeforeV_var._parameters.nslit = 1;
  _H511_BeforeV_var._parameters.d = 0.0005;
  _H511_BeforeV_var._parameters.mleft = -1;
  _H511_BeforeV_var._parameters.mright = -1;
  _H511_BeforeV_var._parameters.mtop = -1;
  _H511_BeforeV_var._parameters.mbottom = -1;
  _H511_BeforeV_var._parameters.nhslit = 1;
  _H511_BeforeV_var._parameters.G = 0;
  _H511_BeforeV_var._parameters.aleft = -1;
  _H511_BeforeV_var._parameters.aright = -1;
  _H511_BeforeV_var._parameters.atop = -1;
  _H511_BeforeV_var._parameters.abottom = -1;
  _H511_BeforeV_var._parameters.wavy = 0;
  _H511_BeforeV_var._parameters.wavy_z = 0;
  _H511_BeforeV_var._parameters.wavy_tb = 0;
  _H511_BeforeV_var._parameters.wavy_lr = 0;
  _H511_BeforeV_var._parameters.chamfers = 0;
  _H511_BeforeV_var._parameters.chamfers_z = 0;
  _H511_BeforeV_var._parameters.chamfers_lr = 0;
  _H511_BeforeV_var._parameters.chamfers_tb = 0;
  _H511_BeforeV_var._parameters.nelements = 6;
  _H511_BeforeV_var._parameters.nu = 0;
  _H511_BeforeV_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H511_BeforeV_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_BeforeV_var._parameters.reflect[0]='\0';


  /* component H511_BeforeV=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _IN15_Vselector_var._rotation_absolute, _H511_BeforeV_var._rotation_absolute);
    rot_transpose(_IN15_Vselector_var._rotation_absolute, tr1);
    rot_mul(_H511_BeforeV_var._rotation_absolute, tr1, _H511_BeforeV_var._rotation_relative);
    _H511_BeforeV_var._rotation_is_identity =  rot_test_identity(_H511_BeforeV_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.3);
    rot_transpose(_IN15_Vselector_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H511_BeforeV_var._position_absolute = coords_add(_IN15_Vselector_var._position_absolute, tc2);
    tc1 = coords_sub(_IN15_Vselector_var._position_absolute, _H511_BeforeV_var._position_absolute);
    _H511_BeforeV_var._position_relative = rot_apply(_H511_BeforeV_var._rotation_absolute, tc1);
  } /* H511_BeforeV=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H511_BeforeV", _H511_BeforeV_var._position_absolute, _H511_BeforeV_var._rotation_absolute);
  instrument->_position_absolute[270] = _H511_BeforeV_var._position_absolute;
  instrument->_position_relative[270] = _H511_BeforeV_var._position_relative;
    _H511_BeforeV_var._position_relative_is_zero =  coords_test_zero(_H511_BeforeV_var._position_relative);
  instrument->counter_N[270]  = instrument->counter_P[270] = instrument->counter_P2[270] = 0;
  instrument->counter_AbsorbProp[270]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0269_H511_BeforeV", _H511_BeforeV_var._position_absolute, _H511_BeforeV_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "l", "NONE", "9.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "m", "1.0", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "nelements", "1", "6","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0269_H511_BeforeV", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H511_BeforeV_setpos */

/* component IN15_Vpolariser=Pol_guide_vmirror() SETTING, POSITION/ROTATION */
int _IN15_Vpolariser_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_IN15_Vpolariser_setpos] component IN15_Vpolariser=Pol_guide_vmirror() SETTING [Pol_guide_vmirror:0]");
  stracpy(_IN15_Vpolariser_var._name, "IN15_Vpolariser", 16384);
  stracpy(_IN15_Vpolariser_var._type, "Pol_guide_vmirror", 16384);
  _IN15_Vpolariser_var._index=271;
  int current_setpos_index = 271;
  _IN15_Vpolariser_var._parameters.nvs = 1;
  _IN15_Vpolariser_var._parameters.xwidth = 0.04;
  _IN15_Vpolariser_var._parameters.yheight = 0.055;
  _IN15_Vpolariser_var._parameters.length = 0.43;
  _IN15_Vpolariser_var._parameters.rR0 = 1.0;
  _IN15_Vpolariser_var._parameters.rQc = 0.0217;
  _IN15_Vpolariser_var._parameters.ralpha = 6.5;
  _IN15_Vpolariser_var._parameters.rmSM = 2;
  _IN15_Vpolariser_var._parameters.rW = 0.00157;
  _IN15_Vpolariser_var._parameters.rbeta = 80;
  _IN15_Vpolariser_var._parameters.rUpR0 = 1.0;
  _IN15_Vpolariser_var._parameters.rUpQc = 0.0217;
  _IN15_Vpolariser_var._parameters.rUpalpha = 2.47;
  _IN15_Vpolariser_var._parameters.rUpmSM = 4;
  _IN15_Vpolariser_var._parameters.rUpW = 0.0014;
  _IN15_Vpolariser_var._parameters.rUpbeta = 0;
  _IN15_Vpolariser_var._parameters.rDownR0 = 1.0;
  _IN15_Vpolariser_var._parameters.rDownQc = 0.0217;
  _IN15_Vpolariser_var._parameters.rDownalpha = 1;
  _IN15_Vpolariser_var._parameters.rDownmSM = 0.65;
  _IN15_Vpolariser_var._parameters.rDownW = 0.003;
  _IN15_Vpolariser_var._parameters.rDownbeta = 0;
  _IN15_Vpolariser_var._parameters.debug = 0;
  _IN15_Vpolariser_var._parameters.allow_inside_start = 0;
  _IN15_Vpolariser_var._parameters.rPar[0] = 1;
  _IN15_Vpolariser_var._parameters.rPar[1] = 1;
  _IN15_Vpolariser_var._parameters.rPar[2] = 0;
  _IN15_Vpolariser_var._parameters.rPar[3] = 0.0219;
  _IN15_Vpolariser_var._parameters.rPar[4] = 4.07;
  _IN15_Vpolariser_var._parameters.rPar[5] = 1;
  _IN15_Vpolariser_var._parameters.rPar[6] = 0.003;
  _IN15_Vpolariser_var._parameters.rUpPar[0] = 1;
  _IN15_Vpolariser_var._parameters.rUpPar[1] = 3.2;
  _IN15_Vpolariser_var._parameters.rUpPar[2] = 0;
  _IN15_Vpolariser_var._parameters.rUpPar[3] = 0.0219;
  _IN15_Vpolariser_var._parameters.rUpPar[4] = 4.07;
  _IN15_Vpolariser_var._parameters.rUpPar[5] = 1;
  _IN15_Vpolariser_var._parameters.rUpPar[6] = 0.003;
  _IN15_Vpolariser_var._parameters.rDownPar[0] = 1;
  _IN15_Vpolariser_var._parameters.rDownPar[1] = 0.4;
  _IN15_Vpolariser_var._parameters.rDownPar[2] = 0;
  _IN15_Vpolariser_var._parameters.rDownPar[3] = 0.0219;
  _IN15_Vpolariser_var._parameters.rDownPar[4] = 4.07;
  _IN15_Vpolariser_var._parameters.rDownPar[5] = 1;
  _IN15_Vpolariser_var._parameters.rDownPar[6] = 0.003;
  if("" && strlen(""))
    stracpy(_IN15_Vpolariser_var._parameters.rParFile, "" ? "" : "", 16384);
  else 
  _IN15_Vpolariser_var._parameters.rParFile[0]='\0';
  if("" && strlen(""))
    stracpy(_IN15_Vpolariser_var._parameters.rUpParFile, "" ? "" : "", 16384);
  else 
  _IN15_Vpolariser_var._parameters.rUpParFile[0]='\0';
  if("" && strlen(""))
    stracpy(_IN15_Vpolariser_var._parameters.rDownParFile, "" ? "" : "", 16384);
  else 
  _IN15_Vpolariser_var._parameters.rDownParFile[0]='\0';
  _IN15_Vpolariser_var._parameters.inputType = 0;


  /* component IN15_Vpolariser=Pol_guide_vmirror() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H511_BeforeV_var._rotation_absolute, _IN15_Vpolariser_var._rotation_absolute);
    rot_transpose(_H511_BeforeV_var._rotation_absolute, tr1);
    rot_mul(_IN15_Vpolariser_var._rotation_absolute, tr1, _IN15_Vpolariser_var._rotation_relative);
    _IN15_Vpolariser_var._rotation_is_identity =  rot_test_identity(_IN15_Vpolariser_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 9.5 + 0.01);
    rot_transpose(_H511_BeforeV_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _IN15_Vpolariser_var._position_absolute = coords_add(_H511_BeforeV_var._position_absolute, tc2);
    tc1 = coords_sub(_H511_BeforeV_var._position_absolute, _IN15_Vpolariser_var._position_absolute);
    _IN15_Vpolariser_var._position_relative = rot_apply(_IN15_Vpolariser_var._rotation_absolute, tc1);
  } /* IN15_Vpolariser=Pol_guide_vmirror() AT ROTATED */
  DEBUG_COMPONENT("IN15_Vpolariser", _IN15_Vpolariser_var._position_absolute, _IN15_Vpolariser_var._rotation_absolute);
  instrument->_position_absolute[271] = _IN15_Vpolariser_var._position_absolute;
  instrument->_position_relative[271] = _IN15_Vpolariser_var._position_relative;
    _IN15_Vpolariser_var._position_relative_is_zero =  coords_test_zero(_IN15_Vpolariser_var._position_relative);
  instrument->counter_N[271]  = instrument->counter_P[271] = instrument->counter_P2[271] = 0;
  instrument->counter_AbsorbProp[271]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0270_IN15_Vpolariser", _IN15_Vpolariser_var._position_absolute, _IN15_Vpolariser_var._rotation_absolute, "Pol_guide_vmirror");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "nvs", "1", "1","int");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "xwidth", "0.1", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "yheight", "0.1", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "length", "0.5", "0.43","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rR0", "1.0", "1.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rQc", "0.0217", "0.0217","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "ralpha", "6.5", "6.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rmSM", "2", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rW", "0.00157", "0.00157","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rbeta", "80", "80","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rUpR0", "1.0", "1.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rUpQc", "0.0217", "0.0217","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rUpalpha", "2.47", "2.47","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rUpmSM", "4", "4","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rUpW", "0.0014", "0.0014","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rUpbeta", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rDownR0", "1.0", "1.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rDownQc", "0.0217", "0.0217","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rDownalpha", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rDownmSM", "0.65", "0.65","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rDownW", "0.003", "0.003","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rDownbeta", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "debug", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "allow_inside_start", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rPar", "{ 1.0 , 0.0217 , 6.5 , 2 , 0.00157 , 80 }", "{ 1 , 1.0 * 0.0219 , 4.07 , 1 , 0.003 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rUpPar", "{ 1.0 , 0.0217 , 2.47 , 4 , 0.0014 }", "{ 1 , 3.2 * 0.0219 , 4.07 , 1 , 0.003 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rDownPar", "{ 1.0 , 0.0217 , 1 , 0.65 , 0.003 }", "{ 1 , 0.4 * 0.0219 , 4.07 , 1 , 0.003 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rParFile", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rUpParFile", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "rDownParFile", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0270_IN15_Vpolariser", "inputType", "0", "0","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _IN15_Vpolariser_setpos */

/* component H511_AfterV=Guide_gravity() SETTING, POSITION/ROTATION */
int _H511_AfterV_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H511_AfterV_setpos] component H511_AfterV=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H511_AfterV_var._name, "H511_AfterV", 16384);
  stracpy(_H511_AfterV_var._type, "Guide_gravity", 16384);
  _H511_AfterV_var._index=272;
  int current_setpos_index = 272;
  _H511_AfterV_var._parameters.w1 = 0.04;
  _H511_AfterV_var._parameters.h1 = 0.055;
  _H511_AfterV_var._parameters.w2 = 0;
  _H511_AfterV_var._parameters.h2 = 0;
  _H511_AfterV_var._parameters.l = 3;
  _H511_AfterV_var._parameters.R0 = gR0;
  _H511_AfterV_var._parameters.Qc = gQc;
  _H511_AfterV_var._parameters.alpha = gAlpha;
  _H511_AfterV_var._parameters.m = 1;
  _H511_AfterV_var._parameters.W = gW;
  _H511_AfterV_var._parameters.nslit = 1;
  _H511_AfterV_var._parameters.d = 0.0005;
  _H511_AfterV_var._parameters.mleft = -1;
  _H511_AfterV_var._parameters.mright = -1;
  _H511_AfterV_var._parameters.mtop = -1;
  _H511_AfterV_var._parameters.mbottom = -1;
  _H511_AfterV_var._parameters.nhslit = 1;
  _H511_AfterV_var._parameters.G = 0;
  _H511_AfterV_var._parameters.aleft = -1;
  _H511_AfterV_var._parameters.aright = -1;
  _H511_AfterV_var._parameters.atop = -1;
  _H511_AfterV_var._parameters.abottom = -1;
  _H511_AfterV_var._parameters.wavy = 0;
  _H511_AfterV_var._parameters.wavy_z = 0;
  _H511_AfterV_var._parameters.wavy_tb = 0;
  _H511_AfterV_var._parameters.wavy_lr = 0;
  _H511_AfterV_var._parameters.chamfers = 0;
  _H511_AfterV_var._parameters.chamfers_z = 0;
  _H511_AfterV_var._parameters.chamfers_lr = 0;
  _H511_AfterV_var._parameters.chamfers_tb = 0;
  _H511_AfterV_var._parameters.nelements = 2;
  _H511_AfterV_var._parameters.nu = 0;
  _H511_AfterV_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H511_AfterV_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_AfterV_var._parameters.reflect[0]='\0';


  /* component H511_AfterV=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _IN15_Vpolariser_var._rotation_absolute, _H511_AfterV_var._rotation_absolute);
    rot_transpose(_IN15_Vpolariser_var._rotation_absolute, tr1);
    rot_mul(_H511_AfterV_var._rotation_absolute, tr1, _H511_AfterV_var._rotation_relative);
    _H511_AfterV_var._rotation_is_identity =  rot_test_identity(_H511_AfterV_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.44);
    rot_transpose(_IN15_Vpolariser_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H511_AfterV_var._position_absolute = coords_add(_IN15_Vpolariser_var._position_absolute, tc2);
    tc1 = coords_sub(_IN15_Vpolariser_var._position_absolute, _H511_AfterV_var._position_absolute);
    _H511_AfterV_var._position_relative = rot_apply(_H511_AfterV_var._rotation_absolute, tc1);
  } /* H511_AfterV=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H511_AfterV", _H511_AfterV_var._position_absolute, _H511_AfterV_var._rotation_absolute);
  instrument->_position_absolute[272] = _H511_AfterV_var._position_absolute;
  instrument->_position_relative[272] = _H511_AfterV_var._position_relative;
    _H511_AfterV_var._position_relative_is_zero =  coords_test_zero(_H511_AfterV_var._position_relative);
  instrument->counter_N[272]  = instrument->counter_P[272] = instrument->counter_P2[272] = 0;
  instrument->counter_AbsorbProp[272]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0271_H511_AfterV", _H511_AfterV_var._position_absolute, _H511_AfterV_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "l", "NONE", "3","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "m", "1.0", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "nelements", "1", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0271_H511_AfterV", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H511_AfterV_setpos */

/* component H511_IN15_Sample_Div=Monitor_nD() SETTING, POSITION/ROTATION */
int _H511_IN15_Sample_Div_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H511_IN15_Sample_Div_setpos] component H511_IN15_Sample_Div=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H511_IN15_Sample_Div_var._name, "H511_IN15_Sample_Div", 16384);
  stracpy(_H511_IN15_Sample_Div_var._type, "Monitor_nD", 16384);
  _H511_IN15_Sample_Div_var._index=273;
  int current_setpos_index = 273;
  if("" && strlen(""))
    stracpy(_H511_IN15_Sample_Div_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H511_IN15_Sample_Div_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H511_IN15_Sample_Div_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H511_IN15_Sample_Div_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H511_IN15_Sample_Div_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H511_IN15_Sample_Div_var._parameters.user3[0]='\0';
  _H511_IN15_Sample_Div_var._parameters.xwidth = 0.02;
  _H511_IN15_Sample_Div_var._parameters.yheight = 0.05;
  _H511_IN15_Sample_Div_var._parameters.zdepth = 0;
  _H511_IN15_Sample_Div_var._parameters.xmin = 0;
  _H511_IN15_Sample_Div_var._parameters.xmax = 0;
  _H511_IN15_Sample_Div_var._parameters.ymin = 0;
  _H511_IN15_Sample_Div_var._parameters.ymax = 0;
  _H511_IN15_Sample_Div_var._parameters.zmin = 0;
  _H511_IN15_Sample_Div_var._parameters.zmax = 0;
  _H511_IN15_Sample_Div_var._parameters.bins = 100;
  _H511_IN15_Sample_Div_var._parameters.min = -1e40;
  _H511_IN15_Sample_Div_var._parameters.max = 1e40;
  _H511_IN15_Sample_Div_var._parameters.restore_neutron = 1;
  _H511_IN15_Sample_Div_var._parameters.radius = 0;
  if("dx limits=[-2 2], dy limits=[-2 2]" && strlen("dx limits=[-2 2], dy limits=[-2 2]"))
    stracpy(_H511_IN15_Sample_Div_var._parameters.options, "dx limits=[-2 2], dy limits=[-2 2]" ? "dx limits=[-2 2], dy limits=[-2 2]" : "", 16384);
  else 
  _H511_IN15_Sample_Div_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Sample_Div_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Sample_Div_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Sample_Div_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Sample_Div_var._parameters.geometry[0]='\0';
  _H511_IN15_Sample_Div_var._parameters.nowritefile = 0;
  _H511_IN15_Sample_Div_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Sample_Div_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Sample_Div_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Sample_Div_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Sample_Div_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Sample_Div_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Sample_Div_var._parameters.username3[0]='\0';


  /* component H511_IN15_Sample_Div=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H511_AfterV_var._rotation_absolute, _H511_IN15_Sample_Div_var._rotation_absolute);
    rot_transpose(_H511_AfterV_var._rotation_absolute, tr1);
    rot_mul(_H511_IN15_Sample_Div_var._rotation_absolute, tr1, _H511_IN15_Sample_Div_var._rotation_relative);
    _H511_IN15_Sample_Div_var._rotation_is_identity =  rot_test_identity(_H511_IN15_Sample_Div_var._rotation_relative);
    tc1 = coords_set(
      0, 0, IN15_L);
    rot_transpose(_H511_AfterV_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H511_IN15_Sample_Div_var._position_absolute = coords_add(_H511_AfterV_var._position_absolute, tc2);
    tc1 = coords_sub(_H511_AfterV_var._position_absolute, _H511_IN15_Sample_Div_var._position_absolute);
    _H511_IN15_Sample_Div_var._position_relative = rot_apply(_H511_IN15_Sample_Div_var._rotation_absolute, tc1);
  } /* H511_IN15_Sample_Div=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H511_IN15_Sample_Div", _H511_IN15_Sample_Div_var._position_absolute, _H511_IN15_Sample_Div_var._rotation_absolute);
  instrument->_position_absolute[273] = _H511_IN15_Sample_Div_var._position_absolute;
  instrument->_position_relative[273] = _H511_IN15_Sample_Div_var._position_relative;
    _H511_IN15_Sample_Div_var._position_relative_is_zero =  coords_test_zero(_H511_IN15_Sample_Div_var._position_relative);
  instrument->counter_N[273]  = instrument->counter_P[273] = instrument->counter_P2[273] = 0;
  instrument->counter_AbsorbProp[273]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0272_H511_IN15_Sample_Div", _H511_IN15_Sample_Div_var._position_absolute, _H511_IN15_Sample_Div_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "xwidth", "0", "0.02","MCNUM");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "yheight", "0", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "bins", "0", "100","int");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "options", "NULL", "dx limits=[-2 2], dy limits=[-2 2]", "char*");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0272_H511_IN15_Sample_Div", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H511_IN15_Sample_Div_setpos */

/* component H511_IN15_Sample_XY=Monitor_nD() SETTING, POSITION/ROTATION */
int _H511_IN15_Sample_XY_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H511_IN15_Sample_XY_setpos] component H511_IN15_Sample_XY=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H511_IN15_Sample_XY_var._name, "H511_IN15_Sample_XY", 16384);
  stracpy(_H511_IN15_Sample_XY_var._type, "Monitor_nD", 16384);
  _H511_IN15_Sample_XY_var._index=274;
  int current_setpos_index = 274;
  if("" && strlen(""))
    stracpy(_H511_IN15_Sample_XY_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H511_IN15_Sample_XY_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H511_IN15_Sample_XY_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H511_IN15_Sample_XY_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H511_IN15_Sample_XY_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H511_IN15_Sample_XY_var._parameters.user3[0]='\0';
  _H511_IN15_Sample_XY_var._parameters.xwidth = 0.02;
  _H511_IN15_Sample_XY_var._parameters.yheight = 0.05;
  _H511_IN15_Sample_XY_var._parameters.zdepth = 0;
  _H511_IN15_Sample_XY_var._parameters.xmin = 0;
  _H511_IN15_Sample_XY_var._parameters.xmax = 0;
  _H511_IN15_Sample_XY_var._parameters.ymin = 0;
  _H511_IN15_Sample_XY_var._parameters.ymax = 0;
  _H511_IN15_Sample_XY_var._parameters.zmin = 0;
  _H511_IN15_Sample_XY_var._parameters.zmax = 0;
  _H511_IN15_Sample_XY_var._parameters.bins = 50;
  _H511_IN15_Sample_XY_var._parameters.min = -1e40;
  _H511_IN15_Sample_XY_var._parameters.max = 1e40;
  _H511_IN15_Sample_XY_var._parameters.restore_neutron = 1;
  _H511_IN15_Sample_XY_var._parameters.radius = 0;
  if("x y" && strlen("x y"))
    stracpy(_H511_IN15_Sample_XY_var._parameters.options, "x y" ? "x y" : "", 16384);
  else 
  _H511_IN15_Sample_XY_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Sample_XY_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Sample_XY_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Sample_XY_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Sample_XY_var._parameters.geometry[0]='\0';
  _H511_IN15_Sample_XY_var._parameters.nowritefile = 0;
  _H511_IN15_Sample_XY_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Sample_XY_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Sample_XY_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Sample_XY_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Sample_XY_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Sample_XY_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Sample_XY_var._parameters.username3[0]='\0';


  /* component H511_IN15_Sample_XY=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H511_AfterV_var._rotation_absolute, _H511_IN15_Sample_XY_var._rotation_absolute);
    rot_transpose(_H511_IN15_Sample_Div_var._rotation_absolute, tr1);
    rot_mul(_H511_IN15_Sample_XY_var._rotation_absolute, tr1, _H511_IN15_Sample_XY_var._rotation_relative);
    _H511_IN15_Sample_XY_var._rotation_is_identity =  rot_test_identity(_H511_IN15_Sample_XY_var._rotation_relative);
    tc1 = coords_set(
      0, 0, IN15_L);
    rot_transpose(_H511_AfterV_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H511_IN15_Sample_XY_var._position_absolute = coords_add(_H511_AfterV_var._position_absolute, tc2);
    tc1 = coords_sub(_H511_IN15_Sample_Div_var._position_absolute, _H511_IN15_Sample_XY_var._position_absolute);
    _H511_IN15_Sample_XY_var._position_relative = rot_apply(_H511_IN15_Sample_XY_var._rotation_absolute, tc1);
  } /* H511_IN15_Sample_XY=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H511_IN15_Sample_XY", _H511_IN15_Sample_XY_var._position_absolute, _H511_IN15_Sample_XY_var._rotation_absolute);
  instrument->_position_absolute[274] = _H511_IN15_Sample_XY_var._position_absolute;
  instrument->_position_relative[274] = _H511_IN15_Sample_XY_var._position_relative;
    _H511_IN15_Sample_XY_var._position_relative_is_zero =  coords_test_zero(_H511_IN15_Sample_XY_var._position_relative);
  instrument->counter_N[274]  = instrument->counter_P[274] = instrument->counter_P2[274] = 0;
  instrument->counter_AbsorbProp[274]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0273_H511_IN15_Sample_XY", _H511_IN15_Sample_XY_var._position_absolute, _H511_IN15_Sample_XY_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "xwidth", "0", "0.02","MCNUM");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "yheight", "0", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "options", "NULL", "x y", "char*");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0273_H511_IN15_Sample_XY", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H511_IN15_Sample_XY_setpos */

/* component H511_IN15_Sample_L=Monitor_nD() SETTING, POSITION/ROTATION */
int _H511_IN15_Sample_L_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H511_IN15_Sample_L_setpos] component H511_IN15_Sample_L=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H511_IN15_Sample_L_var._name, "H511_IN15_Sample_L", 16384);
  stracpy(_H511_IN15_Sample_L_var._type, "Monitor_nD", 16384);
  _H511_IN15_Sample_L_var._index=275;
  int current_setpos_index = 275;
  if("" && strlen(""))
    stracpy(_H511_IN15_Sample_L_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H511_IN15_Sample_L_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H511_IN15_Sample_L_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H511_IN15_Sample_L_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H511_IN15_Sample_L_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H511_IN15_Sample_L_var._parameters.user3[0]='\0';
  _H511_IN15_Sample_L_var._parameters.xwidth = 0.02;
  _H511_IN15_Sample_L_var._parameters.yheight = 0.05;
  _H511_IN15_Sample_L_var._parameters.zdepth = 0;
  _H511_IN15_Sample_L_var._parameters.xmin = 0;
  _H511_IN15_Sample_L_var._parameters.xmax = 0;
  _H511_IN15_Sample_L_var._parameters.ymin = 0;
  _H511_IN15_Sample_L_var._parameters.ymax = 0;
  _H511_IN15_Sample_L_var._parameters.zmin = 0;
  _H511_IN15_Sample_L_var._parameters.zmax = 0;
  _H511_IN15_Sample_L_var._parameters.bins = 50;
  _H511_IN15_Sample_L_var._parameters.min = -1e40;
  _H511_IN15_Sample_L_var._parameters.max = 1e40;
  _H511_IN15_Sample_L_var._parameters.restore_neutron = 1;
  _H511_IN15_Sample_L_var._parameters.radius = 0;
  if("lambda limits=[1 10]" && strlen("lambda limits=[1 10]"))
    stracpy(_H511_IN15_Sample_L_var._parameters.options, "lambda limits=[1 10]" ? "lambda limits=[1 10]" : "", 16384);
  else 
  _H511_IN15_Sample_L_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Sample_L_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Sample_L_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Sample_L_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Sample_L_var._parameters.geometry[0]='\0';
  _H511_IN15_Sample_L_var._parameters.nowritefile = 0;
  _H511_IN15_Sample_L_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Sample_L_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Sample_L_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Sample_L_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Sample_L_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Sample_L_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Sample_L_var._parameters.username3[0]='\0';


  /* component H511_IN15_Sample_L=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H511_AfterV_var._rotation_absolute, _H511_IN15_Sample_L_var._rotation_absolute);
    rot_transpose(_H511_IN15_Sample_XY_var._rotation_absolute, tr1);
    rot_mul(_H511_IN15_Sample_L_var._rotation_absolute, tr1, _H511_IN15_Sample_L_var._rotation_relative);
    _H511_IN15_Sample_L_var._rotation_is_identity =  rot_test_identity(_H511_IN15_Sample_L_var._rotation_relative);
    tc1 = coords_set(
      0, 0, IN15_L);
    rot_transpose(_H511_AfterV_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H511_IN15_Sample_L_var._position_absolute = coords_add(_H511_AfterV_var._position_absolute, tc2);
    tc1 = coords_sub(_H511_IN15_Sample_XY_var._position_absolute, _H511_IN15_Sample_L_var._position_absolute);
    _H511_IN15_Sample_L_var._position_relative = rot_apply(_H511_IN15_Sample_L_var._rotation_absolute, tc1);
  } /* H511_IN15_Sample_L=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H511_IN15_Sample_L", _H511_IN15_Sample_L_var._position_absolute, _H511_IN15_Sample_L_var._rotation_absolute);
  instrument->_position_absolute[275] = _H511_IN15_Sample_L_var._position_absolute;
  instrument->_position_relative[275] = _H511_IN15_Sample_L_var._position_relative;
    _H511_IN15_Sample_L_var._position_relative_is_zero =  coords_test_zero(_H511_IN15_Sample_L_var._position_relative);
  instrument->counter_N[275]  = instrument->counter_P[275] = instrument->counter_P2[275] = 0;
  instrument->counter_AbsorbProp[275]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0274_H511_IN15_Sample_L", _H511_IN15_Sample_L_var._position_absolute, _H511_IN15_Sample_L_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "xwidth", "0", "0.02","MCNUM");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "yheight", "0", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "options", "NULL", "lambda limits=[1 10]", "char*");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0274_H511_IN15_Sample_L", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H511_IN15_Sample_L_setpos */

/* component H511_IN15_Sample=Incoherent() SETTING, POSITION/ROTATION */
int _H511_IN15_Sample_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H511_IN15_Sample_setpos] component H511_IN15_Sample=Incoherent() SETTING [Incoherent:0]");
  stracpy(_H511_IN15_Sample_var._name, "H511_IN15_Sample", 16384);
  stracpy(_H511_IN15_Sample_var._type, "Incoherent", 16384);
  _H511_IN15_Sample_var._index=276;
  int current_setpos_index = 276;
  _H511_IN15_Sample_var._parameters.geometry[0]='\0';
  _H511_IN15_Sample_var._parameters.radius = 0.005;
  _H511_IN15_Sample_var._parameters.xwidth = 0;
  _H511_IN15_Sample_var._parameters.yheight = 0.05;
  _H511_IN15_Sample_var._parameters.zdepth = 0;
  _H511_IN15_Sample_var._parameters.thickness = 0;
  _H511_IN15_Sample_var._parameters.target_x = 0;
  _H511_IN15_Sample_var._parameters.target_y = 0;
  _H511_IN15_Sample_var._parameters.target_z = 0;
  _H511_IN15_Sample_var._parameters.focus_r = 0;
  _H511_IN15_Sample_var._parameters.focus_xw = 0;
  _H511_IN15_Sample_var._parameters.focus_yh = 0;
  _H511_IN15_Sample_var._parameters.focus_aw = 180;
  _H511_IN15_Sample_var._parameters.focus_ah = 30;
  _H511_IN15_Sample_var._parameters.target_index = + 1;
  _H511_IN15_Sample_var._parameters.pack = 1;
  _H511_IN15_Sample_var._parameters.p_interact = 1;
  _H511_IN15_Sample_var._parameters.f_QE = 0;
  _H511_IN15_Sample_var._parameters.gamma = 0;
  _H511_IN15_Sample_var._parameters.Etrans = 0;
  _H511_IN15_Sample_var._parameters.deltaE = 0;
  _H511_IN15_Sample_var._parameters.sigma_abs = 5.08;
  _H511_IN15_Sample_var._parameters.sigma_inc = 5.08;
  _H511_IN15_Sample_var._parameters.Vc = 13.827;
  _H511_IN15_Sample_var._parameters.concentric = 0;
  _H511_IN15_Sample_var._parameters.order = 0;


  /* component H511_IN15_Sample=Incoherent() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H511_AfterV_var._rotation_absolute, _H511_IN15_Sample_var._rotation_absolute);
    rot_transpose(_H511_IN15_Sample_L_var._rotation_absolute, tr1);
    rot_mul(_H511_IN15_Sample_var._rotation_absolute, tr1, _H511_IN15_Sample_var._rotation_relative);
    _H511_IN15_Sample_var._rotation_is_identity =  rot_test_identity(_H511_IN15_Sample_var._rotation_relative);
    tc1 = coords_set(
      0, 0, IN15_L);
    rot_transpose(_H511_AfterV_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H511_IN15_Sample_var._position_absolute = coords_add(_H511_AfterV_var._position_absolute, tc2);
    tc1 = coords_sub(_H511_IN15_Sample_L_var._position_absolute, _H511_IN15_Sample_var._position_absolute);
    _H511_IN15_Sample_var._position_relative = rot_apply(_H511_IN15_Sample_var._rotation_absolute, tc1);
  } /* H511_IN15_Sample=Incoherent() AT ROTATED */
  DEBUG_COMPONENT("H511_IN15_Sample", _H511_IN15_Sample_var._position_absolute, _H511_IN15_Sample_var._rotation_absolute);
  instrument->_position_absolute[276] = _H511_IN15_Sample_var._position_absolute;
  instrument->_position_relative[276] = _H511_IN15_Sample_var._position_relative;
    _H511_IN15_Sample_var._position_relative_is_zero =  coords_test_zero(_H511_IN15_Sample_var._position_relative);
  instrument->counter_N[276]  = instrument->counter_P[276] = instrument->counter_P2[276] = 0;
  instrument->counter_AbsorbProp[276]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0275_H511_IN15_Sample", _H511_IN15_Sample_var._position_absolute, _H511_IN15_Sample_var._rotation_absolute, "Incoherent");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "geometry", 0, 0, "char*");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "radius", "0", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "yheight", "0", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "target_x", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "target_y", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "target_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "focus_r", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "focus_xw", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "focus_yh", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "focus_aw", "0", "180","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "focus_ah", "0", "30","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "target_index", "0", "+ 1","int");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "p_interact", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "f_QE", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "gamma", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "Etrans", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "deltaE", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "sigma_abs", "5.08", "5.08","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "sigma_inc", "5.08", "5.08","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "Vc", "13.827", "13.827","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0275_H511_IN15_Sample", "order", "0", "0","MCNUM");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H511_IN15_Sample_setpos */

/* component H511_IN15_Detector=Monitor_nD() SETTING, POSITION/ROTATION */
int _H511_IN15_Detector_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H511_IN15_Detector_setpos] component H511_IN15_Detector=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H511_IN15_Detector_var._name, "H511_IN15_Detector", 16384);
  stracpy(_H511_IN15_Detector_var._type, "Monitor_nD", 16384);
  _H511_IN15_Detector_var._index=277;
  int current_setpos_index = 277;
  if("" && strlen(""))
    stracpy(_H511_IN15_Detector_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H511_IN15_Detector_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H511_IN15_Detector_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H511_IN15_Detector_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H511_IN15_Detector_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H511_IN15_Detector_var._parameters.user3[0]='\0';
  _H511_IN15_Detector_var._parameters.xwidth = 0.32;
  _H511_IN15_Detector_var._parameters.yheight = 0.32;
  _H511_IN15_Detector_var._parameters.zdepth = 0;
  _H511_IN15_Detector_var._parameters.xmin = 0;
  _H511_IN15_Detector_var._parameters.xmax = 0;
  _H511_IN15_Detector_var._parameters.ymin = 0;
  _H511_IN15_Detector_var._parameters.ymax = 0;
  _H511_IN15_Detector_var._parameters.zmin = 0;
  _H511_IN15_Detector_var._parameters.zmax = 0;
  _H511_IN15_Detector_var._parameters.bins = 32;
  _H511_IN15_Detector_var._parameters.min = -1e40;
  _H511_IN15_Detector_var._parameters.max = 1e40;
  _H511_IN15_Detector_var._parameters.restore_neutron = 1;
  _H511_IN15_Detector_var._parameters.radius = 0;
  if("x y" && strlen("x y"))
    stracpy(_H511_IN15_Detector_var._parameters.options, "x y" ? "x y" : "", 16384);
  else 
  _H511_IN15_Detector_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Detector_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Detector_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Detector_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Detector_var._parameters.geometry[0]='\0';
  _H511_IN15_Detector_var._parameters.nowritefile = 0;
  _H511_IN15_Detector_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Detector_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Detector_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Detector_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Detector_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Detector_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Detector_var._parameters.username3[0]='\0';


  /* component H511_IN15_Detector=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H511_IN15_Sample_var._rotation_absolute, _H511_IN15_Detector_var._rotation_absolute);
    rot_transpose(_H511_IN15_Sample_var._rotation_absolute, tr1);
    rot_mul(_H511_IN15_Detector_var._rotation_absolute, tr1, _H511_IN15_Detector_var._rotation_relative);
    _H511_IN15_Detector_var._rotation_is_identity =  rot_test_identity(_H511_IN15_Detector_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 4.6);
    rot_transpose(_H511_IN15_Sample_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H511_IN15_Detector_var._position_absolute = coords_add(_H511_IN15_Sample_var._position_absolute, tc2);
    tc1 = coords_sub(_H511_IN15_Sample_var._position_absolute, _H511_IN15_Detector_var._position_absolute);
    _H511_IN15_Detector_var._position_relative = rot_apply(_H511_IN15_Detector_var._rotation_absolute, tc1);
  } /* H511_IN15_Detector=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H511_IN15_Detector", _H511_IN15_Detector_var._position_absolute, _H511_IN15_Detector_var._rotation_absolute);
  instrument->_position_absolute[277] = _H511_IN15_Detector_var._position_absolute;
  instrument->_position_relative[277] = _H511_IN15_Detector_var._position_relative;
    _H511_IN15_Detector_var._position_relative_is_zero =  coords_test_zero(_H511_IN15_Detector_var._position_relative);
  instrument->counter_N[277]  = instrument->counter_P[277] = instrument->counter_P2[277] = 0;
  instrument->counter_AbsorbProp[277]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0276_H511_IN15_Detector", _H511_IN15_Detector_var._position_absolute, _H511_IN15_Detector_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "xwidth", "0", "0.32","MCNUM");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "yheight", "0", "0.32","MCNUM");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "bins", "0", "32","int");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "options", "NULL", "x y", "char*");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0276_H511_IN15_Detector", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H511_IN15_Detector_setpos */

/* component H511_IN15_Spectrometer=Monitor_nD() SETTING, POSITION/ROTATION */
int _H511_IN15_Spectrometer_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H511_IN15_Spectrometer_setpos] component H511_IN15_Spectrometer=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H511_IN15_Spectrometer_var._name, "H511_IN15_Spectrometer", 16384);
  stracpy(_H511_IN15_Spectrometer_var._type, "Monitor_nD", 16384);
  _H511_IN15_Spectrometer_var._index=278;
  int current_setpos_index = 278;
  if("" && strlen(""))
    stracpy(_H511_IN15_Spectrometer_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H511_IN15_Spectrometer_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H511_IN15_Spectrometer_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H511_IN15_Spectrometer_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H511_IN15_Spectrometer_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H511_IN15_Spectrometer_var._parameters.user3[0]='\0';
  _H511_IN15_Spectrometer_var._parameters.xwidth = 0;
  _H511_IN15_Spectrometer_var._parameters.yheight = 0.3;
  _H511_IN15_Spectrometer_var._parameters.zdepth = 0;
  _H511_IN15_Spectrometer_var._parameters.xmin = 0;
  _H511_IN15_Spectrometer_var._parameters.xmax = 0;
  _H511_IN15_Spectrometer_var._parameters.ymin = 0;
  _H511_IN15_Spectrometer_var._parameters.ymax = 0;
  _H511_IN15_Spectrometer_var._parameters.zmin = 0;
  _H511_IN15_Spectrometer_var._parameters.zmax = 0;
  _H511_IN15_Spectrometer_var._parameters.bins = 0;
  _H511_IN15_Spectrometer_var._parameters.min = -1e40;
  _H511_IN15_Spectrometer_var._parameters.max = 1e40;
  _H511_IN15_Spectrometer_var._parameters.restore_neutron = 1;
  _H511_IN15_Spectrometer_var._parameters.radius = 0.5;
  if("angle limits=[-150 150] bins=50, energy limits=[0 5], banana" && strlen("angle limits=[-150 150] bins=50, energy limits=[0 5], banana"))
    stracpy(_H511_IN15_Spectrometer_var._parameters.options, "angle limits=[-150 150] bins=50, energy limits=[0 5], banana" ? "angle limits=[-150 150] bins=50, energy limits=[0 5], banana" : "", 16384);
  else 
  _H511_IN15_Spectrometer_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Spectrometer_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Spectrometer_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Spectrometer_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Spectrometer_var._parameters.geometry[0]='\0';
  _H511_IN15_Spectrometer_var._parameters.nowritefile = 0;
  _H511_IN15_Spectrometer_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Spectrometer_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Spectrometer_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Spectrometer_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Spectrometer_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Spectrometer_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Spectrometer_var._parameters.username3[0]='\0';


  /* component H511_IN15_Spectrometer=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H511_IN15_Sample_var._rotation_absolute, _H511_IN15_Spectrometer_var._rotation_absolute);
    rot_transpose(_H511_IN15_Detector_var._rotation_absolute, tr1);
    rot_mul(_H511_IN15_Spectrometer_var._rotation_absolute, tr1, _H511_IN15_Spectrometer_var._rotation_relative);
    _H511_IN15_Spectrometer_var._rotation_is_identity =  rot_test_identity(_H511_IN15_Spectrometer_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H511_IN15_Sample_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H511_IN15_Spectrometer_var._position_absolute = coords_add(_H511_IN15_Sample_var._position_absolute, tc2);
    tc1 = coords_sub(_H511_IN15_Detector_var._position_absolute, _H511_IN15_Spectrometer_var._position_absolute);
    _H511_IN15_Spectrometer_var._position_relative = rot_apply(_H511_IN15_Spectrometer_var._rotation_absolute, tc1);
  } /* H511_IN15_Spectrometer=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H511_IN15_Spectrometer", _H511_IN15_Spectrometer_var._position_absolute, _H511_IN15_Spectrometer_var._rotation_absolute);
  instrument->_position_absolute[278] = _H511_IN15_Spectrometer_var._position_absolute;
  instrument->_position_relative[278] = _H511_IN15_Spectrometer_var._position_relative;
    _H511_IN15_Spectrometer_var._position_relative_is_zero =  coords_test_zero(_H511_IN15_Spectrometer_var._position_relative);
  instrument->counter_N[278]  = instrument->counter_P[278] = instrument->counter_P2[278] = 0;
  instrument->counter_AbsorbProp[278]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0277_H511_IN15_Spectrometer", _H511_IN15_Spectrometer_var._position_absolute, _H511_IN15_Spectrometer_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "yheight", "0", "0.3","MCNUM");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "radius", "0", "0.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "options", "NULL", "angle limits=[-150 150] bins=50, energy limits=[0 5], banana", "char*");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0277_H511_IN15_Spectrometer", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H511_IN15_Spectrometer_setpos */

/* component H511_IN15_Diffractometer=Monitor_nD() SETTING, POSITION/ROTATION */
int _H511_IN15_Diffractometer_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H511_IN15_Diffractometer_setpos] component H511_IN15_Diffractometer=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H511_IN15_Diffractometer_var._name, "H511_IN15_Diffractometer", 16384);
  stracpy(_H511_IN15_Diffractometer_var._type, "Monitor_nD", 16384);
  _H511_IN15_Diffractometer_var._index=279;
  int current_setpos_index = 279;
  if("" && strlen(""))
    stracpy(_H511_IN15_Diffractometer_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H511_IN15_Diffractometer_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H511_IN15_Diffractometer_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H511_IN15_Diffractometer_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H511_IN15_Diffractometer_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H511_IN15_Diffractometer_var._parameters.user3[0]='\0';
  _H511_IN15_Diffractometer_var._parameters.xwidth = 0;
  _H511_IN15_Diffractometer_var._parameters.yheight = 0.3;
  _H511_IN15_Diffractometer_var._parameters.zdepth = 0;
  _H511_IN15_Diffractometer_var._parameters.xmin = 0;
  _H511_IN15_Diffractometer_var._parameters.xmax = 0;
  _H511_IN15_Diffractometer_var._parameters.ymin = 0;
  _H511_IN15_Diffractometer_var._parameters.ymax = 0;
  _H511_IN15_Diffractometer_var._parameters.zmin = 0;
  _H511_IN15_Diffractometer_var._parameters.zmax = 0;
  _H511_IN15_Diffractometer_var._parameters.bins = 0;
  _H511_IN15_Diffractometer_var._parameters.min = -1e40;
  _H511_IN15_Diffractometer_var._parameters.max = 1e40;
  _H511_IN15_Diffractometer_var._parameters.restore_neutron = 0;
  _H511_IN15_Diffractometer_var._parameters.radius = 1;
  if("theta bins=100 limits=[-150 150], y, banana" && strlen("theta bins=100 limits=[-150 150], y, banana"))
    stracpy(_H511_IN15_Diffractometer_var._parameters.options, "theta bins=100 limits=[-150 150], y, banana" ? "theta bins=100 limits=[-150 150], y, banana" : "", 16384);
  else 
  _H511_IN15_Diffractometer_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Diffractometer_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Diffractometer_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Diffractometer_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Diffractometer_var._parameters.geometry[0]='\0';
  _H511_IN15_Diffractometer_var._parameters.nowritefile = 0;
  _H511_IN15_Diffractometer_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Diffractometer_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Diffractometer_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Diffractometer_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Diffractometer_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H511_IN15_Diffractometer_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H511_IN15_Diffractometer_var._parameters.username3[0]='\0';


  /* component H511_IN15_Diffractometer=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H511_IN15_Sample_var._rotation_absolute, _H511_IN15_Diffractometer_var._rotation_absolute);
    rot_transpose(_H511_IN15_Spectrometer_var._rotation_absolute, tr1);
    rot_mul(_H511_IN15_Diffractometer_var._rotation_absolute, tr1, _H511_IN15_Diffractometer_var._rotation_relative);
    _H511_IN15_Diffractometer_var._rotation_is_identity =  rot_test_identity(_H511_IN15_Diffractometer_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H511_IN15_Sample_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H511_IN15_Diffractometer_var._position_absolute = coords_add(_H511_IN15_Sample_var._position_absolute, tc2);
    tc1 = coords_sub(_H511_IN15_Spectrometer_var._position_absolute, _H511_IN15_Diffractometer_var._position_absolute);
    _H511_IN15_Diffractometer_var._position_relative = rot_apply(_H511_IN15_Diffractometer_var._rotation_absolute, tc1);
  } /* H511_IN15_Diffractometer=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H511_IN15_Diffractometer", _H511_IN15_Diffractometer_var._position_absolute, _H511_IN15_Diffractometer_var._rotation_absolute);
  instrument->_position_absolute[279] = _H511_IN15_Diffractometer_var._position_absolute;
  instrument->_position_relative[279] = _H511_IN15_Diffractometer_var._position_relative;
    _H511_IN15_Diffractometer_var._position_relative_is_zero =  coords_test_zero(_H511_IN15_Diffractometer_var._position_relative);
  instrument->counter_N[279]  = instrument->counter_P[279] = instrument->counter_P2[279] = 0;
  instrument->counter_AbsorbProp[279]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0278_H511_IN15_Diffractometer", _H511_IN15_Diffractometer_var._position_absolute, _H511_IN15_Diffractometer_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "yheight", "0", "0.3","MCNUM");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "restore_neutron", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "radius", "0", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "options", "NULL", "theta bins=100 limits=[-150 150], y, banana", "char*");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0278_H511_IN15_Diffractometer", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H511_IN15_Diffractometer_setpos */

/* component H512_Start=Arm() SETTING, POSITION/ROTATION */
int _H512_Start_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H512_Start_setpos] component H512_Start=Arm() SETTING [Arm:0]");
  stracpy(_H512_Start_var._name, "H512_Start", 16384);
  stracpy(_H512_Start_var._type, "Arm", 16384);
  _H512_Start_var._index=280;
  int current_setpos_index = 280;
  /* component H512_Start=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H51_split_2_var._rotation_absolute, _H512_Start_var._rotation_absolute);
    rot_transpose(_H511_IN15_Diffractometer_var._rotation_absolute, tr1);
    rot_mul(_H512_Start_var._rotation_absolute, tr1, _H512_Start_var._rotation_relative);
    _H512_Start_var._rotation_is_identity =  rot_test_identity(_H512_Start_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H51_split_2_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H512_Start_var._position_absolute = coords_add(_H51_split_2_var._position_absolute, tc2);
    tc1 = coords_sub(_H511_IN15_Diffractometer_var._position_absolute, _H512_Start_var._position_absolute);
    _H512_Start_var._position_relative = rot_apply(_H512_Start_var._rotation_absolute, tc1);
  } /* H512_Start=Arm() AT ROTATED */
  DEBUG_COMPONENT("H512_Start", _H512_Start_var._position_absolute, _H512_Start_var._rotation_absolute);
  instrument->_position_absolute[280] = _H512_Start_var._position_absolute;
  instrument->_position_relative[280] = _H512_Start_var._position_relative;
    _H512_Start_var._position_relative_is_zero =  coords_test_zero(_H512_Start_var._position_relative);
  instrument->counter_N[280]  = instrument->counter_P[280] = instrument->counter_P2[280] = 0;
  instrument->counter_AbsorbProp[280]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0279_H512_Start", _H512_Start_var._position_absolute, _H512_Start_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H512_Start_setpos */

/* component H512_S36=Guide_gravity() SETTING, POSITION/ROTATION */
int _H512_S36_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H512_S36_setpos] component H512_S36=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H512_S36_var._name, "H512_S36", 16384);
  stracpy(_H512_S36_var._type, "Guide_gravity", 16384);
  _H512_S36_var._index=281;
  int current_setpos_index = 281;
  _H512_S36_var._parameters.w1 = 0.04;
  _H512_S36_var._parameters.h1 = 0.055;
  _H512_S36_var._parameters.w2 = 0;
  _H512_S36_var._parameters.h2 = 0;
  _H512_S36_var._parameters.l = 20.85 / 16;
  _H512_S36_var._parameters.R0 = gR0;
  _H512_S36_var._parameters.Qc = gQc;
  _H512_S36_var._parameters.alpha = gAlpha;
  _H512_S36_var._parameters.m = 1.2;
  _H512_S36_var._parameters.W = gW;
  _H512_S36_var._parameters.nslit = 1;
  _H512_S36_var._parameters.d = 0.0005;
  _H512_S36_var._parameters.mleft = -1;
  _H512_S36_var._parameters.mright = -1;
  _H512_S36_var._parameters.mtop = -1;
  _H512_S36_var._parameters.mbottom = -1;
  _H512_S36_var._parameters.nhslit = 1;
  _H512_S36_var._parameters.G = 0;
  _H512_S36_var._parameters.aleft = -1;
  _H512_S36_var._parameters.aright = -1;
  _H512_S36_var._parameters.atop = -1;
  _H512_S36_var._parameters.abottom = -1;
  _H512_S36_var._parameters.wavy = 0;
  _H512_S36_var._parameters.wavy_z = 0;
  _H512_S36_var._parameters.wavy_tb = 0;
  _H512_S36_var._parameters.wavy_lr = 0;
  _H512_S36_var._parameters.chamfers = 0;
  _H512_S36_var._parameters.chamfers_z = 0;
  _H512_S36_var._parameters.chamfers_lr = 0;
  _H512_S36_var._parameters.chamfers_tb = 0;
  _H512_S36_var._parameters.nelements = 1;
  _H512_S36_var._parameters.nu = 0;
  _H512_S36_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H512_S36_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H512_S36_var._parameters.reflect[0]='\0';


  /* component H512_S36=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H512_Start_var._rotation_absolute, _H512_S36_var._rotation_absolute);
    rot_transpose(_H512_Start_var._rotation_absolute, tr1);
    rot_mul(_H512_S36_var._rotation_absolute, tr1, _H512_S36_var._rotation_relative);
    _H512_S36_var._rotation_is_identity =  rot_test_identity(_H512_S36_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.0);
    rot_transpose(_H512_Start_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H512_S36_var._position_absolute = coords_add(_H512_Start_var._position_absolute, tc2);
    tc1 = coords_sub(_H512_Start_var._position_absolute, _H512_S36_var._position_absolute);
    _H512_S36_var._position_relative = rot_apply(_H512_S36_var._rotation_absolute, tc1);
  } /* H512_S36=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H512_S36", _H512_S36_var._position_absolute, _H512_S36_var._rotation_absolute);
  instrument->_position_absolute[281] = _H512_S36_var._position_absolute;
  instrument->_position_relative[281] = _H512_S36_var._position_relative;
    _H512_S36_var._position_relative_is_zero =  coords_test_zero(_H512_S36_var._position_relative);
  instrument->counter_N[281]  = instrument->counter_P[281] = instrument->counter_P2[281] = 0;
  instrument->counter_AbsorbProp[281]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0280_H512_S36", _H512_S36_var._position_absolute, _H512_S36_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "l", "NONE", "20.85 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0280_H512_S36", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H512_S36_setpos */

/* component H512_S36_282=Guide_gravity() SETTING, POSITION/ROTATION */
int _H512_S36_282_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H512_S36_282_setpos] component H512_S36_282=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H512_S36_282_var._name, "H512_S36_282", 16384);
  stracpy(_H512_S36_282_var._type, "Guide_gravity", 16384);
  _H512_S36_282_var._index=282;
  int current_setpos_index = 282;
  _H512_S36_282_var._parameters.w1 = 0.04;
  _H512_S36_282_var._parameters.h1 = 0.055;
  _H512_S36_282_var._parameters.w2 = 0;
  _H512_S36_282_var._parameters.h2 = 0;
  _H512_S36_282_var._parameters.l = 20.85 / 16;
  _H512_S36_282_var._parameters.R0 = gR0;
  _H512_S36_282_var._parameters.Qc = gQc;
  _H512_S36_282_var._parameters.alpha = gAlpha;
  _H512_S36_282_var._parameters.m = 1.2;
  _H512_S36_282_var._parameters.W = gW;
  _H512_S36_282_var._parameters.nslit = 1;
  _H512_S36_282_var._parameters.d = 0.0005;
  _H512_S36_282_var._parameters.mleft = -1;
  _H512_S36_282_var._parameters.mright = -1;
  _H512_S36_282_var._parameters.mtop = -1;
  _H512_S36_282_var._parameters.mbottom = -1;
  _H512_S36_282_var._parameters.nhslit = 1;
  _H512_S36_282_var._parameters.G = 0;
  _H512_S36_282_var._parameters.aleft = -1;
  _H512_S36_282_var._parameters.aright = -1;
  _H512_S36_282_var._parameters.atop = -1;
  _H512_S36_282_var._parameters.abottom = -1;
  _H512_S36_282_var._parameters.wavy = 0;
  _H512_S36_282_var._parameters.wavy_z = 0;
  _H512_S36_282_var._parameters.wavy_tb = 0;
  _H512_S36_282_var._parameters.wavy_lr = 0;
  _H512_S36_282_var._parameters.chamfers = 0;
  _H512_S36_282_var._parameters.chamfers_z = 0;
  _H512_S36_282_var._parameters.chamfers_lr = 0;
  _H512_S36_282_var._parameters.chamfers_tb = 0;
  _H512_S36_282_var._parameters.nelements = 1;
  _H512_S36_282_var._parameters.nu = 0;
  _H512_S36_282_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H512_S36_282_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H512_S36_282_var._parameters.reflect[0]='\0';


  /* component H512_S36_282=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-20.85 / 16 / 3000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H512_S36_var._rotation_absolute, _H512_S36_282_var._rotation_absolute);
    rot_transpose(_H512_S36_var._rotation_absolute, tr1);
    rot_mul(_H512_S36_282_var._rotation_absolute, tr1, _H512_S36_282_var._rotation_relative);
    _H512_S36_282_var._rotation_is_identity =  rot_test_identity(_H512_S36_282_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 20.85 / 16);
    rot_transpose(_H512_S36_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H512_S36_282_var._position_absolute = coords_add(_H512_S36_var._position_absolute, tc2);
    tc1 = coords_sub(_H512_S36_var._position_absolute, _H512_S36_282_var._position_absolute);
    _H512_S36_282_var._position_relative = rot_apply(_H512_S36_282_var._rotation_absolute, tc1);
  } /* H512_S36_282=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H512_S36_282", _H512_S36_282_var._position_absolute, _H512_S36_282_var._rotation_absolute);
  instrument->_position_absolute[282] = _H512_S36_282_var._position_absolute;
  instrument->_position_relative[282] = _H512_S36_282_var._position_relative;
    _H512_S36_282_var._position_relative_is_zero =  coords_test_zero(_H512_S36_282_var._position_relative);
  instrument->counter_N[282]  = instrument->counter_P[282] = instrument->counter_P2[282] = 0;
  instrument->counter_AbsorbProp[282]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0281_H512_S36_282", _H512_S36_282_var._position_absolute, _H512_S36_282_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "l", "NONE", "20.85 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0281_H512_S36_282", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H512_S36_282_setpos */

/* component H512_S36_283=Guide_gravity() SETTING, POSITION/ROTATION */
int _H512_S36_283_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H512_S36_283_setpos] component H512_S36_283=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H512_S36_283_var._name, "H512_S36_283", 16384);
  stracpy(_H512_S36_283_var._type, "Guide_gravity", 16384);
  _H512_S36_283_var._index=283;
  int current_setpos_index = 283;
  _H512_S36_283_var._parameters.w1 = 0.04;
  _H512_S36_283_var._parameters.h1 = 0.055;
  _H512_S36_283_var._parameters.w2 = 0;
  _H512_S36_283_var._parameters.h2 = 0;
  _H512_S36_283_var._parameters.l = 20.85 / 16;
  _H512_S36_283_var._parameters.R0 = gR0;
  _H512_S36_283_var._parameters.Qc = gQc;
  _H512_S36_283_var._parameters.alpha = gAlpha;
  _H512_S36_283_var._parameters.m = 1.2;
  _H512_S36_283_var._parameters.W = gW;
  _H512_S36_283_var._parameters.nslit = 1;
  _H512_S36_283_var._parameters.d = 0.0005;
  _H512_S36_283_var._parameters.mleft = -1;
  _H512_S36_283_var._parameters.mright = -1;
  _H512_S36_283_var._parameters.mtop = -1;
  _H512_S36_283_var._parameters.mbottom = -1;
  _H512_S36_283_var._parameters.nhslit = 1;
  _H512_S36_283_var._parameters.G = 0;
  _H512_S36_283_var._parameters.aleft = -1;
  _H512_S36_283_var._parameters.aright = -1;
  _H512_S36_283_var._parameters.atop = -1;
  _H512_S36_283_var._parameters.abottom = -1;
  _H512_S36_283_var._parameters.wavy = 0;
  _H512_S36_283_var._parameters.wavy_z = 0;
  _H512_S36_283_var._parameters.wavy_tb = 0;
  _H512_S36_283_var._parameters.wavy_lr = 0;
  _H512_S36_283_var._parameters.chamfers = 0;
  _H512_S36_283_var._parameters.chamfers_z = 0;
  _H512_S36_283_var._parameters.chamfers_lr = 0;
  _H512_S36_283_var._parameters.chamfers_tb = 0;
  _H512_S36_283_var._parameters.nelements = 1;
  _H512_S36_283_var._parameters.nu = 0;
  _H512_S36_283_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H512_S36_283_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H512_S36_283_var._parameters.reflect[0]='\0';


  /* component H512_S36_283=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-20.85 / 16 / 3000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H512_S36_282_var._rotation_absolute, _H512_S36_283_var._rotation_absolute);
    rot_transpose(_H512_S36_282_var._rotation_absolute, tr1);
    rot_mul(_H512_S36_283_var._rotation_absolute, tr1, _H512_S36_283_var._rotation_relative);
    _H512_S36_283_var._rotation_is_identity =  rot_test_identity(_H512_S36_283_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 20.85 / 16);
    rot_transpose(_H512_S36_282_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H512_S36_283_var._position_absolute = coords_add(_H512_S36_282_var._position_absolute, tc2);
    tc1 = coords_sub(_H512_S36_282_var._position_absolute, _H512_S36_283_var._position_absolute);
    _H512_S36_283_var._position_relative = rot_apply(_H512_S36_283_var._rotation_absolute, tc1);
  } /* H512_S36_283=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H512_S36_283", _H512_S36_283_var._position_absolute, _H512_S36_283_var._rotation_absolute);
  instrument->_position_absolute[283] = _H512_S36_283_var._position_absolute;
  instrument->_position_relative[283] = _H512_S36_283_var._position_relative;
    _H512_S36_283_var._position_relative_is_zero =  coords_test_zero(_H512_S36_283_var._position_relative);
  instrument->counter_N[283]  = instrument->counter_P[283] = instrument->counter_P2[283] = 0;
  instrument->counter_AbsorbProp[283]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0282_H512_S36_283", _H512_S36_283_var._position_absolute, _H512_S36_283_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "l", "NONE", "20.85 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0282_H512_S36_283", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H512_S36_283_setpos */

/* component H512_S36_284=Guide_gravity() SETTING, POSITION/ROTATION */
int _H512_S36_284_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H512_S36_284_setpos] component H512_S36_284=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H512_S36_284_var._name, "H512_S36_284", 16384);
  stracpy(_H512_S36_284_var._type, "Guide_gravity", 16384);
  _H512_S36_284_var._index=284;
  int current_setpos_index = 284;
  _H512_S36_284_var._parameters.w1 = 0.04;
  _H512_S36_284_var._parameters.h1 = 0.055;
  _H512_S36_284_var._parameters.w2 = 0;
  _H512_S36_284_var._parameters.h2 = 0;
  _H512_S36_284_var._parameters.l = 20.85 / 16;
  _H512_S36_284_var._parameters.R0 = gR0;
  _H512_S36_284_var._parameters.Qc = gQc;
  _H512_S36_284_var._parameters.alpha = gAlpha;
  _H512_S36_284_var._parameters.m = 1.2;
  _H512_S36_284_var._parameters.W = gW;
  _H512_S36_284_var._parameters.nslit = 1;
  _H512_S36_284_var._parameters.d = 0.0005;
  _H512_S36_284_var._parameters.mleft = -1;
  _H512_S36_284_var._parameters.mright = -1;
  _H512_S36_284_var._parameters.mtop = -1;
  _H512_S36_284_var._parameters.mbottom = -1;
  _H512_S36_284_var._parameters.nhslit = 1;
  _H512_S36_284_var._parameters.G = 0;
  _H512_S36_284_var._parameters.aleft = -1;
  _H512_S36_284_var._parameters.aright = -1;
  _H512_S36_284_var._parameters.atop = -1;
  _H512_S36_284_var._parameters.abottom = -1;
  _H512_S36_284_var._parameters.wavy = 0;
  _H512_S36_284_var._parameters.wavy_z = 0;
  _H512_S36_284_var._parameters.wavy_tb = 0;
  _H512_S36_284_var._parameters.wavy_lr = 0;
  _H512_S36_284_var._parameters.chamfers = 0;
  _H512_S36_284_var._parameters.chamfers_z = 0;
  _H512_S36_284_var._parameters.chamfers_lr = 0;
  _H512_S36_284_var._parameters.chamfers_tb = 0;
  _H512_S36_284_var._parameters.nelements = 1;
  _H512_S36_284_var._parameters.nu = 0;
  _H512_S36_284_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H512_S36_284_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H512_S36_284_var._parameters.reflect[0]='\0';


  /* component H512_S36_284=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-20.85 / 16 / 3000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H512_S36_283_var._rotation_absolute, _H512_S36_284_var._rotation_absolute);
    rot_transpose(_H512_S36_283_var._rotation_absolute, tr1);
    rot_mul(_H512_S36_284_var._rotation_absolute, tr1, _H512_S36_284_var._rotation_relative);
    _H512_S36_284_var._rotation_is_identity =  rot_test_identity(_H512_S36_284_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 20.85 / 16);
    rot_transpose(_H512_S36_283_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H512_S36_284_var._position_absolute = coords_add(_H512_S36_283_var._position_absolute, tc2);
    tc1 = coords_sub(_H512_S36_283_var._position_absolute, _H512_S36_284_var._position_absolute);
    _H512_S36_284_var._position_relative = rot_apply(_H512_S36_284_var._rotation_absolute, tc1);
  } /* H512_S36_284=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H512_S36_284", _H512_S36_284_var._position_absolute, _H512_S36_284_var._rotation_absolute);
  instrument->_position_absolute[284] = _H512_S36_284_var._position_absolute;
  instrument->_position_relative[284] = _H512_S36_284_var._position_relative;
    _H512_S36_284_var._position_relative_is_zero =  coords_test_zero(_H512_S36_284_var._position_relative);
  instrument->counter_N[284]  = instrument->counter_P[284] = instrument->counter_P2[284] = 0;
  instrument->counter_AbsorbProp[284]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0283_H512_S36_284", _H512_S36_284_var._position_absolute, _H512_S36_284_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "l", "NONE", "20.85 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0283_H512_S36_284", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H512_S36_284_setpos */

/* component H512_S36_285=Guide_gravity() SETTING, POSITION/ROTATION */
int _H512_S36_285_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H512_S36_285_setpos] component H512_S36_285=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H512_S36_285_var._name, "H512_S36_285", 16384);
  stracpy(_H512_S36_285_var._type, "Guide_gravity", 16384);
  _H512_S36_285_var._index=285;
  int current_setpos_index = 285;
  _H512_S36_285_var._parameters.w1 = 0.04;
  _H512_S36_285_var._parameters.h1 = 0.055;
  _H512_S36_285_var._parameters.w2 = 0;
  _H512_S36_285_var._parameters.h2 = 0;
  _H512_S36_285_var._parameters.l = 20.85 / 16;
  _H512_S36_285_var._parameters.R0 = gR0;
  _H512_S36_285_var._parameters.Qc = gQc;
  _H512_S36_285_var._parameters.alpha = gAlpha;
  _H512_S36_285_var._parameters.m = 1.2;
  _H512_S36_285_var._parameters.W = gW;
  _H512_S36_285_var._parameters.nslit = 1;
  _H512_S36_285_var._parameters.d = 0.0005;
  _H512_S36_285_var._parameters.mleft = -1;
  _H512_S36_285_var._parameters.mright = -1;
  _H512_S36_285_var._parameters.mtop = -1;
  _H512_S36_285_var._parameters.mbottom = -1;
  _H512_S36_285_var._parameters.nhslit = 1;
  _H512_S36_285_var._parameters.G = 0;
  _H512_S36_285_var._parameters.aleft = -1;
  _H512_S36_285_var._parameters.aright = -1;
  _H512_S36_285_var._parameters.atop = -1;
  _H512_S36_285_var._parameters.abottom = -1;
  _H512_S36_285_var._parameters.wavy = 0;
  _H512_S36_285_var._parameters.wavy_z = 0;
  _H512_S36_285_var._parameters.wavy_tb = 0;
  _H512_S36_285_var._parameters.wavy_lr = 0;
  _H512_S36_285_var._parameters.chamfers = 0;
  _H512_S36_285_var._parameters.chamfers_z = 0;
  _H512_S36_285_var._parameters.chamfers_lr = 0;
  _H512_S36_285_var._parameters.chamfers_tb = 0;
  _H512_S36_285_var._parameters.nelements = 1;
  _H512_S36_285_var._parameters.nu = 0;
  _H512_S36_285_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H512_S36_285_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H512_S36_285_var._parameters.reflect[0]='\0';


  /* component H512_S36_285=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-20.85 / 16 / 3000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H512_S36_284_var._rotation_absolute, _H512_S36_285_var._rotation_absolute);
    rot_transpose(_H512_S36_284_var._rotation_absolute, tr1);
    rot_mul(_H512_S36_285_var._rotation_absolute, tr1, _H512_S36_285_var._rotation_relative);
    _H512_S36_285_var._rotation_is_identity =  rot_test_identity(_H512_S36_285_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 20.85 / 16);
    rot_transpose(_H512_S36_284_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H512_S36_285_var._position_absolute = coords_add(_H512_S36_284_var._position_absolute, tc2);
    tc1 = coords_sub(_H512_S36_284_var._position_absolute, _H512_S36_285_var._position_absolute);
    _H512_S36_285_var._position_relative = rot_apply(_H512_S36_285_var._rotation_absolute, tc1);
  } /* H512_S36_285=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H512_S36_285", _H512_S36_285_var._position_absolute, _H512_S36_285_var._rotation_absolute);
  instrument->_position_absolute[285] = _H512_S36_285_var._position_absolute;
  instrument->_position_relative[285] = _H512_S36_285_var._position_relative;
    _H512_S36_285_var._position_relative_is_zero =  coords_test_zero(_H512_S36_285_var._position_relative);
  instrument->counter_N[285]  = instrument->counter_P[285] = instrument->counter_P2[285] = 0;
  instrument->counter_AbsorbProp[285]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0284_H512_S36_285", _H512_S36_285_var._position_absolute, _H512_S36_285_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "l", "NONE", "20.85 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0284_H512_S36_285", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H512_S36_285_setpos */

/* component H512_S36_286=Guide_gravity() SETTING, POSITION/ROTATION */
int _H512_S36_286_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H512_S36_286_setpos] component H512_S36_286=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H512_S36_286_var._name, "H512_S36_286", 16384);
  stracpy(_H512_S36_286_var._type, "Guide_gravity", 16384);
  _H512_S36_286_var._index=286;
  int current_setpos_index = 286;
  _H512_S36_286_var._parameters.w1 = 0.04;
  _H512_S36_286_var._parameters.h1 = 0.055;
  _H512_S36_286_var._parameters.w2 = 0;
  _H512_S36_286_var._parameters.h2 = 0;
  _H512_S36_286_var._parameters.l = 20.85 / 16;
  _H512_S36_286_var._parameters.R0 = gR0;
  _H512_S36_286_var._parameters.Qc = gQc;
  _H512_S36_286_var._parameters.alpha = gAlpha;
  _H512_S36_286_var._parameters.m = 1.2;
  _H512_S36_286_var._parameters.W = gW;
  _H512_S36_286_var._parameters.nslit = 1;
  _H512_S36_286_var._parameters.d = 0.0005;
  _H512_S36_286_var._parameters.mleft = -1;
  _H512_S36_286_var._parameters.mright = -1;
  _H512_S36_286_var._parameters.mtop = -1;
  _H512_S36_286_var._parameters.mbottom = -1;
  _H512_S36_286_var._parameters.nhslit = 1;
  _H512_S36_286_var._parameters.G = 0;
  _H512_S36_286_var._parameters.aleft = -1;
  _H512_S36_286_var._parameters.aright = -1;
  _H512_S36_286_var._parameters.atop = -1;
  _H512_S36_286_var._parameters.abottom = -1;
  _H512_S36_286_var._parameters.wavy = 0;
  _H512_S36_286_var._parameters.wavy_z = 0;
  _H512_S36_286_var._parameters.wavy_tb = 0;
  _H512_S36_286_var._parameters.wavy_lr = 0;
  _H512_S36_286_var._parameters.chamfers = 0;
  _H512_S36_286_var._parameters.chamfers_z = 0;
  _H512_S36_286_var._parameters.chamfers_lr = 0;
  _H512_S36_286_var._parameters.chamfers_tb = 0;
  _H512_S36_286_var._parameters.nelements = 1;
  _H512_S36_286_var._parameters.nu = 0;
  _H512_S36_286_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H512_S36_286_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H512_S36_286_var._parameters.reflect[0]='\0';


  /* component H512_S36_286=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-20.85 / 16 / 3000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H512_S36_285_var._rotation_absolute, _H512_S36_286_var._rotation_absolute);
    rot_transpose(_H512_S36_285_var._rotation_absolute, tr1);
    rot_mul(_H512_S36_286_var._rotation_absolute, tr1, _H512_S36_286_var._rotation_relative);
    _H512_S36_286_var._rotation_is_identity =  rot_test_identity(_H512_S36_286_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 20.85 / 16);
    rot_transpose(_H512_S36_285_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H512_S36_286_var._position_absolute = coords_add(_H512_S36_285_var._position_absolute, tc2);
    tc1 = coords_sub(_H512_S36_285_var._position_absolute, _H512_S36_286_var._position_absolute);
    _H512_S36_286_var._position_relative = rot_apply(_H512_S36_286_var._rotation_absolute, tc1);
  } /* H512_S36_286=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H512_S36_286", _H512_S36_286_var._position_absolute, _H512_S36_286_var._rotation_absolute);
  instrument->_position_absolute[286] = _H512_S36_286_var._position_absolute;
  instrument->_position_relative[286] = _H512_S36_286_var._position_relative;
    _H512_S36_286_var._position_relative_is_zero =  coords_test_zero(_H512_S36_286_var._position_relative);
  instrument->counter_N[286]  = instrument->counter_P[286] = instrument->counter_P2[286] = 0;
  instrument->counter_AbsorbProp[286]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0285_H512_S36_286", _H512_S36_286_var._position_absolute, _H512_S36_286_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "l", "NONE", "20.85 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0285_H512_S36_286", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H512_S36_286_setpos */

/* component H512_S36_287=Guide_gravity() SETTING, POSITION/ROTATION */
int _H512_S36_287_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H512_S36_287_setpos] component H512_S36_287=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H512_S36_287_var._name, "H512_S36_287", 16384);
  stracpy(_H512_S36_287_var._type, "Guide_gravity", 16384);
  _H512_S36_287_var._index=287;
  int current_setpos_index = 287;
  _H512_S36_287_var._parameters.w1 = 0.04;
  _H512_S36_287_var._parameters.h1 = 0.055;
  _H512_S36_287_var._parameters.w2 = 0;
  _H512_S36_287_var._parameters.h2 = 0;
  _H512_S36_287_var._parameters.l = 20.85 / 16;
  _H512_S36_287_var._parameters.R0 = gR0;
  _H512_S36_287_var._parameters.Qc = gQc;
  _H512_S36_287_var._parameters.alpha = gAlpha;
  _H512_S36_287_var._parameters.m = 1.2;
  _H512_S36_287_var._parameters.W = gW;
  _H512_S36_287_var._parameters.nslit = 1;
  _H512_S36_287_var._parameters.d = 0.0005;
  _H512_S36_287_var._parameters.mleft = -1;
  _H512_S36_287_var._parameters.mright = -1;
  _H512_S36_287_var._parameters.mtop = -1;
  _H512_S36_287_var._parameters.mbottom = -1;
  _H512_S36_287_var._parameters.nhslit = 1;
  _H512_S36_287_var._parameters.G = 0;
  _H512_S36_287_var._parameters.aleft = -1;
  _H512_S36_287_var._parameters.aright = -1;
  _H512_S36_287_var._parameters.atop = -1;
  _H512_S36_287_var._parameters.abottom = -1;
  _H512_S36_287_var._parameters.wavy = 0;
  _H512_S36_287_var._parameters.wavy_z = 0;
  _H512_S36_287_var._parameters.wavy_tb = 0;
  _H512_S36_287_var._parameters.wavy_lr = 0;
  _H512_S36_287_var._parameters.chamfers = 0;
  _H512_S36_287_var._parameters.chamfers_z = 0;
  _H512_S36_287_var._parameters.chamfers_lr = 0;
  _H512_S36_287_var._parameters.chamfers_tb = 0;
  _H512_S36_287_var._parameters.nelements = 1;
  _H512_S36_287_var._parameters.nu = 0;
  _H512_S36_287_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H512_S36_287_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H512_S36_287_var._parameters.reflect[0]='\0';


  /* component H512_S36_287=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-20.85 / 16 / 3000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H512_S36_286_var._rotation_absolute, _H512_S36_287_var._rotation_absolute);
    rot_transpose(_H512_S36_286_var._rotation_absolute, tr1);
    rot_mul(_H512_S36_287_var._rotation_absolute, tr1, _H512_S36_287_var._rotation_relative);
    _H512_S36_287_var._rotation_is_identity =  rot_test_identity(_H512_S36_287_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 20.85 / 16);
    rot_transpose(_H512_S36_286_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H512_S36_287_var._position_absolute = coords_add(_H512_S36_286_var._position_absolute, tc2);
    tc1 = coords_sub(_H512_S36_286_var._position_absolute, _H512_S36_287_var._position_absolute);
    _H512_S36_287_var._position_relative = rot_apply(_H512_S36_287_var._rotation_absolute, tc1);
  } /* H512_S36_287=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H512_S36_287", _H512_S36_287_var._position_absolute, _H512_S36_287_var._rotation_absolute);
  instrument->_position_absolute[287] = _H512_S36_287_var._position_absolute;
  instrument->_position_relative[287] = _H512_S36_287_var._position_relative;
    _H512_S36_287_var._position_relative_is_zero =  coords_test_zero(_H512_S36_287_var._position_relative);
  instrument->counter_N[287]  = instrument->counter_P[287] = instrument->counter_P2[287] = 0;
  instrument->counter_AbsorbProp[287]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0286_H512_S36_287", _H512_S36_287_var._position_absolute, _H512_S36_287_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "l", "NONE", "20.85 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0286_H512_S36_287", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H512_S36_287_setpos */

/* component H512_S36_288=Guide_gravity() SETTING, POSITION/ROTATION */
int _H512_S36_288_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H512_S36_288_setpos] component H512_S36_288=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H512_S36_288_var._name, "H512_S36_288", 16384);
  stracpy(_H512_S36_288_var._type, "Guide_gravity", 16384);
  _H512_S36_288_var._index=288;
  int current_setpos_index = 288;
  _H512_S36_288_var._parameters.w1 = 0.04;
  _H512_S36_288_var._parameters.h1 = 0.055;
  _H512_S36_288_var._parameters.w2 = 0;
  _H512_S36_288_var._parameters.h2 = 0;
  _H512_S36_288_var._parameters.l = 20.85 / 16;
  _H512_S36_288_var._parameters.R0 = gR0;
  _H512_S36_288_var._parameters.Qc = gQc;
  _H512_S36_288_var._parameters.alpha = gAlpha;
  _H512_S36_288_var._parameters.m = 1.2;
  _H512_S36_288_var._parameters.W = gW;
  _H512_S36_288_var._parameters.nslit = 1;
  _H512_S36_288_var._parameters.d = 0.0005;
  _H512_S36_288_var._parameters.mleft = -1;
  _H512_S36_288_var._parameters.mright = -1;
  _H512_S36_288_var._parameters.mtop = -1;
  _H512_S36_288_var._parameters.mbottom = -1;
  _H512_S36_288_var._parameters.nhslit = 1;
  _H512_S36_288_var._parameters.G = 0;
  _H512_S36_288_var._parameters.aleft = -1;
  _H512_S36_288_var._parameters.aright = -1;
  _H512_S36_288_var._parameters.atop = -1;
  _H512_S36_288_var._parameters.abottom = -1;
  _H512_S36_288_var._parameters.wavy = 0;
  _H512_S36_288_var._parameters.wavy_z = 0;
  _H512_S36_288_var._parameters.wavy_tb = 0;
  _H512_S36_288_var._parameters.wavy_lr = 0;
  _H512_S36_288_var._parameters.chamfers = 0;
  _H512_S36_288_var._parameters.chamfers_z = 0;
  _H512_S36_288_var._parameters.chamfers_lr = 0;
  _H512_S36_288_var._parameters.chamfers_tb = 0;
  _H512_S36_288_var._parameters.nelements = 1;
  _H512_S36_288_var._parameters.nu = 0;
  _H512_S36_288_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H512_S36_288_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H512_S36_288_var._parameters.reflect[0]='\0';


  /* component H512_S36_288=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-20.85 / 16 / 3000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H512_S36_287_var._rotation_absolute, _H512_S36_288_var._rotation_absolute);
    rot_transpose(_H512_S36_287_var._rotation_absolute, tr1);
    rot_mul(_H512_S36_288_var._rotation_absolute, tr1, _H512_S36_288_var._rotation_relative);
    _H512_S36_288_var._rotation_is_identity =  rot_test_identity(_H512_S36_288_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 20.85 / 16);
    rot_transpose(_H512_S36_287_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H512_S36_288_var._position_absolute = coords_add(_H512_S36_287_var._position_absolute, tc2);
    tc1 = coords_sub(_H512_S36_287_var._position_absolute, _H512_S36_288_var._position_absolute);
    _H512_S36_288_var._position_relative = rot_apply(_H512_S36_288_var._rotation_absolute, tc1);
  } /* H512_S36_288=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H512_S36_288", _H512_S36_288_var._position_absolute, _H512_S36_288_var._rotation_absolute);
  instrument->_position_absolute[288] = _H512_S36_288_var._position_absolute;
  instrument->_position_relative[288] = _H512_S36_288_var._position_relative;
    _H512_S36_288_var._position_relative_is_zero =  coords_test_zero(_H512_S36_288_var._position_relative);
  instrument->counter_N[288]  = instrument->counter_P[288] = instrument->counter_P2[288] = 0;
  instrument->counter_AbsorbProp[288]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0287_H512_S36_288", _H512_S36_288_var._position_absolute, _H512_S36_288_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "l", "NONE", "20.85 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0287_H512_S36_288", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H512_S36_288_setpos */

/* component H512_S36_289=Guide_gravity() SETTING, POSITION/ROTATION */
int _H512_S36_289_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H512_S36_289_setpos] component H512_S36_289=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H512_S36_289_var._name, "H512_S36_289", 16384);
  stracpy(_H512_S36_289_var._type, "Guide_gravity", 16384);
  _H512_S36_289_var._index=289;
  int current_setpos_index = 289;
  _H512_S36_289_var._parameters.w1 = 0.04;
  _H512_S36_289_var._parameters.h1 = 0.055;
  _H512_S36_289_var._parameters.w2 = 0;
  _H512_S36_289_var._parameters.h2 = 0;
  _H512_S36_289_var._parameters.l = 20.85 / 16;
  _H512_S36_289_var._parameters.R0 = gR0;
  _H512_S36_289_var._parameters.Qc = gQc;
  _H512_S36_289_var._parameters.alpha = gAlpha;
  _H512_S36_289_var._parameters.m = 1.2;
  _H512_S36_289_var._parameters.W = gW;
  _H512_S36_289_var._parameters.nslit = 1;
  _H512_S36_289_var._parameters.d = 0.0005;
  _H512_S36_289_var._parameters.mleft = -1;
  _H512_S36_289_var._parameters.mright = -1;
  _H512_S36_289_var._parameters.mtop = -1;
  _H512_S36_289_var._parameters.mbottom = -1;
  _H512_S36_289_var._parameters.nhslit = 1;
  _H512_S36_289_var._parameters.G = 0;
  _H512_S36_289_var._parameters.aleft = -1;
  _H512_S36_289_var._parameters.aright = -1;
  _H512_S36_289_var._parameters.atop = -1;
  _H512_S36_289_var._parameters.abottom = -1;
  _H512_S36_289_var._parameters.wavy = 0;
  _H512_S36_289_var._parameters.wavy_z = 0;
  _H512_S36_289_var._parameters.wavy_tb = 0;
  _H512_S36_289_var._parameters.wavy_lr = 0;
  _H512_S36_289_var._parameters.chamfers = 0;
  _H512_S36_289_var._parameters.chamfers_z = 0;
  _H512_S36_289_var._parameters.chamfers_lr = 0;
  _H512_S36_289_var._parameters.chamfers_tb = 0;
  _H512_S36_289_var._parameters.nelements = 1;
  _H512_S36_289_var._parameters.nu = 0;
  _H512_S36_289_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H512_S36_289_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H512_S36_289_var._parameters.reflect[0]='\0';


  /* component H512_S36_289=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-20.85 / 16 / 3000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H512_S36_288_var._rotation_absolute, _H512_S36_289_var._rotation_absolute);
    rot_transpose(_H512_S36_288_var._rotation_absolute, tr1);
    rot_mul(_H512_S36_289_var._rotation_absolute, tr1, _H512_S36_289_var._rotation_relative);
    _H512_S36_289_var._rotation_is_identity =  rot_test_identity(_H512_S36_289_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 20.85 / 16);
    rot_transpose(_H512_S36_288_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H512_S36_289_var._position_absolute = coords_add(_H512_S36_288_var._position_absolute, tc2);
    tc1 = coords_sub(_H512_S36_288_var._position_absolute, _H512_S36_289_var._position_absolute);
    _H512_S36_289_var._position_relative = rot_apply(_H512_S36_289_var._rotation_absolute, tc1);
  } /* H512_S36_289=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H512_S36_289", _H512_S36_289_var._position_absolute, _H512_S36_289_var._rotation_absolute);
  instrument->_position_absolute[289] = _H512_S36_289_var._position_absolute;
  instrument->_position_relative[289] = _H512_S36_289_var._position_relative;
    _H512_S36_289_var._position_relative_is_zero =  coords_test_zero(_H512_S36_289_var._position_relative);
  instrument->counter_N[289]  = instrument->counter_P[289] = instrument->counter_P2[289] = 0;
  instrument->counter_AbsorbProp[289]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0288_H512_S36_289", _H512_S36_289_var._position_absolute, _H512_S36_289_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "l", "NONE", "20.85 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0288_H512_S36_289", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H512_S36_289_setpos */

/* component H512_S36_290=Guide_gravity() SETTING, POSITION/ROTATION */
int _H512_S36_290_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H512_S36_290_setpos] component H512_S36_290=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H512_S36_290_var._name, "H512_S36_290", 16384);
  stracpy(_H512_S36_290_var._type, "Guide_gravity", 16384);
  _H512_S36_290_var._index=290;
  int current_setpos_index = 290;
  _H512_S36_290_var._parameters.w1 = 0.04;
  _H512_S36_290_var._parameters.h1 = 0.055;
  _H512_S36_290_var._parameters.w2 = 0;
  _H512_S36_290_var._parameters.h2 = 0;
  _H512_S36_290_var._parameters.l = 20.85 / 16;
  _H512_S36_290_var._parameters.R0 = gR0;
  _H512_S36_290_var._parameters.Qc = gQc;
  _H512_S36_290_var._parameters.alpha = gAlpha;
  _H512_S36_290_var._parameters.m = 1.2;
  _H512_S36_290_var._parameters.W = gW;
  _H512_S36_290_var._parameters.nslit = 1;
  _H512_S36_290_var._parameters.d = 0.0005;
  _H512_S36_290_var._parameters.mleft = -1;
  _H512_S36_290_var._parameters.mright = -1;
  _H512_S36_290_var._parameters.mtop = -1;
  _H512_S36_290_var._parameters.mbottom = -1;
  _H512_S36_290_var._parameters.nhslit = 1;
  _H512_S36_290_var._parameters.G = 0;
  _H512_S36_290_var._parameters.aleft = -1;
  _H512_S36_290_var._parameters.aright = -1;
  _H512_S36_290_var._parameters.atop = -1;
  _H512_S36_290_var._parameters.abottom = -1;
  _H512_S36_290_var._parameters.wavy = 0;
  _H512_S36_290_var._parameters.wavy_z = 0;
  _H512_S36_290_var._parameters.wavy_tb = 0;
  _H512_S36_290_var._parameters.wavy_lr = 0;
  _H512_S36_290_var._parameters.chamfers = 0;
  _H512_S36_290_var._parameters.chamfers_z = 0;
  _H512_S36_290_var._parameters.chamfers_lr = 0;
  _H512_S36_290_var._parameters.chamfers_tb = 0;
  _H512_S36_290_var._parameters.nelements = 1;
  _H512_S36_290_var._parameters.nu = 0;
  _H512_S36_290_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H512_S36_290_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H512_S36_290_var._parameters.reflect[0]='\0';


  /* component H512_S36_290=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-20.85 / 16 / 3000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H512_S36_289_var._rotation_absolute, _H512_S36_290_var._rotation_absolute);
    rot_transpose(_H512_S36_289_var._rotation_absolute, tr1);
    rot_mul(_H512_S36_290_var._rotation_absolute, tr1, _H512_S36_290_var._rotation_relative);
    _H512_S36_290_var._rotation_is_identity =  rot_test_identity(_H512_S36_290_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 20.85 / 16);
    rot_transpose(_H512_S36_289_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H512_S36_290_var._position_absolute = coords_add(_H512_S36_289_var._position_absolute, tc2);
    tc1 = coords_sub(_H512_S36_289_var._position_absolute, _H512_S36_290_var._position_absolute);
    _H512_S36_290_var._position_relative = rot_apply(_H512_S36_290_var._rotation_absolute, tc1);
  } /* H512_S36_290=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H512_S36_290", _H512_S36_290_var._position_absolute, _H512_S36_290_var._rotation_absolute);
  instrument->_position_absolute[290] = _H512_S36_290_var._position_absolute;
  instrument->_position_relative[290] = _H512_S36_290_var._position_relative;
    _H512_S36_290_var._position_relative_is_zero =  coords_test_zero(_H512_S36_290_var._position_relative);
  instrument->counter_N[290]  = instrument->counter_P[290] = instrument->counter_P2[290] = 0;
  instrument->counter_AbsorbProp[290]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0289_H512_S36_290", _H512_S36_290_var._position_absolute, _H512_S36_290_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "l", "NONE", "20.85 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0289_H512_S36_290", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H512_S36_290_setpos */

/* component H512_S36_291=Guide_gravity() SETTING, POSITION/ROTATION */
int _H512_S36_291_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H512_S36_291_setpos] component H512_S36_291=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H512_S36_291_var._name, "H512_S36_291", 16384);
  stracpy(_H512_S36_291_var._type, "Guide_gravity", 16384);
  _H512_S36_291_var._index=291;
  int current_setpos_index = 291;
  _H512_S36_291_var._parameters.w1 = 0.04;
  _H512_S36_291_var._parameters.h1 = 0.055;
  _H512_S36_291_var._parameters.w2 = 0;
  _H512_S36_291_var._parameters.h2 = 0;
  _H512_S36_291_var._parameters.l = 20.85 / 16;
  _H512_S36_291_var._parameters.R0 = gR0;
  _H512_S36_291_var._parameters.Qc = gQc;
  _H512_S36_291_var._parameters.alpha = gAlpha;
  _H512_S36_291_var._parameters.m = 1.2;
  _H512_S36_291_var._parameters.W = gW;
  _H512_S36_291_var._parameters.nslit = 1;
  _H512_S36_291_var._parameters.d = 0.0005;
  _H512_S36_291_var._parameters.mleft = -1;
  _H512_S36_291_var._parameters.mright = -1;
  _H512_S36_291_var._parameters.mtop = -1;
  _H512_S36_291_var._parameters.mbottom = -1;
  _H512_S36_291_var._parameters.nhslit = 1;
  _H512_S36_291_var._parameters.G = 0;
  _H512_S36_291_var._parameters.aleft = -1;
  _H512_S36_291_var._parameters.aright = -1;
  _H512_S36_291_var._parameters.atop = -1;
  _H512_S36_291_var._parameters.abottom = -1;
  _H512_S36_291_var._parameters.wavy = 0;
  _H512_S36_291_var._parameters.wavy_z = 0;
  _H512_S36_291_var._parameters.wavy_tb = 0;
  _H512_S36_291_var._parameters.wavy_lr = 0;
  _H512_S36_291_var._parameters.chamfers = 0;
  _H512_S36_291_var._parameters.chamfers_z = 0;
  _H512_S36_291_var._parameters.chamfers_lr = 0;
  _H512_S36_291_var._parameters.chamfers_tb = 0;
  _H512_S36_291_var._parameters.nelements = 1;
  _H512_S36_291_var._parameters.nu = 0;
  _H512_S36_291_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H512_S36_291_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H512_S36_291_var._parameters.reflect[0]='\0';


  /* component H512_S36_291=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-20.85 / 16 / 3000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H512_S36_290_var._rotation_absolute, _H512_S36_291_var._rotation_absolute);
    rot_transpose(_H512_S36_290_var._rotation_absolute, tr1);
    rot_mul(_H512_S36_291_var._rotation_absolute, tr1, _H512_S36_291_var._rotation_relative);
    _H512_S36_291_var._rotation_is_identity =  rot_test_identity(_H512_S36_291_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 20.85 / 16);
    rot_transpose(_H512_S36_290_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H512_S36_291_var._position_absolute = coords_add(_H512_S36_290_var._position_absolute, tc2);
    tc1 = coords_sub(_H512_S36_290_var._position_absolute, _H512_S36_291_var._position_absolute);
    _H512_S36_291_var._position_relative = rot_apply(_H512_S36_291_var._rotation_absolute, tc1);
  } /* H512_S36_291=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H512_S36_291", _H512_S36_291_var._position_absolute, _H512_S36_291_var._rotation_absolute);
  instrument->_position_absolute[291] = _H512_S36_291_var._position_absolute;
  instrument->_position_relative[291] = _H512_S36_291_var._position_relative;
    _H512_S36_291_var._position_relative_is_zero =  coords_test_zero(_H512_S36_291_var._position_relative);
  instrument->counter_N[291]  = instrument->counter_P[291] = instrument->counter_P2[291] = 0;
  instrument->counter_AbsorbProp[291]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0290_H512_S36_291", _H512_S36_291_var._position_absolute, _H512_S36_291_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "l", "NONE", "20.85 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0290_H512_S36_291", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H512_S36_291_setpos */

/* component H512_S36_292=Guide_gravity() SETTING, POSITION/ROTATION */
int _H512_S36_292_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H512_S36_292_setpos] component H512_S36_292=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H512_S36_292_var._name, "H512_S36_292", 16384);
  stracpy(_H512_S36_292_var._type, "Guide_gravity", 16384);
  _H512_S36_292_var._index=292;
  int current_setpos_index = 292;
  _H512_S36_292_var._parameters.w1 = 0.04;
  _H512_S36_292_var._parameters.h1 = 0.055;
  _H512_S36_292_var._parameters.w2 = 0;
  _H512_S36_292_var._parameters.h2 = 0;
  _H512_S36_292_var._parameters.l = 20.85 / 16;
  _H512_S36_292_var._parameters.R0 = gR0;
  _H512_S36_292_var._parameters.Qc = gQc;
  _H512_S36_292_var._parameters.alpha = gAlpha;
  _H512_S36_292_var._parameters.m = 1.2;
  _H512_S36_292_var._parameters.W = gW;
  _H512_S36_292_var._parameters.nslit = 1;
  _H512_S36_292_var._parameters.d = 0.0005;
  _H512_S36_292_var._parameters.mleft = -1;
  _H512_S36_292_var._parameters.mright = -1;
  _H512_S36_292_var._parameters.mtop = -1;
  _H512_S36_292_var._parameters.mbottom = -1;
  _H512_S36_292_var._parameters.nhslit = 1;
  _H512_S36_292_var._parameters.G = 0;
  _H512_S36_292_var._parameters.aleft = -1;
  _H512_S36_292_var._parameters.aright = -1;
  _H512_S36_292_var._parameters.atop = -1;
  _H512_S36_292_var._parameters.abottom = -1;
  _H512_S36_292_var._parameters.wavy = 0;
  _H512_S36_292_var._parameters.wavy_z = 0;
  _H512_S36_292_var._parameters.wavy_tb = 0;
  _H512_S36_292_var._parameters.wavy_lr = 0;
  _H512_S36_292_var._parameters.chamfers = 0;
  _H512_S36_292_var._parameters.chamfers_z = 0;
  _H512_S36_292_var._parameters.chamfers_lr = 0;
  _H512_S36_292_var._parameters.chamfers_tb = 0;
  _H512_S36_292_var._parameters.nelements = 1;
  _H512_S36_292_var._parameters.nu = 0;
  _H512_S36_292_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H512_S36_292_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H512_S36_292_var._parameters.reflect[0]='\0';


  /* component H512_S36_292=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-20.85 / 16 / 3000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H512_S36_291_var._rotation_absolute, _H512_S36_292_var._rotation_absolute);
    rot_transpose(_H512_S36_291_var._rotation_absolute, tr1);
    rot_mul(_H512_S36_292_var._rotation_absolute, tr1, _H512_S36_292_var._rotation_relative);
    _H512_S36_292_var._rotation_is_identity =  rot_test_identity(_H512_S36_292_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 20.85 / 16);
    rot_transpose(_H512_S36_291_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H512_S36_292_var._position_absolute = coords_add(_H512_S36_291_var._position_absolute, tc2);
    tc1 = coords_sub(_H512_S36_291_var._position_absolute, _H512_S36_292_var._position_absolute);
    _H512_S36_292_var._position_relative = rot_apply(_H512_S36_292_var._rotation_absolute, tc1);
  } /* H512_S36_292=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H512_S36_292", _H512_S36_292_var._position_absolute, _H512_S36_292_var._rotation_absolute);
  instrument->_position_absolute[292] = _H512_S36_292_var._position_absolute;
  instrument->_position_relative[292] = _H512_S36_292_var._position_relative;
    _H512_S36_292_var._position_relative_is_zero =  coords_test_zero(_H512_S36_292_var._position_relative);
  instrument->counter_N[292]  = instrument->counter_P[292] = instrument->counter_P2[292] = 0;
  instrument->counter_AbsorbProp[292]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0291_H512_S36_292", _H512_S36_292_var._position_absolute, _H512_S36_292_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "l", "NONE", "20.85 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0291_H512_S36_292", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H512_S36_292_setpos */

/* component H512_S36_293=Guide_gravity() SETTING, POSITION/ROTATION */
int _H512_S36_293_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H512_S36_293_setpos] component H512_S36_293=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H512_S36_293_var._name, "H512_S36_293", 16384);
  stracpy(_H512_S36_293_var._type, "Guide_gravity", 16384);
  _H512_S36_293_var._index=293;
  int current_setpos_index = 293;
  _H512_S36_293_var._parameters.w1 = 0.04;
  _H512_S36_293_var._parameters.h1 = 0.055;
  _H512_S36_293_var._parameters.w2 = 0;
  _H512_S36_293_var._parameters.h2 = 0;
  _H512_S36_293_var._parameters.l = 20.85 / 16;
  _H512_S36_293_var._parameters.R0 = gR0;
  _H512_S36_293_var._parameters.Qc = gQc;
  _H512_S36_293_var._parameters.alpha = gAlpha;
  _H512_S36_293_var._parameters.m = 1.2;
  _H512_S36_293_var._parameters.W = gW;
  _H512_S36_293_var._parameters.nslit = 1;
  _H512_S36_293_var._parameters.d = 0.0005;
  _H512_S36_293_var._parameters.mleft = -1;
  _H512_S36_293_var._parameters.mright = -1;
  _H512_S36_293_var._parameters.mtop = -1;
  _H512_S36_293_var._parameters.mbottom = -1;
  _H512_S36_293_var._parameters.nhslit = 1;
  _H512_S36_293_var._parameters.G = 0;
  _H512_S36_293_var._parameters.aleft = -1;
  _H512_S36_293_var._parameters.aright = -1;
  _H512_S36_293_var._parameters.atop = -1;
  _H512_S36_293_var._parameters.abottom = -1;
  _H512_S36_293_var._parameters.wavy = 0;
  _H512_S36_293_var._parameters.wavy_z = 0;
  _H512_S36_293_var._parameters.wavy_tb = 0;
  _H512_S36_293_var._parameters.wavy_lr = 0;
  _H512_S36_293_var._parameters.chamfers = 0;
  _H512_S36_293_var._parameters.chamfers_z = 0;
  _H512_S36_293_var._parameters.chamfers_lr = 0;
  _H512_S36_293_var._parameters.chamfers_tb = 0;
  _H512_S36_293_var._parameters.nelements = 1;
  _H512_S36_293_var._parameters.nu = 0;
  _H512_S36_293_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H512_S36_293_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H512_S36_293_var._parameters.reflect[0]='\0';


  /* component H512_S36_293=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-20.85 / 16 / 3000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H512_S36_292_var._rotation_absolute, _H512_S36_293_var._rotation_absolute);
    rot_transpose(_H512_S36_292_var._rotation_absolute, tr1);
    rot_mul(_H512_S36_293_var._rotation_absolute, tr1, _H512_S36_293_var._rotation_relative);
    _H512_S36_293_var._rotation_is_identity =  rot_test_identity(_H512_S36_293_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 20.85 / 16);
    rot_transpose(_H512_S36_292_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H512_S36_293_var._position_absolute = coords_add(_H512_S36_292_var._position_absolute, tc2);
    tc1 = coords_sub(_H512_S36_292_var._position_absolute, _H512_S36_293_var._position_absolute);
    _H512_S36_293_var._position_relative = rot_apply(_H512_S36_293_var._rotation_absolute, tc1);
  } /* H512_S36_293=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H512_S36_293", _H512_S36_293_var._position_absolute, _H512_S36_293_var._rotation_absolute);
  instrument->_position_absolute[293] = _H512_S36_293_var._position_absolute;
  instrument->_position_relative[293] = _H512_S36_293_var._position_relative;
    _H512_S36_293_var._position_relative_is_zero =  coords_test_zero(_H512_S36_293_var._position_relative);
  instrument->counter_N[293]  = instrument->counter_P[293] = instrument->counter_P2[293] = 0;
  instrument->counter_AbsorbProp[293]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0292_H512_S36_293", _H512_S36_293_var._position_absolute, _H512_S36_293_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "l", "NONE", "20.85 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0292_H512_S36_293", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H512_S36_293_setpos */

/* component H512_S36_294=Guide_gravity() SETTING, POSITION/ROTATION */
int _H512_S36_294_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H512_S36_294_setpos] component H512_S36_294=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H512_S36_294_var._name, "H512_S36_294", 16384);
  stracpy(_H512_S36_294_var._type, "Guide_gravity", 16384);
  _H512_S36_294_var._index=294;
  int current_setpos_index = 294;
  _H512_S36_294_var._parameters.w1 = 0.04;
  _H512_S36_294_var._parameters.h1 = 0.055;
  _H512_S36_294_var._parameters.w2 = 0;
  _H512_S36_294_var._parameters.h2 = 0;
  _H512_S36_294_var._parameters.l = 20.85 / 16;
  _H512_S36_294_var._parameters.R0 = gR0;
  _H512_S36_294_var._parameters.Qc = gQc;
  _H512_S36_294_var._parameters.alpha = gAlpha;
  _H512_S36_294_var._parameters.m = 1.2;
  _H512_S36_294_var._parameters.W = gW;
  _H512_S36_294_var._parameters.nslit = 1;
  _H512_S36_294_var._parameters.d = 0.0005;
  _H512_S36_294_var._parameters.mleft = -1;
  _H512_S36_294_var._parameters.mright = -1;
  _H512_S36_294_var._parameters.mtop = -1;
  _H512_S36_294_var._parameters.mbottom = -1;
  _H512_S36_294_var._parameters.nhslit = 1;
  _H512_S36_294_var._parameters.G = 0;
  _H512_S36_294_var._parameters.aleft = -1;
  _H512_S36_294_var._parameters.aright = -1;
  _H512_S36_294_var._parameters.atop = -1;
  _H512_S36_294_var._parameters.abottom = -1;
  _H512_S36_294_var._parameters.wavy = 0;
  _H512_S36_294_var._parameters.wavy_z = 0;
  _H512_S36_294_var._parameters.wavy_tb = 0;
  _H512_S36_294_var._parameters.wavy_lr = 0;
  _H512_S36_294_var._parameters.chamfers = 0;
  _H512_S36_294_var._parameters.chamfers_z = 0;
  _H512_S36_294_var._parameters.chamfers_lr = 0;
  _H512_S36_294_var._parameters.chamfers_tb = 0;
  _H512_S36_294_var._parameters.nelements = 1;
  _H512_S36_294_var._parameters.nu = 0;
  _H512_S36_294_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H512_S36_294_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H512_S36_294_var._parameters.reflect[0]='\0';


  /* component H512_S36_294=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-20.85 / 16 / 3000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H512_S36_293_var._rotation_absolute, _H512_S36_294_var._rotation_absolute);
    rot_transpose(_H512_S36_293_var._rotation_absolute, tr1);
    rot_mul(_H512_S36_294_var._rotation_absolute, tr1, _H512_S36_294_var._rotation_relative);
    _H512_S36_294_var._rotation_is_identity =  rot_test_identity(_H512_S36_294_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 20.85 / 16);
    rot_transpose(_H512_S36_293_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H512_S36_294_var._position_absolute = coords_add(_H512_S36_293_var._position_absolute, tc2);
    tc1 = coords_sub(_H512_S36_293_var._position_absolute, _H512_S36_294_var._position_absolute);
    _H512_S36_294_var._position_relative = rot_apply(_H512_S36_294_var._rotation_absolute, tc1);
  } /* H512_S36_294=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H512_S36_294", _H512_S36_294_var._position_absolute, _H512_S36_294_var._rotation_absolute);
  instrument->_position_absolute[294] = _H512_S36_294_var._position_absolute;
  instrument->_position_relative[294] = _H512_S36_294_var._position_relative;
    _H512_S36_294_var._position_relative_is_zero =  coords_test_zero(_H512_S36_294_var._position_relative);
  instrument->counter_N[294]  = instrument->counter_P[294] = instrument->counter_P2[294] = 0;
  instrument->counter_AbsorbProp[294]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0293_H512_S36_294", _H512_S36_294_var._position_absolute, _H512_S36_294_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "l", "NONE", "20.85 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0293_H512_S36_294", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H512_S36_294_setpos */

/* component H512_S36_295=Guide_gravity() SETTING, POSITION/ROTATION */
int _H512_S36_295_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H512_S36_295_setpos] component H512_S36_295=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H512_S36_295_var._name, "H512_S36_295", 16384);
  stracpy(_H512_S36_295_var._type, "Guide_gravity", 16384);
  _H512_S36_295_var._index=295;
  int current_setpos_index = 295;
  _H512_S36_295_var._parameters.w1 = 0.04;
  _H512_S36_295_var._parameters.h1 = 0.055;
  _H512_S36_295_var._parameters.w2 = 0;
  _H512_S36_295_var._parameters.h2 = 0;
  _H512_S36_295_var._parameters.l = 20.85 / 16;
  _H512_S36_295_var._parameters.R0 = gR0;
  _H512_S36_295_var._parameters.Qc = gQc;
  _H512_S36_295_var._parameters.alpha = gAlpha;
  _H512_S36_295_var._parameters.m = 1.2;
  _H512_S36_295_var._parameters.W = gW;
  _H512_S36_295_var._parameters.nslit = 1;
  _H512_S36_295_var._parameters.d = 0.0005;
  _H512_S36_295_var._parameters.mleft = -1;
  _H512_S36_295_var._parameters.mright = -1;
  _H512_S36_295_var._parameters.mtop = -1;
  _H512_S36_295_var._parameters.mbottom = -1;
  _H512_S36_295_var._parameters.nhslit = 1;
  _H512_S36_295_var._parameters.G = 0;
  _H512_S36_295_var._parameters.aleft = -1;
  _H512_S36_295_var._parameters.aright = -1;
  _H512_S36_295_var._parameters.atop = -1;
  _H512_S36_295_var._parameters.abottom = -1;
  _H512_S36_295_var._parameters.wavy = 0;
  _H512_S36_295_var._parameters.wavy_z = 0;
  _H512_S36_295_var._parameters.wavy_tb = 0;
  _H512_S36_295_var._parameters.wavy_lr = 0;
  _H512_S36_295_var._parameters.chamfers = 0;
  _H512_S36_295_var._parameters.chamfers_z = 0;
  _H512_S36_295_var._parameters.chamfers_lr = 0;
  _H512_S36_295_var._parameters.chamfers_tb = 0;
  _H512_S36_295_var._parameters.nelements = 1;
  _H512_S36_295_var._parameters.nu = 0;
  _H512_S36_295_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H512_S36_295_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H512_S36_295_var._parameters.reflect[0]='\0';


  /* component H512_S36_295=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-20.85 / 16 / 3000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H512_S36_294_var._rotation_absolute, _H512_S36_295_var._rotation_absolute);
    rot_transpose(_H512_S36_294_var._rotation_absolute, tr1);
    rot_mul(_H512_S36_295_var._rotation_absolute, tr1, _H512_S36_295_var._rotation_relative);
    _H512_S36_295_var._rotation_is_identity =  rot_test_identity(_H512_S36_295_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 20.85 / 16);
    rot_transpose(_H512_S36_294_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H512_S36_295_var._position_absolute = coords_add(_H512_S36_294_var._position_absolute, tc2);
    tc1 = coords_sub(_H512_S36_294_var._position_absolute, _H512_S36_295_var._position_absolute);
    _H512_S36_295_var._position_relative = rot_apply(_H512_S36_295_var._rotation_absolute, tc1);
  } /* H512_S36_295=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H512_S36_295", _H512_S36_295_var._position_absolute, _H512_S36_295_var._rotation_absolute);
  instrument->_position_absolute[295] = _H512_S36_295_var._position_absolute;
  instrument->_position_relative[295] = _H512_S36_295_var._position_relative;
    _H512_S36_295_var._position_relative_is_zero =  coords_test_zero(_H512_S36_295_var._position_relative);
  instrument->counter_N[295]  = instrument->counter_P[295] = instrument->counter_P2[295] = 0;
  instrument->counter_AbsorbProp[295]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0294_H512_S36_295", _H512_S36_295_var._position_absolute, _H512_S36_295_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "l", "NONE", "20.85 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0294_H512_S36_295", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H512_S36_295_setpos */

/* component H512_S36_296=Guide_gravity() SETTING, POSITION/ROTATION */
int _H512_S36_296_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H512_S36_296_setpos] component H512_S36_296=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H512_S36_296_var._name, "H512_S36_296", 16384);
  stracpy(_H512_S36_296_var._type, "Guide_gravity", 16384);
  _H512_S36_296_var._index=296;
  int current_setpos_index = 296;
  _H512_S36_296_var._parameters.w1 = 0.04;
  _H512_S36_296_var._parameters.h1 = 0.055;
  _H512_S36_296_var._parameters.w2 = 0;
  _H512_S36_296_var._parameters.h2 = 0;
  _H512_S36_296_var._parameters.l = 20.85 / 16;
  _H512_S36_296_var._parameters.R0 = gR0;
  _H512_S36_296_var._parameters.Qc = gQc;
  _H512_S36_296_var._parameters.alpha = gAlpha;
  _H512_S36_296_var._parameters.m = 1.2;
  _H512_S36_296_var._parameters.W = gW;
  _H512_S36_296_var._parameters.nslit = 1;
  _H512_S36_296_var._parameters.d = 0.0005;
  _H512_S36_296_var._parameters.mleft = -1;
  _H512_S36_296_var._parameters.mright = -1;
  _H512_S36_296_var._parameters.mtop = -1;
  _H512_S36_296_var._parameters.mbottom = -1;
  _H512_S36_296_var._parameters.nhslit = 1;
  _H512_S36_296_var._parameters.G = 0;
  _H512_S36_296_var._parameters.aleft = -1;
  _H512_S36_296_var._parameters.aright = -1;
  _H512_S36_296_var._parameters.atop = -1;
  _H512_S36_296_var._parameters.abottom = -1;
  _H512_S36_296_var._parameters.wavy = 0;
  _H512_S36_296_var._parameters.wavy_z = 0;
  _H512_S36_296_var._parameters.wavy_tb = 0;
  _H512_S36_296_var._parameters.wavy_lr = 0;
  _H512_S36_296_var._parameters.chamfers = 0;
  _H512_S36_296_var._parameters.chamfers_z = 0;
  _H512_S36_296_var._parameters.chamfers_lr = 0;
  _H512_S36_296_var._parameters.chamfers_tb = 0;
  _H512_S36_296_var._parameters.nelements = 1;
  _H512_S36_296_var._parameters.nu = 0;
  _H512_S36_296_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H512_S36_296_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H512_S36_296_var._parameters.reflect[0]='\0';


  /* component H512_S36_296=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-20.85 / 16 / 3000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H512_S36_295_var._rotation_absolute, _H512_S36_296_var._rotation_absolute);
    rot_transpose(_H512_S36_295_var._rotation_absolute, tr1);
    rot_mul(_H512_S36_296_var._rotation_absolute, tr1, _H512_S36_296_var._rotation_relative);
    _H512_S36_296_var._rotation_is_identity =  rot_test_identity(_H512_S36_296_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 20.85 / 16);
    rot_transpose(_H512_S36_295_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H512_S36_296_var._position_absolute = coords_add(_H512_S36_295_var._position_absolute, tc2);
    tc1 = coords_sub(_H512_S36_295_var._position_absolute, _H512_S36_296_var._position_absolute);
    _H512_S36_296_var._position_relative = rot_apply(_H512_S36_296_var._rotation_absolute, tc1);
  } /* H512_S36_296=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H512_S36_296", _H512_S36_296_var._position_absolute, _H512_S36_296_var._rotation_absolute);
  instrument->_position_absolute[296] = _H512_S36_296_var._position_absolute;
  instrument->_position_relative[296] = _H512_S36_296_var._position_relative;
    _H512_S36_296_var._position_relative_is_zero =  coords_test_zero(_H512_S36_296_var._position_relative);
  instrument->counter_N[296]  = instrument->counter_P[296] = instrument->counter_P2[296] = 0;
  instrument->counter_AbsorbProp[296]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0295_H512_S36_296", _H512_S36_296_var._position_absolute, _H512_S36_296_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "l", "NONE", "20.85 / 16","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0295_H512_S36_296", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H512_S36_296_setpos */

/* component HCS_Al_H512=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_H512_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_H512_setpos] component HCS_Al_H512=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_H512_var._name, "HCS_Al_H512", 16384);
  stracpy(_HCS_Al_H512_var._type, "PowderN", 16384);
  _HCS_Al_H512_var._index=297;
  int current_setpos_index = 297;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_H512_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_H512_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_H512_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_H512_var._parameters.geometry[0]='\0';
  _HCS_Al_H512_var._parameters.format[0] = 0;
  _HCS_Al_H512_var._parameters.format[1] = 0;
  _HCS_Al_H512_var._parameters.format[2] = 0;
  _HCS_Al_H512_var._parameters.format[3] = 0;
  _HCS_Al_H512_var._parameters.format[4] = 0;
  _HCS_Al_H512_var._parameters.format[5] = 0;
  _HCS_Al_H512_var._parameters.format[6] = 0;
  _HCS_Al_H512_var._parameters.format[7] = 0;
  _HCS_Al_H512_var._parameters.format[8] = 0;
  _HCS_Al_H512_var._parameters.radius = 0;
  _HCS_Al_H512_var._parameters.yheight = 0.12;
  _HCS_Al_H512_var._parameters.xwidth = 0.04;
  _HCS_Al_H512_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_H512_var._parameters.thickness = 0;
  _HCS_Al_H512_var._parameters.pack = 1;
  _HCS_Al_H512_var._parameters.Vc = 0;
  _HCS_Al_H512_var._parameters.sigma_abs = 0;
  _HCS_Al_H512_var._parameters.sigma_inc = 0;
  _HCS_Al_H512_var._parameters.delta_d_d = 0;
  _HCS_Al_H512_var._parameters.p_inc = 0.005;
  _HCS_Al_H512_var._parameters.p_transmit = 0.9450;
  _HCS_Al_H512_var._parameters.DW = 0;
  _HCS_Al_H512_var._parameters.nb_atoms = 1;
  _HCS_Al_H512_var._parameters.d_omega = 0;
  _HCS_Al_H512_var._parameters.d_phi = 10;
  _HCS_Al_H512_var._parameters.tth_sign = 0;
  _HCS_Al_H512_var._parameters.p_interact = 0.05;
  _HCS_Al_H512_var._parameters.concentric = 0;
  _HCS_Al_H512_var._parameters.density = 0;
  _HCS_Al_H512_var._parameters.weight = 0;
  _HCS_Al_H512_var._parameters.barns = 1;
  _HCS_Al_H512_var._parameters.Strain = 0;
  _HCS_Al_H512_var._parameters.focus_flip = 0;
  _HCS_Al_H512_var._parameters.target_index = 0;
  _HCS_Al_H512_var._parameters.order = 1;


  /* component HCS_Al_H512=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H512_S36_296_var._rotation_absolute, _HCS_Al_H512_var._rotation_absolute);
    rot_transpose(_H512_S36_296_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_H512_var._rotation_absolute, tr1, _HCS_Al_H512_var._rotation_relative);
    _HCS_Al_H512_var._rotation_is_identity =  rot_test_identity(_HCS_Al_H512_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 20.85 / 16 + 0.01);
    rot_transpose(_H512_S36_296_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_H512_var._position_absolute = coords_add(_H512_S36_296_var._position_absolute, tc2);
    tc1 = coords_sub(_H512_S36_296_var._position_absolute, _HCS_Al_H512_var._position_absolute);
    _HCS_Al_H512_var._position_relative = rot_apply(_HCS_Al_H512_var._rotation_absolute, tc1);
  } /* HCS_Al_H512=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_H512", _HCS_Al_H512_var._position_absolute, _HCS_Al_H512_var._rotation_absolute);
  instrument->_position_absolute[297] = _HCS_Al_H512_var._position_absolute;
  instrument->_position_relative[297] = _HCS_Al_H512_var._position_relative;
    _HCS_Al_H512_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_H512_var._position_relative);
  instrument->counter_N[297]  = instrument->counter_P[297] = instrument->counter_P2[297] = 0;
  instrument->counter_AbsorbProp[297]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0296_HCS_Al_H512", _HCS_Al_H512_var._position_absolute, _HCS_Al_H512_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "xwidth", "0", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0296_HCS_Al_H512", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_H512_setpos */

/* component H512_VTE=Monitor_nD() SETTING, POSITION/ROTATION */
int _H512_VTE_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H512_VTE_setpos] component H512_VTE=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H512_VTE_var._name, "H512_VTE", 16384);
  stracpy(_H512_VTE_var._type, "Monitor_nD", 16384);
  _H512_VTE_var._index=298;
  int current_setpos_index = 298;
  if("" && strlen(""))
    stracpy(_H512_VTE_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H512_VTE_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H512_VTE_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H512_VTE_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H512_VTE_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H512_VTE_var._parameters.user3[0]='\0';
  _H512_VTE_var._parameters.xwidth = 0.06;
  _H512_VTE_var._parameters.yheight = 0.12;
  _H512_VTE_var._parameters.zdepth = 0;
  _H512_VTE_var._parameters.xmin = 0;
  _H512_VTE_var._parameters.xmax = 0;
  _H512_VTE_var._parameters.ymin = 0;
  _H512_VTE_var._parameters.ymax = 0;
  _H512_VTE_var._parameters.zmin = 0;
  _H512_VTE_var._parameters.zmax = 0;
  _H512_VTE_var._parameters.bins = 50;
  _H512_VTE_var._parameters.min = -1e40;
  _H512_VTE_var._parameters.max = 1e40;
  _H512_VTE_var._parameters.restore_neutron = 1;
  _H512_VTE_var._parameters.radius = 0;
  if("x y, slit" && strlen("x y, slit"))
    stracpy(_H512_VTE_var._parameters.options, "x y, slit" ? "x y, slit" : "", 16384);
  else 
  _H512_VTE_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H512_VTE_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H512_VTE_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H512_VTE_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H512_VTE_var._parameters.geometry[0]='\0';
  _H512_VTE_var._parameters.nowritefile = 0;
  _H512_VTE_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H512_VTE_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H512_VTE_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H512_VTE_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H512_VTE_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H512_VTE_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H512_VTE_var._parameters.username3[0]='\0';


  /* component H512_VTE=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_H512_var._rotation_absolute, _H512_VTE_var._rotation_absolute);
    rot_transpose(_HCS_Al_H512_var._rotation_absolute, tr1);
    rot_mul(_H512_VTE_var._rotation_absolute, tr1, _H512_VTE_var._rotation_relative);
    _H512_VTE_var._rotation_is_identity =  rot_test_identity(_H512_VTE_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.108 / 2 -0.001);
    rot_transpose(_HCS_Al_H512_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H512_VTE_var._position_absolute = coords_add(_HCS_Al_H512_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_H512_var._position_absolute, _H512_VTE_var._position_absolute);
    _H512_VTE_var._position_relative = rot_apply(_H512_VTE_var._rotation_absolute, tc1);
  } /* H512_VTE=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H512_VTE", _H512_VTE_var._position_absolute, _H512_VTE_var._rotation_absolute);
  instrument->_position_absolute[298] = _H512_VTE_var._position_absolute;
  instrument->_position_relative[298] = _H512_VTE_var._position_relative;
    _H512_VTE_var._position_relative_is_zero =  coords_test_zero(_H512_VTE_var._position_relative);
  instrument->counter_N[298]  = instrument->counter_P[298] = instrument->counter_P2[298] = 0;
  instrument->counter_AbsorbProp[298]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0297_H512_VTE", _H512_VTE_var._position_absolute, _H512_VTE_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "xwidth", "0", "0.06","MCNUM");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "options", "NULL", "x y, slit", "char*");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0297_H512_VTE", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H512_VTE_setpos */

/* component HCS_Al_299=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_299_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_299_setpos] component HCS_Al_299=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_299_var._name, "HCS_Al_299", 16384);
  stracpy(_HCS_Al_299_var._type, "PowderN", 16384);
  _HCS_Al_299_var._index=299;
  int current_setpos_index = 299;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_299_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_299_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_299_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_299_var._parameters.geometry[0]='\0';
  _HCS_Al_299_var._parameters.format[0] = 0;
  _HCS_Al_299_var._parameters.format[1] = 0;
  _HCS_Al_299_var._parameters.format[2] = 0;
  _HCS_Al_299_var._parameters.format[3] = 0;
  _HCS_Al_299_var._parameters.format[4] = 0;
  _HCS_Al_299_var._parameters.format[5] = 0;
  _HCS_Al_299_var._parameters.format[6] = 0;
  _HCS_Al_299_var._parameters.format[7] = 0;
  _HCS_Al_299_var._parameters.format[8] = 0;
  _HCS_Al_299_var._parameters.radius = 0;
  _HCS_Al_299_var._parameters.yheight = 0.12;
  _HCS_Al_299_var._parameters.xwidth = 0.04;
  _HCS_Al_299_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_299_var._parameters.thickness = 0.002;
  _HCS_Al_299_var._parameters.pack = 1;
  _HCS_Al_299_var._parameters.Vc = 0;
  _HCS_Al_299_var._parameters.sigma_abs = 0;
  _HCS_Al_299_var._parameters.sigma_inc = 0;
  _HCS_Al_299_var._parameters.delta_d_d = 0;
  _HCS_Al_299_var._parameters.p_inc = 0.005;
  _HCS_Al_299_var._parameters.p_transmit = 0.9450;
  _HCS_Al_299_var._parameters.DW = 0;
  _HCS_Al_299_var._parameters.nb_atoms = 1;
  _HCS_Al_299_var._parameters.d_omega = 0;
  _HCS_Al_299_var._parameters.d_phi = 10;
  _HCS_Al_299_var._parameters.tth_sign = 0;
  _HCS_Al_299_var._parameters.p_interact = 0.05;
  _HCS_Al_299_var._parameters.concentric = 0;
  _HCS_Al_299_var._parameters.density = 0;
  _HCS_Al_299_var._parameters.weight = 0;
  _HCS_Al_299_var._parameters.barns = 1;
  _HCS_Al_299_var._parameters.Strain = 0;
  _HCS_Al_299_var._parameters.focus_flip = 0;
  _HCS_Al_299_var._parameters.target_index = 0;
  _HCS_Al_299_var._parameters.order = 1;


  /* component HCS_Al_299=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H512_VTE_var._rotation_absolute, _HCS_Al_299_var._rotation_absolute);
    rot_transpose(_H512_VTE_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_299_var._rotation_absolute, tr1, _HCS_Al_299_var._rotation_relative);
    _HCS_Al_299_var._rotation_is_identity =  rot_test_identity(_HCS_Al_299_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.108 / 2 -0.05);
    rot_transpose(_H512_VTE_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_299_var._position_absolute = coords_add(_H512_VTE_var._position_absolute, tc2);
    tc1 = coords_sub(_H512_VTE_var._position_absolute, _HCS_Al_299_var._position_absolute);
    _HCS_Al_299_var._position_relative = rot_apply(_HCS_Al_299_var._rotation_absolute, tc1);
  } /* HCS_Al_299=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_299", _HCS_Al_299_var._position_absolute, _HCS_Al_299_var._rotation_absolute);
  instrument->_position_absolute[299] = _HCS_Al_299_var._position_absolute;
  instrument->_position_relative[299] = _HCS_Al_299_var._position_relative;
    _HCS_Al_299_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_299_var._position_relative);
  instrument->counter_N[299]  = instrument->counter_P[299] = instrument->counter_P2[299] = 0;
  instrument->counter_AbsorbProp[299]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0298_HCS_Al_299", _HCS_Al_299_var._position_absolute, _HCS_Al_299_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "xwidth", "0", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "thickness", "0", "0.002","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0298_HCS_Al_299", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_299_setpos */

/* component H51_S78=Guide_gravity() SETTING, POSITION/ROTATION */
int _H51_S78_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H51_S78_setpos] component H51_S78=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H51_S78_var._name, "H51_S78", 16384);
  stracpy(_H51_S78_var._type, "Guide_gravity", 16384);
  _H51_S78_var._index=300;
  int current_setpos_index = 300;
  _H51_S78_var._parameters.w1 = 0.04;
  _H51_S78_var._parameters.h1 = 0.055;
  _H51_S78_var._parameters.w2 = 0;
  _H51_S78_var._parameters.h2 = 0;
  _H51_S78_var._parameters.l = 6.0 / 4;
  _H51_S78_var._parameters.R0 = gR0;
  _H51_S78_var._parameters.Qc = gQc;
  _H51_S78_var._parameters.alpha = gAlpha;
  _H51_S78_var._parameters.m = 1.2;
  _H51_S78_var._parameters.W = gW;
  _H51_S78_var._parameters.nslit = 1;
  _H51_S78_var._parameters.d = 0.0005;
  _H51_S78_var._parameters.mleft = -1;
  _H51_S78_var._parameters.mright = -1;
  _H51_S78_var._parameters.mtop = -1;
  _H51_S78_var._parameters.mbottom = -1;
  _H51_S78_var._parameters.nhslit = 1;
  _H51_S78_var._parameters.G = 0;
  _H51_S78_var._parameters.aleft = -1;
  _H51_S78_var._parameters.aright = -1;
  _H51_S78_var._parameters.atop = -1;
  _H51_S78_var._parameters.abottom = -1;
  _H51_S78_var._parameters.wavy = 0;
  _H51_S78_var._parameters.wavy_z = 0;
  _H51_S78_var._parameters.wavy_tb = 0;
  _H51_S78_var._parameters.wavy_lr = 0;
  _H51_S78_var._parameters.chamfers = 0;
  _H51_S78_var._parameters.chamfers_z = 0;
  _H51_S78_var._parameters.chamfers_lr = 0;
  _H51_S78_var._parameters.chamfers_tb = 0;
  _H51_S78_var._parameters.nelements = 1;
  _H51_S78_var._parameters.nu = 0;
  _H51_S78_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H51_S78_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_S78_var._parameters.reflect[0]='\0';


  /* component H51_S78=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_299_var._rotation_absolute, _H51_S78_var._rotation_absolute);
    rot_transpose(_HCS_Al_299_var._rotation_absolute, tr1);
    rot_mul(_H51_S78_var._rotation_absolute, tr1, _H51_S78_var._rotation_relative);
    _H51_S78_var._rotation_is_identity =  rot_test_identity(_H51_S78_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.05);
    rot_transpose(_HCS_Al_299_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H51_S78_var._position_absolute = coords_add(_HCS_Al_299_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_299_var._position_absolute, _H51_S78_var._position_absolute);
    _H51_S78_var._position_relative = rot_apply(_H51_S78_var._rotation_absolute, tc1);
  } /* H51_S78=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H51_S78", _H51_S78_var._position_absolute, _H51_S78_var._rotation_absolute);
  instrument->_position_absolute[300] = _H51_S78_var._position_absolute;
  instrument->_position_relative[300] = _H51_S78_var._position_relative;
    _H51_S78_var._position_relative_is_zero =  coords_test_zero(_H51_S78_var._position_relative);
  instrument->counter_N[300]  = instrument->counter_P[300] = instrument->counter_P2[300] = 0;
  instrument->counter_AbsorbProp[300]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0299_H51_S78", _H51_S78_var._position_absolute, _H51_S78_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "l", "NONE", "6.0 / 4","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0299_H51_S78", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H51_S78_setpos */

/* component H51_S78_301=Guide_gravity() SETTING, POSITION/ROTATION */
int _H51_S78_301_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H51_S78_301_setpos] component H51_S78_301=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H51_S78_301_var._name, "H51_S78_301", 16384);
  stracpy(_H51_S78_301_var._type, "Guide_gravity", 16384);
  _H51_S78_301_var._index=301;
  int current_setpos_index = 301;
  _H51_S78_301_var._parameters.w1 = 0.04;
  _H51_S78_301_var._parameters.h1 = 0.055;
  _H51_S78_301_var._parameters.w2 = 0;
  _H51_S78_301_var._parameters.h2 = 0;
  _H51_S78_301_var._parameters.l = 6.0 / 4;
  _H51_S78_301_var._parameters.R0 = gR0;
  _H51_S78_301_var._parameters.Qc = gQc;
  _H51_S78_301_var._parameters.alpha = gAlpha;
  _H51_S78_301_var._parameters.m = 1.2;
  _H51_S78_301_var._parameters.W = gW;
  _H51_S78_301_var._parameters.nslit = 1;
  _H51_S78_301_var._parameters.d = 0.0005;
  _H51_S78_301_var._parameters.mleft = -1;
  _H51_S78_301_var._parameters.mright = -1;
  _H51_S78_301_var._parameters.mtop = -1;
  _H51_S78_301_var._parameters.mbottom = -1;
  _H51_S78_301_var._parameters.nhslit = 1;
  _H51_S78_301_var._parameters.G = 0;
  _H51_S78_301_var._parameters.aleft = -1;
  _H51_S78_301_var._parameters.aright = -1;
  _H51_S78_301_var._parameters.atop = -1;
  _H51_S78_301_var._parameters.abottom = -1;
  _H51_S78_301_var._parameters.wavy = 0;
  _H51_S78_301_var._parameters.wavy_z = 0;
  _H51_S78_301_var._parameters.wavy_tb = 0;
  _H51_S78_301_var._parameters.wavy_lr = 0;
  _H51_S78_301_var._parameters.chamfers = 0;
  _H51_S78_301_var._parameters.chamfers_z = 0;
  _H51_S78_301_var._parameters.chamfers_lr = 0;
  _H51_S78_301_var._parameters.chamfers_tb = 0;
  _H51_S78_301_var._parameters.nelements = 1;
  _H51_S78_301_var._parameters.nu = 0;
  _H51_S78_301_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H51_S78_301_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_S78_301_var._parameters.reflect[0]='\0';


  /* component H51_S78_301=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-6.0 / 4 / 3000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H51_S78_var._rotation_absolute, _H51_S78_301_var._rotation_absolute);
    rot_transpose(_H51_S78_var._rotation_absolute, tr1);
    rot_mul(_H51_S78_301_var._rotation_absolute, tr1, _H51_S78_301_var._rotation_relative);
    _H51_S78_301_var._rotation_is_identity =  rot_test_identity(_H51_S78_301_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 6.0 / 4);
    rot_transpose(_H51_S78_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H51_S78_301_var._position_absolute = coords_add(_H51_S78_var._position_absolute, tc2);
    tc1 = coords_sub(_H51_S78_var._position_absolute, _H51_S78_301_var._position_absolute);
    _H51_S78_301_var._position_relative = rot_apply(_H51_S78_301_var._rotation_absolute, tc1);
  } /* H51_S78_301=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H51_S78_301", _H51_S78_301_var._position_absolute, _H51_S78_301_var._rotation_absolute);
  instrument->_position_absolute[301] = _H51_S78_301_var._position_absolute;
  instrument->_position_relative[301] = _H51_S78_301_var._position_relative;
    _H51_S78_301_var._position_relative_is_zero =  coords_test_zero(_H51_S78_301_var._position_relative);
  instrument->counter_N[301]  = instrument->counter_P[301] = instrument->counter_P2[301] = 0;
  instrument->counter_AbsorbProp[301]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0300_H51_S78_301", _H51_S78_301_var._position_absolute, _H51_S78_301_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "l", "NONE", "6.0 / 4","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0300_H51_S78_301", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H51_S78_301_setpos */

/* component H51_S78_302=Guide_gravity() SETTING, POSITION/ROTATION */
int _H51_S78_302_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H51_S78_302_setpos] component H51_S78_302=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H51_S78_302_var._name, "H51_S78_302", 16384);
  stracpy(_H51_S78_302_var._type, "Guide_gravity", 16384);
  _H51_S78_302_var._index=302;
  int current_setpos_index = 302;
  _H51_S78_302_var._parameters.w1 = 0.04;
  _H51_S78_302_var._parameters.h1 = 0.055;
  _H51_S78_302_var._parameters.w2 = 0;
  _H51_S78_302_var._parameters.h2 = 0;
  _H51_S78_302_var._parameters.l = 6.0 / 4;
  _H51_S78_302_var._parameters.R0 = gR0;
  _H51_S78_302_var._parameters.Qc = gQc;
  _H51_S78_302_var._parameters.alpha = gAlpha;
  _H51_S78_302_var._parameters.m = 1.2;
  _H51_S78_302_var._parameters.W = gW;
  _H51_S78_302_var._parameters.nslit = 1;
  _H51_S78_302_var._parameters.d = 0.0005;
  _H51_S78_302_var._parameters.mleft = -1;
  _H51_S78_302_var._parameters.mright = -1;
  _H51_S78_302_var._parameters.mtop = -1;
  _H51_S78_302_var._parameters.mbottom = -1;
  _H51_S78_302_var._parameters.nhslit = 1;
  _H51_S78_302_var._parameters.G = 0;
  _H51_S78_302_var._parameters.aleft = -1;
  _H51_S78_302_var._parameters.aright = -1;
  _H51_S78_302_var._parameters.atop = -1;
  _H51_S78_302_var._parameters.abottom = -1;
  _H51_S78_302_var._parameters.wavy = 0;
  _H51_S78_302_var._parameters.wavy_z = 0;
  _H51_S78_302_var._parameters.wavy_tb = 0;
  _H51_S78_302_var._parameters.wavy_lr = 0;
  _H51_S78_302_var._parameters.chamfers = 0;
  _H51_S78_302_var._parameters.chamfers_z = 0;
  _H51_S78_302_var._parameters.chamfers_lr = 0;
  _H51_S78_302_var._parameters.chamfers_tb = 0;
  _H51_S78_302_var._parameters.nelements = 1;
  _H51_S78_302_var._parameters.nu = 0;
  _H51_S78_302_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H51_S78_302_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_S78_302_var._parameters.reflect[0]='\0';


  /* component H51_S78_302=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-6.0 / 4 / 3000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H51_S78_301_var._rotation_absolute, _H51_S78_302_var._rotation_absolute);
    rot_transpose(_H51_S78_301_var._rotation_absolute, tr1);
    rot_mul(_H51_S78_302_var._rotation_absolute, tr1, _H51_S78_302_var._rotation_relative);
    _H51_S78_302_var._rotation_is_identity =  rot_test_identity(_H51_S78_302_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 6.0 / 4);
    rot_transpose(_H51_S78_301_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H51_S78_302_var._position_absolute = coords_add(_H51_S78_301_var._position_absolute, tc2);
    tc1 = coords_sub(_H51_S78_301_var._position_absolute, _H51_S78_302_var._position_absolute);
    _H51_S78_302_var._position_relative = rot_apply(_H51_S78_302_var._rotation_absolute, tc1);
  } /* H51_S78_302=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H51_S78_302", _H51_S78_302_var._position_absolute, _H51_S78_302_var._rotation_absolute);
  instrument->_position_absolute[302] = _H51_S78_302_var._position_absolute;
  instrument->_position_relative[302] = _H51_S78_302_var._position_relative;
    _H51_S78_302_var._position_relative_is_zero =  coords_test_zero(_H51_S78_302_var._position_relative);
  instrument->counter_N[302]  = instrument->counter_P[302] = instrument->counter_P2[302] = 0;
  instrument->counter_AbsorbProp[302]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0301_H51_S78_302", _H51_S78_302_var._position_absolute, _H51_S78_302_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "l", "NONE", "6.0 / 4","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0301_H51_S78_302", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H51_S78_302_setpos */

/* component H51_S78_303=Guide_gravity() SETTING, POSITION/ROTATION */
int _H51_S78_303_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H51_S78_303_setpos] component H51_S78_303=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H51_S78_303_var._name, "H51_S78_303", 16384);
  stracpy(_H51_S78_303_var._type, "Guide_gravity", 16384);
  _H51_S78_303_var._index=303;
  int current_setpos_index = 303;
  _H51_S78_303_var._parameters.w1 = 0.04;
  _H51_S78_303_var._parameters.h1 = 0.055;
  _H51_S78_303_var._parameters.w2 = 0;
  _H51_S78_303_var._parameters.h2 = 0;
  _H51_S78_303_var._parameters.l = 6.0 / 4;
  _H51_S78_303_var._parameters.R0 = gR0;
  _H51_S78_303_var._parameters.Qc = gQc;
  _H51_S78_303_var._parameters.alpha = gAlpha;
  _H51_S78_303_var._parameters.m = 1.2;
  _H51_S78_303_var._parameters.W = gW;
  _H51_S78_303_var._parameters.nslit = 1;
  _H51_S78_303_var._parameters.d = 0.0005;
  _H51_S78_303_var._parameters.mleft = -1;
  _H51_S78_303_var._parameters.mright = -1;
  _H51_S78_303_var._parameters.mtop = -1;
  _H51_S78_303_var._parameters.mbottom = -1;
  _H51_S78_303_var._parameters.nhslit = 1;
  _H51_S78_303_var._parameters.G = 0;
  _H51_S78_303_var._parameters.aleft = -1;
  _H51_S78_303_var._parameters.aright = -1;
  _H51_S78_303_var._parameters.atop = -1;
  _H51_S78_303_var._parameters.abottom = -1;
  _H51_S78_303_var._parameters.wavy = 0;
  _H51_S78_303_var._parameters.wavy_z = 0;
  _H51_S78_303_var._parameters.wavy_tb = 0;
  _H51_S78_303_var._parameters.wavy_lr = 0;
  _H51_S78_303_var._parameters.chamfers = 0;
  _H51_S78_303_var._parameters.chamfers_z = 0;
  _H51_S78_303_var._parameters.chamfers_lr = 0;
  _H51_S78_303_var._parameters.chamfers_tb = 0;
  _H51_S78_303_var._parameters.nelements = 1;
  _H51_S78_303_var._parameters.nu = 0;
  _H51_S78_303_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H51_S78_303_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_S78_303_var._parameters.reflect[0]='\0';


  /* component H51_S78_303=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (-6.0 / 4 / 3000 * RAD2DEG)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _H51_S78_302_var._rotation_absolute, _H51_S78_303_var._rotation_absolute);
    rot_transpose(_H51_S78_302_var._rotation_absolute, tr1);
    rot_mul(_H51_S78_303_var._rotation_absolute, tr1, _H51_S78_303_var._rotation_relative);
    _H51_S78_303_var._rotation_is_identity =  rot_test_identity(_H51_S78_303_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 6.0 / 4);
    rot_transpose(_H51_S78_302_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H51_S78_303_var._position_absolute = coords_add(_H51_S78_302_var._position_absolute, tc2);
    tc1 = coords_sub(_H51_S78_302_var._position_absolute, _H51_S78_303_var._position_absolute);
    _H51_S78_303_var._position_relative = rot_apply(_H51_S78_303_var._rotation_absolute, tc1);
  } /* H51_S78_303=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H51_S78_303", _H51_S78_303_var._position_absolute, _H51_S78_303_var._rotation_absolute);
  instrument->_position_absolute[303] = _H51_S78_303_var._position_absolute;
  instrument->_position_relative[303] = _H51_S78_303_var._position_relative;
    _H51_S78_303_var._position_relative_is_zero =  coords_test_zero(_H51_S78_303_var._position_relative);
  instrument->counter_N[303]  = instrument->counter_P[303] = instrument->counter_P2[303] = 0;
  instrument->counter_AbsorbProp[303]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0302_H51_S78_303", _H51_S78_303_var._position_absolute, _H51_S78_303_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "l", "NONE", "6.0 / 4","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "nelements", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0302_H51_S78_303", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H51_S78_303_setpos */

/* component HCS_Al_304=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_304_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_304_setpos] component HCS_Al_304=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_304_var._name, "HCS_Al_304", 16384);
  stracpy(_HCS_Al_304_var._type, "PowderN", 16384);
  _HCS_Al_304_var._index=304;
  int current_setpos_index = 304;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_304_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_304_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_304_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_304_var._parameters.geometry[0]='\0';
  _HCS_Al_304_var._parameters.format[0] = 0;
  _HCS_Al_304_var._parameters.format[1] = 0;
  _HCS_Al_304_var._parameters.format[2] = 0;
  _HCS_Al_304_var._parameters.format[3] = 0;
  _HCS_Al_304_var._parameters.format[4] = 0;
  _HCS_Al_304_var._parameters.format[5] = 0;
  _HCS_Al_304_var._parameters.format[6] = 0;
  _HCS_Al_304_var._parameters.format[7] = 0;
  _HCS_Al_304_var._parameters.format[8] = 0;
  _HCS_Al_304_var._parameters.radius = 0;
  _HCS_Al_304_var._parameters.yheight = 0.12;
  _HCS_Al_304_var._parameters.xwidth = 0.04;
  _HCS_Al_304_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_304_var._parameters.thickness = 0.002;
  _HCS_Al_304_var._parameters.pack = 1;
  _HCS_Al_304_var._parameters.Vc = 0;
  _HCS_Al_304_var._parameters.sigma_abs = 0;
  _HCS_Al_304_var._parameters.sigma_inc = 0;
  _HCS_Al_304_var._parameters.delta_d_d = 0;
  _HCS_Al_304_var._parameters.p_inc = 0.005;
  _HCS_Al_304_var._parameters.p_transmit = 0.9450;
  _HCS_Al_304_var._parameters.DW = 0;
  _HCS_Al_304_var._parameters.nb_atoms = 1;
  _HCS_Al_304_var._parameters.d_omega = 0;
  _HCS_Al_304_var._parameters.d_phi = 10;
  _HCS_Al_304_var._parameters.tth_sign = 0;
  _HCS_Al_304_var._parameters.p_interact = 0.05;
  _HCS_Al_304_var._parameters.concentric = 0;
  _HCS_Al_304_var._parameters.density = 0;
  _HCS_Al_304_var._parameters.weight = 0;
  _HCS_Al_304_var._parameters.barns = 1;
  _HCS_Al_304_var._parameters.Strain = 0;
  _HCS_Al_304_var._parameters.focus_flip = 0;
  _HCS_Al_304_var._parameters.target_index = 0;
  _HCS_Al_304_var._parameters.order = 1;


  /* component HCS_Al_304=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H51_S78_303_var._rotation_absolute, _HCS_Al_304_var._rotation_absolute);
    rot_transpose(_H51_S78_303_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_304_var._rotation_absolute, tr1, _HCS_Al_304_var._rotation_relative);
    _HCS_Al_304_var._rotation_is_identity =  rot_test_identity(_HCS_Al_304_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 6.0 / 4 + 0.01);
    rot_transpose(_H51_S78_303_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_304_var._position_absolute = coords_add(_H51_S78_303_var._position_absolute, tc2);
    tc1 = coords_sub(_H51_S78_303_var._position_absolute, _HCS_Al_304_var._position_absolute);
    _HCS_Al_304_var._position_relative = rot_apply(_HCS_Al_304_var._rotation_absolute, tc1);
  } /* HCS_Al_304=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_304", _HCS_Al_304_var._position_absolute, _HCS_Al_304_var._rotation_absolute);
  instrument->_position_absolute[304] = _HCS_Al_304_var._position_absolute;
  instrument->_position_relative[304] = _HCS_Al_304_var._position_relative;
    _HCS_Al_304_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_304_var._position_relative);
  instrument->counter_N[304]  = instrument->counter_P[304] = instrument->counter_P2[304] = 0;
  instrument->counter_AbsorbProp[304]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0303_HCS_Al_304", _HCS_Al_304_var._position_absolute, _HCS_Al_304_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "xwidth", "0", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "thickness", "0", "0.002","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0303_HCS_Al_304", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_304_setpos */

/* component H512_S11=Guide_gravity() SETTING, POSITION/ROTATION */
int _H512_S11_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H512_S11_setpos] component H512_S11=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_H512_S11_var._name, "H512_S11", 16384);
  stracpy(_H512_S11_var._type, "Guide_gravity", 16384);
  _H512_S11_var._index=305;
  int current_setpos_index = 305;
  _H512_S11_var._parameters.w1 = 0.04;
  _H512_S11_var._parameters.h1 = 0.055;
  _H512_S11_var._parameters.w2 = 0;
  _H512_S11_var._parameters.h2 = 0;
  _H512_S11_var._parameters.l = 3.0;
  _H512_S11_var._parameters.R0 = gR0;
  _H512_S11_var._parameters.Qc = gQc;
  _H512_S11_var._parameters.alpha = gAlpha;
  _H512_S11_var._parameters.m = 1.2;
  _H512_S11_var._parameters.W = gW;
  _H512_S11_var._parameters.nslit = 1;
  _H512_S11_var._parameters.d = 0.0005;
  _H512_S11_var._parameters.mleft = -1;
  _H512_S11_var._parameters.mright = -1;
  _H512_S11_var._parameters.mtop = -1;
  _H512_S11_var._parameters.mbottom = -1;
  _H512_S11_var._parameters.nhslit = 1;
  _H512_S11_var._parameters.G = 0;
  _H512_S11_var._parameters.aleft = -1;
  _H512_S11_var._parameters.aright = -1;
  _H512_S11_var._parameters.atop = -1;
  _H512_S11_var._parameters.abottom = -1;
  _H512_S11_var._parameters.wavy = 0;
  _H512_S11_var._parameters.wavy_z = 0;
  _H512_S11_var._parameters.wavy_tb = 0;
  _H512_S11_var._parameters.wavy_lr = 0;
  _H512_S11_var._parameters.chamfers = 0;
  _H512_S11_var._parameters.chamfers_z = 0;
  _H512_S11_var._parameters.chamfers_lr = 0;
  _H512_S11_var._parameters.chamfers_tb = 0;
  _H512_S11_var._parameters.nelements = 2;
  _H512_S11_var._parameters.nu = 0;
  _H512_S11_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H512_S11_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _H512_S11_var._parameters.reflect[0]='\0';


  /* component H512_S11=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_304_var._rotation_absolute, _H512_S11_var._rotation_absolute);
    rot_transpose(_HCS_Al_304_var._rotation_absolute, tr1);
    rot_mul(_H512_S11_var._rotation_absolute, tr1, _H512_S11_var._rotation_relative);
    _H512_S11_var._rotation_is_identity =  rot_test_identity(_H512_S11_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.01);
    rot_transpose(_HCS_Al_304_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H512_S11_var._position_absolute = coords_add(_HCS_Al_304_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_304_var._position_absolute, _H512_S11_var._position_absolute);
    _H512_S11_var._position_relative = rot_apply(_H512_S11_var._rotation_absolute, tc1);
  } /* H512_S11=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("H512_S11", _H512_S11_var._position_absolute, _H512_S11_var._rotation_absolute);
  instrument->_position_absolute[305] = _H512_S11_var._position_absolute;
  instrument->_position_relative[305] = _H512_S11_var._position_relative;
    _H512_S11_var._position_relative_is_zero =  coords_test_zero(_H512_S11_var._position_relative);
  instrument->counter_N[305]  = instrument->counter_P[305] = instrument->counter_P2[305] = 0;
  instrument->counter_AbsorbProp[305]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0304_H512_S11", _H512_S11_var._position_absolute, _H512_S11_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "l", "NONE", "3.0","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "nelements", "1", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0304_H512_S11", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H512_S11_setpos */

/* component HCS_Al_306=PowderN() SETTING, POSITION/ROTATION */
int _HCS_Al_306_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_HCS_Al_306_setpos] component HCS_Al_306=PowderN() SETTING [PowderN:0]");
  stracpy(_HCS_Al_306_var._name, "HCS_Al_306", 16384);
  stracpy(_HCS_Al_306_var._type, "PowderN", 16384);
  _HCS_Al_306_var._index=306;
  int current_setpos_index = 306;
  if("Al.laz" && strlen("Al.laz"))
    stracpy(_HCS_Al_306_var._parameters.reflections, "Al.laz" ? "Al.laz" : "", 16384);
  else 
  _HCS_Al_306_var._parameters.reflections[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_HCS_Al_306_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _HCS_Al_306_var._parameters.geometry[0]='\0';
  _HCS_Al_306_var._parameters.format[0] = 0;
  _HCS_Al_306_var._parameters.format[1] = 0;
  _HCS_Al_306_var._parameters.format[2] = 0;
  _HCS_Al_306_var._parameters.format[3] = 0;
  _HCS_Al_306_var._parameters.format[4] = 0;
  _HCS_Al_306_var._parameters.format[5] = 0;
  _HCS_Al_306_var._parameters.format[6] = 0;
  _HCS_Al_306_var._parameters.format[7] = 0;
  _HCS_Al_306_var._parameters.format[8] = 0;
  _HCS_Al_306_var._parameters.radius = 0;
  _HCS_Al_306_var._parameters.yheight = 0.12;
  _HCS_Al_306_var._parameters.xwidth = 0.04;
  _HCS_Al_306_var._parameters.zdepth = Al_Thickness;
  _HCS_Al_306_var._parameters.thickness = 0;
  _HCS_Al_306_var._parameters.pack = 1;
  _HCS_Al_306_var._parameters.Vc = 0;
  _HCS_Al_306_var._parameters.sigma_abs = 0;
  _HCS_Al_306_var._parameters.sigma_inc = 0;
  _HCS_Al_306_var._parameters.delta_d_d = 0;
  _HCS_Al_306_var._parameters.p_inc = 0.005;
  _HCS_Al_306_var._parameters.p_transmit = 0.9450;
  _HCS_Al_306_var._parameters.DW = 0;
  _HCS_Al_306_var._parameters.nb_atoms = 1;
  _HCS_Al_306_var._parameters.d_omega = 0;
  _HCS_Al_306_var._parameters.d_phi = 10;
  _HCS_Al_306_var._parameters.tth_sign = 0;
  _HCS_Al_306_var._parameters.p_interact = 0.05;
  _HCS_Al_306_var._parameters.concentric = 0;
  _HCS_Al_306_var._parameters.density = 0;
  _HCS_Al_306_var._parameters.weight = 0;
  _HCS_Al_306_var._parameters.barns = 1;
  _HCS_Al_306_var._parameters.Strain = 0;
  _HCS_Al_306_var._parameters.focus_flip = 0;
  _HCS_Al_306_var._parameters.target_index = 0;
  _HCS_Al_306_var._parameters.order = 1;


  /* component HCS_Al_306=PowderN() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H512_S11_var._rotation_absolute, _HCS_Al_306_var._rotation_absolute);
    rot_transpose(_H512_S11_var._rotation_absolute, tr1);
    rot_mul(_HCS_Al_306_var._rotation_absolute, tr1, _HCS_Al_306_var._rotation_relative);
    _HCS_Al_306_var._rotation_is_identity =  rot_test_identity(_HCS_Al_306_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 3 + 0.01);
    rot_transpose(_H512_S11_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _HCS_Al_306_var._position_absolute = coords_add(_H512_S11_var._position_absolute, tc2);
    tc1 = coords_sub(_H512_S11_var._position_absolute, _HCS_Al_306_var._position_absolute);
    _HCS_Al_306_var._position_relative = rot_apply(_HCS_Al_306_var._rotation_absolute, tc1);
  } /* HCS_Al_306=PowderN() AT ROTATED */
  DEBUG_COMPONENT("HCS_Al_306", _HCS_Al_306_var._position_absolute, _HCS_Al_306_var._rotation_absolute);
  instrument->_position_absolute[306] = _HCS_Al_306_var._position_absolute;
  instrument->_position_relative[306] = _HCS_Al_306_var._position_relative;
    _HCS_Al_306_var._position_relative_is_zero =  coords_test_zero(_HCS_Al_306_var._position_relative);
  instrument->counter_N[306]  = instrument->counter_P[306] = instrument->counter_P2[306] = 0;
  instrument->counter_AbsorbProp[306]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0305_HCS_Al_306", _HCS_Al_306_var._position_absolute, _HCS_Al_306_var._rotation_absolute, "PowderN");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "reflections", "NULL", "Al.laz", "char*");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "yheight", "0", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "xwidth", "0", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "zdepth", "0", "Al_Thickness","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "pack", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "delta_d_d", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "p_inc", "0.1", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "p_transmit", "0.1", "0.9450","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "nb_atoms", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "d_omega", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "d_phi", "0", "10","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "tth_sign", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "p_interact", "0.8", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "concentric", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "Strain", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "focus_flip", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "target_index", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0305_HCS_Al_306", "order", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _HCS_Al_306_setpos */

/* component D22_PreV=Monitor_nD() SETTING, POSITION/ROTATION */
int _D22_PreV_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_D22_PreV_setpos] component D22_PreV=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_D22_PreV_var._name, "D22_PreV", 16384);
  stracpy(_D22_PreV_var._type, "Monitor_nD", 16384);
  _D22_PreV_var._index=307;
  int current_setpos_index = 307;
  if("" && strlen(""))
    stracpy(_D22_PreV_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _D22_PreV_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_D22_PreV_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _D22_PreV_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_D22_PreV_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _D22_PreV_var._parameters.user3[0]='\0';
  _D22_PreV_var._parameters.xwidth = 0.04;
  _D22_PreV_var._parameters.yheight = 0.05;
  _D22_PreV_var._parameters.zdepth = 0;
  _D22_PreV_var._parameters.xmin = 0;
  _D22_PreV_var._parameters.xmax = 0;
  _D22_PreV_var._parameters.ymin = 0;
  _D22_PreV_var._parameters.ymax = 0;
  _D22_PreV_var._parameters.zmin = 0;
  _D22_PreV_var._parameters.zmax = 0;
  _D22_PreV_var._parameters.bins = 50;
  _D22_PreV_var._parameters.min = -1e40;
  _D22_PreV_var._parameters.max = 1e40;
  _D22_PreV_var._parameters.restore_neutron = 1;
  _D22_PreV_var._parameters.radius = 0;
  if("x y" && strlen("x y"))
    stracpy(_D22_PreV_var._parameters.options, "x y" ? "x y" : "", 16384);
  else 
  _D22_PreV_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_D22_PreV_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _D22_PreV_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_D22_PreV_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _D22_PreV_var._parameters.geometry[0]='\0';
  _D22_PreV_var._parameters.nowritefile = 0;
  _D22_PreV_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_D22_PreV_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _D22_PreV_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_D22_PreV_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _D22_PreV_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_D22_PreV_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _D22_PreV_var._parameters.username3[0]='\0';


  /* component D22_PreV=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_Al_306_var._rotation_absolute, _D22_PreV_var._rotation_absolute);
    rot_transpose(_HCS_Al_306_var._rotation_absolute, tr1);
    rot_mul(_D22_PreV_var._rotation_absolute, tr1, _D22_PreV_var._rotation_relative);
    _D22_PreV_var._rotation_is_identity =  rot_test_identity(_D22_PreV_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.01);
    rot_transpose(_HCS_Al_306_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _D22_PreV_var._position_absolute = coords_add(_HCS_Al_306_var._position_absolute, tc2);
    tc1 = coords_sub(_HCS_Al_306_var._position_absolute, _D22_PreV_var._position_absolute);
    _D22_PreV_var._position_relative = rot_apply(_D22_PreV_var._rotation_absolute, tc1);
  } /* D22_PreV=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("D22_PreV", _D22_PreV_var._position_absolute, _D22_PreV_var._rotation_absolute);
  instrument->_position_absolute[307] = _D22_PreV_var._position_absolute;
  instrument->_position_relative[307] = _D22_PreV_var._position_relative;
    _D22_PreV_var._position_relative_is_zero =  coords_test_zero(_D22_PreV_var._position_relative);
  instrument->counter_N[307]  = instrument->counter_P[307] = instrument->counter_P2[307] = 0;
  instrument->counter_AbsorbProp[307]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0306_D22_PreV", _D22_PreV_var._position_absolute, _D22_PreV_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "xwidth", "0", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "yheight", "0", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "options", "NULL", "x y", "char*");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0306_D22_PreV", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _D22_PreV_setpos */

/* component D22_Vselector=V_selector() SETTING, POSITION/ROTATION */
int _D22_Vselector_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_D22_Vselector_setpos] component D22_Vselector=V_selector() SETTING [V_selector:0]");
  stracpy(_D22_Vselector_var._name, "D22_Vselector", 16384);
  stracpy(_D22_Vselector_var._type, "V_selector", 16384);
  _D22_Vselector_var._index=308;
  int current_setpos_index = 308;
  _D22_Vselector_var._parameters.xwidth = 0.04;
  _D22_Vselector_var._parameters.yheight = 0.05;
  _D22_Vselector_var._parameters.zdepth = 0.30;
  _D22_Vselector_var._parameters.radius = 0.12;
  _D22_Vselector_var._parameters.alpha = 48.3;
  _D22_Vselector_var._parameters.length = 0.25;
  _D22_Vselector_var._parameters.d = 0.0004;
  _D22_Vselector_var._parameters.nu = D22_nu;
  _D22_Vselector_var._parameters.nslit = 72;


  /* component D22_Vselector=V_selector() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H512_S11_var._rotation_absolute, _D22_Vselector_var._rotation_absolute);
    rot_transpose(_D22_PreV_var._rotation_absolute, tr1);
    rot_mul(_D22_Vselector_var._rotation_absolute, tr1, _D22_Vselector_var._rotation_relative);
    _D22_Vselector_var._rotation_is_identity =  rot_test_identity(_D22_Vselector_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 3 + 0.01 + 0.3 + 0.01);
    rot_transpose(_H512_S11_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _D22_Vselector_var._position_absolute = coords_add(_H512_S11_var._position_absolute, tc2);
    tc1 = coords_sub(_D22_PreV_var._position_absolute, _D22_Vselector_var._position_absolute);
    _D22_Vselector_var._position_relative = rot_apply(_D22_Vselector_var._rotation_absolute, tc1);
  } /* D22_Vselector=V_selector() AT ROTATED */
  DEBUG_COMPONENT("D22_Vselector", _D22_Vselector_var._position_absolute, _D22_Vselector_var._rotation_absolute);
  instrument->_position_absolute[308] = _D22_Vselector_var._position_absolute;
  instrument->_position_relative[308] = _D22_Vselector_var._position_relative;
    _D22_Vselector_var._position_relative_is_zero =  coords_test_zero(_D22_Vselector_var._position_relative);
  instrument->counter_N[308]  = instrument->counter_P[308] = instrument->counter_P2[308] = 0;
  instrument->counter_AbsorbProp[308]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0307_D22_Vselector", _D22_Vselector_var._position_absolute, _D22_Vselector_var._rotation_absolute, "V_selector");
        mccomp_param_nexus(nxhandle,"0307_D22_Vselector", "xwidth", "0.03", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0307_D22_Vselector", "yheight", "0.05", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0307_D22_Vselector", "zdepth", "0.30", "0.30","MCNUM");
        mccomp_param_nexus(nxhandle,"0307_D22_Vselector", "radius", "0.12", "0.12","MCNUM");
        mccomp_param_nexus(nxhandle,"0307_D22_Vselector", "alpha", "48.298", "48.3","MCNUM");
        mccomp_param_nexus(nxhandle,"0307_D22_Vselector", "length", "0.25", "0.25","MCNUM");
        mccomp_param_nexus(nxhandle,"0307_D22_Vselector", "d", "0.0004", "0.0004","MCNUM");
        mccomp_param_nexus(nxhandle,"0307_D22_Vselector", "nu", "300", "D22_nu","MCNUM");
        mccomp_param_nexus(nxhandle,"0307_D22_Vselector", "nslit", "72", "72","MCNUM");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _D22_Vselector_setpos */

/* component D22_Collimation=Guide_gravity() SETTING, POSITION/ROTATION */
int _D22_Collimation_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_D22_Collimation_setpos] component D22_Collimation=Guide_gravity() SETTING [Guide_gravity:0]");
  stracpy(_D22_Collimation_var._name, "D22_Collimation", 16384);
  stracpy(_D22_Collimation_var._type, "Guide_gravity", 16384);
  _D22_Collimation_var._index=309;
  int current_setpos_index = 309;
  _D22_Collimation_var._parameters.w1 = 0.04;
  _D22_Collimation_var._parameters.h1 = 0.055;
  _D22_Collimation_var._parameters.w2 = 0;
  _D22_Collimation_var._parameters.h2 = 0;
  _D22_Collimation_var._parameters.l = 20 - _instrument_var._parameters.D22_collimation;
  _D22_Collimation_var._parameters.R0 = gR0;
  _D22_Collimation_var._parameters.Qc = gQc;
  _D22_Collimation_var._parameters.alpha = gAlpha;
  _D22_Collimation_var._parameters.m = 1.2;
  _D22_Collimation_var._parameters.W = gW;
  _D22_Collimation_var._parameters.nslit = 1;
  _D22_Collimation_var._parameters.d = 0.0005;
  _D22_Collimation_var._parameters.mleft = -1;
  _D22_Collimation_var._parameters.mright = -1;
  _D22_Collimation_var._parameters.mtop = -1;
  _D22_Collimation_var._parameters.mbottom = -1;
  _D22_Collimation_var._parameters.nhslit = 1;
  _D22_Collimation_var._parameters.G = 0;
  _D22_Collimation_var._parameters.aleft = -1;
  _D22_Collimation_var._parameters.aright = -1;
  _D22_Collimation_var._parameters.atop = -1;
  _D22_Collimation_var._parameters.abottom = -1;
  _D22_Collimation_var._parameters.wavy = 0;
  _D22_Collimation_var._parameters.wavy_z = 0;
  _D22_Collimation_var._parameters.wavy_tb = 0;
  _D22_Collimation_var._parameters.wavy_lr = 0;
  _D22_Collimation_var._parameters.chamfers = 0;
  _D22_Collimation_var._parameters.chamfers_z = 0;
  _D22_Collimation_var._parameters.chamfers_lr = 0;
  _D22_Collimation_var._parameters.chamfers_tb = 0;
  _D22_Collimation_var._parameters.nelements = ceil ( _instrument_var._parameters.D22_collimation / 1.5 );
  _D22_Collimation_var._parameters.nu = 0;
  _D22_Collimation_var._parameters.phase = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_D22_Collimation_var._parameters.reflect, "NULL" ? "NULL" : "", 16384);
  else 
  _D22_Collimation_var._parameters.reflect[0]='\0';


  /* component D22_Collimation=Guide_gravity() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _D22_Vselector_var._rotation_absolute, _D22_Collimation_var._rotation_absolute);
    rot_transpose(_D22_Vselector_var._rotation_absolute, tr1);
    rot_mul(_D22_Collimation_var._rotation_absolute, tr1, _D22_Collimation_var._rotation_relative);
    _D22_Collimation_var._rotation_is_identity =  rot_test_identity(_D22_Collimation_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.3);
    rot_transpose(_D22_Vselector_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _D22_Collimation_var._position_absolute = coords_add(_D22_Vselector_var._position_absolute, tc2);
    tc1 = coords_sub(_D22_Vselector_var._position_absolute, _D22_Collimation_var._position_absolute);
    _D22_Collimation_var._position_relative = rot_apply(_D22_Collimation_var._rotation_absolute, tc1);
  } /* D22_Collimation=Guide_gravity() AT ROTATED */
  DEBUG_COMPONENT("D22_Collimation", _D22_Collimation_var._position_absolute, _D22_Collimation_var._rotation_absolute);
  instrument->_position_absolute[309] = _D22_Collimation_var._position_absolute;
  instrument->_position_relative[309] = _D22_Collimation_var._position_relative;
    _D22_Collimation_var._position_relative_is_zero =  coords_test_zero(_D22_Collimation_var._position_relative);
  instrument->counter_N[309]  = instrument->counter_P[309] = instrument->counter_P2[309] = 0;
  instrument->counter_AbsorbProp[309]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0308_D22_Collimation", _D22_Collimation_var._position_absolute, _D22_Collimation_var._rotation_absolute, "Guide_gravity");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "w1", "NONE", "0.04","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "h1", "NONE", "0.055","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "w2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "h2", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "l", "NONE", "20 - _instrument_var._parameters.D22_collimation","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "R0", "0.995", "gR0","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "Qc", "0.0218", "gQc","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "alpha", "4.38", "gAlpha","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "m", "1.0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "W", "0.003", "gW","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "nslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "d", "0.0005", "0.0005","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "mleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "mright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "mtop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "mbottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "nhslit", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "G", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "aleft", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "aright", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "atop", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "abottom", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "wavy", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "wavy_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "wavy_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "wavy_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "chamfers", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "chamfers_z", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "chamfers_lr", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "chamfers_tb", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "nelements", "1", "ceil ( _instrument_var._parameters.D22_collimation / 1.5 )","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "nu", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "phase", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0308_D22_Collimation", "reflect", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _D22_Collimation_setpos */

/* component D22_Sample_Pos=Arm() SETTING, POSITION/ROTATION */
int _D22_Sample_Pos_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_D22_Sample_Pos_setpos] component D22_Sample_Pos=Arm() SETTING [Arm:0]");
  stracpy(_D22_Sample_Pos_var._name, "D22_Sample_Pos", 16384);
  stracpy(_D22_Sample_Pos_var._type, "Arm", 16384);
  _D22_Sample_Pos_var._index=310;
  int current_setpos_index = 310;
  /* component D22_Sample_Pos=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _D22_Vselector_var._rotation_absolute, _D22_Sample_Pos_var._rotation_absolute);
    rot_transpose(_D22_Collimation_var._rotation_absolute, tr1);
    rot_mul(_D22_Sample_Pos_var._rotation_absolute, tr1, _D22_Sample_Pos_var._rotation_relative);
    _D22_Sample_Pos_var._rotation_is_identity =  rot_test_identity(_D22_Sample_Pos_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 20 + 0.3);
    rot_transpose(_D22_Vselector_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _D22_Sample_Pos_var._position_absolute = coords_add(_D22_Vselector_var._position_absolute, tc2);
    tc1 = coords_sub(_D22_Collimation_var._position_absolute, _D22_Sample_Pos_var._position_absolute);
    _D22_Sample_Pos_var._position_relative = rot_apply(_D22_Sample_Pos_var._rotation_absolute, tc1);
  } /* D22_Sample_Pos=Arm() AT ROTATED */
  DEBUG_COMPONENT("D22_Sample_Pos", _D22_Sample_Pos_var._position_absolute, _D22_Sample_Pos_var._rotation_absolute);
  instrument->_position_absolute[310] = _D22_Sample_Pos_var._position_absolute;
  instrument->_position_relative[310] = _D22_Sample_Pos_var._position_relative;
    _D22_Sample_Pos_var._position_relative_is_zero =  coords_test_zero(_D22_Sample_Pos_var._position_relative);
  instrument->counter_N[310]  = instrument->counter_P[310] = instrument->counter_P2[310] = 0;
  instrument->counter_AbsorbProp[310]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0309_D22_Sample_Pos", _D22_Sample_Pos_var._position_absolute, _D22_Sample_Pos_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _D22_Sample_Pos_setpos */

/* component H51_D22_Sample_Div=Monitor_nD() SETTING, POSITION/ROTATION */
int _H51_D22_Sample_Div_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H51_D22_Sample_Div_setpos] component H51_D22_Sample_Div=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H51_D22_Sample_Div_var._name, "H51_D22_Sample_Div", 16384);
  stracpy(_H51_D22_Sample_Div_var._type, "Monitor_nD", 16384);
  _H51_D22_Sample_Div_var._index=311;
  int current_setpos_index = 311;
  if("" && strlen(""))
    stracpy(_H51_D22_Sample_Div_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H51_D22_Sample_Div_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H51_D22_Sample_Div_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H51_D22_Sample_Div_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H51_D22_Sample_Div_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H51_D22_Sample_Div_var._parameters.user3[0]='\0';
  _H51_D22_Sample_Div_var._parameters.xwidth = 0.02;
  _H51_D22_Sample_Div_var._parameters.yheight = 0.05;
  _H51_D22_Sample_Div_var._parameters.zdepth = 0;
  _H51_D22_Sample_Div_var._parameters.xmin = 0;
  _H51_D22_Sample_Div_var._parameters.xmax = 0;
  _H51_D22_Sample_Div_var._parameters.ymin = 0;
  _H51_D22_Sample_Div_var._parameters.ymax = 0;
  _H51_D22_Sample_Div_var._parameters.zmin = 0;
  _H51_D22_Sample_Div_var._parameters.zmax = 0;
  _H51_D22_Sample_Div_var._parameters.bins = 100;
  _H51_D22_Sample_Div_var._parameters.min = -1e40;
  _H51_D22_Sample_Div_var._parameters.max = 1e40;
  _H51_D22_Sample_Div_var._parameters.restore_neutron = 1;
  _H51_D22_Sample_Div_var._parameters.radius = 0;
  if("dx limits=[-2 2], dy limits=[-2 2]" && strlen("dx limits=[-2 2], dy limits=[-2 2]"))
    stracpy(_H51_D22_Sample_Div_var._parameters.options, "dx limits=[-2 2], dy limits=[-2 2]" ? "dx limits=[-2 2], dy limits=[-2 2]" : "", 16384);
  else 
  _H51_D22_Sample_Div_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_D22_Sample_Div_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_D22_Sample_Div_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_D22_Sample_Div_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_D22_Sample_Div_var._parameters.geometry[0]='\0';
  _H51_D22_Sample_Div_var._parameters.nowritefile = 0;
  _H51_D22_Sample_Div_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H51_D22_Sample_Div_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_D22_Sample_Div_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_D22_Sample_Div_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_D22_Sample_Div_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_D22_Sample_Div_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_D22_Sample_Div_var._parameters.username3[0]='\0';


  /* component H51_D22_Sample_Div=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _D22_Sample_Pos_var._rotation_absolute, _H51_D22_Sample_Div_var._rotation_absolute);
    rot_transpose(_D22_Collimation_var._rotation_absolute, tr1);
    rot_mul(_H51_D22_Sample_Div_var._rotation_absolute, tr1, _H51_D22_Sample_Div_var._rotation_relative);
    _H51_D22_Sample_Div_var._rotation_is_identity =  rot_test_identity(_H51_D22_Sample_Div_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_D22_Sample_Pos_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H51_D22_Sample_Div_var._position_absolute = coords_add(_D22_Sample_Pos_var._position_absolute, tc2);
    tc1 = coords_sub(_D22_Collimation_var._position_absolute, _H51_D22_Sample_Div_var._position_absolute);
    _H51_D22_Sample_Div_var._position_relative = rot_apply(_H51_D22_Sample_Div_var._rotation_absolute, tc1);
  } /* H51_D22_Sample_Div=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H51_D22_Sample_Div", _H51_D22_Sample_Div_var._position_absolute, _H51_D22_Sample_Div_var._rotation_absolute);
  instrument->_position_absolute[311] = _H51_D22_Sample_Div_var._position_absolute;
  instrument->_position_relative[311] = _H51_D22_Sample_Div_var._position_relative;
    _H51_D22_Sample_Div_var._position_relative_is_zero =  coords_test_zero(_H51_D22_Sample_Div_var._position_relative);
  instrument->counter_N[311]  = instrument->counter_P[311] = instrument->counter_P2[311] = 0;
  instrument->counter_AbsorbProp[311]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0310_H51_D22_Sample_Div", _H51_D22_Sample_Div_var._position_absolute, _H51_D22_Sample_Div_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "xwidth", "0", "0.02","MCNUM");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "yheight", "0", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "bins", "0", "100","int");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "options", "NULL", "dx limits=[-2 2], dy limits=[-2 2]", "char*");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0310_H51_D22_Sample_Div", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H51_D22_Sample_Div_setpos */

/* component H51_D22_Sample_XY=Monitor_nD() SETTING, POSITION/ROTATION */
int _H51_D22_Sample_XY_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H51_D22_Sample_XY_setpos] component H51_D22_Sample_XY=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H51_D22_Sample_XY_var._name, "H51_D22_Sample_XY", 16384);
  stracpy(_H51_D22_Sample_XY_var._type, "Monitor_nD", 16384);
  _H51_D22_Sample_XY_var._index=312;
  int current_setpos_index = 312;
  if("" && strlen(""))
    stracpy(_H51_D22_Sample_XY_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H51_D22_Sample_XY_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H51_D22_Sample_XY_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H51_D22_Sample_XY_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H51_D22_Sample_XY_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H51_D22_Sample_XY_var._parameters.user3[0]='\0';
  _H51_D22_Sample_XY_var._parameters.xwidth = 0.02;
  _H51_D22_Sample_XY_var._parameters.yheight = 0.05;
  _H51_D22_Sample_XY_var._parameters.zdepth = 0;
  _H51_D22_Sample_XY_var._parameters.xmin = 0;
  _H51_D22_Sample_XY_var._parameters.xmax = 0;
  _H51_D22_Sample_XY_var._parameters.ymin = 0;
  _H51_D22_Sample_XY_var._parameters.ymax = 0;
  _H51_D22_Sample_XY_var._parameters.zmin = 0;
  _H51_D22_Sample_XY_var._parameters.zmax = 0;
  _H51_D22_Sample_XY_var._parameters.bins = 50;
  _H51_D22_Sample_XY_var._parameters.min = -1e40;
  _H51_D22_Sample_XY_var._parameters.max = 1e40;
  _H51_D22_Sample_XY_var._parameters.restore_neutron = 1;
  _H51_D22_Sample_XY_var._parameters.radius = 0;
  if("x y" && strlen("x y"))
    stracpy(_H51_D22_Sample_XY_var._parameters.options, "x y" ? "x y" : "", 16384);
  else 
  _H51_D22_Sample_XY_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_D22_Sample_XY_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_D22_Sample_XY_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_D22_Sample_XY_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_D22_Sample_XY_var._parameters.geometry[0]='\0';
  _H51_D22_Sample_XY_var._parameters.nowritefile = 0;
  _H51_D22_Sample_XY_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H51_D22_Sample_XY_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_D22_Sample_XY_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_D22_Sample_XY_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_D22_Sample_XY_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_D22_Sample_XY_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_D22_Sample_XY_var._parameters.username3[0]='\0';


  /* component H51_D22_Sample_XY=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _D22_Sample_Pos_var._rotation_absolute, _H51_D22_Sample_XY_var._rotation_absolute);
    rot_transpose(_H51_D22_Sample_Div_var._rotation_absolute, tr1);
    rot_mul(_H51_D22_Sample_XY_var._rotation_absolute, tr1, _H51_D22_Sample_XY_var._rotation_relative);
    _H51_D22_Sample_XY_var._rotation_is_identity =  rot_test_identity(_H51_D22_Sample_XY_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_D22_Sample_Pos_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H51_D22_Sample_XY_var._position_absolute = coords_add(_D22_Sample_Pos_var._position_absolute, tc2);
    tc1 = coords_sub(_H51_D22_Sample_Div_var._position_absolute, _H51_D22_Sample_XY_var._position_absolute);
    _H51_D22_Sample_XY_var._position_relative = rot_apply(_H51_D22_Sample_XY_var._rotation_absolute, tc1);
  } /* H51_D22_Sample_XY=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H51_D22_Sample_XY", _H51_D22_Sample_XY_var._position_absolute, _H51_D22_Sample_XY_var._rotation_absolute);
  instrument->_position_absolute[312] = _H51_D22_Sample_XY_var._position_absolute;
  instrument->_position_relative[312] = _H51_D22_Sample_XY_var._position_relative;
    _H51_D22_Sample_XY_var._position_relative_is_zero =  coords_test_zero(_H51_D22_Sample_XY_var._position_relative);
  instrument->counter_N[312]  = instrument->counter_P[312] = instrument->counter_P2[312] = 0;
  instrument->counter_AbsorbProp[312]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0311_H51_D22_Sample_XY", _H51_D22_Sample_XY_var._position_absolute, _H51_D22_Sample_XY_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "xwidth", "0", "0.02","MCNUM");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "yheight", "0", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "options", "NULL", "x y", "char*");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0311_H51_D22_Sample_XY", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H51_D22_Sample_XY_setpos */

/* component H51_D22_Sample_L=Monitor_nD() SETTING, POSITION/ROTATION */
int _H51_D22_Sample_L_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H51_D22_Sample_L_setpos] component H51_D22_Sample_L=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_H51_D22_Sample_L_var._name, "H51_D22_Sample_L", 16384);
  stracpy(_H51_D22_Sample_L_var._type, "Monitor_nD", 16384);
  _H51_D22_Sample_L_var._index=313;
  int current_setpos_index = 313;
  if("" && strlen(""))
    stracpy(_H51_D22_Sample_L_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _H51_D22_Sample_L_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_H51_D22_Sample_L_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _H51_D22_Sample_L_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_H51_D22_Sample_L_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _H51_D22_Sample_L_var._parameters.user3[0]='\0';
  _H51_D22_Sample_L_var._parameters.xwidth = 0.02;
  _H51_D22_Sample_L_var._parameters.yheight = 0.05;
  _H51_D22_Sample_L_var._parameters.zdepth = 0;
  _H51_D22_Sample_L_var._parameters.xmin = 0;
  _H51_D22_Sample_L_var._parameters.xmax = 0;
  _H51_D22_Sample_L_var._parameters.ymin = 0;
  _H51_D22_Sample_L_var._parameters.ymax = 0;
  _H51_D22_Sample_L_var._parameters.zmin = 0;
  _H51_D22_Sample_L_var._parameters.zmax = 0;
  _H51_D22_Sample_L_var._parameters.bins = 50;
  _H51_D22_Sample_L_var._parameters.min = -1e40;
  _H51_D22_Sample_L_var._parameters.max = 1e40;
  _H51_D22_Sample_L_var._parameters.restore_neutron = 1;
  _H51_D22_Sample_L_var._parameters.radius = 0;
  if("lambda limits=[1 10]" && strlen("lambda limits=[1 10]"))
    stracpy(_H51_D22_Sample_L_var._parameters.options, "lambda limits=[1 10]" ? "lambda limits=[1 10]" : "", 16384);
  else 
  _H51_D22_Sample_L_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_D22_Sample_L_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_D22_Sample_L_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_D22_Sample_L_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_D22_Sample_L_var._parameters.geometry[0]='\0';
  _H51_D22_Sample_L_var._parameters.nowritefile = 0;
  _H51_D22_Sample_L_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_H51_D22_Sample_L_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_D22_Sample_L_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_D22_Sample_L_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_D22_Sample_L_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_H51_D22_Sample_L_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _H51_D22_Sample_L_var._parameters.username3[0]='\0';


  /* component H51_D22_Sample_L=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _D22_Sample_Pos_var._rotation_absolute, _H51_D22_Sample_L_var._rotation_absolute);
    rot_transpose(_H51_D22_Sample_XY_var._rotation_absolute, tr1);
    rot_mul(_H51_D22_Sample_L_var._rotation_absolute, tr1, _H51_D22_Sample_L_var._rotation_relative);
    _H51_D22_Sample_L_var._rotation_is_identity =  rot_test_identity(_H51_D22_Sample_L_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_D22_Sample_Pos_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H51_D22_Sample_L_var._position_absolute = coords_add(_D22_Sample_Pos_var._position_absolute, tc2);
    tc1 = coords_sub(_H51_D22_Sample_XY_var._position_absolute, _H51_D22_Sample_L_var._position_absolute);
    _H51_D22_Sample_L_var._position_relative = rot_apply(_H51_D22_Sample_L_var._rotation_absolute, tc1);
  } /* H51_D22_Sample_L=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("H51_D22_Sample_L", _H51_D22_Sample_L_var._position_absolute, _H51_D22_Sample_L_var._rotation_absolute);
  instrument->_position_absolute[313] = _H51_D22_Sample_L_var._position_absolute;
  instrument->_position_relative[313] = _H51_D22_Sample_L_var._position_relative;
    _H51_D22_Sample_L_var._position_relative_is_zero =  coords_test_zero(_H51_D22_Sample_L_var._position_relative);
  instrument->counter_N[313]  = instrument->counter_P[313] = instrument->counter_P2[313] = 0;
  instrument->counter_AbsorbProp[313]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0312_H51_D22_Sample_L", _H51_D22_Sample_L_var._position_absolute, _H51_D22_Sample_L_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "xwidth", "0", "0.02","MCNUM");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "yheight", "0", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "bins", "0", "50","int");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "restore_neutron", "0", "1","int");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "options", "NULL", "lambda limits=[1 10]", "char*");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0312_H51_D22_Sample_L", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H51_D22_Sample_L_setpos */

/* component H51_D22_Sample=Isotropic_Sqw() SETTING, POSITION/ROTATION */
int _H51_D22_Sample_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H51_D22_Sample_setpos] component H51_D22_Sample=Isotropic_Sqw() SETTING [Isotropic_Sqw:0]");
  stracpy(_H51_D22_Sample_var._name, "H51_D22_Sample", 16384);
  stracpy(_H51_D22_Sample_var._type, "Isotropic_Sqw", 16384);
  _H51_D22_Sample_var._index=314;
  int current_setpos_index = 314;
  _H51_D22_Sample_var._parameters.powder_format[0] = 0;
  _H51_D22_Sample_var._parameters.powder_format[1] = 0;
  _H51_D22_Sample_var._parameters.powder_format[2] = 0;
  _H51_D22_Sample_var._parameters.powder_format[3] = 0;
  _H51_D22_Sample_var._parameters.powder_format[4] = 0;
  _H51_D22_Sample_var._parameters.powder_format[5] = 0;
  _H51_D22_Sample_var._parameters.powder_format[6] = 0;
  _H51_D22_Sample_var._parameters.powder_format[7] = 0;
  _H51_D22_Sample_var._parameters.powder_format[8] = 0;
  if(_instrument_var._parameters.D22_sample && strlen(_instrument_var._parameters.D22_sample))
    stracpy(_H51_D22_Sample_var._parameters.Sqw_coh, _instrument_var._parameters.D22_sample ? _instrument_var._parameters.D22_sample : "", 16384);
  else 
  _H51_D22_Sample_var._parameters.Sqw_coh[0]='\0';
  _H51_D22_Sample_var._parameters.Sqw_inc[0]='\0';
  _H51_D22_Sample_var._parameters.geometry[0]='\0';
  _H51_D22_Sample_var._parameters.radius = 0.005;
  _H51_D22_Sample_var._parameters.thickness = 0;
  _H51_D22_Sample_var._parameters.xwidth = 0;
  _H51_D22_Sample_var._parameters.yheight = 0.05;
  _H51_D22_Sample_var._parameters.zdepth = 0;
  _H51_D22_Sample_var._parameters.threshold = 1e-20;
  _H51_D22_Sample_var._parameters.order = 0;
  _H51_D22_Sample_var._parameters.T = 0;
  _H51_D22_Sample_var._parameters.verbose = 1;
  _H51_D22_Sample_var._parameters.d_phi = 20;
  _H51_D22_Sample_var._parameters.concentric = 0;
  _H51_D22_Sample_var._parameters.rho = 0;
  _H51_D22_Sample_var._parameters.sigma_abs = 0;
  _H51_D22_Sample_var._parameters.sigma_coh = 0;
  _H51_D22_Sample_var._parameters.sigma_inc = 0;
  _H51_D22_Sample_var._parameters.classical = -1;
  _H51_D22_Sample_var._parameters.powder_Dd = 0;
  _H51_D22_Sample_var._parameters.powder_DW = 0;
  _H51_D22_Sample_var._parameters.powder_Vc = 0;
  _H51_D22_Sample_var._parameters.density = 0;
  _H51_D22_Sample_var._parameters.weight = 0;
  _H51_D22_Sample_var._parameters.p_interact = -1;
  _H51_D22_Sample_var._parameters.norm = -1;
  _H51_D22_Sample_var._parameters.powder_barns = 1;
  if("Frommhold" && strlen("Frommhold"))
    stracpy(_H51_D22_Sample_var._parameters.quantum_correction, "Frommhold" ? "Frommhold" : "", 16384);
  else 
  _H51_D22_Sample_var._parameters.quantum_correction[0]='\0';


  /* component H51_D22_Sample=Isotropic_Sqw() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _D22_Sample_Pos_var._rotation_absolute, _H51_D22_Sample_var._rotation_absolute);
    rot_transpose(_H51_D22_Sample_L_var._rotation_absolute, tr1);
    rot_mul(_H51_D22_Sample_var._rotation_absolute, tr1, _H51_D22_Sample_var._rotation_relative);
    _H51_D22_Sample_var._rotation_is_identity =  rot_test_identity(_H51_D22_Sample_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_D22_Sample_Pos_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H51_D22_Sample_var._position_absolute = coords_add(_D22_Sample_Pos_var._position_absolute, tc2);
    tc1 = coords_sub(_H51_D22_Sample_L_var._position_absolute, _H51_D22_Sample_var._position_absolute);
    _H51_D22_Sample_var._position_relative = rot_apply(_H51_D22_Sample_var._rotation_absolute, tc1);
  } /* H51_D22_Sample=Isotropic_Sqw() AT ROTATED */
  DEBUG_COMPONENT("H51_D22_Sample", _H51_D22_Sample_var._position_absolute, _H51_D22_Sample_var._rotation_absolute);
  instrument->_position_absolute[314] = _H51_D22_Sample_var._position_absolute;
  instrument->_position_relative[314] = _H51_D22_Sample_var._position_relative;
    _H51_D22_Sample_var._position_relative_is_zero =  coords_test_zero(_H51_D22_Sample_var._position_relative);
  instrument->counter_N[314]  = instrument->counter_P[314] = instrument->counter_P2[314] = 0;
  instrument->counter_AbsorbProp[314]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0313_H51_D22_Sample", _H51_D22_Sample_var._position_absolute, _H51_D22_Sample_var._rotation_absolute, "Isotropic_Sqw");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "powder_format", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }", "{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "Sqw_coh", 0, _instrument_var._parameters.D22_sample, "char*");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "Sqw_inc", 0, NULL, "char*");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "geometry", 0, 0, "char*");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "radius", "0", "0.005","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "yheight", "0", "0.05","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "threshold", "1e-20", "1e-20","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "order", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "T", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "verbose", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "d_phi", "0", "20","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "concentric", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "rho", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "sigma_abs", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "sigma_coh", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "sigma_inc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "classical", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "powder_Dd", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "powder_DW", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "powder_Vc", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "density", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "weight", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "p_interact", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "norm", "-1", "-1","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "powder_barns", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0313_H51_D22_Sample", "quantum_correction", "Frommhold", "Frommhold", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H51_D22_Sample_setpos */

/* component D22_Detector=Monitor_nD() SETTING, POSITION/ROTATION */
int _D22_Detector_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_D22_Detector_setpos] component D22_Detector=Monitor_nD() SETTING [Monitor_nD:0]");
  stracpy(_D22_Detector_var._name, "D22_Detector", 16384);
  stracpy(_D22_Detector_var._type, "Monitor_nD", 16384);
  _D22_Detector_var._index=315;
  int current_setpos_index = 315;
  if("" && strlen(""))
    stracpy(_D22_Detector_var._parameters.user1, "" ? "" : "", 16384);
  else 
  _D22_Detector_var._parameters.user1[0]='\0';
  if("" && strlen(""))
    stracpy(_D22_Detector_var._parameters.user2, "" ? "" : "", 16384);
  else 
  _D22_Detector_var._parameters.user2[0]='\0';
  if("" && strlen(""))
    stracpy(_D22_Detector_var._parameters.user3, "" ? "" : "", 16384);
  else 
  _D22_Detector_var._parameters.user3[0]='\0';
  _D22_Detector_var._parameters.xwidth = 1;
  _D22_Detector_var._parameters.yheight = 1;
  _D22_Detector_var._parameters.zdepth = 0;
  _D22_Detector_var._parameters.xmin = 0;
  _D22_Detector_var._parameters.xmax = 0;
  _D22_Detector_var._parameters.ymin = 0;
  _D22_Detector_var._parameters.ymax = 0;
  _D22_Detector_var._parameters.zmin = 0;
  _D22_Detector_var._parameters.zmax = 0;
  _D22_Detector_var._parameters.bins = 128;
  _D22_Detector_var._parameters.min = -1e40;
  _D22_Detector_var._parameters.max = 1e40;
  _D22_Detector_var._parameters.restore_neutron = 0;
  _D22_Detector_var._parameters.radius = 0;
  if("x y" && strlen("x y"))
    stracpy(_D22_Detector_var._parameters.options, "x y" ? "x y" : "", 16384);
  else 
  _D22_Detector_var._parameters.options[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_D22_Detector_var._parameters.filename, "NULL" ? "NULL" : "", 16384);
  else 
  _D22_Detector_var._parameters.filename[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_D22_Detector_var._parameters.geometry, "NULL" ? "NULL" : "", 16384);
  else 
  _D22_Detector_var._parameters.geometry[0]='\0';
  _D22_Detector_var._parameters.nowritefile = 0;
  _D22_Detector_var._parameters.nexus_bins = 0;
  if("NULL" && strlen("NULL"))
    stracpy(_D22_Detector_var._parameters.username1, "NULL" ? "NULL" : "", 16384);
  else 
  _D22_Detector_var._parameters.username1[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_D22_Detector_var._parameters.username2, "NULL" ? "NULL" : "", 16384);
  else 
  _D22_Detector_var._parameters.username2[0]='\0';
  if("NULL" && strlen("NULL"))
    stracpy(_D22_Detector_var._parameters.username3, "NULL" ? "NULL" : "", 16384);
  else 
  _D22_Detector_var._parameters.username3[0]='\0';


  /* component D22_Detector=Monitor_nD() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _D22_Sample_Pos_var._rotation_absolute, _D22_Detector_var._rotation_absolute);
    rot_transpose(_H51_D22_Sample_var._rotation_absolute, tr1);
    rot_mul(_D22_Detector_var._rotation_absolute, tr1, _D22_Detector_var._rotation_relative);
    _D22_Detector_var._rotation_is_identity =  rot_test_identity(_D22_Detector_var._rotation_relative);
    tc1 = coords_set(
      0, 0, _instrument_var._parameters.D22_collimation);
    rot_transpose(_D22_Sample_Pos_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _D22_Detector_var._position_absolute = coords_add(_D22_Sample_Pos_var._position_absolute, tc2);
    tc1 = coords_sub(_H51_D22_Sample_var._position_absolute, _D22_Detector_var._position_absolute);
    _D22_Detector_var._position_relative = rot_apply(_D22_Detector_var._rotation_absolute, tc1);
  } /* D22_Detector=Monitor_nD() AT ROTATED */
  DEBUG_COMPONENT("D22_Detector", _D22_Detector_var._position_absolute, _D22_Detector_var._rotation_absolute);
  instrument->_position_absolute[315] = _D22_Detector_var._position_absolute;
  instrument->_position_relative[315] = _D22_Detector_var._position_relative;
    _D22_Detector_var._position_relative_is_zero =  coords_test_zero(_D22_Detector_var._position_relative);
  instrument->counter_N[315]  = instrument->counter_P[315] = instrument->counter_P2[315] = 0;
  instrument->counter_AbsorbProp[315]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0314_D22_Detector", _D22_Detector_var._position_absolute, _D22_Detector_var._rotation_absolute, "Monitor_nD");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "user1", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "user2", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "user3", "", "", "char*");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "xwidth", "0", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "yheight", "0", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "xmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "xmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "ymin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "ymax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "zmin", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "zmax", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "bins", "0", "128","int");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "min", "-1e40", "-1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "max", "1e40", "1e40","MCNUM");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "restore_neutron", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "options", "NULL", "x y", "char*");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "filename", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "geometry", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "nowritefile", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "nexus_bins", "0", "0","int");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "username1", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "username2", "NULL", "NULL", "char*");
        mccomp_param_nexus(nxhandle,"0314_D22_Detector", "username3", "NULL", "NULL", "char*");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _D22_Detector_setpos */

/* component D22_Detector_vessel=Shape() SETTING, POSITION/ROTATION */
int _D22_Detector_vessel_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_D22_Detector_vessel_setpos] component D22_Detector_vessel=Shape() SETTING [Shape:0]");
  stracpy(_D22_Detector_vessel_var._name, "D22_Detector_vessel", 16384);
  stracpy(_D22_Detector_vessel_var._type, "Shape", 16384);
  _D22_Detector_vessel_var._index=316;
  int current_setpos_index = 316;
  _D22_Detector_vessel_var._parameters.geometry[0]='\0';
  _D22_Detector_vessel_var._parameters.radius = 1.5;
  _D22_Detector_vessel_var._parameters.xwidth = 0;
  _D22_Detector_vessel_var._parameters.yheight = 20;
  _D22_Detector_vessel_var._parameters.zdepth = 0;
  _D22_Detector_vessel_var._parameters.thickness = 0;
  _D22_Detector_vessel_var._parameters.nx = 0;
  _D22_Detector_vessel_var._parameters.ny = 1;
  _D22_Detector_vessel_var._parameters.nz = 0;
  _D22_Detector_vessel_var._parameters.center = 1;


  /* component D22_Detector_vessel=Shape() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (90)*DEG2RAD, (0)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _D22_Sample_Pos_var._rotation_absolute, _D22_Detector_vessel_var._rotation_absolute);
    rot_transpose(_D22_Detector_var._rotation_absolute, tr1);
    rot_mul(_D22_Detector_vessel_var._rotation_absolute, tr1, _D22_Detector_vessel_var._rotation_relative);
    _D22_Detector_vessel_var._rotation_is_identity =  rot_test_identity(_D22_Detector_vessel_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 11);
    rot_transpose(_D22_Sample_Pos_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _D22_Detector_vessel_var._position_absolute = coords_add(_D22_Sample_Pos_var._position_absolute, tc2);
    tc1 = coords_sub(_D22_Detector_var._position_absolute, _D22_Detector_vessel_var._position_absolute);
    _D22_Detector_vessel_var._position_relative = rot_apply(_D22_Detector_vessel_var._rotation_absolute, tc1);
  } /* D22_Detector_vessel=Shape() AT ROTATED */
  DEBUG_COMPONENT("D22_Detector_vessel", _D22_Detector_vessel_var._position_absolute, _D22_Detector_vessel_var._rotation_absolute);
  instrument->_position_absolute[316] = _D22_Detector_vessel_var._position_absolute;
  instrument->_position_relative[316] = _D22_Detector_vessel_var._position_relative;
    _D22_Detector_vessel_var._position_relative_is_zero =  coords_test_zero(_D22_Detector_vessel_var._position_relative);
  instrument->counter_N[316]  = instrument->counter_P[316] = instrument->counter_P2[316] = 0;
  instrument->counter_AbsorbProp[316]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0315_D22_Detector_vessel", _D22_Detector_vessel_var._position_absolute, _D22_Detector_vessel_var._rotation_absolute, "Shape");
        mccomp_param_nexus(nxhandle,"0315_D22_Detector_vessel", "geometry", 0, 0, "char*");
        mccomp_param_nexus(nxhandle,"0315_D22_Detector_vessel", "radius", "0", "1.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0315_D22_Detector_vessel", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0315_D22_Detector_vessel", "yheight", "0", "20","MCNUM");
        mccomp_param_nexus(nxhandle,"0315_D22_Detector_vessel", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0315_D22_Detector_vessel", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0315_D22_Detector_vessel", "nx", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0315_D22_Detector_vessel", "ny", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0315_D22_Detector_vessel", "nz", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0315_D22_Detector_vessel", "center", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _D22_Detector_vessel_setpos */

/* component BOG=Shape() SETTING, POSITION/ROTATION */
int _BOG_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_BOG_setpos] component BOG=Shape() SETTING [Shape:0]");
  stracpy(_BOG_var._name, "BOG", 16384);
  stracpy(_BOG_var._type, "Shape", 16384);
  _BOG_var._index=317;
  int current_setpos_index = 317;
  _BOG_var._parameters.geometry[0]='\0';
  _BOG_var._parameters.radius = 0.735;
  _BOG_var._parameters.xwidth = 0;
  _BOG_var._parameters.yheight = 0.3;
  _BOG_var._parameters.zdepth = 0;
  _BOG_var._parameters.thickness = 0;
  _BOG_var._parameters.nx = 0;
  _BOG_var._parameters.ny = 1;
  _BOG_var._parameters.nz = 0;
  _BOG_var._parameters.center = 1;


  /* component BOG=Shape() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_var._rotation_absolute, _BOG_var._rotation_absolute);
    rot_transpose(_D22_Detector_vessel_var._rotation_absolute, tr1);
    rot_mul(_BOG_var._rotation_absolute, tr1, _BOG_var._rotation_relative);
    _BOG_var._rotation_is_identity =  rot_test_identity(_BOG_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 6.55);
    rot_transpose(_HCS_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _BOG_var._position_absolute = coords_add(_HCS_var._position_absolute, tc2);
    tc1 = coords_sub(_D22_Detector_vessel_var._position_absolute, _BOG_var._position_absolute);
    _BOG_var._position_relative = rot_apply(_BOG_var._rotation_absolute, tc1);
  } /* BOG=Shape() AT ROTATED */
  DEBUG_COMPONENT("BOG", _BOG_var._position_absolute, _BOG_var._rotation_absolute);
  instrument->_position_absolute[317] = _BOG_var._position_absolute;
  instrument->_position_relative[317] = _BOG_var._position_relative;
    _BOG_var._position_relative_is_zero =  coords_test_zero(_BOG_var._position_relative);
  instrument->counter_N[317]  = instrument->counter_P[317] = instrument->counter_P2[317] = 0;
  instrument->counter_AbsorbProp[317]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0316_BOG", _BOG_var._position_absolute, _BOG_var._rotation_absolute, "Shape");
        mccomp_param_nexus(nxhandle,"0316_BOG", "geometry", 0, 0, "char*");
        mccomp_param_nexus(nxhandle,"0316_BOG", "radius", "0", "0.735","MCNUM");
        mccomp_param_nexus(nxhandle,"0316_BOG", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0316_BOG", "yheight", "0", "0.3","MCNUM");
        mccomp_param_nexus(nxhandle,"0316_BOG", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0316_BOG", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0316_BOG", "nx", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0316_BOG", "ny", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0316_BOG", "nz", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0316_BOG", "center", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _BOG_setpos */

/* component H53_ThALES_Drum=Shape() SETTING, POSITION/ROTATION */
int _H53_ThALES_Drum_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H53_ThALES_Drum_setpos] component H53_ThALES_Drum=Shape() SETTING [Shape:0]");
  stracpy(_H53_ThALES_Drum_var._name, "H53_ThALES_Drum", 16384);
  stracpy(_H53_ThALES_Drum_var._type, "Shape", 16384);
  _H53_ThALES_Drum_var._index=318;
  int current_setpos_index = 318;
  _H53_ThALES_Drum_var._parameters.geometry[0]='\0';
  _H53_ThALES_Drum_var._parameters.radius = 0.45;
  _H53_ThALES_Drum_var._parameters.xwidth = 0;
  _H53_ThALES_Drum_var._parameters.yheight = 0.3;
  _H53_ThALES_Drum_var._parameters.zdepth = 0;
  _H53_ThALES_Drum_var._parameters.thickness = 0;
  _H53_ThALES_Drum_var._parameters.nx = 0;
  _H53_ThALES_Drum_var._parameters.ny = 1;
  _H53_ThALES_Drum_var._parameters.nz = 0;
  _H53_ThALES_Drum_var._parameters.center = 1;


  /* component H53_ThALES_Drum=Shape() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H53_ThALES_Monochromator_Cradle_var._rotation_absolute, _H53_ThALES_Drum_var._rotation_absolute);
    rot_transpose(_BOG_var._rotation_absolute, tr1);
    rot_mul(_H53_ThALES_Drum_var._rotation_absolute, tr1, _H53_ThALES_Drum_var._rotation_relative);
    _H53_ThALES_Drum_var._rotation_is_identity =  rot_test_identity(_H53_ThALES_Drum_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H53_ThALES_Monochromator_Cradle_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H53_ThALES_Drum_var._position_absolute = coords_add(_H53_ThALES_Monochromator_Cradle_var._position_absolute, tc2);
    tc1 = coords_sub(_BOG_var._position_absolute, _H53_ThALES_Drum_var._position_absolute);
    _H53_ThALES_Drum_var._position_relative = rot_apply(_H53_ThALES_Drum_var._rotation_absolute, tc1);
  } /* H53_ThALES_Drum=Shape() AT ROTATED */
  DEBUG_COMPONENT("H53_ThALES_Drum", _H53_ThALES_Drum_var._position_absolute, _H53_ThALES_Drum_var._rotation_absolute);
  instrument->_position_absolute[318] = _H53_ThALES_Drum_var._position_absolute;
  instrument->_position_relative[318] = _H53_ThALES_Drum_var._position_relative;
    _H53_ThALES_Drum_var._position_relative_is_zero =  coords_test_zero(_H53_ThALES_Drum_var._position_relative);
  instrument->counter_N[318]  = instrument->counter_P[318] = instrument->counter_P2[318] = 0;
  instrument->counter_AbsorbProp[318]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0317_H53_ThALES_Drum", _H53_ThALES_Drum_var._position_absolute, _H53_ThALES_Drum_var._rotation_absolute, "Shape");
        mccomp_param_nexus(nxhandle,"0317_H53_ThALES_Drum", "geometry", 0, 0, "char*");
        mccomp_param_nexus(nxhandle,"0317_H53_ThALES_Drum", "radius", "0", "0.45","MCNUM");
        mccomp_param_nexus(nxhandle,"0317_H53_ThALES_Drum", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0317_H53_ThALES_Drum", "yheight", "0", "0.3","MCNUM");
        mccomp_param_nexus(nxhandle,"0317_H53_ThALES_Drum", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0317_H53_ThALES_Drum", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0317_H53_ThALES_Drum", "nx", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0317_H53_ThALES_Drum", "ny", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0317_H53_ThALES_Drum", "nz", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0317_H53_ThALES_Drum", "center", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H53_ThALES_Drum_setpos */

/* component H521_D16_Drum=Shape() SETTING, POSITION/ROTATION */
int _H521_D16_Drum_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_D16_Drum_setpos] component H521_D16_Drum=Shape() SETTING [Shape:0]");
  stracpy(_H521_D16_Drum_var._name, "H521_D16_Drum", 16384);
  stracpy(_H521_D16_Drum_var._type, "Shape", 16384);
  _H521_D16_Drum_var._index=319;
  int current_setpos_index = 319;
  _H521_D16_Drum_var._parameters.geometry[0]='\0';
  _H521_D16_Drum_var._parameters.radius = 0.2;
  _H521_D16_Drum_var._parameters.xwidth = 0;
  _H521_D16_Drum_var._parameters.yheight = 0.3;
  _H521_D16_Drum_var._parameters.zdepth = 0;
  _H521_D16_Drum_var._parameters.thickness = 0;
  _H521_D16_Drum_var._parameters.nx = 0;
  _H521_D16_Drum_var._parameters.ny = 1;
  _H521_D16_Drum_var._parameters.nz = 0;
  _H521_D16_Drum_var._parameters.center = 1;


  /* component H521_D16_Drum=Shape() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_D16_Monochromator_Cradle_var._rotation_absolute, _H521_D16_Drum_var._rotation_absolute);
    rot_transpose(_H53_ThALES_Drum_var._rotation_absolute, tr1);
    rot_mul(_H521_D16_Drum_var._rotation_absolute, tr1, _H521_D16_Drum_var._rotation_relative);
    _H521_D16_Drum_var._rotation_is_identity =  rot_test_identity(_H521_D16_Drum_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H521_D16_Monochromator_Cradle_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_D16_Drum_var._position_absolute = coords_add(_H521_D16_Monochromator_Cradle_var._position_absolute, tc2);
    tc1 = coords_sub(_H53_ThALES_Drum_var._position_absolute, _H521_D16_Drum_var._position_absolute);
    _H521_D16_Drum_var._position_relative = rot_apply(_H521_D16_Drum_var._rotation_absolute, tc1);
  } /* H521_D16_Drum=Shape() AT ROTATED */
  DEBUG_COMPONENT("H521_D16_Drum", _H521_D16_Drum_var._position_absolute, _H521_D16_Drum_var._rotation_absolute);
  instrument->_position_absolute[319] = _H521_D16_Drum_var._position_absolute;
  instrument->_position_relative[319] = _H521_D16_Drum_var._position_relative;
    _H521_D16_Drum_var._position_relative_is_zero =  coords_test_zero(_H521_D16_Drum_var._position_relative);
  instrument->counter_N[319]  = instrument->counter_P[319] = instrument->counter_P2[319] = 0;
  instrument->counter_AbsorbProp[319]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0318_H521_D16_Drum", _H521_D16_Drum_var._position_absolute, _H521_D16_Drum_var._rotation_absolute, "Shape");
        mccomp_param_nexus(nxhandle,"0318_H521_D16_Drum", "geometry", 0, 0, "char*");
        mccomp_param_nexus(nxhandle,"0318_H521_D16_Drum", "radius", "0", "0.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0318_H521_D16_Drum", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0318_H521_D16_Drum", "yheight", "0", "0.3","MCNUM");
        mccomp_param_nexus(nxhandle,"0318_H521_D16_Drum", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0318_H521_D16_Drum", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0318_H521_D16_Drum", "nx", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0318_H521_D16_Drum", "ny", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0318_H521_D16_Drum", "nz", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0318_H521_D16_Drum", "center", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_D16_Drum_setpos */

/* component H521_SADAM_Drum=Shape() SETTING, POSITION/ROTATION */
int _H521_SADAM_Drum_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H521_SADAM_Drum_setpos] component H521_SADAM_Drum=Shape() SETTING [Shape:0]");
  stracpy(_H521_SADAM_Drum_var._name, "H521_SADAM_Drum", 16384);
  stracpy(_H521_SADAM_Drum_var._type, "Shape", 16384);
  _H521_SADAM_Drum_var._index=320;
  int current_setpos_index = 320;
  _H521_SADAM_Drum_var._parameters.geometry[0]='\0';
  _H521_SADAM_Drum_var._parameters.radius = 0.2;
  _H521_SADAM_Drum_var._parameters.xwidth = 0;
  _H521_SADAM_Drum_var._parameters.yheight = 0.3;
  _H521_SADAM_Drum_var._parameters.zdepth = 0;
  _H521_SADAM_Drum_var._parameters.thickness = 0;
  _H521_SADAM_Drum_var._parameters.nx = 0;
  _H521_SADAM_Drum_var._parameters.ny = 1;
  _H521_SADAM_Drum_var._parameters.nz = 0;
  _H521_SADAM_Drum_var._parameters.center = 1;


  /* component H521_SADAM_Drum=Shape() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _H521_SADAM_Monochromator_Cradle_var._rotation_absolute, _H521_SADAM_Drum_var._rotation_absolute);
    rot_transpose(_H521_D16_Drum_var._rotation_absolute, tr1);
    rot_mul(_H521_SADAM_Drum_var._rotation_absolute, tr1, _H521_SADAM_Drum_var._rotation_relative);
    _H521_SADAM_Drum_var._rotation_is_identity =  rot_test_identity(_H521_SADAM_Drum_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_H521_SADAM_Monochromator_Cradle_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H521_SADAM_Drum_var._position_absolute = coords_add(_H521_SADAM_Monochromator_Cradle_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_D16_Drum_var._position_absolute, _H521_SADAM_Drum_var._position_absolute);
    _H521_SADAM_Drum_var._position_relative = rot_apply(_H521_SADAM_Drum_var._rotation_absolute, tc1);
  } /* H521_SADAM_Drum=Shape() AT ROTATED */
  DEBUG_COMPONENT("H521_SADAM_Drum", _H521_SADAM_Drum_var._position_absolute, _H521_SADAM_Drum_var._rotation_absolute);
  instrument->_position_absolute[320] = _H521_SADAM_Drum_var._position_absolute;
  instrument->_position_relative[320] = _H521_SADAM_Drum_var._position_relative;
    _H521_SADAM_Drum_var._position_relative_is_zero =  coords_test_zero(_H521_SADAM_Drum_var._position_relative);
  instrument->counter_N[320]  = instrument->counter_P[320] = instrument->counter_P2[320] = 0;
  instrument->counter_AbsorbProp[320]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0319_H521_SADAM_Drum", _H521_SADAM_Drum_var._position_absolute, _H521_SADAM_Drum_var._rotation_absolute, "Shape");
        mccomp_param_nexus(nxhandle,"0319_H521_SADAM_Drum", "geometry", 0, 0, "char*");
        mccomp_param_nexus(nxhandle,"0319_H521_SADAM_Drum", "radius", "0", "0.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0319_H521_SADAM_Drum", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0319_H521_SADAM_Drum", "yheight", "0", "0.3","MCNUM");
        mccomp_param_nexus(nxhandle,"0319_H521_SADAM_Drum", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0319_H521_SADAM_Drum", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0319_H521_SADAM_Drum", "nx", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0319_H521_SADAM_Drum", "ny", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0319_H521_SADAM_Drum", "nz", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0319_H521_SADAM_Drum", "center", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H521_SADAM_Drum_setpos */

/* component Traversee=Shape() SETTING, POSITION/ROTATION */
int _Traversee_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_Traversee_setpos] component Traversee=Shape() SETTING [Shape:0]");
  stracpy(_Traversee_var._name, "Traversee", 16384);
  stracpy(_Traversee_var._type, "Shape", 16384);
  _Traversee_var._index=321;
  int current_setpos_index = 321;
  _Traversee_var._parameters.geometry[0]='\0';
  _Traversee_var._parameters.radius = 0;
  _Traversee_var._parameters.xwidth = 2;
  _Traversee_var._parameters.yheight = 0.5;
  _Traversee_var._parameters.zdepth = 0;
  _Traversee_var._parameters.thickness = 0;
  _Traversee_var._parameters.nx = 0;
  _Traversee_var._parameters.ny = 1;
  _Traversee_var._parameters.nz = 0;
  _Traversee_var._parameters.center = 1;


  /* component Traversee=Shape() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _HCS_var._rotation_absolute, _Traversee_var._rotation_absolute);
    rot_transpose(_H521_SADAM_Drum_var._rotation_absolute, tr1);
    rot_mul(_Traversee_var._rotation_absolute, tr1, _Traversee_var._rotation_relative);
    _Traversee_var._rotation_is_identity =  rot_test_identity(_Traversee_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 31.6);
    rot_transpose(_HCS_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _Traversee_var._position_absolute = coords_add(_HCS_var._position_absolute, tc2);
    tc1 = coords_sub(_H521_SADAM_Drum_var._position_absolute, _Traversee_var._position_absolute);
    _Traversee_var._position_relative = rot_apply(_Traversee_var._rotation_absolute, tc1);
  } /* Traversee=Shape() AT ROTATED */
  DEBUG_COMPONENT("Traversee", _Traversee_var._position_absolute, _Traversee_var._rotation_absolute);
  instrument->_position_absolute[321] = _Traversee_var._position_absolute;
  instrument->_position_relative[321] = _Traversee_var._position_relative;
    _Traversee_var._position_relative_is_zero =  coords_test_zero(_Traversee_var._position_relative);
  instrument->counter_N[321]  = instrument->counter_P[321] = instrument->counter_P2[321] = 0;
  instrument->counter_AbsorbProp[321]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0320_Traversee", _Traversee_var._position_absolute, _Traversee_var._rotation_absolute, "Shape");
        mccomp_param_nexus(nxhandle,"0320_Traversee", "geometry", 0, 0, "char*");
        mccomp_param_nexus(nxhandle,"0320_Traversee", "radius", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0320_Traversee", "xwidth", "0", "2","MCNUM");
        mccomp_param_nexus(nxhandle,"0320_Traversee", "yheight", "0", "0.5","MCNUM");
        mccomp_param_nexus(nxhandle,"0320_Traversee", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0320_Traversee", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0320_Traversee", "nx", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0320_Traversee", "ny", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0320_Traversee", "nz", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0320_Traversee", "center", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _Traversee_setpos */

/* component Core_Centre=Arm() SETTING, POSITION/ROTATION */
int _Core_Centre_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_Core_Centre_setpos] component Core_Centre=Arm() SETTING [Arm:0]");
  stracpy(_Core_Centre_var._name, "Core_Centre", 16384);
  stracpy(_Core_Centre_var._type, "Arm", 16384);
  _Core_Centre_var._index=322;
  int current_setpos_index = 322;
  /* component Core_Centre=Arm() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (44.8 + 180)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _HCS_var._rotation_absolute, _Core_Centre_var._rotation_absolute);
    rot_transpose(_Traversee_var._rotation_absolute, tr1);
    rot_mul(_Core_Centre_var._rotation_absolute, tr1, _Core_Centre_var._rotation_relative);
    _Core_Centre_var._rotation_is_identity =  rot_test_identity(_Core_Centre_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_HCS_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _Core_Centre_var._position_absolute = coords_add(_HCS_var._position_absolute, tc2);
    tc1 = coords_sub(_Traversee_var._position_absolute, _Core_Centre_var._position_absolute);
    _Core_Centre_var._position_relative = rot_apply(_Core_Centre_var._rotation_absolute, tc1);
  } /* Core_Centre=Arm() AT ROTATED */
  DEBUG_COMPONENT("Core_Centre", _Core_Centre_var._position_absolute, _Core_Centre_var._rotation_absolute);
  instrument->_position_absolute[322] = _Core_Centre_var._position_absolute;
  instrument->_position_relative[322] = _Core_Centre_var._position_relative;
    _Core_Centre_var._position_relative_is_zero =  coords_test_zero(_Core_Centre_var._position_relative);
  instrument->counter_N[322]  = instrument->counter_P[322] = instrument->counter_P2[322] = 0;
  instrument->counter_AbsorbProp[322]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0321_Core_Centre", _Core_Centre_var._position_absolute, _Core_Centre_var._rotation_absolute, "Arm");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _Core_Centre_setpos */

/* component Core=Shape() SETTING, POSITION/ROTATION */
int _Core_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_Core_setpos] component Core=Shape() SETTING [Shape:0]");
  stracpy(_Core_var._name, "Core", 16384);
  stracpy(_Core_var._type, "Shape", 16384);
  _Core_var._index=323;
  int current_setpos_index = 323;
  _Core_var._parameters.geometry[0]='\0';
  _Core_var._parameters.radius = 0.3;
  _Core_var._parameters.xwidth = 0;
  _Core_var._parameters.yheight = 0.7;
  _Core_var._parameters.zdepth = 0;
  _Core_var._parameters.thickness = 0;
  _Core_var._parameters.nx = 0;
  _Core_var._parameters.ny = 1;
  _Core_var._parameters.nz = 0;
  _Core_var._parameters.center = 1;


  /* component Core=Shape() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0)*DEG2RAD, (0)*DEG2RAD, (0)*DEG2RAD);
    rot_mul(tr1, _Origin_var._rotation_absolute, _Core_var._rotation_absolute);
    rot_transpose(_Traversee_var._rotation_absolute, tr1);
    rot_mul(_Core_var._rotation_absolute, tr1, _Core_var._rotation_relative);
    _Core_var._rotation_is_identity =  rot_test_identity(_Core_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0.7);
    rot_transpose(_Core_Centre_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _Core_var._position_absolute = coords_add(_Core_Centre_var._position_absolute, tc2);
    tc1 = coords_sub(_Traversee_var._position_absolute, _Core_var._position_absolute);
    _Core_var._position_relative = rot_apply(_Core_var._rotation_absolute, tc1);
  } /* Core=Shape() AT ROTATED */
  DEBUG_COMPONENT("Core", _Core_var._position_absolute, _Core_var._rotation_absolute);
  instrument->_position_absolute[323] = _Core_var._position_absolute;
  instrument->_position_relative[323] = _Core_var._position_relative;
    _Core_var._position_relative_is_zero =  coords_test_zero(_Core_var._position_relative);
  instrument->counter_N[323]  = instrument->counter_P[323] = instrument->counter_P2[323] = 0;
  instrument->counter_AbsorbProp[323]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0322_Core", _Core_var._position_absolute, _Core_var._rotation_absolute, "Shape");
        mccomp_param_nexus(nxhandle,"0322_Core", "geometry", 0, 0, "char*");
        mccomp_param_nexus(nxhandle,"0322_Core", "radius", "0", "0.3","MCNUM");
        mccomp_param_nexus(nxhandle,"0322_Core", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0322_Core", "yheight", "0", "0.7","MCNUM");
        mccomp_param_nexus(nxhandle,"0322_Core", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0322_Core", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0322_Core", "nx", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0322_Core", "ny", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0322_Core", "nz", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0322_Core", "center", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _Core_setpos */

/* component D2O_Vessel=Shape() SETTING, POSITION/ROTATION */
int _D2O_Vessel_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_D2O_Vessel_setpos] component D2O_Vessel=Shape() SETTING [Shape:0]");
  stracpy(_D2O_Vessel_var._name, "D2O_Vessel", 16384);
  stracpy(_D2O_Vessel_var._type, "Shape", 16384);
  _D2O_Vessel_var._index=324;
  int current_setpos_index = 324;
  _D2O_Vessel_var._parameters.geometry[0]='\0';
  _D2O_Vessel_var._parameters.radius = 1.25;
  _D2O_Vessel_var._parameters.xwidth = 0;
  _D2O_Vessel_var._parameters.yheight = 1;
  _D2O_Vessel_var._parameters.zdepth = 0;
  _D2O_Vessel_var._parameters.thickness = 0;
  _D2O_Vessel_var._parameters.nx = 0;
  _D2O_Vessel_var._parameters.ny = 1;
  _D2O_Vessel_var._parameters.nz = 0;
  _D2O_Vessel_var._parameters.center = 1;


  /* component D2O_Vessel=Shape() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _Core_var._rotation_absolute, _D2O_Vessel_var._rotation_absolute);
    rot_transpose(_Core_var._rotation_absolute, tr1);
    rot_mul(_D2O_Vessel_var._rotation_absolute, tr1, _D2O_Vessel_var._rotation_relative);
    _D2O_Vessel_var._rotation_is_identity =  rot_test_identity(_D2O_Vessel_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_Core_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _D2O_Vessel_var._position_absolute = coords_add(_Core_var._position_absolute, tc2);
    tc1 = coords_sub(_Core_var._position_absolute, _D2O_Vessel_var._position_absolute);
    _D2O_Vessel_var._position_relative = rot_apply(_D2O_Vessel_var._rotation_absolute, tc1);
  } /* D2O_Vessel=Shape() AT ROTATED */
  DEBUG_COMPONENT("D2O_Vessel", _D2O_Vessel_var._position_absolute, _D2O_Vessel_var._rotation_absolute);
  instrument->_position_absolute[324] = _D2O_Vessel_var._position_absolute;
  instrument->_position_relative[324] = _D2O_Vessel_var._position_relative;
    _D2O_Vessel_var._position_relative_is_zero =  coords_test_zero(_D2O_Vessel_var._position_relative);
  instrument->counter_N[324]  = instrument->counter_P[324] = instrument->counter_P2[324] = 0;
  instrument->counter_AbsorbProp[324]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0323_D2O_Vessel", _D2O_Vessel_var._position_absolute, _D2O_Vessel_var._rotation_absolute, "Shape");
        mccomp_param_nexus(nxhandle,"0323_D2O_Vessel", "geometry", 0, 0, "char*");
        mccomp_param_nexus(nxhandle,"0323_D2O_Vessel", "radius", "0", "1.25","MCNUM");
        mccomp_param_nexus(nxhandle,"0323_D2O_Vessel", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0323_D2O_Vessel", "yheight", "0", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0323_D2O_Vessel", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0323_D2O_Vessel", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0323_D2O_Vessel", "nx", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0323_D2O_Vessel", "ny", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0323_D2O_Vessel", "nz", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0323_D2O_Vessel", "center", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _D2O_Vessel_setpos */

/* component H2O_Vessel=Shape() SETTING, POSITION/ROTATION */
int _H2O_Vessel_setpos(void)
{ /* sets initial component parameters, position and rotation */
  SIG_MESSAGE("[_H2O_Vessel_setpos] component H2O_Vessel=Shape() SETTING [Shape:0]");
  stracpy(_H2O_Vessel_var._name, "H2O_Vessel", 16384);
  stracpy(_H2O_Vessel_var._type, "Shape", 16384);
  _H2O_Vessel_var._index=325;
  int current_setpos_index = 325;
  _H2O_Vessel_var._parameters.geometry[0]='\0';
  _H2O_Vessel_var._parameters.radius = 4.9;
  _H2O_Vessel_var._parameters.xwidth = 0;
  _H2O_Vessel_var._parameters.yheight = 1.2;
  _H2O_Vessel_var._parameters.zdepth = 0;
  _H2O_Vessel_var._parameters.thickness = 0;
  _H2O_Vessel_var._parameters.nx = 0;
  _H2O_Vessel_var._parameters.ny = 1;
  _H2O_Vessel_var._parameters.nz = 0;
  _H2O_Vessel_var._parameters.center = 1;


  /* component H2O_Vessel=Shape() AT ROTATED */
  {
    Coords tc1, tc2;
    tc1 = coords_set(0,0,0);
    tc2 = coords_set(0,0,0);
    Rotation tr1;
    rot_set_rotation(tr1,0,0,0);
    rot_set_rotation(tr1,
      (0.0)*DEG2RAD, (0.0)*DEG2RAD, (0.0)*DEG2RAD);
    rot_mul(tr1, _Core_var._rotation_absolute, _H2O_Vessel_var._rotation_absolute);
    rot_transpose(_D2O_Vessel_var._rotation_absolute, tr1);
    rot_mul(_H2O_Vessel_var._rotation_absolute, tr1, _H2O_Vessel_var._rotation_relative);
    _H2O_Vessel_var._rotation_is_identity =  rot_test_identity(_H2O_Vessel_var._rotation_relative);
    tc1 = coords_set(
      0, 0, 0);
    rot_transpose(_Core_var._rotation_absolute, tr1);
    tc2 = rot_apply(tr1, tc1);
    _H2O_Vessel_var._position_absolute = coords_add(_Core_var._position_absolute, tc2);
    tc1 = coords_sub(_D2O_Vessel_var._position_absolute, _H2O_Vessel_var._position_absolute);
    _H2O_Vessel_var._position_relative = rot_apply(_H2O_Vessel_var._rotation_absolute, tc1);
  } /* H2O_Vessel=Shape() AT ROTATED */
  DEBUG_COMPONENT("H2O_Vessel", _H2O_Vessel_var._position_absolute, _H2O_Vessel_var._rotation_absolute);
  instrument->_position_absolute[325] = _H2O_Vessel_var._position_absolute;
  instrument->_position_relative[325] = _H2O_Vessel_var._position_relative;
    _H2O_Vessel_var._position_relative_is_zero =  coords_test_zero(_H2O_Vessel_var._position_relative);
  instrument->counter_N[325]  = instrument->counter_P[325] = instrument->counter_P2[325] = 0;
  instrument->counter_AbsorbProp[325]= 0;
  #ifdef USE_NEXUS
  if(nxhandle) {
    if ((!mcdotrace) && mcformat && strcasestr(mcformat, "NeXus")) {
    MPI_MASTER(
        mccomp_placement_type_nexus(nxhandle,"0324_H2O_Vessel", _H2O_Vessel_var._position_absolute, _H2O_Vessel_var._rotation_absolute, "Shape");
        mccomp_param_nexus(nxhandle,"0324_H2O_Vessel", "geometry", 0, 0, "char*");
        mccomp_param_nexus(nxhandle,"0324_H2O_Vessel", "radius", "0", "4.9","MCNUM");
        mccomp_param_nexus(nxhandle,"0324_H2O_Vessel", "xwidth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0324_H2O_Vessel", "yheight", "0", "1.2","MCNUM");
        mccomp_param_nexus(nxhandle,"0324_H2O_Vessel", "zdepth", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0324_H2O_Vessel", "thickness", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0324_H2O_Vessel", "nx", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0324_H2O_Vessel", "ny", "1", "1","MCNUM");
        mccomp_param_nexus(nxhandle,"0324_H2O_Vessel", "nz", "0", "0","MCNUM");
        mccomp_param_nexus(nxhandle,"0324_H2O_Vessel", "center", "1", "1","int");
      );
    }
  } else {
    // fprintf(stderr,"NO NEXUS FILE");
  }
  #endif
  return(0);
} /* _H2O_Vessel_setpos */

_class_Progress_bar *class_Progress_bar_init(_class_Progress_bar *_comp
) {
  #define profile (_comp->_parameters.profile)
  #define percent (_comp->_parameters.percent)
  #define flag_save (_comp->_parameters.flag_save)
  #define minutes (_comp->_parameters.minutes)
  #define IntermediateCnts (_comp->_parameters.IntermediateCnts)
  #define StartTime (_comp->_parameters.StartTime)
  #define EndTime (_comp->_parameters.EndTime)
  #define CurrentTime (_comp->_parameters.CurrentTime)
  #define infostring (_comp->_parameters.infostring)
  SIG_MESSAGE("[_Origin_init] component Origin=Progress_bar() INITIALISE [Progress_bar:0]");

  IntermediateCnts = 0;
  StartTime = 0;
  EndTime = 0;
  CurrentTime = 0;

  fprintf (stdout, "[%s] Initialize\n", instrument_name);
  if (percent * mcget_ncount () / 100 < 1e5) {
    percent = 1e5 * 100.0 / mcget_ncount ();
  }
  #ifdef OPENACC
  time (&StartTime);
  #endif

  #ifdef USE_MPI
  sprintf (infostring, "(%i MPI processes) ", mpi_node_count);
  #else
  sprintf (infostring, "(single process) ");
  #endif
  #undef profile
  #undef percent
  #undef flag_save
  #undef minutes
  #undef IntermediateCnts
  #undef StartTime
  #undef EndTime
  #undef CurrentTime
  #undef infostring
  return(_comp);
} /* class_Progress_bar_init */

_class_Source_gen *class_Source_gen_init(_class_Source_gen *_comp
) {
  #define flux_file (_comp->_parameters.flux_file)
  #define xdiv_file (_comp->_parameters.xdiv_file)
  #define ydiv_file (_comp->_parameters.ydiv_file)
  #define radius (_comp->_parameters.radius)
  #define dist (_comp->_parameters.dist)
  #define focus_xw (_comp->_parameters.focus_xw)
  #define focus_yh (_comp->_parameters.focus_yh)
  #define focus_aw (_comp->_parameters.focus_aw)
  #define focus_ah (_comp->_parameters.focus_ah)
  #define E0 (_comp->_parameters.E0)
  #define dE (_comp->_parameters.dE)
  #define lambda0 (_comp->_parameters.lambda0)
  #define dlambda (_comp->_parameters.dlambda)
  #define I1 (_comp->_parameters.I1)
  #define yheight (_comp->_parameters.yheight)
  #define xwidth (_comp->_parameters.xwidth)
  #define verbose (_comp->_parameters.verbose)
  #define T1 (_comp->_parameters.T1)
  #define flux_file_perAA (_comp->_parameters.flux_file_perAA)
  #define flux_file_log (_comp->_parameters.flux_file_log)
  #define Lmin (_comp->_parameters.Lmin)
  #define Lmax (_comp->_parameters.Lmax)
  #define Emin (_comp->_parameters.Emin)
  #define Emax (_comp->_parameters.Emax)
  #define T2 (_comp->_parameters.T2)
  #define I2 (_comp->_parameters.I2)
  #define T3 (_comp->_parameters.T3)
  #define I3 (_comp->_parameters.I3)
  #define zdepth (_comp->_parameters.zdepth)
  #define target_index (_comp->_parameters.target_index)
  #define p_in (_comp->_parameters.p_in)
  #define lambda1 (_comp->_parameters.lambda1)
  #define lambda2 (_comp->_parameters.lambda2)
  #define lambda3 (_comp->_parameters.lambda3)
  #define pTable (_comp->_parameters.pTable)
  #define pTable_x (_comp->_parameters.pTable_x)
  #define pTable_y (_comp->_parameters.pTable_y)
  #define pTable_xmin (_comp->_parameters.pTable_xmin)
  #define pTable_xmax (_comp->_parameters.pTable_xmax)
  #define pTable_xsum (_comp->_parameters.pTable_xsum)
  #define pTable_ymin (_comp->_parameters.pTable_ymin)
  #define pTable_ymax (_comp->_parameters.pTable_ymax)
  #define pTable_ysum (_comp->_parameters.pTable_ysum)
  #define pTable_dxmin (_comp->_parameters.pTable_dxmin)
  #define pTable_dxmax (_comp->_parameters.pTable_dxmax)
  #define pTable_dymin (_comp->_parameters.pTable_dymin)
  #define pTable_dymax (_comp->_parameters.pTable_dymax)
  SIG_MESSAGE("[_HCS_init] component HCS=Source_gen() INITIALISE [Source_gen:0]");

  pTable_xsum=0;
  pTable_ysum=0;


  double source_area, k;

  if (target_index && !dist)
  {
    Coords ToTarget;
    double tx,ty,tz;
    ToTarget = coords_sub(POS_A_COMP_INDEX(INDEX_CURRENT_COMP+target_index),POS_A_CURRENT_COMP);
    ToTarget = rot_apply(ROT_A_CURRENT_COMP, ToTarget);
    coords_get(ToTarget, &tx, &ty, &tz);
    dist=sqrt(tx*tx+ty*ty+tz*tz);
  }

  /* spectrum characteristics */
  if (flux_file && strlen(flux_file) && strcmp(flux_file,"NULL") && strcmp(flux_file,"0")) {
    if (Table_Read(&pTable, flux_file, 1) <= 0) /* read 1st block data from file into pTable */
      exit(fprintf(stderr, "Source_gen: %s: can not read flux file %s\n", NAME_CURRENT_COMP, flux_file));
    /* put table in Log scale */
    int i;
    if (pTable.columns < 2) exit(fprintf(stderr, "Source_gen: %s: Flux file %s should contain at least 2 columns [wavelength in Angs,flux].\n", NAME_CURRENT_COMP, flux_file));
    double table_lmin=FLT_MAX, table_lmax=-FLT_MAX;
    double tmin=FLT_MAX, tmax=-FLT_MAX;
    for (i=0; i<pTable.rows; i++) {
      double val = Table_Index(pTable, i,1);
      val = Table_Index(pTable, i,0); /* lambda */
      if (val > tmax) tmax=val;
      if (val < tmin) tmin=val;
    }
    for (i=0; i<pTable.rows; i++) {
      double val = Table_Index(pTable, i,1);
      if (val < 0) fprintf(stderr, "Source_gen: %s: File %s has negative flux at row %i.\n", NAME_CURRENT_COMP, flux_file, i+1);
      if (flux_file_log)
        val = log(val > 0 ? val : tmin/10);
      Table_SetElement(&pTable, i, 1, val);
      val = Table_Index(pTable, i,0); /* lambda */
      if (val > table_lmax) table_lmax=val;
      if (val < table_lmin) table_lmin=val;
    }
    if (!Lmin && !Lmax && !lambda0 && !dlambda && !E0 && !dE && !Emin && !Emax) {
      Lmin = table_lmin; Lmax = table_lmax;
    }
    if (Lmax > table_lmax) {
      if (verbose) fprintf(stderr, "Source_gen: %s: Maximum wavelength %g is beyond table range upper limit %g. Constraining.\n", NAME_CURRENT_COMP, Lmax, table_lmax);
      Lmax = table_lmax;
    }
    if (Lmin < table_lmin) {
      if (verbose) fprintf(stderr, "Source_gen: %s: Minimum wavelength %g is below table range lower limit %g. Constraining.\n", NAME_CURRENT_COMP, Lmin, table_lmin);
      Lmin = table_lmin;
    }
  }  /* end flux file */
  else
  {
    k  = 1.38066e-23; /* k_B */
    if (T1 > 0)
    {
      lambda1  = 1.0e10*sqrt(HBAR*HBAR*4.0*PI*PI/2.0/MNEUTRON/k/T1);
    }
    else
      { lambda1 = lambda0; }

    if (T2 > 0)
    {
      lambda2  = 1.0e10*sqrt(HBAR*HBAR*4.0*PI*PI/2.0/MNEUTRON/k/T2);
    }
    else
      { lambda2 = lambda0; }

    if (T3 > 0)
    {
      lambda3  = 1.0e10*sqrt(HBAR*HBAR*4.0*PI*PI/2.0/MNEUTRON/k/T3);
    }
    else
      { lambda3 = lambda0; }
  }

  /* now read position-divergence files, if any */
  if (xdiv_file && strlen(xdiv_file) && strcmp(xdiv_file,"NULL") && strcmp(xdiv_file,"0")) {
    int i,j;
    if (Table_Read(&pTable_x, xdiv_file, 1) <= 0) /* read 1st block data from file into pTable */
      exit(fprintf(stderr, "Source_gen: %s: can not read XDiv file %s\n", NAME_CURRENT_COMP, xdiv_file));
    pTable_xsum = 0;
    for (i=0; i<pTable_x.rows; i++)
      for (j=0; j<pTable_x.columns; j++)
        pTable_xsum += Table_Index(pTable_x, i,j);

    /* now extract limits */
    char **parsing;
    char xylimits[1024];
    strcpy(xylimits, "");
    parsing = Table_ParseHeader(pTable_x.header,
      "xlimits", "xylimits",
      NULL);

    if (parsing) {
      if (parsing[0])  strcpy(xylimits, str_dup_numeric(parsing[0]));
      if (parsing[1] && !strlen(xylimits))
                       strcpy(xylimits, str_dup_numeric(parsing[1]));
      for (i=0; i<=1; i++) {
        if (parsing[i]) free(parsing[i]);
      }
      free(parsing);
    }
    i = sscanf(xylimits, "%lg %lg %lg %lg",
      &(pTable_xmin),  &(pTable_xmax),
      &(pTable_dxmin), &(pTable_dxmax));
    if (i != 2 && i != 4 && verbose)
      fprintf(stderr, "Source_gen: %s: invalid xylimits '%s' from file %s. extracted %i values\n",
        NAME_CURRENT_COMP, xylimits, xdiv_file, i);

    if (!xwidth) xwidth=pTable_xmax-pTable_xmin;
    if (!focus_xw && !dist) focus_xw=fabs(pTable_dxmax-pTable_dxmin);
  } /* end xdiv file */

  if (ydiv_file && strlen(ydiv_file) && strcmp(ydiv_file,"NULL") && strcmp(ydiv_file,"0")) {
    int i,j;
    if (Table_Read(&pTable_y, ydiv_file, 1) <= 0) /* read 1st block data from file into pTable */
      exit(fprintf(stderr, "Source_gen: %s: can not read YDiv file %s\n", NAME_CURRENT_COMP, ydiv_file));
    pTable_ysum = 0;
    for (i=0; i<pTable_y.rows; i++)
      for (j=0; j<pTable_y.columns; j++)
        pTable_ysum += Table_Index(pTable_y, i,j);

    /* now extract limits */
    char **parsing;
    char xylimits[1024];
    strcpy(xylimits, "");
    parsing = Table_ParseHeader(pTable_y.header,
      "xlimits", "xylimits",
      NULL);

    if (parsing) {
      if (parsing[0])  strcpy(xylimits,str_dup_numeric(parsing[0]));
      if (parsing[1] && !strlen(xylimits))
                       strcpy(xylimits,str_dup_numeric(parsing[1]));
      for (i=0; i<=1; i++) {
        if (parsing[i]) free(parsing[i]);
      }
      free(parsing);
    }
    i = sscanf(xylimits, "%lg %lg %lg %lg",
      &(pTable_ymin),  &(pTable_ymax),
      &(pTable_dymin), &(pTable_dymax));
    if (i != 2 && i != 4 && verbose)
      fprintf(stderr, "Source_gen: %s: invalid xylimits '%s' from file %s. extracted %i values\n",
        NAME_CURRENT_COMP, xylimits, ydiv_file, i);
    if (!yheight)  yheight=pTable_ymax-pTable_ymin;
    if (!focus_yh && !dist) focus_yh=fabs(pTable_dymax-pTable_dymin);
  } /* end ydiv file */

  /* tests for parameter values */
  if (Emin < 0 || Emax < 0 || Lmin < 0 || Lmax < 0 || E0 < 0 || dE < 0 || lambda0 < 0 || dlambda < 0)
  {
    fprintf(stderr,"Source_gen: %s: Error: Negative average\n"
                   "            or range values for wavelength or energy encountered\n",
                   NAME_CURRENT_COMP);
    exit(-1);
  }
  if ((Emin == 0 && Emax > 0) || (dE > 0 && dE >= E0))
  {
    fprintf(stderr,"Source_gen: %s: Error: minimal energy cannot be less or equal zero\n",
      NAME_CURRENT_COMP);
    exit(-1);
  }
  if ((Emax >= Emin) && (Emin > 0))
  { E0 = (Emax+Emin)/2;
    dE = (Emax-Emin)/2;
  }
  if ((E0 > dE) && (dE >= 0))
  {
    Lmin = sqrt(81.81/(E0+dE)); /* Angstroem */
    Lmax = sqrt(81.81/(E0-dE));
  }
  if (Lmax > 0)
  { lambda0 = (Lmax+Lmin)/2;
    dlambda = (Lmax-Lmin)/2;
  }
  if (lambda0 <= 0 || (lambda0 < dlambda) || (dlambda < 0))
  { fprintf(stderr,"Source_gen: %s: Error: Wavelength range %.3f +/- %.3f AA calculated \n",
      NAME_CURRENT_COMP, lambda0, dlambda);
    fprintf(stderr,"- whole wavelength range must be >= 0 \n");
    fprintf(stderr,"- range must be > 0; otherwise intensity gets zero, use other sources in this case \n\n");
    exit(-1);
  }

  radius = fabs(radius); xwidth=fabs(xwidth); yheight=fabs(yheight);  I1=fabs(I1);
  lambda0=fabs(lambda0); dlambda=fabs(dlambda);
  focus_xw = fabs(focus_xw); focus_yh=fabs(focus_yh); dist=fabs(dist);

  if ((!focus_ah && !focus_aw) && (!focus_xw && !focus_yh))
  {
    fprintf(stderr,"Source_gen: %s: Error: No focusing information.\n"
                   "            Specify focus_xw, focus_yh or focus_aw, focus_ah\n",
                   NAME_CURRENT_COMP);
    exit(-1);
  }
  Lmin = lambda0 - dlambda; /* Angstroem */
  Lmax = lambda0 + dlambda;

  /* compute initial weight factor p_in to get [n/s] */
  if ((I1 > 0  && T1 >= 0)
     || (flux_file && strlen(flux_file) && strcmp(flux_file,"NULL") && strcmp(flux_file,"0")))
  { /* the I1,2,3 are usually in [n/s/cm2/st/AA] */
    if (radius)
      source_area = radius*radius*PI*1e4; /* circular cm^2 */
    else
      source_area = yheight*xwidth*1e4; /* square cm^2 */
    p_in  = source_area; /* cm2 */
    p_in *= (Lmax-Lmin); /* AA. 1 bin=AA/n */
    if (flux_file && strlen(flux_file) && strcmp(flux_file,"NULL") && strcmp(flux_file,"0")
      && !flux_file_perAA)  p_in *= pTable.rows/(Lmax-Lmin);
  }
  else
    p_in = 1.0/4/PI; /* Small angle approx. */
  p_in /= mcget_ncount();
  if (!T1 && I1) p_in *= I1;

  if (radius == 0 && yheight == 0 && xwidth == 0)
  {
    fprintf(stderr,"Source_gen: %s: Error: Please specify source geometry (radius, yheight, xwidth)\n",
      NAME_CURRENT_COMP);
    exit(-1);
  }
  if (focus_xw*focus_yh == 0)
  {
    fprintf(stderr,"Source_gen: %s: Error: Please specify source target (focus_xw, focus_yh)\n",
      NAME_CURRENT_COMP);
    exit(-1);
  }
  MPI_MASTER(
  if (verbose)
  {
    printf("Source_gen: component %s ", NAME_CURRENT_COMP);
    if ((yheight == 0) || (xwidth == 0))
      printf("(disk, radius=%g)", radius);
    else
      printf("(square %g x %g)",xwidth,yheight);
    if (dist) printf("\n            focusing distance dist=%g area=%g x %g\n", dist, focus_xw, focus_yh);
    printf("            spectra ");
    printf("%.3f to %.3f AA (%.3f to %.3f meV)", Lmin, Lmax, 81.81/Lmax/Lmax, 81.81/Lmin/Lmin);
    printf("\n");
    if (flux_file && strlen(flux_file) && strcmp(flux_file,"NULL") && strcmp(flux_file,"0"))
    { printf("  File %s for flux distribution used. Flux is dPhi/dlambda in [n/s/AA]. \n", flux_file);
      Table_Info(pTable);
    }
    else if (T1>=0 && I1)
    { if (T1 != 0)
        printf("            T1=%.1f K (%.3f AA)", T1, lambda1);
      if (T2*I2 != 0)
        printf(", T2=%.1f K (%.3f AA)", T2, lambda2);
      if (T3*I3 != 0)
        printf(", T3=%.1f K (%.3f AA)", T3, lambda3);
      if (T1) printf("\n");
      printf("  Flux is dPhi/dlambda in [n/s/cm2].\n");
    }
    else
    { printf("  Flux is Phi in [n/s].\n");
    }
    if (xdiv_file && strlen(xdiv_file) && strcmp(xdiv_file,"NULL") && strcmp(xdiv_file,"0"))
      printf("  File %s x=[%g:%g] [m] xdiv=[%g:%g] [deg] used as horizontal phase space distribution.\n", xdiv_file, pTable_xmin, pTable_xmax, pTable_dxmin, pTable_dxmax);
    if (ydiv_file && strlen(ydiv_file) && strcmp(ydiv_file,"NULL") && strcmp(ydiv_file,"0"))
      printf("  File %s y=[%g:%g] [m] ydiv=[%g:%g] [deg] used as vertical phase space distribution.\n", ydiv_file, pTable_ymin, pTable_ymax, pTable_dymin, pTable_dymax);
  }
  else
    if (verbose == -1)
      printf("Source_gen: component %s inactivated", NAME_CURRENT_COMP);
  );
  #undef flux_file
  #undef xdiv_file
  #undef ydiv_file
  #undef radius
  #undef dist
  #undef focus_xw
  #undef focus_yh
  #undef focus_aw
  #undef focus_ah
  #undef E0
  #undef dE
  #undef lambda0
  #undef dlambda
  #undef I1
  #undef yheight
  #undef xwidth
  #undef verbose
  #undef T1
  #undef flux_file_perAA
  #undef flux_file_log
  #undef Lmin
  #undef Lmax
  #undef Emin
  #undef Emax
  #undef T2
  #undef I2
  #undef T3
  #undef I3
  #undef zdepth
  #undef target_index
  #undef p_in
  #undef lambda1
  #undef lambda2
  #undef lambda3
  #undef pTable
  #undef pTable_x
  #undef pTable_y
  #undef pTable_xmin
  #undef pTable_xmax
  #undef pTable_xsum
  #undef pTable_ymin
  #undef pTable_ymax
  #undef pTable_ysum
  #undef pTable_dxmin
  #undef pTable_dxmax
  #undef pTable_dymin
  #undef pTable_dymax
  return(_comp);
} /* class_Source_gen_init */

_class_PowderN *class_PowderN_init(_class_PowderN *_comp
) {
  #define reflections (_comp->_parameters.reflections)
  #define geometry (_comp->_parameters.geometry)
  #define format (_comp->_parameters.format)
  #define radius (_comp->_parameters.radius)
  #define yheight (_comp->_parameters.yheight)
  #define xwidth (_comp->_parameters.xwidth)
  #define zdepth (_comp->_parameters.zdepth)
  #define thickness (_comp->_parameters.thickness)
  #define pack (_comp->_parameters.pack)
  #define Vc (_comp->_parameters.Vc)
  #define sigma_abs (_comp->_parameters.sigma_abs)
  #define sigma_inc (_comp->_parameters.sigma_inc)
  #define delta_d_d (_comp->_parameters.delta_d_d)
  #define p_inc (_comp->_parameters.p_inc)
  #define p_transmit (_comp->_parameters.p_transmit)
  #define DW (_comp->_parameters.DW)
  #define nb_atoms (_comp->_parameters.nb_atoms)
  #define d_omega (_comp->_parameters.d_omega)
  #define d_phi (_comp->_parameters.d_phi)
  #define tth_sign (_comp->_parameters.tth_sign)
  #define p_interact (_comp->_parameters.p_interact)
  #define concentric (_comp->_parameters.concentric)
  #define density (_comp->_parameters.density)
  #define weight (_comp->_parameters.weight)
  #define barns (_comp->_parameters.barns)
  #define Strain (_comp->_parameters.Strain)
  #define focus_flip (_comp->_parameters.focus_flip)
  #define target_index (_comp->_parameters.target_index)
  #define order (_comp->_parameters.order)
  #define line_info (_comp->_parameters.line_info)
  #define columns (_comp->_parameters.columns)
  #define offdata (_comp->_parameters.offdata)
  #define tgt_x (_comp->_parameters.tgt_x)
  #define tgt_y (_comp->_parameters.tgt_y)
  #define tgt_z (_comp->_parameters.tgt_z)
  SIG_MESSAGE("[_HCS_Al_init] component HCS_Al=PowderN() INITIALISE [PowderN:0]");

  /* We ought to clean up the columns variable as format is now a proper vector/array */
  columns = format;

  int i = 0;
  struct line_data* L;
  line_info.Dd = delta_d_d;
  line_info.DWfactor = DW;
  line_info.V_0 = Vc;
  line_info.rho = density;
  line_info.at_weight = weight;
  line_info.at_nb = nb_atoms;
  line_info.sigma_a = sigma_abs;
  line_info.sigma_i = sigma_inc;
  line_info.flag_barns = barns;
  line_info.shape = 0;
  line_info.flag_warning = 0;
  line_info.Epsilon = Strain;
  line_info.radius_i = line_info.xwidth_i = line_info.yheight_i = line_info.zdepth_i = 0;
  line_info.v = 0;
  line_info.Nq = 0;
  line_info.v_min = FLT_MAX;
  line_info.v_max = 0;
  line_info.neutron_passed = 0;
  line_info.nb_reuses = line_info.nb_refl = line_info.nb_refl_count = 0;
  line_info.xs_compute = line_info.xs_reuse = line_info.xs_calls = 0;
  for (i = 0; i < 9; i++) {
    line_info.column_order[i] = (int)columns[i];
  }
  strncpy (line_info.compname, NAME_CURRENT_COMP, 256);

  line_info.shape = -1; /* -1:no shape, 0:cyl, 1:box, 2:sphere, 3:any-shape  */
  if (geometry && strlen (geometry) && strcmp (geometry, "NULL") && strcmp (geometry, "0")) {
    #ifndef USE_OFF
    fprintf (stderr, "Error: You are attempting to use an OFF geometry without -DUSE_OFF. You will need to recompile with that define set!\n");
    exit (-1);
    #else
    if (off_init (geometry, xwidth, yheight, zdepth, 0, &offdata)) {
      line_info.shape = 3;
      thickness = 0;
      concentric = 0;
    }
    #endif
  } else if (xwidth && yheight && zdepth)
    line_info.shape = 1; /* box */
  else if (radius > 0 && yheight)
    line_info.shape = 0; /* cylinder */
  else if (radius > 0 && !yheight)
    line_info.shape = 2; /* sphere */

  if (line_info.shape < 0)
    exit (fprintf (stderr,
                   "PowderN: %s: sample has invalid dimensions.\n"
                   "ERROR    Please check parameter values (xwidth, yheight, zdepth, radius).\n",
                   NAME_CURRENT_COMP));
  if (thickness) {
    if (radius && (radius < fabs (thickness))) {
      MPI_MASTER (printf ("PowderN: %s: hollow sample thickness is larger than its volume (sphere/cylinder).\n"
                          "WARNING  Please check parameter values. Using bulk sample (thickness=0).\n",
                          NAME_CURRENT_COMP););
      thickness = 0;
    } else if (!radius && (xwidth < 2 * fabs (thickness) || yheight < 2 * fabs (thickness) || zdepth < 2 * fabs (thickness))) {
      MPI_MASTER (printf ("PowderN: %s: hollow sample thickness is larger than its volume (box).\n"
                          "WARNING  Please check parameter values.\n",
                          NAME_CURRENT_COMP););
    }
  }

  if (concentric && thickness == 0) {
    MPI_MASTER (printf ("PowderN: %s:Can not use concentric mode\n"
                        "WARNING     on non hollow shape. Ignoring.\n",
                        NAME_CURRENT_COMP););
    concentric = 0;
  }

  if (thickness > 0) {
    if (radius > thickness) {
      line_info.radius_i = radius - thickness;
    } else {
      if (xwidth > 2 * thickness)
        line_info.xwidth_i = xwidth - 2 * thickness;
      if (yheight > 2 * thickness)
        line_info.yheight_i = yheight - 2 * thickness;
      if (zdepth > 2 * thickness)
        line_info.zdepth_i = zdepth - 2 * thickness;
    }
  } else if (thickness < 0) {
    thickness = fabs (thickness);
    if (radius) {
      line_info.radius_i = radius;
      radius = line_info.radius_i + thickness;
    } else {
      line_info.xwidth_i = xwidth;
      line_info.yheight_i = yheight;
      line_info.zdepth_i = zdepth;
      xwidth = xwidth + 2 * thickness;
      yheight = yheight + 2 * thickness;
      zdepth = zdepth + 2 * thickness;
    }
  }

  if (!line_info.yheight_i) {
    line_info.yheight_i = yheight;
  }

  if (!p_interact) {
    fprintf (stderr, "WARNING(%s): p_interact=0, adjusting to 0.01, to avoid algorithm instability\n", NAME_CURRENT_COMP);
    p_interact = 1e-2;
  }
  if (!p_inc) {
    fprintf (stderr, "WARNING(%s): p_inc=0, adjusting to 0.01, to avoid algorithm instability\n", NAME_CURRENT_COMP);
    p_inc = 1e-2;
  }
  if (!p_transmit) {
    fprintf (stderr, "WARNING(%s): p_transmit=0, adjusting to 0.01, to avoid algorithm instability\n", NAME_CURRENT_COMP);
    p_transmit = 1e-2;
  }
  double p_sum = p_interact + p_inc + p_transmit;
  p_interact = p_interact / p_sum;
  p_inc = p_inc / p_sum;
  p_transmit = p_transmit / p_sum;

  if (concentric) {
    MPI_MASTER (printf ("PowderN: %s: Concentric mode - remember to include the 'opposite' copy of this component !\n"
                        "WARNING  The equivalent, 'opposite' comp should have concentric=0\n",
                        NAME_CURRENT_COMP););
    if (p_transmit < 0.1) {
      MPI_MASTER (printf ("PowderN: %s: Concentric mode and p_transmit<0.1 !\n"
                          "WARNING  Consider increasing p_transmit as few particles will reach the inner hollow.\n",
                          NAME_CURRENT_COMP););
    }
  }

  if (reflections && strlen (reflections) && strcmp (reflections, "NULL") && strcmp (reflections, "0")) {
    i = read_line_data (reflections, &line_info);
    if (i == 0)
      exit (fprintf (stderr,
                     "PowderN: %s: reflection file %s is not valid.\n"
                     "ERROR    Please check file format (laz or lau).\n",
                     NAME_CURRENT_COMP, reflections));
  }

  /* compute the scattering unit density from material weight and density */
  /* the weight of the scattering element is the chemical formula molecular weight
   * times the nb of chemical formulae in the scattering element (nb_atoms) */
  if (!line_info.V_0 && line_info.at_nb > 0 && line_info.at_weight > 0 && line_info.rho > 0) {
    /* molar volume [cm^3/mol] = weight [g/mol] / density [g/cm^3] */
    /* atom density per Angs^3 = [mol/cm^3] * N_Avogadro *(1e-8)^3 */
    line_info.V_0 = line_info.at_nb / (line_info.rho / line_info.at_weight / 1e24 * 6.02214199e23);
  }

  /* the scattering unit cross sections are the chemical formula onces
   * times the nb of chemical formulae in the scattering element */
  if (line_info.at_nb > 0) {
    line_info.sigma_a *= line_info.at_nb;
    line_info.sigma_i *= line_info.at_nb;
  }

  if (line_info.sigma_a < 0)
    line_info.sigma_a = 0;
  if (line_info.sigma_i < 0)
    line_info.sigma_i = 0;

  if (line_info.V_0 <= 0)
    MPI_MASTER (printf ("PowderN: %s: density/unit cell volume is NULL (Vc). Unactivating component.\n", NAME_CURRENT_COMP););

  if (line_info.V_0 > 0 && p_inc && !line_info.sigma_i) {
    MPI_MASTER (printf ("PowderN: %s: WARNING: You have requested statistics for incoherent scattering but not defined sigma_inc!\n", NAME_CURRENT_COMP););
  }

  if (line_info.flag_barns) { /* Factor 100 to convert from barns to fm^2 */
    line_info.XsectionFactor = 100;
  } else {
    line_info.XsectionFactor = 1;
  }

  if (line_info.V_0 > 0 && i) {
    L = line_info.list;

    line_info.q_v = malloc (line_info.count * sizeof (double));
    line_info.w_v = malloc (line_info.count * sizeof (double));
    line_info.my_s_v2 = malloc (line_info.count * sizeof (double));
    if (!line_info.q_v || !line_info.w_v || !line_info.my_s_v2)
      exit (fprintf (stderr, "PowderN: %s: ERROR allocating memory (init)\n", NAME_CURRENT_COMP));
    for (i = 0; i < line_info.count; i++) {
      line_info.my_s_v2[i] = 4 * PI * PI * PI * pack * (L[i].DWfactor ? L[i].DWfactor : 1) / (line_info.V_0 * line_info.V_0 * V2K * V2K)
                             * (L[i].j * L[i].F2 / L[i].q) * line_info.XsectionFactor;
      /* Is not yet divided by v^2 */
      /* Squires [3.103] */
      line_info.q_v[i] = L[i].q * K2V;
      line_info.w_v[i] = L[i].w;
    }
  }
  if (line_info.V_0 > 0) {
    /* Is not yet divided by v */
    line_info.my_a_v = pack * line_info.sigma_a / line_info.V_0 * 2200 * 100; // Factor 100 to convert from barns to fm^2
    line_info.my_inc = pack * line_info.sigma_i / line_info.V_0 * 100;        // Factor 100 to convert from barns to fm^2
    MPI_MASTER (printf ("PowderN: %s: Vc=%g [Angs] sigma_abs=%g [barn] sigma_inc=%g [barn] reflections=%s\n", NAME_CURRENT_COMP, line_info.V_0, line_info.sigma_a,
                        line_info.sigma_i, reflections && strlen (reflections) ? reflections : "NULL"););
  }

  /* update JS, 1/7/2017
    Get target coordinates relative to the local reference frame.
  */
  if (target_index) {
    Coords ToTarget;
    ToTarget = coords_sub (POS_A_COMP_INDEX (INDEX_CURRENT_COMP + target_index), POS_A_CURRENT_COMP);
    ToTarget = rot_apply (ROT_A_CURRENT_COMP, ToTarget);
    coords_get (ToTarget, &tgt_x, &tgt_y, &tgt_z);
    NORM (tgt_x, tgt_y, tgt_z);
    printf ("PowderN: Target direction = (%g %g %g)\n", tgt_x, tgt_y, tgt_z);
  } else {
    tgt_x = 0.0;
    tgt_y = 0.0;
    tgt_z = 1.0;
  }
  #undef reflections
  #undef geometry
  #undef format
  #undef radius
  #undef yheight
  #undef xwidth
  #undef zdepth
  #undef thickness
  #undef pack
  #undef Vc
  #undef sigma_abs
  #undef sigma_inc
  #undef delta_d_d
  #undef p_inc
  #undef p_transmit
  #undef DW
  #undef nb_atoms
  #undef d_omega
  #undef d_phi
  #undef tth_sign
  #undef p_interact
  #undef concentric
  #undef density
  #undef weight
  #undef barns
  #undef Strain
  #undef focus_flip
  #undef target_index
  #undef order
  #undef line_info
  #undef columns
  #undef offdata
  #undef tgt_x
  #undef tgt_y
  #undef tgt_z
  return(_comp);
} /* class_PowderN_init */

_class_Monitor_nD *class_Monitor_nD_init(_class_Monitor_nD *_comp
) {
  #define user1 (_comp->_parameters.user1)
  #define user2 (_comp->_parameters.user2)
  #define user3 (_comp->_parameters.user3)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define zdepth (_comp->_parameters.zdepth)
  #define xmin (_comp->_parameters.xmin)
  #define xmax (_comp->_parameters.xmax)
  #define ymin (_comp->_parameters.ymin)
  #define ymax (_comp->_parameters.ymax)
  #define zmin (_comp->_parameters.zmin)
  #define zmax (_comp->_parameters.zmax)
  #define bins (_comp->_parameters.bins)
  #define min (_comp->_parameters.min)
  #define max (_comp->_parameters.max)
  #define restore_neutron (_comp->_parameters.restore_neutron)
  #define radius (_comp->_parameters.radius)
  #define options (_comp->_parameters.options)
  #define filename (_comp->_parameters.filename)
  #define geometry (_comp->_parameters.geometry)
  #define nowritefile (_comp->_parameters.nowritefile)
  #define nexus_bins (_comp->_parameters.nexus_bins)
  #define username1 (_comp->_parameters.username1)
  #define username2 (_comp->_parameters.username2)
  #define username3 (_comp->_parameters.username3)
  #define DEFS (_comp->_parameters.DEFS)
  #define Vars (_comp->_parameters.Vars)
  #define detector (_comp->_parameters.detector)
  #define offdata (_comp->_parameters.offdata)
  SIG_MESSAGE("[_H5_init] component H5=Monitor_nD() INITIALISE [Monitor_nD:0]");

  char tmp[CHAR_BUF_LENGTH];
  strcpy (Vars.compcurname, NAME_CURRENT_COMP);
  Vars.compcurindex = INDEX_CURRENT_COMP;
  if (options != NULL)
    strncpy (Vars.option, options, CHAR_BUF_LENGTH);
  else {
    strcpy (Vars.option, "x y");
    printf ("Monitor_nD: %s has no option specified. Setting to PSD ('x y') monitor.\n", NAME_CURRENT_COMP);
  }
  Vars.compcurpos = POS_A_CURRENT_COMP;

  if (strstr (Vars.option, "source"))
    strcat (Vars.option, " list, x y z vx vy vz t sx sy sz ");

  if (bins) {
    sprintf (tmp, " all bins=%ld ", (long)bins);
    strcat (Vars.option, tmp);
  }
  if (min > -FLT_MAX && max < FLT_MAX) {
    sprintf (tmp, " all limits=[%g %g]", min, max);
    strcat (Vars.option, tmp);
  } else if (min > -FLT_MAX) {
    sprintf (tmp, " all min=%g", min);
    strcat (Vars.option, tmp);
  } else if (max < FLT_MAX) {
    sprintf (tmp, " all max=%g", max);
    strcat (Vars.option, tmp);
  }

  /* transfer, "zero", and check username- and user variable strings to Vars struct*/
  strncpy (Vars.UserName1, username1&& strlen (username1) && strcmp (username1, "0") && strcmp (username1, "NULL") ? username1 : "", 128);
  strncpy (Vars.UserName2, username2&& strlen (username2) && strcmp (username2, "0") && strcmp (username2, "NULL") ? username2 : "", 128);
  strncpy (Vars.UserName3, username3&& strlen (username3) && strcmp (username3, "0") && strcmp (username3, "NULL") ? username3 : "", 128);
  if (user1 && strlen (user1) && strcmp (user1, "0") && strcmp (user1, "NULL")) {
    strncpy (Vars.UserVariable1, user1, 128);
    int fail;
    _class_particle testparticle;
    particle_getvar (&testparticle, Vars.UserVariable1, &fail);
    if (fail) {
      fprintf (stderr, "Warning (%s): user1=%s is unknown. The signal will not be resolved - this is likely not what you intended.\n", NAME_CURRENT_COMP, user1);
    }
  }
  if (user2 && strlen (user2) && strcmp (user2, "0") && strcmp (user2, "NULL")) {
    strncpy (Vars.UserVariable2, user2, 128);
    int fail;
    _class_particle testparticle;
    particle_getvar (&testparticle, Vars.UserVariable2, &fail);
    if (fail) {
      fprintf (stderr, "Warning (%s): user2=%s is unknown. The signal will not be resolved - this is likely not what you intended.\n", NAME_CURRENT_COMP, user2);
    }
  }
  if (user3 && strlen (user3) && strcmp (user3, "0") && strcmp (user3, "NULL")) {
    strncpy (Vars.UserVariable3, user3, 128);
    int fail;
    _class_particle testparticle;
    particle_getvar (&testparticle, Vars.UserVariable3, &fail);
    if (fail) {
      fprintf (stderr, "Warning (%s): user3=%s is unknown. The signal will not be resolved - this is likely not what you intended.\n", NAME_CURRENT_COMP, user3);
    }
  }

  /*sanitize parameters set for curved shapes*/
  if (strstr (Vars.option, "cylinder") || strstr (Vars.option, "banana") || strstr (Vars.option, "sphere")) {
    /*this _is_ an explicit curved shape. Should have a radius. Inherit from xwidth or zdepth (diameters), x has precedence.*/
    if (!radius) {
      if (xwidth) {
        radius = xwidth / 2.0;
      } else {
        radius = zdepth / 2.0;
      }
    } else {
      xwidth = 2 * radius;
    }
    if (!yheight) {
      /*if not set - use the diameter as height for the curved object. This will likely only happen for spheres*/
      yheight = 2 * radius;
    }
  } else if (radius) {
    /*radius is set - this must be a curved shape. Infer shape from yheight, and set remaining values
     (xwidth etc. They are used inside monitor_nd-lib.*/
    xwidth = zdepth = 2 * radius;
    if (yheight) {
      /*a height is given (and no shape explitly set - assume cylinder*/
      strcat (Vars.option, " banana");
    } else {
      strcat (Vars.option, " sphere");
      yheight = 2 * radius;
    }
  }

  int offflag = 0;
  if (geometry && strlen (geometry) && strcmp (geometry, "0") && strcmp (geometry, "NULL")) {
    #ifndef USE_OFF
    fprintf (stderr, "Error: You are attempting to use an OFF geometry without -DUSE_OFF. You will need to recompile with that define set!\n");
    exit (-1);
    #else
    if (!off_init (geometry, xwidth, yheight, zdepth, 1, &offdata)) {
      printf ("Monitor_nD: %s could not initiate the OFF geometry %s. \n"
              "            Defaulting to normal Monitor dimensions.\n",
              NAME_CURRENT_COMP, geometry);
      strcpy (geometry, "");
    } else {
      offflag = 1;
    }
    #endif
  }

  if (!radius && !xwidth && !yheight && !zdepth && !xmin && !xmax && !ymin && !ymax && !strstr (Vars.option, "previous") && (!geometry || !strlen (geometry)))
    exit (printf ("Monitor_nD: %s has no dimension specified. Aborting (radius, xwidth, yheight, zdepth, previous, geometry).\n", NAME_CURRENT_COMP));

  Monitor_nD_Init (&DEFS, &Vars, xwidth, yheight, zdepth, xmin, xmax, ymin, ymax, zmin, zmax, offflag, nexus_bins);

  if (Vars.Flag_OFF) {
    offdata.mantidflag = Vars.Flag_mantid;
    offdata.mantidoffset = Vars.Coord_Min[Vars.Coord_Number - 1];
  }

  if (filename && strlen (filename) && strcmp (filename, "NULL") && strcmp (filename, "0"))
    strncpy (Vars.Mon_File, filename, 128);

  /* check if user given filename with ext will be used more than once */
  if (((Vars.Flag_Multiple && Vars.Coord_Number > 1) || Vars.Flag_List) && strchr (Vars.Mon_File, '.')) {
    char* XY;
    XY = strrchr (Vars.Mon_File, '.');
    *XY = '_';
  }

  if (restore_neutron)
    Vars.Flag_parallel = 1;
  detector.m = 0;

  #ifdef USE_MPI
  MPI_MASTER (if (strstr (Vars.option, "auto") && mpi_node_count > 1)
                  printf ("Monitor_nD: %s is using automatic limits option 'auto' together with MPI.\n"
                          "WARNING     this may create incorrect distributions (but integrated flux will be right).\n",
                          NAME_CURRENT_COMP););
  #else
  #ifdef OPENACC
  if (strstr (Vars.option, "auto"))
    printf ("Monitor_nD: %s is requesting automatic limits option 'auto' together with OpenACC.\n"
            "WARNING     this feature is NOT supported using OpenACC and has been disabled!\n",
            NAME_CURRENT_COMP);
  #endif
  #endif
  #undef user1
  #undef user2
  #undef user3
  #undef xwidth
  #undef yheight
  #undef zdepth
  #undef xmin
  #undef xmax
  #undef ymin
  #undef ymax
  #undef zmin
  #undef zmax
  #undef bins
  #undef min
  #undef max
  #undef restore_neutron
  #undef radius
  #undef options
  #undef filename
  #undef geometry
  #undef nowritefile
  #undef nexus_bins
  #undef username1
  #undef username2
  #undef username3
  #undef DEFS
  #undef Vars
  #undef detector
  #undef offdata
  return(_comp);
} /* class_Monitor_nD_init */

_class_Guide_gravity *class_Guide_gravity_init(_class_Guide_gravity *_comp
) {
  #define w1 (_comp->_parameters.w1)
  #define h1 (_comp->_parameters.h1)
  #define w2 (_comp->_parameters.w2)
  #define h2 (_comp->_parameters.h2)
  #define l (_comp->_parameters.l)
  #define R0 (_comp->_parameters.R0)
  #define Qc (_comp->_parameters.Qc)
  #define alpha (_comp->_parameters.alpha)
  #define m (_comp->_parameters.m)
  #define W (_comp->_parameters.W)
  #define nslit (_comp->_parameters.nslit)
  #define d (_comp->_parameters.d)
  #define mleft (_comp->_parameters.mleft)
  #define mright (_comp->_parameters.mright)
  #define mtop (_comp->_parameters.mtop)
  #define mbottom (_comp->_parameters.mbottom)
  #define nhslit (_comp->_parameters.nhslit)
  #define G (_comp->_parameters.G)
  #define aleft (_comp->_parameters.aleft)
  #define aright (_comp->_parameters.aright)
  #define atop (_comp->_parameters.atop)
  #define abottom (_comp->_parameters.abottom)
  #define wavy (_comp->_parameters.wavy)
  #define wavy_z (_comp->_parameters.wavy_z)
  #define wavy_tb (_comp->_parameters.wavy_tb)
  #define wavy_lr (_comp->_parameters.wavy_lr)
  #define chamfers (_comp->_parameters.chamfers)
  #define chamfers_z (_comp->_parameters.chamfers_z)
  #define chamfers_lr (_comp->_parameters.chamfers_lr)
  #define chamfers_tb (_comp->_parameters.chamfers_tb)
  #define nelements (_comp->_parameters.nelements)
  #define nu (_comp->_parameters.nu)
  #define phase (_comp->_parameters.phase)
  #define reflect (_comp->_parameters.reflect)
  #define GVarsGlobal (_comp->_parameters.GVarsGlobal)
  #define pTable (_comp->_parameters.pTable)
  #define table_present (_comp->_parameters.table_present)
  SIG_MESSAGE("[_H5_rect_init] component H5_rect=Guide_gravity() INITIALISE [Guide_gravity:0]");

  double Gx = 0, Gy = -GRAVITY, Gz = 0;
  Coords mcLocG;
  int i;

  if (reflect && strlen (reflect) && strcmp (reflect, "NULL") && strcmp (reflect, "0")) {
    if (Table_Read (&pTable, reflect, 1) <= 0) /* read 1st block data from file into pTable */
      exit (fprintf (stderr, "Guide_gravity: %s: can not read file %s\n", NAME_CURRENT_COMP, reflect));
    table_present = 1;
  } else {
    table_present = 0;
    if (W < 0 || R0 < 0 || Qc < 0) {
      fprintf (stderr, "Guide_gravity: %s: W R0 Qc must be >0.\n", NAME_CURRENT_COMP);
      exit (-1);
    }
  }

  if (nslit <= 0 || nhslit <= 0) {
    fprintf (stderr, "Guide_gravity: %s: nslit nhslit must be >0.\n", NAME_CURRENT_COMP);
    exit (-1);
  }

  if (!w1 || !h1) {
    fprintf (stderr, "Guide_gravity: %s: input window is closed (w1=h1=0).\n", NAME_CURRENT_COMP);
    exit (-1);
  }

  if (d * (nslit - 1) > w1)
    exit (fprintf (stderr, "Guide_gravity: %s: absorbing walls fill input window. No space left for transmission (d*(nslit-1) > w1).\n", NAME_CURRENT_COMP));

  if (!w2)
    w2 = w1;
  if (!h2)
    h2 = h1;

  if (mcgravitation)
    G = -GRAVITY;
  mcLocG = rot_apply (ROT_A_CURRENT_COMP, coords_set (0, G, 0));
  coords_get (mcLocG, &Gx, &Gy, &Gz);

  strcpy (GVarsGlobal.compcurname, NAME_CURRENT_COMP);

  if (l > 0 && nelements > 0) {

    Gravity_guide_Init (&GVarsGlobal, w1, h1, w2, h2, l, R0, Qc, alpha, m, W, nslit, d, Gx, Gy, Gz, mleft, mright, mtop, mbottom, nhslit, wavy_lr, wavy_tb,
                        wavy_z, wavy, chamfers_z, chamfers_lr, chamfers_tb, chamfers, nu, phase, aleft, aright, atop, abottom);
    if (!G)
      for (i = 0; i < 5; GVarsGlobal.A[i++] = 0)
        ;
    if (GVarsGlobal.fc_freq != 0 || GVarsGlobal.fc_phase != 0) {
      if (w1 != w2 || h1 != h2)
        exit (fprintf (stderr, "Guide_gravity: %s: rotating slit pack must be straight (w1=w2 and h1=h2).\n", NAME_CURRENT_COMP));
      printf ("Guide_gravity: %s: Fermi Chopper mode: frequency=%g [Hz] phase=%g [deg]\n", NAME_CURRENT_COMP, GVarsGlobal.fc_freq, GVarsGlobal.fc_phase);
    }
  } else
    printf ("Guide_gravity: %s: unactivated (l=0 or nelements=0)\n", NAME_CURRENT_COMP);
  #undef w1
  #undef h1
  #undef w2
  #undef h2
  #undef l
  #undef R0
  #undef Qc
  #undef alpha
  #undef m
  #undef W
  #undef nslit
  #undef d
  #undef mleft
  #undef mright
  #undef mtop
  #undef mbottom
  #undef nhslit
  #undef G
  #undef aleft
  #undef aright
  #undef atop
  #undef abottom
  #undef wavy
  #undef wavy_z
  #undef wavy_tb
  #undef wavy_lr
  #undef chamfers
  #undef chamfers_z
  #undef chamfers_lr
  #undef chamfers_tb
  #undef nelements
  #undef nu
  #undef phase
  #undef reflect
  #undef GVarsGlobal
  #undef pTable
  #undef table_present
  return(_comp);
} /* class_Guide_gravity_init */

_class_Guide_tapering *class_Guide_tapering_init(_class_Guide_tapering *_comp
) {
  #define option (_comp->_parameters.option)
  #define w1 (_comp->_parameters.w1)
  #define h1 (_comp->_parameters.h1)
  #define l (_comp->_parameters.l)
  #define linw (_comp->_parameters.linw)
  #define loutw (_comp->_parameters.loutw)
  #define linh (_comp->_parameters.linh)
  #define louth (_comp->_parameters.louth)
  #define R0 (_comp->_parameters.R0)
  #define Qcx (_comp->_parameters.Qcx)
  #define Qcy (_comp->_parameters.Qcy)
  #define alphax (_comp->_parameters.alphax)
  #define alphay (_comp->_parameters.alphay)
  #define W (_comp->_parameters.W)
  #define mx (_comp->_parameters.mx)
  #define my (_comp->_parameters.my)
  #define segno (_comp->_parameters.segno)
  #define curvature (_comp->_parameters.curvature)
  #define curvature_v (_comp->_parameters.curvature_v)
  #define w1c (_comp->_parameters.w1c)
  #define w2c (_comp->_parameters.w2c)
  #define ww (_comp->_parameters.ww)
  #define hh (_comp->_parameters.hh)
  #define whalf (_comp->_parameters.whalf)
  #define hhalf (_comp->_parameters.hhalf)
  #define lwhalf (_comp->_parameters.lwhalf)
  #define lhhalf (_comp->_parameters.lhhalf)
  #define h1_in (_comp->_parameters.h1_in)
  #define h2_out (_comp->_parameters.h2_out)
  #define w1_in (_comp->_parameters.w1_in)
  #define w2_out (_comp->_parameters.w2_out)
  #define l_seg (_comp->_parameters.l_seg)
  #define h12 (_comp->_parameters.h12)
  #define h2 (_comp->_parameters.h2)
  #define w12 (_comp->_parameters.w12)
  #define w2 (_comp->_parameters.w2)
  #define a_ell_q (_comp->_parameters.a_ell_q)
  #define b_ell_q (_comp->_parameters.b_ell_q)
  #define lbw (_comp->_parameters.lbw)
  #define lbh (_comp->_parameters.lbh)
  #define mxi (_comp->_parameters.mxi)
  #define u1 (_comp->_parameters.u1)
  #define u2 (_comp->_parameters.u2)
  #define div1 (_comp->_parameters.div1)
  #define p2_para (_comp->_parameters.p2_para)
  #define test (_comp->_parameters.test)
  #define Div1 (_comp->_parameters.Div1)
  #define seg (_comp->_parameters.seg)
  #define fu (_comp->_parameters.fu)
  #define pos (_comp->_parameters.pos)
  #define file_name (_comp->_parameters.file_name)
  #define ep (_comp->_parameters.ep)
  #define num (_comp->_parameters.num)
  #define rotation_h (_comp->_parameters.rotation_h)
  #define rotation_v (_comp->_parameters.rotation_v)
  SIG_MESSAGE("[_H53_Nose_init] component H53_Nose=Guide_tapering() INITIALISE [Guide_tapering:0]");

  int i, ii;

  rotation_h = 0;
  rotation_v = 0;

  // dynamic memory allocation is good
  w1c = (double*)malloc (sizeof (double) * segno);
  w2c = (double*)malloc (sizeof (double) * segno);
  ww = (double*)malloc (sizeof (double) * segno);
  hh = (double*)malloc (sizeof (double) * segno);
  whalf = (double*)malloc (sizeof (double) * segno);
  hhalf = (double*)malloc (sizeof (double) * segno);
  lwhalf = (double*)malloc (sizeof (double) * segno);
  lhhalf = (double*)malloc (sizeof (double) * segno);
  h1_in = (double*)malloc (sizeof (double) * (segno + 1));
  h2_out = (double*)malloc (sizeof (double) * (segno + 1));
  w1_in = (double*)malloc (sizeof (double) * (segno + 1));
  w2_out = (double*)malloc (sizeof (double) * (segno + 1));

  struct para {
    char st[128];
  } segment[800];

  if (W <= 0) {
    fprintf (stderr, "Component: %s (Guide_tapering) W must \n", NAME_CURRENT_COMP);
    fprintf (stderr, "           be positive\n");
    exit (-1);
  }
  if (l <= 0) {
    fprintf (stderr, "Component: %s (Guide_tapering) real guide length \n", NAME_CURRENT_COMP);
    fprintf (stderr, "           is <= ZERO ! \n");
    exit (-1);
  }
  if (mcgravitation)
    fprintf (stderr,
             "WARNING: Guide_tapering: %s: "
             "This component produces wrong results with gravitation !\n"
             "Use Guide_gravity.\n",
             NAME_CURRENT_COMP);
  seg = segno;
  l_seg = l / (seg);
  h12 = h1 / 2.0;
  if (option != NULL) {
    fu = (char*)malloc (sizeof (char) * (strlen (option) + 1));
    strcpy (fu, option);
  } else {
    exit (-1);
  }
  /* handle guide geometry ================================================== */
  if (!strcmp (fu, "elliptical")) {
    /* calculate parameter b of elliptical equestion - vertical mirrors */
    /* (l+linh+louth) -> distance between focal points */
    /*  printf("A1 \n"); */
    lbh = l + linh + louth;
    if (linh == 0 && louth == 0) {
      /* plane mirrors (vertical) */
      b_ell_q = 0;
      h2 = h1;
    } else {
      /* elliptical mirrors */
      u1 = sqrt ((linh * linh) + (h12 * h12));
      u2 = sqrt ((h12 * h12) + ((l + louth) * (l + louth)));
      a_ell_q = ((u1 + u2) / 2.0) * ((u1 + u2) / 2.0);
      b_ell_q = a_ell_q - ((lbh / 2.0) * (lbh / 2.0));
      /* calculate heigth of guide exit (h2) */
      div1 = ((lbh / 2.0 - louth) * (lbh / 2.0 - louth)) / a_ell_q;
      h2 = sqrt (b_ell_q * (1.0 - div1));
      h2 = h2 * 2.0;
    }
  } else if (!strcmp (fu, "parabolical")) {
    if ((linh > 0) && (louth > 0)) {
      fprintf (stderr, "Component: %s (Guide_tapering) Two focal\n", NAME_CURRENT_COMP);
      fprintf (stderr, "            points lout and linh are not allowed! \n");
      free (fu);
      exit (-1);
    }
    if (louth == 0 && linh == 0) {
      /* plane mirrors (vertical) */
      h2 = h1;
    } else {
      /* parabolical mirrors */
      if (linh == 0) {
        Div1 = ((2.0 * louth + 2.0 * l) * (2.0 * louth + 2.0 * l)) / 4.0;
        p2_para = ((sqrt (Div1 + (h12 * h12))) - (louth + l)) * 2.0;
        /* calculate heigth of guide exit (h2) */
        h2 = sqrt (p2_para * (louth + p2_para / 4.0));
        h2 = h2 * 2.0;
      } else {
        /* anti-trompete */
        Div1 = ((2.0 * linh) * (2.0 * linh)) / 4.0;
        p2_para = ((sqrt (Div1 + (h12 * h12))) - linh) * 2.0;
        /* calculate heigth of guide exit (h2) */
        h2 = sqrt (p2_para * (l + linh + p2_para / 4.0));
        h2 = h2 * 2.0;
      }
    }
  } else if (!strncmp (fu, "file", 4)) {
    pos = strtok (fu, "=");
    while ((pos = strtok (0, "="))) {
      strcpy (file_name, pos);
    }
    if ((num = fopen (file_name, "r")) == NULL) {
      fprintf (stderr, "Component: %s (Guide_tapering)\n", NAME_CURRENT_COMP);
      fprintf (stderr, "           File %s not found! \n", file_name);
      free (fu);
      exit (-1);
    } else {
      ii = 0;
      /* Use ret==NULL as termination criterion on while, otherwise
         the reading may on some systems continue until "800" segments */
      char dymmy = 1;
      char* ret = &dymmy;
      while (!feof (num) && ret) {
        ret = fgets (segment[ii].st, 128, num);
        if (ii > 799) {
          fprintf (stderr, "%s: Number of segments is limited to 800 !! \n", NAME_CURRENT_COMP);
          free (fu);
          exit (-1);
        }
        ii++;
      }
      fclose (num);
      ii--;
    }
    seg = ii - 3;
    l_seg = l / seg;
    for (i = 3; i < ii; i++) {
      if (strlen (segment[i].st) < 4) {
        fprintf (stderr, "Component: %s (Guide_tapering)\n", NAME_CURRENT_COMP);
        fprintf (stderr, "           Data Format Error! \n");
        free (fu);
        exit (-1);
      }
      h1_in[i - 3] = strtod (strtok (segment[i].st, " "), &ep);
      h2_out[i - 3] = strtod (strtok (0, " "), &ep);
      w1_in[i - 3] = strtod (strtok (0, " "), &ep);
      w2_out[i - 3] = strtod (strtok (0, " "), &ep);
    }
    h1 = h1_in[0];
    h2 = h2_out[seg - 1];
    w1 = w1_in[0];
    w2 = w2_out[seg - 1];
    for (i = 0; i < seg; i++) {
      fprintf (stderr, "%d: %lf %lf %lf %lf \n", i, h1_in[i], h2_out[i], w1_in[i], w2_out[i]);
    }
  } else if (!strcmp (fu, "straight")) {
    for (i = 0; i < seg; i++) {
      h1_in[i] = h2_out[i] = h2 = h1;
      w1_in[i] = w2_out[i] = w2 = w1;
    }
  } else {
    fprintf (stderr, "Component: %s (Guide_tapering)\n", NAME_CURRENT_COMP);
    fprintf (stderr, "           Unknown KEYWORD: %s \n", fu);
    free (fu);
    exit (-1);
  }
  fprintf (stderr, "Component: %s (Guide_tapering)\n", NAME_CURRENT_COMP);
  fprintf (stderr, "           Height at the guide exit (h2): %lf \n", h2);
  if (h2 <= 0) {
    fprintf (stderr, "Component: %s (Guide_tapering)\n", NAME_CURRENT_COMP);
    fprintf (stderr, "           Height at the guide exit (h2) was calculated\n");
    fprintf (stderr, "           <=0; Please change the parameter h1 and/or\n");
    fprintf (stderr, "           linh and/or louth! \n");
    free (fu);
    exit (-1);
  }
  if (!strcmp (fu, "elliptical")) {
    h1_in[0] = h1;
    for (i = 1; i < seg; i++) {
      if (b_ell_q == 0) {
        h1_in[i] = h1;
      } else {
        mxi = (((lbh / 2.0) - linh) - (l_seg * i));
        h1_in[i] = (sqrt ((1.0 - ((mxi * mxi) / a_ell_q)) * b_ell_q)) * 2.0;
      }
      h2_out[i - 1] = h1_in[i];
    }
    h2_out[seg - 1] = h2;
  } else if (!strcmp (fu, "parabolical")) {
    h1_in[0] = h1;
    ii = seg - 1;
    if (louth == 0 && linh == 0) {
      for (i = 1; i < (seg + 1); i++) {
        h1_in[i] = h1;
        ii = ii - 1;
        h2_out[i - 1] = h1_in[i];
      }
    } else {
      if ((linh == 0) && (louth > 0)) {
        for (i = 1; i < (seg + 1); i++) {
          h1_in[i] = (sqrt ((p2_para / 4.0 + louth + (l_seg * ii)) * p2_para)) * 2.0;
          ii = ii - 1;
          h2_out[i - 1] = h1_in[i];
        }
      } else {
        for (i = 1; i < (seg + 1); i++) {
          h1_in[i] = (sqrt ((p2_para / 4.0 + linh + (l_seg * i)) * p2_para)) * 2.0;
          h2_out[i - 1] = h1_in[i];
        }
      }
    }
  }
  /* compute each value for horizontal mirrors */
  w12 = w1 / 2.0;
  if (!strcmp (fu, "elliptical")) {
    /* calculate lbw the distance between focal points of horizontal mirrors */
    lbw = l + linw + loutw;
    /* calculate parameter b of elliptical equestion - horizontal mirrors */
    if (linw == 0 && loutw == 0) {
      /* plane mirrors (horizontal) */
      b_ell_q = 0;
      w2 = w1;
    } else {
      /* elliptical mirrors */
      u1 = sqrt ((linw * linw) + (w12 * w12));
      u2 = sqrt ((w12 * w12) + ((l + loutw) * (l + loutw)));
      a_ell_q = ((u1 + u2) / 2.0) * ((u1 + u2) / 2.0);
      b_ell_q = a_ell_q - ((lbw / 2.0) * (lbw / 2.0));
      /* calculate weigth of guide exit (w2) */
      div1 = ((lbw / 2.0 - loutw) * (lbw / 2.0 - loutw)) / a_ell_q;
      w2 = sqrt (b_ell_q * (1.0 - div1));
      w2 = w2 * 2.0;
    }
  } else if (!strcmp (fu, "parabolical")) {
    if ((linw > 0) && (loutw > 0)) {
      fprintf (stderr, "Component: %s (Guide_tapering) Two focal\n", NAME_CURRENT_COMP);
      fprintf (stderr, "           points linw and loutw are not allowed! \n");
      free (fu);
      exit (-1);
    }
    if (loutw == 0 && linw == 0) {
      /* plane mirrors (horizontal) */
      w2 = w1;
    } else {
      if (linw == 0) {
        /* parabolical mirrors */
        Div1 = ((2.0 * loutw + 2.0 * l) * (2.0 * loutw + 2.0 * l)) / 4.0;
        p2_para = ((sqrt (Div1 + (w12 * w12))) - (loutw + l)) * 2.0;
        /* calculate weigth of guide exit (w2) */
        w2 = sqrt (p2_para * (loutw + p2_para / 4.0));
        w2 = w2 * 2.0;
      } else {
        /* anti-trompete */
        Div1 = ((2.0 * linw) * (2.0 * linw)) / 4.0;
        p2_para = ((sqrt (Div1 + (w12 * w12))) - linw) * 2.0;
        /* calculate heigth of guide exit (w2) */
        w2 = sqrt (p2_para * (l + linw + p2_para / 4.0));
        w2 = w2 * 2.0;
      }
    }
  }
  fprintf (stderr, "Component: %s (Guide_tapering)\n", NAME_CURRENT_COMP);
  fprintf (stderr, "           Width at the guide exit (w2): %lf \n", w2);
  if (w2 <= 0) {
    fprintf (stderr, "Component: %s (Guide_tapering)\n", NAME_CURRENT_COMP);
    fprintf (stderr, "           Width at the guide exit (w2) was calculated\n");
    fprintf (stderr, "           <=0; Please change the parameter w1 and/or\n");
    fprintf (stderr, "           l! \n");
    free (fu);
    exit (-1);
  }
  if (!strcmp (fu, "elliptical")) {
    w1_in[0] = w1;
    for (i = 1; i < seg; i++) {
      if (b_ell_q == 0) {
        w1_in[i] = w1;
      } else {
        mxi = (((lbw / 2.0) - linw) - (l_seg * i));
        w1_in[i] = (sqrt ((1.0 - ((mxi * mxi) / a_ell_q)) * b_ell_q)) * 2.0;
      }
      w2_out[i - 1] = w1_in[i];
    }
    w2_out[seg - 1] = w2;
  } else if (!strcmp (fu, "parabolical")) {
    w1_in[0] = w1;
    ii = seg - 1;
    if (loutw == 0 && linw == 0) {
      for (i = 1; i < (seg + 1); i++) {
        w1_in[i] = w1;
        ii = ii - 1;
        w2_out[i - 1] = w1_in[i];
      }
    } else {
      if ((linw == 0) && (loutw > 0)) {
        for (i = 1; i < (seg + 1); i++) {
          w1_in[i] = (sqrt ((p2_para / 4 + loutw + (l_seg * ii)) * p2_para)) * 2;
          ii = ii - 1;
          w2_out[i - 1] = w1_in[i];
        }
      } else {
        for (i = 1; i < (seg + 1); i++) {
          w1_in[i] = (sqrt ((p2_para / 4 + linw + (l_seg * i)) * p2_para)) * 2;
          w2_out[i - 1] = w1_in[i];
        }
      }
    }
  }
  free (fu);
  for (i = 0; i < seg; i++) {
    w1c[i] = w1_in[i];
    w2c[i] = w2_out[i];
    ww[i] = .5 * (w2c[i] - w1c[i]);
    hh[i] = .5 * (h2_out[i] - h1_in[i]);
    whalf[i] = .5 * w1c[i];
    hhalf[i] = .5 * h1_in[i];
    lwhalf[i] = l_seg * whalf[i];
    lhhalf[i] = l_seg * hhalf[i];
  }
  /* guide curvature: rotation angle [rad] between each guide segment */
  if (curvature && l && segno)
    rotation_h = l / curvature / segno;
  if (curvature_v && l && segno)
    rotation_v = l / curvature_v / segno;
  #undef option
  #undef w1
  #undef h1
  #undef l
  #undef linw
  #undef loutw
  #undef linh
  #undef louth
  #undef R0
  #undef Qcx
  #undef Qcy
  #undef alphax
  #undef alphay
  #undef W
  #undef mx
  #undef my
  #undef segno
  #undef curvature
  #undef curvature_v
  #undef w1c
  #undef w2c
  #undef ww
  #undef hh
  #undef whalf
  #undef hhalf
  #undef lwhalf
  #undef lhhalf
  #undef h1_in
  #undef h2_out
  #undef w1_in
  #undef w2_out
  #undef l_seg
  #undef h12
  #undef h2
  #undef w12
  #undef w2
  #undef a_ell_q
  #undef b_ell_q
  #undef lbw
  #undef lbh
  #undef mxi
  #undef u1
  #undef u2
  #undef div1
  #undef p2_para
  #undef test
  #undef Div1
  #undef seg
  #undef fu
  #undef pos
  #undef file_name
  #undef ep
  #undef num
  #undef rotation_h
  #undef rotation_v
  return(_comp);
} /* class_Guide_tapering_init */

_class_Monochromator_curved *class_Monochromator_curved_init(_class_Monochromator_curved *_comp
) {
  #define reflect (_comp->_parameters.reflect)
  #define transmit (_comp->_parameters.transmit)
  #define zwidth (_comp->_parameters.zwidth)
  #define yheight (_comp->_parameters.yheight)
  #define gap (_comp->_parameters.gap)
  #define NH (_comp->_parameters.NH)
  #define NV (_comp->_parameters.NV)
  #define mosaich (_comp->_parameters.mosaich)
  #define mosaicv (_comp->_parameters.mosaicv)
  #define r0 (_comp->_parameters.r0)
  #define t0 (_comp->_parameters.t0)
  #define Q (_comp->_parameters.Q)
  #define RV (_comp->_parameters.RV)
  #define RH (_comp->_parameters.RH)
  #define DM (_comp->_parameters.DM)
  #define mosaic (_comp->_parameters.mosaic)
  #define width (_comp->_parameters.width)
  #define height (_comp->_parameters.height)
  #define verbose (_comp->_parameters.verbose)
  #define order (_comp->_parameters.order)
  #define mos_rms_y (_comp->_parameters.mos_rms_y)
  #define mos_rms_z (_comp->_parameters.mos_rms_z)
  #define mos_rms_max (_comp->_parameters.mos_rms_max)
  #define mono_Q (_comp->_parameters.mono_Q)
  #define SlabWidth (_comp->_parameters.SlabWidth)
  #define SlabHeight (_comp->_parameters.SlabHeight)
  #define rTable (_comp->_parameters.rTable)
  #define tTable (_comp->_parameters.tTable)
  #define rTableFlag (_comp->_parameters.rTableFlag)
  #define tTableFlag (_comp->_parameters.tTableFlag)
  #define tiltH (_comp->_parameters.tiltH)
  #define tiltV (_comp->_parameters.tiltV)
  #define ncol_var (_comp->_parameters.ncol_var)
  #define nrow_var (_comp->_parameters.nrow_var)
  SIG_MESSAGE("[_H53_ThALES_Monochromator_init] component H53_ThALES_Monochromator=Monochromator_curved() INITIALISE [Monochromator_curved:0]");

  int i;

  if (mosaic != 0) {
    mos_rms_y = MIN2RAD * mosaic / sqrt (8 * log (2));
    mos_rms_z = mos_rms_y;
  } else {
    mos_rms_y = MIN2RAD * mosaich / sqrt (8 * log (2));
    mos_rms_z = MIN2RAD * mosaicv / sqrt (8 * log (2));
  }
  mos_rms_max = mos_rms_y > mos_rms_z ? mos_rms_y : mos_rms_z;

  mono_Q = Q;
  if (DM != 0)
    mono_Q = 2 * PI / DM;

  if (mono_Q <= 0) {
    fprintf (stderr, "Monochromator_curved: %s: Error scattering vector Q = 0\n", NAME_CURRENT_COMP);
    exit (-1);
  }
  if (r0 < 0) {
    fprintf (stderr, "Monochromator_curved: %s: Error reflectivity r0 is negative\n", NAME_CURRENT_COMP);
    exit (-1);
  }
  if (r0 == 0) {
    fprintf (stderr, "Monochromator_curved: %s: Reflectivity r0 is null. Ignoring component.\n", NAME_CURRENT_COMP);
  }
  if (NH * NV == 0) {
    fprintf (stderr, "Monochromator_curved: %s: no slabs ??? (NH or NV=0)\n", NAME_CURRENT_COMP);
    exit (-1);
  }

  if (verbose && r0) {
    printf ("Monochromator_curved: component %s Q=%.3g Angs-1 (DM=%.4g Angs)\n", NAME_CURRENT_COMP, mono_Q, 2 * PI / mono_Q);
    if (NH * NV == 1)
      printf ("            flat.\n");
    else {
      if (NH > 1) {
        printf ("            horizontal: %i blades", (int)NH);
        if (RH != 0)
          printf (" focusing with RH=%.3g [m]", RH);
        printf ("\n");
      }
      if (NV > 1) {
        printf ("            vertical:   %i blades", (int)NV);
        if (RV != 0)
          printf (" focusing with RV=%.3g [m]", RV);
        printf ("\n");
      }
    }
  }

  if (reflect != NULL && r0 && strlen (reflect) && strcmp (reflect, "NULL") && strcmp (reflect, "0")) {
    if (verbose)
      fprintf (stdout, "Monochromator_curved: %s: Reflectivity data (k, R) from %s\n", NAME_CURRENT_COMP, reflect);
    Table_Read (&rTable, reflect, 1); /* read 1st block data from file into rTable */
    Table_Rebin (&rTable);            /* rebin as evenly, increasing array */
    if (rTable.rows < 2)
      Table_Free (&rTable);
    if (verbose)
      Table_Info (rTable);
    rTableFlag = 1;
  } else {
    rTableFlag = 0;
  }
  if (transmit != NULL && strlen (transmit) && strcmp (transmit, "NULL") && strcmp (transmit, "0")) {
    if (verbose)
      fprintf (stdout, "Monochromator_curved: %s: Transmission data (k, T) from %s\n", NAME_CURRENT_COMP, transmit);
    Table_Read (&tTable, transmit, 1); /* read 1st block data from file into rTable */
    Table_Rebin (&tTable);             /* rebin as evenly, increasing array */
    if (tTable.rows < 2)
      Table_Free (&tTable);
    if (verbose)
      Table_Info (tTable);
    tTableFlag = 1;
  } else {
    tTableFlag = 0;
  }

  if (width == 0)
    SlabWidth = zwidth;
  else
    SlabWidth = (width + gap) / NH - gap;
  if (height == 0)
    SlabHeight = yheight;
  else
    SlabHeight = (height + gap) / NV - gap;

  tiltH = calloc ((int)2 * (NH + 1), sizeof (double));
  tiltV = calloc ((int)2 * (NV + 1), sizeof (double));

  if (!tiltH)
    printf ("Monochromator_curved: %s: Warning: not enough memory to allocate tilts (NH=%i).\n", NAME_CURRENT_COMP, NH);
  else if (RH) { /* pre-compute tilts */
    for (i = 0; i <= NH; i++) {
      tiltH[i] = asin ((i - (NH + 1) / 2.0) * (SlabWidth + gap) / RH);
    }
  }
  if (!tiltV)
    printf ("Monochromator_curved: %s: Warning: not enough memory to allocate tilts (NV=%i).\n", NAME_CURRENT_COMP, NV);
  else if (RV) {
    for (i = 0; i <= NV; i++) {
      tiltV[i] = -asin ((i - (NV + 1) / 2.0) * (SlabHeight + gap) / RV);
    }
  }
  sprintf (ncol_var, "ncol_%ld", _comp->_index);
  sprintf (nrow_var, "nrow_%ld", _comp->_index);
  #undef reflect
  #undef transmit
  #undef zwidth
  #undef yheight
  #undef gap
  #undef NH
  #undef NV
  #undef mosaich
  #undef mosaicv
  #undef r0
  #undef t0
  #undef Q
  #undef RV
  #undef RH
  #undef DM
  #undef mosaic
  #undef width
  #undef height
  #undef verbose
  #undef order
  #undef mos_rms_y
  #undef mos_rms_z
  #undef mos_rms_max
  #undef mono_Q
  #undef SlabWidth
  #undef SlabHeight
  #undef rTable
  #undef tTable
  #undef rTableFlag
  #undef tTableFlag
  #undef tiltH
  #undef tiltV
  #undef ncol_var
  #undef nrow_var
  return(_comp);
} /* class_Monochromator_curved_init */

_class_Isotropic_Sqw *class_Isotropic_Sqw_init(_class_Isotropic_Sqw *_comp
) {
  #define powder_format (_comp->_parameters.powder_format)
  #define Sqw_coh (_comp->_parameters.Sqw_coh)
  #define Sqw_inc (_comp->_parameters.Sqw_inc)
  #define geometry (_comp->_parameters.geometry)
  #define radius (_comp->_parameters.radius)
  #define thickness (_comp->_parameters.thickness)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define zdepth (_comp->_parameters.zdepth)
  #define threshold (_comp->_parameters.threshold)
  #define order (_comp->_parameters.order)
  #define T (_comp->_parameters.T)
  #define verbose (_comp->_parameters.verbose)
  #define d_phi (_comp->_parameters.d_phi)
  #define concentric (_comp->_parameters.concentric)
  #define rho (_comp->_parameters.rho)
  #define sigma_abs (_comp->_parameters.sigma_abs)
  #define sigma_coh (_comp->_parameters.sigma_coh)
  #define sigma_inc (_comp->_parameters.sigma_inc)
  #define classical (_comp->_parameters.classical)
  #define powder_Dd (_comp->_parameters.powder_Dd)
  #define powder_DW (_comp->_parameters.powder_DW)
  #define powder_Vc (_comp->_parameters.powder_Vc)
  #define density (_comp->_parameters.density)
  #define weight (_comp->_parameters.weight)
  #define p_interact (_comp->_parameters.p_interact)
  #define norm (_comp->_parameters.norm)
  #define powder_barns (_comp->_parameters.powder_barns)
  #define quantum_correction (_comp->_parameters.quantum_correction)
  #define VarSqw (_comp->_parameters.VarSqw)
  #define columns (_comp->_parameters.columns)
  #define offdata (_comp->_parameters.offdata)
  SIG_MESSAGE("[_H53_ThALES_Sample_init] component H53_ThALES_Sample=Isotropic_Sqw() INITIALISE [Isotropic_Sqw:0]");

  int i;
  /* check for parameters */
  columns = (int*)powder_format;

  VarSqw.verbose_output = verbose;
  VarSqw.shape = -1; /* -1:no shape, 0:cyl, 1:box, 2:sphere, 3:any-shape  */
  if (geometry && strlen (geometry) && strcmp (geometry, "NULL") && strcmp (geometry, "0")) {
    #ifndef USE_OFF
    fprintf (stderr, "Error: You are attempting to use an OFF geometry without -DUSE_OFF. You will need to recompile with that define set!\n");
    exit (-1);
    #else
    if (off_init (geometry, xwidth, yheight, zdepth, 0, &offdata)) {
      VarSqw.shape = 3;
      thickness = 0;
      concentric = 0;
    }
    #endif
  } else if (xwidth && yheight && zdepth)
    VarSqw.shape = 1; /* box */
  else if (radius > 0 && yheight)
    VarSqw.shape = 0; /* cylinder */
  else if (radius > 0 && !yheight)
    VarSqw.shape = 2; /* sphere */

  if (VarSqw.shape < 0)
    exit (fprintf (stderr,
                   "Isotropic_Sqw: %s: sample has invalid dimensions.\n"
                   "ERROR          Please check parameter values (xwidth, yheight, zdepth, radius).\n",
                   NAME_CURRENT_COMP));

  if (thickness) {
    if (radius && (radius < fabs (thickness))) {
      MPI_MASTER (fprintf (stderr,
                           "Isotropic_Sqw: %s: hollow sample thickness is larger than its volume (sphere/cylinder).\n"
                           "WARNING        Please check parameter values. Using bulk sample (thickness=0).\n",
                           NAME_CURRENT_COMP););
      thickness = 0;
    } else if (!radius && (xwidth < 2 * fabs (thickness) || yheight < 2 * fabs (thickness) || zdepth < 2 * fabs (thickness))) {
      MPI_MASTER (fprintf (stderr,
                           "Isotropic_Sqw: %s: hollow sample thickness is larger than its volume (box).\n"
                           "WARNING        Please check parameter values.\n",
                           NAME_CURRENT_COMP););
    }
  }
  MPI_MASTER (if (VarSqw.verbose_output) {
    switch (VarSqw.shape) {
    case 0:
      printf ("Isotropic_Sqw: %s: is a %scylinder: radius=%f thickness=%f height=%f [J Comp Phys 228 (2009) 5251]\n", NAME_CURRENT_COMP,
              (thickness ? "hollow " : ""), radius, fabs (thickness), yheight);
      break;
    case 1:
      printf ("Isotropic_Sqw: %s: is a %sbox: width=%f height=%f depth=%f \n", NAME_CURRENT_COMP, (thickness ? "hollow " : ""), xwidth, yheight, zdepth);
      break;
    case 2:
      printf ("Isotropic_Sqw: %s: is a %ssphere: radius=%f thickness=%f\n", NAME_CURRENT_COMP, (thickness ? "hollow " : ""), radius, fabs (thickness));
      break;
    case 3:
      printf ("Isotropic_Sqw: %s: is a volume defined from file %s\n", NAME_CURRENT_COMP, geometry);
    }
  });

  if (concentric && !thickness) {
    MPI_MASTER (printf ("Isotropic_Sqw: %s:Can not use concentric mode\n"
                        "WARNING        on non hollow shape. Ignoring.\n",
                        NAME_CURRENT_COMP););
    concentric = 0;
  }

  strncpy (VarSqw.compname, NAME_CURRENT_COMP, 256);
  VarSqw.T2E = (1 / 11.605); /* Kelvin to meV = 1000*KB/e */
  VarSqw.sqSE2K = (V2K * SE2V) * (V2K * SE2V);
  VarSqw.sqw_threshold = (threshold > 0 ? threshold : 0);
  VarSqw.s_abs = sigma_abs;
  VarSqw.s_coh = sigma_coh;
  VarSqw.s_inc = sigma_inc; /* s_scatt member initialized in Sqw_init */
  VarSqw.maxloop = 100;     /* atempts to close triangle */
  VarSqw.minevents = 100;   /* minimal # of events required to get dynamical range */
  VarSqw.neutron_removed = 0;
  VarSqw.neutron_enter = 0;
  VarSqw.neutron_pmult = 0;
  VarSqw.neutron_exit = 0;
  VarSqw.mat_rho = rho;
  VarSqw.sqw_norm = norm;
  VarSqw.mean_scatt = 0;
  VarSqw.mean_abs = 0;
  VarSqw.psum_scatt = 0;
  VarSqw.single_coh = 0;
  VarSqw.single_inc = 0;
  VarSqw.multi = 0;
  VarSqw.barns = powder_barns;
  VarSqw.sqw_classical = classical;
  VarSqw.lookup_length = 100;
  VarSqw.mat_weight = weight;
  VarSqw.mat_density = density;
  if (quantum_correction && strlen (quantum_correction))
    strncpy (VarSqw.Q_correction, quantum_correction, 256);
  else
    strncpy (VarSqw.Q_correction, "default", 256);

  /* PowderN compatibility members */
  VarSqw.Dd = powder_Dd;
  VarSqw.DWfactor = powder_DW;
  VarSqw.Temperature = T;
  for (i = 0; i < 9; i++)
    VarSqw.column_order[i] = columns[i];
  VarSqw.column_order[8] = (VarSqw.column_order[0] >= 0 ? 0 : 2);

  /* optional ways to define rho */
  if (!VarSqw.mat_rho && powder_Vc > 0)
    VarSqw.mat_rho = 1 / powder_Vc;
  /* import the data files ================================================== */
  if (!Sqw_init (&VarSqw, Sqw_coh, Sqw_inc)) {
    MPI_MASTER (printf ("Isotropic_Sqw: %s: ERROR importing data files (Sqw_init coh=%s inc=%s).\n", NAME_CURRENT_COMP, Sqw_coh, Sqw_inc););
  }
  if (VarSqw.s_coh < 0)
    VarSqw.s_coh = 0;
  if (VarSqw.s_inc < 0)
    VarSqw.s_inc = 0;
  if (VarSqw.s_abs < 0)
    VarSqw.s_abs = 0;
  if ((VarSqw.s_coh > 0 || VarSqw.s_inc > 0) && VarSqw.mat_rho <= 0) {
    MPI_MASTER (printf ("Isotropic_Sqw: %s: WARNING: Null density (V_rho). Unactivating component.\n", NAME_CURRENT_COMP););
    VarSqw.s_coh = VarSqw.s_inc = 0;
  }
  /* 100: convert from barns to fm^2 */
  VarSqw.my_a_v = (VarSqw.mat_rho * 100 * VarSqw.s_abs * 2200);
  VarSqw.my_s = (VarSqw.mat_rho * 100 * (VarSqw.s_coh > 0 ? VarSqw.s_coh : 0 + VarSqw.s_inc > 0 ? VarSqw.s_inc : 0));
  MPI_MASTER (if ((VarSqw.s_coh > 0 || VarSqw.s_inc > 0) && !VarSqw.Temperature && (VarSqw.Data_coh.intensity || VarSqw.Data_inc.intensity)
                  && VarSqw.verbose_output) printf ("Isotropic_Sqw: %s: Sample temperature not defined (T=0).\n"
                                                    "Warning        Disabling detailed balance.\n",
                                                    NAME_CURRENT_COMP);
              if (VarSqw.s_coh <= 0 && VarSqw.s_inc <= 0) {
                printf ("Isotropic_Sqw: %s: Scattering cross section is zero\n"
                        "ERROR          (sigma_coh, sigma_inc).\n",
                        NAME_CURRENT_COMP);
              });
  if (d_phi)
    d_phi = fabs (d_phi) * DEG2RAD;

  if (d_phi > PI)
    d_phi = 0; /* V_scatt on 4*PI */

  if (d_phi && order != 1) {
    MPI_MASTER (printf ("Isotropic_Sqw: %s: Focusing can only apply for single\n"
                        "               scattering. Setting to order=1.\n",
                        NAME_CURRENT_COMP););
    order = 1;
  }

  /* request statistics */
  if (VarSqw.verbose_output > 1) {
    Sqw_diagnosis (&VarSqw, &VarSqw.Data_coh);
    Sqw_diagnosis (&VarSqw, &VarSqw.Data_inc);
  }

  for (i = 0; i < 2; i++) {
    struct Sqw_Data_struct Data_sqw;
    Data_sqw = (i == 0 ? VarSqw.Data_coh : VarSqw.Data_inc);
    Table_Free (&(Data_sqw.Sqw));
  }

  /* end INITIALIZE */
  #undef powder_format
  #undef Sqw_coh
  #undef Sqw_inc
  #undef geometry
  #undef radius
  #undef thickness
  #undef xwidth
  #undef yheight
  #undef zdepth
  #undef threshold
  #undef order
  #undef T
  #undef verbose
  #undef d_phi
  #undef concentric
  #undef rho
  #undef sigma_abs
  #undef sigma_coh
  #undef sigma_inc
  #undef classical
  #undef powder_Dd
  #undef powder_DW
  #undef powder_Vc
  #undef density
  #undef weight
  #undef p_interact
  #undef norm
  #undef powder_barns
  #undef quantum_correction
  #undef VarSqw
  #undef columns
  #undef offdata
  return(_comp);
} /* class_Isotropic_Sqw_init */

_class_Collimator_linear *class_Collimator_linear_init(_class_Collimator_linear *_comp
) {
  #define xmin (_comp->_parameters.xmin)
  #define xmax (_comp->_parameters.xmax)
  #define ymin (_comp->_parameters.ymin)
  #define ymax (_comp->_parameters.ymax)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define length (_comp->_parameters.length)
  #define divergence (_comp->_parameters.divergence)
  #define transmission (_comp->_parameters.transmission)
  #define divergenceV (_comp->_parameters.divergenceV)
  #define slope (_comp->_parameters.slope)
  #define slopeV (_comp->_parameters.slopeV)
  SIG_MESSAGE("[_SC3_init] component SC3=Collimator_linear() INITIALISE [Collimator_linear:0]");

  slope = tan (MIN2RAD * divergence);
  slopeV = tan (MIN2RAD * divergenceV);
  if (xwidth > 0) {
    xmax = xwidth / 2;
    xmin = -xmax;
  }
  if (yheight > 0) {
    ymax = yheight / 2;
    ymin = -ymax;
  }

  if ((xmin >= xmax) || (ymin >= ymax)) {
    printf ("Collimator_linear: %s: Null slit opening area !\n"
            "ERROR              (xwidth,yheight,xmin,xmax,ymin,ymax). Exiting",
            NAME_CURRENT_COMP);
    exit (0);
  }
  #undef xmin
  #undef xmax
  #undef ymin
  #undef ymax
  #undef xwidth
  #undef yheight
  #undef length
  #undef divergence
  #undef transmission
  #undef divergenceV
  #undef slope
  #undef slopeV
  return(_comp);
} /* class_Collimator_linear_init */

_class_Monitor *class_Monitor_init(_class_Monitor *_comp
) {
  #define xmin (_comp->_parameters.xmin)
  #define xmax (_comp->_parameters.xmax)
  #define ymin (_comp->_parameters.ymin)
  #define ymax (_comp->_parameters.ymax)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define restore_neutron (_comp->_parameters.restore_neutron)
  #define Nsum (_comp->_parameters.Nsum)
  #define psum (_comp->_parameters.psum)
  #define p2sum (_comp->_parameters.p2sum)
  SIG_MESSAGE("[_He3H_init] component He3H=Monitor() INITIALISE [Monitor:0]");

  psum = 0;
  p2sum = 0;
  Nsum = 0;

  if (xwidth > 0) {
    xmax = xwidth / 2;
    xmin = -xmax;
  }
  if (yheight > 0) {
    ymax = yheight / 2;
    ymin = -ymax;
  }

  if ((xmin >= xmax) || (ymin >= ymax)) {
    printf ("Monitor: %s: Null detection area !\n"
            "ERROR    (xwidth,yheight,xmin,xmax,ymin,ymax). Exiting",
            NAME_CURRENT_COMP);
    exit (0);
  }
  #undef xmin
  #undef xmax
  #undef ymin
  #undef ymax
  #undef xwidth
  #undef yheight
  #undef restore_neutron
  #undef Nsum
  #undef psum
  #undef p2sum
  return(_comp);
} /* class_Monitor_init */

_class_V_selector *class_V_selector_init(_class_V_selector *_comp
) {
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define zdepth (_comp->_parameters.zdepth)
  #define radius (_comp->_parameters.radius)
  #define alpha (_comp->_parameters.alpha)
  #define length (_comp->_parameters.length)
  #define d (_comp->_parameters.d)
  #define nu (_comp->_parameters.nu)
  #define nslit (_comp->_parameters.nslit)
  #define omega (_comp->_parameters.omega)
  #define alpha_rad (_comp->_parameters.alpha_rad)
  SIG_MESSAGE("[_WASP_Vselector_init] component WASP_Vselector=V_selector() INITIALISE [V_selector:0]");

  omega = nu * 2 * PI;
  alpha_rad = alpha * DEG2RAD;
  if (zdepth < length)
    zdepth = length;
  #undef xwidth
  #undef yheight
  #undef zdepth
  #undef radius
  #undef alpha
  #undef length
  #undef d
  #undef nu
  #undef nslit
  #undef omega
  #undef alpha_rad
  return(_comp);
} /* class_V_selector_init */

_class_Pol_mirror *class_Pol_mirror_init(_class_Pol_mirror *_comp
) {
  #define rUpPar (_comp->_parameters.rUpPar)
  #define rDownPar (_comp->_parameters.rDownPar)
  #define rUpData (_comp->_parameters.rUpData)
  #define rDownData (_comp->_parameters.rDownData)
  #define p_reflect (_comp->_parameters.p_reflect)
  #define zwidth (_comp->_parameters.zwidth)
  #define yheight (_comp->_parameters.yheight)
  #define rUpTable (_comp->_parameters.rUpTable)
  #define rUpTableFlag (_comp->_parameters.rUpTableFlag)
  #define rDownTable (_comp->_parameters.rDownTable)
  #define rDownTableFlag (_comp->_parameters.rDownTableFlag)
  SIG_MESSAGE("[_WASP_polariser_init] component WASP_polariser=Pol_mirror() INITIALISE [Pol_mirror:0]");


  if (strlen (rUpData) && strcmp (rUpData, "NULL")) {
    if (Table_Read (&rUpTable, rUpData, 1) <= 0) {
      fprintf (stderr, "Pol_mirror: %s: can not read file %s\n", NAME_CURRENT_COMP, rUpData);
      exit (1);
    }
    rUpTableFlag = 1;
  } else {
    rUpTableFlag = 0;
  }
  if (strlen (rUpData) && strcmp (rUpData, "NULL")) {
    if (Table_Read (&rDownTable, rDownData, 1) <= 0) {
      fprintf (stderr, "Pol_mirror: %s: can not read file %s\n", NAME_CURRENT_COMP, rDownData);
      exit (1);
    }
    rDownTableFlag = 1;
  } else {
    rDownTableFlag = 0;
  }

  if ((zwidth <= 0) || (yheight <= 0)) {
    fprintf (stderr,
             "Pol_mirror: %s: NULL or negative length scale!\n"
             "ERROR      (zwidth=%g,yheight=%g). Exiting\n",
             NAME_CURRENT_COMP, zwidth, yheight);
    exit (1);
  }
  #undef rUpPar
  #undef rDownPar
  #undef rUpData
  #undef rDownData
  #undef p_reflect
  #undef zwidth
  #undef yheight
  #undef rUpTable
  #undef rUpTableFlag
  #undef rDownTable
  #undef rDownTableFlag
  return(_comp);
} /* class_Pol_mirror_init */

_class_Pol_guide_vmirror *class_Pol_guide_vmirror_init(_class_Pol_guide_vmirror *_comp
) {
  #define nvs (_comp->_parameters.nvs)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define length (_comp->_parameters.length)
  #define rR0 (_comp->_parameters.rR0)
  #define rQc (_comp->_parameters.rQc)
  #define ralpha (_comp->_parameters.ralpha)
  #define rmSM (_comp->_parameters.rmSM)
  #define rW (_comp->_parameters.rW)
  #define rbeta (_comp->_parameters.rbeta)
  #define rUpR0 (_comp->_parameters.rUpR0)
  #define rUpQc (_comp->_parameters.rUpQc)
  #define rUpalpha (_comp->_parameters.rUpalpha)
  #define rUpmSM (_comp->_parameters.rUpmSM)
  #define rUpW (_comp->_parameters.rUpW)
  #define rUpbeta (_comp->_parameters.rUpbeta)
  #define rDownR0 (_comp->_parameters.rDownR0)
  #define rDownQc (_comp->_parameters.rDownQc)
  #define rDownalpha (_comp->_parameters.rDownalpha)
  #define rDownmSM (_comp->_parameters.rDownmSM)
  #define rDownW (_comp->_parameters.rDownW)
  #define rDownbeta (_comp->_parameters.rDownbeta)
  #define debug (_comp->_parameters.debug)
  #define allow_inside_start (_comp->_parameters.allow_inside_start)
  #define rPar (_comp->_parameters.rPar)
  #define rUpPar (_comp->_parameters.rUpPar)
  #define rDownPar (_comp->_parameters.rDownPar)
  #define rParFile (_comp->_parameters.rParFile)
  #define rUpParFile (_comp->_parameters.rUpParFile)
  #define rDownParFile (_comp->_parameters.rDownParFile)
  #define inputType (_comp->_parameters.inputType)
  #define localG (_comp->_parameters.localG)
  #define normalTop (_comp->_parameters.normalTop)
  #define normalBot (_comp->_parameters.normalBot)
  #define normalLeft (_comp->_parameters.normalLeft)
  #define normalRight (_comp->_parameters.normalRight)
  #define normalInOut (_comp->_parameters.normalInOut)
  #define pointTop (_comp->_parameters.pointTop)
  #define pointBot (_comp->_parameters.pointBot)
  #define pointLeft (_comp->_parameters.pointLeft)
  #define pointRight (_comp->_parameters.pointRight)
  #define pointIn (_comp->_parameters.pointIn)
  #define pointOut (_comp->_parameters.pointOut)
  #define mirrorNormals (_comp->_parameters.mirrorNormals)
  #define mirrorPoints (_comp->_parameters.mirrorPoints)
  #define xwhalf (_comp->_parameters.xwhalf)
  #define xwfull (_comp->_parameters.xwfull)
  #define norm (_comp->_parameters.norm)
  #define n_index (_comp->_parameters.n_index)
  #define i_index (_comp->_parameters.i_index)
  #define rParToFunc (_comp->_parameters.rParToFunc)
  #define rUpParToFunc (_comp->_parameters.rUpParToFunc)
  #define rDownParToFunc (_comp->_parameters.rDownParToFunc)
  #define rParPtr (_comp->_parameters.rParPtr)
  #define rUpParPtr (_comp->_parameters.rUpParPtr)
  #define rDownParPtr (_comp->_parameters.rDownParPtr)
  SIG_MESSAGE("[_WASP_Vpolariser_init] component WASP_Vpolariser=Pol_guide_vmirror() INITIALISE [Pol_guide_vmirror:0]");

  if (inputType == 0) {
    // copy the SM reflectivity input parameter array r..Par to array r..ParToFunc
    // the input array can be 5 parameters, i.e. without beta, then beta=0
    // or it can be 6 parameters, including the value for beta.
    // r..ParToFunc is sent to the reflectivity functions

    for (i_index = 0; i_index < 6; i_index++) {
      rParToFunc[i_index] = 0;
      rUpParToFunc[i_index] = 0;
      rDownParToFunc[i_index] = 0;
    }

    n_index = sizeof (rPar) / sizeof (rPar[0]);
    for (i_index = 0; i_index < n_index; i_index++) {
      rParToFunc[i_index] = rPar[i_index];
    }

    n_index = sizeof (rUpPar) / sizeof (rUpPar[0]);
    for (i_index = 0; i_index < n_index; i_index++) {
      rUpParToFunc[i_index] = rUpPar[i_index];
    }

    n_index = sizeof (rDownPar) / sizeof (rDownPar[0]);
    for (i_index = 0; i_index < n_index; i_index++) {
      rDownParToFunc[i_index] = rDownPar[i_index];
    }
  } else if (inputType == 1) {
    if (Table_Read (&rParPtr, rParFile, 1) <= 0) {
      fprintf (stderr, "Pol_guide_vmirror: %s: can not read file %s\n", NAME_CURRENT_COMP, rPar);
      exit (1);
    }
    if (Table_Read (&rUpParPtr, rUpParFile, 1) <= 0) {
      fprintf (stderr, "Pol_guide_vmirror: %s: can not read file %s\n", NAME_CURRENT_COMP, rUpPar);
      exit (1);
    }
    if (Table_Read (&rDownParPtr, rDownParFile, 1) <= 0) {
      fprintf (stderr, "Pol_guide_vmirror: %s: can not read file %s\n", NAME_CURRENT_COMP, rDownPar);
      exit (1);
    }
    fprintf (stderr, "Pol_guide_vmirror: %s: Reading files is not possible!\n", NAME_CURRENT_COMP);
    exit (1);
  } else if (inputType == 2) {
    // Assemble the parameter array r..ParToFunc from the individual parameters
    // r..ParToFunc is sent to the reflectivity functions

    for (i_index = 0; i_index < 6; i_index++) {
      rParToFunc[i_index] = 0;
      rUpParToFunc[i_index] = 0;
      rDownParToFunc[i_index] = 0;
    }

    rParToFunc[0] = rR0;
    rParToFunc[1] = rQc;
    rParToFunc[2] = ralpha;
    rParToFunc[3] = rmSM;
    rParToFunc[4] = rW;
    rParToFunc[5] = rbeta;

    rUpParToFunc[0] = rUpR0;
    rUpParToFunc[1] = rUpQc;
    rUpParToFunc[2] = rUpalpha;
    rUpParToFunc[3] = rUpmSM;
    rUpParToFunc[4] = rUpW;
    rUpParToFunc[5] = rUpbeta;

    rDownParToFunc[0] = rDownR0;
    rDownParToFunc[1] = rDownQc;
    rDownParToFunc[2] = rDownalpha;
    rDownParToFunc[3] = rDownmSM;
    rDownParToFunc[4] = rDownW;
    rDownParToFunc[5] = rDownbeta;
  }

  if ((xwidth <= 0) || (yheight <= 0) || (length <= 0)) {
    fprintf (stderr,
             "Pol_guide_vmirror: %s: NULL or negative length scale!\n"
             "ERROR      (xwidth,yheight,length). Exiting\n",
             NAME_CURRENT_COMP);
    exit (1);
  }

  if (mcgravitation) {

    localG = rot_apply (ROT_A_CURRENT_COMP, coords_set (0, -GRAVITY, 0));
    fprintf (stdout, "Pol_guide_vmirror: %s: Gravity is on!\n", NAME_CURRENT_COMP);
  } else
    localG = coords_set (0, 0, 0);

  // To be able to handle the situation properly where a component of
  // the gravity is along the z-axis we also define entrance (in) and
  // exit (out) planes
  // The entrance and exit plane are defined by the normal vector
  // (0, 0, 1)
  // and the two points pointIn=(0, 0, 0) and pointOut=(0, 0, length)

  normalInOut = coords_set (0, 0, 1);
  pointIn = coords_set (0, 0, 0);
  pointOut = coords_set (0, 0, length);

  // Top plane (+y dir) can be spanned by (1, 0, 0) & (0, 0, 1)
  // and the point (0, yheight/2, 0)
  // A normal vector is (0, 1, 0)
  normalTop = coords_set (0, 1, 0);
  pointTop = coords_set (0, yheight / 2, 0);

  // Bottom plane (-y dir) can be spanned by (1, 0, 0) & (0, 0, 1)
  // and the point (0, -yheight/2, 0)
  // A normal vector is (0, 1, 0)
  normalBot = coords_set (0, 1, 0);
  pointBot = coords_set (0, -yheight / 2, 0);

  // Left plane (+x dir) can be spanned by (0, 1, 0) & (0, 0, 1)
  // and the point (xwidth/2, 0, 0)
  // A normal vector is (1, 0, 0)
  normalLeft = coords_set (1, 0, 0);
  pointLeft = coords_set (xwidth / 2, 0, 0);

  // Right plane (-x dir) can be spanned by (0, 1, 0) & (0, 0, 1)
  // and the point (-xwidth/2, 0, 0)
  // A normal vector is (1, 0, 0)
  normalRight = coords_set (1, 0, 0);
  pointRight = coords_set (-xwidth / 2, 0, 0);

  mirrorNormals = malloc (2 * nvs * sizeof (Coords));
  mirrorPoints = malloc (2 * nvs * sizeof (Coords));

  /* Split in odd and even nvs cases */
  xwhalf = xwidth / (2 * nvs);
  xwfull = xwidth / nvs;
  norm = 1.0 / sqrt (xwhalf * xwhalf + length * length);

  /* For "all-mirror" solution: */
  /* double dx; */
  /* if (nvs % 2) { */
  /*   /\* Odd number of cavities *\/ */
  /*   dx=0; */
  /* } else { */
  /*   /\* Even number of cavities *\/ */
  /*   dx=xwhalf; */
  /* } */

  /* int counter; */
  /* for (counter=1; counter <= nvs; counter++)  { */
  /*   /\* Put in the mirror point locations *\/ */
  /*   mirrorPoints[2*counter-2] = coords_set(-(dx+counter*xwfull), 0, 0); */
  /*   mirrorPoints[2*counter-1] = coords_set((dx+counter*xwfull), 0, 0); */
  /*   normalMirror1  = coords_set(norm*length, 0, -norm*xwhalf); */

  /* } */
  #undef nvs
  #undef xwidth
  #undef yheight
  #undef length
  #undef rR0
  #undef rQc
  #undef ralpha
  #undef rmSM
  #undef rW
  #undef rbeta
  #undef rUpR0
  #undef rUpQc
  #undef rUpalpha
  #undef rUpmSM
  #undef rUpW
  #undef rUpbeta
  #undef rDownR0
  #undef rDownQc
  #undef rDownalpha
  #undef rDownmSM
  #undef rDownW
  #undef rDownbeta
  #undef debug
  #undef allow_inside_start
  #undef rPar
  #undef rUpPar
  #undef rDownPar
  #undef rParFile
  #undef rUpParFile
  #undef rDownParFile
  #undef inputType
  #undef localG
  #undef normalTop
  #undef normalBot
  #undef normalLeft
  #undef normalRight
  #undef normalInOut
  #undef pointTop
  #undef pointBot
  #undef pointLeft
  #undef pointRight
  #undef pointIn
  #undef pointOut
  #undef mirrorNormals
  #undef mirrorPoints
  #undef xwhalf
  #undef xwfull
  #undef norm
  #undef n_index
  #undef i_index
  #undef rParToFunc
  #undef rUpParToFunc
  #undef rDownParToFunc
  #undef rParPtr
  #undef rUpParPtr
  #undef rDownParPtr
  return(_comp);
} /* class_Pol_guide_vmirror_init */

_class_Incoherent *class_Incoherent_init(_class_Incoherent *_comp
) {
  #define geometry (_comp->_parameters.geometry)
  #define radius (_comp->_parameters.radius)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define zdepth (_comp->_parameters.zdepth)
  #define thickness (_comp->_parameters.thickness)
  #define target_x (_comp->_parameters.target_x)
  #define target_y (_comp->_parameters.target_y)
  #define target_z (_comp->_parameters.target_z)
  #define focus_r (_comp->_parameters.focus_r)
  #define focus_xw (_comp->_parameters.focus_xw)
  #define focus_yh (_comp->_parameters.focus_yh)
  #define focus_aw (_comp->_parameters.focus_aw)
  #define focus_ah (_comp->_parameters.focus_ah)
  #define target_index (_comp->_parameters.target_index)
  #define pack (_comp->_parameters.pack)
  #define p_interact (_comp->_parameters.p_interact)
  #define f_QE (_comp->_parameters.f_QE)
  #define gamma (_comp->_parameters.gamma)
  #define Etrans (_comp->_parameters.Etrans)
  #define deltaE (_comp->_parameters.deltaE)
  #define sigma_abs (_comp->_parameters.sigma_abs)
  #define sigma_inc (_comp->_parameters.sigma_inc)
  #define Vc (_comp->_parameters.Vc)
  #define concentric (_comp->_parameters.concentric)
  #define order (_comp->_parameters.order)
  #define VarsInc (_comp->_parameters.VarsInc)
  #define offdata (_comp->_parameters.offdata)
  SIG_MESSAGE("[_H522_WASP_Sample_init] component H522_WASP_Sample=Incoherent() INITIALISE [Incoherent:0]");

  VarsInc.shape = -1; /* -1:no shape, 0:cyl, 1:box, 2:sphere, 3:any-shape  */
  if (geometry && strlen (geometry) && strcmp (geometry, "NULL") && strcmp (geometry, "0")) {
    #ifndef USE_OFF
    fprintf (stderr, "Error: You are attempting to use an OFF geometry without -DUSE_OFF. You will need to recompile with that define set!\n");
    exit (-1);
    #else
    if (off_init (geometry, xwidth, yheight, zdepth, 0, &offdata)) {
      VarsInc.shape = 3;
      thickness = 0;
      concentric = 0;
    }
    #endif
  } else if (xwidth && yheight && zdepth)
    VarsInc.shape = 1; /* box */
  else if (radius > 0 && yheight)
    VarsInc.shape = 0; /* cylinder */
  else if (radius > 0 && !yheight)
    VarsInc.shape = 2; /* sphere */

  if (VarsInc.shape < 0)
    exit (fprintf (stderr,
                   "Incoherent: %s: sample has invalid dimensions.\n"
                   "ERROR       Please check parameter values (xwidth, yheight, zdepth, radius).\n",
                   NAME_CURRENT_COMP));
  if (thickness) {
    if (radius && (radius < thickness || (yheight && (yheight < 2 * thickness)))) {
      fprintf (stderr,
               "Incoherent: %s: hollow sample thickness is larger than its volume (sphere/cylinder).\n"
               "WARNING     Please check parameter values. Using bulk sample (thickness=0).\n",
               NAME_CURRENT_COMP);
      thickness = 0;
    } else if (!radius && (xwidth < 2 * thickness || yheight < 2 * thickness || zdepth < 2 * thickness)) {
      fprintf (stderr,
               "Incoherent: %s: hollow sample thickness is larger than its volume (box).\n"
               "WARNING     Please check parameter values. Using bulk sample (thickness=0).\n",
               NAME_CURRENT_COMP);
      thickness = 0;
    }
  }

  if (concentric && thickness <= 0) {
    printf ("Incoherent: %s:Can not use concentric mode\n"
            "WARNING     on non hollow shape. Ignoring.\n",
            NAME_CURRENT_COMP);
    concentric = 0;
  }

  VarsInc.sigma_a = sigma_abs;
  VarsInc.sigma_i = sigma_inc;
  VarsInc.rho = (pack / Vc);
  VarsInc.my_s = (VarsInc.rho * 100 * VarsInc.sigma_i);
  VarsInc.my_a_v = (VarsInc.rho * 100 * VarsInc.sigma_a);

  /* now compute target coords if a component index is supplied */
  VarsInc.tx = VarsInc.ty = VarsInc.tz = 0;
  if (!target_index && !target_x && !target_y && !target_z)
    target_index = 1;
  if (target_index) {
    Coords ToTarget;
    ToTarget = coords_sub (POS_A_COMP_INDEX (INDEX_CURRENT_COMP + target_index), POS_A_CURRENT_COMP);
    ToTarget = rot_apply (ROT_A_CURRENT_COMP, ToTarget);
    coords_get (ToTarget, &VarsInc.tx, &VarsInc.ty, &VarsInc.tz);
  } else {
    VarsInc.tx = target_x;
    VarsInc.ty = target_y;
    VarsInc.tz = target_z;
  }

  if (!(VarsInc.tx || VarsInc.ty || VarsInc.tz)) {
    MPI_MASTER (printf ("Incoherent: %s: The target is not defined. Using direct beam (Z-axis).\n", NAME_CURRENT_COMP););
    VarsInc.tz = 1;
  }

  /* different ways of setting rectangular area */
  VarsInc.aw = VarsInc.ah = 0;
  if (focus_xw) {
    VarsInc.xw = focus_xw;
  }
  if (focus_yh) {
    VarsInc.yh = focus_yh;
  }
  if (focus_aw) {
    VarsInc.aw = DEG2RAD * focus_aw;
  }
  if (focus_ah) {
    VarsInc.ah = DEG2RAD * focus_ah;
  }

  MPI_MASTER (printf ("Incoherent: %s: Vc=%g [Angs] sigma_abs=%g [barn] sigma_inc=%g [barn]\n", NAME_CURRENT_COMP, Vc, VarsInc.sigma_a, VarsInc.sigma_i););
  #undef geometry
  #undef radius
  #undef xwidth
  #undef yheight
  #undef zdepth
  #undef thickness
  #undef target_x
  #undef target_y
  #undef target_z
  #undef focus_r
  #undef focus_xw
  #undef focus_yh
  #undef focus_aw
  #undef focus_ah
  #undef target_index
  #undef pack
  #undef p_interact
  #undef f_QE
  #undef gamma
  #undef Etrans
  #undef deltaE
  #undef sigma_abs
  #undef sigma_inc
  #undef Vc
  #undef concentric
  #undef order
  #undef VarsInc
  #undef offdata
  return(_comp);
} /* class_Incoherent_init */

_class_Shape *class_Shape_init(_class_Shape *_comp
) {
  #define geometry (_comp->_parameters.geometry)
  #define radius (_comp->_parameters.radius)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define zdepth (_comp->_parameters.zdepth)
  #define thickness (_comp->_parameters.thickness)
  #define nx (_comp->_parameters.nx)
  #define ny (_comp->_parameters.ny)
  #define nz (_comp->_parameters.nz)
  #define center (_comp->_parameters.center)
  #define offdata (_comp->_parameters.offdata)
  SIG_MESSAGE("[_D22_Detector_vessel_init] component D22_Detector_vessel=Shape() INITIALISE [Shape:0]");

  if (geometry && strlen (geometry) && strcmp (geometry, "NULL") && strcmp (geometry, "0")) {
    if (off_init (geometry, xwidth, yheight, zdepth, !center, &offdata)) {
      thickness = 0;
    }
  }
  #undef geometry
  #undef radius
  #undef xwidth
  #undef yheight
  #undef zdepth
  #undef thickness
  #undef nx
  #undef ny
  #undef nz
  #undef center
  #undef offdata
  return(_comp);
} /* class_Shape_init */



int init(void) { /* called by mccode_main for ILL_H5_new:INITIALISE */
  DEBUG_INSTR();
  // Initialise rng
  srandom(_hash(mcseed-1));

  /* code_main/parseoptions/readparams sets instrument parameters value */
  stracpy(instrument->_name, "ILL_H5_new", 256);

  /* Instrument 'ILL_H5_new' INITIALISE */
  SIG_MESSAGE("[ILL_H5_new] INITIALISE [(null):-1]");
  #define lambda (instrument->_parameters.lambda)
  #define dlambda (instrument->_parameters.dlambda)
  #define ThALES_lambda (instrument->_parameters.ThALES_lambda)
  #define WASP_lambda (instrument->_parameters.WASP_lambda)
  #define D16_lambda (instrument->_parameters.D16_lambda)
  #define SADAM_lambda (instrument->_parameters.SADAM_lambda)
  #define IN15_lambda (instrument->_parameters.IN15_lambda)
  #define D22_lambda (instrument->_parameters.D22_lambda)
  #define D22_collimation (instrument->_parameters.D22_collimation)
  #define ThALES_sample (instrument->_parameters.ThALES_sample)
  #define WASP_sample (instrument->_parameters.WASP_sample)
  #define D16_sample (instrument->_parameters.D16_sample)
  #define SADAM_sample (instrument->_parameters.SADAM_sample)
  #define D22_sample (instrument->_parameters.D22_sample)
  #define ThALES_RMV (instrument->_parameters.ThALES_RMV)
  #define D16_RMV (instrument->_parameters.D16_RMV)
  #define SADAM_RMV (instrument->_parameters.SADAM_RMV)
  #define ThALES_RMH (instrument->_parameters.ThALES_RMH)
{
  double L;
  /* the effective guide divergence is 1.2*0.1*lambda*pi/180 for m=1.2 */
  /* the effective inguide length for focusing is thus 
         (0.12/2)/(1.2*0.1*lambda*PI/180)
  
  /* compute H53 parameters: ThALES */
  ThALES_A1  = asin(ThALES_lambda/2/ThALES_DM)*RAD2DEG;
       L   = 1/(1/ThALES_L+1/( (0.12/2)/(3*0.1*ThALES_lambda*PI/180) ));
  if (ThALES_RMV<0)
  ThALES_RMV = 2*L*sin(DEG2RAD*fabs(ThALES_A1));
  if (ThALES_RMH<0)
  ThALES_RMH = 2*L/sin(DEG2RAD*fabs(ThALES_A1));
  printf("%s: ThALES: A1=%g [deg] RMV=%g [m] RMH=%g [m] lambda=%g [Angs] sample=%s\n", 
    NAME_INSTRUMENT, ThALES_A1, ThALES_RMV, ThALES_RMH, ThALES_lambda, ThALES_sample);
  
  /* compute H521 parameters: D16 */
  D16_A1   = asin(D16_lambda/2/D16_DM)*RAD2DEG;
      L    = 1/(1/D16_L+1/( (0.12/2)/(2*0.1*D16_lambda*PI/180) ));
  if (D16_RMV<0)
  D16_RMV  = 2*L*sin(DEG2RAD*fabs(D16_A1));
  printf("%s: D16:  A1=%g [deg] RMV=%g [m] lambda=%g [Angs] sample=%s\n", 
    NAME_INSTRUMENT, D16_A1, D16_RMV, D16_lambda, D16_sample);
  
  /* compute H521 parameters: SuperADAM */
  SADAM_A1 = asin(SADAM_lambda/2/SADAM_DM)*RAD2DEG;
        L  = 1/(1/SADAM_L+1/( (0.12/2)/(2*0.1*SADAM_lambda*PI/180) ));
  if (SADAM_RMV<0)
  SADAM_RMV= 2*L*sin(DEG2RAD*fabs(SADAM_A1));
  printf("%s: SuperADAM: A1=%g [deg] RMV=%g [m] lambda=%g [Angs] sample=%s\n", 
    NAME_INSTRUMENT, SADAM_A1, SADAM_RMV, SADAM_lambda, SADAM_sample);
  
  /* compute H522 parameters: WASP Velocity Selector */ 
  WASP_nu   = 3956*14.2*DEG2RAD/2/PI/WASP_lambda/0.5;
  printf("%s: WASP:  nu=%g [rpm] lambda=%g [Angs] sample=%s\n", 
    NAME_INSTRUMENT, WASP_nu*60, WASP_lambda, WASP_sample);
  
  /* compute H511 parameters: IN15 Velocity Selector */ 
  IN15_nu  = 3956*64.4*DEG2RAD/2/PI/IN15_lambda/0.3;
  printf("%s: IN15: nu=%g [rmp] lambda=%g [Angs] sample=%s\n", 
    NAME_INSTRUMENT, IN15_nu*60, IN15_lambda, "Vanadium (polarized)");
  
  /* compute H512 parameters: D22 Velocity Selector */ 
  D22_nu   = 3956*48.3*DEG2RAD/2/PI/D22_lambda/0.25;
  printf("%s: D22:  nu=%g [rpm] lambda=%g [Angs] sample=%s\n", 
    NAME_INSTRUMENT, D22_nu*60, D22_lambda, D22_sample);
  
}
  #undef lambda
  #undef dlambda
  #undef ThALES_lambda
  #undef WASP_lambda
  #undef D16_lambda
  #undef SADAM_lambda
  #undef IN15_lambda
  #undef D22_lambda
  #undef D22_collimation
  #undef ThALES_sample
  #undef WASP_sample
  #undef D16_sample
  #undef SADAM_sample
  #undef D22_sample
  #undef ThALES_RMV
  #undef D16_RMV
  #undef SADAM_RMV
  #undef ThALES_RMH
  _Origin_setpos(); /* type Progress_bar */
  _HCS_setpos(); /* type Source_gen */
  _HCS_Al_setpos(); /* type PowderN */
  _HCS_Al_4_setpos(); /* type PowderN */
  _HCS_Al_5_setpos(); /* type PowderN */
  _HCS_Al_6_setpos(); /* type PowderN */
  _HCS_Al_7_setpos(); /* type PowderN */
  _H5_setpos(); /* type Monitor_nD */
  _H5_rect_setpos(); /* type Guide_gravity */
  _H53_origin_setpos(); /* type Monitor_nD */
  _H52_origin_setpos(); /* type Monitor_nD */
  _H51_origin_setpos(); /* type Monitor_nD */
  _H53_start_setpos(); /* type Arm */
  _H53_inpile_setpos(); /* type Guide_gravity */
  _H53_Al_setpos(); /* type PowderN */
  _H53_Obt_setpos(); /* type Guide_gravity */
  _HCS_Al_17_setpos(); /* type PowderN */
  _H53_Obt_Out_setpos(); /* type Monitor_nD */
  _HCS_Al_19_setpos(); /* type PowderN */
  _H53_VSComC1_setpos(); /* type Guide_gravity */
  _HCS_Al_21_setpos(); /* type PowderN */
  _H53_Nose_setpos(); /* type Guide_tapering */
  _HCS_Al_23_setpos(); /* type PowderN */
  _H53_ThALES_Monochromator_Cradle_setpos(); /* type Monitor_nD */
  _H53_ThALES_Monochromator_setpos(); /* type Monochromator_curved */
  _H53_ThALES_Monochromator_Jumper_setpos(); /* type Arm */
  _H53_ThALES_Monochromator_Out_setpos(); /* type Arm */
  _H53_ThALES_Sample_Div_setpos(); /* type Monitor_nD */
  _H53_ThALES_Sample_XY_setpos(); /* type Monitor_nD */
  _H53_ThALES_Sample_L_setpos(); /* type Monitor_nD */
  _H53_ThALES_Sample_setpos(); /* type Isotropic_Sqw */
  _H53_ThALES_Spectrometer_setpos(); /* type Monitor_nD */
  _H53_ThALES_Diffractometer_setpos(); /* type Monitor_nD */
  _Sample_Out_setpos(); /* type Arm */
  _SC3_setpos(); /* type Collimator_linear */
  _Ana_Cradle_setpos(); /* type Arm */
  _PG2Xtal_setpos(); /* type Monochromator_curved */
  _Ana_Out_setpos(); /* type Arm */
  _SC4_setpos(); /* type Collimator_linear */
  _He3H_setpos(); /* type Monitor */
  _H53_ThALES_Transmit_setpos(); /* type Arm */
  _H53_ThALES_TransmitXY_setpos(); /* type Monitor_nD */
  _H52_start_setpos(); /* type Arm */
  _H52_inpile_setpos(); /* type Guide_gravity */
  _H52_Common_setpos(); /* type Guide_gravity */
  _H52_Common_46_setpos(); /* type Guide_gravity */
  _H52_Common_3_setpos(); /* type Guide_gravity */
  _HCS_Al_48_setpos(); /* type PowderN */
  _H52_Obt_Out_setpos(); /* type Monitor_nD */
  _HCS_Al_50_setpos(); /* type PowderN */
  _H52_Common_51_setpos(); /* type Guide_gravity */
  _H52_Common_52_setpos(); /* type Guide_gravity */
  _H52_Common_53_setpos(); /* type Guide_gravity */
  _H52_Common_54_setpos(); /* type Guide_gravity */
  _H52_Common_55_setpos(); /* type Guide_gravity */
  _H52_Common_56_setpos(); /* type Guide_gravity */
  _H52_Common_57_setpos(); /* type Guide_gravity */
  _H52_Common_58_setpos(); /* type Guide_gravity */
  _H52_Common_59_setpos(); /* type Guide_gravity */
  _H52_Common_60_setpos(); /* type Guide_gravity */
  _H52_Common_61_setpos(); /* type Guide_gravity */
  _H52_Common_62_setpos(); /* type Guide_gravity */
  _H52_Common_63_setpos(); /* type Guide_gravity */
  _HCS_Al_64_setpos(); /* type PowderN */
  _H52_Common_Out_setpos(); /* type Monitor_nD */
  _H523_origin_setpos(); /* type Monitor_nD */
  _H521_origin_setpos(); /* type Monitor_nD */
  _H522_origin_setpos(); /* type Monitor_nD */
  _H521_start_setpos(); /* type Arm */
  _H521_Curved_setpos(); /* type Guide_gravity */
  _H521_Curved_71_setpos(); /* type Guide_gravity */
  _H521_Curved_72_setpos(); /* type Guide_gravity */
  _H521_Curved_73_setpos(); /* type Guide_gravity */
  _H521_Curved_74_setpos(); /* type Guide_gravity */
  _H521_Curved_75_setpos(); /* type Guide_gravity */
  _H521_Curved_76_setpos(); /* type Guide_gravity */
  _H521_Curved_77_setpos(); /* type Guide_gravity */
  _H521_Curved_78_setpos(); /* type Guide_gravity */
  _H521_Curved_79_setpos(); /* type Guide_gravity */
  _H521_Curved_80_setpos(); /* type Guide_gravity */
  _H521_Curved_preVTE_setpos(); /* type Guide_gravity */
  _HCS_Al_82_setpos(); /* type PowderN */
  _H521_VTE_setpos(); /* type Monitor_nD */
  _HCS_Al_84_setpos(); /* type PowderN */
  _H521_Curved_85_setpos(); /* type Guide_gravity */
  _H521_Curved_86_setpos(); /* type Guide_gravity */
  _H521_Curved_87_setpos(); /* type Guide_gravity */
  _H521_Curved_88_setpos(); /* type Guide_gravity */
  _H521_Curved_89_setpos(); /* type Guide_gravity */
  _H521_Curved_90_setpos(); /* type Guide_gravity */
  _H521_Curved_91_setpos(); /* type Guide_gravity */
  _H521_Curved_92_setpos(); /* type Guide_gravity */
  _H521_Curved_93_setpos(); /* type Guide_gravity */
  _H521_Curved_94_setpos(); /* type Guide_gravity */
  _H521_Curved_95_setpos(); /* type Guide_gravity */
  _H521_Curved_96_setpos(); /* type Guide_gravity */
  _H521_Curved_97_setpos(); /* type Guide_gravity */
  _H521_Curved_98_setpos(); /* type Guide_gravity */
  _H521_Curved_99_setpos(); /* type Guide_gravity */
  _H521_Curved_100_setpos(); /* type Guide_gravity */
  _H521_Curved_101_setpos(); /* type Guide_gravity */
  _H521_Curved_102_setpos(); /* type Guide_gravity */
  _H521_Curved_103_setpos(); /* type Guide_gravity */
  _H521_Curved_104_setpos(); /* type Guide_gravity */
  _H521_Curved_105_setpos(); /* type Guide_gravity */
  _H521_Curved_106_setpos(); /* type Guide_gravity */
  _H521_Curved_107_setpos(); /* type Guide_gravity */
  _HCS_Al_108_setpos(); /* type PowderN */
  _H521_Curved_Out_setpos(); /* type Monitor_nD */
  _H521_Straight_setpos(); /* type Guide_gravity */
  _H521_Straight_Out_setpos(); /* type Monitor_nD */
  _HCS_Al_112_setpos(); /* type PowderN */
  _H521_D16_Monochromator_Cradle_setpos(); /* type Monitor_nD */
  _H521_D16_Monochromator_setpos(); /* type Monochromator_curved */
  _H521_D16_Monochromator_Jumper_setpos(); /* type Arm */
  _H521_D16_Monochromator_Out_setpos(); /* type Arm */
  _H521_D16_Sample_Div_setpos(); /* type Monitor_nD */
  _H521_D16_Sample_XY_setpos(); /* type Monitor_nD */
  _H521_D16_Sample_L_setpos(); /* type Monitor_nD */
  _H521_D16_Sample_setpos(); /* type Isotropic_Sqw */
  _H521_D16_Detector_setpos(); /* type Monitor_nD */
  _H521_D16_Spectrometer_setpos(); /* type Monitor_nD */
  _H521_D16_Diffractometer_setpos(); /* type Monitor_nD */
  _H521_D16_Transmit_setpos(); /* type Arm */
  _HCS_Al_125_setpos(); /* type PowderN */
  _H521_P6_Start_setpos(); /* type Arm */
  _H521_P6_setpos(); /* type Guide_gravity */
  _HCS_Al_128_setpos(); /* type PowderN */
  _H521_SADAM_Monochromator_Cradle_setpos(); /* type Monitor_nD */
  _H521_SADAM_Monochromator_setpos(); /* type Monochromator_curved */
  _H521_SADAM_Monochromator_Out_setpos(); /* type Arm */
  _H521_SADAM_Sample_Div_setpos(); /* type Monitor_nD */
  _H521_SADAM_Sample_XY_setpos(); /* type Monitor_nD */
  _H521_SADAM_Sample_L_setpos(); /* type Monitor_nD */
  _H521_SADAM_Sample_setpos(); /* type Isotropic_Sqw */
  _H521_SADAM_Detector_setpos(); /* type Monitor_nD */
  _H521_SADAM_Spectrometer_setpos(); /* type Monitor_nD */
  _H521_SADAM_Diffractometer_setpos(); /* type Monitor_nD */
  _H522_start_setpos(); /* type Arm */
  _H522_Curved_setpos(); /* type Guide_gravity */
  _H522_Curved_141_setpos(); /* type Guide_gravity */
  _H522_Curved_142_setpos(); /* type Guide_gravity */
  _H522_Curved_143_setpos(); /* type Guide_gravity */
  _H522_Curved_144_setpos(); /* type Guide_gravity */
  _H522_Curved_145_setpos(); /* type Guide_gravity */
  _H522_Curved_146_setpos(); /* type Guide_gravity */
  _H522_Curved_147_setpos(); /* type Guide_gravity */
  _H522_Curved_148_setpos(); /* type Guide_gravity */
  _H522_Curved_149_setpos(); /* type Guide_gravity */
  _HCS_Al_150_setpos(); /* type PowderN */
  _H522_VTE_setpos(); /* type Monitor_nD */
  _HCS_Al_152_setpos(); /* type PowderN */
  _H523_Curved_153_setpos(); /* type Guide_gravity */
  _H523_Curved_154_setpos(); /* type Guide_gravity */
  _H523_Curved_155_setpos(); /* type Guide_gravity */
  _H523_Curved_156_setpos(); /* type Guide_gravity */
  _H523_Curved_157_setpos(); /* type Guide_gravity */
  _H522_Curved_158_setpos(); /* type Guide_gravity */
  _H522_Curved_159_setpos(); /* type Guide_gravity */
  _H522_Curved_160_setpos(); /* type Guide_gravity */
  _H522_Curved_161_setpos(); /* type Guide_gravity */
  _H522_Curved_162_setpos(); /* type Guide_gravity */
  _H522_Curved_163_setpos(); /* type Guide_gravity */
  _H522_Curved_164_setpos(); /* type Guide_gravity */
  _H522_Curved_165_setpos(); /* type Guide_gravity */
  _H522_Curved_166_setpos(); /* type Guide_gravity */
  _H522_Curved_167_setpos(); /* type Guide_gravity */
  _H522_Curved_168_setpos(); /* type Guide_gravity */
  _H522_Curved_169_setpos(); /* type Guide_gravity */
  _H522_Curved_170_setpos(); /* type Guide_gravity */
  _H522_Curved_171_setpos(); /* type Guide_gravity */
  _H522_Curved_172_setpos(); /* type Guide_gravity */
  _H522_Curved_173_setpos(); /* type Guide_gravity */
  _H522_Curved_174_setpos(); /* type Guide_gravity */
  _H522_Curved_175_setpos(); /* type Guide_gravity */
  _H522_Curved_176_setpos(); /* type Guide_gravity */
  _H522_Curved_177_setpos(); /* type Guide_gravity */
  _HCS_Al_178_setpos(); /* type PowderN */
  _H522_Curved_Out_XY_setpos(); /* type Monitor_nD */
  _H522_Curved_Out_XL_setpos(); /* type Monitor_nD */
  _WASP_Vselector_setpos(); /* type V_selector */
  _HCS_Al_182_setpos(); /* type PowderN */
  _H522_Straight_setpos(); /* type Guide_gravity */
  _HCS_Al_184_setpos(); /* type PowderN */
  _H522_Vsel_L_setpos(); /* type Monitor_nD */
  _H522_mirror_centre_setpos(); /* type Arm */
  _WASP_polariser_setpos(); /* type Pol_mirror */
  _H522_mirror_outdir_setpos(); /* type Arm */
  _H522_mirror_ReflectXY_setpos(); /* type Monitor_nD */
  _H522_mirror_TransmitXY_setpos(); /* type Monitor_nD */
  _H522_mirror_outdXY_setpos(); /* type Monitor_nD */
  _WASP_Vpolariser_setpos(); /* type Pol_guide_vmirror */
  _H522_Straight_Last_setpos(); /* type Guide_gravity */
  _H522_WASP_Sample_Div_setpos(); /* type Monitor_nD */
  _H522_WASP_Sample_XY_setpos(); /* type Monitor_nD */
  _H522_WASP_Sample_L_setpos(); /* type Monitor_nD */
  _H522_WASP_Sample_setpos(); /* type Incoherent */
  _H522_WASP_Detector_setpos(); /* type Monitor_nD */
  _H522_WASP_Spectrometer_setpos(); /* type Monitor_nD */
  _H522_WASP_Diffractometer_setpos(); /* type Monitor_nD */
  _H523_start_setpos(); /* type Arm */
  _H523_Curved_setpos(); /* type Guide_gravity */
  _H523_Curved_203_setpos(); /* type Guide_gravity */
  _H523_Curved_204_setpos(); /* type Guide_gravity */
  _H523_Curved_205_setpos(); /* type Guide_gravity */
  _H523_Curved_206_setpos(); /* type Guide_gravity */
  _HCS_Al_207_setpos(); /* type PowderN */
  _H523_VTE_setpos(); /* type Monitor_nD */
  _HCS_Al_209_setpos(); /* type PowderN */
  _H523_Curved_210_setpos(); /* type Guide_gravity */
  _H523_Curved_211_setpos(); /* type Guide_gravity */
  _H523_Curved_212_setpos(); /* type Guide_gravity */
  _H523_Curved_213_setpos(); /* type Guide_gravity */
  _H523_Curved_214_setpos(); /* type Guide_gravity */
  _H523_Curved_215_setpos(); /* type Guide_gravity */
  _H523_Curved_216_setpos(); /* type Guide_gravity */
  _H523_Curved_217_setpos(); /* type Guide_gravity */
  _H523_Curved_218_setpos(); /* type Guide_gravity */
  _H523_Curved_219_setpos(); /* type Guide_gravity */
  _H523_Curved_220_setpos(); /* type Guide_gravity */
  _H523_Curved_221_setpos(); /* type Guide_gravity */
  _H523_Curved_222_setpos(); /* type Guide_gravity */
  _H523_Curved_223_setpos(); /* type Guide_gravity */
  _H523_Curved_224_setpos(); /* type Guide_gravity */
  _H523_Curved_225_setpos(); /* type Guide_gravity */
  _H523_Curved_226_setpos(); /* type Guide_gravity */
  _H523_Curved_227_setpos(); /* type Guide_gravity */
  _H523_Curved_228_setpos(); /* type Guide_gravity */
  _H523_Curved_229_setpos(); /* type Guide_gravity */
  _HCS_Al_230_setpos(); /* type PowderN */
  _H523_CryoEDM_In_setpos(); /* type Arm */
  _H523_CryoEDM_In_L_setpos(); /* type Monitor_nD */
  _H523_CryoEDM_mirror_center_setpos(); /* type Arm */
  _H523_CryoEDM_polariser_setpos(); /* type Pol_mirror */
  _H523_CryoEDM_mirror_outdir_setpos(); /* type Arm */
  _H523_CryoEDM_mirror_ReflectXY_setpos(); /* type Monitor_nD */
  _H523_CryoEDM_mirror_TransmitXY_setpos(); /* type Monitor_nD */
  _H523_CryoEDM_Sample_L_setpos(); /* type Monitor_nD */
  _H523_CryoEDM_Sample_Div_setpos(); /* type Monitor_nD */
  _H523_CryoEDM_Sample_XY_setpos(); /* type Monitor_nD */
  _H51_start_setpos(); /* type Arm */
  _H51_inpile_setpos(); /* type Guide_gravity */
  _H51_Obt_1_setpos(); /* type Guide_gravity */
  _H51_Obt_2_setpos(); /* type Guide_gravity */
  _H51_Obt_3_setpos(); /* type Guide_gravity */
  _HCS_Al_246_setpos(); /* type PowderN */
  _H51_Obt_Out_setpos(); /* type Monitor_nD */
  _HCS_Al_248_setpos(); /* type PowderN */
  _H51_S2_setpos(); /* type Guide_gravity */
  _H51_S2_250_setpos(); /* type Guide_gravity */
  _H51_S2_251_setpos(); /* type Guide_gravity */
  _HCS_Al_H51_setpos(); /* type PowderN */
  _H51_S2_Out_setpos(); /* type Monitor_nD */
  _H51_split_2_setpos(); /* type Monitor_nD */
  _H51_split_1_setpos(); /* type Monitor_nD */
  _H511_Start_setpos(); /* type Arm */
  _H511_mirror_centre_setpos(); /* type Arm */
  _IN15_polariser_setpos(); /* type Pol_mirror */
  _H511_mirror_outdir_setpos(); /* type Arm */
  _H511_mirror_ReflectXY_setpos(); /* type Monitor_nD */
  _H511_mirror_TransmitXY_setpos(); /* type Monitor_nD */
  _H511_mirror_outdXY_setpos(); /* type Monitor_nD */
  _H511_S3_setpos(); /* type Guide_gravity */
  _H511_S9_setpos(); /* type Guide_gravity */
  _HCS_Al_265_setpos(); /* type PowderN */
  _H511_VTE_setpos(); /* type Monitor_nD */
  _HCS_Al_267_setpos(); /* type PowderN */
  _H511_S10_setpos(); /* type Guide_gravity */
  _IN15_Vselector_setpos(); /* type V_selector */
  _H511_BeforeV_setpos(); /* type Guide_gravity */
  _IN15_Vpolariser_setpos(); /* type Pol_guide_vmirror */
  _H511_AfterV_setpos(); /* type Guide_gravity */
  _H511_IN15_Sample_Div_setpos(); /* type Monitor_nD */
  _H511_IN15_Sample_XY_setpos(); /* type Monitor_nD */
  _H511_IN15_Sample_L_setpos(); /* type Monitor_nD */
  _H511_IN15_Sample_setpos(); /* type Incoherent */
  _H511_IN15_Detector_setpos(); /* type Monitor_nD */
  _H511_IN15_Spectrometer_setpos(); /* type Monitor_nD */
  _H511_IN15_Diffractometer_setpos(); /* type Monitor_nD */
  _H512_Start_setpos(); /* type Arm */
  _H512_S36_setpos(); /* type Guide_gravity */
  _H512_S36_282_setpos(); /* type Guide_gravity */
  _H512_S36_283_setpos(); /* type Guide_gravity */
  _H512_S36_284_setpos(); /* type Guide_gravity */
  _H512_S36_285_setpos(); /* type Guide_gravity */
  _H512_S36_286_setpos(); /* type Guide_gravity */
  _H512_S36_287_setpos(); /* type Guide_gravity */
  _H512_S36_288_setpos(); /* type Guide_gravity */
  _H512_S36_289_setpos(); /* type Guide_gravity */
  _H512_S36_290_setpos(); /* type Guide_gravity */
  _H512_S36_291_setpos(); /* type Guide_gravity */
  _H512_S36_292_setpos(); /* type Guide_gravity */
  _H512_S36_293_setpos(); /* type Guide_gravity */
  _H512_S36_294_setpos(); /* type Guide_gravity */
  _H512_S36_295_setpos(); /* type Guide_gravity */
  _H512_S36_296_setpos(); /* type Guide_gravity */
  _HCS_Al_H512_setpos(); /* type PowderN */
  _H512_VTE_setpos(); /* type Monitor_nD */
  _HCS_Al_299_setpos(); /* type PowderN */
  _H51_S78_setpos(); /* type Guide_gravity */
  _H51_S78_301_setpos(); /* type Guide_gravity */
  _H51_S78_302_setpos(); /* type Guide_gravity */
  _H51_S78_303_setpos(); /* type Guide_gravity */
  _HCS_Al_304_setpos(); /* type PowderN */
  _H512_S11_setpos(); /* type Guide_gravity */
  _HCS_Al_306_setpos(); /* type PowderN */
  _D22_PreV_setpos(); /* type Monitor_nD */
  _D22_Vselector_setpos(); /* type V_selector */
  _D22_Collimation_setpos(); /* type Guide_gravity */
  _D22_Sample_Pos_setpos(); /* type Arm */
  _H51_D22_Sample_Div_setpos(); /* type Monitor_nD */
  _H51_D22_Sample_XY_setpos(); /* type Monitor_nD */
  _H51_D22_Sample_L_setpos(); /* type Monitor_nD */
  _H51_D22_Sample_setpos(); /* type Isotropic_Sqw */
  _D22_Detector_setpos(); /* type Monitor_nD */
  _D22_Detector_vessel_setpos(); /* type Shape */
  _BOG_setpos(); /* type Shape */
  _H53_ThALES_Drum_setpos(); /* type Shape */
  _H521_D16_Drum_setpos(); /* type Shape */
  _H521_SADAM_Drum_setpos(); /* type Shape */
  _Traversee_setpos(); /* type Shape */
  _Core_Centre_setpos(); /* type Arm */
  _Core_setpos(); /* type Shape */
  _D2O_Vessel_setpos(); /* type Shape */
  _H2O_Vessel_setpos(); /* type Shape */

  /* call iteratively all components INITIALISE */
  class_Progress_bar_init(&_Origin_var);

  class_Source_gen_init(&_HCS_var);

  class_PowderN_init(&_HCS_Al_var);

  class_PowderN_init(&_HCS_Al_4_var);

  class_PowderN_init(&_HCS_Al_5_var);

  class_PowderN_init(&_HCS_Al_6_var);

  class_PowderN_init(&_HCS_Al_7_var);

  class_Monitor_nD_init(&_H5_var);

  class_Guide_gravity_init(&_H5_rect_var);

  class_Monitor_nD_init(&_H53_origin_var);

  class_Monitor_nD_init(&_H52_origin_var);

  class_Monitor_nD_init(&_H51_origin_var);


  class_Guide_gravity_init(&_H53_inpile_var);

  class_PowderN_init(&_H53_Al_var);

  class_Guide_gravity_init(&_H53_Obt_var);

  class_PowderN_init(&_HCS_Al_17_var);

  class_Monitor_nD_init(&_H53_Obt_Out_var);

  class_PowderN_init(&_HCS_Al_19_var);

  class_Guide_gravity_init(&_H53_VSComC1_var);

  class_PowderN_init(&_HCS_Al_21_var);

  class_Guide_tapering_init(&_H53_Nose_var);

  class_PowderN_init(&_HCS_Al_23_var);

  class_Monitor_nD_init(&_H53_ThALES_Monochromator_Cradle_var);

  class_Monochromator_curved_init(&_H53_ThALES_Monochromator_var);



  class_Monitor_nD_init(&_H53_ThALES_Sample_Div_var);

  class_Monitor_nD_init(&_H53_ThALES_Sample_XY_var);

  class_Monitor_nD_init(&_H53_ThALES_Sample_L_var);

  class_Isotropic_Sqw_init(&_H53_ThALES_Sample_var);

  class_Monitor_nD_init(&_H53_ThALES_Spectrometer_var);

  class_Monitor_nD_init(&_H53_ThALES_Diffractometer_var);


  class_Collimator_linear_init(&_SC3_var);


  class_Monochromator_curved_init(&_PG2Xtal_var);


  class_Collimator_linear_init(&_SC4_var);

  class_Monitor_init(&_He3H_var);


  class_Monitor_nD_init(&_H53_ThALES_TransmitXY_var);


  class_Guide_gravity_init(&_H52_inpile_var);

  class_Guide_gravity_init(&_H52_Common_var);

  class_Guide_gravity_init(&_H52_Common_46_var);

  class_Guide_gravity_init(&_H52_Common_3_var);

  class_PowderN_init(&_HCS_Al_48_var);

  class_Monitor_nD_init(&_H52_Obt_Out_var);

  class_PowderN_init(&_HCS_Al_50_var);

  class_Guide_gravity_init(&_H52_Common_51_var);

  class_Guide_gravity_init(&_H52_Common_52_var);

  class_Guide_gravity_init(&_H52_Common_53_var);

  class_Guide_gravity_init(&_H52_Common_54_var);

  class_Guide_gravity_init(&_H52_Common_55_var);

  class_Guide_gravity_init(&_H52_Common_56_var);

  class_Guide_gravity_init(&_H52_Common_57_var);

  class_Guide_gravity_init(&_H52_Common_58_var);

  class_Guide_gravity_init(&_H52_Common_59_var);

  class_Guide_gravity_init(&_H52_Common_60_var);

  class_Guide_gravity_init(&_H52_Common_61_var);

  class_Guide_gravity_init(&_H52_Common_62_var);

  class_Guide_gravity_init(&_H52_Common_63_var);

  class_PowderN_init(&_HCS_Al_64_var);

  class_Monitor_nD_init(&_H52_Common_Out_var);

  class_Monitor_nD_init(&_H523_origin_var);

  class_Monitor_nD_init(&_H521_origin_var);

  class_Monitor_nD_init(&_H522_origin_var);


  class_Guide_gravity_init(&_H521_Curved_var);

  class_Guide_gravity_init(&_H521_Curved_71_var);

  class_Guide_gravity_init(&_H521_Curved_72_var);

  class_Guide_gravity_init(&_H521_Curved_73_var);

  class_Guide_gravity_init(&_H521_Curved_74_var);

  class_Guide_gravity_init(&_H521_Curved_75_var);

  class_Guide_gravity_init(&_H521_Curved_76_var);

  class_Guide_gravity_init(&_H521_Curved_77_var);

  class_Guide_gravity_init(&_H521_Curved_78_var);

  class_Guide_gravity_init(&_H521_Curved_79_var);

  class_Guide_gravity_init(&_H521_Curved_80_var);

  class_Guide_gravity_init(&_H521_Curved_preVTE_var);

  class_PowderN_init(&_HCS_Al_82_var);

  class_Monitor_nD_init(&_H521_VTE_var);

  class_PowderN_init(&_HCS_Al_84_var);

  class_Guide_gravity_init(&_H521_Curved_85_var);

  class_Guide_gravity_init(&_H521_Curved_86_var);

  class_Guide_gravity_init(&_H521_Curved_87_var);

  class_Guide_gravity_init(&_H521_Curved_88_var);

  class_Guide_gravity_init(&_H521_Curved_89_var);

  class_Guide_gravity_init(&_H521_Curved_90_var);

  class_Guide_gravity_init(&_H521_Curved_91_var);

  class_Guide_gravity_init(&_H521_Curved_92_var);

  class_Guide_gravity_init(&_H521_Curved_93_var);

  class_Guide_gravity_init(&_H521_Curved_94_var);

  class_Guide_gravity_init(&_H521_Curved_95_var);

  class_Guide_gravity_init(&_H521_Curved_96_var);

  class_Guide_gravity_init(&_H521_Curved_97_var);

  class_Guide_gravity_init(&_H521_Curved_98_var);

  class_Guide_gravity_init(&_H521_Curved_99_var);

  class_Guide_gravity_init(&_H521_Curved_100_var);

  class_Guide_gravity_init(&_H521_Curved_101_var);

  class_Guide_gravity_init(&_H521_Curved_102_var);

  class_Guide_gravity_init(&_H521_Curved_103_var);

  class_Guide_gravity_init(&_H521_Curved_104_var);

  class_Guide_gravity_init(&_H521_Curved_105_var);

  class_Guide_gravity_init(&_H521_Curved_106_var);

  class_Guide_gravity_init(&_H521_Curved_107_var);

  class_PowderN_init(&_HCS_Al_108_var);

  class_Monitor_nD_init(&_H521_Curved_Out_var);

  class_Guide_gravity_init(&_H521_Straight_var);

  class_Monitor_nD_init(&_H521_Straight_Out_var);

  class_PowderN_init(&_HCS_Al_112_var);

  class_Monitor_nD_init(&_H521_D16_Monochromator_Cradle_var);

  class_Monochromator_curved_init(&_H521_D16_Monochromator_var);



  class_Monitor_nD_init(&_H521_D16_Sample_Div_var);

  class_Monitor_nD_init(&_H521_D16_Sample_XY_var);

  class_Monitor_nD_init(&_H521_D16_Sample_L_var);

  class_Isotropic_Sqw_init(&_H521_D16_Sample_var);

  class_Monitor_nD_init(&_H521_D16_Detector_var);

  class_Monitor_nD_init(&_H521_D16_Spectrometer_var);

  class_Monitor_nD_init(&_H521_D16_Diffractometer_var);


  class_PowderN_init(&_HCS_Al_125_var);


  class_Guide_gravity_init(&_H521_P6_var);

  class_PowderN_init(&_HCS_Al_128_var);

  class_Monitor_nD_init(&_H521_SADAM_Monochromator_Cradle_var);

  class_Monochromator_curved_init(&_H521_SADAM_Monochromator_var);


  class_Monitor_nD_init(&_H521_SADAM_Sample_Div_var);

  class_Monitor_nD_init(&_H521_SADAM_Sample_XY_var);

  class_Monitor_nD_init(&_H521_SADAM_Sample_L_var);

  class_Isotropic_Sqw_init(&_H521_SADAM_Sample_var);

  class_Monitor_nD_init(&_H521_SADAM_Detector_var);

  class_Monitor_nD_init(&_H521_SADAM_Spectrometer_var);

  class_Monitor_nD_init(&_H521_SADAM_Diffractometer_var);


  class_Guide_gravity_init(&_H522_Curved_var);

  class_Guide_gravity_init(&_H522_Curved_141_var);

  class_Guide_gravity_init(&_H522_Curved_142_var);

  class_Guide_gravity_init(&_H522_Curved_143_var);

  class_Guide_gravity_init(&_H522_Curved_144_var);

  class_Guide_gravity_init(&_H522_Curved_145_var);

  class_Guide_gravity_init(&_H522_Curved_146_var);

  class_Guide_gravity_init(&_H522_Curved_147_var);

  class_Guide_gravity_init(&_H522_Curved_148_var);

  class_Guide_gravity_init(&_H522_Curved_149_var);

  class_PowderN_init(&_HCS_Al_150_var);

  class_Monitor_nD_init(&_H522_VTE_var);

  class_PowderN_init(&_HCS_Al_152_var);

  class_Guide_gravity_init(&_H523_Curved_153_var);

  class_Guide_gravity_init(&_H523_Curved_154_var);

  class_Guide_gravity_init(&_H523_Curved_155_var);

  class_Guide_gravity_init(&_H523_Curved_156_var);

  class_Guide_gravity_init(&_H523_Curved_157_var);

  class_Guide_gravity_init(&_H522_Curved_158_var);

  class_Guide_gravity_init(&_H522_Curved_159_var);

  class_Guide_gravity_init(&_H522_Curved_160_var);

  class_Guide_gravity_init(&_H522_Curved_161_var);

  class_Guide_gravity_init(&_H522_Curved_162_var);

  class_Guide_gravity_init(&_H522_Curved_163_var);

  class_Guide_gravity_init(&_H522_Curved_164_var);

  class_Guide_gravity_init(&_H522_Curved_165_var);

  class_Guide_gravity_init(&_H522_Curved_166_var);

  class_Guide_gravity_init(&_H522_Curved_167_var);

  class_Guide_gravity_init(&_H522_Curved_168_var);

  class_Guide_gravity_init(&_H522_Curved_169_var);

  class_Guide_gravity_init(&_H522_Curved_170_var);

  class_Guide_gravity_init(&_H522_Curved_171_var);

  class_Guide_gravity_init(&_H522_Curved_172_var);

  class_Guide_gravity_init(&_H522_Curved_173_var);

  class_Guide_gravity_init(&_H522_Curved_174_var);

  class_Guide_gravity_init(&_H522_Curved_175_var);

  class_Guide_gravity_init(&_H522_Curved_176_var);

  class_Guide_gravity_init(&_H522_Curved_177_var);

  class_PowderN_init(&_HCS_Al_178_var);

  class_Monitor_nD_init(&_H522_Curved_Out_XY_var);

  class_Monitor_nD_init(&_H522_Curved_Out_XL_var);

  class_V_selector_init(&_WASP_Vselector_var);

  class_PowderN_init(&_HCS_Al_182_var);

  class_Guide_gravity_init(&_H522_Straight_var);

  class_PowderN_init(&_HCS_Al_184_var);

  class_Monitor_nD_init(&_H522_Vsel_L_var);


  class_Pol_mirror_init(&_WASP_polariser_var);


  class_Monitor_nD_init(&_H522_mirror_ReflectXY_var);

  class_Monitor_nD_init(&_H522_mirror_TransmitXY_var);

  class_Monitor_nD_init(&_H522_mirror_outdXY_var);

  class_Pol_guide_vmirror_init(&_WASP_Vpolariser_var);

  class_Guide_gravity_init(&_H522_Straight_Last_var);

  class_Monitor_nD_init(&_H522_WASP_Sample_Div_var);

  class_Monitor_nD_init(&_H522_WASP_Sample_XY_var);

  class_Monitor_nD_init(&_H522_WASP_Sample_L_var);

  class_Incoherent_init(&_H522_WASP_Sample_var);

  class_Monitor_nD_init(&_H522_WASP_Detector_var);

  class_Monitor_nD_init(&_H522_WASP_Spectrometer_var);

  class_Monitor_nD_init(&_H522_WASP_Diffractometer_var);


  class_Guide_gravity_init(&_H523_Curved_var);

  class_Guide_gravity_init(&_H523_Curved_203_var);

  class_Guide_gravity_init(&_H523_Curved_204_var);

  class_Guide_gravity_init(&_H523_Curved_205_var);

  class_Guide_gravity_init(&_H523_Curved_206_var);

  class_PowderN_init(&_HCS_Al_207_var);

  class_Monitor_nD_init(&_H523_VTE_var);

  class_PowderN_init(&_HCS_Al_209_var);

  class_Guide_gravity_init(&_H523_Curved_210_var);

  class_Guide_gravity_init(&_H523_Curved_211_var);

  class_Guide_gravity_init(&_H523_Curved_212_var);

  class_Guide_gravity_init(&_H523_Curved_213_var);

  class_Guide_gravity_init(&_H523_Curved_214_var);

  class_Guide_gravity_init(&_H523_Curved_215_var);

  class_Guide_gravity_init(&_H523_Curved_216_var);

  class_Guide_gravity_init(&_H523_Curved_217_var);

  class_Guide_gravity_init(&_H523_Curved_218_var);

  class_Guide_gravity_init(&_H523_Curved_219_var);

  class_Guide_gravity_init(&_H523_Curved_220_var);

  class_Guide_gravity_init(&_H523_Curved_221_var);

  class_Guide_gravity_init(&_H523_Curved_222_var);

  class_Guide_gravity_init(&_H523_Curved_223_var);

  class_Guide_gravity_init(&_H523_Curved_224_var);

  class_Guide_gravity_init(&_H523_Curved_225_var);

  class_Guide_gravity_init(&_H523_Curved_226_var);

  class_Guide_gravity_init(&_H523_Curved_227_var);

  class_Guide_gravity_init(&_H523_Curved_228_var);

  class_Guide_gravity_init(&_H523_Curved_229_var);

  class_PowderN_init(&_HCS_Al_230_var);


  class_Monitor_nD_init(&_H523_CryoEDM_In_L_var);


  class_Pol_mirror_init(&_H523_CryoEDM_polariser_var);


  class_Monitor_nD_init(&_H523_CryoEDM_mirror_ReflectXY_var);

  class_Monitor_nD_init(&_H523_CryoEDM_mirror_TransmitXY_var);

  class_Monitor_nD_init(&_H523_CryoEDM_Sample_L_var);

  class_Monitor_nD_init(&_H523_CryoEDM_Sample_Div_var);

  class_Monitor_nD_init(&_H523_CryoEDM_Sample_XY_var);


  class_Guide_gravity_init(&_H51_inpile_var);

  class_Guide_gravity_init(&_H51_Obt_1_var);

  class_Guide_gravity_init(&_H51_Obt_2_var);

  class_Guide_gravity_init(&_H51_Obt_3_var);

  class_PowderN_init(&_HCS_Al_246_var);

  class_Monitor_nD_init(&_H51_Obt_Out_var);

  class_PowderN_init(&_HCS_Al_248_var);

  class_Guide_gravity_init(&_H51_S2_var);

  class_Guide_gravity_init(&_H51_S2_250_var);

  class_Guide_gravity_init(&_H51_S2_251_var);

  class_PowderN_init(&_HCS_Al_H51_var);

  class_Monitor_nD_init(&_H51_S2_Out_var);

  class_Monitor_nD_init(&_H51_split_2_var);

  class_Monitor_nD_init(&_H51_split_1_var);



  class_Pol_mirror_init(&_IN15_polariser_var);


  class_Monitor_nD_init(&_H511_mirror_ReflectXY_var);

  class_Monitor_nD_init(&_H511_mirror_TransmitXY_var);

  class_Monitor_nD_init(&_H511_mirror_outdXY_var);

  class_Guide_gravity_init(&_H511_S3_var);

  class_Guide_gravity_init(&_H511_S9_var);

  class_PowderN_init(&_HCS_Al_265_var);

  class_Monitor_nD_init(&_H511_VTE_var);

  class_PowderN_init(&_HCS_Al_267_var);

  class_Guide_gravity_init(&_H511_S10_var);

  class_V_selector_init(&_IN15_Vselector_var);

  class_Guide_gravity_init(&_H511_BeforeV_var);

  class_Pol_guide_vmirror_init(&_IN15_Vpolariser_var);

  class_Guide_gravity_init(&_H511_AfterV_var);

  class_Monitor_nD_init(&_H511_IN15_Sample_Div_var);

  class_Monitor_nD_init(&_H511_IN15_Sample_XY_var);

  class_Monitor_nD_init(&_H511_IN15_Sample_L_var);

  class_Incoherent_init(&_H511_IN15_Sample_var);

  class_Monitor_nD_init(&_H511_IN15_Detector_var);

  class_Monitor_nD_init(&_H511_IN15_Spectrometer_var);

  class_Monitor_nD_init(&_H511_IN15_Diffractometer_var);


  class_Guide_gravity_init(&_H512_S36_var);

  class_Guide_gravity_init(&_H512_S36_282_var);

  class_Guide_gravity_init(&_H512_S36_283_var);

  class_Guide_gravity_init(&_H512_S36_284_var);

  class_Guide_gravity_init(&_H512_S36_285_var);

  class_Guide_gravity_init(&_H512_S36_286_var);

  class_Guide_gravity_init(&_H512_S36_287_var);

  class_Guide_gravity_init(&_H512_S36_288_var);

  class_Guide_gravity_init(&_H512_S36_289_var);

  class_Guide_gravity_init(&_H512_S36_290_var);

  class_Guide_gravity_init(&_H512_S36_291_var);

  class_Guide_gravity_init(&_H512_S36_292_var);

  class_Guide_gravity_init(&_H512_S36_293_var);

  class_Guide_gravity_init(&_H512_S36_294_var);

  class_Guide_gravity_init(&_H512_S36_295_var);

  class_Guide_gravity_init(&_H512_S36_296_var);

  class_PowderN_init(&_HCS_Al_H512_var);

  class_Monitor_nD_init(&_H512_VTE_var);

  class_PowderN_init(&_HCS_Al_299_var);

  class_Guide_gravity_init(&_H51_S78_var);

  class_Guide_gravity_init(&_H51_S78_301_var);

  class_Guide_gravity_init(&_H51_S78_302_var);

  class_Guide_gravity_init(&_H51_S78_303_var);

  class_PowderN_init(&_HCS_Al_304_var);

  class_Guide_gravity_init(&_H512_S11_var);

  class_PowderN_init(&_HCS_Al_306_var);

  class_Monitor_nD_init(&_D22_PreV_var);

  class_V_selector_init(&_D22_Vselector_var);

  class_Guide_gravity_init(&_D22_Collimation_var);


  class_Monitor_nD_init(&_H51_D22_Sample_Div_var);

  class_Monitor_nD_init(&_H51_D22_Sample_XY_var);

  class_Monitor_nD_init(&_H51_D22_Sample_L_var);

  class_Isotropic_Sqw_init(&_H51_D22_Sample_var);

  class_Monitor_nD_init(&_D22_Detector_var);

  class_Shape_init(&_D22_Detector_vessel_var);

  class_Shape_init(&_BOG_var);

  class_Shape_init(&_H53_ThALES_Drum_var);

  class_Shape_init(&_H521_D16_Drum_var);

  class_Shape_init(&_H521_SADAM_Drum_var);

  class_Shape_init(&_Traversee_var);


  class_Shape_init(&_Core_var);

  class_Shape_init(&_D2O_Vessel_var);

  class_Shape_init(&_H2O_Vessel_var);

  if (mcdotrace) display();
  DEBUG_INSTR_END();

#ifdef OPENACC
#include <openacc.h>
#pragma acc update device(_Origin_var)
#pragma acc update device(_HCS_var)
#pragma acc update device(_HCS_Al_var)
#pragma acc update device(_HCS_Al_4_var)
#pragma acc update device(_HCS_Al_5_var)
#pragma acc update device(_HCS_Al_6_var)
#pragma acc update device(_HCS_Al_7_var)
#pragma acc update device(_H5_var)
#pragma acc update device(_H5_rect_var)
#pragma acc update device(_H53_origin_var)
#pragma acc update device(_H52_origin_var)
#pragma acc update device(_H51_origin_var)
#pragma acc update device(_H53_start_var)
#pragma acc update device(_H53_inpile_var)
#pragma acc update device(_H53_Al_var)
#pragma acc update device(_H53_Obt_var)
#pragma acc update device(_HCS_Al_17_var)
#pragma acc update device(_H53_Obt_Out_var)
#pragma acc update device(_HCS_Al_19_var)
#pragma acc update device(_H53_VSComC1_var)
#pragma acc update device(_HCS_Al_21_var)
#pragma acc update device(_H53_Nose_var)
#pragma acc update device(_HCS_Al_23_var)
#pragma acc update device(_H53_ThALES_Monochromator_Cradle_var)
#pragma acc update device(_H53_ThALES_Monochromator_var)
#pragma acc update device(_H53_ThALES_Monochromator_Jumper_var)
#pragma acc update device(_H53_ThALES_Monochromator_Out_var)
#pragma acc update device(_H53_ThALES_Sample_Div_var)
#pragma acc update device(_H53_ThALES_Sample_XY_var)
#pragma acc update device(_H53_ThALES_Sample_L_var)
#pragma acc update device(_H53_ThALES_Sample_var)
#pragma acc update device(_H53_ThALES_Spectrometer_var)
#pragma acc update device(_H53_ThALES_Diffractometer_var)
#pragma acc update device(_Sample_Out_var)
#pragma acc update device(_SC3_var)
#pragma acc update device(_Ana_Cradle_var)
#pragma acc update device(_PG2Xtal_var)
#pragma acc update device(_Ana_Out_var)
#pragma acc update device(_SC4_var)
#pragma acc update device(_He3H_var)
#pragma acc update device(_H53_ThALES_Transmit_var)
#pragma acc update device(_H53_ThALES_TransmitXY_var)
#pragma acc update device(_H52_start_var)
#pragma acc update device(_H52_inpile_var)
#pragma acc update device(_H52_Common_var)
#pragma acc update device(_H52_Common_46_var)
#pragma acc update device(_H52_Common_3_var)
#pragma acc update device(_HCS_Al_48_var)
#pragma acc update device(_H52_Obt_Out_var)
#pragma acc update device(_HCS_Al_50_var)
#pragma acc update device(_H52_Common_51_var)
#pragma acc update device(_H52_Common_52_var)
#pragma acc update device(_H52_Common_53_var)
#pragma acc update device(_H52_Common_54_var)
#pragma acc update device(_H52_Common_55_var)
#pragma acc update device(_H52_Common_56_var)
#pragma acc update device(_H52_Common_57_var)
#pragma acc update device(_H52_Common_58_var)
#pragma acc update device(_H52_Common_59_var)
#pragma acc update device(_H52_Common_60_var)
#pragma acc update device(_H52_Common_61_var)
#pragma acc update device(_H52_Common_62_var)
#pragma acc update device(_H52_Common_63_var)
#pragma acc update device(_HCS_Al_64_var)
#pragma acc update device(_H52_Common_Out_var)
#pragma acc update device(_H523_origin_var)
#pragma acc update device(_H521_origin_var)
#pragma acc update device(_H522_origin_var)
#pragma acc update device(_H521_start_var)
#pragma acc update device(_H521_Curved_var)
#pragma acc update device(_H521_Curved_71_var)
#pragma acc update device(_H521_Curved_72_var)
#pragma acc update device(_H521_Curved_73_var)
#pragma acc update device(_H521_Curved_74_var)
#pragma acc update device(_H521_Curved_75_var)
#pragma acc update device(_H521_Curved_76_var)
#pragma acc update device(_H521_Curved_77_var)
#pragma acc update device(_H521_Curved_78_var)
#pragma acc update device(_H521_Curved_79_var)
#pragma acc update device(_H521_Curved_80_var)
#pragma acc update device(_H521_Curved_preVTE_var)
#pragma acc update device(_HCS_Al_82_var)
#pragma acc update device(_H521_VTE_var)
#pragma acc update device(_HCS_Al_84_var)
#pragma acc update device(_H521_Curved_85_var)
#pragma acc update device(_H521_Curved_86_var)
#pragma acc update device(_H521_Curved_87_var)
#pragma acc update device(_H521_Curved_88_var)
#pragma acc update device(_H521_Curved_89_var)
#pragma acc update device(_H521_Curved_90_var)
#pragma acc update device(_H521_Curved_91_var)
#pragma acc update device(_H521_Curved_92_var)
#pragma acc update device(_H521_Curved_93_var)
#pragma acc update device(_H521_Curved_94_var)
#pragma acc update device(_H521_Curved_95_var)
#pragma acc update device(_H521_Curved_96_var)
#pragma acc update device(_H521_Curved_97_var)
#pragma acc update device(_H521_Curved_98_var)
#pragma acc update device(_H521_Curved_99_var)
#pragma acc update device(_H521_Curved_100_var)
#pragma acc update device(_H521_Curved_101_var)
#pragma acc update device(_H521_Curved_102_var)
#pragma acc update device(_H521_Curved_103_var)
#pragma acc update device(_H521_Curved_104_var)
#pragma acc update device(_H521_Curved_105_var)
#pragma acc update device(_H521_Curved_106_var)
#pragma acc update device(_H521_Curved_107_var)
#pragma acc update device(_HCS_Al_108_var)
#pragma acc update device(_H521_Curved_Out_var)
#pragma acc update device(_H521_Straight_var)
#pragma acc update device(_H521_Straight_Out_var)
#pragma acc update device(_HCS_Al_112_var)
#pragma acc update device(_H521_D16_Monochromator_Cradle_var)
#pragma acc update device(_H521_D16_Monochromator_var)
#pragma acc update device(_H521_D16_Monochromator_Jumper_var)
#pragma acc update device(_H521_D16_Monochromator_Out_var)
#pragma acc update device(_H521_D16_Sample_Div_var)
#pragma acc update device(_H521_D16_Sample_XY_var)
#pragma acc update device(_H521_D16_Sample_L_var)
#pragma acc update device(_H521_D16_Sample_var)
#pragma acc update device(_H521_D16_Detector_var)
#pragma acc update device(_H521_D16_Spectrometer_var)
#pragma acc update device(_H521_D16_Diffractometer_var)
#pragma acc update device(_H521_D16_Transmit_var)
#pragma acc update device(_HCS_Al_125_var)
#pragma acc update device(_H521_P6_Start_var)
#pragma acc update device(_H521_P6_var)
#pragma acc update device(_HCS_Al_128_var)
#pragma acc update device(_H521_SADAM_Monochromator_Cradle_var)
#pragma acc update device(_H521_SADAM_Monochromator_var)
#pragma acc update device(_H521_SADAM_Monochromator_Out_var)
#pragma acc update device(_H521_SADAM_Sample_Div_var)
#pragma acc update device(_H521_SADAM_Sample_XY_var)
#pragma acc update device(_H521_SADAM_Sample_L_var)
#pragma acc update device(_H521_SADAM_Sample_var)
#pragma acc update device(_H521_SADAM_Detector_var)
#pragma acc update device(_H521_SADAM_Spectrometer_var)
#pragma acc update device(_H521_SADAM_Diffractometer_var)
#pragma acc update device(_H522_start_var)
#pragma acc update device(_H522_Curved_var)
#pragma acc update device(_H522_Curved_141_var)
#pragma acc update device(_H522_Curved_142_var)
#pragma acc update device(_H522_Curved_143_var)
#pragma acc update device(_H522_Curved_144_var)
#pragma acc update device(_H522_Curved_145_var)
#pragma acc update device(_H522_Curved_146_var)
#pragma acc update device(_H522_Curved_147_var)
#pragma acc update device(_H522_Curved_148_var)
#pragma acc update device(_H522_Curved_149_var)
#pragma acc update device(_HCS_Al_150_var)
#pragma acc update device(_H522_VTE_var)
#pragma acc update device(_HCS_Al_152_var)
#pragma acc update device(_H523_Curved_153_var)
#pragma acc update device(_H523_Curved_154_var)
#pragma acc update device(_H523_Curved_155_var)
#pragma acc update device(_H523_Curved_156_var)
#pragma acc update device(_H523_Curved_157_var)
#pragma acc update device(_H522_Curved_158_var)
#pragma acc update device(_H522_Curved_159_var)
#pragma acc update device(_H522_Curved_160_var)
#pragma acc update device(_H522_Curved_161_var)
#pragma acc update device(_H522_Curved_162_var)
#pragma acc update device(_H522_Curved_163_var)
#pragma acc update device(_H522_Curved_164_var)
#pragma acc update device(_H522_Curved_165_var)
#pragma acc update device(_H522_Curved_166_var)
#pragma acc update device(_H522_Curved_167_var)
#pragma acc update device(_H522_Curved_168_var)
#pragma acc update device(_H522_Curved_169_var)
#pragma acc update device(_H522_Curved_170_var)
#pragma acc update device(_H522_Curved_171_var)
#pragma acc update device(_H522_Curved_172_var)
#pragma acc update device(_H522_Curved_173_var)
#pragma acc update device(_H522_Curved_174_var)
#pragma acc update device(_H522_Curved_175_var)
#pragma acc update device(_H522_Curved_176_var)
#pragma acc update device(_H522_Curved_177_var)
#pragma acc update device(_HCS_Al_178_var)
#pragma acc update device(_H522_Curved_Out_XY_var)
#pragma acc update device(_H522_Curved_Out_XL_var)
#pragma acc update device(_WASP_Vselector_var)
#pragma acc update device(_HCS_Al_182_var)
#pragma acc update device(_H522_Straight_var)
#pragma acc update device(_HCS_Al_184_var)
#pragma acc update device(_H522_Vsel_L_var)
#pragma acc update device(_H522_mirror_centre_var)
#pragma acc update device(_WASP_polariser_var)
#pragma acc update device(_H522_mirror_outdir_var)
#pragma acc update device(_H522_mirror_ReflectXY_var)
#pragma acc update device(_H522_mirror_TransmitXY_var)
#pragma acc update device(_H522_mirror_outdXY_var)
#pragma acc update device(_WASP_Vpolariser_var)
#pragma acc update device(_H522_Straight_Last_var)
#pragma acc update device(_H522_WASP_Sample_Div_var)
#pragma acc update device(_H522_WASP_Sample_XY_var)
#pragma acc update device(_H522_WASP_Sample_L_var)
#pragma acc update device(_H522_WASP_Sample_var)
#pragma acc update device(_H522_WASP_Detector_var)
#pragma acc update device(_H522_WASP_Spectrometer_var)
#pragma acc update device(_H522_WASP_Diffractometer_var)
#pragma acc update device(_H523_start_var)
#pragma acc update device(_H523_Curved_var)
#pragma acc update device(_H523_Curved_203_var)
#pragma acc update device(_H523_Curved_204_var)
#pragma acc update device(_H523_Curved_205_var)
#pragma acc update device(_H523_Curved_206_var)
#pragma acc update device(_HCS_Al_207_var)
#pragma acc update device(_H523_VTE_var)
#pragma acc update device(_HCS_Al_209_var)
#pragma acc update device(_H523_Curved_210_var)
#pragma acc update device(_H523_Curved_211_var)
#pragma acc update device(_H523_Curved_212_var)
#pragma acc update device(_H523_Curved_213_var)
#pragma acc update device(_H523_Curved_214_var)
#pragma acc update device(_H523_Curved_215_var)
#pragma acc update device(_H523_Curved_216_var)
#pragma acc update device(_H523_Curved_217_var)
#pragma acc update device(_H523_Curved_218_var)
#pragma acc update device(_H523_Curved_219_var)
#pragma acc update device(_H523_Curved_220_var)
#pragma acc update device(_H523_Curved_221_var)
#pragma acc update device(_H523_Curved_222_var)
#pragma acc update device(_H523_Curved_223_var)
#pragma acc update device(_H523_Curved_224_var)
#pragma acc update device(_H523_Curved_225_var)
#pragma acc update device(_H523_Curved_226_var)
#pragma acc update device(_H523_Curved_227_var)
#pragma acc update device(_H523_Curved_228_var)
#pragma acc update device(_H523_Curved_229_var)
#pragma acc update device(_HCS_Al_230_var)
#pragma acc update device(_H523_CryoEDM_In_var)
#pragma acc update device(_H523_CryoEDM_In_L_var)
#pragma acc update device(_H523_CryoEDM_mirror_center_var)
#pragma acc update device(_H523_CryoEDM_polariser_var)
#pragma acc update device(_H523_CryoEDM_mirror_outdir_var)
#pragma acc update device(_H523_CryoEDM_mirror_ReflectXY_var)
#pragma acc update device(_H523_CryoEDM_mirror_TransmitXY_var)
#pragma acc update device(_H523_CryoEDM_Sample_L_var)
#pragma acc update device(_H523_CryoEDM_Sample_Div_var)
#pragma acc update device(_H523_CryoEDM_Sample_XY_var)
#pragma acc update device(_H51_start_var)
#pragma acc update device(_H51_inpile_var)
#pragma acc update device(_H51_Obt_1_var)
#pragma acc update device(_H51_Obt_2_var)
#pragma acc update device(_H51_Obt_3_var)
#pragma acc update device(_HCS_Al_246_var)
#pragma acc update device(_H51_Obt_Out_var)
#pragma acc update device(_HCS_Al_248_var)
#pragma acc update device(_H51_S2_var)
#pragma acc update device(_H51_S2_250_var)
#pragma acc update device(_H51_S2_251_var)
#pragma acc update device(_HCS_Al_H51_var)
#pragma acc update device(_H51_S2_Out_var)
#pragma acc update device(_H51_split_2_var)
#pragma acc update device(_H51_split_1_var)
#pragma acc update device(_H511_Start_var)
#pragma acc update device(_H511_mirror_centre_var)
#pragma acc update device(_IN15_polariser_var)
#pragma acc update device(_H511_mirror_outdir_var)
#pragma acc update device(_H511_mirror_ReflectXY_var)
#pragma acc update device(_H511_mirror_TransmitXY_var)
#pragma acc update device(_H511_mirror_outdXY_var)
#pragma acc update device(_H511_S3_var)
#pragma acc update device(_H511_S9_var)
#pragma acc update device(_HCS_Al_265_var)
#pragma acc update device(_H511_VTE_var)
#pragma acc update device(_HCS_Al_267_var)
#pragma acc update device(_H511_S10_var)
#pragma acc update device(_IN15_Vselector_var)
#pragma acc update device(_H511_BeforeV_var)
#pragma acc update device(_IN15_Vpolariser_var)
#pragma acc update device(_H511_AfterV_var)
#pragma acc update device(_H511_IN15_Sample_Div_var)
#pragma acc update device(_H511_IN15_Sample_XY_var)
#pragma acc update device(_H511_IN15_Sample_L_var)
#pragma acc update device(_H511_IN15_Sample_var)
#pragma acc update device(_H511_IN15_Detector_var)
#pragma acc update device(_H511_IN15_Spectrometer_var)
#pragma acc update device(_H511_IN15_Diffractometer_var)
#pragma acc update device(_H512_Start_var)
#pragma acc update device(_H512_S36_var)
#pragma acc update device(_H512_S36_282_var)
#pragma acc update device(_H512_S36_283_var)
#pragma acc update device(_H512_S36_284_var)
#pragma acc update device(_H512_S36_285_var)
#pragma acc update device(_H512_S36_286_var)
#pragma acc update device(_H512_S36_287_var)
#pragma acc update device(_H512_S36_288_var)
#pragma acc update device(_H512_S36_289_var)
#pragma acc update device(_H512_S36_290_var)
#pragma acc update device(_H512_S36_291_var)
#pragma acc update device(_H512_S36_292_var)
#pragma acc update device(_H512_S36_293_var)
#pragma acc update device(_H512_S36_294_var)
#pragma acc update device(_H512_S36_295_var)
#pragma acc update device(_H512_S36_296_var)
#pragma acc update device(_HCS_Al_H512_var)
#pragma acc update device(_H512_VTE_var)
#pragma acc update device(_HCS_Al_299_var)
#pragma acc update device(_H51_S78_var)
#pragma acc update device(_H51_S78_301_var)
#pragma acc update device(_H51_S78_302_var)
#pragma acc update device(_H51_S78_303_var)
#pragma acc update device(_HCS_Al_304_var)
#pragma acc update device(_H512_S11_var)
#pragma acc update device(_HCS_Al_306_var)
#pragma acc update device(_D22_PreV_var)
#pragma acc update device(_D22_Vselector_var)
#pragma acc update device(_D22_Collimation_var)
#pragma acc update device(_D22_Sample_Pos_var)
#pragma acc update device(_H51_D22_Sample_Div_var)
#pragma acc update device(_H51_D22_Sample_XY_var)
#pragma acc update device(_H51_D22_Sample_L_var)
#pragma acc update device(_H51_D22_Sample_var)
#pragma acc update device(_D22_Detector_var)
#pragma acc update device(_D22_Detector_vessel_var)
#pragma acc update device(_BOG_var)
#pragma acc update device(_H53_ThALES_Drum_var)
#pragma acc update device(_H521_D16_Drum_var)
#pragma acc update device(_H521_SADAM_Drum_var)
#pragma acc update device(_Traversee_var)
#pragma acc update device(_Core_Centre_var)
#pragma acc update device(_Core_var)
#pragma acc update device(_D2O_Vessel_var)
#pragma acc update device(_H2O_Vessel_var)
#pragma acc update device(_instrument_var)
#endif

  return(0);
} /* init */

/*******************************************************************************
* components TRACE
*******************************************************************************/

#define x (_particle->x)
#define y (_particle->y)
#define z (_particle->z)
#define vx (_particle->vx)
#define vy (_particle->vy)
#define vz (_particle->vz)
#define t (_particle->t)
#define sx (_particle->sx)
#define sy (_particle->sy)
#define sz (_particle->sz)
#define p (_particle->p)
#define mcgravitation (_particle->mcgravitation)
#define mcMagnet (_particle->mcMagnet)
#define allow_backprop (_particle->allow_backprop)
#define _mctmp_a (_particle->_mctmp_a)
#define _mctmp_b (_particle->_mctmp_b)
#define _mctmp_c (_particle->_mctmp_c)
/* if on GPU, globally nullify sprintf,fprintf,printfs   */
/* (Similar defines are available in each comp trace but */
/*  those are not enough to handle external libs etc. )  */
#ifdef OPENACC
#define fprintf(stderr,...) printf(__VA_ARGS__)
#define sprintf(string,...) printf(__VA_ARGS__)
#define exit(...) noprintf()
#define strcmp(a,b) str_comp(a,b)
#define strlen(a) str_len(a)
#endif
#define SCATTERED (_particle->_scattered)
#define RESTORE (_particle->_restore)
#define RESTORE_NEUTRON(_index, ...) _particle->_restore = _index;
#define ABSORB0 do { DEBUG_STATE(); DEBUG_ABSORB(); MAGNET_OFF; ABSORBED++; return; } while(0)
#define ABSORBED (_particle->_absorbed)
#define mcget_run_num() _particle->_uid
#define ABSORB ABSORB0
#pragma acc routine
void class_Progress_bar_trace(_class_Progress_bar *_comp
  , _class_particle *_particle) {
  ABSORBED=SCATTERED=RESTORE=0;
  #define profile (_comp->_parameters.profile)
  #define percent (_comp->_parameters.percent)
  #define flag_save (_comp->_parameters.flag_save)
  #define minutes (_comp->_parameters.minutes)
  #define IntermediateCnts (_comp->_parameters.IntermediateCnts)
  #define StartTime (_comp->_parameters.StartTime)
  #define EndTime (_comp->_parameters.EndTime)
  #define CurrentTime (_comp->_parameters.CurrentTime)
  #define infostring (_comp->_parameters.infostring)
  SIG_MESSAGE("[_Origin_trace] component Origin=Progress_bar() TRACE [Progress_bar:0]");

  #ifndef OPENACC
  double ncount;
  ncount = mcget_run_num ();
  if (!StartTime) {
    time (&StartTime); /* compute starting time */
    IntermediateCnts = 1e3;
  }
  time_t NowTime;
  time (&NowTime);
  /* compute initial estimate of computation duration */
  if (!EndTime && ncount >= IntermediateCnts) {
    CurrentTime = NowTime;
    if (difftime (NowTime, StartTime) > 10 && ncount) { /* wait 10 sec before writing ETA */
      EndTime = StartTime + (time_t)(difftime (NowTime, StartTime) * (double)mcget_ncount () / ncount);
      IntermediateCnts = 0;
      MPI_MASTER (fprintf (stdout, "\nTrace ETA "); fprintf (stdout, "%s", infostring);
                  if (difftime (EndTime, StartTime) < 60.0) fprintf (stdout, "%g [s] ", difftime (EndTime, StartTime));
                  else if (difftime (EndTime, StartTime) > 3600.0) fprintf (stdout, "%g [h] ", difftime (EndTime, StartTime) / 3600.0);
                  else fprintf (stdout, "%g [min] ", difftime (EndTime, StartTime) / 60.0); fprintf (stdout, "\n"););
    } else
      IntermediateCnts += 1e3;
    fflush (stdout);
  }

  /* display percentage when percent or minutes have reached step */
  if (EndTime && mcget_ncount () && ((minutes && difftime (NowTime, CurrentTime) > minutes * 60) || (percent && !minutes && ncount >= IntermediateCnts))) {
    MPI_MASTER (fprintf (stdout, "%llu %%\n", (unsigned long long)(ncount * 100.0 / mcget_ncount ())); fflush (stdout););
    CurrentTime = NowTime;

    IntermediateCnts = ncount + percent * mcget_ncount () / 100;
    /* check that next intermediate ncount check is a multiple of the desired percentage */
    IntermediateCnts = floor (IntermediateCnts * 100 / percent / mcget_ncount ()) * percent * mcget_ncount () / 100;
    /* raise flag to indicate that we did something */
    SCATTER;
    if (flag_save)
      save (NULL);
  }
  #endif
#ifndef NOABSORB_INF_NAN
  /* Check for nan or inf particle parms */ 
  if(isnan(p + t + vx + vy + vz + x + y + z)) ABSORB;
  if(isinf(fabs(p) + fabs(t) + fabs(vx) + fabs(vy) + fabs(vz) + fabs(x) + fabs(y) + fabs(z))) ABSORB;
#else
  if(isnan(p)  ||  isinf(p)) printf("NAN or INF found in p,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(t)  ||  isinf(t)) printf("NAN or INF found in t,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vx) || isinf(vx)) printf("NAN or INF found in vx, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vy) || isinf(vy)) printf("NAN or INF found in vy, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vz) || isinf(vz)) printf("NAN or INF found in vz, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(x)  ||  isinf(x)) printf("NAN or INF found in x,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(y)  ||  isinf(y)) printf("NAN or INF found in y,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(z)  ||  isinf(z)) printf("NAN or INF found in z,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
#endif
  #undef profile
  #undef percent
  #undef flag_save
  #undef minutes
  #undef IntermediateCnts
  #undef StartTime
  #undef EndTime
  #undef CurrentTime
  #undef infostring
  return;
} /* class_Progress_bar_trace */

#pragma acc routine
void class_Source_gen_trace(_class_Source_gen *_comp
  , _class_particle *_particle) {
  ABSORBED=SCATTERED=RESTORE=0;
  #define flux_file (_comp->_parameters.flux_file)
  #define xdiv_file (_comp->_parameters.xdiv_file)
  #define ydiv_file (_comp->_parameters.ydiv_file)
  #define radius (_comp->_parameters.radius)
  #define dist (_comp->_parameters.dist)
  #define focus_xw (_comp->_parameters.focus_xw)
  #define focus_yh (_comp->_parameters.focus_yh)
  #define focus_aw (_comp->_parameters.focus_aw)
  #define focus_ah (_comp->_parameters.focus_ah)
  #define E0 (_comp->_parameters.E0)
  #define dE (_comp->_parameters.dE)
  #define lambda0 (_comp->_parameters.lambda0)
  #define dlambda (_comp->_parameters.dlambda)
  #define I1 (_comp->_parameters.I1)
  #define yheight (_comp->_parameters.yheight)
  #define xwidth (_comp->_parameters.xwidth)
  #define verbose (_comp->_parameters.verbose)
  #define T1 (_comp->_parameters.T1)
  #define flux_file_perAA (_comp->_parameters.flux_file_perAA)
  #define flux_file_log (_comp->_parameters.flux_file_log)
  #define Lmin (_comp->_parameters.Lmin)
  #define Lmax (_comp->_parameters.Lmax)
  #define Emin (_comp->_parameters.Emin)
  #define Emax (_comp->_parameters.Emax)
  #define T2 (_comp->_parameters.T2)
  #define I2 (_comp->_parameters.I2)
  #define T3 (_comp->_parameters.T3)
  #define I3 (_comp->_parameters.I3)
  #define zdepth (_comp->_parameters.zdepth)
  #define target_index (_comp->_parameters.target_index)
  #define p_in (_comp->_parameters.p_in)
  #define lambda1 (_comp->_parameters.lambda1)
  #define lambda2 (_comp->_parameters.lambda2)
  #define lambda3 (_comp->_parameters.lambda3)
  #define pTable (_comp->_parameters.pTable)
  #define pTable_x (_comp->_parameters.pTable_x)
  #define pTable_y (_comp->_parameters.pTable_y)
  #define pTable_xmin (_comp->_parameters.pTable_xmin)
  #define pTable_xmax (_comp->_parameters.pTable_xmax)
  #define pTable_xsum (_comp->_parameters.pTable_xsum)
  #define pTable_ymin (_comp->_parameters.pTable_ymin)
  #define pTable_ymax (_comp->_parameters.pTable_ymax)
  #define pTable_ysum (_comp->_parameters.pTable_ysum)
  #define pTable_dxmin (_comp->_parameters.pTable_dxmin)
  #define pTable_dxmax (_comp->_parameters.pTable_dxmax)
  #define pTable_dymin (_comp->_parameters.pTable_dymin)
  #define pTable_dymax (_comp->_parameters.pTable_dymax)
  SIG_MESSAGE("[_HCS_trace] component HCS=Source_gen() TRACE [Source_gen:0]");

  double dx=0,dy=0,xf,yf,rf,pdir,chi,v,r, lambda;
  double Maxwell;

  if (verbose >= 0)
  {

    z=0;

    if (radius)
    {
      chi=2*PI*rand01();                          /* Choose point on source */
      r=sqrt(rand01())*radius;                    /* with uniform distribution. */
      x=r*cos(chi);
      y=r*sin(chi);
    }
    else
    {
      x = xwidth*randpm1()/2;   /* select point on source (uniform) */
      y = yheight*randpm1()/2;
    }
    if (zdepth != 0)
      z = zdepth*randpm1()/2;
  /* Assume linear wavelength distribution */
    lambda = lambda0+dlambda*randpm1();
    if (lambda <= 0) ABSORB;
    v = K2V*(2*PI/lambda);

    if (!focus_ah && !focus_aw) {
      randvec_target_rect_real(&xf, &yf, &rf, &pdir,
       0, 0, dist, focus_xw, focus_yh, ROT_A_CURRENT_COMP, x, y, z, 2);

      dx = xf-x;
      dy = yf-y;
      rf = sqrt(dx*dx+dy*dy+dist*dist);

      vz=v*dist/rf;
      vy=v*dy/rf;
      vx=v*dx/rf;
    } else {

      randvec_target_rect_angular(&vx, &vy, &vz, &pdir,
          0, 0, 1, focus_aw*DEG2RAD, focus_ah*DEG2RAD, ROT_A_CURRENT_COMP);
      dx = vx; dy = vy; /* from unit vector */
      vx *= v; vy *= v; vz *= v;
    }
    p = p_in*pdir;

    /* spectral dependency from files or Maxwellians */

    if (flux_file && strlen(flux_file) && strcmp(flux_file,"NULL") && strcmp(flux_file,"0"))
    {
       double binwidth=Table_Value(pTable, lambda, 1);
       if (flux_file_log) binwidth=exp(binwidth);
       p *= binwidth;
    }
    else 

if (T1 > 0 && I1 > 0)
    {
      Maxwell = I1 * SG_Maxwell(lambda, T1);;  /* 1/AA */

      if ((T2 > 0) && (I2 > 0))
      {
        Maxwell += I2 * SG_Maxwell(lambda, T2);
      }
      if ((T3 > 0) && (I3 > 0))
      {
        Maxwell += I3 * SG_Maxwell(lambda, T3);;
      }
      p *= Maxwell;
    }

    /* optional x-xdiv and y-ydiv weightening: position=along columns, div=along rows */
    if (xdiv_file && strlen(xdiv_file)
      && strcmp(xdiv_file,"NULL") && strcmp(xdiv_file,"0") && pTable_xsum > 0) {
      double i,j;
      j = (x-            pTable_xmin) /(pTable_xmax -pTable_xmin) *pTable_x.columns;
      i = (atan2(dx,rf)*RAD2DEG-pTable_dxmin)/(pTable_dxmax-pTable_dxmin)*pTable_x.rows;
      r = Table_Value2d(pTable_x, i,j); /* row, column */
      p *= r/pTable_xsum;
    }
    if (ydiv_file && strlen(ydiv_file)
       && strcmp(ydiv_file,"NULL") && strcmp(ydiv_file,"0") && pTable_ysum > 0) {
      double i,j;
      j = (y-            pTable_ymin) /(pTable_ymax -pTable_ymin) *pTable_y.columns;
      i = (atan2(dy,rf)*RAD2DEG-  pTable_dymin)/(pTable_dymax-pTable_dymin)*pTable_y.rows;
      r = Table_Value2d(pTable_y, i,j);
      p *= r/pTable_ysum;
    }

    SCATTER;
  }
#ifndef NOABSORB_INF_NAN
  /* Check for nan or inf particle parms */ 
  if(isnan(p + t + vx + vy + vz + x + y + z)) ABSORB;
  if(isinf(fabs(p) + fabs(t) + fabs(vx) + fabs(vy) + fabs(vz) + fabs(x) + fabs(y) + fabs(z))) ABSORB;
#else
  if(isnan(p)  ||  isinf(p)) printf("NAN or INF found in p,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(t)  ||  isinf(t)) printf("NAN or INF found in t,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vx) || isinf(vx)) printf("NAN or INF found in vx, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vy) || isinf(vy)) printf("NAN or INF found in vy, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vz) || isinf(vz)) printf("NAN or INF found in vz, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(x)  ||  isinf(x)) printf("NAN or INF found in x,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(y)  ||  isinf(y)) printf("NAN or INF found in y,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(z)  ||  isinf(z)) printf("NAN or INF found in z,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
#endif
  #undef flux_file
  #undef xdiv_file
  #undef ydiv_file
  #undef radius
  #undef dist
  #undef focus_xw
  #undef focus_yh
  #undef focus_aw
  #undef focus_ah
  #undef E0
  #undef dE
  #undef lambda0
  #undef dlambda
  #undef I1
  #undef yheight
  #undef xwidth
  #undef verbose
  #undef T1
  #undef flux_file_perAA
  #undef flux_file_log
  #undef Lmin
  #undef Lmax
  #undef Emin
  #undef Emax
  #undef T2
  #undef I2
  #undef T3
  #undef I3
  #undef zdepth
  #undef target_index
  #undef p_in
  #undef lambda1
  #undef lambda2
  #undef lambda3
  #undef pTable
  #undef pTable_x
  #undef pTable_y
  #undef pTable_xmin
  #undef pTable_xmax
  #undef pTable_xsum
  #undef pTable_ymin
  #undef pTable_ymax
  #undef pTable_ysum
  #undef pTable_dxmin
  #undef pTable_dxmax
  #undef pTable_dymin
  #undef pTable_dymax
  return;
} /* class_Source_gen_trace */

#pragma acc routine
void class_PowderN_trace(_class_PowderN *_comp
  , _class_particle *_particle) {
  ABSORBED=SCATTERED=RESTORE=0;
  #define reflections (_comp->_parameters.reflections)
  #define geometry (_comp->_parameters.geometry)
  #define format (_comp->_parameters.format)
  #define radius (_comp->_parameters.radius)
  #define yheight (_comp->_parameters.yheight)
  #define xwidth (_comp->_parameters.xwidth)
  #define zdepth (_comp->_parameters.zdepth)
  #define thickness (_comp->_parameters.thickness)
  #define pack (_comp->_parameters.pack)
  #define Vc (_comp->_parameters.Vc)
  #define sigma_abs (_comp->_parameters.sigma_abs)
  #define sigma_inc (_comp->_parameters.sigma_inc)
  #define delta_d_d (_comp->_parameters.delta_d_d)
  #define p_inc (_comp->_parameters.p_inc)
  #define p_transmit (_comp->_parameters.p_transmit)
  #define DW (_comp->_parameters.DW)
  #define nb_atoms (_comp->_parameters.nb_atoms)
  #define d_omega (_comp->_parameters.d_omega)
  #define d_phi (_comp->_parameters.d_phi)
  #define tth_sign (_comp->_parameters.tth_sign)
  #define p_interact (_comp->_parameters.p_interact)
  #define concentric (_comp->_parameters.concentric)
  #define density (_comp->_parameters.density)
  #define weight (_comp->_parameters.weight)
  #define barns (_comp->_parameters.barns)
  #define Strain (_comp->_parameters.Strain)
  #define focus_flip (_comp->_parameters.focus_flip)
  #define target_index (_comp->_parameters.target_index)
  #define order (_comp->_parameters.order)
  #define line_info (_comp->_parameters.line_info)
  #define columns (_comp->_parameters.columns)
  #define offdata (_comp->_parameters.offdata)
  #define tgt_x (_comp->_parameters.tgt_x)
  #define tgt_y (_comp->_parameters.tgt_y)
  #define tgt_z (_comp->_parameters.tgt_z)
  SIG_MESSAGE("[_HCS_Al_trace] component HCS_Al=PowderN() TRACE [PowderN:0]");

  double t0, t1, t2, t3, v, v1, l_full, l, l_1, dt, alpha0, alpha, theta, my_s, my_s_n, sg;
  double solid_angle;
  double neutrontype = 0;
  double ntype = 0;
  double arg, tmp_vx, tmp_vy, tmp_vz, vout_x, vout_y, vout_z, nx, ny, nz, pmul = 1;
  int line;
  char intersect = 0;
  char intersecti = 0;

  // Variables calculated within thread for thread purpose only
  char type = '\0';
  int itype = 0;
  double d_phi_thread = d_phi;
  // These ones are injected back to struct at the end of TRACE in non-OpenACC case
  int nb_reuses = line_info.nb_reuses;
  int nb_refl = line_info.nb_refl;
  int nb_refl_count = line_info.nb_refl_count;
  double vcache = line_info.v;
  double Nq = line_info.Nq;
  double v_min = line_info.v_min;
  double v_max = line_info.v_max;
  double lfree = line_info.lfree;
  long xs_compute = line_info.xs_compute;
  long xs_reuse = line_info.xs_reuse;
  long xs_calls = line_info.xs_calls;
  double dq = line_info.dq;

  #ifdef OPENACC
  #ifdef USE_OFF
  off_struct thread_offdata = offdata;
  #endif
  #else
  #define thread_offdata offdata
  #endif

  if (line_info.V_0 > 0 && (line_info.count || line_info.my_inc)) {
    if (line_info.shape == 1) {
      intersect = box_intersect (&t0, &t3, x, y, z, vx, vy, vz, xwidth, yheight, zdepth);
      intersecti = box_intersect (&t1, &t2, x, y, z, vx, vy, vz, line_info.xwidth_i, line_info.yheight_i, line_info.zdepth_i);
    } else if (line_info.shape == 0) {
      intersect = cylinder_intersect (&t0, &t3, x, y, z, vx, vy, vz, radius, yheight);
      intersecti = cylinder_intersect (&t1, &t2, x, y, z, vx, vy, vz, line_info.radius_i, line_info.yheight_i);
    } else if (line_info.shape == 2) {
      intersect = sphere_intersect (&t0, &t3, x, y, z, vx, vy, vz, radius);
      intersecti = sphere_intersect (&t1, &t2, x, y, z, vx, vy, vz, line_info.radius_i);
    }
    #ifdef USE_OFF
    else if (line_info.shape == 3) {
      intersect = off_intersect (&t0, &t3, NULL, NULL, x, y, z, vx, vy, vz, 0, 0, 0, thread_offdata);
      intersecti = 0;
    }
    #endif
  }

  if (intersect && t3 > 0) {

    if (concentric) {
      /* Set up for concentric case */
      /* 'Remove' the backside of this comp */
      if (!intersecti) {
        t1 = (t3 + t0) / 2;
      }
      t2 = t1;
      t3 = t1;
      dt = -1.0 * rand01 (); /* In case of scattering we will scatter on 'forward' part of sample */
    } else {
      if (!intersecti) {
        t1 = (t3 + t0) / 2;
        t2 = t1;
      }
      dt = randpm1 (); /* Possibility to scatter at all points in line of sight */
    }

    /* Neutron enters at t=t0. */
    if (t0 < 0)
      t0 = 0; /* already in sample */
    if (t1 < 0)
      t1 = 0; /* already in inner hollow */
    if (t2 < 0)
      t2 = 0; /* already past inner hollow */
    v = sqrt (vx * vx + vy * vy + vz * vz);
    l_full = v * (t3 - t2 + t1 - t0);

    if (line_info.neutron_passed < CHAR_BUF_LENGTH) {
      if (v < v_min)
        v_min = v;
      if (v > v_max)
        v_max = v;
      line_info.neutron_passed++;
    }

    /* Calculate total scattering cross section at relevant velocity - but not on GPU*/
    #ifndef OPENACC
    if (fabs (v - vcache) < 1e-6) {
      nb_reuses++;
    } else {
      #endif
      Nq = calc_xsect (v, line_info.q_v, line_info.my_s_v2, line_info.count, &line_info.my_s_v2_sum, &line_info);
      vcache = v;
      nb_refl += Nq;
      nb_refl_count++;
      #ifndef OPENACC
    }
    #endif

    if (t3 < 0) {
      t3 = 0; /* Already past sample?! */
      if (line_info.flag_warning < 10)
        printf ("PowderN: %s: Warning: Neutron has already passed us? (Skipped).\n"
                "         In concentric geometry, this may be caused by a missing concentric=0 option in 2nd enclosing instance.\n",
                NAME_CURRENT_COMP);
      line_info.flag_warning++;
    } else {
      if (dt < 0) {                 /* Calculate scattering point position */
        dt = fabs (dt) * (t1 - t0); /* 'Forward' part */
      } else {
        dt = dt * (t3 - t2) + (t2 - t0); /* Possibly also 'backside' part */
      }
      if (order) {
        my_s = line_info.my_s_v2_sum / (v * v) + line_info.my_inc;
      } else {
        my_s = line_info.my_inc;
      }
      /* Total attenuation from scattering */
      lfree = 0;
      ntype = rand01 ();
      /* How to handle this one? Transmit (1) / Incoherent (2) / Coherent (3) ? */
      if (ntype < p_transmit) {
        neutrontype = 1;
        l = l_full; /* Passing through, full length */
        PROP_DT (t3);
      } else if (ntype >= p_transmit && ntype < (p_transmit + p_inc)) {
        neutrontype = 2;
        l = v * dt;        /* Penetration in sample */
        PROP_DT (dt + t0); /* Point of scattering */
        SCATTER;
      } else if (ntype >= p_transmit + p_inc) {
        neutrontype = 3;
        l = v * dt;        /* Penetration in sample */
        PROP_DT (dt + t0); /* Point of scattering */
        SCATTER;
      } else {
        exit (fprintf (stderr, "PowderN %s: DEAD - this shouldn't happen!\n", NAME_CURRENT_COMP));
      }

      if (neutrontype == 3) { /* Make coherent scattering event */
        if (line_info.count > 0) {
          /* choose line */
          if (Nq > 1)
            line = floor (Nq * rand01 ()); /* Select between Nq powder lines */
          else
            line = 0;
          if (line_info.w_v[line])
            arg = line_info.q_v[line] * (1 + line_info.w_v[line] * randnorm ()) / (2.0 * v);
          else
            arg = line_info.q_v[line] / (2.0 * v);
          my_s_n = line_info.my_s_v2[line] / (v * v);
          if (fabs (arg) > 1)
            ABSORB; /* No bragg scattering possible*/
          if (tth_sign == 0) {
            sg = randpm1 ();
            if (sg > 0)
              sg = 1;
            else
              sg = -1;
          } else {
            sg = tth_sign / fabs (tth_sign);
          }
          theta = asin (arg); /* Bragg scattering law */
          /* Choose point on Debye-Scherrer cone */
          if (d_phi_thread) { /* relate height of detector to the height on DS cone */
            arg = sin (d_phi_thread * DEG2RAD / 2) / sin (2 * theta);
            /* If full Debye-Scherrer cone is within d_phi, don't focus */
            if (arg < -1 || arg > 1)
              d_phi_thread = 0;
            /* Otherwise, determine alpha to rotate from scattering plane
               into d_phi focusing area*/
            else
              alpha = 2 * asin (arg);
          }
          if (d_phi_thread) {
            /* Focusing */
            alpha = fabs (alpha);
            alpha0 = 0.5 * randpm1 () * alpha;
            if (focus_flip) {
              alpha0 += M_PI_2;
            }
          } else
            alpha0 = PI * randpm1 ();

          /* now find a nearly vertical rotation axis:
           * Either
           *  (v along Z) x (X axis) -> nearly Y axis
           * Or
           *  (v along X) x (Z axis) -> nearly Y axis
           */

          /* update JS, 1/7/2017
            If a target is defined, try to define vertical axis as a normal to the plane
                defined by the incident neutron velocity and target position.
                Check that v is not ~ parallel to the target direction.
          */
          double vnorm = 0.0;
          if (target_index) {
            vec_prod (tmp_vx, tmp_vy, tmp_vz, vx, vy, vz, tgt_x, tgt_y, tgt_z);
            vnorm = sqrt (tmp_vx * tmp_vx + tmp_vy * tmp_vy + tmp_vz * tmp_vz) / v;
          }
          // no target or direction is nearly parallel to v:
          if (vnorm < 0.01) {
            if (fabs (vx / v) < fabs (vz / v)) {
              nx = 1;
              ny = 0;
              nz = 0;
            } else {
              nx = 0;
              ny = 0;
              nz = 1;
            }
            vec_prod (tmp_vx, tmp_vy, tmp_vz, vx, vy, vz, nx, ny, nz);
          }

          /* v_out = rotate 'v' by 2*theta around tmp_v: Bragg angle */
          rotate (vout_x, vout_y, vout_z, vx, vy, vz, 2 * sg * theta, tmp_vx, tmp_vy, tmp_vz);

          /* tmp_v = rotate v_out by alpha0 around 'v' (Debye-Scherrer cone) */
          rotate (tmp_vx, tmp_vy, tmp_vz, vout_x, vout_y, vout_z, alpha0, vx, vy, vz);
          vx = tmp_vx;
          vy = tmp_vy;
          vz = tmp_vz;

          /* Since now scattered and new direction given, calculate path to exit */
          if (line_info.shape == 1) {
            intersect = box_intersect (&t0, &t3, x, y, z, vx, vy, vz, xwidth, yheight, zdepth);
            intersecti = box_intersect (&t1, &t2, x, y, z, vx, vy, vz, line_info.xwidth_i, line_info.yheight_i, line_info.zdepth_i);
          } else if (line_info.shape == 0) {
            intersect = cylinder_intersect (&t0, &t3, x, y, z, vx, vy, vz, radius, yheight);
            intersecti = cylinder_intersect (&t1, &t2, x, y, z, vx, vy, vz, line_info.radius_i, line_info.yheight_i);
          } else if (line_info.shape == 2) {
            intersect = sphere_intersect (&t0, &t3, x, y, z, vx, vy, vz, radius);
            intersecti = sphere_intersect (&t1, &t2, x, y, z, vx, vy, vz, line_info.radius_i);
          }
          #ifdef USE_OFF
          else if (line_info.shape == 3) {
            intersect = off_intersect (&t0, &t3, NULL, NULL, x, y, z, vx, vy, vz, 0, 0, 0, thread_offdata);
            intersecti = 0;
          }
          #endif

          if (!intersect) {
            /* Strange error: did not hit cylinder */
            if (line_info.flag_warning < 10)
              printf ("PowderN: %s: WARNING: Did not hit sample from inside (coh). ABSORB.\n", NAME_CURRENT_COMP);
            line_info.flag_warning++;
            ABSORB;
          }

          if (!intersecti) {
            t1 = (t3 + t0) / 2;
            t2 = t1;
          }

          if (concentric && intersecti) {
            /* In case of concentricity, 'remove' backward wall of sample */
            t2 = t1;
            t3 = t1;
          }

          if (t0 < 0)
            t0 = 0; /* already in sample */
          if (t1 < 0)
            t1 = 0; /* already in inner hollow */
          if (t2 < 0)
            t2 = 0; /* already past inner hollow */

          l_1 = v * (t3 - t2 + t1 - t0); /* Length to exit */

          pmul *= Nq * l_full * my_s_n * exp (-(line_info.my_a_v / v + my_s) * (l + l_1)) / (1 - (p_inc + p_transmit));

          /* Correction in case of d_phi focusing - BUT only when d_phi != 0 */
          if (d_phi_thread) {
            pmul *= alpha / PI;
            if (tth_sign)
              pmul *= 0.5;
          }

          type = 'c';
          itype = 1;
          dq = line_info.q_v[line] * V2K;
          lfree = 1 / (line_info.my_a_v / v + my_s);
        } /* else transmit <-- No powder lines in file */
      } /* Coherent scattering event */
      else if (neutrontype == 2) { /* Make incoherent scattering event */
        if (d_omega && d_phi_thread) {
          randvec_target_rect_angular (&vx, &vy, &vz, &solid_angle, tgt_x, tgt_y, tgt_z, d_omega * DEG2RAD, d_phi_thread * DEG2RAD, ROT_A_CURRENT_COMP);
        } else if (d_phi_thread) {
          randvec_target_rect_angular (&vx, &vy, &vz, &solid_angle, tgt_x, tgt_y, tgt_z, 2 * PI, d_phi_thread * DEG2RAD, ROT_A_CURRENT_COMP);
        } else {
          randvec_target_circle (&vx, &vy, &vz, &solid_angle, 0, 0, 1, 0);
        }
        v1 = sqrt (vx * vx + vy * vy + vz * vz);
        vx *= v / v1;
        vy *= v / v1;
        vz *= v / v1;

        /* Since now scattered and new direction given, calculate path to exit */
        if (line_info.shape == 1) {
          intersect = box_intersect (&t0, &t3, x, y, z, vx, vy, vz, xwidth, yheight, zdepth);
          intersecti = box_intersect (&t1, &t2, x, y, z, vx, vy, vz, line_info.xwidth_i, line_info.yheight_i, line_info.zdepth_i);
        } else if (line_info.shape == 0) {
          intersect = cylinder_intersect (&t0, &t3, x, y, z, vx, vy, vz, radius, yheight);
          intersecti = cylinder_intersect (&t1, &t2, x, y, z, vx, vy, vz, line_info.radius_i, line_info.yheight_i);
        } else if (line_info.shape == 2) {
          intersect = sphere_intersect (&t0, &t3, x, y, z, vx, vy, vz, radius);
          intersecti = sphere_intersect (&t1, &t2, x, y, z, vx, vy, vz, line_info.radius_i);
        }
        #ifdef USE_OFF
        else if (line_info.shape == 3) {
          intersect = off_intersect (&t0, &t3, NULL, NULL, x, y, z, vx, vy, vz, 0, 0, 0, thread_offdata);
          intersecti = 0;
        }
        #endif

        if (!intersect) {
          /* Strange error: did not hit cylinder */
          if (line_info.flag_warning < 10)
            printf ("PowderN: %s: WARNING: Did not hit sample from inside (inc). ABSORB.\n", NAME_CURRENT_COMP);
          line_info.flag_warning++;
          ABSORB;
        }

        if (!intersecti) {
          t1 = (t3 + t0) / 2;
          t2 = t1;
        }

        if (concentric && intersecti) {
          /* In case of concentricity, 'remove' backward wall of sample */
          t2 = t1;
          t3 = t1;
        }

        if (t0 < 0)
          t0 = 0; /* already in sample */
        if (t1 < 0)
          t1 = 0; /* already in inner hollow */
        if (t2 < 0)
          t2 = 0; /* already past inner hollow */

        l_1 = v * (t3 - t2 + t1 - t0); /* Length to exit */

        pmul *= l_full * line_info.my_inc * exp (-(line_info.my_a_v / v + my_s) * (l + l_1)) / (p_inc);
        pmul *= solid_angle / (4 * PI);
        lfree = 1 / (line_info.my_a_v / v + my_s);
        type = 'i';
        itype = 2;

      } /* Incoherent scattering event */
      else if (neutrontype == 1) {
        /* Make transmitted (absorption-corrected) event */
        /* No coordinate changes here, simply change neutron weight */
        pmul *= exp (-(line_info.my_a_v / v + my_s) * (l)) / (p_transmit);
        lfree = 1 / (line_info.my_a_v / v + my_s);
        type = 't';
        itype = 3;
      }
      p *= pmul;
    } /* Neutron leaving since it has passed already */
  } /* else transmit non interacting neutrons */

  // Inject these back to global struct in non-OpenACC case
  #ifndef OPENACC
  line_info.nb_reuses = nb_reuses;
  line_info.nb_refl = nb_refl;
  line_info.nb_refl_count = nb_refl_count;
  line_info.v = vcache;
  line_info.Nq = Nq;
  line_info.v_min = v_min;
  line_info.v_max = v_max;
  line_info.lfree = lfree;
  line_info.xs_compute = xs_compute;
  line_info.xs_reuse = xs_reuse;
  line_info.xs_calls = xs_calls;
  line_info.dq = dq;
  #endif
#ifndef NOABSORB_INF_NAN
  /* Check for nan or inf particle parms */ 
  if(isnan(p + t + vx + vy + vz + x + y + z)) ABSORB;
  if(isinf(fabs(p) + fabs(t) + fabs(vx) + fabs(vy) + fabs(vz) + fabs(x) + fabs(y) + fabs(z))) ABSORB;
#else
  if(isnan(p)  ||  isinf(p)) printf("NAN or INF found in p,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(t)  ||  isinf(t)) printf("NAN or INF found in t,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vx) || isinf(vx)) printf("NAN or INF found in vx, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vy) || isinf(vy)) printf("NAN or INF found in vy, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vz) || isinf(vz)) printf("NAN or INF found in vz, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(x)  ||  isinf(x)) printf("NAN or INF found in x,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(y)  ||  isinf(y)) printf("NAN or INF found in y,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(z)  ||  isinf(z)) printf("NAN or INF found in z,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
#endif
  #undef reflections
  #undef geometry
  #undef format
  #undef radius
  #undef yheight
  #undef xwidth
  #undef zdepth
  #undef thickness
  #undef pack
  #undef Vc
  #undef sigma_abs
  #undef sigma_inc
  #undef delta_d_d
  #undef p_inc
  #undef p_transmit
  #undef DW
  #undef nb_atoms
  #undef d_omega
  #undef d_phi
  #undef tth_sign
  #undef p_interact
  #undef concentric
  #undef density
  #undef weight
  #undef barns
  #undef Strain
  #undef focus_flip
  #undef target_index
  #undef order
  #undef line_info
  #undef columns
  #undef offdata
  #undef tgt_x
  #undef tgt_y
  #undef tgt_z
  return;
} /* class_PowderN_trace */

#pragma acc routine
void class_Monitor_nD_trace(_class_Monitor_nD *_comp
  , _class_particle *_particle) {
  ABSORBED=SCATTERED=RESTORE=0;
  #define user1 (_comp->_parameters.user1)
  #define user2 (_comp->_parameters.user2)
  #define user3 (_comp->_parameters.user3)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define zdepth (_comp->_parameters.zdepth)
  #define xmin (_comp->_parameters.xmin)
  #define xmax (_comp->_parameters.xmax)
  #define ymin (_comp->_parameters.ymin)
  #define ymax (_comp->_parameters.ymax)
  #define zmin (_comp->_parameters.zmin)
  #define zmax (_comp->_parameters.zmax)
  #define bins (_comp->_parameters.bins)
  #define min (_comp->_parameters.min)
  #define max (_comp->_parameters.max)
  #define restore_neutron (_comp->_parameters.restore_neutron)
  #define radius (_comp->_parameters.radius)
  #define options (_comp->_parameters.options)
  #define filename (_comp->_parameters.filename)
  #define geometry (_comp->_parameters.geometry)
  #define nowritefile (_comp->_parameters.nowritefile)
  #define nexus_bins (_comp->_parameters.nexus_bins)
  #define username1 (_comp->_parameters.username1)
  #define username2 (_comp->_parameters.username2)
  #define username3 (_comp->_parameters.username3)
  #define DEFS (_comp->_parameters.DEFS)
  #define Vars (_comp->_parameters.Vars)
  #define detector (_comp->_parameters.detector)
  #define offdata (_comp->_parameters.offdata)
  SIG_MESSAGE("[_H5_trace] component H5=Monitor_nD() TRACE [Monitor_nD:0]");

  double transmit_he3 = 1.0;
  double multiplier_capture = 1.0;
  double t0 = 0;
  double t1 = 0;
  int pp;
  int intersect = 0;
  char Flag_Restore = 0;

  #ifdef OPENACC
  #ifdef USE_OFF
  off_struct thread_offdata = offdata;
  #endif
  #else
  #define thread_offdata offdata
  #endif

  /* this is done automatically
    STORE_NEUTRON(INDEX_CURRENT_COMP, x, y, z, vx, vy, vz, t, sx, sy, sz, p);
  */
  #ifdef USE_OFF
  if (geometry && strlen (geometry) && strcmp (geometry, "0") && strcmp (geometry, "NULL")) {
    /* determine intersections with object */
    intersect = off_intersect_all (&t0, &t1, NULL, NULL, x, y, z, vx, vy, vz, 0, 0, 0, &thread_offdata);
    if (Vars.Flag_mantid) {
      if (intersect) {
        Vars.OFF_polyidx = thread_offdata.nextintersect;
      } else {
        Vars.OFF_polyidx = -1;
      }
    }
  } else
    #endif
    if ((abs (Vars.Flag_Shape) == DEFS.SHAPE_SQUARE) || (abs (Vars.Flag_Shape) == DEFS.SHAPE_DISK)) /* square xy or disk xy */
    {
      // propagate to xy plane and find intersection
      // make sure the event is recoverable afterwards
      t0 = t;
      ALLOW_BACKPROP;
      PROP_Z0;
      if ((t >= t0) && (z == 0.0)) // forward propagation to xy plane was successful
      {
        if (abs (Vars.Flag_Shape) == DEFS.SHAPE_SQUARE) {
          // square xy
          intersect = (x >= Vars.mxmin && x <= Vars.mxmax && y >= Vars.mymin && y <= Vars.mymax);
        } else {
          // disk xy
          intersect = (SQR (x) + SQR (y)) <= SQR (Vars.Sphere_Radius);
        }
      } else {
        intersect = 0;
      }
    } else if (abs (Vars.Flag_Shape) == DEFS.SHAPE_SPHERE) /* sphere */
    {
      intersect = sphere_intersect (&t0, &t1, x, y, z, vx, vy, vz, Vars.Sphere_Radius);
      /*      intersect = (intersect && t0 > 0); */
    } else if ((abs (Vars.Flag_Shape) == DEFS.SHAPE_CYLIND) || (abs (Vars.Flag_Shape) == DEFS.SHAPE_BANANA)) /* cylinder */
    {
      intersect = cylinder_intersect (&t0, &t1, x, y, z, vx, vy, vz, Vars.Sphere_Radius, Vars.Cylinder_Height);
    } else if (abs (Vars.Flag_Shape) == DEFS.SHAPE_BOX) /* box */
    {
      intersect = box_intersect (&t0, &t1, x, y, z, vx, vy, vz, fabs (Vars.mxmax - Vars.mxmin), fabs (Vars.mymax - Vars.mymin), fabs (Vars.mzmax - Vars.mzmin));
    } else if (abs (Vars.Flag_Shape) == DEFS.SHAPE_PREVIOUS) /* previous comp */
    {
      intersect = 1;
    }

  if (intersect) {
    if ((abs (Vars.Flag_Shape) == DEFS.SHAPE_SPHERE) || (abs (Vars.Flag_Shape) == DEFS.SHAPE_CYLIND) || (abs (Vars.Flag_Shape) == DEFS.SHAPE_BOX)
        || (abs (Vars.Flag_Shape) == DEFS.SHAPE_BANANA) || (geometry && strlen (geometry) && strcmp (geometry, "0") && strcmp (geometry, "NULL"))) {
      /* check if we have to remove the top/bottom with BANANA shape */
      if (abs (Vars.Flag_Shape) == DEFS.SHAPE_BANANA) {
        if (intersect == 1) { // Entered and left through sides
          if (t0 < 0 && t1 > 0) {
            t0 = t; /* neutron was already inside ! */
          }
          if (t1 < 0 && t0 > 0) { /* neutron exit before entering !! */
            t1 = t;
          }
          /* t0 is now time of incoming intersection with the detection area */
          if ((Vars.Flag_Shape < 0) && (t1 > 0)) {
            PROP_DT (t1); /* t1 outgoing beam */
          } else {
            PROP_DT (t0); /* t0 incoming beam */
          }
        } else if (intersect == 3 || intersect == 5) { // Entered from top or bottom, left through side
          if ((Vars.Flag_Shape < 0) && (t1 > 0)) {
            PROP_DT (t1); /* t1 outgoing beam */
          } else {
            intersect = 0;
            Flag_Restore = 1;
          }
        } else if (intersect == 9 || intersect == 17) { // Entered through side, left from top or bottom
          if ((Vars.Flag_Shape < 0) && (t1 > 0)) {
            intersect = 0;
            Flag_Restore = 1;
          } else {
            PROP_DT (t0); /* t0 incoming beam */
          }
        } else if (intersect == 13 || intersect == 19) { // Went through top/bottom on entry and exit
          intersect = 0;
          Flag_Restore = 1;
        } else {
          printf ("Cylinder_intersect returned unexpected value %i\n", intersect);
        }
      } else {
        // All other shapes than the BANANA
        if (t0 < 0 && t1 > 0)
          t0 = t;             /* neutron was already inside ! */
        if (t1 < 0 && t0 > 0) /* neutron exit before entering !! */
          t1 = t;
        /* t0 is now time of incoming intersection with the detection area */
        if ((Vars.Flag_Shape < 0) && (t1 > 0))
          PROP_DT (t1); /* t1 outgoing beam */
        else
          PROP_DT (t0); /* t0 incoming beam */
      }

      /* Final test if we are on lid / bottom of banana/sphere */
      if (abs (Vars.Flag_Shape) == DEFS.SHAPE_BANANA || abs (Vars.Flag_Shape) == DEFS.SHAPE_SPHERE) {
        if (Vars.Cylinder_Height && fabs (y) >= Vars.Cylinder_Height / 2 - FLT_EPSILON) {
          intersect = 0;
          Flag_Restore = 1;
        }
      }
    }
  }

  if (intersect) {
    /* Now get the data to monitor: current or keep from PreMonitor */
    /*    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;*/
    /*    }*/

    if ((Vars.He3_pressure > 0) && (t1 != t0)
        && ((abs (Vars.Flag_Shape) == DEFS.SHAPE_SPHERE) || (abs (Vars.Flag_Shape) == DEFS.SHAPE_CYLIND) || (abs (Vars.Flag_Shape) == DEFS.SHAPE_BOX))) {
      transmit_he3 = exp (-7.417 * Vars.He3_pressure * fabs (t1 - t0) * 2 * PI * K2V);
      /* will monitor the absorbed part */
      p = p * (1 - transmit_he3);
    }

    if (Vars.Flag_capture) {
      multiplier_capture = V2K * sqrt (vx * vx + vy * vy + vz * vz);
      if (multiplier_capture != 0)
        multiplier_capture = 2 * PI / multiplier_capture; /* lambda. lambda(2200 m/2) = 1.7985 Angs  */
      p = p * multiplier_capture / 1.7985;
    }

    pp = Monitor_nD_Trace (&DEFS, &Vars, _particle);
    if (pp == 0.0) {
      ABSORB;
    } else if (pp == 1) {
      SCATTER;
    }

    /*set weight to undetected part if capture and/or he3_pressure*/
    if (Vars.He3_pressure > 0) {
      /* after monitor, only remains 1-p_detect */
      p = p * transmit_he3 / (1.0 - transmit_he3);
    }

    if (Vars.Flag_capture) {
      p = p / multiplier_capture * 1.7985;
    }

    if (Vars.Flag_parallel) /* back to neutron state before detection */
      Flag_Restore = 1;
  } /* end if intersection */
  else {
    if (Vars.Flag_Absorb && !Vars.Flag_parallel) {
      // restore neutron ray before absorbing for correct mcdisplay
      RESTORE_NEUTRON (INDEX_CURRENT_COMP, x, y, z, vx, vy, vz, t, sx, sy, sz, p);
      ABSORB;
    } else
      Flag_Restore = 1; /* no intersection, back to previous state */
  }

  if (Flag_Restore) {
    RESTORE_NEUTRON (INDEX_CURRENT_COMP, x, y, z, vx, vy, vz, t, sx, sy, sz, p);
  }
#ifndef NOABSORB_INF_NAN
  /* Check for nan or inf particle parms */ 
  if(isnan(p + t + vx + vy + vz + x + y + z)) ABSORB;
  if(isinf(fabs(p) + fabs(t) + fabs(vx) + fabs(vy) + fabs(vz) + fabs(x) + fabs(y) + fabs(z))) ABSORB;
#else
  if(isnan(p)  ||  isinf(p)) printf("NAN or INF found in p,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(t)  ||  isinf(t)) printf("NAN or INF found in t,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vx) || isinf(vx)) printf("NAN or INF found in vx, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vy) || isinf(vy)) printf("NAN or INF found in vy, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vz) || isinf(vz)) printf("NAN or INF found in vz, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(x)  ||  isinf(x)) printf("NAN or INF found in x,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(y)  ||  isinf(y)) printf("NAN or INF found in y,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(z)  ||  isinf(z)) printf("NAN or INF found in z,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
#endif

  #define flag (_particle->flag)
  #define ncol_25 (_particle->ncol_25)
  #define nrow_25 (_particle->nrow_25)
  #define ncol_37 (_particle->ncol_37)
  #define nrow_37 (_particle->nrow_37)
  #define ncol_114 (_particle->ncol_114)
  #define nrow_114 (_particle->nrow_114)
  #define ncol_130 (_particle->ncol_130)
  #define nrow_130 (_particle->nrow_130)
if (_comp->_index == 24) { // EXTEND 'H53_ThALES_Monochromator_Cradle'
  flag=0;
}
if (_comp->_index == 33) { // EXTEND 'H53_ThALES_Diffractometer'
  ABSORB; /* neutron ends on the ThALES sample */
}
if (_comp->_index == 42) { // EXTEND 'H53_ThALES_TransmitXY'
  ABSORB;
}
if (_comp->_index == 113) { // EXTEND 'H521_D16_Monochromator_Cradle'
  flag=0;
}
if (_comp->_index == 123) { // EXTEND 'H521_D16_Diffractometer'
  ABSORB; /* neutron ends on the D16 sample position */
}
if (_comp->_index == 129) { // EXTEND 'H521_SADAM_Monochromator_Cradle'
  flag=0;
}
if (_comp->_index == 138) { // EXTEND 'H521_SADAM_Diffractometer'
  ABSORB; /* neutron ends on the SuperADAM sample position */
}
if (_comp->_index == 190) { // EXTEND 'H522_mirror_TransmitXY'
  if (flag == 2) ABSORB;
}
if (_comp->_index == 200) { // EXTEND 'H522_WASP_Diffractometer'
  ABSORB; /* neutron ends on the SuperADAM sample position */
}
if (_comp->_index == 237) { // EXTEND 'H523_CryoEDM_mirror_TransmitXY'
  if (flag == 2) ABSORB;
}
if (_comp->_index == 240) { // EXTEND 'H523_CryoEDM_Sample_XY'
  ABSORB; /* end of H53 */
}
if (_comp->_index == 261) { // EXTEND 'H511_mirror_TransmitXY'
  if (flag == 2) ABSORB;
}
if (_comp->_index == 279) { // EXTEND 'H511_IN15_Diffractometer'
  ABSORB; /* neutron ends on the SuperADAM sample position */
}
if (_comp->_index == 315) { // EXTEND 'D22_Detector'
  ABSORB; /* H512 end here */
}
  #undef flag
  #undef ncol_25
  #undef nrow_25
  #undef ncol_37
  #undef nrow_37
  #undef ncol_114
  #undef nrow_114
  #undef ncol_130
  #undef nrow_130

  #undef user1
  #undef user2
  #undef user3
  #undef xwidth
  #undef yheight
  #undef zdepth
  #undef xmin
  #undef xmax
  #undef ymin
  #undef ymax
  #undef zmin
  #undef zmax
  #undef bins
  #undef min
  #undef max
  #undef restore_neutron
  #undef radius
  #undef options
  #undef filename
  #undef geometry
  #undef nowritefile
  #undef nexus_bins
  #undef username1
  #undef username2
  #undef username3
  #undef DEFS
  #undef Vars
  #undef detector
  #undef offdata
  return;
} /* class_Monitor_nD_trace */

#pragma acc routine
void class_Guide_gravity_trace(_class_Guide_gravity *_comp
  , _class_particle *_particle) {
  ABSORBED=SCATTERED=RESTORE=0;
  #define w1 (_comp->_parameters.w1)
  #define h1 (_comp->_parameters.h1)
  #define w2 (_comp->_parameters.w2)
  #define h2 (_comp->_parameters.h2)
  #define l (_comp->_parameters.l)
  #define R0 (_comp->_parameters.R0)
  #define Qc (_comp->_parameters.Qc)
  #define alpha (_comp->_parameters.alpha)
  #define m (_comp->_parameters.m)
  #define W (_comp->_parameters.W)
  #define nslit (_comp->_parameters.nslit)
  #define d (_comp->_parameters.d)
  #define mleft (_comp->_parameters.mleft)
  #define mright (_comp->_parameters.mright)
  #define mtop (_comp->_parameters.mtop)
  #define mbottom (_comp->_parameters.mbottom)
  #define nhslit (_comp->_parameters.nhslit)
  #define G (_comp->_parameters.G)
  #define aleft (_comp->_parameters.aleft)
  #define aright (_comp->_parameters.aright)
  #define atop (_comp->_parameters.atop)
  #define abottom (_comp->_parameters.abottom)
  #define wavy (_comp->_parameters.wavy)
  #define wavy_z (_comp->_parameters.wavy_z)
  #define wavy_tb (_comp->_parameters.wavy_tb)
  #define wavy_lr (_comp->_parameters.wavy_lr)
  #define chamfers (_comp->_parameters.chamfers)
  #define chamfers_z (_comp->_parameters.chamfers_z)
  #define chamfers_lr (_comp->_parameters.chamfers_lr)
  #define chamfers_tb (_comp->_parameters.chamfers_tb)
  #define nelements (_comp->_parameters.nelements)
  #define nu (_comp->_parameters.nu)
  #define phase (_comp->_parameters.phase)
  #define reflect (_comp->_parameters.reflect)
  #define GVarsGlobal (_comp->_parameters.GVarsGlobal)
  #define pTable (_comp->_parameters.pTable)
  #define table_present (_comp->_parameters.table_present)
  SIG_MESSAGE("[_H5_rect_trace] component H5_rect=Guide_gravity() TRACE [Guide_gravity:0]");


  Gravity_guide_Vars_type GVars = GVarsGlobal;
  GVars.warnings = 0;

  if (l > 0 && nelements > 0) {
    double B, C, dt;
    int ret, bounces = 0, i = 0;
    double this_width, this_height;
    double angle = 0;

    if (GVars.fc_freq != 0 || GVars.fc_phase != 0) { /* rotate neutron w/r to guide element */
      /* approximation of rotating straight Fermi Chopper */
      Coords X = coords_set (x, y, z - l / 2); /* current coordinates of neutron in centered static frame */
      Rotation R;
      double dt = (-z + l / 2) / vz;                                       /* time shift to each center of slit package */
      angle = fmod (360 * GVars.fc_freq * (t + dt) + GVars.fc_phase, 360); /* in deg */
      /* modify angle so that Z0 guide side is always in front of incoming neutron */
      if (angle > 90 && angle < 270) {
        angle -= 180;
      }
      angle *= DEG2RAD;
      rot_set_rotation (R, 0, -angle, 0); /* will rotate neutron instead of comp: negative side */
      /* apply rotation to centered coordinates */
      Coords RX = rot_apply (R, X);
      coords_get (RX, &x, &y, &z);
      z = z + l / 2;
      /* rotate speed */
      X = coords_set (vx, vy, vz);
      RX = rot_apply (R, X);
      coords_get (RX, &vx, &vy, &vz);
    }

    for (i = 0; i < 7; GVars.N_reflection[i++] = 0)
      ;

    /* propagate to box input (with gravitation) in comp local coords */
    /* A = 0.5 n.g; B = n.v; C = n.(r-W); */
    /* 0=Z0 side: n=(0, 0, -l) ; W = (0, 0, 0) (at z=0, guide input)*/
    B = -l * vz;
    C = -l * z;

    ret = solve_2nd_order (&dt, NULL, GVars.A[0], B, C);
    if (ret == 0)
      ABSORB;

    if (dt > 0.0)
      PROP_GRAV_DT (dt, GVars.gx, GVars.gy, GVars.gz);
    else if (angle)
      ABSORB;
    GVars.N_reflection[6]++;

    this_width = w1;
    this_height = h1;

    /* check if we are in the box input, else absorb */
    if (fabs (x) > this_width / 2 || fabs (y) > this_height / 2)
      ABSORB;
    else {
      double w_edge, w_adj;    /* Channel displacement on X */
      double h_edge, h_adj;    /* Channel displacement on Y */
      double w_chnum, h_chnum; /* channel indexes */

      SCATTER;

      /* X: Shift origin to center of channel hit (absorb if hit dividing walls) */
      x += w1 / 2.0;
      w_chnum = floor (x / (GVars.w1c + d)); /* 0= right side, nslit+1=left side  */
      w_edge = w_chnum * (GVars.w1c + d);
      if (x - w_edge > GVars.w1c) {
        x -= w1 / 2.0; /* Re-adjust origin */
        ABSORB;
      }
      w_adj = w_edge + (GVars.w1c) / 2.0;
      x -= w_adj;
      w_adj -= w1 / 2.0;

      /* Y: Shift origin to center of channel hit (absorb if hit dividing walls) */
      y += h1 / 2.0;
      h_chnum = floor (y / (GVars.h1c + d)); /* 0= lower side, nslit+1=upper side  */
      h_edge = h_chnum * (GVars.h1c + d);
      if (y - h_edge > GVars.h1c) {
        y -= h1 / 2.0; /* Re-adjust origin */
        ABSORB;
      }
      h_adj = h_edge + (GVars.h1c) / 2.0;
      y -= h_adj;
      h_adj -= h1 / 2.0;

      /* neutron is now in the input window of the guide */
      /* do loops on reflections in the box */
      for (;;) {
        /* get intersections for all box sides */
        double q, nx, ny, nz;
        double this_length;
        int side = 0;

        bounces++;
        /* now look for intersection with guide sides and exit */
        side = Gravity_guide_Trace (&dt, &GVars, x, y, z, vx, vy, vz, w_chnum, nslit, h_chnum, nhslit, &nx, &ny, &nz, _particle);
        /* only positive dt are valid */
        /* exit reflection loops if no intersection (neutron is after box) */
        if (side == 0 || dt <= 0) {
          if (GVars.warnings < 100)
            fprintf (stderr, "%s: warning: neutron has entered guide, but can not exit !\n", GVars.compcurname);
          GVars.warnings++;
          x += w_adj;
          y += h_adj;
          ABSORB;
        } /* should never occur */

        /* propagate to dt */
        PROP_GRAV_DT (dt, GVars.gx, GVars.gy, GVars.gz);

        /* do reflection on speed for l/r/u/d sides */
        if (side == 5) /* neutron reaches end of guide: end loop and exit comp */
        {
          GVars.N_reflection[side]++;
          x += w_adj;
          y += h_adj;
          SCATTER;
          x -= w_adj;
          y -= h_adj;
          break;
        }
        /* else reflection on a guide wall */
        if (GVars.M[side] == 0 || Qc == 0 || R0 == 0) /* walls are absorbing */
        {
          x += w_adj;
          y += h_adj;
          ABSORB;
        }
        /* handle chamfers */
        this_width = w1 + (w2 - w1) * z / l;
        this_height = h1 + (h2 - h1) * z / l;
        this_length = fmod (z, l / nelements);
        /* absorb on input/output of element parts */
        if (GVars.chamfer_z && (this_length < GVars.chamfer_z || this_length > l / nelements - GVars.chamfer_z)) {
          x += w_adj;
          y += h_adj;
          ABSORB;
        }
        /* absorb on l/r/t/b sides */
        if (GVars.chamfer_lr && (side == 1 || side == 2) && (fabs (y + h_adj) > this_height / 2 - GVars.chamfer_lr)) {
          x += w_adj;
          y += h_adj;
          ABSORB;
        }
        if (GVars.chamfer_tb && (side == 3 || side == 4) && (fabs (x + w_adj) > this_width / 2 - GVars.chamfer_tb)) {
          x += w_adj;
          y += h_adj;
          ABSORB;
        }
        /* change/mirror velocity: h_f = v - n.2*n.v/|n|^2 */
        GVars.N_reflection[side]++; /* GVars.norm_n2 > 0 was checked at INIT */
        /* compute n.v using current values */
        B = scalar_prod (vx, vy, vz, nx, ny, nz);
        dt = 2 * B / GVars.norm_n2[side]; /* 2*n.v/|n|^2 */
        vx -= nx * dt;
        vy -= ny * dt;
        vz -= nz * dt;

        /* compute q and modify neutron weight */
        /* scattering q=|n_i-n_f| = V2Q*|vf - v| = V2Q*2*n.v/|n| */
        q = 2 * V2Q * fabs (B) / GVars.norm_n[side];

        if (table_present == 1)
          TableReflecFunc (q, &pTable, &B);
        else {
          double par[] = { R0, Qc, GVars.Alpha[side], GVars.M[side], W };
          StdReflecFunc (q, par, &B);
        }
        if (B <= 0) {
          x += w_adj;
          y += h_adj;
          ABSORB;
        } else
          p *= B;
        x += w_adj;
        y += h_adj;
        SCATTER;
        x -= w_adj;
        y -= h_adj;
        GVars.N_reflection[0]++;
        /* go to the next reflection */
        if (bounces > 1000)
          ABSORB;
      } /* end for */
      x += w_adj;
      y += h_adj; /* Re-adjust origin after SCATTER */
    }

    if (GVars.fc_freq != 0 || GVars.fc_phase != 0) { /* rotate back neutron w/r to guide element */
      /* approximation of rotating straight Fermi Chopper */
      Coords X = coords_set (x, y, z - l / 2); /* current coordinates of neutron in centered static frame */
      Rotation R;
      rot_set_rotation (R, 0, angle, 0); /* will rotate back neutron: positive side */
      /* apply rotation to centered coordinates */
      Coords RX = rot_apply (R, X);
      coords_get (RX, &x, &y, &z);
      z = z + l / 2;
      /* rotate speed */
      X = coords_set (vx, vy, vz);
      RX = rot_apply (R, X);
      coords_get (RX, &vx, &vy, &vz);
    }

  } /* if l */

  #pragma acc atomic
  GVarsGlobal.warnings = GVarsGlobal.warnings + GVars.warnings;
#ifndef NOABSORB_INF_NAN
  /* Check for nan or inf particle parms */ 
  if(isnan(p + t + vx + vy + vz + x + y + z)) ABSORB;
  if(isinf(fabs(p) + fabs(t) + fabs(vx) + fabs(vy) + fabs(vz) + fabs(x) + fabs(y) + fabs(z))) ABSORB;
#else
  if(isnan(p)  ||  isinf(p)) printf("NAN or INF found in p,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(t)  ||  isinf(t)) printf("NAN or INF found in t,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vx) || isinf(vx)) printf("NAN or INF found in vx, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vy) || isinf(vy)) printf("NAN or INF found in vy, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vz) || isinf(vz)) printf("NAN or INF found in vz, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(x)  ||  isinf(x)) printf("NAN or INF found in x,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(y)  ||  isinf(y)) printf("NAN or INF found in y,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(z)  ||  isinf(z)) printf("NAN or INF found in z,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
#endif
  #undef w1
  #undef h1
  #undef w2
  #undef h2
  #undef l
  #undef R0
  #undef Qc
  #undef alpha
  #undef m
  #undef W
  #undef nslit
  #undef d
  #undef mleft
  #undef mright
  #undef mtop
  #undef mbottom
  #undef nhslit
  #undef G
  #undef aleft
  #undef aright
  #undef atop
  #undef abottom
  #undef wavy
  #undef wavy_z
  #undef wavy_tb
  #undef wavy_lr
  #undef chamfers
  #undef chamfers_z
  #undef chamfers_lr
  #undef chamfers_tb
  #undef nelements
  #undef nu
  #undef phase
  #undef reflect
  #undef GVarsGlobal
  #undef pTable
  #undef table_present
  return;
} /* class_Guide_gravity_trace */

#pragma acc routine
void class_Arm_trace(_class_Arm *_comp
  , _class_particle *_particle) {
  ABSORBED=SCATTERED=RESTORE=0;
  SIG_MESSAGE("[_H53_start_trace] component H53_start=Arm() TRACE [Arm:0]");

#ifndef NOABSORB_INF_NAN
  /* Check for nan or inf particle parms */ 
  if(isnan(p + t + vx + vy + vz + x + y + z)) ABSORB;
  if(isinf(fabs(p) + fabs(t) + fabs(vx) + fabs(vy) + fabs(vz) + fabs(x) + fabs(y) + fabs(z))) ABSORB;
#else
  if(isnan(p)  ||  isinf(p)) printf("NAN or INF found in p,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(t)  ||  isinf(t)) printf("NAN or INF found in t,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vx) || isinf(vx)) printf("NAN or INF found in vx, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vy) || isinf(vy)) printf("NAN or INF found in vy, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vz) || isinf(vz)) printf("NAN or INF found in vz, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(x)  ||  isinf(x)) printf("NAN or INF found in x,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(y)  ||  isinf(y)) printf("NAN or INF found in y,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(z)  ||  isinf(z)) printf("NAN or INF found in z,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
#endif

  #define flag (_particle->flag)
  #define ncol_25 (_particle->ncol_25)
  #define nrow_25 (_particle->nrow_25)
  #define ncol_37 (_particle->ncol_37)
  #define nrow_37 (_particle->nrow_37)
  #define ncol_114 (_particle->ncol_114)
  #define nrow_114 (_particle->nrow_114)
  #define ncol_130 (_particle->ncol_130)
  #define nrow_130 (_particle->nrow_130)
if (_comp->_index == 186) { // EXTEND 'H522_mirror_centre'
  flag=0;
}
if (_comp->_index == 257) { // EXTEND 'H511_mirror_centre'
  flag=0;
}
  #undef flag
  #undef ncol_25
  #undef nrow_25
  #undef ncol_37
  #undef nrow_37
  #undef ncol_114
  #undef nrow_114
  #undef ncol_130
  #undef nrow_130

  return;
} /* class_Arm_trace */

#pragma acc routine
void class_Guide_tapering_trace(_class_Guide_tapering *_comp
  , _class_particle *_particle) {
  ABSORBED=SCATTERED=RESTORE=0;
  #define option (_comp->_parameters.option)
  #define w1 (_comp->_parameters.w1)
  #define h1 (_comp->_parameters.h1)
  #define l (_comp->_parameters.l)
  #define linw (_comp->_parameters.linw)
  #define loutw (_comp->_parameters.loutw)
  #define linh (_comp->_parameters.linh)
  #define louth (_comp->_parameters.louth)
  #define R0 (_comp->_parameters.R0)
  #define Qcx (_comp->_parameters.Qcx)
  #define Qcy (_comp->_parameters.Qcy)
  #define alphax (_comp->_parameters.alphax)
  #define alphay (_comp->_parameters.alphay)
  #define W (_comp->_parameters.W)
  #define mx (_comp->_parameters.mx)
  #define my (_comp->_parameters.my)
  #define segno (_comp->_parameters.segno)
  #define curvature (_comp->_parameters.curvature)
  #define curvature_v (_comp->_parameters.curvature_v)
  #define w1c (_comp->_parameters.w1c)
  #define w2c (_comp->_parameters.w2c)
  #define ww (_comp->_parameters.ww)
  #define hh (_comp->_parameters.hh)
  #define whalf (_comp->_parameters.whalf)
  #define hhalf (_comp->_parameters.hhalf)
  #define lwhalf (_comp->_parameters.lwhalf)
  #define lhhalf (_comp->_parameters.lhhalf)
  #define h1_in (_comp->_parameters.h1_in)
  #define h2_out (_comp->_parameters.h2_out)
  #define w1_in (_comp->_parameters.w1_in)
  #define w2_out (_comp->_parameters.w2_out)
  #define l_seg (_comp->_parameters.l_seg)
  #define h12 (_comp->_parameters.h12)
  #define h2 (_comp->_parameters.h2)
  #define w12 (_comp->_parameters.w12)
  #define w2 (_comp->_parameters.w2)
  #define a_ell_q (_comp->_parameters.a_ell_q)
  #define b_ell_q (_comp->_parameters.b_ell_q)
  #define lbw (_comp->_parameters.lbw)
  #define lbh (_comp->_parameters.lbh)
  #define mxi (_comp->_parameters.mxi)
  #define u1 (_comp->_parameters.u1)
  #define u2 (_comp->_parameters.u2)
  #define div1 (_comp->_parameters.div1)
  #define p2_para (_comp->_parameters.p2_para)
  #define test (_comp->_parameters.test)
  #define Div1 (_comp->_parameters.Div1)
  #define seg (_comp->_parameters.seg)
  #define fu (_comp->_parameters.fu)
  #define pos (_comp->_parameters.pos)
  #define file_name (_comp->_parameters.file_name)
  #define ep (_comp->_parameters.ep)
  #define num (_comp->_parameters.num)
  #define rotation_h (_comp->_parameters.rotation_h)
  #define rotation_v (_comp->_parameters.rotation_v)
  SIG_MESSAGE("[_H53_Nose_trace] component H53_Nose=Guide_tapering() TRACE [Guide_tapering:0]");

  double t1, t2, ts, zr;                         /* Intersection times. */
  double av, ah, bv, bh, cv1, cv2, ch1, ch2, dd; /* Intermediate values */
  double vdotn_v1, vdotn_v2, vdotn_h1, vdotn_h2; /* Dot products. */
  int i;                                         /* Which mirror hit? */
  double q;                                      /* Q [1/AA] of reflection */
  double vlen2, nlen2;                           /* Vector lengths squared */
  double edge;
  double hadj; /* Channel displacement */
  int ii;

  /* Propagate neutron to guide entrance. */
  PROP_Z0;
  for (ii = 0; ii < seg; ii++) {
    zr = ii * l_seg;
    /* Propagate neutron to segment entrance. */
    ts = (zr - z) / vz;
    PROP_DT (ts);
    if (x <= w1_in[ii] / -2.0 || x >= w1_in[ii] / 2.0 || y <= -hhalf[ii] || y >= hhalf[ii])
      ABSORB;
    /* Shift origin to center of channel hit (absorb if hit dividing walls) */
    x += w1_in[ii] / 2.0;
    edge = floor (x / w1c[ii]) * w1c[ii];
    if (x - edge > w1c[ii]) {
      x -= w1_in[ii] / 2.0; /* Re-adjust origin */
      ABSORB;
    }
    x -= (edge + (w1c[ii] / 2.0));
    hadj = edge + (w1c[ii] / 2.0) - w1_in[ii] / 2.0;
    for (;;) {
      /* Compute the dot products of v and n for the four mirrors. */
      ts = (zr - z) / vz;
      av = l_seg * vx;
      bv = ww[ii] * vz;
      ah = l_seg * vy;
      bh = hh[ii] * vz;
      vdotn_v1 = bv + av; /* Left vertical */
      vdotn_v2 = bv - av; /* Right vertical */
      vdotn_h1 = bh + ah; /* Lower horizontal */
      vdotn_h2 = bh - ah; /* Upper horizontal */
      /* Compute the dot products of (O - r) and n as c1+c2 and c1-c2 */
      cv1 = -whalf[ii] * l_seg - (z - zr) * ww[ii];
      cv2 = x * l_seg;
      ch1 = -hhalf[ii] * l_seg - (z - zr) * hh[ii];
      ch2 = y * l_seg;
      /* Compute intersection times. */
      t1 = (zr + l_seg - z) / vz;
      i = 0;
      if (vdotn_v1 < 0 && (t2 = (cv1 - cv2) / vdotn_v1) < t1) {
        t1 = t2;
        i = 1;
      }
      if (vdotn_v2 < 0 && (t2 = (cv1 + cv2) / vdotn_v2) < t1) {
        t1 = t2;
        i = 2;
      }
      if (vdotn_h1 < 0 && (t2 = (ch1 - ch2) / vdotn_h1) < t1) {
        t1 = t2;
        i = 3;
      }
      if (vdotn_h2 < 0 && (t2 = (ch1 + ch2) / vdotn_h2) < t1) {
        t1 = t2;
        i = 4;
      }
      if (i == 0) {
        break; /* Neutron left guide. */
      }
      PROP_DT (t1);
      switch (i) {
      case 1: /* Left vertical mirror */
        nlen2 = l_seg * l_seg + ww[ii] * ww[ii];
        q = V2Q * (-2) * vdotn_v1 / sqrt (nlen2);
        dd = 2 * vdotn_v1 / nlen2;
        vx = vx - dd * l_seg;
        vz = vz - dd * ww[ii];
        break;
      case 2: /* Right vertical mirror */
        nlen2 = l_seg * l_seg + ww[ii] * ww[ii];
        q = V2Q * (-2) * vdotn_v2 / sqrt (nlen2);
        dd = 2 * vdotn_v2 / nlen2;
        vx = vx + dd * l_seg;
        vz = vz - dd * ww[ii];
        break;
      case 3: /* Lower horizontal mirror */
        nlen2 = l_seg * l_seg + hh[ii] * hh[ii];
        q = V2Q * (-2) * vdotn_h1 / sqrt (nlen2);
        dd = 2 * vdotn_h1 / nlen2;
        vy = vy - dd * l_seg;
        vz = vz - dd * hh[ii];
        break;
      case 4: /* Upper horizontal mirror */
        nlen2 = l_seg * l_seg + hh[ii] * hh[ii];
        q = V2Q * (-2) * vdotn_h2 / sqrt (nlen2);
        dd = 2 * vdotn_h2 / nlen2;
        vy = vy + dd * l_seg;
        vz = vz - dd * hh[ii];
        break;
      }
      /* Now compute reflectivity. */
      if ((i <= 2 && mx == 0) || (i > 2 && my == 0)) {
        x += hadj; /* Re-adjust origin */
        ABSORB;
      } else {
        double ref = 1;
        if (i <= 2) {
          double m = (mx > 0 ? mx : fabs (mx * w1 / w1_in[ii]));
          double par[] = { R0, Qcx, alphax, m, W };
          StdReflecFunc (q, par, &ref);
          if (ref > 0)
            p *= ref;
          else {
            x += hadj; /* Re-adjust origin */
            ABSORB;    /* Cutoff ~ 1E-10 */
          }
        } else {
          double m = (my > 0 ? my : fabs (my * h1 / h1_in[ii]));
          double par[] = { R0, Qcy, alphay, m, W };
          StdReflecFunc (q, par, &ref);
          if (ref > 0)
            p *= ref;
          else {
            x += hadj; /* Re-adjust origin */
            ABSORB;    /* Cutoff ~ 1E-10 */
          }
        }
      }
      x += hadj;
      SCATTER;
      x -= hadj;
    } /* loop on reflections inside segment */
    x += hadj; /* Re-adjust origin */

    /* rotate neutron according to actual guide curvature */
    if (rotation_h) {
      double nvx, nvy, nvz;
      rotate (nvx, nvy, nvz, vx, vy, vz, -rotation_h, 0, 1, 0);
      vx = nvx;
      vy = nvy;
      vz = nvz;
    }
    if (rotation_v) {
      double nvx, nvy, nvz;
      rotate (nvx, nvy, nvz, vx, vy, vz, -rotation_v, 1, 0, 0);
      vx = nvx;
      vy = nvy;
      vz = nvz;
    }
  } /* loop on segments */
#ifndef NOABSORB_INF_NAN
  /* Check for nan or inf particle parms */ 
  if(isnan(p + t + vx + vy + vz + x + y + z)) ABSORB;
  if(isinf(fabs(p) + fabs(t) + fabs(vx) + fabs(vy) + fabs(vz) + fabs(x) + fabs(y) + fabs(z))) ABSORB;
#else
  if(isnan(p)  ||  isinf(p)) printf("NAN or INF found in p,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(t)  ||  isinf(t)) printf("NAN or INF found in t,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vx) || isinf(vx)) printf("NAN or INF found in vx, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vy) || isinf(vy)) printf("NAN or INF found in vy, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vz) || isinf(vz)) printf("NAN or INF found in vz, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(x)  ||  isinf(x)) printf("NAN or INF found in x,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(y)  ||  isinf(y)) printf("NAN or INF found in y,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(z)  ||  isinf(z)) printf("NAN or INF found in z,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
#endif
  #undef option
  #undef w1
  #undef h1
  #undef l
  #undef linw
  #undef loutw
  #undef linh
  #undef louth
  #undef R0
  #undef Qcx
  #undef Qcy
  #undef alphax
  #undef alphay
  #undef W
  #undef mx
  #undef my
  #undef segno
  #undef curvature
  #undef curvature_v
  #undef w1c
  #undef w2c
  #undef ww
  #undef hh
  #undef whalf
  #undef hhalf
  #undef lwhalf
  #undef lhhalf
  #undef h1_in
  #undef h2_out
  #undef w1_in
  #undef w2_out
  #undef l_seg
  #undef h12
  #undef h2
  #undef w12
  #undef w2
  #undef a_ell_q
  #undef b_ell_q
  #undef lbw
  #undef lbh
  #undef mxi
  #undef u1
  #undef u2
  #undef div1
  #undef p2_para
  #undef test
  #undef Div1
  #undef seg
  #undef fu
  #undef pos
  #undef file_name
  #undef ep
  #undef num
  #undef rotation_h
  #undef rotation_v
  return;
} /* class_Guide_tapering_trace */

#pragma acc routine
void class_Monochromator_curved_trace(_class_Monochromator_curved *_comp
  , _class_particle *_particle) {
  ABSORBED=SCATTERED=RESTORE=0;
  #define reflect (_comp->_parameters.reflect)
  #define transmit (_comp->_parameters.transmit)
  #define zwidth (_comp->_parameters.zwidth)
  #define yheight (_comp->_parameters.yheight)
  #define gap (_comp->_parameters.gap)
  #define NH (_comp->_parameters.NH)
  #define NV (_comp->_parameters.NV)
  #define mosaich (_comp->_parameters.mosaich)
  #define mosaicv (_comp->_parameters.mosaicv)
  #define r0 (_comp->_parameters.r0)
  #define t0 (_comp->_parameters.t0)
  #define Q (_comp->_parameters.Q)
  #define RV (_comp->_parameters.RV)
  #define RH (_comp->_parameters.RH)
  #define DM (_comp->_parameters.DM)
  #define mosaic (_comp->_parameters.mosaic)
  #define width (_comp->_parameters.width)
  #define height (_comp->_parameters.height)
  #define verbose (_comp->_parameters.verbose)
  #define order (_comp->_parameters.order)
  #define mos_rms_y (_comp->_parameters.mos_rms_y)
  #define mos_rms_z (_comp->_parameters.mos_rms_z)
  #define mos_rms_max (_comp->_parameters.mos_rms_max)
  #define mono_Q (_comp->_parameters.mono_Q)
  #define SlabWidth (_comp->_parameters.SlabWidth)
  #define SlabHeight (_comp->_parameters.SlabHeight)
  #define rTable (_comp->_parameters.rTable)
  #define tTable (_comp->_parameters.tTable)
  #define rTableFlag (_comp->_parameters.rTableFlag)
  #define tTableFlag (_comp->_parameters.tTableFlag)
  #define tiltH (_comp->_parameters.tiltH)
  #define tiltV (_comp->_parameters.tiltV)
  #define ncol_var (_comp->_parameters.ncol_var)
  #define nrow_var (_comp->_parameters.nrow_var)
  SIG_MESSAGE("[_H53_ThALES_Monochromator_trace] component H53_ThALES_Monochromator=Monochromator_curved() TRACE [Monochromator_curved:0]");

  double dt;
  double Gauss_X[]
      = { -0.987992518020485, -0.937273392400706, -0.848206583410427, -0.724417731360170, -0.570972172608539, -0.394151347077563, -0.201194093997435, 0,
          0.201194093997435,  0.394151347077563,  0.570972172608539,  0.724417731360170,  0.848206583410427,  0.937273392400706,  0.987992518020485 };
  double Gauss_W[]
      = { 0.030753241996117, 0.070366047488108, 0.107159220467172, 0.139570677926154, 0.166269205816994, 0.186161000115562, 0.198431485327111, 0.202578241925561,
          0.198431485327111, 0.186161000115562, 0.166269205816994, 0.139570677926154, 0.107159220467172, 0.070366047488108, 0.030753241996117 };

  if (vx != 0.0 && (dt = -x / vx) >= 0.0 && r0) { /* Moving towards crystal? */
    double zmin, zmax, ymin, ymax;
    double yy, zz;

    zmax = ((NH * (SlabWidth + gap)) - gap) / 2;
    zmin = -zmax;
    ymax = ((NV * (SlabHeight + gap)) - gap) / 2;
    ymin = -ymax;

    /* Test-propagate to crystal plane */
    zz = z + vz * dt;
    yy = y + vy * dt;
    if (zz > zmin && zz < zmax && yy > ymin && yy < ymax) { /* Intersect the crystal? */
      double tilth, tiltv;                                  /* used to calculate tilt angle of slab */
      double ratio, Q_order, k, kux, kuy, kuz;
      double kix, kiy, kiz;
      int do_transmit = 0;
      int row, col;

      col = ceil ((zz - zmin) / (SlabWidth + gap)); /* which slab hit ? */
      row = ceil ((yy - ymin) / (SlabHeight + gap));

      particle_setvar_void (_particle, ncol_var, &col);
      particle_setvar_void (_particle, nrow_var, &row);

      if (RH != 0) {
        tilth = tiltH ? tiltH[(int)col] : asin ((col - (NH + 1) / 2.0) * (SlabWidth + gap) / RH);
      } else {
        tilth = 0;
      }
      if (RV != 0) {
        tiltv = tiltV ? tiltV[(int)row] : -asin ((row - (NV + 1) / 2.0) * (SlabHeight + gap) / RV);
      } else {
        tiltv = 0;
      }

      /* rotate with tilth (around Y) and tiltv (around Z), center on plate */
      double center_z = zmin + (col - 0.5) * (SlabWidth + gap) - gap / 2;
      double center_y = ymin + (row - 0.5) * (SlabHeight + gap) - gap / 2;

      Rotation T;
      rot_set_rotation (T, 0, tilth, tiltv);
      /* now make the coordinate system change */
      mccoordschange_polarisation (T, &vx, &vy, &vz);
      y = y - center_y;
      z = z - center_z;
      coords_get (rot_apply (T, coords_set (x, y, z)), &x, &y, &z);

      /* this is where polarisation should be handled, plus further down */
      /* mccoordschange_polarisation(t, &sx, &sy, &sz); */

      /* now propagate to slab plane */
      PROP_X0;

      /* Hit a slab or a gap ?*/
      int inside = inside_rectangle (z, y, SlabWidth, SlabHeight);
      if (inside) {     /* not in gap ? */
        kix = V2K * vx; /* Initial wave vector */
        kiy = V2K * vy;
        kiz = V2K * vz;
        /* Get reflection order and corresponding nominal scattering vector q0
          of correct length and direction. Only the order with the closest
          scattering vector is considered */
        ratio = -2 * kix / mono_Q;
        Q_order = floor (ratio + .5);
        if (Q_order == 0.0)
          Q_order = ratio < 0 ? -1 : 1;
        /* Order will be negative when the neutron enters from the back, in
          which case the direction of Q0 is flipped. */
        if (Q_order < 0)
          Q_order = -Q_order;
        /* Make sure the order is small enough to allow Bragg scattering at the
          given neutron wavelength */
        k = sqrt (kix * kix + kiy * kiy + kiz * kiz);
        kux = kix / k; /* Unit vector along ki */
        kuy = kiy / k;
        kuz = kiz / k;
        if (Q_order > 2 * k / mono_Q)
          Q_order--;
        if ((!order && Q_order > 0) || (Q_order == fabs (order) && order)) { /* Bragg scattering possible? */
          double q0, q0x, theta, delta, p_reflect, my_r0;

          q0 = Q_order * mono_Q;
          q0x = ratio < 0 ? -q0 : q0;
          theta = asin (q0 / (2 * k)); /* Actual bragg angle */
          /* Make MC choice: reflect or transmit? */
          delta = asin (fabs (kux)) - theta;

          if (rTableFlag) {
            my_r0 = r0 * Table_Value (rTable, k, 1); /* 2nd column */
          } else
            my_r0 = r0;
          if (my_r0 > 1) {
            if (my_r0 > 1.01 && verbose)
              fprintf (stdout, "Warning: Monochromator_curved : lowered reflectivity from %f to 1 (k=%f)\n", my_r0, k);
            my_r0 = 0.999;
          }
          if (my_r0 < 0) {
            if (verbose)
              fprintf (stdout, "Warning: Monochromator_curved : raised reflectivity from %f to 0 (k=%f)\n", my_r0, k);
            my_r0 = 0;
          }

          p_reflect = fabs (my_r0) * exp (-kiz * kiz / (kiy * kiy + kiz * kiz) * (delta * delta) / (2 * mos_rms_y * mos_rms_y))
                      * exp (-kiy * kiy / (kiy * kiy + kiz * kiz) * (delta * delta) / (2 * mos_rms_z * mos_rms_z));

          double rr = rand01 ();
          if (rr <= p_reflect) { /* Reflect */
            double bx, by, bz, ax, ay, az, phi;
            double cos_2theta, k_sin_2theta, cos_phi, sin_phi, q_x, q_y, q_z;
            double total, c1x, c1y, c1z, w, mos_sample;
            int i = 0;

            cos_2theta = cos (2 * theta);
            k_sin_2theta = k * sin (2 * theta);
            /* Get unit normal to plane containing ki and most probable kf */
            vec_prod (bx, by, bz, kix, kiy, kiz, q0x, 0, 0);
            NORM (bx, by, bz);
            bx = bx * k_sin_2theta;
            by = by * k_sin_2theta;
            bz = bz * k_sin_2theta;
            /* Get unit vector normal to ki and b */
            vec_prod (ax, ay, az, bx, by, bz, kux, kuy, kuz);
            /* Compute the total scattering probability at this ki */
            total = 0;
            /* Choose width of Gaussian distribution to sample the angle
             * phi on the Debye-Scherrer cone for the scattered neutron.
             * The radius of the Debye-Scherrer cone is smaller by a
             * factor 1/cos(theta) than the radius of the (partial) sphere
             * describing the possible orientations of Q due to mosaicity, so we
             * start with a width 1/cos(theta) greater than the largest of
             * the two mosaics. */
            mos_sample = mos_rms_max / cos (theta);
            c1x = kix * (cos_2theta - 1);
            c1y = kiy * (cos_2theta - 1);
            c1z = kiz * (cos_2theta - 1);
            /* Loop, repeatedly reducing the sample width until it is small
             * enough to avoid sampling scattering directions with
             * ridiculously low scattering probability.
             * Use a cut-off at 5 times the gauss width for considering
             * scattering probability as well as for integration limits
             * when integrating the sampled distribution below. */
            for (i = 0; i < 100; i++) {
              w = 5 * mos_sample;
              cos_phi = cos (w);
              sin_phi = sin (w);
              q_x = c1x + cos_phi * ax + sin_phi * bx;
              q_y = (c1y + cos_phi * ay + sin_phi * by) / mos_rms_z;
              q_z = (c1z + cos_phi * az + sin_phi * bz) / mos_rms_y;
              /* Stop when we get near a factor of 25=5^2. */
              if (q_z * q_z + q_y * q_y < (25 / (2.0 / 3.0)) * (q_x * q_x))
                break;
              mos_sample *= (2.0 / 3.0);
            }
            /* Now integrate the chosen sampling distribution, using a
             * cut-off at five times sigma. */
            for (i = 0; i < (sizeof (Gauss_X) / sizeof (double)); i++) {
              phi = w * Gauss_X[i];
              cos_phi = cos (phi);
              sin_phi = sin (phi);
              q_x = c1x + cos_phi * ax + sin_phi * bx;
              q_y = c1y + cos_phi * ay + sin_phi * by;
              q_z = c1z + cos_phi * az + sin_phi * bz;
              p_reflect = GAUSS_monocurved ((q_z / q_x), 0, mos_rms_y) * GAUSS_monocurved ((q_y / q_x), 0, mos_rms_z);
              total += Gauss_W[i] * p_reflect;
            }
            total *= w;
            /* Choose point on Debye-Scherrer cone. Sample from a Gaussian of
             * width 1/cos(theta) greater than the mosaic and correct for any
             * error by adjusting the neutron weight later. */
            phi = mos_sample * randnorm ();
            /* Compute final wave vector kf and scattering vector q = ki - kf */
            cos_phi = cos (phi);
            sin_phi = sin (phi);
            q_x = c1x + cos_phi * ax + sin_phi * bx;
            q_y = c1y + cos_phi * ay + sin_phi * by;
            q_z = c1z + cos_phi * az + sin_phi * bz;
            p_reflect = GAUSS_monocurved ((q_z / q_x), 0, mos_rms_y) * GAUSS_monocurved ((q_y / q_x), 0, mos_rms_z);

            vx = K2V * (kix + q_x);
            vy = K2V * (kiy + q_y);
            vz = K2V * (kiz + q_z);
            p_reflect /= total * GAUSS_monocurved (phi, 0, mos_sample);
            if (p_reflect <= 0)
              ABSORB;
            if (p_reflect > 1)
              p_reflect = 1;
            p = p * p_reflect;

          } /* End MC choice to reflect or transmit neutron (if tmp<p_reflect) */
          else {
            do_transmit = 1;
          }
          /* else transmit neutron */
        } /* End bragg scattering possible (if order) */
        else {
          do_transmit = 1;
        }
        if (do_transmit) {
          double my_t0;
          if (tTableFlag != 0) {
            my_t0 = t0 * Table_Value (tTable, k, 1); /* 2nd column */
          } else
            my_t0 = t0;
          /* do not SCATTER, else GROUP does not work */
          if (my_t0 > 1) {
            if (my_t0 > 1.01 && verbose)
              fprintf (stdout, "Warning: Monochromator_curved : lowered transmission from %f to 1 (k=%f)\n", my_t0, k);
            my_t0 = 0.999;
          }
          if (my_t0 > 0)
            p = p * my_t0;
          else
            ABSORB;
        }
      } /* end if not in gap */
      /* rotate back in component frame */
      Rotation TT;
      rot_transpose (T, TT);
      /* now make the coordinate system change */
      mccoordschange_polarisation (TT, &vx, &vy, &vz);
      coords_get (rot_apply (TT, coords_set (x, y, z)), &x, &y, &z);
      y = y + center_y;
      z = z + center_z;
      /* Visualise scattering point in proper, component frame
         - but only if the neutron is reflected, that is none of:
         * transmitted
         * falling outside the slab material */
      if (!do_transmit)
        SCATTER;

      /* mccoordschange_polarisation(tt, &sx, &sy, &sz); */
    } /* End intersect the crystal (if z) */
    else {
      /* restore neutron state when no interaction */
      RESTORE_NEUTRON (INDEX_CURRENT_COMP, x, y, z, vx, vy, vz, t, sx, sy, sz, p);
    }
  } /* End neutron moving towards crystal (if vx)*/
#ifndef NOABSORB_INF_NAN
  /* Check for nan or inf particle parms */ 
  if(isnan(p + t + vx + vy + vz + x + y + z)) ABSORB;
  if(isinf(fabs(p) + fabs(t) + fabs(vx) + fabs(vy) + fabs(vz) + fabs(x) + fabs(y) + fabs(z))) ABSORB;
#else
  if(isnan(p)  ||  isinf(p)) printf("NAN or INF found in p,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(t)  ||  isinf(t)) printf("NAN or INF found in t,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vx) || isinf(vx)) printf("NAN or INF found in vx, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vy) || isinf(vy)) printf("NAN or INF found in vy, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vz) || isinf(vz)) printf("NAN or INF found in vz, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(x)  ||  isinf(x)) printf("NAN or INF found in x,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(y)  ||  isinf(y)) printf("NAN or INF found in y,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(z)  ||  isinf(z)) printf("NAN or INF found in z,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
#endif

  #define flag (_particle->flag)
  #define ncol_25 (_particle->ncol_25)
  #define nrow_25 (_particle->nrow_25)
  #define ncol_37 (_particle->ncol_37)
  #define nrow_37 (_particle->nrow_37)
  #define ncol_114 (_particle->ncol_114)
  #define nrow_114 (_particle->nrow_114)
  #define ncol_130 (_particle->ncol_130)
  #define nrow_130 (_particle->nrow_130)
if (_comp->_index == 25) { // EXTEND 'H53_ThALES_Monochromator'
  flag=SCATTERED;
}
if (_comp->_index == 114) { // EXTEND 'H521_D16_Monochromator'
  flag=SCATTERED;
}
if (_comp->_index == 130) { // EXTEND 'H521_SADAM_Monochromator'
  if (!SCATTERED) ABSORB;
}
  #undef flag
  #undef ncol_25
  #undef nrow_25
  #undef ncol_37
  #undef nrow_37
  #undef ncol_114
  #undef nrow_114
  #undef ncol_130
  #undef nrow_130

  #undef reflect
  #undef transmit
  #undef zwidth
  #undef yheight
  #undef gap
  #undef NH
  #undef NV
  #undef mosaich
  #undef mosaicv
  #undef r0
  #undef t0
  #undef Q
  #undef RV
  #undef RH
  #undef DM
  #undef mosaic
  #undef width
  #undef height
  #undef verbose
  #undef order
  #undef mos_rms_y
  #undef mos_rms_z
  #undef mos_rms_max
  #undef mono_Q
  #undef SlabWidth
  #undef SlabHeight
  #undef rTable
  #undef tTable
  #undef rTableFlag
  #undef tTableFlag
  #undef tiltH
  #undef tiltV
  #undef ncol_var
  #undef nrow_var
  return;
} /* class_Monochromator_curved_trace */

#pragma acc routine
void class_Isotropic_Sqw_trace(_class_Isotropic_Sqw *_comp
  , _class_particle *_particle) {
  ABSORBED=SCATTERED=RESTORE=0;
  #define powder_format (_comp->_parameters.powder_format)
  #define Sqw_coh (_comp->_parameters.Sqw_coh)
  #define Sqw_inc (_comp->_parameters.Sqw_inc)
  #define geometry (_comp->_parameters.geometry)
  #define radius (_comp->_parameters.radius)
  #define thickness (_comp->_parameters.thickness)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define zdepth (_comp->_parameters.zdepth)
  #define threshold (_comp->_parameters.threshold)
  #define order (_comp->_parameters.order)
  #define T (_comp->_parameters.T)
  #define verbose (_comp->_parameters.verbose)
  #define d_phi (_comp->_parameters.d_phi)
  #define concentric (_comp->_parameters.concentric)
  #define rho (_comp->_parameters.rho)
  #define sigma_abs (_comp->_parameters.sigma_abs)
  #define sigma_coh (_comp->_parameters.sigma_coh)
  #define sigma_inc (_comp->_parameters.sigma_inc)
  #define classical (_comp->_parameters.classical)
  #define powder_Dd (_comp->_parameters.powder_Dd)
  #define powder_DW (_comp->_parameters.powder_DW)
  #define powder_Vc (_comp->_parameters.powder_Vc)
  #define density (_comp->_parameters.density)
  #define weight (_comp->_parameters.weight)
  #define p_interact (_comp->_parameters.p_interact)
  #define norm (_comp->_parameters.norm)
  #define powder_barns (_comp->_parameters.powder_barns)
  #define quantum_correction (_comp->_parameters.quantum_correction)
  #define VarSqw (_comp->_parameters.VarSqw)
  #define columns (_comp->_parameters.columns)
  #define offdata (_comp->_parameters.offdata)
  SIG_MESSAGE("[_H53_ThALES_Sample_trace] component H53_ThALES_Sample=Isotropic_Sqw() TRACE [Isotropic_Sqw:0]");


  int intersect = 0;        /* flag to continue/stop */
  double t0, t1, t2, t3;    /* times for intersections */
  double dt0, dt1, dt2, dt; /* time intervals */
  double k = 0, Ei = 0;
  double v = 0, vf = 0;
  double d_path;                   /* total path length for straight trajectory */
  double my_a;                     /* absorption cross-section scaled to velocity (2200) */
  double ws, p_scatt;              /* probability for scattering/absorption and for */
                                   /* interaction along d_path */
  double tmp_rand;                 /* temporary var */
  double ratio_w = 0, ratio_q = 0; /* variables for bilinear interpolation */
  double q11, q21, q22, q12;
  double omega = 0;               /* energy transfer */
  double q = 0;                   /* wavevector transfer */
  long index_w;                   /* energy index for table look-up SW */
  long index_q;                   /* Q index for table look-up P(Q|w) */
  double theta = 0, costheta = 0; /* for the choice of kf direction */
  double u1x, u1y, u1z;
  double u2x, u2y, u2z;
  double u0x, u0y, u0z;
  int index_counter;
  int flag = 0;
  int flag_concentric = 0;
  int flag_ishollow = 0;
  double solid_angle = 0;
  double my_t = 0;
  double p_mult = 1;
  double mc_trans, p_trans, mc_scatt;
  double coh = 0, inc = 0;
  struct Sqw_Data_struct Data_sqw;
  double d_phi_thread = d_phi;

  char type;

  double ki_x, ki_y, ki_z, ti, vi, ki;
  double kf_x, kf_y, kf_z, tf, kf;

  /* Store Initial neutron state */

  ki_x = V2K * vx;
  ki_y = V2K * vy;
  ki_z = V2K * vz;
  ti = t;
  vi = 0;
  ki = 0;
  type = '\0';

  #ifdef OPENACC
  #ifdef USE_OFF
  off_struct thread_offdata = offdata;
  #endif
  #else
  #define thread_offdata offdata
  #endif

  do { /* Main interaction loop. Ends with intersect=0 */

    /* Intersection neutron trajectory / sample (sample surface) */
    if (VarSqw.s_coh > 0 || VarSqw.s_inc > 0) {
      if (thickness >= 0) {
        if (VarSqw.shape == 0)
          intersect = cylinder_intersect (&t0, &t3, x, y, z, vx, vy, vz, radius, yheight);
        else if (VarSqw.shape == 1)
          intersect = box_intersect (&t0, &t3, x, y, z, vx, vy, vz, xwidth, yheight, zdepth);
        else if (VarSqw.shape == 2)
          intersect = sphere_intersect (&t0, &t3, x, y, z, vx, vy, vz, radius);
        #ifdef USE_OFF
        else if (VarSqw.shape == 3)
          intersect = off_intersect (&t0, &t3, NULL, NULL, x, y, z, vx, vy, vz, 0, 0, 0, thread_offdata);
        #endif
      } else {
        if (VarSqw.shape == 0)
          intersect = cylinder_intersect (&t0, &t3, x, y, z, vx, vy, vz, radius - thickness, yheight - 2 * thickness > 0 ? yheight - 2 * thickness : yheight);
        else if (VarSqw.shape == 1)
          intersect
              = box_intersect (&t0, &t3, x, y, z, vx, vy, vz, xwidth - 2 * thickness > 0 ? xwidth - 2 * thickness : xwidth,
                               yheight - 2 * thickness > 0 ? yheight - 2 * thickness : yheight, zdepth - 2 * thickness > 0 ? zdepth - 2 * thickness : zdepth);
        else if (VarSqw.shape == 2)
          intersect = sphere_intersect (&t0, &t3, x, y, z, vx, vy, vz, radius - thickness);
        #ifdef USE_OFF
        else if (VarSqw.shape == 3)
          intersect = off_intersect (&t0, &t3, NULL, NULL, x, y, z, vx, vy, vz, 0, 0, 0, thread_offdata);
        #endif
      }
    } else
      intersect = 0;

    /* Computing the intermediate times */
    if (intersect) {
      flag_ishollow = 0;
      if (thickness > 0) {
        if (VarSqw.shape == 0
            && cylinder_intersect (&t1, &t2, x, y, z, vx, vy, vz, radius - thickness, yheight - 2 * thickness > 0 ? yheight - 2 * thickness : yheight))
          flag_ishollow = 1;
        else if (VarSqw.shape == 2 && sphere_intersect (&t1, &t2, x, y, z, vx, vy, vz, radius - thickness))
          flag_ishollow = 1;
        else if (VarSqw.shape == 1
                 && box_intersect (&t1, &t2, x, y, z, vx, vy, vz, xwidth - 2 * thickness > 0 ? xwidth - 2 * thickness : xwidth,
                                   yheight - 2 * thickness > 0 ? yheight - 2 * thickness : yheight, zdepth - 2 * thickness > 0 ? zdepth - 2 * thickness : zdepth))
          flag_ishollow = 1;
      } else if (thickness < 0) {
        if (VarSqw.shape == 0 && cylinder_intersect (&t1, &t2, x, y, z, vx, vy, vz, radius, yheight))
          flag_ishollow = 1;
        else if (VarSqw.shape == 2 && sphere_intersect (&t1, &t2, x, y, z, vx, vy, vz, radius))
          flag_ishollow = 1;
        else if (VarSqw.shape == 1 && box_intersect (&t1, &t2, x, y, z, vx, vy, vz, xwidth, yheight, zdepth))
          flag_ishollow = 1;
      }
      if (!flag_ishollow)
        t1 = t2 = t3; /* no empty space inside */
    } else
      break; /* neutron does not hit sample: transmitted  */

    if (intersect) { /* the neutron hits the sample */

      if (t0 > 0) {                   /* we are before the sample */
        PROP_DT (t0);                 /* propagates neutron to the entry of the sample */
      } else if (t1 > 0 && t1 > t0) { /* we are inside first part of the sample */
        /* no propagation, stay inside */
      } else if (t2 > 0 && t2 > t1) { /* we are in the hole */
        PROP_DT (t2);                 /* propagate to inner surface of 2nd part of sample */
      } else if (t3 > 0 && t3 > t2) { /* we are in the 2nd part of sample */
        /* no propagation, stay inside */
      }

      dt0 = t1 - (t0 > 0 ? t0 : 0); /* Time in first part of hollow/cylinder/box */
      dt1 = t2 - (t1 > 0 ? t1 : 0); /* Time in hole */
      dt2 = t3 - (t2 > 0 ? t2 : 0); /* Time in 2nd part of hollow cylinder */

      if (dt0 < 0)
        dt0 = 0;
      if (dt1 < 0)
        dt1 = 0;
      if (dt2 < 0)
        dt2 = 0;

      /* initialize concentric mode */
      if (concentric && !flag_concentric && t0 >= 0 && VarSqw.shape == 0 && thickness) {
        flag_concentric = 1;
      }

      if (flag_concentric == 1) {
        dt1 = dt2 = 0; /* force exit when reaching hole/2nd part */
      }

      if (!dt0 && !dt2) {
        intersect = 0; /* the sample was passed entirely */
        break;
      }

      VarSqw.neutron_enter++;
      p_mult = 1;
      if (!v) {
        v = vx * vx + vy * vy + vz * vz;
        v = sqrt (v);
      }
      k = V2K * v;
      Ei = VS2E * v * v;

      if (!vi)
        vi = v;
      if (!ki)
        ki = k;

      if (v <= 0) {
        printf ("Isotropic_Sqw: %s: ERROR: Null velocity !\n", NAME_CURRENT_COMP);
        VarSqw.neutron_removed++;
        ABSORB; /* should never occur */
      }

      /* check for scattering event */
      my_a = VarSqw.my_a_v / v; /* absorption 'mu' */
      /* compute total scattering X section */
      /* \int q S(q) dq /2 /ki^2 sigma  OR  bare Xsection*/
      /* contains the 4*PI*kf/ki factor */
      coh = VarSqw.s_coh;
      inc = VarSqw.s_inc;
      if (k && VarSqw.s_coh > 0 && VarSqw.Data_coh.intensity) {
        double Ei = VS2E * v * v;
        double index_Ei = Ei / (VarSqw.Data_coh.Ei_max / VarSqw.Data_coh.iqSq_length);
        coh = Table_Value2d (VarSqw.Data_coh.iqSq, index_Ei, 0);
      }
      if (k && VarSqw.s_inc > 0 && VarSqw.Data_inc.intensity) {
        double Ei = VS2E * v * v;
        double index_Ei = Ei / (VarSqw.Data_inc.Ei_max / VarSqw.Data_inc.iqSq_length);
        inc = Table_Value2d (VarSqw.Data_inc.iqSq, index_Ei, 0);
      }
      if (coh < 0)
        coh = 0;
      if (inc < 0)
        inc = 0;
      VarSqw.my_s = (VarSqw.mat_rho * 100 * (coh + inc));

      my_t = my_a + VarSqw.my_s; /* total scattering Xsect */
      if (my_t <= 0) {
        if (VarSqw.neutron_removed < VarSqw.maxloop)
          printf ("Isotropic_Sqw: %s: ERROR: Null total cross section %g. Removing event.\n", NAME_CURRENT_COMP, my_t);
        VarSqw.neutron_removed++;
        ABSORB; /* should never occur */
      } else if (VarSqw.my_s <= 0) {
        if (VarSqw.verbose_output > 1 && VarSqw.neutron_removed < VarSqw.maxloop)
          printf ("Isotropic_Sqw: %s: Warning: Null scattering cross section %g. Ignoring.\n", NAME_CURRENT_COMP, VarSqw.my_s);
        VarSqw.my_s = 0;
      }

      /* Proba of scattering vs absorption (integrating along the whole trajectory) */
      ws = VarSqw.my_s / my_t;  /* (inc+coh)/(inc+coh+abs) */
      d_path = v * (dt0 + dt2); /* total path lenght in sample */
      /* Proba of transmission/interaction along length d_path */
      p_trans = exp (-my_t * d_path);
      p_scatt = 1 - p_trans; /* portion of beam which scatters */

      flag = 0; /* flag used for propagation to exit point before ending */

      /* are we next to the exit ? probably no scattering (avoid rounding errors) */
      if (VarSqw.my_s * d_path <= 4e-7) {
        flag = 1; /* No interaction before the exit */
      }
      /* force a given fraction of the beam to scatter */
      if (p_interact > 0 && p_interact <= 1) {
        /* we force a portion of the beam to interact */
        /* This is used to improve statistics on single scattering (and multiple) */
        if (!SCATTERED)
          mc_trans = 1 - p_interact;
        else
          mc_trans = 1 - p_interact / (4 * SCATTERED + 1); /* reduce effect on multi scatt */
      } else {
        mc_trans = p_trans; /* 1 - p_scatt */
      }
      mc_scatt = 1 - mc_trans; /* portion of beam to scatter (or force to) */
      if (mc_scatt <= 0 || mc_scatt > 1)
        flag = 1;
      /* MC choice: Interaction or transmission ? */
      if (!flag && mc_scatt > 0 && (mc_scatt >= 1 || rand01 () < mc_scatt)) { /* Interaction neutron/sample */
        p_mult *= ws;                                                         /* Update weight ; account for absorption and retain scattered fraction */
        /* we have chosen portion mc_scatt of beam instead of p_scatt, so we compensate */
        if (!mc_scatt)
          ABSORB;
        p_mult *= fabs (p_scatt / mc_scatt); /* lower than 1 */
      } else {
        flag = 1; /* Transmission : no interaction neutron/sample */
        if (!type)
          type = 't';
        if (!mc_trans)
          ABSORB;
        p_mult *= fabs (p_trans / mc_trans); /* attenuate beam by portion which is scattered (and left along) */
      }

      if (flag) { /* propagate to exit of sample and finish */
        intersect = 0;
        p *= p_mult; /* apply absorption correction */
        PROP_DT (dt0 + dt2);
        break; /* exit main multi scatt while loop */
      }
    } /* end if intersect the neutron hits the sample */
    else
      break;

    if (intersect) { /* scattering event */
      double kf = 0, kf1, kf2;
      /* mean scattering probability and absorption fraction */
      VarSqw.mean_scatt += (1 - exp (-VarSqw.my_s * d_path)) * p;
      VarSqw.mean_abs += (1 - ws) * p;
      VarSqw.psum_scatt += p;

      /* Decaying exponential distribution of the path length before scattering */
      /* Select a point at which to scatter the neutron, taking
           secondary extinction into account. */
      if (my_t * d_path < 1e-6)
        /* For very weak scattering, use simple uniform sampling of scattering
           point to avoid rounding errors. */
        dt = rand0max (d_path); /* length */
      else
        dt = -log (1 - rand0max ((1 - exp (-my_t * d_path)))) / my_t; /* length */
      dt /= v;                                                        /* Time from present position to scattering point */

      /* If t0 is in hole, propagate to next part of the hollow cylinder */
      if (dt1 > 0 && dt0 > 0 && dt > dt0)
        dt += dt1;

      /* Neutron propagation to the scattering point */
      PROP_DT (dt);

      /* choice between coherent/incoherent scattering */
      tmp_rand = rand01 ();
      /* local description at the scattering point (scat probability for atom) */
      tmp_rand *= (coh + inc);

      flag = 0;
      if (VarSqw.s_inc > 0 && tmp_rand < inc) {
        /* CASE 1: incoherent case */
        if (!VarSqw.Data_inc.intensity) {
          /* CASE 1a: no incoherent Sqw from file, use isotropic V-like */
          if (d_phi_thread && order == 1) {
            randvec_target_rect_angular (&u1x, &u1y, &u1z, &solid_angle, vx, vy, vz, 2 * PI, d_phi_thread, ROT_A_CURRENT_COMP);
            p_mult *= solid_angle / 4 / PI; /* weighted by focused range to total range */
          } else
            randvec_target_circle (&u1x, &u1y, &u1z, NULL, vx, vy, vz, 0);

          vx = u1x;
          vy = u1y;
          vz = u1z;
          vf = v;
          kf = k;
          if (!type)
            type = 'v';
          SCATTER;
        } else {
          /* CASE 1b: incoherent Sqw from file */
          if (VarSqw.Data_inc.intensity) {
            Data_sqw = VarSqw.Data_inc;
            if (!type)
              type = 'i';
            flag = 1;
          }
        }
      } else if (VarSqw.s_coh > 0 && tmp_rand > VarSqw.s_inc) {
        if (VarSqw.Data_coh.intensity) {
          /* CASE2: coherent case */
          Data_sqw = VarSqw.Data_coh;
          if (!type)
            type = 'c';
          flag = 1;
        }
      }

      if (flag) { /* true when S(q,w) table exists (Data_sqw) */

        double alpha = 0, alpha0;
        /* give us a limited number of tries for scattering: choose W then Q */
        for (index_counter = VarSqw.maxloop; index_counter > 0; index_counter--) {

          /* MC choice: energy transfer w=Ei-Ef in the S(w) = SW */
          omega = 0;
          tmp_rand = rand01 ();
          /* energy index for rand > cumul SW */
          index_w = Sqw_search_SW (Data_sqw, tmp_rand);
          VarSqw.rw = (double)index_w;
          if (index_w >= 0 && &(Data_sqw.SW[index_w]) != NULL) {
            if (Data_sqw.w_bins > 1) {
              double w1, w2;
              if (index_w > 0) { /* interpolate linearly energy */
                ratio_w = (tmp_rand - Data_sqw.SW[index_w - 1].cumul_proba) / (Data_sqw.SW[index_w].cumul_proba - Data_sqw.SW[index_w - 1].cumul_proba);
                /* ratio_w=0 omega[index_w-1], ratio=1 omega[index] */
                w1 = Data_sqw.SW[index_w - 1].omega;
                w2 = Data_sqw.SW[index_w].omega;
              } else { /* index_w = 0 interpolate to 0 energy */
                /* ratio_w=0 omega=0, ratio=1 omega[index] */
                w1 = Data_sqw.SW[index_w].omega;
                w2 = Data_sqw.SW[index_w + 1].omega;
                if (!w2 && index_w + 1 < Data_sqw.w_bins)
                  w2 = Data_sqw.SW[index_w + 1].omega;
                if (Data_sqw.w_bins && Data_sqw.SW[index_w].cumul_proba) {
                  ratio_w = tmp_rand / Data_sqw.SW[index_w].cumul_proba;
                } else
                  ratio_w = 0;
              }
              if (ratio_w < 0)
                ratio_w = 0;
              else if (ratio_w > 1)
                ratio_w = 1;
              omega = (1 - ratio_w) * w1 + ratio_w * w2;
            } else {
              ratio_w = 0;
              omega = Data_sqw.SW[index_w].omega;
            }
          } else {
            if (VarSqw.verbose_output >= 3 && VarSqw.neutron_removed < VarSqw.maxloop)
              printf ("Isotropic_Sqw: %s: Warning: No suitable w transfer for index_w=%li.\n", NAME_CURRENT_COMP, index_w);
            continue; /* no W value: try again with an other energy transfer */
          }

          /* MC choice: momentum transfer Q in P(Q|w) */
          tmp_rand = rand01 ();

          /* momentum index for rand > cumul SQ|W */
          index_q = Sqw_search_Q_proba_per_w (Data_sqw, tmp_rand, index_w);
          VarSqw.rq = (double)index_q;

          if (index_q >= 0 && &(Data_sqw.SQW[index_w]) != NULL) {
            if (Data_sqw.q_bins > 1 && index_q > 0) {
              if (index_w > 0 && Data_sqw.w_bins > 1) {
                /* bilinear interpolation on - side: index_w > 0, index_q > 0 */
                ratio_q = (tmp_rand - Data_sqw.SQW[index_w][index_q - 1].cumul_proba)
                          / (Data_sqw.SQW[index_w][index_q].cumul_proba - Data_sqw.SQW[index_w][index_q - 1].cumul_proba);
                q22 = Data_sqw.SQW[index_w][index_q].Q;
                q11 = Data_sqw.SQW[index_w - 1][index_q - 1].Q;
                q21 = Data_sqw.SQW[index_w][index_q - 1].Q;
                q12 = Data_sqw.SQW[index_w - 1][index_q].Q;
                if (ratio_q < 0)
                  ratio_q = 0;
                else if (ratio_q > 1)
                  ratio_q = 1;
                q = (1 - ratio_w) * (1 - ratio_q) * q11 + ratio_w * (1 - ratio_q) * q21 + ratio_w * ratio_q * q22 + (1 - ratio_w) * ratio_q * q12;
              } else { /* bilinear interpolation on + side: index_w=0, index_q > 0 */
                ratio_q = (tmp_rand - Data_sqw.SQW[index_w][index_q - 1].cumul_proba)
                          / (Data_sqw.SQW[index_w][index_q].cumul_proba - Data_sqw.SQW[index_w][index_q - 1].cumul_proba);
                q11 = Data_sqw.SQW[index_w][index_q - 1].Q;
                q12 = Data_sqw.SQW[index_w][index_q].Q;
                if (ratio_q < 0)
                  ratio_q = 0;
                else if (ratio_q > 1)
                  ratio_q = 1;
                if (index_w < Data_sqw.w_bins - 1 && Data_sqw.w_bins > 1) {
                  q22 = Data_sqw.SQW[index_w + 1][index_q].Q;
                  q21 = Data_sqw.SQW[index_w + 1][index_q - 1].Q;
                  q = (1 - ratio_w) * (1 - ratio_q) * q11 + ratio_w * (1 - ratio_q) * q21 + ratio_w * ratio_q * q22 + (1 - ratio_w) * ratio_q * q12;
                } else {
                  q = (1 - ratio_q) * q11 + ratio_q * q12;
                }
              }
            } else {
              q = Data_sqw.SQW[index_w][index_q].Q;
            }
          } else {
            if (VarSqw.verbose_output >= 3 && VarSqw.neutron_removed < VarSqw.maxloop)
              printf ("Isotropic_Sqw: %s: Warning: No suitable q transfer for w=%g.\n", NAME_CURRENT_COMP, omega);
            VarSqw.neutron_removed++;
            continue; /* no Q value for this w choice */
          }

          /* Search for length of final wave vector kf */
          /* kf is such that : hbar*w = hbar*hbar/2/m*(k*k - kf*kf) */
          /* acceptable values for kf are kf1 and kf2 */
          if (!solve_2nd_order (&kf1, &kf2, 1, 0, -k * k + VarSqw.sqSE2K * omega)) {
            if (VarSqw.verbose_output >= 3 && VarSqw.neutron_removed < VarSqw.maxloop)
              printf ("Isotropic_Sqw: %s: Warning: imaginary root for w=%g q=%g Ei=%g (triangle can not close)\n", NAME_CURRENT_COMP, omega, q, Ei);
            VarSqw.neutron_removed++;
            continue; /* all roots are imaginary */
          }

          /* kf1 and kf2 are opposite */
          kf = fabs (kf1);
          vf = K2V * kf;

          /* Search of the direction of kf such that : q = ki - kf */
          /* cos theta = (ki2+kf2-q2)/(2ki kf) */

          costheta = (k * k + kf * kf - q * q) / (2 * kf * k); /* this is cos(theta) */

          if (-1 < costheta && costheta < 1) {
            break; /* satisfies q momentum conservation */
          }
          /*      else continue; */

          /* exit for loop on success */
        } /* end for index_counter */

        if (!index_counter) { /* for loop ended: failure for scattering */
          intersect = 0;      /* Could not scatter: finish multiple scattering loop */
          if (VarSqw.verbose_output >= 2 && VarSqw.neutron_removed < VarSqw.maxloop)
            printf ("Isotropic_Sqw: %s: Warning: No scattering [q,w] conditions\n"
                    "               last try (%i): type=%c w=%g q=%g cos(theta)=%g k=%g\n",
                    NAME_CURRENT_COMP, VarSqw.maxloop, (type ? type : '-'), omega, q, costheta, k);
          VarSqw.neutron_removed++;
          if (order && SCATTERED != order)
            ABSORB;
          break; /* finish multiple scattering loop */
        }

        /* scattering angle from ki to DS cone */
        theta = acos (costheta);

        /* Choose point on Debye-Scherrer cone */
        if (order == 1 && d_phi_thread) { /* relate height of detector to the height on DS cone */
          double cone_focus;
          cone_focus = sin (d_phi_thread / 2) / sin (theta);
          /* If full Debye-Scherrer cone is within d_phi_thread, don't focus */
          if (cone_focus < -1 || cone_focus > 1)
            d_phi_thread = 0;
          /* Otherwise, determine alpha to rotate from scattering plane
              into d_phi_thread focusing area*/
          else
            alpha = 2 * asin (cone_focus);
          if (d_phi_thread)
            p_mult *= alpha / PI;
        }
        if (d_phi_thread) {
          /* Focusing */
          alpha = fabs (alpha);
          /* Trick to get scattering for pos/neg theta's */
          alpha0 = 2 * rand01 () * alpha;
          if (alpha0 > alpha) {
            alpha0 = PI + (alpha0 - 1.5 * alpha);
          } else {
            alpha0 = alpha0 - 0.5 * alpha;
          }
        } else
          alpha0 = PI * randpm1 ();

        /* now find a nearly vertical rotation axis (u1) :
         * Either
         *  (v along Z) x (X axis) -> nearly Y axis
         * Or
         *  (v along X) x (Z axis) -> nearly Y axis
         */
        if (fabs (scalar_prod (1, 0, 0, vx / v, vy / v, vz / v)) < fabs (scalar_prod (0, 0, 1, vx / v, vy / v, vz / v))) {
          u1x = 1;
          u1y = u1z = 0;
        } else {
          u1x = u1y = 0;
          u1z = 1;
        }
        vec_prod (u2x, u2y, u2z, vx, vy, vz, u1x, u1y, u1z);

        /* handle case where v and aim are parallel */
        if (!u2x && !u2y && !u2z) {
          u2x = u2z = 0;
          u2y = 1;
        }

        /* u1 = rotate 'v' by theta around u2: DS scattering angle, nearly in horz plane */
        rotate (u1x, u1y, u1z, vx, vy, vz, theta, u2x, u2y, u2z);

        /* u0 = rotate u1 by alpha0 around 'v' (Debye-Scherrer cone) */
        rotate (u0x, u0y, u0z, u1x, u1y, u1z, alpha0, vx, vy, vz);
        NORM (u0x, u0y, u0z);
        vx = u0x * vf;
        vy = u0y * vf;
        vz = u0z * vf;

        SCATTER;

        v = vf;
        k = kf; /* for next iteration */

      } /* end if (flag) */

      VarSqw.neutron_exit++;
      p *= p_mult;
      if (p_mult > 1)
        VarSqw.neutron_pmult++;

      /* test for a given multiple order */
      if (order && SCATTERED >= order) {
        intersect = 0; /* reached required number of SCATTERing */
        break;         /* finish multiple scattering loop */
      }

    } /* end if (intersect) scattering event  */

  } while (intersect); /* end do (intersect) (multiple scattering loop) */

  /* Store Final neutron state */
  kf_x = V2K * vx;
  kf_y = V2K * vy;
  kf_z = V2K * vz;
  tf = t;
  vf = v;
  kf = k;
  VarSqw.theta = theta;

  if (SCATTERED) {

    if (SCATTERED == 1) {
      if (type == 'c')
        VarSqw.single_coh += p;
      else
        VarSqw.single_inc += p;
      VarSqw.dq = sqrt ((kf_x - ki_x) * (kf_x - ki_x) + (kf_y - ki_y) * (kf_y - ki_y) + (kf_z - ki_z) * (kf_z - ki_z));
      VarSqw.dw = VS2E * (vf * vf - vi * vi);
    } else
      VarSqw.multi += p;

  } else
    VarSqw.dq = VarSqw.dw = 0;

  /* end TRACE */
#ifndef NOABSORB_INF_NAN
  /* Check for nan or inf particle parms */ 
  if(isnan(p + t + vx + vy + vz + x + y + z)) ABSORB;
  if(isinf(fabs(p) + fabs(t) + fabs(vx) + fabs(vy) + fabs(vz) + fabs(x) + fabs(y) + fabs(z))) ABSORB;
#else
  if(isnan(p)  ||  isinf(p)) printf("NAN or INF found in p,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(t)  ||  isinf(t)) printf("NAN or INF found in t,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vx) || isinf(vx)) printf("NAN or INF found in vx, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vy) || isinf(vy)) printf("NAN or INF found in vy, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vz) || isinf(vz)) printf("NAN or INF found in vz, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(x)  ||  isinf(x)) printf("NAN or INF found in x,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(y)  ||  isinf(y)) printf("NAN or INF found in y,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(z)  ||  isinf(z)) printf("NAN or INF found in z,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
#endif

  #define flag (_particle->flag)
  #define ncol_25 (_particle->ncol_25)
  #define nrow_25 (_particle->nrow_25)
  #define ncol_37 (_particle->ncol_37)
  #define nrow_37 (_particle->nrow_37)
  #define ncol_114 (_particle->ncol_114)
  #define nrow_114 (_particle->nrow_114)
  #define ncol_130 (_particle->ncol_130)
  #define nrow_130 (_particle->nrow_130)
if (_comp->_index == 31) { // EXTEND 'H53_ThALES_Sample'
  if (!SCATTERED) ABSORB;
}
if (_comp->_index == 120) { // EXTEND 'H521_D16_Sample'
  if (!SCATTERED) ABSORB;
}
if (_comp->_index == 135) { // EXTEND 'H521_SADAM_Sample'
  if (!SCATTERED) ABSORB;
}
if (_comp->_index == 314) { // EXTEND 'H51_D22_Sample'
  if (!SCATTERED) ABSORB;
}
  #undef flag
  #undef ncol_25
  #undef nrow_25
  #undef ncol_37
  #undef nrow_37
  #undef ncol_114
  #undef nrow_114
  #undef ncol_130
  #undef nrow_130

  #undef powder_format
  #undef Sqw_coh
  #undef Sqw_inc
  #undef geometry
  #undef radius
  #undef thickness
  #undef xwidth
  #undef yheight
  #undef zdepth
  #undef threshold
  #undef order
  #undef T
  #undef verbose
  #undef d_phi
  #undef concentric
  #undef rho
  #undef sigma_abs
  #undef sigma_coh
  #undef sigma_inc
  #undef classical
  #undef powder_Dd
  #undef powder_DW
  #undef powder_Vc
  #undef density
  #undef weight
  #undef p_interact
  #undef norm
  #undef powder_barns
  #undef quantum_correction
  #undef VarSqw
  #undef columns
  #undef offdata
  return;
} /* class_Isotropic_Sqw_trace */

#pragma acc routine
void class_Collimator_linear_trace(_class_Collimator_linear *_comp
  , _class_particle *_particle) {
  ABSORBED=SCATTERED=RESTORE=0;
  #define xmin (_comp->_parameters.xmin)
  #define xmax (_comp->_parameters.xmax)
  #define ymin (_comp->_parameters.ymin)
  #define ymax (_comp->_parameters.ymax)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define length (_comp->_parameters.length)
  #define divergence (_comp->_parameters.divergence)
  #define transmission (_comp->_parameters.transmission)
  #define divergenceV (_comp->_parameters.divergenceV)
  #define slope (_comp->_parameters.slope)
  #define slopeV (_comp->_parameters.slopeV)
  SIG_MESSAGE("[_SC3_trace] component SC3=Collimator_linear() TRACE [Collimator_linear:0]");

  double phi, dt;

  PROP_Z0;
  if (x < xmin || x > xmax || y < ymin || y > ymax)
    ABSORB;
  dt = length / vz;
  PROP_DT (dt);
  if (x < xmin || x > xmax || y < ymin || y > ymax)
    ABSORB;

  if (slope > 0.0) {
    phi = fabs (vx / vz);
    if (phi > slope)
      ABSORB;
    else
      p *= transmission * (1.0 - phi / slope);
    SCATTER;
  }
  if (slopeV > 0) {
    phi = fabs (vy / vz);
    if (phi > slopeV)
      ABSORB;
    else
      p *= transmission * (1.0 - phi / slopeV);
    SCATTER;
  }
#ifndef NOABSORB_INF_NAN
  /* Check for nan or inf particle parms */ 
  if(isnan(p + t + vx + vy + vz + x + y + z)) ABSORB;
  if(isinf(fabs(p) + fabs(t) + fabs(vx) + fabs(vy) + fabs(vz) + fabs(x) + fabs(y) + fabs(z))) ABSORB;
#else
  if(isnan(p)  ||  isinf(p)) printf("NAN or INF found in p,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(t)  ||  isinf(t)) printf("NAN or INF found in t,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vx) || isinf(vx)) printf("NAN or INF found in vx, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vy) || isinf(vy)) printf("NAN or INF found in vy, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vz) || isinf(vz)) printf("NAN or INF found in vz, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(x)  ||  isinf(x)) printf("NAN or INF found in x,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(y)  ||  isinf(y)) printf("NAN or INF found in y,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(z)  ||  isinf(z)) printf("NAN or INF found in z,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
#endif
  #undef xmin
  #undef xmax
  #undef ymin
  #undef ymax
  #undef xwidth
  #undef yheight
  #undef length
  #undef divergence
  #undef transmission
  #undef divergenceV
  #undef slope
  #undef slopeV
  return;
} /* class_Collimator_linear_trace */

#pragma acc routine
void class_Monitor_trace(_class_Monitor *_comp
  , _class_particle *_particle) {
  ABSORBED=SCATTERED=RESTORE=0;
  #define xmin (_comp->_parameters.xmin)
  #define xmax (_comp->_parameters.xmax)
  #define ymin (_comp->_parameters.ymin)
  #define ymax (_comp->_parameters.ymax)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define restore_neutron (_comp->_parameters.restore_neutron)
  #define Nsum (_comp->_parameters.Nsum)
  #define psum (_comp->_parameters.psum)
  #define p2sum (_comp->_parameters.p2sum)
  SIG_MESSAGE("[_He3H_trace] component He3H=Monitor() TRACE [Monitor:0]");

  PROP_Z0;
  if (x > xmin && x < xmax && y > ymin && y < ymax) {
    double p2 = p * p;
    #pragma acc atomic
    Nsum = Nsum + 1;
    #pragma acc atomic
    psum = psum + p;
    #pragma acc atomic
    p2sum = p2sum + p2;
    SCATTER;
  }
  if (restore_neutron) {
    RESTORE_NEUTRON (INDEX_CURRENT_COMP, x, y, z, vx, vy, vz, t, sx, sy, sz, p);
  }
#ifndef NOABSORB_INF_NAN
  /* Check for nan or inf particle parms */ 
  if(isnan(p + t + vx + vy + vz + x + y + z)) ABSORB;
  if(isinf(fabs(p) + fabs(t) + fabs(vx) + fabs(vy) + fabs(vz) + fabs(x) + fabs(y) + fabs(z))) ABSORB;
#else
  if(isnan(p)  ||  isinf(p)) printf("NAN or INF found in p,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(t)  ||  isinf(t)) printf("NAN or INF found in t,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vx) || isinf(vx)) printf("NAN or INF found in vx, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vy) || isinf(vy)) printf("NAN or INF found in vy, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vz) || isinf(vz)) printf("NAN or INF found in vz, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(x)  ||  isinf(x)) printf("NAN or INF found in x,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(y)  ||  isinf(y)) printf("NAN or INF found in y,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(z)  ||  isinf(z)) printf("NAN or INF found in z,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
#endif
  #undef xmin
  #undef xmax
  #undef ymin
  #undef ymax
  #undef xwidth
  #undef yheight
  #undef restore_neutron
  #undef Nsum
  #undef psum
  #undef p2sum
  return;
} /* class_Monitor_trace */

#pragma acc routine
void class_V_selector_trace(_class_V_selector *_comp
  , _class_particle *_particle) {
  ABSORBED=SCATTERED=RESTORE=0;
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define zdepth (_comp->_parameters.zdepth)
  #define radius (_comp->_parameters.radius)
  #define alpha (_comp->_parameters.alpha)
  #define length (_comp->_parameters.length)
  #define d (_comp->_parameters.d)
  #define nu (_comp->_parameters.nu)
  #define nslit (_comp->_parameters.nslit)
  #define omega (_comp->_parameters.omega)
  #define alpha_rad (_comp->_parameters.alpha_rad)
  SIG_MESSAGE("[_WASP_Vselector_trace] component WASP_Vselector=V_selector() TRACE [V_selector:0]");

  double dt0, dt1;
  double r_i, r_f, r_mean;
  double theta_i, theta_f;
  double A;
  double d_s_alpha;

  if (vz == 0)
    ABSORB;
  dt1 = (-zdepth / 2.0 - z) / vz;
  PROP_DT (dt1); /* Propagate to the entry aperture */
  if (x < (-xwidth / 2.0) || x > (xwidth / 2.0) || y < (-yheight / 2.0) || y > (yheight / 2.0))
    ABSORB;

  dt0 = (zdepth - length) / (2.0 * vz); /* Propagate to the cylinder start */
  PROP_DT (dt0);
  r_i = sqrt (x * x + (y + radius) * (y + radius));
  theta_i = atan2 (x, y + radius);

  dt1 = length / vz; /* Propagate along the cylinder length */
  PROP_DT (dt1);
  r_f = sqrt (x * x + (y + radius) * (y + radius));
  theta_f = atan2 (x, y + radius);

  dt0 = (zdepth - length) / (2.0 * vz); /* Propagate to the exit aperture */
  PROP_DT (dt0);
  if (x < (-xwidth / 2.0) || x > (xwidth / 2.0) || y < (-yheight / 2.0) || y > (yheight / 2.0))
    ABSORB;

  /* Calculate analytical transmission assuming continuous source */

  r_mean = (r_i + r_f) / 2.0; /* Approximation using mean radius */
  d_s_alpha = theta_f - theta_i;
  A = nslit / (2 * PI) * (d / r_mean + fabs (alpha_rad + d_s_alpha - omega * length / vz));
  if (A >= 1)
    ABSORB;
  p *= (1 - A);
  SCATTER;
#ifndef NOABSORB_INF_NAN
  /* Check for nan or inf particle parms */ 
  if(isnan(p + t + vx + vy + vz + x + y + z)) ABSORB;
  if(isinf(fabs(p) + fabs(t) + fabs(vx) + fabs(vy) + fabs(vz) + fabs(x) + fabs(y) + fabs(z))) ABSORB;
#else
  if(isnan(p)  ||  isinf(p)) printf("NAN or INF found in p,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(t)  ||  isinf(t)) printf("NAN or INF found in t,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vx) || isinf(vx)) printf("NAN or INF found in vx, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vy) || isinf(vy)) printf("NAN or INF found in vy, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vz) || isinf(vz)) printf("NAN or INF found in vz, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(x)  ||  isinf(x)) printf("NAN or INF found in x,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(y)  ||  isinf(y)) printf("NAN or INF found in y,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(z)  ||  isinf(z)) printf("NAN or INF found in z,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
#endif
  #undef xwidth
  #undef yheight
  #undef zdepth
  #undef radius
  #undef alpha
  #undef length
  #undef d
  #undef nu
  #undef nslit
  #undef omega
  #undef alpha_rad
  return;
} /* class_V_selector_trace */

#pragma acc routine
void class_Pol_mirror_trace(_class_Pol_mirror *_comp
  , _class_particle *_particle) {
  ABSORBED=SCATTERED=RESTORE=0;
  #define rUpPar (_comp->_parameters.rUpPar)
  #define rDownPar (_comp->_parameters.rDownPar)
  #define rUpData (_comp->_parameters.rUpData)
  #define rDownData (_comp->_parameters.rDownData)
  #define p_reflect (_comp->_parameters.p_reflect)
  #define zwidth (_comp->_parameters.zwidth)
  #define yheight (_comp->_parameters.yheight)
  #define rUpTable (_comp->_parameters.rUpTable)
  #define rUpTableFlag (_comp->_parameters.rUpTableFlag)
  #define rDownTable (_comp->_parameters.rDownTable)
  #define rDownTableFlag (_comp->_parameters.rDownTableFlag)
  SIG_MESSAGE("[_WASP_polariser_trace] component WASP_polariser=Pol_mirror() TRACE [Pol_mirror:0]");

  double Q, Rup, Rdown, FN, FM, refWeight;
  int reflect = -1;
  int isPolarising = 0;

  // propagate to mirror plane
  PROP_X0;

  if (inside_rectangle (z, y, zwidth, yheight)) { /* Intersect the crystal? */

    // calculate scattering vector magnitude
    Q = fabs (2 * vx * V2K);

    // calculate reflection probability

    // downgraded from defpars version
    // rUpFunc(Q, rUpParPtr, &Rup);
    if (rUpTableFlag) {
      Rup = Table_Value (rUpTable, Q, 1);
    } else {
      StdReflecFunc (Q, rUpPar, &Rup);
    }
    // downgraded from defpars version
    // rDownFunc(Q, rDownParPtr, &Rdown);
    if (rDownTableFlag) {
      Rdown = Table_Value (rDownTable, Q, 1);
    } else {
      StdReflecFunc (Q, rDownPar, &Rdown);
    }

    if (Rup != Rdown) {
      isPolarising = 1;
      GetMonoPolFNFM (Rup, Rdown, &FN, &FM);
      GetMonoPolRefProb (FN, FM, sy, &refWeight);
      /* Output of PW discussions with Hal Lee 2024/03/08
       We have now done our QM "measurement", thus
       forcing the spin to assume up/down: */
      sx = 0;
      sz = 0;
    } else
      refWeight = Rup;

    // check that refWeight is meaningfull
    if (refWeight < 0)
      ABSORB;
    if (refWeight > 1)
      refWeight = 1;

    // find out if neutrons is reflected or transmitted
    if (p_reflect < 0 || p_reflect > 1) { // reflect OR transmit using mirror reflectivity

      if (rand01 () < refWeight) // reflect
        reflect = 1;
      else
        reflect = 0;

    } else { // reflect OR transmit using a specified weighting

      if (rand01 () < p_reflect) {
        reflect = 1; // reflect
        p *= refWeight / p_reflect;
      } else {
        reflect = 0; // transmit
        p *= (1 - refWeight) / (1 - p_reflect);
      }
    }

    // set outgoing velocity and polarisation
    if (reflect == 1) { // reflect: SCATTERED==1 for reflection

      vx = -vx;
      if (isPolarising)
        SetMonoPolRefOut (FN, FM, refWeight, &sx, &sy, &sz);

    } else { // transmit: SCATTERED==2 for transmission
      if (isPolarising)
        SetMonoPolTransOut (FN, FM, refWeight, &sx, &sy, &sz);
      SCATTER;
    }

    if (isPolarising)
      if (sx * sx + sy * sy + sz * sz > 1.000001)
        fprintf (stderr, "Pol_mirror: %s: Warning: polarisation |s| = %g > 1\n", NAME_CURRENT_COMP,
                 sx * sx + sy * sy + sz * sz); // check that polarisation is meaningfull

    SCATTER;

  } /* End intersect the mirror */
  else {
    /* neutron will miss the mirror, so don't propagate i.e restore it */
    RESTORE_NEUTRON (INDEX_CURRENT_COMP, x, y, z, vx, vy, vz, t, sx, sy, sz, p);
  }
#ifndef NOABSORB_INF_NAN
  /* Check for nan or inf particle parms */ 
  if(isnan(p + t + vx + vy + vz + x + y + z)) ABSORB;
  if(isinf(fabs(p) + fabs(t) + fabs(vx) + fabs(vy) + fabs(vz) + fabs(x) + fabs(y) + fabs(z))) ABSORB;
#else
  if(isnan(p)  ||  isinf(p)) printf("NAN or INF found in p,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(t)  ||  isinf(t)) printf("NAN or INF found in t,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vx) || isinf(vx)) printf("NAN or INF found in vx, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vy) || isinf(vy)) printf("NAN or INF found in vy, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vz) || isinf(vz)) printf("NAN or INF found in vz, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(x)  ||  isinf(x)) printf("NAN or INF found in x,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(y)  ||  isinf(y)) printf("NAN or INF found in y,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(z)  ||  isinf(z)) printf("NAN or INF found in z,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
#endif

  #define flag (_particle->flag)
  #define ncol_25 (_particle->ncol_25)
  #define nrow_25 (_particle->nrow_25)
  #define ncol_37 (_particle->ncol_37)
  #define nrow_37 (_particle->nrow_37)
  #define ncol_114 (_particle->ncol_114)
  #define nrow_114 (_particle->nrow_114)
  #define ncol_130 (_particle->ncol_130)
  #define nrow_130 (_particle->nrow_130)
if (_comp->_index == 187) { // EXTEND 'WASP_polariser'
  flag=SCATTERED;
}
if (_comp->_index == 234) { // EXTEND 'H523_CryoEDM_polariser'
  flag=SCATTERED;
}
if (_comp->_index == 258) { // EXTEND 'IN15_polariser'
  flag=SCATTERED;
}
  #undef flag
  #undef ncol_25
  #undef nrow_25
  #undef ncol_37
  #undef nrow_37
  #undef ncol_114
  #undef nrow_114
  #undef ncol_130
  #undef nrow_130

  #undef rUpPar
  #undef rDownPar
  #undef rUpData
  #undef rDownData
  #undef p_reflect
  #undef zwidth
  #undef yheight
  #undef rUpTable
  #undef rUpTableFlag
  #undef rDownTable
  #undef rDownTableFlag
  return;
} /* class_Pol_mirror_trace */

#pragma acc routine
void class_Pol_guide_vmirror_trace(_class_Pol_guide_vmirror *_comp
  , _class_particle *_particle) {
  ABSORBED=SCATTERED=RESTORE=0;
  #define nvs (_comp->_parameters.nvs)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define length (_comp->_parameters.length)
  #define rR0 (_comp->_parameters.rR0)
  #define rQc (_comp->_parameters.rQc)
  #define ralpha (_comp->_parameters.ralpha)
  #define rmSM (_comp->_parameters.rmSM)
  #define rW (_comp->_parameters.rW)
  #define rbeta (_comp->_parameters.rbeta)
  #define rUpR0 (_comp->_parameters.rUpR0)
  #define rUpQc (_comp->_parameters.rUpQc)
  #define rUpalpha (_comp->_parameters.rUpalpha)
  #define rUpmSM (_comp->_parameters.rUpmSM)
  #define rUpW (_comp->_parameters.rUpW)
  #define rUpbeta (_comp->_parameters.rUpbeta)
  #define rDownR0 (_comp->_parameters.rDownR0)
  #define rDownQc (_comp->_parameters.rDownQc)
  #define rDownalpha (_comp->_parameters.rDownalpha)
  #define rDownmSM (_comp->_parameters.rDownmSM)
  #define rDownW (_comp->_parameters.rDownW)
  #define rDownbeta (_comp->_parameters.rDownbeta)
  #define debug (_comp->_parameters.debug)
  #define allow_inside_start (_comp->_parameters.allow_inside_start)
  #define rPar (_comp->_parameters.rPar)
  #define rUpPar (_comp->_parameters.rUpPar)
  #define rDownPar (_comp->_parameters.rDownPar)
  #define rParFile (_comp->_parameters.rParFile)
  #define rUpParFile (_comp->_parameters.rUpParFile)
  #define rDownParFile (_comp->_parameters.rDownParFile)
  #define inputType (_comp->_parameters.inputType)
  #define localG (_comp->_parameters.localG)
  #define normalTop (_comp->_parameters.normalTop)
  #define normalBot (_comp->_parameters.normalBot)
  #define normalLeft (_comp->_parameters.normalLeft)
  #define normalRight (_comp->_parameters.normalRight)
  #define normalInOut (_comp->_parameters.normalInOut)
  #define pointTop (_comp->_parameters.pointTop)
  #define pointBot (_comp->_parameters.pointBot)
  #define pointLeft (_comp->_parameters.pointLeft)
  #define pointRight (_comp->_parameters.pointRight)
  #define pointIn (_comp->_parameters.pointIn)
  #define pointOut (_comp->_parameters.pointOut)
  #define mirrorNormals (_comp->_parameters.mirrorNormals)
  #define mirrorPoints (_comp->_parameters.mirrorPoints)
  #define xwhalf (_comp->_parameters.xwhalf)
  #define xwfull (_comp->_parameters.xwfull)
  #define norm (_comp->_parameters.norm)
  #define n_index (_comp->_parameters.n_index)
  #define i_index (_comp->_parameters.i_index)
  #define rParToFunc (_comp->_parameters.rParToFunc)
  #define rUpParToFunc (_comp->_parameters.rUpParToFunc)
  #define rDownParToFunc (_comp->_parameters.rDownParToFunc)
  #define rParPtr (_comp->_parameters.rParPtr)
  #define rUpParPtr (_comp->_parameters.rUpParPtr)
  #define rDownParPtr (_comp->_parameters.rDownParPtr)
  SIG_MESSAGE("[_WASP_Vpolariser_trace] component WASP_Vpolariser=Pol_guide_vmirror() TRACE [Pol_guide_vmirror:0]");

  double R;
  int sgn, ivs;
  /* time threshold */
  double tThreshold = 1e-10 / sqrt (vx * vx + vy * vy + vz * vz);
  Coords normalMirror1, pointMirror1;
  Coords normalMirror2, pointMirror2;
  Coords* normalPointer = 0;

  // Pol variables
  double FN, FM, Rup, Rdown, refWeight;

  if (!allow_inside_start || z < 0) {
    /* Propagate neutron to guide entrance. */
    PROP_Z0;
  }

  if (!inside_rectangle (x, y, xwidth, yheight))
    ABSORB;

  if (debug)
    printf ("-........-\n");

  for (;;) {
    double tLeft, tRight, tTop, tBot, tIn, tOut, tMirror1, tMirror2;
    double tUp, tSide, time, endtime;
    double Q; //, dummy1, dummy2, dummy3;
    Coords vVec, xVec;
    int mirrorReflect;

    /* Hal parametrization */
    int N, m, Total;
    double downmirror, upmirror;

    Total = nvs;

    N = floor (fabs (x) / xwhalf);
    /* if N == total, exge case ... */

    m = 1 - (Total - floor (Total / 2.0) * 2);
    if (debug)
      printf ("Total=%i m=%i", Total, m);
    if (debug)
      printf ("neutron is in N=%i and m=%i\n", N, m);

    sgn = x / (fabs (x));

    if (sgn > 0) {
      downmirror = (floor ((N + m) / 2.0) * xwfull - m * xwhalf) * sgn;
      upmirror = ((floor ((N + m) / 2.0) + 1) * xwfull - m * xwhalf) * sgn;
    } else {
      upmirror = (floor ((N + m) / 2.0) * xwfull - m * xwhalf) * sgn;
      downmirror = ((floor ((N + m) / 2.0) + 1) * xwfull - m * xwhalf) * sgn;
    }

    if (debug)
      printf ("Found downmirror=%g , x=%g and upmirror=%g\n", downmirror, x, upmirror);

    normalMirror1 = coords_set (norm * length, 0, norm * xwhalf);
    pointMirror1 = coords_set (upmirror, 0, 0);
    normalMirror2 = coords_set (norm * length, 0, -norm * xwhalf);
    pointMirror2 = coords_set (downmirror, 0, 0);

    if (debug)
      printf ("Normal down=%g ,and up=%g with sign=%i\n", norm * xwhalf, -norm * xwhalf, sgn);

    /* ivs = floor(fabs(x)/(2*xwhalf));

    normalMirror1  = coords_set(norm*length, 0, -norm*xwhalf);
    pointMirror1 = coords_set(sgn*ivs*xwhalf, 0, 0);
    normalMirror2  = coords_set(norm*length, 0, norm*xwhalf);
    pointMirror2 = coords_set(sgn*ivs*xwhalf, 0, 0);*/

    mirrorReflect = 0;
    xVec = coords_set (x, y, z);
    vVec = coords_set (vx, vy, vz);

    solve_2nd_order (&tTop, NULL, 0.5 * coords_sp (normalTop, localG), coords_sp (normalTop, vVec), coords_sp (normalTop, coords_sub (xVec, pointTop)));

    solve_2nd_order (&tBot, NULL, 0.5 * coords_sp (normalBot, localG), coords_sp (normalBot, vVec), coords_sp (normalBot, coords_sub (xVec, pointBot)));

    solve_2nd_order (&tRight, NULL, 0.5 * coords_sp (normalRight, localG), coords_sp (normalRight, vVec), coords_sp (normalRight, coords_sub (xVec, pointRight)));

    solve_2nd_order (&tLeft, NULL, 0.5 * coords_sp (normalLeft, localG), coords_sp (normalLeft, vVec), coords_sp (normalLeft, coords_sub (xVec, pointLeft)));

    solve_2nd_order (&tIn, NULL, 0.5 * coords_sp (normalInOut, localG), coords_sp (normalInOut, vVec), coords_sp (normalInOut, coords_sub (xVec, pointIn)));

    solve_2nd_order (&tOut, NULL, 0.5 * coords_sp (normalInOut, localG), coords_sp (normalInOut, vVec), coords_sp (normalInOut, coords_sub (xVec, pointOut)));

    solve_2nd_order (&tMirror1, NULL, 0.5 * coords_sp (normalMirror1, localG), coords_sp (normalMirror1, vVec),
                     coords_sp (normalMirror1, coords_sub (xVec, pointMirror1)));

    solve_2nd_order (&tMirror2, NULL, 0.5 * coords_sp (normalMirror2, localG), coords_sp (normalMirror2, vVec),
                     coords_sp (normalMirror2, coords_sub (xVec, pointMirror2)));

    /* Choose appropriate reflection time */
    if (tTop > tThreshold && (tTop < tBot || tBot <= tThreshold))
      tUp = tTop;
    else
      tUp = tBot;

    if (tLeft > tThreshold && (tLeft < tRight || tRight <= tThreshold))
      tSide = tLeft;
    else
      tSide = tRight;

    if (tUp > tThreshold && (tUp < tSide || tSide <= tThreshold))
      time = tUp;
    else
      time = tSide;

    if (tMirror1 > tThreshold && tMirror1 < time) {
      time = tMirror1;
      mirrorReflect = 1; // flag to show which reflection function to use
    }
    if (tMirror2 > tThreshold && tMirror2 < time) {
      time = tMirror2;
      mirrorReflect = 2; // flag to show which reflection function to use
    }

    if (time <= tThreshold)
      fprintf (stdout,
               "Pol_guide_vmirror: %s: tTop: %f, tBot:%f, tRight: %f, tLeft: %f\n"
               "tUp: %f, tSide: %f, time: %f\n",
               NAME_CURRENT_COMP, tTop, tBot, tRight, tLeft, tUp, tSide, time);

    /* Has neutron left the guide? */
    if (tOut > tThreshold && (tOut < tIn || tIn <= tThreshold))
      endtime = tOut;
    else
      endtime = tIn;

    if (time > endtime)
      break;

    if (time <= tThreshold) {

      printf ("Time below threshold!\n");
      fprintf (stdout,
               "Pol_guide_vmirror: %s: tTop: %f, tBot:%f, tRight: %f, tLeft: %f\n"
               "tUp: %f, tSide: %f, time: %f\n",
               NAME_CURRENT_COMP, tTop, tBot, tRight, tLeft, tUp, tSide, time);
      break;
    }

    if (debug > 0 && time == tLeft) {

      fprintf (stdout, "\nPol_guide_vmirror: %s: Left side hit: x, v, normal, point, gravity\n", NAME_CURRENT_COMP);
      coords_print (xVec);
      coords_print (vVec);
      coords_print (normalLeft);
      coords_print (pointLeft);
      coords_print (localG);

      fprintf (stdout, "\nA: %f, B: %f, C: %f, tLeft: %f\n", 0.5 * coords_sp (normalLeft, localG), coords_sp (normalLeft, vVec),
               coords_sp (normalLeft, coords_sub (xVec, pointLeft)), tLeft);
    }

    if (debug > 0)
      fprintf (stdout,
               "Pol_guide_vmirror: %s: tTop: %f, tBot:%f, tRight: %f, tLeft: %f\n"
               "tUp: %f, tSide: %f, time: %f\n",
               NAME_CURRENT_COMP, tTop, tBot, tRight, tLeft, tUp, tSide, time);

    if (debug > 0)
      fprintf (stdout, "Pol_guide_vmirror: %s: Start v: (%f, %f, %f)\n", NAME_CURRENT_COMP, vx, vy, vz);

    PROP_DT (time);
    if (mcgravitation)
      vVec = coords_set (vx, vy, vz);
    SCATTER;

    if (time == tTop)
      normalPointer = &normalTop;
    else if (time == tBot)
      normalPointer = &normalBot;
    else if (time == tRight)
      normalPointer = &normalRight;
    else if (time == tLeft)
      normalPointer = &normalLeft;
    else if (time == tMirror1)
      normalPointer = &normalMirror1;
    else if (time == tMirror2)
      normalPointer = &normalMirror2;
    else
      fprintf (stderr, "Pol_guide_vmirror: %s: This should never happen!!!!\n", NAME_CURRENT_COMP);

    Q = 2 * coords_sp (vVec, *normalPointer) * V2K;

    if (!mirrorReflect) {
      // we have hit one of the sides. Always reflect.
      vVec = coords_add (vVec, coords_scale (*normalPointer, -Q * K2V));
      StdReflecFunc (fabs (Q), rParToFunc, &refWeight);
      p *= refWeight;

    } else {
      // we have hit one of the mirrors
      StdDoubleReflecFunc (fabs (Q), rUpParToFunc, &Rup);
      StdDoubleReflecFunc (fabs (Q), rDownParToFunc, &Rdown);
      if (Rup < 0)
        ABSORB;
      if (Rup > 1)
        Rup = 1;
      if (Rdown < 0)
        ABSORB;
      if (Rdown > 1)
        Rdown = 1;

      GetMonoPolFNFM (Rup, Rdown, &FN, &FM);
      GetMonoPolRefProb (FN, FM, sy, &refWeight);
      /* Output of PW discussions with Hal Lee 2024/03/08
         We have now done our QM "measurement", thus
         forcing the spin to assume up/down: */
      sx = 0;
      sz = 0;
      // check that refWeight is meaningfull
      if (refWeight < 0)
        ABSORB;
      if (refWeight > 1)
        refWeight = 1;

      if (rand01 () < refWeight) {
        // reflect: SCATTERED==1 for reflection

        vVec = coords_add (vVec, coords_scale (*normalPointer, -Q * K2V));
        SetMonoPolRefOut (FN, FM, refWeight, &sx, &sy, &sz);
      } else {
        // transmit: SCATTERED==2 for transmission
        SCATTER;
        SetMonoPolTransOut (FN, FM, refWeight, &sx, &sy, &sz);
      }

      if (sx * sx + sy * sy + sz * sz > 1.000001) { // check that polarisation is meaningful
        fprintf (stderr, "Pol_guide_vmirror: %s: polarisation |s|=%g > 1 s=[%g,%g,%g]\n", NAME_CURRENT_COMP, sx * sx + sy * sy + sz * sz, sx, sy, sz);
      }
    }

    if (p == 0) {
      ABSORB;
      break;
    }

    // set new velocity vector
    coords_get (vVec, &vx, &vy, &vz);

    if (debug > 0)
      fprintf (stdout, "Pol_guide_vmirror: %s: End v: (%f, %f, %f)\n", NAME_CURRENT_COMP, vx, vy, vz);
  }
#ifndef NOABSORB_INF_NAN
  /* Check for nan or inf particle parms */ 
  if(isnan(p + t + vx + vy + vz + x + y + z)) ABSORB;
  if(isinf(fabs(p) + fabs(t) + fabs(vx) + fabs(vy) + fabs(vz) + fabs(x) + fabs(y) + fabs(z))) ABSORB;
#else
  if(isnan(p)  ||  isinf(p)) printf("NAN or INF found in p,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(t)  ||  isinf(t)) printf("NAN or INF found in t,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vx) || isinf(vx)) printf("NAN or INF found in vx, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vy) || isinf(vy)) printf("NAN or INF found in vy, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vz) || isinf(vz)) printf("NAN or INF found in vz, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(x)  ||  isinf(x)) printf("NAN or INF found in x,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(y)  ||  isinf(y)) printf("NAN or INF found in y,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(z)  ||  isinf(z)) printf("NAN or INF found in z,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
#endif
  #undef nvs
  #undef xwidth
  #undef yheight
  #undef length
  #undef rR0
  #undef rQc
  #undef ralpha
  #undef rmSM
  #undef rW
  #undef rbeta
  #undef rUpR0
  #undef rUpQc
  #undef rUpalpha
  #undef rUpmSM
  #undef rUpW
  #undef rUpbeta
  #undef rDownR0
  #undef rDownQc
  #undef rDownalpha
  #undef rDownmSM
  #undef rDownW
  #undef rDownbeta
  #undef debug
  #undef allow_inside_start
  #undef rPar
  #undef rUpPar
  #undef rDownPar
  #undef rParFile
  #undef rUpParFile
  #undef rDownParFile
  #undef inputType
  #undef localG
  #undef normalTop
  #undef normalBot
  #undef normalLeft
  #undef normalRight
  #undef normalInOut
  #undef pointTop
  #undef pointBot
  #undef pointLeft
  #undef pointRight
  #undef pointIn
  #undef pointOut
  #undef mirrorNormals
  #undef mirrorPoints
  #undef xwhalf
  #undef xwfull
  #undef norm
  #undef n_index
  #undef i_index
  #undef rParToFunc
  #undef rUpParToFunc
  #undef rDownParToFunc
  #undef rParPtr
  #undef rUpParPtr
  #undef rDownParPtr
  return;
} /* class_Pol_guide_vmirror_trace */

#pragma acc routine
void class_Incoherent_trace(_class_Incoherent *_comp
  , _class_particle *_particle) {
  ABSORBED=SCATTERED=RESTORE=0;
  #define geometry (_comp->_parameters.geometry)
  #define radius (_comp->_parameters.radius)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define zdepth (_comp->_parameters.zdepth)
  #define thickness (_comp->_parameters.thickness)
  #define target_x (_comp->_parameters.target_x)
  #define target_y (_comp->_parameters.target_y)
  #define target_z (_comp->_parameters.target_z)
  #define focus_r (_comp->_parameters.focus_r)
  #define focus_xw (_comp->_parameters.focus_xw)
  #define focus_yh (_comp->_parameters.focus_yh)
  #define focus_aw (_comp->_parameters.focus_aw)
  #define focus_ah (_comp->_parameters.focus_ah)
  #define target_index (_comp->_parameters.target_index)
  #define pack (_comp->_parameters.pack)
  #define p_interact (_comp->_parameters.p_interact)
  #define f_QE (_comp->_parameters.f_QE)
  #define gamma (_comp->_parameters.gamma)
  #define Etrans (_comp->_parameters.Etrans)
  #define deltaE (_comp->_parameters.deltaE)
  #define sigma_abs (_comp->_parameters.sigma_abs)
  #define sigma_inc (_comp->_parameters.sigma_inc)
  #define Vc (_comp->_parameters.Vc)
  #define concentric (_comp->_parameters.concentric)
  #define order (_comp->_parameters.order)
  #define VarsInc (_comp->_parameters.VarsInc)
  #define offdata (_comp->_parameters.offdata)
  SIG_MESSAGE("[_H522_WASP_Sample_trace] component H522_WASP_Sample=Incoherent() TRACE [Incoherent:0]");

  double t0, t3;                          /* Entry/exit time for outer surface */
  double t1, t2;                          /* Entry/exit time for inner surface */
  double dt0, dt1, dt2, dt;               /* Flight times through sample */
  double v = 0;                           /* Neutron velocity */
  double d_path;                          /* Flight path length for non-scattered neutron */
  double l_i, l_o = 0;                    /* Flight path lenght in/out for scattered neutron */
  double my_a = 0, my_t = 0;              /* Velocity-dependent attenuation factor and total Xsec */
  double solid_angle = 0;                 /* Solid angle of target as seen from scattering point */
  double aim_x = 0, aim_y = 0, aim_z = 1; /* Position of target relative to scattering point */
  double v_i, v_f, E_i, E_f;              /* initial and final energies and velocities */
  double dE;                              /* Energy transfer */
  int intersect = 0;
  int flag_concentric = 0;
  int flag = 0;
  double mc_trans, p_trans, mc_scatt, p_scatt, ws;
  double p_mult = 1;

  #ifdef OPENACC
  #ifdef USE_OFF
  off_struct thread_offdata = offdata;
  #endif
  #else
  #define thread_offdata offdata
  #endif

  do { /* Main interaction loop. Ends with intersect=0 */

    /* Intersection neutron trajectory / sample (sample surface) */
    if (VarsInc.shape == 0)
      intersect = cylinder_intersect (&t0, &t3, x, y, z, vx, vy, vz, radius, yheight);
    else if (VarsInc.shape == 1)
      intersect = box_intersect (&t0, &t3, x, y, z, vx, vy, vz, xwidth, yheight, zdepth);
    else if (VarsInc.shape == 2)
      intersect = sphere_intersect (&t0, &t3, x, y, z, vx, vy, vz, radius);
    #ifdef USE_OFF
    else if (VarsInc.shape == 3)
      intersect = off_intersect (&t0, &t3, NULL, NULL, x, y, z, vx, vy, vz, 0, 0, 0, thread_offdata);
    #endif

    if (intersect) {
      int flag_ishollow = 0;
      if (thickness > 0) {
        if (VarsInc.shape == 0 && cylinder_intersect (&t1, &t2, x, y, z, vx, vy, vz, radius - thickness, yheight - 2 * thickness))
          flag_ishollow = 1;
        else if (VarsInc.shape == 2 && sphere_intersect (&t1, &t2, x, y, z, vx, vy, vz, radius - thickness))
          flag_ishollow = 1;
        else if (VarsInc.shape == 1 && box_intersect (&t1, &t2, x, y, z, vx, vy, vz, xwidth - 2 * thickness, yheight - 2 * thickness, zdepth - 2 * thickness))
          flag_ishollow = 1;
      }
      if (!flag_ishollow)
        t1 = t2 = t3; /* no empty space inside */

      dt0 = t1 - t0; /* Time in sample, ingoing */
      dt1 = t2 - t1; /* Time in hole */
      dt2 = t3 - t2; /* Time in sample, outgoing */

      if (t0 > 0) {                   /* we are before the sample */
        PROP_DT (t0);                 /* propagates neutron to the entry of the sample */
      } else if (t1 > 0 && t1 > t0) { /* we are inside first part of the sample */
        /* no propagation, stay inside */
      } else if (t2 > 0 && t2 > t1) { /* we are in the hole */
        PROP_DT (t2);                 /* propagate to inner surface of 2nd part of sample */
      } else if (t3 > 0 && t3 > t2) { /* we are in the 2nd part of sample */
        /* no propagation, stay inside */
      }

      dt0 = t1 - (t0 > 0 ? t0 : 0); /* Time in first part of hollow/cylinder/box */
      dt1 = t2 - (t1 > 0 ? t1 : 0); /* Time in hole */
      dt2 = t3 - (t2 > 0 ? t2 : 0); /* Time in 2nd part of hollow cylinder */

      if (dt0 < 0)
        dt0 = 0;
      if (dt1 < 0)
        dt1 = 0;
      if (dt2 < 0)
        dt2 = 0;

      /* initialize concentric mode */
      if (concentric && !flag_concentric && t0 >= 0 && VarsInc.shape == 0 && thickness > 0) {
        flag_concentric = 1;
      }

      if (flag_concentric == 1) {
        dt1 = dt2 = 0; /* force exit when reaching hole/2nd part */
      }

      if (!dt0 && !dt2) {
        intersect = 0; /* the sample was passed entirely */
        break;
      }

      p_mult = 1;
      if (!v)
        v = sqrt (vx * vx + vy * vy + vz * vz);
      if (v)
        my_a = VarsInc.my_a_v * (2200 / v);
      else {
        printf ("Incoherent: %s: ERROR: Null velocity\n", NAME_CURRENT_COMP);
        ABSORB; /* should never occur */
      }

      my_t = my_a + VarsInc.my_s; /* total scattering Xsect (tmp var) */
      if (my_t <= 0) {
        printf ("Incoherent: %s: ERROR: Null total cross section %g. Removing event.\n", NAME_CURRENT_COMP, my_t);
        ABSORB; /* should never occur */
      }
      d_path = v * (dt0 + dt2); /* Length of full path through sample */

      /* Proba of scattering vs absorption (integrating along the whole trajectory) */
      ws = VarsInc.my_s / my_t; /* (inc+coh)/(inc+coh+abs) */
      /* Proba of transmission along length d_path */
      p_trans = exp (-my_t * d_path);
      p_scatt = 1 - p_trans; /* portion of beam which scatters */
      flag = 0;              /* flag used for propagation to exit point before ending */
      /* are we next to the exit ? probably no scattering (avoid rounding errors) */
      if (VarsInc.my_s * d_path <= 4e-7) {
        flag = 1; /* No interaction before the exit */
      }
      /* force a given fraction of the beam to scatter */
      if (p_interact > 0 && p_interact <= 1) {
        /* we force a portion of the beam to interact */
        /* This is used to improve statistics on single scattering (and multiple) */
        if (!SCATTERED)
          mc_trans = 1 - p_interact;
        else
          mc_trans = 1 - p_interact / (4 * SCATTERED + 1); /* reduce effect on multi scatt */
      } else {
        mc_trans = p_trans; /* 1 - p_scatt */
      }
      mc_scatt = 1 - mc_trans; /* portion of beam to scatter (or force to) */
      if (mc_scatt <= 0 || mc_scatt > 1)
        flag = 1;
      /* MC choice: Interaction or transmission ? */
      if (!flag && mc_scatt > 0 && (mc_scatt >= 1 || (rand01 ()) < mc_scatt)) { /* Interaction neutron/sample */
        p_mult *= ws;                                                           /* Update weight ; account for absorption and retain scattered fraction */
        if (!mc_scatt)
          ABSORB;
        /* we have chosen portion mc_scatt of beam instead of p_scatt, so we compensate */
        p_mult *= fabs (p_scatt / mc_scatt); /* lower than 1 */
      } else {
        flag = 1; /* Transmission : no interaction neutron/sample */
        if (!mc_trans)
          ABSORB;
        p_mult *= fabs (p_trans / mc_trans); /* attenuate beam by portion which is scattered (and left along) */
      }

      if (flag) { /* propagate to exit of sample and finish */
        intersect = 0;
        p *= p_mult; /* apply absorption correction */
        PROP_DT (dt0 + dt2);
        break; /* exit main multi scatt while loop */
      }
      if (my_t * d_path < 1e-6)
        /* For very weak scattering, use simple uniform sampling of scattering
           point to avoid rounding errors. */
        dt = rand0max (d_path); /* length */
      else
        dt = -log (1 - rand0max ((1 - exp (-my_t * d_path)))) / my_t; /* length */
      l_i = dt;                                                       /* Penetration in sample: scattering+abs */
      dt /= v;                                                        /* Time from present position to scattering point */

      /* If t0 is in hole, propagate to next part of the hollow cylinder */
      if (dt1 > 0 && dt0 > 0 && dt > dt0)
        dt += dt1;
      PROP_DT (dt); /* Point of scattering */

      if ((VarsInc.tx || VarsInc.ty || VarsInc.tz)) {
        aim_x = VarsInc.tx - x; /* Vector pointing at target (anal./det.) */
        aim_y = VarsInc.ty - y;
        aim_z = VarsInc.tz - z;
      }
      if (VarsInc.aw && VarsInc.ah) {
        randvec_target_rect_angular (&vx, &vy, &vz, &solid_angle, aim_x, aim_y, aim_z, VarsInc.aw, VarsInc.ah, ROT_A_CURRENT_COMP);
      } else if (VarsInc.xw && VarsInc.yh) {
        randvec_target_rect (&vx, &vy, &vz, &solid_angle, aim_x, aim_y, aim_z, VarsInc.xw, VarsInc.yh, ROT_A_CURRENT_COMP);
      } else {
        randvec_target_circle (&vx, &vy, &vz, &solid_angle, aim_x, aim_y, aim_z, focus_r);
      }
      NORM (vx, vy, vz);

      v_i = v; /* Store initial velocity in case of quasielastic */
      E_i = VS2E * v_i * v_i;
      if (deltaE == 0) {
        if (rand01 () < f_QE) /* Quasielastic contribution */
        {
          dE = gamma * tan (PI / 2 * randpm1 ());
          E_f = E_i + dE;
          if (E_f <= 0)
            ABSORB;
          v_f = SE2V * sqrt (E_f);
          v = v_f;
          /*          printf("vi: %g Ei: %g dE: %g Ef %g vf: %g v: %g \n",
                      v_i,E_i,dE,E_f,v_f,v); */
        }
      } else {
        E_f = E_i - Etrans + deltaE * randpm1 (); // E_f=E0;
        v_f = SE2V * sqrt (E_f);
        v = v_f;
      }

      vx *= v;
      vy *= v;
      vz *= v;

      /* We do not consider scattering from 2nd part (outgoing) */
      p_mult *= solid_angle / 4 / PI;
      p *= p_mult;

      /* Polarisation part (1/3 NSF, 2/3 SF) */
      sx *= -1.0 / 3.0;
      sy *= -1.0 / 3.0;
      sz *= -1.0 / 3.0;

      SCATTER;

      /* test for a given multiple order */
      if (order && SCATTERED >= order) {
        intersect = 0; /* reached required number of SCATTERing */
        break;         /* finish multiple scattering loop */
      }
    } /* end if intersect */
  } while (intersect); /* end do (intersect) (multiple scattering loop) */

  // Add attenuation of exit flight path for non-multiple scattering
  if (order && SCATTERED) {
    if (VarsInc.shape == 0)
      intersect = cylinder_intersect (&t0, &t3, x, y, z, vx, vy, vz, radius, yheight);
    else if (VarsInc.shape == 1)
      intersect = box_intersect (&t0, &t3, x, y, z, vx, vy, vz, xwidth, yheight, zdepth);
    else if (VarsInc.shape == 2)
      intersect = sphere_intersect (&t0, &t3, x, y, z, vx, vy, vz, radius);
    #ifdef USE_OFF
    else if (VarsInc.shape == 3)
      intersect = off_intersect (&t0, &t3, NULL, NULL, x, y, z, vx, vy, vz, 0, 0, 0, thread_offdata);
    #endif

    d_path = v * t3; /* Length of full path through sample */

    p_trans = exp (-my_t * d_path);
    p *= p_trans;
    PROP_DT (t3);
  }
#ifndef NOABSORB_INF_NAN
  /* Check for nan or inf particle parms */ 
  if(isnan(p + t + vx + vy + vz + x + y + z)) ABSORB;
  if(isinf(fabs(p) + fabs(t) + fabs(vx) + fabs(vy) + fabs(vz) + fabs(x) + fabs(y) + fabs(z))) ABSORB;
#else
  if(isnan(p)  ||  isinf(p)) printf("NAN or INF found in p,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(t)  ||  isinf(t)) printf("NAN or INF found in t,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vx) || isinf(vx)) printf("NAN or INF found in vx, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vy) || isinf(vy)) printf("NAN or INF found in vy, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vz) || isinf(vz)) printf("NAN or INF found in vz, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(x)  ||  isinf(x)) printf("NAN or INF found in x,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(y)  ||  isinf(y)) printf("NAN or INF found in y,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(z)  ||  isinf(z)) printf("NAN or INF found in z,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
#endif

  #define flag (_particle->flag)
  #define ncol_25 (_particle->ncol_25)
  #define nrow_25 (_particle->nrow_25)
  #define ncol_37 (_particle->ncol_37)
  #define nrow_37 (_particle->nrow_37)
  #define ncol_114 (_particle->ncol_114)
  #define nrow_114 (_particle->nrow_114)
  #define ncol_130 (_particle->ncol_130)
  #define nrow_130 (_particle->nrow_130)
if (_comp->_index == 197) { // EXTEND 'H522_WASP_Sample'
  if (!SCATTERED) ABSORB;
}
if (_comp->_index == 276) { // EXTEND 'H511_IN15_Sample'
  if (!SCATTERED) ABSORB;
}
  #undef flag
  #undef ncol_25
  #undef nrow_25
  #undef ncol_37
  #undef nrow_37
  #undef ncol_114
  #undef nrow_114
  #undef ncol_130
  #undef nrow_130

  #undef geometry
  #undef radius
  #undef xwidth
  #undef yheight
  #undef zdepth
  #undef thickness
  #undef target_x
  #undef target_y
  #undef target_z
  #undef focus_r
  #undef focus_xw
  #undef focus_yh
  #undef focus_aw
  #undef focus_ah
  #undef target_index
  #undef pack
  #undef p_interact
  #undef f_QE
  #undef gamma
  #undef Etrans
  #undef deltaE
  #undef sigma_abs
  #undef sigma_inc
  #undef Vc
  #undef concentric
  #undef order
  #undef VarsInc
  #undef offdata
  return;
} /* class_Incoherent_trace */

#pragma acc routine
void class_Shape_trace(_class_Shape *_comp
  , _class_particle *_particle) {
  ABSORBED=SCATTERED=RESTORE=0;
  #define geometry (_comp->_parameters.geometry)
  #define radius (_comp->_parameters.radius)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define zdepth (_comp->_parameters.zdepth)
  #define thickness (_comp->_parameters.thickness)
  #define nx (_comp->_parameters.nx)
  #define ny (_comp->_parameters.ny)
  #define nz (_comp->_parameters.nz)
  #define center (_comp->_parameters.center)
  #define offdata (_comp->_parameters.offdata)
  SIG_MESSAGE("[_D22_Detector_vessel_trace] component D22_Detector_vessel=Shape() TRACE [Shape:0]");

  /* component Shape does nothing */
#ifndef NOABSORB_INF_NAN
  /* Check for nan or inf particle parms */ 
  if(isnan(p + t + vx + vy + vz + x + y + z)) ABSORB;
  if(isinf(fabs(p) + fabs(t) + fabs(vx) + fabs(vy) + fabs(vz) + fabs(x) + fabs(y) + fabs(z))) ABSORB;
#else
  if(isnan(p)  ||  isinf(p)) printf("NAN or INF found in p,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(t)  ||  isinf(t)) printf("NAN or INF found in t,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vx) || isinf(vx)) printf("NAN or INF found in vx, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vy) || isinf(vy)) printf("NAN or INF found in vy, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(vz) || isinf(vz)) printf("NAN or INF found in vz, %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(x)  ||  isinf(x)) printf("NAN or INF found in x,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(y)  ||  isinf(y)) printf("NAN or INF found in y,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
  if(isnan(z)  ||  isinf(z)) printf("NAN or INF found in z,  %s (particle %lld)\n",_comp->_name,_particle->_uid);
#endif
  #undef geometry
  #undef radius
  #undef xwidth
  #undef yheight
  #undef zdepth
  #undef thickness
  #undef nx
  #undef ny
  #undef nz
  #undef center
  #undef offdata
  return;
} /* class_Shape_trace */

#define flag (_particle->flag)
#define ncol_25 (_particle->ncol_25)
#define nrow_25 (_particle->nrow_25)
#define ncol_37 (_particle->ncol_37)
#define nrow_37 (_particle->nrow_37)
#define ncol_114 (_particle->ncol_114)
#define nrow_114 (_particle->nrow_114)
#define ncol_130 (_particle->ncol_130)
#define nrow_130 (_particle->nrow_130)
/* *****************************************************************************
* instrument 'ILL_H5_new' TRACE
***************************************************************************** */

#ifndef FUNNEL
#pragma acc routine
int raytrace(_class_particle* _particle) { /* single event propagation, called by mccode_main for ILL_H5_new:TRACE */

  /* init variables and counters for TRACE */
  #undef ABSORB0
  #undef ABSORB
  #define ABSORB0 do { DEBUG_ABSORB(); MAGNET_OFF; ABSORBED++;} while(0)
  #define ABSORB ABSORB0
  DEBUG_ENTER();
  DEBUG_STATE();
  _particle->flag_nocoordschange=0; /* Init */
  _class_particle _particle_save=*_particle;
  /* the main iteration loop for one incoming event */
  while (!ABSORBED) { /* iterate event until absorbed */
    /* send particle event to component instance, one after the other */
    /* begin component Origin=Progress_bar() [1] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_Origin_var._rotation_is_identity) {
        if(!_Origin_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _Origin_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_Origin_var._position_relative, _Origin_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 1) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_Origin_var._name);
      DEBUG_STATE();
      class_Progress_bar_trace(&_Origin_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component Origin [1] */
    /* begin component HCS=Source_gen() [2] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_var._rotation_is_identity) {
        if(!_HCS_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_var._position_relative, _HCS_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 2) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_var._name);
      DEBUG_STATE();
      class_Source_gen_trace(&_HCS_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS [2] */
    /* begin component HCS_Al=PowderN() [3] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_var._rotation_is_identity) {
        if(!_HCS_Al_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_var._position_relative, _HCS_Al_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 3) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al [3] */
    /* begin component HCS_Al_4=PowderN() [4] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_4_var._rotation_is_identity) {
        if(!_HCS_Al_4_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_4_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_4_var._position_relative, _HCS_Al_4_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 4) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_4_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_4_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_4 [4] */
    /* begin component HCS_Al_5=PowderN() [5] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_5_var._rotation_is_identity) {
        if(!_HCS_Al_5_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_5_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_5_var._position_relative, _HCS_Al_5_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 5) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_5_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_5_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_5 [5] */
    /* begin component HCS_Al_6=PowderN() [6] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_6_var._rotation_is_identity) {
        if(!_HCS_Al_6_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_6_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_6_var._position_relative, _HCS_Al_6_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 6) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_6_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_6_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_6 [6] */
    /* begin component HCS_Al_7=PowderN() [7] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_7_var._rotation_is_identity) {
        if(!_HCS_Al_7_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_7_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_7_var._position_relative, _HCS_Al_7_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 7) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_7_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_7_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_7 [7] */
    /* begin component H5=Monitor_nD() [8] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H5_var._rotation_is_identity) {
        if(!_H5_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H5_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H5_var._position_relative, _H5_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 8) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H5_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H5_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H5 [8] */
    /* begin component H5_rect=Guide_gravity() [9] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H5_rect_var._rotation_is_identity) {
        if(!_H5_rect_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H5_rect_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H5_rect_var._position_relative, _H5_rect_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 9) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H5_rect_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H5_rect_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H5_rect [9] */
    /* begin component H53_origin=Monitor_nD() [10] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H53_origin_var._rotation_is_identity) {
        if(!_H53_origin_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H53_origin_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H53_origin_var._position_relative, _H53_origin_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 10) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H53_origin_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H53_origin_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      if (SCATTERED) {/* conditional JUMP to H53_start */
        _particle->_index=12;
        _particle->flag_nocoordschange=1; /* pass corrdinate transformations when jumping */
      }
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H53_origin [10] */
    /* begin component H52_origin=Monitor_nD() [11] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H52_origin_var._rotation_is_identity) {
        if(!_H52_origin_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H52_origin_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H52_origin_var._position_relative, _H52_origin_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 11) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H52_origin_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H52_origin_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      if (SCATTERED) {/* conditional JUMP to H52_start */
        _particle->_index=42;
        _particle->flag_nocoordschange=1; /* pass corrdinate transformations when jumping */
      }
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H52_origin [11] */
    /* begin component H51_origin=Monitor_nD() [12] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H51_origin_var._rotation_is_identity) {
        if(!_H51_origin_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H51_origin_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H51_origin_var._position_relative, _H51_origin_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 12) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H51_origin_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H51_origin_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      if (SCATTERED) {/* conditional JUMP to H51_start */
        _particle->_index=240;
        _particle->flag_nocoordschange=1; /* pass corrdinate transformations when jumping */
      }
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H51_origin [12] */
    /* begin component H53_start=Arm() [13] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H53_start_var._rotation_is_identity) {
        if(!_H53_start_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H53_start_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H53_start_var._position_relative, _H53_start_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 13) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H53_start_var._name);
      DEBUG_STATE();
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H53_start [13] */
    /* begin component H53_inpile=Guide_gravity() [14] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H53_inpile_var._rotation_is_identity) {
        if(!_H53_inpile_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H53_inpile_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H53_inpile_var._position_relative, _H53_inpile_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 14) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H53_inpile_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H53_inpile_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H53_inpile [14] */
    /* begin component H53_Al=PowderN() [15] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H53_Al_var._rotation_is_identity) {
        if(!_H53_Al_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H53_Al_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H53_Al_var._position_relative, _H53_Al_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 15) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H53_Al_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_H53_Al_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H53_Al [15] */
    /* begin component H53_Obt=Guide_gravity() [16] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H53_Obt_var._rotation_is_identity) {
        if(!_H53_Obt_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H53_Obt_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H53_Obt_var._position_relative, _H53_Obt_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 16) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H53_Obt_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H53_Obt_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H53_Obt [16] */
    /* begin component HCS_Al_17=PowderN() [17] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_17_var._rotation_is_identity) {
        if(!_HCS_Al_17_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_17_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_17_var._position_relative, _HCS_Al_17_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 17) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_17_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_17_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_17 [17] */
    /* begin component H53_Obt_Out=Monitor_nD() [18] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H53_Obt_Out_var._rotation_is_identity) {
        if(!_H53_Obt_Out_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H53_Obt_Out_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H53_Obt_Out_var._position_relative, _H53_Obt_Out_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 18) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H53_Obt_Out_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H53_Obt_Out_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H53_Obt_Out [18] */
    /* begin component HCS_Al_19=PowderN() [19] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_19_var._rotation_is_identity) {
        if(!_HCS_Al_19_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_19_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_19_var._position_relative, _HCS_Al_19_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 19) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_19_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_19_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_19 [19] */
    /* begin component H53_VSComC1=Guide_gravity() [20] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H53_VSComC1_var._rotation_is_identity) {
        if(!_H53_VSComC1_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H53_VSComC1_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H53_VSComC1_var._position_relative, _H53_VSComC1_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 20) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H53_VSComC1_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H53_VSComC1_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H53_VSComC1 [20] */
    /* begin component HCS_Al_21=PowderN() [21] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_21_var._rotation_is_identity) {
        if(!_HCS_Al_21_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_21_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_21_var._position_relative, _HCS_Al_21_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 21) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_21_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_21_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_21 [21] */
    /* begin component H53_Nose=Guide_tapering() [22] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H53_Nose_var._rotation_is_identity) {
        if(!_H53_Nose_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H53_Nose_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H53_Nose_var._position_relative, _H53_Nose_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 22) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H53_Nose_var._name);
      DEBUG_STATE();
      class_Guide_tapering_trace(&_H53_Nose_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H53_Nose [22] */
    /* begin component HCS_Al_23=PowderN() [23] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_23_var._rotation_is_identity) {
        if(!_HCS_Al_23_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_23_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_23_var._position_relative, _HCS_Al_23_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 23) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_23_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_23_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_23 [23] */
    /* begin component H53_ThALES_Monochromator_Cradle=Monitor_nD() [24] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H53_ThALES_Monochromator_Cradle_var._rotation_is_identity) {
        if(!_H53_ThALES_Monochromator_Cradle_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_Monochromator_Cradle_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H53_ThALES_Monochromator_Cradle_var._position_relative, _H53_ThALES_Monochromator_Cradle_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 24) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H53_ThALES_Monochromator_Cradle_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H53_ThALES_Monochromator_Cradle_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H53_ThALES_Monochromator_Cradle [24] */
    /* begin component H53_ThALES_Monochromator=Monochromator_curved() [25] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H53_ThALES_Monochromator_var._rotation_is_identity) {
        if(!_H53_ThALES_Monochromator_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_Monochromator_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H53_ThALES_Monochromator_var._position_relative, _H53_ThALES_Monochromator_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 25) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H53_ThALES_Monochromator_var._name);
      DEBUG_STATE();
      class_Monochromator_curved_trace(&_H53_ThALES_Monochromator_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H53_ThALES_Monochromator [25] */
    /* begin component H53_ThALES_Monochromator_Jumper=Arm() [26] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H53_ThALES_Monochromator_Jumper_var._rotation_is_identity) {
        if(!_H53_ThALES_Monochromator_Jumper_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_Monochromator_Jumper_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H53_ThALES_Monochromator_Jumper_var._position_relative, _H53_ThALES_Monochromator_Jumper_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 26) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H53_ThALES_Monochromator_Jumper_var._name);
      DEBUG_STATE();
      if (! flag) {/* conditional JUMP to H53_ThALES_Transmit */
        _particle->_index=40;
        _particle->flag_nocoordschange=1; /* pass corrdinate transformations when jumping */
      }
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H53_ThALES_Monochromator_Jumper [26] */
    /* begin component H53_ThALES_Monochromator_Out=Arm() [27] */
    if (!ABSORBED && _particle->_index == 27) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle->_index++;
    } /* end component H53_ThALES_Monochromator_Out [27] */
    /* begin component H53_ThALES_Sample_Div=Monitor_nD() [28] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H53_ThALES_Sample_Div_var._rotation_is_identity) {
        if(!_H53_ThALES_Sample_Div_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_Sample_Div_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H53_ThALES_Sample_Div_var._position_relative, _H53_ThALES_Sample_Div_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 28) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H53_ThALES_Sample_Div_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H53_ThALES_Sample_Div_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H53_ThALES_Sample_Div [28] */
    /* begin component H53_ThALES_Sample_XY=Monitor_nD() [29] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H53_ThALES_Sample_XY_var._rotation_is_identity) {
        if(!_H53_ThALES_Sample_XY_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_Sample_XY_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H53_ThALES_Sample_XY_var._position_relative, _H53_ThALES_Sample_XY_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 29) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H53_ThALES_Sample_XY_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H53_ThALES_Sample_XY_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H53_ThALES_Sample_XY [29] */
    /* begin component H53_ThALES_Sample_L=Monitor_nD() [30] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H53_ThALES_Sample_L_var._rotation_is_identity) {
        if(!_H53_ThALES_Sample_L_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_Sample_L_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H53_ThALES_Sample_L_var._position_relative, _H53_ThALES_Sample_L_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 30) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H53_ThALES_Sample_L_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H53_ThALES_Sample_L_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H53_ThALES_Sample_L [30] */
    /* begin component H53_ThALES_Sample=Isotropic_Sqw() [31] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H53_ThALES_Sample_var._rotation_is_identity) {
        if(!_H53_ThALES_Sample_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_Sample_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H53_ThALES_Sample_var._position_relative, _H53_ThALES_Sample_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 31) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H53_ThALES_Sample_var._name);
      DEBUG_STATE();
      class_Isotropic_Sqw_trace(&_H53_ThALES_Sample_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H53_ThALES_Sample [31] */
    /* begin component H53_ThALES_Spectrometer=Monitor_nD() [32] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H53_ThALES_Spectrometer_var._rotation_is_identity) {
        if(!_H53_ThALES_Spectrometer_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_Spectrometer_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H53_ThALES_Spectrometer_var._position_relative, _H53_ThALES_Spectrometer_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 32) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H53_ThALES_Spectrometer_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H53_ThALES_Spectrometer_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H53_ThALES_Spectrometer [32] */
    /* begin component H53_ThALES_Diffractometer=Monitor_nD() [33] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H53_ThALES_Diffractometer_var._rotation_is_identity) {
        if(!_H53_ThALES_Diffractometer_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_Diffractometer_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H53_ThALES_Diffractometer_var._position_relative, _H53_ThALES_Diffractometer_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 33) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H53_ThALES_Diffractometer_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H53_ThALES_Diffractometer_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H53_ThALES_Diffractometer [33] */
    /* begin component Sample_Out=Arm() [34] */
    if (!ABSORBED && _particle->_index == 34) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle->_index++;
    } /* end component Sample_Out [34] */
    /* begin component SC3=Collimator_linear() [35] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_SC3_var._rotation_is_identity) {
        if(!_SC3_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _SC3_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_SC3_var._position_relative, _SC3_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 35) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_SC3_var._name);
      DEBUG_STATE();
      class_Collimator_linear_trace(&_SC3_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component SC3 [35] */
    /* begin component Ana_Cradle=Arm() [36] */
    if (!ABSORBED && _particle->_index == 36) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle->_index++;
    } /* end component Ana_Cradle [36] */
    /* begin component PG2Xtal=Monochromator_curved() [37] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_PG2Xtal_var._rotation_is_identity) {
        if(!_PG2Xtal_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _PG2Xtal_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_PG2Xtal_var._position_relative, _PG2Xtal_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 37) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_PG2Xtal_var._name);
      DEBUG_STATE();
      class_Monochromator_curved_trace(&_PG2Xtal_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component PG2Xtal [37] */
    /* begin component Ana_Out=Arm() [38] */
    if (!ABSORBED && _particle->_index == 38) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle->_index++;
    } /* end component Ana_Out [38] */
    /* begin component SC4=Collimator_linear() [39] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_SC4_var._rotation_is_identity) {
        if(!_SC4_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _SC4_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_SC4_var._position_relative, _SC4_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 39) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_SC4_var._name);
      DEBUG_STATE();
      class_Collimator_linear_trace(&_SC4_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component SC4 [39] */
    /* begin component He3H=Monitor() [40] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_He3H_var._rotation_is_identity) {
        if(!_He3H_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _He3H_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_He3H_var._position_relative, _He3H_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 40) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_He3H_var._name);
      DEBUG_STATE();
      class_Monitor_trace(&_He3H_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component He3H [40] */
    /* begin component H53_ThALES_Transmit=Arm() [41] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H53_ThALES_Transmit_var._rotation_is_identity) {
        if(!_H53_ThALES_Transmit_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_Transmit_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H53_ThALES_Transmit_var._position_relative, _H53_ThALES_Transmit_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 41) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H53_ThALES_Transmit_var._name);
      DEBUG_STATE();
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H53_ThALES_Transmit [41] */
    /* begin component H53_ThALES_TransmitXY=Monitor_nD() [42] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H53_ThALES_TransmitXY_var._rotation_is_identity) {
        if(!_H53_ThALES_TransmitXY_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_TransmitXY_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H53_ThALES_TransmitXY_var._position_relative, _H53_ThALES_TransmitXY_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 42) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H53_ThALES_TransmitXY_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H53_ThALES_TransmitXY_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H53_ThALES_TransmitXY [42] */
    /* begin component H52_start=Arm() [43] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H52_start_var._rotation_is_identity) {
        if(!_H52_start_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H52_start_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H52_start_var._position_relative, _H52_start_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 43) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H52_start_var._name);
      DEBUG_STATE();
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H52_start [43] */
    /* begin component H52_inpile=Guide_gravity() [44] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H52_inpile_var._rotation_is_identity) {
        if(!_H52_inpile_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H52_inpile_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H52_inpile_var._position_relative, _H52_inpile_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 44) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H52_inpile_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H52_inpile_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H52_inpile [44] */
    /* begin component H52_Common=Guide_gravity() [45] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H52_Common_var._rotation_is_identity) {
        if(!_H52_Common_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H52_Common_var._position_relative, _H52_Common_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 45) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H52_Common_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H52_Common_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H52_Common [45] */
    /* begin component H52_Common_46=Guide_gravity() [46] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H52_Common_46_var._rotation_is_identity) {
        if(!_H52_Common_46_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_46_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H52_Common_46_var._position_relative, _H52_Common_46_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 46) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H52_Common_46_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H52_Common_46_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H52_Common_46 [46] */
    /* begin component H52_Common_3=Guide_gravity() [47] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H52_Common_3_var._rotation_is_identity) {
        if(!_H52_Common_3_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_3_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H52_Common_3_var._position_relative, _H52_Common_3_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 47) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H52_Common_3_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H52_Common_3_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H52_Common_3 [47] */
    /* begin component HCS_Al_48=PowderN() [48] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_48_var._rotation_is_identity) {
        if(!_HCS_Al_48_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_48_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_48_var._position_relative, _HCS_Al_48_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 48) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_48_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_48_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_48 [48] */
    /* begin component H52_Obt_Out=Monitor_nD() [49] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H52_Obt_Out_var._rotation_is_identity) {
        if(!_H52_Obt_Out_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H52_Obt_Out_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H52_Obt_Out_var._position_relative, _H52_Obt_Out_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 49) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H52_Obt_Out_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H52_Obt_Out_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H52_Obt_Out [49] */
    /* begin component HCS_Al_50=PowderN() [50] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_50_var._rotation_is_identity) {
        if(!_HCS_Al_50_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_50_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_50_var._position_relative, _HCS_Al_50_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 50) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_50_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_50_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_50 [50] */
    /* begin component H52_Common_51=Guide_gravity() [51] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H52_Common_51_var._rotation_is_identity) {
        if(!_H52_Common_51_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_51_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H52_Common_51_var._position_relative, _H52_Common_51_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 51) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H52_Common_51_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H52_Common_51_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H52_Common_51 [51] */
    /* begin component H52_Common_52=Guide_gravity() [52] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H52_Common_52_var._rotation_is_identity) {
        if(!_H52_Common_52_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_52_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H52_Common_52_var._position_relative, _H52_Common_52_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 52) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H52_Common_52_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H52_Common_52_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H52_Common_52 [52] */
    /* begin component H52_Common_53=Guide_gravity() [53] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H52_Common_53_var._rotation_is_identity) {
        if(!_H52_Common_53_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_53_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H52_Common_53_var._position_relative, _H52_Common_53_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 53) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H52_Common_53_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H52_Common_53_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H52_Common_53 [53] */
    /* begin component H52_Common_54=Guide_gravity() [54] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H52_Common_54_var._rotation_is_identity) {
        if(!_H52_Common_54_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_54_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H52_Common_54_var._position_relative, _H52_Common_54_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 54) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H52_Common_54_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H52_Common_54_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H52_Common_54 [54] */
    /* begin component H52_Common_55=Guide_gravity() [55] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H52_Common_55_var._rotation_is_identity) {
        if(!_H52_Common_55_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_55_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H52_Common_55_var._position_relative, _H52_Common_55_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 55) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H52_Common_55_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H52_Common_55_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H52_Common_55 [55] */
    /* begin component H52_Common_56=Guide_gravity() [56] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H52_Common_56_var._rotation_is_identity) {
        if(!_H52_Common_56_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_56_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H52_Common_56_var._position_relative, _H52_Common_56_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 56) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H52_Common_56_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H52_Common_56_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H52_Common_56 [56] */
    /* begin component H52_Common_57=Guide_gravity() [57] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H52_Common_57_var._rotation_is_identity) {
        if(!_H52_Common_57_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_57_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H52_Common_57_var._position_relative, _H52_Common_57_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 57) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H52_Common_57_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H52_Common_57_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H52_Common_57 [57] */
    /* begin component H52_Common_58=Guide_gravity() [58] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H52_Common_58_var._rotation_is_identity) {
        if(!_H52_Common_58_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_58_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H52_Common_58_var._position_relative, _H52_Common_58_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 58) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H52_Common_58_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H52_Common_58_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H52_Common_58 [58] */
    /* begin component H52_Common_59=Guide_gravity() [59] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H52_Common_59_var._rotation_is_identity) {
        if(!_H52_Common_59_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_59_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H52_Common_59_var._position_relative, _H52_Common_59_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 59) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H52_Common_59_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H52_Common_59_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H52_Common_59 [59] */
    /* begin component H52_Common_60=Guide_gravity() [60] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H52_Common_60_var._rotation_is_identity) {
        if(!_H52_Common_60_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_60_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H52_Common_60_var._position_relative, _H52_Common_60_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 60) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H52_Common_60_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H52_Common_60_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H52_Common_60 [60] */
    /* begin component H52_Common_61=Guide_gravity() [61] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H52_Common_61_var._rotation_is_identity) {
        if(!_H52_Common_61_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_61_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H52_Common_61_var._position_relative, _H52_Common_61_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 61) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H52_Common_61_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H52_Common_61_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H52_Common_61 [61] */
    /* begin component H52_Common_62=Guide_gravity() [62] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H52_Common_62_var._rotation_is_identity) {
        if(!_H52_Common_62_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_62_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H52_Common_62_var._position_relative, _H52_Common_62_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 62) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H52_Common_62_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H52_Common_62_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H52_Common_62 [62] */
    /* begin component H52_Common_63=Guide_gravity() [63] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H52_Common_63_var._rotation_is_identity) {
        if(!_H52_Common_63_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_63_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H52_Common_63_var._position_relative, _H52_Common_63_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 63) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H52_Common_63_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H52_Common_63_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H52_Common_63 [63] */
    /* begin component HCS_Al_64=PowderN() [64] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_64_var._rotation_is_identity) {
        if(!_HCS_Al_64_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_64_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_64_var._position_relative, _HCS_Al_64_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 64) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_64_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_64_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_64 [64] */
    /* begin component H52_Common_Out=Monitor_nD() [65] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H52_Common_Out_var._rotation_is_identity) {
        if(!_H52_Common_Out_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_Out_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H52_Common_Out_var._position_relative, _H52_Common_Out_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 65) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H52_Common_Out_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H52_Common_Out_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H52_Common_Out [65] */
    /* begin component H523_origin=Monitor_nD() [66] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_origin_var._rotation_is_identity) {
        if(!_H523_origin_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_origin_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_origin_var._position_relative, _H523_origin_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 66) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_origin_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H523_origin_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      if (SCATTERED) {/* conditional JUMP to H523_start */
        _particle->_index=200;
        _particle->flag_nocoordschange=1; /* pass corrdinate transformations when jumping */
      }
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_origin [66] */
    /* begin component H521_origin=Monitor_nD() [67] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_origin_var._rotation_is_identity) {
        if(!_H521_origin_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_origin_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_origin_var._position_relative, _H521_origin_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 67) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_origin_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H521_origin_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      if (SCATTERED) {/* conditional JUMP to H521_start */
        _particle->_index=68;
        _particle->flag_nocoordschange=1; /* pass corrdinate transformations when jumping */
      }
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_origin [67] */
    /* begin component H522_origin=Monitor_nD() [68] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_origin_var._rotation_is_identity) {
        if(!_H522_origin_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_origin_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_origin_var._position_relative, _H522_origin_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 68) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_origin_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H522_origin_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      if (SCATTERED) {/* conditional JUMP to H522_start */
        _particle->_index=138;
        _particle->flag_nocoordschange=1; /* pass corrdinate transformations when jumping */
      }
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_origin [68] */
    /* begin component H521_start=Arm() [69] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_start_var._rotation_is_identity) {
        if(!_H521_start_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_start_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_start_var._position_relative, _H521_start_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 69) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_start_var._name);
      DEBUG_STATE();
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_start [69] */
    /* begin component H521_Curved=Guide_gravity() [70] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_var._rotation_is_identity) {
        if(!_H521_Curved_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_var._position_relative, _H521_Curved_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 70) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved [70] */
    /* begin component H521_Curved_71=Guide_gravity() [71] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_71_var._rotation_is_identity) {
        if(!_H521_Curved_71_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_71_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_71_var._position_relative, _H521_Curved_71_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 71) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_71_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_71_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_71 [71] */
    /* begin component H521_Curved_72=Guide_gravity() [72] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_72_var._rotation_is_identity) {
        if(!_H521_Curved_72_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_72_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_72_var._position_relative, _H521_Curved_72_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 72) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_72_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_72_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_72 [72] */
    /* begin component H521_Curved_73=Guide_gravity() [73] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_73_var._rotation_is_identity) {
        if(!_H521_Curved_73_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_73_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_73_var._position_relative, _H521_Curved_73_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 73) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_73_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_73_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_73 [73] */
    /* begin component H521_Curved_74=Guide_gravity() [74] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_74_var._rotation_is_identity) {
        if(!_H521_Curved_74_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_74_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_74_var._position_relative, _H521_Curved_74_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 74) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_74_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_74_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_74 [74] */
    /* begin component H521_Curved_75=Guide_gravity() [75] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_75_var._rotation_is_identity) {
        if(!_H521_Curved_75_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_75_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_75_var._position_relative, _H521_Curved_75_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 75) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_75_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_75_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_75 [75] */
    /* begin component H521_Curved_76=Guide_gravity() [76] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_76_var._rotation_is_identity) {
        if(!_H521_Curved_76_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_76_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_76_var._position_relative, _H521_Curved_76_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 76) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_76_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_76_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_76 [76] */
    /* begin component H521_Curved_77=Guide_gravity() [77] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_77_var._rotation_is_identity) {
        if(!_H521_Curved_77_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_77_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_77_var._position_relative, _H521_Curved_77_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 77) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_77_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_77_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_77 [77] */
    /* begin component H521_Curved_78=Guide_gravity() [78] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_78_var._rotation_is_identity) {
        if(!_H521_Curved_78_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_78_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_78_var._position_relative, _H521_Curved_78_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 78) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_78_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_78_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_78 [78] */
    /* begin component H521_Curved_79=Guide_gravity() [79] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_79_var._rotation_is_identity) {
        if(!_H521_Curved_79_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_79_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_79_var._position_relative, _H521_Curved_79_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 79) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_79_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_79_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_79 [79] */
    /* begin component H521_Curved_80=Guide_gravity() [80] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_80_var._rotation_is_identity) {
        if(!_H521_Curved_80_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_80_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_80_var._position_relative, _H521_Curved_80_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 80) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_80_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_80_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_80 [80] */
    /* begin component H521_Curved_preVTE=Guide_gravity() [81] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_preVTE_var._rotation_is_identity) {
        if(!_H521_Curved_preVTE_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_preVTE_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_preVTE_var._position_relative, _H521_Curved_preVTE_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 81) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_preVTE_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_preVTE_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_preVTE [81] */
    /* begin component HCS_Al_82=PowderN() [82] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_82_var._rotation_is_identity) {
        if(!_HCS_Al_82_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_82_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_82_var._position_relative, _HCS_Al_82_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 82) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_82_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_82_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_82 [82] */
    /* begin component H521_VTE=Monitor_nD() [83] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_VTE_var._rotation_is_identity) {
        if(!_H521_VTE_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_VTE_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_VTE_var._position_relative, _H521_VTE_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 83) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_VTE_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H521_VTE_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_VTE [83] */
    /* begin component HCS_Al_84=PowderN() [84] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_84_var._rotation_is_identity) {
        if(!_HCS_Al_84_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_84_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_84_var._position_relative, _HCS_Al_84_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 84) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_84_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_84_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_84 [84] */
    /* begin component H521_Curved_85=Guide_gravity() [85] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_85_var._rotation_is_identity) {
        if(!_H521_Curved_85_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_85_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_85_var._position_relative, _H521_Curved_85_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 85) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_85_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_85_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_85 [85] */
    /* begin component H521_Curved_86=Guide_gravity() [86] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_86_var._rotation_is_identity) {
        if(!_H521_Curved_86_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_86_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_86_var._position_relative, _H521_Curved_86_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 86) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_86_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_86_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_86 [86] */
    /* begin component H521_Curved_87=Guide_gravity() [87] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_87_var._rotation_is_identity) {
        if(!_H521_Curved_87_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_87_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_87_var._position_relative, _H521_Curved_87_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 87) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_87_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_87_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_87 [87] */
    /* begin component H521_Curved_88=Guide_gravity() [88] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_88_var._rotation_is_identity) {
        if(!_H521_Curved_88_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_88_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_88_var._position_relative, _H521_Curved_88_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 88) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_88_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_88_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_88 [88] */
    /* begin component H521_Curved_89=Guide_gravity() [89] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_89_var._rotation_is_identity) {
        if(!_H521_Curved_89_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_89_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_89_var._position_relative, _H521_Curved_89_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 89) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_89_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_89_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_89 [89] */
    /* begin component H521_Curved_90=Guide_gravity() [90] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_90_var._rotation_is_identity) {
        if(!_H521_Curved_90_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_90_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_90_var._position_relative, _H521_Curved_90_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 90) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_90_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_90_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_90 [90] */
    /* begin component H521_Curved_91=Guide_gravity() [91] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_91_var._rotation_is_identity) {
        if(!_H521_Curved_91_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_91_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_91_var._position_relative, _H521_Curved_91_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 91) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_91_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_91_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_91 [91] */
    /* begin component H521_Curved_92=Guide_gravity() [92] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_92_var._rotation_is_identity) {
        if(!_H521_Curved_92_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_92_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_92_var._position_relative, _H521_Curved_92_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 92) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_92_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_92_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_92 [92] */
    /* begin component H521_Curved_93=Guide_gravity() [93] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_93_var._rotation_is_identity) {
        if(!_H521_Curved_93_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_93_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_93_var._position_relative, _H521_Curved_93_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 93) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_93_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_93_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_93 [93] */
    /* begin component H521_Curved_94=Guide_gravity() [94] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_94_var._rotation_is_identity) {
        if(!_H521_Curved_94_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_94_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_94_var._position_relative, _H521_Curved_94_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 94) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_94_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_94_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_94 [94] */
    /* begin component H521_Curved_95=Guide_gravity() [95] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_95_var._rotation_is_identity) {
        if(!_H521_Curved_95_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_95_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_95_var._position_relative, _H521_Curved_95_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 95) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_95_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_95_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_95 [95] */
    /* begin component H521_Curved_96=Guide_gravity() [96] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_96_var._rotation_is_identity) {
        if(!_H521_Curved_96_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_96_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_96_var._position_relative, _H521_Curved_96_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 96) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_96_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_96_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_96 [96] */
    /* begin component H521_Curved_97=Guide_gravity() [97] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_97_var._rotation_is_identity) {
        if(!_H521_Curved_97_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_97_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_97_var._position_relative, _H521_Curved_97_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 97) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_97_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_97_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_97 [97] */
    /* begin component H521_Curved_98=Guide_gravity() [98] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_98_var._rotation_is_identity) {
        if(!_H521_Curved_98_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_98_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_98_var._position_relative, _H521_Curved_98_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 98) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_98_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_98_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_98 [98] */
    /* begin component H521_Curved_99=Guide_gravity() [99] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_99_var._rotation_is_identity) {
        if(!_H521_Curved_99_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_99_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_99_var._position_relative, _H521_Curved_99_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 99) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_99_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_99_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_99 [99] */
    /* begin component H521_Curved_100=Guide_gravity() [100] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_100_var._rotation_is_identity) {
        if(!_H521_Curved_100_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_100_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_100_var._position_relative, _H521_Curved_100_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 100) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_100_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_100_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_100 [100] */
    /* begin component H521_Curved_101=Guide_gravity() [101] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_101_var._rotation_is_identity) {
        if(!_H521_Curved_101_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_101_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_101_var._position_relative, _H521_Curved_101_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 101) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_101_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_101_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_101 [101] */
    /* begin component H521_Curved_102=Guide_gravity() [102] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_102_var._rotation_is_identity) {
        if(!_H521_Curved_102_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_102_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_102_var._position_relative, _H521_Curved_102_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 102) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_102_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_102_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_102 [102] */
    /* begin component H521_Curved_103=Guide_gravity() [103] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_103_var._rotation_is_identity) {
        if(!_H521_Curved_103_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_103_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_103_var._position_relative, _H521_Curved_103_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 103) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_103_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_103_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_103 [103] */
    /* begin component H521_Curved_104=Guide_gravity() [104] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_104_var._rotation_is_identity) {
        if(!_H521_Curved_104_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_104_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_104_var._position_relative, _H521_Curved_104_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 104) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_104_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_104_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_104 [104] */
    /* begin component H521_Curved_105=Guide_gravity() [105] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_105_var._rotation_is_identity) {
        if(!_H521_Curved_105_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_105_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_105_var._position_relative, _H521_Curved_105_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 105) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_105_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_105_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_105 [105] */
    /* begin component H521_Curved_106=Guide_gravity() [106] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_106_var._rotation_is_identity) {
        if(!_H521_Curved_106_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_106_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_106_var._position_relative, _H521_Curved_106_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 106) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_106_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_106_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_106 [106] */
    /* begin component H521_Curved_107=Guide_gravity() [107] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_107_var._rotation_is_identity) {
        if(!_H521_Curved_107_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_107_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_107_var._position_relative, _H521_Curved_107_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 107) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_107_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Curved_107_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_107 [107] */
    /* begin component HCS_Al_108=PowderN() [108] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_108_var._rotation_is_identity) {
        if(!_HCS_Al_108_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_108_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_108_var._position_relative, _HCS_Al_108_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 108) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_108_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_108_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_108 [108] */
    /* begin component H521_Curved_Out=Monitor_nD() [109] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Curved_Out_var._rotation_is_identity) {
        if(!_H521_Curved_Out_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_Out_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Curved_Out_var._position_relative, _H521_Curved_Out_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 109) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Curved_Out_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H521_Curved_Out_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Curved_Out [109] */
    /* begin component H521_Straight=Guide_gravity() [110] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Straight_var._rotation_is_identity) {
        if(!_H521_Straight_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Straight_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Straight_var._position_relative, _H521_Straight_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 110) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Straight_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_Straight_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Straight [110] */
    /* begin component H521_Straight_Out=Monitor_nD() [111] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_Straight_Out_var._rotation_is_identity) {
        if(!_H521_Straight_Out_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_Straight_Out_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_Straight_Out_var._position_relative, _H521_Straight_Out_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 111) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_Straight_Out_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H521_Straight_Out_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_Straight_Out [111] */
    /* begin component HCS_Al_112=PowderN() [112] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_112_var._rotation_is_identity) {
        if(!_HCS_Al_112_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_112_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_112_var._position_relative, _HCS_Al_112_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 112) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_112_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_112_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_112 [112] */
    /* begin component H521_D16_Monochromator_Cradle=Monitor_nD() [113] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_D16_Monochromator_Cradle_var._rotation_is_identity) {
        if(!_H521_D16_Monochromator_Cradle_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Monochromator_Cradle_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_D16_Monochromator_Cradle_var._position_relative, _H521_D16_Monochromator_Cradle_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 113) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_D16_Monochromator_Cradle_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H521_D16_Monochromator_Cradle_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_D16_Monochromator_Cradle [113] */
    /* begin component H521_D16_Monochromator=Monochromator_curved() [114] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_D16_Monochromator_var._rotation_is_identity) {
        if(!_H521_D16_Monochromator_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Monochromator_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_D16_Monochromator_var._position_relative, _H521_D16_Monochromator_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 114) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_D16_Monochromator_var._name);
      DEBUG_STATE();
      class_Monochromator_curved_trace(&_H521_D16_Monochromator_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_D16_Monochromator [114] */
    /* begin component H521_D16_Monochromator_Jumper=Arm() [115] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_D16_Monochromator_Jumper_var._rotation_is_identity) {
        if(!_H521_D16_Monochromator_Jumper_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Monochromator_Jumper_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_D16_Monochromator_Jumper_var._position_relative, _H521_D16_Monochromator_Jumper_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 115) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_D16_Monochromator_Jumper_var._name);
      DEBUG_STATE();
      if (! flag) {/* conditional JUMP to H521_D16_Transmit */
        _particle->_index=123;
        _particle->flag_nocoordschange=1; /* pass corrdinate transformations when jumping */
      }
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_D16_Monochromator_Jumper [115] */
    /* begin component H521_D16_Monochromator_Out=Arm() [116] */
    if (!ABSORBED && _particle->_index == 116) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle->_index++;
    } /* end component H521_D16_Monochromator_Out [116] */
    /* begin component H521_D16_Sample_Div=Monitor_nD() [117] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_D16_Sample_Div_var._rotation_is_identity) {
        if(!_H521_D16_Sample_Div_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Sample_Div_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_D16_Sample_Div_var._position_relative, _H521_D16_Sample_Div_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 117) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_D16_Sample_Div_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H521_D16_Sample_Div_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_D16_Sample_Div [117] */
    /* begin component H521_D16_Sample_XY=Monitor_nD() [118] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_D16_Sample_XY_var._rotation_is_identity) {
        if(!_H521_D16_Sample_XY_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Sample_XY_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_D16_Sample_XY_var._position_relative, _H521_D16_Sample_XY_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 118) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_D16_Sample_XY_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H521_D16_Sample_XY_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_D16_Sample_XY [118] */
    /* begin component H521_D16_Sample_L=Monitor_nD() [119] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_D16_Sample_L_var._rotation_is_identity) {
        if(!_H521_D16_Sample_L_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Sample_L_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_D16_Sample_L_var._position_relative, _H521_D16_Sample_L_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 119) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_D16_Sample_L_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H521_D16_Sample_L_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_D16_Sample_L [119] */
    /* begin component H521_D16_Sample=Isotropic_Sqw() [120] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_D16_Sample_var._rotation_is_identity) {
        if(!_H521_D16_Sample_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Sample_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_D16_Sample_var._position_relative, _H521_D16_Sample_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 120) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_D16_Sample_var._name);
      DEBUG_STATE();
      class_Isotropic_Sqw_trace(&_H521_D16_Sample_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_D16_Sample [120] */
    /* begin component H521_D16_Detector=Monitor_nD() [121] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_D16_Detector_var._rotation_is_identity) {
        if(!_H521_D16_Detector_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Detector_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_D16_Detector_var._position_relative, _H521_D16_Detector_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 121) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_D16_Detector_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H521_D16_Detector_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_D16_Detector [121] */
    /* begin component H521_D16_Spectrometer=Monitor_nD() [122] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_D16_Spectrometer_var._rotation_is_identity) {
        if(!_H521_D16_Spectrometer_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Spectrometer_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_D16_Spectrometer_var._position_relative, _H521_D16_Spectrometer_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 122) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_D16_Spectrometer_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H521_D16_Spectrometer_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_D16_Spectrometer [122] */
    /* begin component H521_D16_Diffractometer=Monitor_nD() [123] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_D16_Diffractometer_var._rotation_is_identity) {
        if(!_H521_D16_Diffractometer_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Diffractometer_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_D16_Diffractometer_var._position_relative, _H521_D16_Diffractometer_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 123) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_D16_Diffractometer_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H521_D16_Diffractometer_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_D16_Diffractometer [123] */
    /* begin component H521_D16_Transmit=Arm() [124] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_D16_Transmit_var._rotation_is_identity) {
        if(!_H521_D16_Transmit_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Transmit_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_D16_Transmit_var._position_relative, _H521_D16_Transmit_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 124) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_D16_Transmit_var._name);
      DEBUG_STATE();
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_D16_Transmit [124] */
    /* begin component HCS_Al_125=PowderN() [125] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_125_var._rotation_is_identity) {
        if(!_HCS_Al_125_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_125_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_125_var._position_relative, _HCS_Al_125_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 125) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_125_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_125_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_125 [125] */
    /* begin component H521_P6_Start=Arm() [126] */
    if (!ABSORBED && _particle->_index == 126) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle->_index++;
    } /* end component H521_P6_Start [126] */
    /* begin component H521_P6=Guide_gravity() [127] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_P6_var._rotation_is_identity) {
        if(!_H521_P6_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_P6_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_P6_var._position_relative, _H521_P6_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 127) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_P6_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H521_P6_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_P6 [127] */
    /* begin component HCS_Al_128=PowderN() [128] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_128_var._rotation_is_identity) {
        if(!_HCS_Al_128_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_128_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_128_var._position_relative, _HCS_Al_128_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 128) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_128_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_128_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_128 [128] */
    /* begin component H521_SADAM_Monochromator_Cradle=Monitor_nD() [129] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_SADAM_Monochromator_Cradle_var._rotation_is_identity) {
        if(!_H521_SADAM_Monochromator_Cradle_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_SADAM_Monochromator_Cradle_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_SADAM_Monochromator_Cradle_var._position_relative, _H521_SADAM_Monochromator_Cradle_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 129) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_SADAM_Monochromator_Cradle_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H521_SADAM_Monochromator_Cradle_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_SADAM_Monochromator_Cradle [129] */
    /* begin component H521_SADAM_Monochromator=Monochromator_curved() [130] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_SADAM_Monochromator_var._rotation_is_identity) {
        if(!_H521_SADAM_Monochromator_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_SADAM_Monochromator_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_SADAM_Monochromator_var._position_relative, _H521_SADAM_Monochromator_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 130) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_SADAM_Monochromator_var._name);
      DEBUG_STATE();
      class_Monochromator_curved_trace(&_H521_SADAM_Monochromator_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_SADAM_Monochromator [130] */
    /* begin component H521_SADAM_Monochromator_Out=Arm() [131] */
    if (!ABSORBED && _particle->_index == 131) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle->_index++;
    } /* end component H521_SADAM_Monochromator_Out [131] */
    /* begin component H521_SADAM_Sample_Div=Monitor_nD() [132] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_SADAM_Sample_Div_var._rotation_is_identity) {
        if(!_H521_SADAM_Sample_Div_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_SADAM_Sample_Div_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_SADAM_Sample_Div_var._position_relative, _H521_SADAM_Sample_Div_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 132) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_SADAM_Sample_Div_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H521_SADAM_Sample_Div_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_SADAM_Sample_Div [132] */
    /* begin component H521_SADAM_Sample_XY=Monitor_nD() [133] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_SADAM_Sample_XY_var._rotation_is_identity) {
        if(!_H521_SADAM_Sample_XY_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_SADAM_Sample_XY_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_SADAM_Sample_XY_var._position_relative, _H521_SADAM_Sample_XY_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 133) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_SADAM_Sample_XY_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H521_SADAM_Sample_XY_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_SADAM_Sample_XY [133] */
    /* begin component H521_SADAM_Sample_L=Monitor_nD() [134] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_SADAM_Sample_L_var._rotation_is_identity) {
        if(!_H521_SADAM_Sample_L_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_SADAM_Sample_L_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_SADAM_Sample_L_var._position_relative, _H521_SADAM_Sample_L_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 134) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_SADAM_Sample_L_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H521_SADAM_Sample_L_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_SADAM_Sample_L [134] */
    /* begin component H521_SADAM_Sample=Isotropic_Sqw() [135] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_SADAM_Sample_var._rotation_is_identity) {
        if(!_H521_SADAM_Sample_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_SADAM_Sample_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_SADAM_Sample_var._position_relative, _H521_SADAM_Sample_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 135) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_SADAM_Sample_var._name);
      DEBUG_STATE();
      class_Isotropic_Sqw_trace(&_H521_SADAM_Sample_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_SADAM_Sample [135] */
    /* begin component H521_SADAM_Detector=Monitor_nD() [136] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_SADAM_Detector_var._rotation_is_identity) {
        if(!_H521_SADAM_Detector_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_SADAM_Detector_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_SADAM_Detector_var._position_relative, _H521_SADAM_Detector_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 136) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_SADAM_Detector_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H521_SADAM_Detector_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_SADAM_Detector [136] */
    /* begin component H521_SADAM_Spectrometer=Monitor_nD() [137] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_SADAM_Spectrometer_var._rotation_is_identity) {
        if(!_H521_SADAM_Spectrometer_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_SADAM_Spectrometer_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_SADAM_Spectrometer_var._position_relative, _H521_SADAM_Spectrometer_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 137) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_SADAM_Spectrometer_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H521_SADAM_Spectrometer_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_SADAM_Spectrometer [137] */
    /* begin component H521_SADAM_Diffractometer=Monitor_nD() [138] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_SADAM_Diffractometer_var._rotation_is_identity) {
        if(!_H521_SADAM_Diffractometer_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_SADAM_Diffractometer_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_SADAM_Diffractometer_var._position_relative, _H521_SADAM_Diffractometer_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 138) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_SADAM_Diffractometer_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H521_SADAM_Diffractometer_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_SADAM_Diffractometer [138] */
    /* begin component H522_start=Arm() [139] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_start_var._rotation_is_identity) {
        if(!_H522_start_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_start_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_start_var._position_relative, _H522_start_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 139) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_start_var._name);
      DEBUG_STATE();
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_start [139] */
    /* begin component H522_Curved=Guide_gravity() [140] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_var._rotation_is_identity) {
        if(!_H522_Curved_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_var._position_relative, _H522_Curved_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 140) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved [140] */
    /* begin component H522_Curved_141=Guide_gravity() [141] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_141_var._rotation_is_identity) {
        if(!_H522_Curved_141_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_141_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_141_var._position_relative, _H522_Curved_141_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 141) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_141_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_141_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_141 [141] */
    /* begin component H522_Curved_142=Guide_gravity() [142] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_142_var._rotation_is_identity) {
        if(!_H522_Curved_142_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_142_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_142_var._position_relative, _H522_Curved_142_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 142) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_142_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_142_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_142 [142] */
    /* begin component H522_Curved_143=Guide_gravity() [143] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_143_var._rotation_is_identity) {
        if(!_H522_Curved_143_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_143_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_143_var._position_relative, _H522_Curved_143_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 143) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_143_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_143_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_143 [143] */
    /* begin component H522_Curved_144=Guide_gravity() [144] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_144_var._rotation_is_identity) {
        if(!_H522_Curved_144_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_144_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_144_var._position_relative, _H522_Curved_144_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 144) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_144_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_144_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_144 [144] */
    /* begin component H522_Curved_145=Guide_gravity() [145] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_145_var._rotation_is_identity) {
        if(!_H522_Curved_145_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_145_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_145_var._position_relative, _H522_Curved_145_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 145) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_145_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_145_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_145 [145] */
    /* begin component H522_Curved_146=Guide_gravity() [146] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_146_var._rotation_is_identity) {
        if(!_H522_Curved_146_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_146_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_146_var._position_relative, _H522_Curved_146_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 146) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_146_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_146_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_146 [146] */
    /* begin component H522_Curved_147=Guide_gravity() [147] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_147_var._rotation_is_identity) {
        if(!_H522_Curved_147_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_147_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_147_var._position_relative, _H522_Curved_147_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 147) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_147_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_147_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_147 [147] */
    /* begin component H522_Curved_148=Guide_gravity() [148] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_148_var._rotation_is_identity) {
        if(!_H522_Curved_148_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_148_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_148_var._position_relative, _H522_Curved_148_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 148) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_148_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_148_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_148 [148] */
    /* begin component H522_Curved_149=Guide_gravity() [149] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_149_var._rotation_is_identity) {
        if(!_H522_Curved_149_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_149_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_149_var._position_relative, _H522_Curved_149_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 149) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_149_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_149_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_149 [149] */
    /* begin component HCS_Al_150=PowderN() [150] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_150_var._rotation_is_identity) {
        if(!_HCS_Al_150_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_150_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_150_var._position_relative, _HCS_Al_150_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 150) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_150_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_150_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_150 [150] */
    /* begin component H522_VTE=Monitor_nD() [151] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_VTE_var._rotation_is_identity) {
        if(!_H522_VTE_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_VTE_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_VTE_var._position_relative, _H522_VTE_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 151) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_VTE_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H522_VTE_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_VTE [151] */
    /* begin component HCS_Al_152=PowderN() [152] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_152_var._rotation_is_identity) {
        if(!_HCS_Al_152_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_152_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_152_var._position_relative, _HCS_Al_152_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 152) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_152_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_152_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_152 [152] */
    /* begin component H523_Curved_153=Guide_gravity() [153] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_153_var._rotation_is_identity) {
        if(!_H523_Curved_153_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_153_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_153_var._position_relative, _H523_Curved_153_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 153) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_153_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_153_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_153 [153] */
    /* begin component H523_Curved_154=Guide_gravity() [154] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_154_var._rotation_is_identity) {
        if(!_H523_Curved_154_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_154_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_154_var._position_relative, _H523_Curved_154_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 154) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_154_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_154_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_154 [154] */
    /* begin component H523_Curved_155=Guide_gravity() [155] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_155_var._rotation_is_identity) {
        if(!_H523_Curved_155_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_155_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_155_var._position_relative, _H523_Curved_155_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 155) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_155_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_155_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_155 [155] */
    /* begin component H523_Curved_156=Guide_gravity() [156] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_156_var._rotation_is_identity) {
        if(!_H523_Curved_156_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_156_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_156_var._position_relative, _H523_Curved_156_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 156) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_156_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_156_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_156 [156] */
    /* begin component H523_Curved_157=Guide_gravity() [157] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_157_var._rotation_is_identity) {
        if(!_H523_Curved_157_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_157_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_157_var._position_relative, _H523_Curved_157_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 157) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_157_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_157_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_157 [157] */
    /* begin component H522_Curved_158=Guide_gravity() [158] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_158_var._rotation_is_identity) {
        if(!_H522_Curved_158_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_158_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_158_var._position_relative, _H522_Curved_158_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 158) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_158_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_158_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_158 [158] */
    /* begin component H522_Curved_159=Guide_gravity() [159] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_159_var._rotation_is_identity) {
        if(!_H522_Curved_159_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_159_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_159_var._position_relative, _H522_Curved_159_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 159) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_159_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_159_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_159 [159] */
    /* begin component H522_Curved_160=Guide_gravity() [160] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_160_var._rotation_is_identity) {
        if(!_H522_Curved_160_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_160_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_160_var._position_relative, _H522_Curved_160_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 160) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_160_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_160_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_160 [160] */
    /* begin component H522_Curved_161=Guide_gravity() [161] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_161_var._rotation_is_identity) {
        if(!_H522_Curved_161_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_161_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_161_var._position_relative, _H522_Curved_161_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 161) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_161_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_161_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_161 [161] */
    /* begin component H522_Curved_162=Guide_gravity() [162] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_162_var._rotation_is_identity) {
        if(!_H522_Curved_162_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_162_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_162_var._position_relative, _H522_Curved_162_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 162) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_162_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_162_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_162 [162] */
    /* begin component H522_Curved_163=Guide_gravity() [163] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_163_var._rotation_is_identity) {
        if(!_H522_Curved_163_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_163_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_163_var._position_relative, _H522_Curved_163_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 163) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_163_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_163_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_163 [163] */
    /* begin component H522_Curved_164=Guide_gravity() [164] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_164_var._rotation_is_identity) {
        if(!_H522_Curved_164_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_164_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_164_var._position_relative, _H522_Curved_164_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 164) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_164_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_164_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_164 [164] */
    /* begin component H522_Curved_165=Guide_gravity() [165] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_165_var._rotation_is_identity) {
        if(!_H522_Curved_165_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_165_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_165_var._position_relative, _H522_Curved_165_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 165) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_165_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_165_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_165 [165] */
    /* begin component H522_Curved_166=Guide_gravity() [166] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_166_var._rotation_is_identity) {
        if(!_H522_Curved_166_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_166_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_166_var._position_relative, _H522_Curved_166_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 166) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_166_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_166_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_166 [166] */
    /* begin component H522_Curved_167=Guide_gravity() [167] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_167_var._rotation_is_identity) {
        if(!_H522_Curved_167_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_167_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_167_var._position_relative, _H522_Curved_167_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 167) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_167_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_167_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_167 [167] */
    /* begin component H522_Curved_168=Guide_gravity() [168] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_168_var._rotation_is_identity) {
        if(!_H522_Curved_168_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_168_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_168_var._position_relative, _H522_Curved_168_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 168) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_168_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_168_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_168 [168] */
    /* begin component H522_Curved_169=Guide_gravity() [169] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_169_var._rotation_is_identity) {
        if(!_H522_Curved_169_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_169_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_169_var._position_relative, _H522_Curved_169_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 169) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_169_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_169_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_169 [169] */
    /* begin component H522_Curved_170=Guide_gravity() [170] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_170_var._rotation_is_identity) {
        if(!_H522_Curved_170_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_170_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_170_var._position_relative, _H522_Curved_170_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 170) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_170_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_170_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_170 [170] */
    /* begin component H522_Curved_171=Guide_gravity() [171] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_171_var._rotation_is_identity) {
        if(!_H522_Curved_171_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_171_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_171_var._position_relative, _H522_Curved_171_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 171) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_171_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_171_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_171 [171] */
    /* begin component H522_Curved_172=Guide_gravity() [172] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_172_var._rotation_is_identity) {
        if(!_H522_Curved_172_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_172_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_172_var._position_relative, _H522_Curved_172_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 172) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_172_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_172_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_172 [172] */
    /* begin component H522_Curved_173=Guide_gravity() [173] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_173_var._rotation_is_identity) {
        if(!_H522_Curved_173_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_173_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_173_var._position_relative, _H522_Curved_173_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 173) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_173_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_173_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_173 [173] */
    /* begin component H522_Curved_174=Guide_gravity() [174] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_174_var._rotation_is_identity) {
        if(!_H522_Curved_174_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_174_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_174_var._position_relative, _H522_Curved_174_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 174) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_174_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_174_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_174 [174] */
    /* begin component H522_Curved_175=Guide_gravity() [175] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_175_var._rotation_is_identity) {
        if(!_H522_Curved_175_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_175_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_175_var._position_relative, _H522_Curved_175_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 175) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_175_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_175_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_175 [175] */
    /* begin component H522_Curved_176=Guide_gravity() [176] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_176_var._rotation_is_identity) {
        if(!_H522_Curved_176_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_176_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_176_var._position_relative, _H522_Curved_176_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 176) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_176_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_176_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_176 [176] */
    /* begin component H522_Curved_177=Guide_gravity() [177] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_177_var._rotation_is_identity) {
        if(!_H522_Curved_177_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_177_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_177_var._position_relative, _H522_Curved_177_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 177) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_177_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Curved_177_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_177 [177] */
    /* begin component HCS_Al_178=PowderN() [178] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_178_var._rotation_is_identity) {
        if(!_HCS_Al_178_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_178_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_178_var._position_relative, _HCS_Al_178_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 178) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_178_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_178_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_178 [178] */
    /* begin component H522_Curved_Out_XY=Monitor_nD() [179] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_Out_XY_var._rotation_is_identity) {
        if(!_H522_Curved_Out_XY_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_Out_XY_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_Out_XY_var._position_relative, _H522_Curved_Out_XY_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 179) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_Out_XY_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H522_Curved_Out_XY_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_Out_XY [179] */
    /* begin component H522_Curved_Out_XL=Monitor_nD() [180] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Curved_Out_XL_var._rotation_is_identity) {
        if(!_H522_Curved_Out_XL_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_Out_XL_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Curved_Out_XL_var._position_relative, _H522_Curved_Out_XL_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 180) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Curved_Out_XL_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H522_Curved_Out_XL_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Curved_Out_XL [180] */
    /* begin component WASP_Vselector=V_selector() [181] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_WASP_Vselector_var._rotation_is_identity) {
        if(!_WASP_Vselector_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _WASP_Vselector_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_WASP_Vselector_var._position_relative, _WASP_Vselector_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 181) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_WASP_Vselector_var._name);
      DEBUG_STATE();
      class_V_selector_trace(&_WASP_Vselector_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component WASP_Vselector [181] */
    /* begin component HCS_Al_182=PowderN() [182] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_182_var._rotation_is_identity) {
        if(!_HCS_Al_182_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_182_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_182_var._position_relative, _HCS_Al_182_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 182) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_182_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_182_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_182 [182] */
    /* begin component H522_Straight=Guide_gravity() [183] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Straight_var._rotation_is_identity) {
        if(!_H522_Straight_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Straight_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Straight_var._position_relative, _H522_Straight_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 183) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Straight_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Straight_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Straight [183] */
    /* begin component HCS_Al_184=PowderN() [184] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_184_var._rotation_is_identity) {
        if(!_HCS_Al_184_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_184_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_184_var._position_relative, _HCS_Al_184_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 184) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_184_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_184_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_184 [184] */
    /* begin component H522_Vsel_L=Monitor_nD() [185] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Vsel_L_var._rotation_is_identity) {
        if(!_H522_Vsel_L_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Vsel_L_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Vsel_L_var._position_relative, _H522_Vsel_L_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 185) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Vsel_L_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H522_Vsel_L_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Vsel_L [185] */
    /* begin component H522_mirror_centre=Arm() [186] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_mirror_centre_var._rotation_is_identity) {
        if(!_H522_mirror_centre_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_mirror_centre_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_mirror_centre_var._position_relative, _H522_mirror_centre_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 186) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_mirror_centre_var._name);
      DEBUG_STATE();
      class_Arm_trace(&_H522_mirror_centre_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_mirror_centre [186] */
    /* begin component WASP_polariser=Pol_mirror() [187] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_WASP_polariser_var._rotation_is_identity) {
        if(!_WASP_polariser_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _WASP_polariser_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_WASP_polariser_var._position_relative, _WASP_polariser_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 187) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_WASP_polariser_var._name);
      DEBUG_STATE();
      class_Pol_mirror_trace(&_WASP_polariser_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component WASP_polariser [187] */
    /* begin component H522_mirror_outdir=Arm() [188] */
    if (!ABSORBED && _particle->_index == 188) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle->_index++;
    } /* end component H522_mirror_outdir [188] */
    /* begin component H522_mirror_ReflectXY=Monitor_nD() [189] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_mirror_ReflectXY_var._rotation_is_identity) {
        if(!_H522_mirror_ReflectXY_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_mirror_ReflectXY_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_mirror_ReflectXY_var._position_relative, _H522_mirror_ReflectXY_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 189) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_mirror_ReflectXY_var._name);
      DEBUG_STATE();
      if ((flag == 1)) // conditional WHEN execution
      class_Monitor_nD_trace(&_H522_mirror_ReflectXY_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_mirror_ReflectXY [189] */
    /* begin component H522_mirror_TransmitXY=Monitor_nD() [190] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_mirror_TransmitXY_var._rotation_is_identity) {
        if(!_H522_mirror_TransmitXY_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_mirror_TransmitXY_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_mirror_TransmitXY_var._position_relative, _H522_mirror_TransmitXY_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 190) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_mirror_TransmitXY_var._name);
      DEBUG_STATE();
      if ((flag == 2)) // conditional WHEN execution
      class_Monitor_nD_trace(&_H522_mirror_TransmitXY_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_mirror_TransmitXY [190] */
    /* begin component H522_mirror_outdXY=Monitor_nD() [191] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_mirror_outdXY_var._rotation_is_identity) {
        if(!_H522_mirror_outdXY_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_mirror_outdXY_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_mirror_outdXY_var._position_relative, _H522_mirror_outdXY_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 191) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_mirror_outdXY_var._name);
      DEBUG_STATE();
      if ((flag == 1)) // conditional WHEN execution
      class_Monitor_nD_trace(&_H522_mirror_outdXY_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_mirror_outdXY [191] */
    /* begin component WASP_Vpolariser=Pol_guide_vmirror() [192] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_WASP_Vpolariser_var._rotation_is_identity) {
        if(!_WASP_Vpolariser_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _WASP_Vpolariser_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_WASP_Vpolariser_var._position_relative, _WASP_Vpolariser_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 192) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_WASP_Vpolariser_var._name);
      DEBUG_STATE();
      class_Pol_guide_vmirror_trace(&_WASP_Vpolariser_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component WASP_Vpolariser [192] */
    /* begin component H522_Straight_Last=Guide_gravity() [193] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_Straight_Last_var._rotation_is_identity) {
        if(!_H522_Straight_Last_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_Straight_Last_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_Straight_Last_var._position_relative, _H522_Straight_Last_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 193) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_Straight_Last_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H522_Straight_Last_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_Straight_Last [193] */
    /* begin component H522_WASP_Sample_Div=Monitor_nD() [194] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_WASP_Sample_Div_var._rotation_is_identity) {
        if(!_H522_WASP_Sample_Div_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_WASP_Sample_Div_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_WASP_Sample_Div_var._position_relative, _H522_WASP_Sample_Div_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 194) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_WASP_Sample_Div_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H522_WASP_Sample_Div_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_WASP_Sample_Div [194] */
    /* begin component H522_WASP_Sample_XY=Monitor_nD() [195] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_WASP_Sample_XY_var._rotation_is_identity) {
        if(!_H522_WASP_Sample_XY_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_WASP_Sample_XY_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_WASP_Sample_XY_var._position_relative, _H522_WASP_Sample_XY_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 195) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_WASP_Sample_XY_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H522_WASP_Sample_XY_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_WASP_Sample_XY [195] */
    /* begin component H522_WASP_Sample_L=Monitor_nD() [196] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_WASP_Sample_L_var._rotation_is_identity) {
        if(!_H522_WASP_Sample_L_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_WASP_Sample_L_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_WASP_Sample_L_var._position_relative, _H522_WASP_Sample_L_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 196) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_WASP_Sample_L_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H522_WASP_Sample_L_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_WASP_Sample_L [196] */
    /* begin component H522_WASP_Sample=Incoherent() [197] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_WASP_Sample_var._rotation_is_identity) {
        if(!_H522_WASP_Sample_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_WASP_Sample_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_WASP_Sample_var._position_relative, _H522_WASP_Sample_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 197) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_WASP_Sample_var._name);
      DEBUG_STATE();
      class_Incoherent_trace(&_H522_WASP_Sample_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_WASP_Sample [197] */
    /* begin component H522_WASP_Detector=Monitor_nD() [198] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_WASP_Detector_var._rotation_is_identity) {
        if(!_H522_WASP_Detector_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_WASP_Detector_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_WASP_Detector_var._position_relative, _H522_WASP_Detector_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 198) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_WASP_Detector_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H522_WASP_Detector_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_WASP_Detector [198] */
    /* begin component H522_WASP_Spectrometer=Monitor_nD() [199] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_WASP_Spectrometer_var._rotation_is_identity) {
        if(!_H522_WASP_Spectrometer_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_WASP_Spectrometer_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_WASP_Spectrometer_var._position_relative, _H522_WASP_Spectrometer_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 199) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_WASP_Spectrometer_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H522_WASP_Spectrometer_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_WASP_Spectrometer [199] */
    /* begin component H522_WASP_Diffractometer=Monitor_nD() [200] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H522_WASP_Diffractometer_var._rotation_is_identity) {
        if(!_H522_WASP_Diffractometer_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H522_WASP_Diffractometer_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H522_WASP_Diffractometer_var._position_relative, _H522_WASP_Diffractometer_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 200) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H522_WASP_Diffractometer_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H522_WASP_Diffractometer_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H522_WASP_Diffractometer [200] */
    /* begin component H523_start=Arm() [201] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_start_var._rotation_is_identity) {
        if(!_H523_start_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_start_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_start_var._position_relative, _H523_start_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 201) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_start_var._name);
      DEBUG_STATE();
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_start [201] */
    /* begin component H523_Curved=Guide_gravity() [202] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_var._rotation_is_identity) {
        if(!_H523_Curved_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_var._position_relative, _H523_Curved_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 202) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved [202] */
    /* begin component H523_Curved_203=Guide_gravity() [203] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_203_var._rotation_is_identity) {
        if(!_H523_Curved_203_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_203_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_203_var._position_relative, _H523_Curved_203_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 203) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_203_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_203_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_203 [203] */
    /* begin component H523_Curved_204=Guide_gravity() [204] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_204_var._rotation_is_identity) {
        if(!_H523_Curved_204_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_204_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_204_var._position_relative, _H523_Curved_204_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 204) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_204_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_204_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_204 [204] */
    /* begin component H523_Curved_205=Guide_gravity() [205] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_205_var._rotation_is_identity) {
        if(!_H523_Curved_205_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_205_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_205_var._position_relative, _H523_Curved_205_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 205) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_205_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_205_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_205 [205] */
    /* begin component H523_Curved_206=Guide_gravity() [206] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_206_var._rotation_is_identity) {
        if(!_H523_Curved_206_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_206_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_206_var._position_relative, _H523_Curved_206_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 206) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_206_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_206_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_206 [206] */
    /* begin component HCS_Al_207=PowderN() [207] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_207_var._rotation_is_identity) {
        if(!_HCS_Al_207_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_207_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_207_var._position_relative, _HCS_Al_207_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 207) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_207_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_207_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_207 [207] */
    /* begin component H523_VTE=Monitor_nD() [208] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_VTE_var._rotation_is_identity) {
        if(!_H523_VTE_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_VTE_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_VTE_var._position_relative, _H523_VTE_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 208) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_VTE_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H523_VTE_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_VTE [208] */
    /* begin component HCS_Al_209=PowderN() [209] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_209_var._rotation_is_identity) {
        if(!_HCS_Al_209_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_209_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_209_var._position_relative, _HCS_Al_209_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 209) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_209_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_209_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_209 [209] */
    /* begin component H523_Curved_210=Guide_gravity() [210] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_210_var._rotation_is_identity) {
        if(!_H523_Curved_210_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_210_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_210_var._position_relative, _H523_Curved_210_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 210) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_210_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_210_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_210 [210] */
    /* begin component H523_Curved_211=Guide_gravity() [211] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_211_var._rotation_is_identity) {
        if(!_H523_Curved_211_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_211_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_211_var._position_relative, _H523_Curved_211_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 211) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_211_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_211_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_211 [211] */
    /* begin component H523_Curved_212=Guide_gravity() [212] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_212_var._rotation_is_identity) {
        if(!_H523_Curved_212_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_212_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_212_var._position_relative, _H523_Curved_212_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 212) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_212_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_212_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_212 [212] */
    /* begin component H523_Curved_213=Guide_gravity() [213] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_213_var._rotation_is_identity) {
        if(!_H523_Curved_213_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_213_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_213_var._position_relative, _H523_Curved_213_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 213) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_213_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_213_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_213 [213] */
    /* begin component H523_Curved_214=Guide_gravity() [214] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_214_var._rotation_is_identity) {
        if(!_H523_Curved_214_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_214_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_214_var._position_relative, _H523_Curved_214_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 214) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_214_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_214_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_214 [214] */
    /* begin component H523_Curved_215=Guide_gravity() [215] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_215_var._rotation_is_identity) {
        if(!_H523_Curved_215_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_215_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_215_var._position_relative, _H523_Curved_215_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 215) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_215_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_215_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_215 [215] */
    /* begin component H523_Curved_216=Guide_gravity() [216] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_216_var._rotation_is_identity) {
        if(!_H523_Curved_216_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_216_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_216_var._position_relative, _H523_Curved_216_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 216) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_216_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_216_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_216 [216] */
    /* begin component H523_Curved_217=Guide_gravity() [217] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_217_var._rotation_is_identity) {
        if(!_H523_Curved_217_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_217_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_217_var._position_relative, _H523_Curved_217_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 217) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_217_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_217_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_217 [217] */
    /* begin component H523_Curved_218=Guide_gravity() [218] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_218_var._rotation_is_identity) {
        if(!_H523_Curved_218_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_218_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_218_var._position_relative, _H523_Curved_218_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 218) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_218_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_218_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_218 [218] */
    /* begin component H523_Curved_219=Guide_gravity() [219] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_219_var._rotation_is_identity) {
        if(!_H523_Curved_219_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_219_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_219_var._position_relative, _H523_Curved_219_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 219) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_219_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_219_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_219 [219] */
    /* begin component H523_Curved_220=Guide_gravity() [220] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_220_var._rotation_is_identity) {
        if(!_H523_Curved_220_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_220_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_220_var._position_relative, _H523_Curved_220_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 220) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_220_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_220_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_220 [220] */
    /* begin component H523_Curved_221=Guide_gravity() [221] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_221_var._rotation_is_identity) {
        if(!_H523_Curved_221_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_221_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_221_var._position_relative, _H523_Curved_221_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 221) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_221_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_221_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_221 [221] */
    /* begin component H523_Curved_222=Guide_gravity() [222] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_222_var._rotation_is_identity) {
        if(!_H523_Curved_222_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_222_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_222_var._position_relative, _H523_Curved_222_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 222) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_222_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_222_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_222 [222] */
    /* begin component H523_Curved_223=Guide_gravity() [223] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_223_var._rotation_is_identity) {
        if(!_H523_Curved_223_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_223_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_223_var._position_relative, _H523_Curved_223_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 223) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_223_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_223_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_223 [223] */
    /* begin component H523_Curved_224=Guide_gravity() [224] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_224_var._rotation_is_identity) {
        if(!_H523_Curved_224_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_224_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_224_var._position_relative, _H523_Curved_224_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 224) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_224_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_224_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_224 [224] */
    /* begin component H523_Curved_225=Guide_gravity() [225] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_225_var._rotation_is_identity) {
        if(!_H523_Curved_225_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_225_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_225_var._position_relative, _H523_Curved_225_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 225) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_225_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_225_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_225 [225] */
    /* begin component H523_Curved_226=Guide_gravity() [226] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_226_var._rotation_is_identity) {
        if(!_H523_Curved_226_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_226_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_226_var._position_relative, _H523_Curved_226_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 226) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_226_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_226_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_226 [226] */
    /* begin component H523_Curved_227=Guide_gravity() [227] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_227_var._rotation_is_identity) {
        if(!_H523_Curved_227_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_227_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_227_var._position_relative, _H523_Curved_227_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 227) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_227_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_227_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_227 [227] */
    /* begin component H523_Curved_228=Guide_gravity() [228] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_228_var._rotation_is_identity) {
        if(!_H523_Curved_228_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_228_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_228_var._position_relative, _H523_Curved_228_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 228) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_228_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_228_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_228 [228] */
    /* begin component H523_Curved_229=Guide_gravity() [229] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_Curved_229_var._rotation_is_identity) {
        if(!_H523_Curved_229_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_229_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_Curved_229_var._position_relative, _H523_Curved_229_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 229) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_Curved_229_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H523_Curved_229_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_Curved_229 [229] */
    /* begin component HCS_Al_230=PowderN() [230] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_230_var._rotation_is_identity) {
        if(!_HCS_Al_230_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_230_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_230_var._position_relative, _HCS_Al_230_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 230) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_230_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_230_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_230 [230] */
    /* begin component H523_CryoEDM_In=Arm() [231] */
    if (!ABSORBED && _particle->_index == 231) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle->_index++;
    } /* end component H523_CryoEDM_In [231] */
    /* begin component H523_CryoEDM_In_L=Monitor_nD() [232] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_CryoEDM_In_L_var._rotation_is_identity) {
        if(!_H523_CryoEDM_In_L_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_CryoEDM_In_L_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_CryoEDM_In_L_var._position_relative, _H523_CryoEDM_In_L_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 232) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_CryoEDM_In_L_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H523_CryoEDM_In_L_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_CryoEDM_In_L [232] */
    /* begin component H523_CryoEDM_mirror_center=Arm() [233] */
    if (!ABSORBED && _particle->_index == 233) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle->_index++;
    } /* end component H523_CryoEDM_mirror_center [233] */
    /* begin component H523_CryoEDM_polariser=Pol_mirror() [234] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_CryoEDM_polariser_var._rotation_is_identity) {
        if(!_H523_CryoEDM_polariser_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_CryoEDM_polariser_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_CryoEDM_polariser_var._position_relative, _H523_CryoEDM_polariser_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 234) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_CryoEDM_polariser_var._name);
      DEBUG_STATE();
      class_Pol_mirror_trace(&_H523_CryoEDM_polariser_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_CryoEDM_polariser [234] */
    /* begin component H523_CryoEDM_mirror_outdir=Arm() [235] */
    if (!ABSORBED && _particle->_index == 235) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle->_index++;
    } /* end component H523_CryoEDM_mirror_outdir [235] */
    /* begin component H523_CryoEDM_mirror_ReflectXY=Monitor_nD() [236] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_CryoEDM_mirror_ReflectXY_var._rotation_is_identity) {
        if(!_H523_CryoEDM_mirror_ReflectXY_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_CryoEDM_mirror_ReflectXY_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_CryoEDM_mirror_ReflectXY_var._position_relative, _H523_CryoEDM_mirror_ReflectXY_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 236) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_CryoEDM_mirror_ReflectXY_var._name);
      DEBUG_STATE();
      if ((flag == 1)) // conditional WHEN execution
      class_Monitor_nD_trace(&_H523_CryoEDM_mirror_ReflectXY_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_CryoEDM_mirror_ReflectXY [236] */
    /* begin component H523_CryoEDM_mirror_TransmitXY=Monitor_nD() [237] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_CryoEDM_mirror_TransmitXY_var._rotation_is_identity) {
        if(!_H523_CryoEDM_mirror_TransmitXY_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_CryoEDM_mirror_TransmitXY_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_CryoEDM_mirror_TransmitXY_var._position_relative, _H523_CryoEDM_mirror_TransmitXY_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 237) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_CryoEDM_mirror_TransmitXY_var._name);
      DEBUG_STATE();
      if ((flag == 2)) // conditional WHEN execution
      class_Monitor_nD_trace(&_H523_CryoEDM_mirror_TransmitXY_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_CryoEDM_mirror_TransmitXY [237] */
    /* begin component H523_CryoEDM_Sample_L=Monitor_nD() [238] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_CryoEDM_Sample_L_var._rotation_is_identity) {
        if(!_H523_CryoEDM_Sample_L_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_CryoEDM_Sample_L_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_CryoEDM_Sample_L_var._position_relative, _H523_CryoEDM_Sample_L_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 238) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_CryoEDM_Sample_L_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H523_CryoEDM_Sample_L_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_CryoEDM_Sample_L [238] */
    /* begin component H523_CryoEDM_Sample_Div=Monitor_nD() [239] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_CryoEDM_Sample_Div_var._rotation_is_identity) {
        if(!_H523_CryoEDM_Sample_Div_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_CryoEDM_Sample_Div_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_CryoEDM_Sample_Div_var._position_relative, _H523_CryoEDM_Sample_Div_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 239) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_CryoEDM_Sample_Div_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H523_CryoEDM_Sample_Div_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_CryoEDM_Sample_Div [239] */
    /* begin component H523_CryoEDM_Sample_XY=Monitor_nD() [240] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H523_CryoEDM_Sample_XY_var._rotation_is_identity) {
        if(!_H523_CryoEDM_Sample_XY_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H523_CryoEDM_Sample_XY_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H523_CryoEDM_Sample_XY_var._position_relative, _H523_CryoEDM_Sample_XY_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 240) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H523_CryoEDM_Sample_XY_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H523_CryoEDM_Sample_XY_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H523_CryoEDM_Sample_XY [240] */
    /* begin component H51_start=Arm() [241] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H51_start_var._rotation_is_identity) {
        if(!_H51_start_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H51_start_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H51_start_var._position_relative, _H51_start_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 241) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H51_start_var._name);
      DEBUG_STATE();
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H51_start [241] */
    /* begin component H51_inpile=Guide_gravity() [242] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H51_inpile_var._rotation_is_identity) {
        if(!_H51_inpile_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H51_inpile_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H51_inpile_var._position_relative, _H51_inpile_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 242) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H51_inpile_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H51_inpile_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H51_inpile [242] */
    /* begin component H51_Obt_1=Guide_gravity() [243] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H51_Obt_1_var._rotation_is_identity) {
        if(!_H51_Obt_1_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H51_Obt_1_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H51_Obt_1_var._position_relative, _H51_Obt_1_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 243) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H51_Obt_1_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H51_Obt_1_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H51_Obt_1 [243] */
    /* begin component H51_Obt_2=Guide_gravity() [244] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H51_Obt_2_var._rotation_is_identity) {
        if(!_H51_Obt_2_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H51_Obt_2_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H51_Obt_2_var._position_relative, _H51_Obt_2_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 244) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H51_Obt_2_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H51_Obt_2_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H51_Obt_2 [244] */
    /* begin component H51_Obt_3=Guide_gravity() [245] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H51_Obt_3_var._rotation_is_identity) {
        if(!_H51_Obt_3_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H51_Obt_3_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H51_Obt_3_var._position_relative, _H51_Obt_3_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 245) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H51_Obt_3_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H51_Obt_3_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H51_Obt_3 [245] */
    /* begin component HCS_Al_246=PowderN() [246] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_246_var._rotation_is_identity) {
        if(!_HCS_Al_246_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_246_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_246_var._position_relative, _HCS_Al_246_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 246) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_246_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_246_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_246 [246] */
    /* begin component H51_Obt_Out=Monitor_nD() [247] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H51_Obt_Out_var._rotation_is_identity) {
        if(!_H51_Obt_Out_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H51_Obt_Out_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H51_Obt_Out_var._position_relative, _H51_Obt_Out_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 247) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H51_Obt_Out_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H51_Obt_Out_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H51_Obt_Out [247] */
    /* begin component HCS_Al_248=PowderN() [248] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_248_var._rotation_is_identity) {
        if(!_HCS_Al_248_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_248_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_248_var._position_relative, _HCS_Al_248_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 248) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_248_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_248_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_248 [248] */
    /* begin component H51_S2=Guide_gravity() [249] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H51_S2_var._rotation_is_identity) {
        if(!_H51_S2_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H51_S2_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H51_S2_var._position_relative, _H51_S2_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 249) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H51_S2_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H51_S2_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H51_S2 [249] */
    /* begin component H51_S2_250=Guide_gravity() [250] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H51_S2_250_var._rotation_is_identity) {
        if(!_H51_S2_250_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H51_S2_250_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H51_S2_250_var._position_relative, _H51_S2_250_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 250) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H51_S2_250_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H51_S2_250_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H51_S2_250 [250] */
    /* begin component H51_S2_251=Guide_gravity() [251] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H51_S2_251_var._rotation_is_identity) {
        if(!_H51_S2_251_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H51_S2_251_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H51_S2_251_var._position_relative, _H51_S2_251_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 251) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H51_S2_251_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H51_S2_251_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H51_S2_251 [251] */
    /* begin component HCS_Al_H51=PowderN() [252] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_H51_var._rotation_is_identity) {
        if(!_HCS_Al_H51_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_H51_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_H51_var._position_relative, _HCS_Al_H51_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 252) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_H51_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_H51_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_H51 [252] */
    /* begin component H51_S2_Out=Monitor_nD() [253] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H51_S2_Out_var._rotation_is_identity) {
        if(!_H51_S2_Out_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H51_S2_Out_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H51_S2_Out_var._position_relative, _H51_S2_Out_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 253) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H51_S2_Out_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H51_S2_Out_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H51_S2_Out [253] */
    /* begin component H51_split_2=Monitor_nD() [254] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H51_split_2_var._rotation_is_identity) {
        if(!_H51_split_2_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H51_split_2_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H51_split_2_var._position_relative, _H51_split_2_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 254) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H51_split_2_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H51_split_2_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      if (SCATTERED) {/* conditional JUMP to H512_Start */
        _particle->_index=279;
        _particle->flag_nocoordschange=1; /* pass corrdinate transformations when jumping */
      }
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H51_split_2 [254] */
    /* begin component H51_split_1=Monitor_nD() [255] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H51_split_1_var._rotation_is_identity) {
        if(!_H51_split_1_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H51_split_1_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H51_split_1_var._position_relative, _H51_split_1_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 255) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H51_split_1_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H51_split_1_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      if (SCATTERED) {/* conditional JUMP to H511_Start */
        _particle->_index=255;
        _particle->flag_nocoordschange=1; /* pass corrdinate transformations when jumping */
      }
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H51_split_1 [255] */
    /* begin component H511_Start=Arm() [256] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H511_Start_var._rotation_is_identity) {
        if(!_H511_Start_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H511_Start_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H511_Start_var._position_relative, _H511_Start_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 256) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H511_Start_var._name);
      DEBUG_STATE();
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H511_Start [256] */
    /* begin component H511_mirror_centre=Arm() [257] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H511_mirror_centre_var._rotation_is_identity) {
        if(!_H511_mirror_centre_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H511_mirror_centre_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H511_mirror_centre_var._position_relative, _H511_mirror_centre_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 257) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H511_mirror_centre_var._name);
      DEBUG_STATE();
      class_Arm_trace(&_H511_mirror_centre_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H511_mirror_centre [257] */
    /* begin component IN15_polariser=Pol_mirror() [258] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_IN15_polariser_var._rotation_is_identity) {
        if(!_IN15_polariser_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _IN15_polariser_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_IN15_polariser_var._position_relative, _IN15_polariser_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 258) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_IN15_polariser_var._name);
      DEBUG_STATE();
      class_Pol_mirror_trace(&_IN15_polariser_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component IN15_polariser [258] */
    /* begin component H511_mirror_outdir=Arm() [259] */
    if (!ABSORBED && _particle->_index == 259) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle->_index++;
    } /* end component H511_mirror_outdir [259] */
    /* begin component H511_mirror_ReflectXY=Monitor_nD() [260] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H511_mirror_ReflectXY_var._rotation_is_identity) {
        if(!_H511_mirror_ReflectXY_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H511_mirror_ReflectXY_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H511_mirror_ReflectXY_var._position_relative, _H511_mirror_ReflectXY_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 260) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H511_mirror_ReflectXY_var._name);
      DEBUG_STATE();
      if ((flag == 1)) // conditional WHEN execution
      class_Monitor_nD_trace(&_H511_mirror_ReflectXY_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H511_mirror_ReflectXY [260] */
    /* begin component H511_mirror_TransmitXY=Monitor_nD() [261] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H511_mirror_TransmitXY_var._rotation_is_identity) {
        if(!_H511_mirror_TransmitXY_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H511_mirror_TransmitXY_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H511_mirror_TransmitXY_var._position_relative, _H511_mirror_TransmitXY_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 261) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H511_mirror_TransmitXY_var._name);
      DEBUG_STATE();
      if ((flag == 2)) // conditional WHEN execution
      class_Monitor_nD_trace(&_H511_mirror_TransmitXY_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H511_mirror_TransmitXY [261] */
    /* begin component H511_mirror_outdXY=Monitor_nD() [262] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H511_mirror_outdXY_var._rotation_is_identity) {
        if(!_H511_mirror_outdXY_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H511_mirror_outdXY_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H511_mirror_outdXY_var._position_relative, _H511_mirror_outdXY_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 262) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H511_mirror_outdXY_var._name);
      DEBUG_STATE();
      if ((flag == 1)) // conditional WHEN execution
      class_Monitor_nD_trace(&_H511_mirror_outdXY_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H511_mirror_outdXY [262] */
    /* begin component H511_S3=Guide_gravity() [263] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H511_S3_var._rotation_is_identity) {
        if(!_H511_S3_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H511_S3_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H511_S3_var._position_relative, _H511_S3_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 263) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H511_S3_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H511_S3_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H511_S3 [263] */
    /* begin component H511_S9=Guide_gravity() [264] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H511_S9_var._rotation_is_identity) {
        if(!_H511_S9_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H511_S9_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H511_S9_var._position_relative, _H511_S9_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 264) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H511_S9_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H511_S9_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H511_S9 [264] */
    /* begin component HCS_Al_265=PowderN() [265] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_265_var._rotation_is_identity) {
        if(!_HCS_Al_265_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_265_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_265_var._position_relative, _HCS_Al_265_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 265) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_265_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_265_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_265 [265] */
    /* begin component H511_VTE=Monitor_nD() [266] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H511_VTE_var._rotation_is_identity) {
        if(!_H511_VTE_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H511_VTE_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H511_VTE_var._position_relative, _H511_VTE_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 266) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H511_VTE_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H511_VTE_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H511_VTE [266] */
    /* begin component HCS_Al_267=PowderN() [267] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_267_var._rotation_is_identity) {
        if(!_HCS_Al_267_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_267_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_267_var._position_relative, _HCS_Al_267_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 267) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_267_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_267_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_267 [267] */
    /* begin component H511_S10=Guide_gravity() [268] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H511_S10_var._rotation_is_identity) {
        if(!_H511_S10_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H511_S10_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H511_S10_var._position_relative, _H511_S10_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 268) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H511_S10_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H511_S10_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H511_S10 [268] */
    /* begin component IN15_Vselector=V_selector() [269] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_IN15_Vselector_var._rotation_is_identity) {
        if(!_IN15_Vselector_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _IN15_Vselector_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_IN15_Vselector_var._position_relative, _IN15_Vselector_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 269) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_IN15_Vselector_var._name);
      DEBUG_STATE();
      class_V_selector_trace(&_IN15_Vselector_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component IN15_Vselector [269] */
    /* begin component H511_BeforeV=Guide_gravity() [270] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H511_BeforeV_var._rotation_is_identity) {
        if(!_H511_BeforeV_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H511_BeforeV_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H511_BeforeV_var._position_relative, _H511_BeforeV_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 270) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H511_BeforeV_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H511_BeforeV_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H511_BeforeV [270] */
    /* begin component IN15_Vpolariser=Pol_guide_vmirror() [271] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_IN15_Vpolariser_var._rotation_is_identity) {
        if(!_IN15_Vpolariser_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _IN15_Vpolariser_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_IN15_Vpolariser_var._position_relative, _IN15_Vpolariser_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 271) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_IN15_Vpolariser_var._name);
      DEBUG_STATE();
      class_Pol_guide_vmirror_trace(&_IN15_Vpolariser_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component IN15_Vpolariser [271] */
    /* begin component H511_AfterV=Guide_gravity() [272] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H511_AfterV_var._rotation_is_identity) {
        if(!_H511_AfterV_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H511_AfterV_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H511_AfterV_var._position_relative, _H511_AfterV_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 272) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H511_AfterV_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H511_AfterV_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H511_AfterV [272] */
    /* begin component H511_IN15_Sample_Div=Monitor_nD() [273] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H511_IN15_Sample_Div_var._rotation_is_identity) {
        if(!_H511_IN15_Sample_Div_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H511_IN15_Sample_Div_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H511_IN15_Sample_Div_var._position_relative, _H511_IN15_Sample_Div_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 273) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H511_IN15_Sample_Div_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H511_IN15_Sample_Div_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H511_IN15_Sample_Div [273] */
    /* begin component H511_IN15_Sample_XY=Monitor_nD() [274] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H511_IN15_Sample_XY_var._rotation_is_identity) {
        if(!_H511_IN15_Sample_XY_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H511_IN15_Sample_XY_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H511_IN15_Sample_XY_var._position_relative, _H511_IN15_Sample_XY_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 274) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H511_IN15_Sample_XY_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H511_IN15_Sample_XY_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H511_IN15_Sample_XY [274] */
    /* begin component H511_IN15_Sample_L=Monitor_nD() [275] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H511_IN15_Sample_L_var._rotation_is_identity) {
        if(!_H511_IN15_Sample_L_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H511_IN15_Sample_L_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H511_IN15_Sample_L_var._position_relative, _H511_IN15_Sample_L_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 275) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H511_IN15_Sample_L_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H511_IN15_Sample_L_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H511_IN15_Sample_L [275] */
    /* begin component H511_IN15_Sample=Incoherent() [276] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H511_IN15_Sample_var._rotation_is_identity) {
        if(!_H511_IN15_Sample_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H511_IN15_Sample_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H511_IN15_Sample_var._position_relative, _H511_IN15_Sample_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 276) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H511_IN15_Sample_var._name);
      DEBUG_STATE();
      class_Incoherent_trace(&_H511_IN15_Sample_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H511_IN15_Sample [276] */
    /* begin component H511_IN15_Detector=Monitor_nD() [277] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H511_IN15_Detector_var._rotation_is_identity) {
        if(!_H511_IN15_Detector_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H511_IN15_Detector_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H511_IN15_Detector_var._position_relative, _H511_IN15_Detector_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 277) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H511_IN15_Detector_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H511_IN15_Detector_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H511_IN15_Detector [277] */
    /* begin component H511_IN15_Spectrometer=Monitor_nD() [278] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H511_IN15_Spectrometer_var._rotation_is_identity) {
        if(!_H511_IN15_Spectrometer_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H511_IN15_Spectrometer_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H511_IN15_Spectrometer_var._position_relative, _H511_IN15_Spectrometer_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 278) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H511_IN15_Spectrometer_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H511_IN15_Spectrometer_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H511_IN15_Spectrometer [278] */
    /* begin component H511_IN15_Diffractometer=Monitor_nD() [279] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H511_IN15_Diffractometer_var._rotation_is_identity) {
        if(!_H511_IN15_Diffractometer_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H511_IN15_Diffractometer_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H511_IN15_Diffractometer_var._position_relative, _H511_IN15_Diffractometer_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 279) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H511_IN15_Diffractometer_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H511_IN15_Diffractometer_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H511_IN15_Diffractometer [279] */
    /* begin component H512_Start=Arm() [280] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H512_Start_var._rotation_is_identity) {
        if(!_H512_Start_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H512_Start_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H512_Start_var._position_relative, _H512_Start_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 280) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H512_Start_var._name);
      DEBUG_STATE();
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H512_Start [280] */
    /* begin component H512_S36=Guide_gravity() [281] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H512_S36_var._rotation_is_identity) {
        if(!_H512_S36_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H512_S36_var._position_relative, _H512_S36_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 281) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H512_S36_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H512_S36_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H512_S36 [281] */
    /* begin component H512_S36_282=Guide_gravity() [282] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H512_S36_282_var._rotation_is_identity) {
        if(!_H512_S36_282_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_282_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H512_S36_282_var._position_relative, _H512_S36_282_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 282) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H512_S36_282_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H512_S36_282_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H512_S36_282 [282] */
    /* begin component H512_S36_283=Guide_gravity() [283] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H512_S36_283_var._rotation_is_identity) {
        if(!_H512_S36_283_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_283_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H512_S36_283_var._position_relative, _H512_S36_283_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 283) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H512_S36_283_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H512_S36_283_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H512_S36_283 [283] */
    /* begin component H512_S36_284=Guide_gravity() [284] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H512_S36_284_var._rotation_is_identity) {
        if(!_H512_S36_284_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_284_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H512_S36_284_var._position_relative, _H512_S36_284_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 284) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H512_S36_284_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H512_S36_284_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H512_S36_284 [284] */
    /* begin component H512_S36_285=Guide_gravity() [285] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H512_S36_285_var._rotation_is_identity) {
        if(!_H512_S36_285_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_285_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H512_S36_285_var._position_relative, _H512_S36_285_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 285) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H512_S36_285_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H512_S36_285_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H512_S36_285 [285] */
    /* begin component H512_S36_286=Guide_gravity() [286] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H512_S36_286_var._rotation_is_identity) {
        if(!_H512_S36_286_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_286_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H512_S36_286_var._position_relative, _H512_S36_286_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 286) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H512_S36_286_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H512_S36_286_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H512_S36_286 [286] */
    /* begin component H512_S36_287=Guide_gravity() [287] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H512_S36_287_var._rotation_is_identity) {
        if(!_H512_S36_287_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_287_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H512_S36_287_var._position_relative, _H512_S36_287_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 287) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H512_S36_287_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H512_S36_287_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H512_S36_287 [287] */
    /* begin component H512_S36_288=Guide_gravity() [288] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H512_S36_288_var._rotation_is_identity) {
        if(!_H512_S36_288_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_288_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H512_S36_288_var._position_relative, _H512_S36_288_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 288) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H512_S36_288_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H512_S36_288_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H512_S36_288 [288] */
    /* begin component H512_S36_289=Guide_gravity() [289] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H512_S36_289_var._rotation_is_identity) {
        if(!_H512_S36_289_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_289_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H512_S36_289_var._position_relative, _H512_S36_289_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 289) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H512_S36_289_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H512_S36_289_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H512_S36_289 [289] */
    /* begin component H512_S36_290=Guide_gravity() [290] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H512_S36_290_var._rotation_is_identity) {
        if(!_H512_S36_290_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_290_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H512_S36_290_var._position_relative, _H512_S36_290_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 290) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H512_S36_290_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H512_S36_290_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H512_S36_290 [290] */
    /* begin component H512_S36_291=Guide_gravity() [291] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H512_S36_291_var._rotation_is_identity) {
        if(!_H512_S36_291_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_291_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H512_S36_291_var._position_relative, _H512_S36_291_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 291) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H512_S36_291_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H512_S36_291_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H512_S36_291 [291] */
    /* begin component H512_S36_292=Guide_gravity() [292] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H512_S36_292_var._rotation_is_identity) {
        if(!_H512_S36_292_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_292_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H512_S36_292_var._position_relative, _H512_S36_292_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 292) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H512_S36_292_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H512_S36_292_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H512_S36_292 [292] */
    /* begin component H512_S36_293=Guide_gravity() [293] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H512_S36_293_var._rotation_is_identity) {
        if(!_H512_S36_293_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_293_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H512_S36_293_var._position_relative, _H512_S36_293_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 293) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H512_S36_293_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H512_S36_293_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H512_S36_293 [293] */
    /* begin component H512_S36_294=Guide_gravity() [294] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H512_S36_294_var._rotation_is_identity) {
        if(!_H512_S36_294_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_294_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H512_S36_294_var._position_relative, _H512_S36_294_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 294) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H512_S36_294_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H512_S36_294_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H512_S36_294 [294] */
    /* begin component H512_S36_295=Guide_gravity() [295] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H512_S36_295_var._rotation_is_identity) {
        if(!_H512_S36_295_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_295_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H512_S36_295_var._position_relative, _H512_S36_295_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 295) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H512_S36_295_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H512_S36_295_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H512_S36_295 [295] */
    /* begin component H512_S36_296=Guide_gravity() [296] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H512_S36_296_var._rotation_is_identity) {
        if(!_H512_S36_296_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_296_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H512_S36_296_var._position_relative, _H512_S36_296_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 296) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H512_S36_296_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H512_S36_296_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H512_S36_296 [296] */
    /* begin component HCS_Al_H512=PowderN() [297] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_H512_var._rotation_is_identity) {
        if(!_HCS_Al_H512_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_H512_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_H512_var._position_relative, _HCS_Al_H512_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 297) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_H512_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_H512_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_H512 [297] */
    /* begin component H512_VTE=Monitor_nD() [298] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H512_VTE_var._rotation_is_identity) {
        if(!_H512_VTE_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H512_VTE_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H512_VTE_var._position_relative, _H512_VTE_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 298) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H512_VTE_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H512_VTE_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H512_VTE [298] */
    /* begin component HCS_Al_299=PowderN() [299] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_299_var._rotation_is_identity) {
        if(!_HCS_Al_299_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_299_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_299_var._position_relative, _HCS_Al_299_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 299) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_299_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_299_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_299 [299] */
    /* begin component H51_S78=Guide_gravity() [300] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H51_S78_var._rotation_is_identity) {
        if(!_H51_S78_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H51_S78_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H51_S78_var._position_relative, _H51_S78_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 300) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H51_S78_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H51_S78_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H51_S78 [300] */
    /* begin component H51_S78_301=Guide_gravity() [301] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H51_S78_301_var._rotation_is_identity) {
        if(!_H51_S78_301_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H51_S78_301_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H51_S78_301_var._position_relative, _H51_S78_301_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 301) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H51_S78_301_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H51_S78_301_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H51_S78_301 [301] */
    /* begin component H51_S78_302=Guide_gravity() [302] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H51_S78_302_var._rotation_is_identity) {
        if(!_H51_S78_302_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H51_S78_302_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H51_S78_302_var._position_relative, _H51_S78_302_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 302) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H51_S78_302_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H51_S78_302_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H51_S78_302 [302] */
    /* begin component H51_S78_303=Guide_gravity() [303] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H51_S78_303_var._rotation_is_identity) {
        if(!_H51_S78_303_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H51_S78_303_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H51_S78_303_var._position_relative, _H51_S78_303_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 303) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H51_S78_303_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H51_S78_303_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H51_S78_303 [303] */
    /* begin component HCS_Al_304=PowderN() [304] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_304_var._rotation_is_identity) {
        if(!_HCS_Al_304_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_304_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_304_var._position_relative, _HCS_Al_304_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 304) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_304_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_304_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_304 [304] */
    /* begin component H512_S11=Guide_gravity() [305] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H512_S11_var._rotation_is_identity) {
        if(!_H512_S11_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H512_S11_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H512_S11_var._position_relative, _H512_S11_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 305) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H512_S11_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_H512_S11_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H512_S11 [305] */
    /* begin component HCS_Al_306=PowderN() [306] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_HCS_Al_306_var._rotation_is_identity) {
        if(!_HCS_Al_306_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_306_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_HCS_Al_306_var._position_relative, _HCS_Al_306_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 306) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_HCS_Al_306_var._name);
      DEBUG_STATE();
      class_PowderN_trace(&_HCS_Al_306_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component HCS_Al_306 [306] */
    /* begin component D22_PreV=Monitor_nD() [307] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_D22_PreV_var._rotation_is_identity) {
        if(!_D22_PreV_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _D22_PreV_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_D22_PreV_var._position_relative, _D22_PreV_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 307) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_D22_PreV_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_D22_PreV_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component D22_PreV [307] */
    /* begin component D22_Vselector=V_selector() [308] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_D22_Vselector_var._rotation_is_identity) {
        if(!_D22_Vselector_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _D22_Vselector_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_D22_Vselector_var._position_relative, _D22_Vselector_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 308) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_D22_Vselector_var._name);
      DEBUG_STATE();
      class_V_selector_trace(&_D22_Vselector_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component D22_Vselector [308] */
    /* begin component D22_Collimation=Guide_gravity() [309] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_D22_Collimation_var._rotation_is_identity) {
        if(!_D22_Collimation_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _D22_Collimation_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_D22_Collimation_var._position_relative, _D22_Collimation_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 309) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_D22_Collimation_var._name);
      DEBUG_STATE();
      class_Guide_gravity_trace(&_D22_Collimation_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component D22_Collimation [309] */
    /* begin component D22_Sample_Pos=Arm() [310] */
    if (!ABSORBED && _particle->_index == 310) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle->_index++;
    } /* end component D22_Sample_Pos [310] */
    /* begin component H51_D22_Sample_Div=Monitor_nD() [311] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H51_D22_Sample_Div_var._rotation_is_identity) {
        if(!_H51_D22_Sample_Div_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H51_D22_Sample_Div_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H51_D22_Sample_Div_var._position_relative, _H51_D22_Sample_Div_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 311) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H51_D22_Sample_Div_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H51_D22_Sample_Div_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H51_D22_Sample_Div [311] */
    /* begin component H51_D22_Sample_XY=Monitor_nD() [312] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H51_D22_Sample_XY_var._rotation_is_identity) {
        if(!_H51_D22_Sample_XY_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H51_D22_Sample_XY_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H51_D22_Sample_XY_var._position_relative, _H51_D22_Sample_XY_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 312) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H51_D22_Sample_XY_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H51_D22_Sample_XY_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H51_D22_Sample_XY [312] */
    /* begin component H51_D22_Sample_L=Monitor_nD() [313] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H51_D22_Sample_L_var._rotation_is_identity) {
        if(!_H51_D22_Sample_L_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H51_D22_Sample_L_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H51_D22_Sample_L_var._position_relative, _H51_D22_Sample_L_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 313) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H51_D22_Sample_L_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_H51_D22_Sample_L_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H51_D22_Sample_L [313] */
    /* begin component H51_D22_Sample=Isotropic_Sqw() [314] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H51_D22_Sample_var._rotation_is_identity) {
        if(!_H51_D22_Sample_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H51_D22_Sample_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H51_D22_Sample_var._position_relative, _H51_D22_Sample_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 314) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H51_D22_Sample_var._name);
      DEBUG_STATE();
      class_Isotropic_Sqw_trace(&_H51_D22_Sample_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H51_D22_Sample [314] */
    /* begin component D22_Detector=Monitor_nD() [315] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_D22_Detector_var._rotation_is_identity) {
        if(!_D22_Detector_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _D22_Detector_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_D22_Detector_var._position_relative, _D22_Detector_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 315) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_D22_Detector_var._name);
      DEBUG_STATE();
      class_Monitor_nD_trace(&_D22_Detector_var, _particle); /* contains EXTEND code */
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component D22_Detector [315] */
    /* begin component D22_Detector_vessel=Shape() [316] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_D22_Detector_vessel_var._rotation_is_identity) {
        if(!_D22_Detector_vessel_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _D22_Detector_vessel_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_D22_Detector_vessel_var._position_relative, _D22_Detector_vessel_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 316) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_D22_Detector_vessel_var._name);
      DEBUG_STATE();
      class_Shape_trace(&_D22_Detector_vessel_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component D22_Detector_vessel [316] */
    /* begin component BOG=Shape() [317] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_BOG_var._rotation_is_identity) {
        if(!_BOG_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _BOG_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_BOG_var._position_relative, _BOG_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 317) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_BOG_var._name);
      DEBUG_STATE();
      class_Shape_trace(&_BOG_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component BOG [317] */
    /* begin component H53_ThALES_Drum=Shape() [318] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H53_ThALES_Drum_var._rotation_is_identity) {
        if(!_H53_ThALES_Drum_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_Drum_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H53_ThALES_Drum_var._position_relative, _H53_ThALES_Drum_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 318) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H53_ThALES_Drum_var._name);
      DEBUG_STATE();
      class_Shape_trace(&_H53_ThALES_Drum_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H53_ThALES_Drum [318] */
    /* begin component H521_D16_Drum=Shape() [319] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_D16_Drum_var._rotation_is_identity) {
        if(!_H521_D16_Drum_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Drum_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_D16_Drum_var._position_relative, _H521_D16_Drum_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 319) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_D16_Drum_var._name);
      DEBUG_STATE();
      class_Shape_trace(&_H521_D16_Drum_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_D16_Drum [319] */
    /* begin component H521_SADAM_Drum=Shape() [320] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H521_SADAM_Drum_var._rotation_is_identity) {
        if(!_H521_SADAM_Drum_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H521_SADAM_Drum_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H521_SADAM_Drum_var._position_relative, _H521_SADAM_Drum_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 320) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H521_SADAM_Drum_var._name);
      DEBUG_STATE();
      class_Shape_trace(&_H521_SADAM_Drum_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H521_SADAM_Drum [320] */
    /* begin component Traversee=Shape() [321] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_Traversee_var._rotation_is_identity) {
        if(!_Traversee_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _Traversee_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_Traversee_var._position_relative, _Traversee_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 321) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_Traversee_var._name);
      DEBUG_STATE();
      class_Shape_trace(&_Traversee_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component Traversee [321] */
    /* begin component Core_Centre=Arm() [322] */
    if (!ABSORBED && _particle->_index == 322) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle->_index++;
    } /* end component Core_Centre [322] */
    /* begin component Core=Shape() [323] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_Core_var._rotation_is_identity) {
        if(!_Core_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _Core_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_Core_var._position_relative, _Core_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 323) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_Core_var._name);
      DEBUG_STATE();
      class_Shape_trace(&_Core_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component Core [323] */
    /* begin component D2O_Vessel=Shape() [324] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_D2O_Vessel_var._rotation_is_identity) {
        if(!_D2O_Vessel_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _D2O_Vessel_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_D2O_Vessel_var._position_relative, _D2O_Vessel_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 324) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_D2O_Vessel_var._name);
      DEBUG_STATE();
      class_Shape_trace(&_D2O_Vessel_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component D2O_Vessel [324] */
    /* begin component H2O_Vessel=Shape() [325] */
    if (!_particle->flag_nocoordschange) { // flag activated by JUMP to pass coords change
      if (_H2O_Vessel_var._rotation_is_identity) {
        if(!_H2O_Vessel_var._position_relative_is_zero) {
          coords_get(coords_add(coords_set(x,y,z), _H2O_Vessel_var._position_relative),&x, &y, &z);
        }
      } else {
          mccoordschange(_H2O_Vessel_var._position_relative, _H2O_Vessel_var._rotation_relative, _particle);
      }
    }
    if (!ABSORBED && _particle->_index == 325) {
      _particle->flag_nocoordschange=0; /* Reset if we came here from a JUMP */
      _particle_save = *_particle;
      DEBUG_COMP(_H2O_Vessel_var._name);
      DEBUG_STATE();
      class_Shape_trace(&_H2O_Vessel_var, _particle);
      if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
      _particle->_index++;
      if (!ABSORBED) { DEBUG_STATE(); }
    } /* end component H2O_Vessel [325] */
    if (_particle->_index > 325)
      ABSORBED++; /* absorbed when passed all components */
  } /* while !ABSORBED */

  DEBUG_LEAVE()
  particle_restore(_particle, &_particle_save);
  DEBUG_STATE()

  return(_particle->_index);
} /* raytrace */

/* loop to generate events and call raytrace() propagate them */
void raytrace_all(unsigned long long ncount, unsigned long seed) {

  /* CPU-loop */
  unsigned long long loops;
  loops = ceil((double)ncount/gpu_innerloop);
  /* if on GPU, printf has been globally nullified, re-enable here */
  #ifdef OPENACC
  #undef strlen
  #undef strcmp
  #undef exit
  #undef printf
  #undef sprintf
  #undef fprintf
  #endif

  #ifdef OPENACC
  if (ncount>gpu_innerloop) {
    printf("Defining %llu CPU loops around GPU kernel and adjusting ncount\n",loops);
    mcset_ncount(loops*gpu_innerloop);
  } else {
    #endif
    loops=1;
    gpu_innerloop = ncount;
    #ifdef OPENACC
  }
    #endif

  for (unsigned long long cloop=0; cloop<loops; cloop++) {
    #ifdef OPENACC
    if (loops>1) fprintf(stdout, "%d..", (int)cloop); fflush(stdout);
    #endif

    /* if on GPU, re-nullify printf */
     #ifdef OPENACC
     #undef strlen
     #undef strcmp
     #undef exit
     #undef printf
     #undef sprintf
     #undef fprintf
     #endif

    #pragma acc parallel loop num_gangs(numgangs) vector_length(vecsize)
    for (unsigned long pidx=0 ; pidx < gpu_innerloop ; pidx++) {
      _class_particle particleN = mcgenstate(); // initial particle
      _class_particle* _particle = &particleN;
      particleN._uid = pidx;
      #ifdef USE_MPI
      particleN._uid += mpi_node_rank * ncount; 
      #endif

      srandom(_hash((pidx+1)*(seed+1)));

      raytrace(_particle);
    } /* inner for */
    seed = seed+gpu_innerloop;
  } /* CPU for */
  /* if on GPU, printf has been globally nullified, re-enable here */
     #ifdef OPENACC
     #undef strlen
     #undef strcmp
     #undef exit
     #undef printf
     #undef sprintf
     #undef fprintf
     #endif
  MPI_MASTER(
  printf("*** TRACE end *** \n");
  );
} /* raytrace_all */

#endif //no-FUNNEL

#ifdef FUNNEL
// Alternative raytrace algorithm which iterates all particles through
// one component at the time, can remove absorbs from the next loop and
// switch between cpu/gpu.
void raytrace_all_funnel(unsigned long long ncount, unsigned long seed) {

  // set up outer (CPU) loop / particle batches
  unsigned long long loops;

  /* if on GPU, printf has been globally nullified, re-enable here */
   #ifdef OPENACC
   #undef strlen
   #undef strcmp
   #undef exit
   #undef printf
   #undef sprintf
   #undef fprintf
   #endif
printf("\nWARNING:\n --> JUMP found at COMPONENT 10, H53_origin\n");
printf(" --> JUMPS are not supported in FUNNEL mode and are ignored\n");
printf(" --> Your instrument may give different output with FUNNEL\n");
printf("\nWARNING:\n --> JUMP found at COMPONENT 11, H52_origin\n");
printf(" --> JUMPS are not supported in FUNNEL mode and are ignored\n");
printf(" --> Your instrument may give different output with FUNNEL\n");
printf("\nWARNING:\n --> JUMP found at COMPONENT 12, H51_origin\n");
printf(" --> JUMPS are not supported in FUNNEL mode and are ignored\n");
printf(" --> Your instrument may give different output with FUNNEL\n");
printf("\nWARNING:\n --> JUMP found at COMPONENT 26, H53_ThALES_Monochromator_Jumper\n");
printf(" --> JUMPS are not supported in FUNNEL mode and are ignored\n");
printf(" --> Your instrument may give different output with FUNNEL\n");
printf("\nWARNING:\n --> JUMP found at COMPONENT 66, H523_origin\n");
printf(" --> JUMPS are not supported in FUNNEL mode and are ignored\n");
printf(" --> Your instrument may give different output with FUNNEL\n");
printf("\nWARNING:\n --> JUMP found at COMPONENT 67, H521_origin\n");
printf(" --> JUMPS are not supported in FUNNEL mode and are ignored\n");
printf(" --> Your instrument may give different output with FUNNEL\n");
printf("\nWARNING:\n --> JUMP found at COMPONENT 68, H522_origin\n");
printf(" --> JUMPS are not supported in FUNNEL mode and are ignored\n");
printf(" --> Your instrument may give different output with FUNNEL\n");
printf("\nWARNING:\n --> JUMP found at COMPONENT 115, H521_D16_Monochromator_Jumper\n");
printf(" --> JUMPS are not supported in FUNNEL mode and are ignored\n");
printf(" --> Your instrument may give different output with FUNNEL\n");
printf("\nWARNING:\n --> JUMP found at COMPONENT 254, H51_split_2\n");
printf(" --> JUMPS are not supported in FUNNEL mode and are ignored\n");
printf(" --> Your instrument may give different output with FUNNEL\n");
printf("\nWARNING:\n --> JUMP found at COMPONENT 255, H51_split_1\n");
printf(" --> JUMPS are not supported in FUNNEL mode and are ignored\n");
printf(" --> Your instrument may give different output with FUNNEL\n");
  #ifdef OPENACC
  loops = ceil((double)ncount/gpu_innerloop);
  if (ncount>gpu_innerloop) {
    printf("Defining %llu CPU loops around kernel and adjusting ncount\n",loops);
    mcset_ncount(loops*gpu_innerloop);
  } else {
  #endif
    loops=1;
    gpu_innerloop = ncount;
  #ifdef OPENACC
  }
  #endif

  // create particles struct and pointer arrays (same memory used by all batches)
  _class_particle* particles = malloc(gpu_innerloop*sizeof(_class_particle));
  _class_particle* pbuffer = malloc(gpu_innerloop*sizeof(_class_particle));
  long livebatchsize = gpu_innerloop;

  #undef ABSORB0
  #undef ABSORB
  #define ABSORB0 do { DEBUG_ABSORB(); MAGNET_OFF; ABSORBED++; } while(0)
  #define ABSORB ABSORB0
  // outer loop / particle batches
  for (unsigned long long cloop=0; cloop<loops; cloop++) {
    if (loops>1) fprintf(stdout, "%d..", (int)cloop); fflush(stdout);

    // init particles
    #pragma acc parallel loop present(particles[0:livebatchsize])
    for (unsigned long pidx=0 ; pidx < livebatchsize ; pidx++) {
      // generate particle state, set loop index and seed
      particles[pidx] = mcgenstate();
      _class_particle* _particle = particles + pidx;
      _particle->_uid = pidx;
      #ifdef USE_MPI
      _particle->_uid += mpi_node_rank * ncount; 
      #endif
      srandom(_hash((pidx+1)*(seed+1))); // _particle->state usage built into srandom macro
    }

    // iterate components

    #pragma acc parallel loop present(particles[0:livebatchsize])
    for (unsigned long pidx=0 ; pidx < livebatchsize ; pidx++) {
      _class_particle* _particle = &particles[pidx];
      _class_particle _particle_save;

      // Origin
    if (!ABSORBED && _particle->_index == 1) {
#ifndef MULTICORE
        if (_Origin_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _Origin_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_Origin_var._position_relative, _Origin_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Progress_bar_trace(&_Origin_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS
    if (!ABSORBED && _particle->_index == 2) {
#ifndef MULTICORE
        if (_HCS_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_var._position_relative, _HCS_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Source_gen_trace(&_HCS_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al
    if (!ABSORBED && _particle->_index == 3) {
#ifndef MULTICORE
        if (_HCS_Al_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_var._position_relative, _HCS_Al_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_4
    if (!ABSORBED && _particle->_index == 4) {
#ifndef MULTICORE
        if (_HCS_Al_4_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_4_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_4_var._position_relative, _HCS_Al_4_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_4_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_5
    if (!ABSORBED && _particle->_index == 5) {
#ifndef MULTICORE
        if (_HCS_Al_5_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_5_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_5_var._position_relative, _HCS_Al_5_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_5_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_6
    if (!ABSORBED && _particle->_index == 6) {
#ifndef MULTICORE
        if (_HCS_Al_6_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_6_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_6_var._position_relative, _HCS_Al_6_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_6_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_7
    if (!ABSORBED && _particle->_index == 7) {
#ifndef MULTICORE
        if (_HCS_Al_7_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_7_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_7_var._position_relative, _HCS_Al_7_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_7_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H5
    if (!ABSORBED && _particle->_index == 8) {
#ifndef MULTICORE
        if (_H5_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H5_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H5_var._position_relative, _H5_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H5_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H5_rect
    if (!ABSORBED && _particle->_index == 9) {
#ifndef MULTICORE
        if (_H5_rect_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H5_rect_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H5_rect_var._position_relative, _H5_rect_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H5_rect_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H53_origin
    if (!ABSORBED && _particle->_index == 10) {
#ifndef MULTICORE
        if (_H53_origin_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H53_origin_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H53_origin_var._position_relative, _H53_origin_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H53_origin_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H52_origin
    if (!ABSORBED && _particle->_index == 11) {
#ifndef MULTICORE
        if (_H52_origin_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H52_origin_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H52_origin_var._position_relative, _H52_origin_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H52_origin_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H51_origin
    if (!ABSORBED && _particle->_index == 12) {
#ifndef MULTICORE
        if (_H51_origin_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H51_origin_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H51_origin_var._position_relative, _H51_origin_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H51_origin_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H53_start
    if (!ABSORBED && _particle->_index == 13) {
#ifndef MULTICORE
        if (_H53_start_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H53_start_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H53_start_var._position_relative, _H53_start_var._rotation_relative, _particle);
        _particle_save = *_particle;
        _particle->_index++;
      }

      // H53_inpile
    if (!ABSORBED && _particle->_index == 14) {
#ifndef MULTICORE
        if (_H53_inpile_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H53_inpile_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H53_inpile_var._position_relative, _H53_inpile_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H53_inpile_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H53_Al
    if (!ABSORBED && _particle->_index == 15) {
#ifndef MULTICORE
        if (_H53_Al_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H53_Al_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H53_Al_var._position_relative, _H53_Al_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_H53_Al_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H53_Obt
    if (!ABSORBED && _particle->_index == 16) {
#ifndef MULTICORE
        if (_H53_Obt_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H53_Obt_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H53_Obt_var._position_relative, _H53_Obt_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H53_Obt_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_17
    if (!ABSORBED && _particle->_index == 17) {
#ifndef MULTICORE
        if (_HCS_Al_17_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_17_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_17_var._position_relative, _HCS_Al_17_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_17_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H53_Obt_Out
    if (!ABSORBED && _particle->_index == 18) {
#ifndef MULTICORE
        if (_H53_Obt_Out_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H53_Obt_Out_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H53_Obt_Out_var._position_relative, _H53_Obt_Out_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H53_Obt_Out_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_19
    if (!ABSORBED && _particle->_index == 19) {
#ifndef MULTICORE
        if (_HCS_Al_19_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_19_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_19_var._position_relative, _HCS_Al_19_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_19_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H53_VSComC1
    if (!ABSORBED && _particle->_index == 20) {
#ifndef MULTICORE
        if (_H53_VSComC1_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H53_VSComC1_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H53_VSComC1_var._position_relative, _H53_VSComC1_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H53_VSComC1_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_21
    if (!ABSORBED && _particle->_index == 21) {
#ifndef MULTICORE
        if (_HCS_Al_21_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_21_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_21_var._position_relative, _HCS_Al_21_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_21_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H53_Nose
    if (!ABSORBED && _particle->_index == 22) {
#ifndef MULTICORE
        if (_H53_Nose_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H53_Nose_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H53_Nose_var._position_relative, _H53_Nose_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_tapering_trace(&_H53_Nose_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_23
    if (!ABSORBED && _particle->_index == 23) {
#ifndef MULTICORE
        if (_HCS_Al_23_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_23_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_23_var._position_relative, _HCS_Al_23_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_23_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H53_ThALES_Monochromator_Cradle
    if (!ABSORBED && _particle->_index == 24) {
#ifndef MULTICORE
        if (_H53_ThALES_Monochromator_Cradle_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_Monochromator_Cradle_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H53_ThALES_Monochromator_Cradle_var._position_relative, _H53_ThALES_Monochromator_Cradle_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H53_ThALES_Monochromator_Cradle_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H53_ThALES_Monochromator
    if (!ABSORBED && _particle->_index == 25) {
#ifndef MULTICORE
        if (_H53_ThALES_Monochromator_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_Monochromator_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H53_ThALES_Monochromator_var._position_relative, _H53_ThALES_Monochromator_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monochromator_curved_trace(&_H53_ThALES_Monochromator_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H53_ThALES_Monochromator_Jumper
    if (!ABSORBED && _particle->_index == 26) {
#ifndef MULTICORE
        if (_H53_ThALES_Monochromator_Jumper_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_Monochromator_Jumper_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H53_ThALES_Monochromator_Jumper_var._position_relative, _H53_ThALES_Monochromator_Jumper_var._rotation_relative, _particle);
        _particle_save = *_particle;
        _particle->_index++;
      }

      // H53_ThALES_Monochromator_Out
    if (!ABSORBED && _particle->_index == 27) {
        _particle->_index++;
      }

      // H53_ThALES_Sample_Div
    if (!ABSORBED && _particle->_index == 28) {
#ifndef MULTICORE
        if (_H53_ThALES_Sample_Div_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_Sample_Div_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H53_ThALES_Sample_Div_var._position_relative, _H53_ThALES_Sample_Div_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H53_ThALES_Sample_Div_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H53_ThALES_Sample_XY
    if (!ABSORBED && _particle->_index == 29) {
#ifndef MULTICORE
        if (_H53_ThALES_Sample_XY_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_Sample_XY_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H53_ThALES_Sample_XY_var._position_relative, _H53_ThALES_Sample_XY_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H53_ThALES_Sample_XY_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H53_ThALES_Sample_L
    if (!ABSORBED && _particle->_index == 30) {
#ifndef MULTICORE
        if (_H53_ThALES_Sample_L_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_Sample_L_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H53_ThALES_Sample_L_var._position_relative, _H53_ThALES_Sample_L_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H53_ThALES_Sample_L_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H53_ThALES_Sample
    if (!ABSORBED && _particle->_index == 31) {
#ifndef MULTICORE
        if (_H53_ThALES_Sample_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_Sample_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H53_ThALES_Sample_var._position_relative, _H53_ThALES_Sample_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Isotropic_Sqw_trace(&_H53_ThALES_Sample_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H53_ThALES_Spectrometer
    if (!ABSORBED && _particle->_index == 32) {
#ifndef MULTICORE
        if (_H53_ThALES_Spectrometer_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_Spectrometer_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H53_ThALES_Spectrometer_var._position_relative, _H53_ThALES_Spectrometer_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H53_ThALES_Spectrometer_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H53_ThALES_Diffractometer
    if (!ABSORBED && _particle->_index == 33) {
#ifndef MULTICORE
        if (_H53_ThALES_Diffractometer_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_Diffractometer_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H53_ThALES_Diffractometer_var._position_relative, _H53_ThALES_Diffractometer_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H53_ThALES_Diffractometer_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // Sample_Out
    if (!ABSORBED && _particle->_index == 34) {
        _particle->_index++;
      }

      // SC3
    if (!ABSORBED && _particle->_index == 35) {
#ifndef MULTICORE
        if (_SC3_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _SC3_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_SC3_var._position_relative, _SC3_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Collimator_linear_trace(&_SC3_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // Ana_Cradle
    if (!ABSORBED && _particle->_index == 36) {
        _particle->_index++;
      }

      // PG2Xtal
    if (!ABSORBED && _particle->_index == 37) {
#ifndef MULTICORE
        if (_PG2Xtal_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _PG2Xtal_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_PG2Xtal_var._position_relative, _PG2Xtal_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monochromator_curved_trace(&_PG2Xtal_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // Ana_Out
    if (!ABSORBED && _particle->_index == 38) {
        _particle->_index++;
      }

      // SC4
    if (!ABSORBED && _particle->_index == 39) {
#ifndef MULTICORE
        if (_SC4_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _SC4_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_SC4_var._position_relative, _SC4_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Collimator_linear_trace(&_SC4_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // He3H
    if (!ABSORBED && _particle->_index == 40) {
#ifndef MULTICORE
        if (_He3H_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _He3H_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_He3H_var._position_relative, _He3H_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_trace(&_He3H_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H53_ThALES_Transmit
    if (!ABSORBED && _particle->_index == 41) {
#ifndef MULTICORE
        if (_H53_ThALES_Transmit_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_Transmit_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H53_ThALES_Transmit_var._position_relative, _H53_ThALES_Transmit_var._rotation_relative, _particle);
        _particle_save = *_particle;
        _particle->_index++;
      }

      // H53_ThALES_TransmitXY
    if (!ABSORBED && _particle->_index == 42) {
#ifndef MULTICORE
        if (_H53_ThALES_TransmitXY_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_TransmitXY_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H53_ThALES_TransmitXY_var._position_relative, _H53_ThALES_TransmitXY_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H53_ThALES_TransmitXY_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H52_start
    if (!ABSORBED && _particle->_index == 43) {
#ifndef MULTICORE
        if (_H52_start_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H52_start_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H52_start_var._position_relative, _H52_start_var._rotation_relative, _particle);
        _particle_save = *_particle;
        _particle->_index++;
      }

      // H52_inpile
    if (!ABSORBED && _particle->_index == 44) {
#ifndef MULTICORE
        if (_H52_inpile_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H52_inpile_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H52_inpile_var._position_relative, _H52_inpile_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H52_inpile_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H52_Common
    if (!ABSORBED && _particle->_index == 45) {
#ifndef MULTICORE
        if (_H52_Common_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H52_Common_var._position_relative, _H52_Common_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H52_Common_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H52_Common_46
    if (!ABSORBED && _particle->_index == 46) {
#ifndef MULTICORE
        if (_H52_Common_46_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_46_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H52_Common_46_var._position_relative, _H52_Common_46_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H52_Common_46_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H52_Common_3
    if (!ABSORBED && _particle->_index == 47) {
#ifndef MULTICORE
        if (_H52_Common_3_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_3_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H52_Common_3_var._position_relative, _H52_Common_3_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H52_Common_3_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_48
    if (!ABSORBED && _particle->_index == 48) {
#ifndef MULTICORE
        if (_HCS_Al_48_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_48_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_48_var._position_relative, _HCS_Al_48_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_48_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H52_Obt_Out
    if (!ABSORBED && _particle->_index == 49) {
#ifndef MULTICORE
        if (_H52_Obt_Out_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H52_Obt_Out_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H52_Obt_Out_var._position_relative, _H52_Obt_Out_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H52_Obt_Out_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_50
    if (!ABSORBED && _particle->_index == 50) {
#ifndef MULTICORE
        if (_HCS_Al_50_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_50_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_50_var._position_relative, _HCS_Al_50_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_50_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H52_Common_51
    if (!ABSORBED && _particle->_index == 51) {
#ifndef MULTICORE
        if (_H52_Common_51_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_51_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H52_Common_51_var._position_relative, _H52_Common_51_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H52_Common_51_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H52_Common_52
    if (!ABSORBED && _particle->_index == 52) {
#ifndef MULTICORE
        if (_H52_Common_52_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_52_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H52_Common_52_var._position_relative, _H52_Common_52_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H52_Common_52_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H52_Common_53
    if (!ABSORBED && _particle->_index == 53) {
#ifndef MULTICORE
        if (_H52_Common_53_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_53_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H52_Common_53_var._position_relative, _H52_Common_53_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H52_Common_53_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H52_Common_54
    if (!ABSORBED && _particle->_index == 54) {
#ifndef MULTICORE
        if (_H52_Common_54_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_54_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H52_Common_54_var._position_relative, _H52_Common_54_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H52_Common_54_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H52_Common_55
    if (!ABSORBED && _particle->_index == 55) {
#ifndef MULTICORE
        if (_H52_Common_55_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_55_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H52_Common_55_var._position_relative, _H52_Common_55_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H52_Common_55_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H52_Common_56
    if (!ABSORBED && _particle->_index == 56) {
#ifndef MULTICORE
        if (_H52_Common_56_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_56_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H52_Common_56_var._position_relative, _H52_Common_56_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H52_Common_56_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H52_Common_57
    if (!ABSORBED && _particle->_index == 57) {
#ifndef MULTICORE
        if (_H52_Common_57_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_57_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H52_Common_57_var._position_relative, _H52_Common_57_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H52_Common_57_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H52_Common_58
    if (!ABSORBED && _particle->_index == 58) {
#ifndef MULTICORE
        if (_H52_Common_58_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_58_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H52_Common_58_var._position_relative, _H52_Common_58_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H52_Common_58_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H52_Common_59
    if (!ABSORBED && _particle->_index == 59) {
#ifndef MULTICORE
        if (_H52_Common_59_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_59_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H52_Common_59_var._position_relative, _H52_Common_59_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H52_Common_59_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H52_Common_60
    if (!ABSORBED && _particle->_index == 60) {
#ifndef MULTICORE
        if (_H52_Common_60_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_60_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H52_Common_60_var._position_relative, _H52_Common_60_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H52_Common_60_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H52_Common_61
    if (!ABSORBED && _particle->_index == 61) {
#ifndef MULTICORE
        if (_H52_Common_61_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_61_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H52_Common_61_var._position_relative, _H52_Common_61_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H52_Common_61_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H52_Common_62
    if (!ABSORBED && _particle->_index == 62) {
#ifndef MULTICORE
        if (_H52_Common_62_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_62_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H52_Common_62_var._position_relative, _H52_Common_62_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H52_Common_62_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H52_Common_63
    if (!ABSORBED && _particle->_index == 63) {
#ifndef MULTICORE
        if (_H52_Common_63_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_63_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H52_Common_63_var._position_relative, _H52_Common_63_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H52_Common_63_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_64
    if (!ABSORBED && _particle->_index == 64) {
#ifndef MULTICORE
        if (_HCS_Al_64_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_64_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_64_var._position_relative, _HCS_Al_64_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_64_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H52_Common_Out
    if (!ABSORBED && _particle->_index == 65) {
#ifndef MULTICORE
        if (_H52_Common_Out_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H52_Common_Out_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H52_Common_Out_var._position_relative, _H52_Common_Out_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H52_Common_Out_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_origin
    if (!ABSORBED && _particle->_index == 66) {
#ifndef MULTICORE
        if (_H523_origin_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_origin_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_origin_var._position_relative, _H523_origin_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H523_origin_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_origin
    if (!ABSORBED && _particle->_index == 67) {
#ifndef MULTICORE
        if (_H521_origin_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_origin_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_origin_var._position_relative, _H521_origin_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H521_origin_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_origin
    if (!ABSORBED && _particle->_index == 68) {
#ifndef MULTICORE
        if (_H522_origin_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_origin_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_origin_var._position_relative, _H522_origin_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H522_origin_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_start
    if (!ABSORBED && _particle->_index == 69) {
#ifndef MULTICORE
        if (_H521_start_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_start_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_start_var._position_relative, _H521_start_var._rotation_relative, _particle);
        _particle_save = *_particle;
        _particle->_index++;
      }

      // H521_Curved
    if (!ABSORBED && _particle->_index == 70) {
#ifndef MULTICORE
        if (_H521_Curved_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_var._position_relative, _H521_Curved_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_71
    if (!ABSORBED && _particle->_index == 71) {
#ifndef MULTICORE
        if (_H521_Curved_71_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_71_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_71_var._position_relative, _H521_Curved_71_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_71_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_72
    if (!ABSORBED && _particle->_index == 72) {
#ifndef MULTICORE
        if (_H521_Curved_72_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_72_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_72_var._position_relative, _H521_Curved_72_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_72_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_73
    if (!ABSORBED && _particle->_index == 73) {
#ifndef MULTICORE
        if (_H521_Curved_73_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_73_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_73_var._position_relative, _H521_Curved_73_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_73_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_74
    if (!ABSORBED && _particle->_index == 74) {
#ifndef MULTICORE
        if (_H521_Curved_74_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_74_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_74_var._position_relative, _H521_Curved_74_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_74_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_75
    if (!ABSORBED && _particle->_index == 75) {
#ifndef MULTICORE
        if (_H521_Curved_75_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_75_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_75_var._position_relative, _H521_Curved_75_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_75_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_76
    if (!ABSORBED && _particle->_index == 76) {
#ifndef MULTICORE
        if (_H521_Curved_76_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_76_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_76_var._position_relative, _H521_Curved_76_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_76_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_77
    if (!ABSORBED && _particle->_index == 77) {
#ifndef MULTICORE
        if (_H521_Curved_77_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_77_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_77_var._position_relative, _H521_Curved_77_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_77_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_78
    if (!ABSORBED && _particle->_index == 78) {
#ifndef MULTICORE
        if (_H521_Curved_78_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_78_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_78_var._position_relative, _H521_Curved_78_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_78_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_79
    if (!ABSORBED && _particle->_index == 79) {
#ifndef MULTICORE
        if (_H521_Curved_79_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_79_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_79_var._position_relative, _H521_Curved_79_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_79_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_80
    if (!ABSORBED && _particle->_index == 80) {
#ifndef MULTICORE
        if (_H521_Curved_80_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_80_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_80_var._position_relative, _H521_Curved_80_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_80_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_preVTE
    if (!ABSORBED && _particle->_index == 81) {
#ifndef MULTICORE
        if (_H521_Curved_preVTE_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_preVTE_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_preVTE_var._position_relative, _H521_Curved_preVTE_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_preVTE_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_82
    if (!ABSORBED && _particle->_index == 82) {
#ifndef MULTICORE
        if (_HCS_Al_82_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_82_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_82_var._position_relative, _HCS_Al_82_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_82_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_VTE
    if (!ABSORBED && _particle->_index == 83) {
#ifndef MULTICORE
        if (_H521_VTE_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_VTE_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_VTE_var._position_relative, _H521_VTE_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H521_VTE_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_84
    if (!ABSORBED && _particle->_index == 84) {
#ifndef MULTICORE
        if (_HCS_Al_84_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_84_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_84_var._position_relative, _HCS_Al_84_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_84_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_85
    if (!ABSORBED && _particle->_index == 85) {
#ifndef MULTICORE
        if (_H521_Curved_85_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_85_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_85_var._position_relative, _H521_Curved_85_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_85_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_86
    if (!ABSORBED && _particle->_index == 86) {
#ifndef MULTICORE
        if (_H521_Curved_86_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_86_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_86_var._position_relative, _H521_Curved_86_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_86_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_87
    if (!ABSORBED && _particle->_index == 87) {
#ifndef MULTICORE
        if (_H521_Curved_87_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_87_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_87_var._position_relative, _H521_Curved_87_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_87_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_88
    if (!ABSORBED && _particle->_index == 88) {
#ifndef MULTICORE
        if (_H521_Curved_88_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_88_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_88_var._position_relative, _H521_Curved_88_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_88_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_89
    if (!ABSORBED && _particle->_index == 89) {
#ifndef MULTICORE
        if (_H521_Curved_89_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_89_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_89_var._position_relative, _H521_Curved_89_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_89_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_90
    if (!ABSORBED && _particle->_index == 90) {
#ifndef MULTICORE
        if (_H521_Curved_90_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_90_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_90_var._position_relative, _H521_Curved_90_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_90_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_91
    if (!ABSORBED && _particle->_index == 91) {
#ifndef MULTICORE
        if (_H521_Curved_91_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_91_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_91_var._position_relative, _H521_Curved_91_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_91_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_92
    if (!ABSORBED && _particle->_index == 92) {
#ifndef MULTICORE
        if (_H521_Curved_92_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_92_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_92_var._position_relative, _H521_Curved_92_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_92_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_93
    if (!ABSORBED && _particle->_index == 93) {
#ifndef MULTICORE
        if (_H521_Curved_93_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_93_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_93_var._position_relative, _H521_Curved_93_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_93_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_94
    if (!ABSORBED && _particle->_index == 94) {
#ifndef MULTICORE
        if (_H521_Curved_94_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_94_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_94_var._position_relative, _H521_Curved_94_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_94_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_95
    if (!ABSORBED && _particle->_index == 95) {
#ifndef MULTICORE
        if (_H521_Curved_95_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_95_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_95_var._position_relative, _H521_Curved_95_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_95_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_96
    if (!ABSORBED && _particle->_index == 96) {
#ifndef MULTICORE
        if (_H521_Curved_96_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_96_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_96_var._position_relative, _H521_Curved_96_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_96_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_97
    if (!ABSORBED && _particle->_index == 97) {
#ifndef MULTICORE
        if (_H521_Curved_97_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_97_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_97_var._position_relative, _H521_Curved_97_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_97_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_98
    if (!ABSORBED && _particle->_index == 98) {
#ifndef MULTICORE
        if (_H521_Curved_98_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_98_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_98_var._position_relative, _H521_Curved_98_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_98_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_99
    if (!ABSORBED && _particle->_index == 99) {
#ifndef MULTICORE
        if (_H521_Curved_99_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_99_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_99_var._position_relative, _H521_Curved_99_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_99_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_100
    if (!ABSORBED && _particle->_index == 100) {
#ifndef MULTICORE
        if (_H521_Curved_100_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_100_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_100_var._position_relative, _H521_Curved_100_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_100_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_101
    if (!ABSORBED && _particle->_index == 101) {
#ifndef MULTICORE
        if (_H521_Curved_101_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_101_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_101_var._position_relative, _H521_Curved_101_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_101_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_102
    if (!ABSORBED && _particle->_index == 102) {
#ifndef MULTICORE
        if (_H521_Curved_102_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_102_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_102_var._position_relative, _H521_Curved_102_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_102_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_103
    if (!ABSORBED && _particle->_index == 103) {
#ifndef MULTICORE
        if (_H521_Curved_103_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_103_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_103_var._position_relative, _H521_Curved_103_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_103_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_104
    if (!ABSORBED && _particle->_index == 104) {
#ifndef MULTICORE
        if (_H521_Curved_104_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_104_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_104_var._position_relative, _H521_Curved_104_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_104_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_105
    if (!ABSORBED && _particle->_index == 105) {
#ifndef MULTICORE
        if (_H521_Curved_105_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_105_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_105_var._position_relative, _H521_Curved_105_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_105_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_106
    if (!ABSORBED && _particle->_index == 106) {
#ifndef MULTICORE
        if (_H521_Curved_106_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_106_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_106_var._position_relative, _H521_Curved_106_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_106_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_107
    if (!ABSORBED && _particle->_index == 107) {
#ifndef MULTICORE
        if (_H521_Curved_107_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_107_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_107_var._position_relative, _H521_Curved_107_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Curved_107_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_108
    if (!ABSORBED && _particle->_index == 108) {
#ifndef MULTICORE
        if (_HCS_Al_108_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_108_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_108_var._position_relative, _HCS_Al_108_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_108_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Curved_Out
    if (!ABSORBED && _particle->_index == 109) {
#ifndef MULTICORE
        if (_H521_Curved_Out_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Curved_Out_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Curved_Out_var._position_relative, _H521_Curved_Out_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H521_Curved_Out_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Straight
    if (!ABSORBED && _particle->_index == 110) {
#ifndef MULTICORE
        if (_H521_Straight_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Straight_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Straight_var._position_relative, _H521_Straight_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_Straight_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_Straight_Out
    if (!ABSORBED && _particle->_index == 111) {
#ifndef MULTICORE
        if (_H521_Straight_Out_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_Straight_Out_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_Straight_Out_var._position_relative, _H521_Straight_Out_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H521_Straight_Out_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_112
    if (!ABSORBED && _particle->_index == 112) {
#ifndef MULTICORE
        if (_HCS_Al_112_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_112_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_112_var._position_relative, _HCS_Al_112_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_112_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_D16_Monochromator_Cradle
    if (!ABSORBED && _particle->_index == 113) {
#ifndef MULTICORE
        if (_H521_D16_Monochromator_Cradle_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Monochromator_Cradle_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_D16_Monochromator_Cradle_var._position_relative, _H521_D16_Monochromator_Cradle_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H521_D16_Monochromator_Cradle_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_D16_Monochromator
    if (!ABSORBED && _particle->_index == 114) {
#ifndef MULTICORE
        if (_H521_D16_Monochromator_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Monochromator_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_D16_Monochromator_var._position_relative, _H521_D16_Monochromator_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monochromator_curved_trace(&_H521_D16_Monochromator_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_D16_Monochromator_Jumper
    if (!ABSORBED && _particle->_index == 115) {
#ifndef MULTICORE
        if (_H521_D16_Monochromator_Jumper_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Monochromator_Jumper_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_D16_Monochromator_Jumper_var._position_relative, _H521_D16_Monochromator_Jumper_var._rotation_relative, _particle);
        _particle_save = *_particle;
        _particle->_index++;
      }

      // H521_D16_Monochromator_Out
    if (!ABSORBED && _particle->_index == 116) {
        _particle->_index++;
      }

      // H521_D16_Sample_Div
    if (!ABSORBED && _particle->_index == 117) {
#ifndef MULTICORE
        if (_H521_D16_Sample_Div_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Sample_Div_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_D16_Sample_Div_var._position_relative, _H521_D16_Sample_Div_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H521_D16_Sample_Div_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_D16_Sample_XY
    if (!ABSORBED && _particle->_index == 118) {
#ifndef MULTICORE
        if (_H521_D16_Sample_XY_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Sample_XY_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_D16_Sample_XY_var._position_relative, _H521_D16_Sample_XY_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H521_D16_Sample_XY_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_D16_Sample_L
    if (!ABSORBED && _particle->_index == 119) {
#ifndef MULTICORE
        if (_H521_D16_Sample_L_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Sample_L_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_D16_Sample_L_var._position_relative, _H521_D16_Sample_L_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H521_D16_Sample_L_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_D16_Sample
    if (!ABSORBED && _particle->_index == 120) {
#ifndef MULTICORE
        if (_H521_D16_Sample_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Sample_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_D16_Sample_var._position_relative, _H521_D16_Sample_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Isotropic_Sqw_trace(&_H521_D16_Sample_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_D16_Detector
    if (!ABSORBED && _particle->_index == 121) {
#ifndef MULTICORE
        if (_H521_D16_Detector_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Detector_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_D16_Detector_var._position_relative, _H521_D16_Detector_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H521_D16_Detector_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_D16_Spectrometer
    if (!ABSORBED && _particle->_index == 122) {
#ifndef MULTICORE
        if (_H521_D16_Spectrometer_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Spectrometer_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_D16_Spectrometer_var._position_relative, _H521_D16_Spectrometer_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H521_D16_Spectrometer_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_D16_Diffractometer
    if (!ABSORBED && _particle->_index == 123) {
#ifndef MULTICORE
        if (_H521_D16_Diffractometer_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Diffractometer_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_D16_Diffractometer_var._position_relative, _H521_D16_Diffractometer_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H521_D16_Diffractometer_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_D16_Transmit
    if (!ABSORBED && _particle->_index == 124) {
#ifndef MULTICORE
        if (_H521_D16_Transmit_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Transmit_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_D16_Transmit_var._position_relative, _H521_D16_Transmit_var._rotation_relative, _particle);
        _particle_save = *_particle;
        _particle->_index++;
      }

      // HCS_Al_125
    if (!ABSORBED && _particle->_index == 125) {
#ifndef MULTICORE
        if (_HCS_Al_125_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_125_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_125_var._position_relative, _HCS_Al_125_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_125_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_P6_Start
    if (!ABSORBED && _particle->_index == 126) {
        _particle->_index++;
      }

      // H521_P6
    if (!ABSORBED && _particle->_index == 127) {
#ifndef MULTICORE
        if (_H521_P6_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_P6_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_P6_var._position_relative, _H521_P6_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H521_P6_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_128
    if (!ABSORBED && _particle->_index == 128) {
#ifndef MULTICORE
        if (_HCS_Al_128_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_128_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_128_var._position_relative, _HCS_Al_128_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_128_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_SADAM_Monochromator_Cradle
    if (!ABSORBED && _particle->_index == 129) {
#ifndef MULTICORE
        if (_H521_SADAM_Monochromator_Cradle_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_SADAM_Monochromator_Cradle_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_SADAM_Monochromator_Cradle_var._position_relative, _H521_SADAM_Monochromator_Cradle_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H521_SADAM_Monochromator_Cradle_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_SADAM_Monochromator
    if (!ABSORBED && _particle->_index == 130) {
#ifndef MULTICORE
        if (_H521_SADAM_Monochromator_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_SADAM_Monochromator_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_SADAM_Monochromator_var._position_relative, _H521_SADAM_Monochromator_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monochromator_curved_trace(&_H521_SADAM_Monochromator_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_SADAM_Monochromator_Out
    if (!ABSORBED && _particle->_index == 131) {
        _particle->_index++;
      }

      // H521_SADAM_Sample_Div
    if (!ABSORBED && _particle->_index == 132) {
#ifndef MULTICORE
        if (_H521_SADAM_Sample_Div_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_SADAM_Sample_Div_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_SADAM_Sample_Div_var._position_relative, _H521_SADAM_Sample_Div_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H521_SADAM_Sample_Div_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_SADAM_Sample_XY
    if (!ABSORBED && _particle->_index == 133) {
#ifndef MULTICORE
        if (_H521_SADAM_Sample_XY_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_SADAM_Sample_XY_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_SADAM_Sample_XY_var._position_relative, _H521_SADAM_Sample_XY_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H521_SADAM_Sample_XY_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_SADAM_Sample_L
    if (!ABSORBED && _particle->_index == 134) {
#ifndef MULTICORE
        if (_H521_SADAM_Sample_L_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_SADAM_Sample_L_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_SADAM_Sample_L_var._position_relative, _H521_SADAM_Sample_L_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H521_SADAM_Sample_L_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_SADAM_Sample
    if (!ABSORBED && _particle->_index == 135) {
#ifndef MULTICORE
        if (_H521_SADAM_Sample_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_SADAM_Sample_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_SADAM_Sample_var._position_relative, _H521_SADAM_Sample_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Isotropic_Sqw_trace(&_H521_SADAM_Sample_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_SADAM_Detector
    if (!ABSORBED && _particle->_index == 136) {
#ifndef MULTICORE
        if (_H521_SADAM_Detector_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_SADAM_Detector_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_SADAM_Detector_var._position_relative, _H521_SADAM_Detector_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H521_SADAM_Detector_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_SADAM_Spectrometer
    if (!ABSORBED && _particle->_index == 137) {
#ifndef MULTICORE
        if (_H521_SADAM_Spectrometer_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_SADAM_Spectrometer_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_SADAM_Spectrometer_var._position_relative, _H521_SADAM_Spectrometer_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H521_SADAM_Spectrometer_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_SADAM_Diffractometer
    if (!ABSORBED && _particle->_index == 138) {
#ifndef MULTICORE
        if (_H521_SADAM_Diffractometer_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_SADAM_Diffractometer_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_SADAM_Diffractometer_var._position_relative, _H521_SADAM_Diffractometer_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H521_SADAM_Diffractometer_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_start
    if (!ABSORBED && _particle->_index == 139) {
#ifndef MULTICORE
        if (_H522_start_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_start_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_start_var._position_relative, _H522_start_var._rotation_relative, _particle);
        _particle_save = *_particle;
        _particle->_index++;
      }

      // H522_Curved
    if (!ABSORBED && _particle->_index == 140) {
#ifndef MULTICORE
        if (_H522_Curved_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_var._position_relative, _H522_Curved_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_141
    if (!ABSORBED && _particle->_index == 141) {
#ifndef MULTICORE
        if (_H522_Curved_141_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_141_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_141_var._position_relative, _H522_Curved_141_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_141_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_142
    if (!ABSORBED && _particle->_index == 142) {
#ifndef MULTICORE
        if (_H522_Curved_142_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_142_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_142_var._position_relative, _H522_Curved_142_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_142_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_143
    if (!ABSORBED && _particle->_index == 143) {
#ifndef MULTICORE
        if (_H522_Curved_143_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_143_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_143_var._position_relative, _H522_Curved_143_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_143_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_144
    if (!ABSORBED && _particle->_index == 144) {
#ifndef MULTICORE
        if (_H522_Curved_144_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_144_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_144_var._position_relative, _H522_Curved_144_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_144_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_145
    if (!ABSORBED && _particle->_index == 145) {
#ifndef MULTICORE
        if (_H522_Curved_145_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_145_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_145_var._position_relative, _H522_Curved_145_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_145_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_146
    if (!ABSORBED && _particle->_index == 146) {
#ifndef MULTICORE
        if (_H522_Curved_146_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_146_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_146_var._position_relative, _H522_Curved_146_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_146_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_147
    if (!ABSORBED && _particle->_index == 147) {
#ifndef MULTICORE
        if (_H522_Curved_147_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_147_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_147_var._position_relative, _H522_Curved_147_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_147_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_148
    if (!ABSORBED && _particle->_index == 148) {
#ifndef MULTICORE
        if (_H522_Curved_148_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_148_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_148_var._position_relative, _H522_Curved_148_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_148_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_149
    if (!ABSORBED && _particle->_index == 149) {
#ifndef MULTICORE
        if (_H522_Curved_149_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_149_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_149_var._position_relative, _H522_Curved_149_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_149_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_150
    if (!ABSORBED && _particle->_index == 150) {
#ifndef MULTICORE
        if (_HCS_Al_150_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_150_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_150_var._position_relative, _HCS_Al_150_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_150_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_VTE
    if (!ABSORBED && _particle->_index == 151) {
#ifndef MULTICORE
        if (_H522_VTE_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_VTE_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_VTE_var._position_relative, _H522_VTE_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H522_VTE_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_152
    if (!ABSORBED && _particle->_index == 152) {
#ifndef MULTICORE
        if (_HCS_Al_152_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_152_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_152_var._position_relative, _HCS_Al_152_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_152_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_153
    if (!ABSORBED && _particle->_index == 153) {
#ifndef MULTICORE
        if (_H523_Curved_153_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_153_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_153_var._position_relative, _H523_Curved_153_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_153_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_154
    if (!ABSORBED && _particle->_index == 154) {
#ifndef MULTICORE
        if (_H523_Curved_154_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_154_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_154_var._position_relative, _H523_Curved_154_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_154_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_155
    if (!ABSORBED && _particle->_index == 155) {
#ifndef MULTICORE
        if (_H523_Curved_155_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_155_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_155_var._position_relative, _H523_Curved_155_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_155_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_156
    if (!ABSORBED && _particle->_index == 156) {
#ifndef MULTICORE
        if (_H523_Curved_156_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_156_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_156_var._position_relative, _H523_Curved_156_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_156_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_157
    if (!ABSORBED && _particle->_index == 157) {
#ifndef MULTICORE
        if (_H523_Curved_157_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_157_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_157_var._position_relative, _H523_Curved_157_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_157_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_158
    if (!ABSORBED && _particle->_index == 158) {
#ifndef MULTICORE
        if (_H522_Curved_158_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_158_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_158_var._position_relative, _H522_Curved_158_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_158_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_159
    if (!ABSORBED && _particle->_index == 159) {
#ifndef MULTICORE
        if (_H522_Curved_159_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_159_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_159_var._position_relative, _H522_Curved_159_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_159_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_160
    if (!ABSORBED && _particle->_index == 160) {
#ifndef MULTICORE
        if (_H522_Curved_160_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_160_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_160_var._position_relative, _H522_Curved_160_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_160_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_161
    if (!ABSORBED && _particle->_index == 161) {
#ifndef MULTICORE
        if (_H522_Curved_161_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_161_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_161_var._position_relative, _H522_Curved_161_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_161_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_162
    if (!ABSORBED && _particle->_index == 162) {
#ifndef MULTICORE
        if (_H522_Curved_162_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_162_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_162_var._position_relative, _H522_Curved_162_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_162_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_163
    if (!ABSORBED && _particle->_index == 163) {
#ifndef MULTICORE
        if (_H522_Curved_163_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_163_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_163_var._position_relative, _H522_Curved_163_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_163_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_164
    if (!ABSORBED && _particle->_index == 164) {
#ifndef MULTICORE
        if (_H522_Curved_164_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_164_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_164_var._position_relative, _H522_Curved_164_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_164_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_165
    if (!ABSORBED && _particle->_index == 165) {
#ifndef MULTICORE
        if (_H522_Curved_165_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_165_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_165_var._position_relative, _H522_Curved_165_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_165_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_166
    if (!ABSORBED && _particle->_index == 166) {
#ifndef MULTICORE
        if (_H522_Curved_166_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_166_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_166_var._position_relative, _H522_Curved_166_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_166_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_167
    if (!ABSORBED && _particle->_index == 167) {
#ifndef MULTICORE
        if (_H522_Curved_167_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_167_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_167_var._position_relative, _H522_Curved_167_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_167_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_168
    if (!ABSORBED && _particle->_index == 168) {
#ifndef MULTICORE
        if (_H522_Curved_168_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_168_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_168_var._position_relative, _H522_Curved_168_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_168_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_169
    if (!ABSORBED && _particle->_index == 169) {
#ifndef MULTICORE
        if (_H522_Curved_169_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_169_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_169_var._position_relative, _H522_Curved_169_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_169_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_170
    if (!ABSORBED && _particle->_index == 170) {
#ifndef MULTICORE
        if (_H522_Curved_170_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_170_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_170_var._position_relative, _H522_Curved_170_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_170_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_171
    if (!ABSORBED && _particle->_index == 171) {
#ifndef MULTICORE
        if (_H522_Curved_171_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_171_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_171_var._position_relative, _H522_Curved_171_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_171_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_172
    if (!ABSORBED && _particle->_index == 172) {
#ifndef MULTICORE
        if (_H522_Curved_172_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_172_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_172_var._position_relative, _H522_Curved_172_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_172_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_173
    if (!ABSORBED && _particle->_index == 173) {
#ifndef MULTICORE
        if (_H522_Curved_173_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_173_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_173_var._position_relative, _H522_Curved_173_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_173_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_174
    if (!ABSORBED && _particle->_index == 174) {
#ifndef MULTICORE
        if (_H522_Curved_174_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_174_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_174_var._position_relative, _H522_Curved_174_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_174_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_175
    if (!ABSORBED && _particle->_index == 175) {
#ifndef MULTICORE
        if (_H522_Curved_175_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_175_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_175_var._position_relative, _H522_Curved_175_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_175_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_176
    if (!ABSORBED && _particle->_index == 176) {
#ifndef MULTICORE
        if (_H522_Curved_176_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_176_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_176_var._position_relative, _H522_Curved_176_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_176_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_177
    if (!ABSORBED && _particle->_index == 177) {
#ifndef MULTICORE
        if (_H522_Curved_177_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_177_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_177_var._position_relative, _H522_Curved_177_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Curved_177_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_178
    if (!ABSORBED && _particle->_index == 178) {
#ifndef MULTICORE
        if (_HCS_Al_178_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_178_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_178_var._position_relative, _HCS_Al_178_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_178_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_Out_XY
    if (!ABSORBED && _particle->_index == 179) {
#ifndef MULTICORE
        if (_H522_Curved_Out_XY_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_Out_XY_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_Out_XY_var._position_relative, _H522_Curved_Out_XY_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H522_Curved_Out_XY_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Curved_Out_XL
    if (!ABSORBED && _particle->_index == 180) {
#ifndef MULTICORE
        if (_H522_Curved_Out_XL_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Curved_Out_XL_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Curved_Out_XL_var._position_relative, _H522_Curved_Out_XL_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H522_Curved_Out_XL_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // WASP_Vselector
    if (!ABSORBED && _particle->_index == 181) {
#ifndef MULTICORE
        if (_WASP_Vselector_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _WASP_Vselector_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_WASP_Vselector_var._position_relative, _WASP_Vselector_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_V_selector_trace(&_WASP_Vselector_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_182
    if (!ABSORBED && _particle->_index == 182) {
#ifndef MULTICORE
        if (_HCS_Al_182_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_182_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_182_var._position_relative, _HCS_Al_182_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_182_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Straight
    if (!ABSORBED && _particle->_index == 183) {
#ifndef MULTICORE
        if (_H522_Straight_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Straight_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Straight_var._position_relative, _H522_Straight_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Straight_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_184
    if (!ABSORBED && _particle->_index == 184) {
#ifndef MULTICORE
        if (_HCS_Al_184_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_184_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_184_var._position_relative, _HCS_Al_184_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_184_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Vsel_L
    if (!ABSORBED && _particle->_index == 185) {
#ifndef MULTICORE
        if (_H522_Vsel_L_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Vsel_L_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Vsel_L_var._position_relative, _H522_Vsel_L_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H522_Vsel_L_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_mirror_centre
    if (!ABSORBED && _particle->_index == 186) {
#ifndef MULTICORE
        if (_H522_mirror_centre_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_mirror_centre_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_mirror_centre_var._position_relative, _H522_mirror_centre_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Arm_trace(&_H522_mirror_centre_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // WASP_polariser
    if (!ABSORBED && _particle->_index == 187) {
#ifndef MULTICORE
        if (_WASP_polariser_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _WASP_polariser_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_WASP_polariser_var._position_relative, _WASP_polariser_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Pol_mirror_trace(&_WASP_polariser_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_mirror_outdir
    if (!ABSORBED && _particle->_index == 188) {
        _particle->_index++;
      }

      // H522_mirror_ReflectXY
    if (!ABSORBED && _particle->_index == 189) {
#ifndef MULTICORE
        if (_H522_mirror_ReflectXY_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_mirror_ReflectXY_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_mirror_ReflectXY_var._position_relative, _H522_mirror_ReflectXY_var._rotation_relative, _particle);
        _particle_save = *_particle;
        if ((flag == 1)) // conditional WHEN
        class_Monitor_nD_trace(&_H522_mirror_ReflectXY_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_mirror_TransmitXY
    if (!ABSORBED && _particle->_index == 190) {
#ifndef MULTICORE
        if (_H522_mirror_TransmitXY_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_mirror_TransmitXY_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_mirror_TransmitXY_var._position_relative, _H522_mirror_TransmitXY_var._rotation_relative, _particle);
        _particle_save = *_particle;
        if ((flag == 2)) // conditional WHEN
        class_Monitor_nD_trace(&_H522_mirror_TransmitXY_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_mirror_outdXY
    if (!ABSORBED && _particle->_index == 191) {
#ifndef MULTICORE
        if (_H522_mirror_outdXY_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_mirror_outdXY_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_mirror_outdXY_var._position_relative, _H522_mirror_outdXY_var._rotation_relative, _particle);
        _particle_save = *_particle;
        if ((flag == 1)) // conditional WHEN
        class_Monitor_nD_trace(&_H522_mirror_outdXY_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // WASP_Vpolariser
    if (!ABSORBED && _particle->_index == 192) {
#ifndef MULTICORE
        if (_WASP_Vpolariser_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _WASP_Vpolariser_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_WASP_Vpolariser_var._position_relative, _WASP_Vpolariser_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Pol_guide_vmirror_trace(&_WASP_Vpolariser_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_Straight_Last
    if (!ABSORBED && _particle->_index == 193) {
#ifndef MULTICORE
        if (_H522_Straight_Last_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_Straight_Last_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_Straight_Last_var._position_relative, _H522_Straight_Last_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H522_Straight_Last_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_WASP_Sample_Div
    if (!ABSORBED && _particle->_index == 194) {
#ifndef MULTICORE
        if (_H522_WASP_Sample_Div_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_WASP_Sample_Div_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_WASP_Sample_Div_var._position_relative, _H522_WASP_Sample_Div_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H522_WASP_Sample_Div_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_WASP_Sample_XY
    if (!ABSORBED && _particle->_index == 195) {
#ifndef MULTICORE
        if (_H522_WASP_Sample_XY_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_WASP_Sample_XY_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_WASP_Sample_XY_var._position_relative, _H522_WASP_Sample_XY_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H522_WASP_Sample_XY_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_WASP_Sample_L
    if (!ABSORBED && _particle->_index == 196) {
#ifndef MULTICORE
        if (_H522_WASP_Sample_L_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_WASP_Sample_L_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_WASP_Sample_L_var._position_relative, _H522_WASP_Sample_L_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H522_WASP_Sample_L_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_WASP_Sample
    if (!ABSORBED && _particle->_index == 197) {
#ifndef MULTICORE
        if (_H522_WASP_Sample_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_WASP_Sample_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_WASP_Sample_var._position_relative, _H522_WASP_Sample_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Incoherent_trace(&_H522_WASP_Sample_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_WASP_Detector
    if (!ABSORBED && _particle->_index == 198) {
#ifndef MULTICORE
        if (_H522_WASP_Detector_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_WASP_Detector_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_WASP_Detector_var._position_relative, _H522_WASP_Detector_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H522_WASP_Detector_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_WASP_Spectrometer
    if (!ABSORBED && _particle->_index == 199) {
#ifndef MULTICORE
        if (_H522_WASP_Spectrometer_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_WASP_Spectrometer_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_WASP_Spectrometer_var._position_relative, _H522_WASP_Spectrometer_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H522_WASP_Spectrometer_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H522_WASP_Diffractometer
    if (!ABSORBED && _particle->_index == 200) {
#ifndef MULTICORE
        if (_H522_WASP_Diffractometer_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H522_WASP_Diffractometer_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H522_WASP_Diffractometer_var._position_relative, _H522_WASP_Diffractometer_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H522_WASP_Diffractometer_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_start
    if (!ABSORBED && _particle->_index == 201) {
#ifndef MULTICORE
        if (_H523_start_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_start_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_start_var._position_relative, _H523_start_var._rotation_relative, _particle);
        _particle_save = *_particle;
        _particle->_index++;
      }

      // H523_Curved
    if (!ABSORBED && _particle->_index == 202) {
#ifndef MULTICORE
        if (_H523_Curved_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_var._position_relative, _H523_Curved_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_203
    if (!ABSORBED && _particle->_index == 203) {
#ifndef MULTICORE
        if (_H523_Curved_203_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_203_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_203_var._position_relative, _H523_Curved_203_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_203_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_204
    if (!ABSORBED && _particle->_index == 204) {
#ifndef MULTICORE
        if (_H523_Curved_204_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_204_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_204_var._position_relative, _H523_Curved_204_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_204_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_205
    if (!ABSORBED && _particle->_index == 205) {
#ifndef MULTICORE
        if (_H523_Curved_205_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_205_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_205_var._position_relative, _H523_Curved_205_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_205_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_206
    if (!ABSORBED && _particle->_index == 206) {
#ifndef MULTICORE
        if (_H523_Curved_206_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_206_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_206_var._position_relative, _H523_Curved_206_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_206_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_207
    if (!ABSORBED && _particle->_index == 207) {
#ifndef MULTICORE
        if (_HCS_Al_207_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_207_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_207_var._position_relative, _HCS_Al_207_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_207_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_VTE
    if (!ABSORBED && _particle->_index == 208) {
#ifndef MULTICORE
        if (_H523_VTE_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_VTE_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_VTE_var._position_relative, _H523_VTE_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H523_VTE_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_209
    if (!ABSORBED && _particle->_index == 209) {
#ifndef MULTICORE
        if (_HCS_Al_209_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_209_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_209_var._position_relative, _HCS_Al_209_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_209_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_210
    if (!ABSORBED && _particle->_index == 210) {
#ifndef MULTICORE
        if (_H523_Curved_210_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_210_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_210_var._position_relative, _H523_Curved_210_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_210_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_211
    if (!ABSORBED && _particle->_index == 211) {
#ifndef MULTICORE
        if (_H523_Curved_211_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_211_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_211_var._position_relative, _H523_Curved_211_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_211_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_212
    if (!ABSORBED && _particle->_index == 212) {
#ifndef MULTICORE
        if (_H523_Curved_212_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_212_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_212_var._position_relative, _H523_Curved_212_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_212_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_213
    if (!ABSORBED && _particle->_index == 213) {
#ifndef MULTICORE
        if (_H523_Curved_213_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_213_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_213_var._position_relative, _H523_Curved_213_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_213_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_214
    if (!ABSORBED && _particle->_index == 214) {
#ifndef MULTICORE
        if (_H523_Curved_214_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_214_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_214_var._position_relative, _H523_Curved_214_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_214_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_215
    if (!ABSORBED && _particle->_index == 215) {
#ifndef MULTICORE
        if (_H523_Curved_215_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_215_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_215_var._position_relative, _H523_Curved_215_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_215_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_216
    if (!ABSORBED && _particle->_index == 216) {
#ifndef MULTICORE
        if (_H523_Curved_216_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_216_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_216_var._position_relative, _H523_Curved_216_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_216_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_217
    if (!ABSORBED && _particle->_index == 217) {
#ifndef MULTICORE
        if (_H523_Curved_217_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_217_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_217_var._position_relative, _H523_Curved_217_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_217_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_218
    if (!ABSORBED && _particle->_index == 218) {
#ifndef MULTICORE
        if (_H523_Curved_218_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_218_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_218_var._position_relative, _H523_Curved_218_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_218_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_219
    if (!ABSORBED && _particle->_index == 219) {
#ifndef MULTICORE
        if (_H523_Curved_219_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_219_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_219_var._position_relative, _H523_Curved_219_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_219_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_220
    if (!ABSORBED && _particle->_index == 220) {
#ifndef MULTICORE
        if (_H523_Curved_220_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_220_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_220_var._position_relative, _H523_Curved_220_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_220_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_221
    if (!ABSORBED && _particle->_index == 221) {
#ifndef MULTICORE
        if (_H523_Curved_221_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_221_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_221_var._position_relative, _H523_Curved_221_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_221_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_222
    if (!ABSORBED && _particle->_index == 222) {
#ifndef MULTICORE
        if (_H523_Curved_222_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_222_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_222_var._position_relative, _H523_Curved_222_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_222_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_223
    if (!ABSORBED && _particle->_index == 223) {
#ifndef MULTICORE
        if (_H523_Curved_223_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_223_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_223_var._position_relative, _H523_Curved_223_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_223_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_224
    if (!ABSORBED && _particle->_index == 224) {
#ifndef MULTICORE
        if (_H523_Curved_224_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_224_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_224_var._position_relative, _H523_Curved_224_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_224_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_225
    if (!ABSORBED && _particle->_index == 225) {
#ifndef MULTICORE
        if (_H523_Curved_225_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_225_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_225_var._position_relative, _H523_Curved_225_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_225_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_226
    if (!ABSORBED && _particle->_index == 226) {
#ifndef MULTICORE
        if (_H523_Curved_226_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_226_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_226_var._position_relative, _H523_Curved_226_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_226_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_227
    if (!ABSORBED && _particle->_index == 227) {
#ifndef MULTICORE
        if (_H523_Curved_227_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_227_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_227_var._position_relative, _H523_Curved_227_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_227_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_228
    if (!ABSORBED && _particle->_index == 228) {
#ifndef MULTICORE
        if (_H523_Curved_228_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_228_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_228_var._position_relative, _H523_Curved_228_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_228_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_Curved_229
    if (!ABSORBED && _particle->_index == 229) {
#ifndef MULTICORE
        if (_H523_Curved_229_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_Curved_229_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_Curved_229_var._position_relative, _H523_Curved_229_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H523_Curved_229_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_230
    if (!ABSORBED && _particle->_index == 230) {
#ifndef MULTICORE
        if (_HCS_Al_230_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_230_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_230_var._position_relative, _HCS_Al_230_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_230_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_CryoEDM_In
    if (!ABSORBED && _particle->_index == 231) {
        _particle->_index++;
      }

      // H523_CryoEDM_In_L
    if (!ABSORBED && _particle->_index == 232) {
#ifndef MULTICORE
        if (_H523_CryoEDM_In_L_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_CryoEDM_In_L_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_CryoEDM_In_L_var._position_relative, _H523_CryoEDM_In_L_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H523_CryoEDM_In_L_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_CryoEDM_mirror_center
    if (!ABSORBED && _particle->_index == 233) {
        _particle->_index++;
      }

      // H523_CryoEDM_polariser
    if (!ABSORBED && _particle->_index == 234) {
#ifndef MULTICORE
        if (_H523_CryoEDM_polariser_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_CryoEDM_polariser_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_CryoEDM_polariser_var._position_relative, _H523_CryoEDM_polariser_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Pol_mirror_trace(&_H523_CryoEDM_polariser_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_CryoEDM_mirror_outdir
    if (!ABSORBED && _particle->_index == 235) {
        _particle->_index++;
      }

      // H523_CryoEDM_mirror_ReflectXY
    if (!ABSORBED && _particle->_index == 236) {
#ifndef MULTICORE
        if (_H523_CryoEDM_mirror_ReflectXY_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_CryoEDM_mirror_ReflectXY_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_CryoEDM_mirror_ReflectXY_var._position_relative, _H523_CryoEDM_mirror_ReflectXY_var._rotation_relative, _particle);
        _particle_save = *_particle;
        if ((flag == 1)) // conditional WHEN
        class_Monitor_nD_trace(&_H523_CryoEDM_mirror_ReflectXY_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_CryoEDM_mirror_TransmitXY
    if (!ABSORBED && _particle->_index == 237) {
#ifndef MULTICORE
        if (_H523_CryoEDM_mirror_TransmitXY_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_CryoEDM_mirror_TransmitXY_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_CryoEDM_mirror_TransmitXY_var._position_relative, _H523_CryoEDM_mirror_TransmitXY_var._rotation_relative, _particle);
        _particle_save = *_particle;
        if ((flag == 2)) // conditional WHEN
        class_Monitor_nD_trace(&_H523_CryoEDM_mirror_TransmitXY_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_CryoEDM_Sample_L
    if (!ABSORBED && _particle->_index == 238) {
#ifndef MULTICORE
        if (_H523_CryoEDM_Sample_L_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_CryoEDM_Sample_L_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_CryoEDM_Sample_L_var._position_relative, _H523_CryoEDM_Sample_L_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H523_CryoEDM_Sample_L_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_CryoEDM_Sample_Div
    if (!ABSORBED && _particle->_index == 239) {
#ifndef MULTICORE
        if (_H523_CryoEDM_Sample_Div_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_CryoEDM_Sample_Div_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_CryoEDM_Sample_Div_var._position_relative, _H523_CryoEDM_Sample_Div_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H523_CryoEDM_Sample_Div_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H523_CryoEDM_Sample_XY
    if (!ABSORBED && _particle->_index == 240) {
#ifndef MULTICORE
        if (_H523_CryoEDM_Sample_XY_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H523_CryoEDM_Sample_XY_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H523_CryoEDM_Sample_XY_var._position_relative, _H523_CryoEDM_Sample_XY_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H523_CryoEDM_Sample_XY_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H51_start
    if (!ABSORBED && _particle->_index == 241) {
#ifndef MULTICORE
        if (_H51_start_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H51_start_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H51_start_var._position_relative, _H51_start_var._rotation_relative, _particle);
        _particle_save = *_particle;
        _particle->_index++;
      }

      // H51_inpile
    if (!ABSORBED && _particle->_index == 242) {
#ifndef MULTICORE
        if (_H51_inpile_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H51_inpile_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H51_inpile_var._position_relative, _H51_inpile_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H51_inpile_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H51_Obt_1
    if (!ABSORBED && _particle->_index == 243) {
#ifndef MULTICORE
        if (_H51_Obt_1_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H51_Obt_1_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H51_Obt_1_var._position_relative, _H51_Obt_1_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H51_Obt_1_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H51_Obt_2
    if (!ABSORBED && _particle->_index == 244) {
#ifndef MULTICORE
        if (_H51_Obt_2_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H51_Obt_2_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H51_Obt_2_var._position_relative, _H51_Obt_2_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H51_Obt_2_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H51_Obt_3
    if (!ABSORBED && _particle->_index == 245) {
#ifndef MULTICORE
        if (_H51_Obt_3_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H51_Obt_3_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H51_Obt_3_var._position_relative, _H51_Obt_3_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H51_Obt_3_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_246
    if (!ABSORBED && _particle->_index == 246) {
#ifndef MULTICORE
        if (_HCS_Al_246_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_246_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_246_var._position_relative, _HCS_Al_246_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_246_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H51_Obt_Out
    if (!ABSORBED && _particle->_index == 247) {
#ifndef MULTICORE
        if (_H51_Obt_Out_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H51_Obt_Out_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H51_Obt_Out_var._position_relative, _H51_Obt_Out_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H51_Obt_Out_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_248
    if (!ABSORBED && _particle->_index == 248) {
#ifndef MULTICORE
        if (_HCS_Al_248_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_248_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_248_var._position_relative, _HCS_Al_248_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_248_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H51_S2
    if (!ABSORBED && _particle->_index == 249) {
#ifndef MULTICORE
        if (_H51_S2_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H51_S2_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H51_S2_var._position_relative, _H51_S2_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H51_S2_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H51_S2_250
    if (!ABSORBED && _particle->_index == 250) {
#ifndef MULTICORE
        if (_H51_S2_250_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H51_S2_250_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H51_S2_250_var._position_relative, _H51_S2_250_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H51_S2_250_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H51_S2_251
    if (!ABSORBED && _particle->_index == 251) {
#ifndef MULTICORE
        if (_H51_S2_251_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H51_S2_251_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H51_S2_251_var._position_relative, _H51_S2_251_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H51_S2_251_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_H51
    if (!ABSORBED && _particle->_index == 252) {
#ifndef MULTICORE
        if (_HCS_Al_H51_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_H51_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_H51_var._position_relative, _HCS_Al_H51_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_H51_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H51_S2_Out
    if (!ABSORBED && _particle->_index == 253) {
#ifndef MULTICORE
        if (_H51_S2_Out_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H51_S2_Out_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H51_S2_Out_var._position_relative, _H51_S2_Out_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H51_S2_Out_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H51_split_2
    if (!ABSORBED && _particle->_index == 254) {
#ifndef MULTICORE
        if (_H51_split_2_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H51_split_2_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H51_split_2_var._position_relative, _H51_split_2_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H51_split_2_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H51_split_1
    if (!ABSORBED && _particle->_index == 255) {
#ifndef MULTICORE
        if (_H51_split_1_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H51_split_1_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H51_split_1_var._position_relative, _H51_split_1_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H51_split_1_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H511_Start
    if (!ABSORBED && _particle->_index == 256) {
#ifndef MULTICORE
        if (_H511_Start_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H511_Start_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H511_Start_var._position_relative, _H511_Start_var._rotation_relative, _particle);
        _particle_save = *_particle;
        _particle->_index++;
      }

      // H511_mirror_centre
    if (!ABSORBED && _particle->_index == 257) {
#ifndef MULTICORE
        if (_H511_mirror_centre_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H511_mirror_centre_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H511_mirror_centre_var._position_relative, _H511_mirror_centre_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Arm_trace(&_H511_mirror_centre_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // IN15_polariser
    if (!ABSORBED && _particle->_index == 258) {
#ifndef MULTICORE
        if (_IN15_polariser_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _IN15_polariser_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_IN15_polariser_var._position_relative, _IN15_polariser_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Pol_mirror_trace(&_IN15_polariser_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H511_mirror_outdir
    if (!ABSORBED && _particle->_index == 259) {
        _particle->_index++;
      }

      // H511_mirror_ReflectXY
    if (!ABSORBED && _particle->_index == 260) {
#ifndef MULTICORE
        if (_H511_mirror_ReflectXY_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H511_mirror_ReflectXY_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H511_mirror_ReflectXY_var._position_relative, _H511_mirror_ReflectXY_var._rotation_relative, _particle);
        _particle_save = *_particle;
        if ((flag == 1)) // conditional WHEN
        class_Monitor_nD_trace(&_H511_mirror_ReflectXY_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H511_mirror_TransmitXY
    if (!ABSORBED && _particle->_index == 261) {
#ifndef MULTICORE
        if (_H511_mirror_TransmitXY_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H511_mirror_TransmitXY_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H511_mirror_TransmitXY_var._position_relative, _H511_mirror_TransmitXY_var._rotation_relative, _particle);
        _particle_save = *_particle;
        if ((flag == 2)) // conditional WHEN
        class_Monitor_nD_trace(&_H511_mirror_TransmitXY_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H511_mirror_outdXY
    if (!ABSORBED && _particle->_index == 262) {
#ifndef MULTICORE
        if (_H511_mirror_outdXY_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H511_mirror_outdXY_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H511_mirror_outdXY_var._position_relative, _H511_mirror_outdXY_var._rotation_relative, _particle);
        _particle_save = *_particle;
        if ((flag == 1)) // conditional WHEN
        class_Monitor_nD_trace(&_H511_mirror_outdXY_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H511_S3
    if (!ABSORBED && _particle->_index == 263) {
#ifndef MULTICORE
        if (_H511_S3_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H511_S3_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H511_S3_var._position_relative, _H511_S3_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H511_S3_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H511_S9
    if (!ABSORBED && _particle->_index == 264) {
#ifndef MULTICORE
        if (_H511_S9_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H511_S9_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H511_S9_var._position_relative, _H511_S9_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H511_S9_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_265
    if (!ABSORBED && _particle->_index == 265) {
#ifndef MULTICORE
        if (_HCS_Al_265_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_265_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_265_var._position_relative, _HCS_Al_265_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_265_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H511_VTE
    if (!ABSORBED && _particle->_index == 266) {
#ifndef MULTICORE
        if (_H511_VTE_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H511_VTE_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H511_VTE_var._position_relative, _H511_VTE_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H511_VTE_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_267
    if (!ABSORBED && _particle->_index == 267) {
#ifndef MULTICORE
        if (_HCS_Al_267_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_267_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_267_var._position_relative, _HCS_Al_267_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_267_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H511_S10
    if (!ABSORBED && _particle->_index == 268) {
#ifndef MULTICORE
        if (_H511_S10_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H511_S10_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H511_S10_var._position_relative, _H511_S10_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H511_S10_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // IN15_Vselector
    if (!ABSORBED && _particle->_index == 269) {
#ifndef MULTICORE
        if (_IN15_Vselector_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _IN15_Vselector_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_IN15_Vselector_var._position_relative, _IN15_Vselector_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_V_selector_trace(&_IN15_Vselector_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H511_BeforeV
    if (!ABSORBED && _particle->_index == 270) {
#ifndef MULTICORE
        if (_H511_BeforeV_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H511_BeforeV_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H511_BeforeV_var._position_relative, _H511_BeforeV_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H511_BeforeV_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // IN15_Vpolariser
    if (!ABSORBED && _particle->_index == 271) {
#ifndef MULTICORE
        if (_IN15_Vpolariser_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _IN15_Vpolariser_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_IN15_Vpolariser_var._position_relative, _IN15_Vpolariser_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Pol_guide_vmirror_trace(&_IN15_Vpolariser_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H511_AfterV
    if (!ABSORBED && _particle->_index == 272) {
#ifndef MULTICORE
        if (_H511_AfterV_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H511_AfterV_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H511_AfterV_var._position_relative, _H511_AfterV_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H511_AfterV_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H511_IN15_Sample_Div
    if (!ABSORBED && _particle->_index == 273) {
#ifndef MULTICORE
        if (_H511_IN15_Sample_Div_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H511_IN15_Sample_Div_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H511_IN15_Sample_Div_var._position_relative, _H511_IN15_Sample_Div_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H511_IN15_Sample_Div_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H511_IN15_Sample_XY
    if (!ABSORBED && _particle->_index == 274) {
#ifndef MULTICORE
        if (_H511_IN15_Sample_XY_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H511_IN15_Sample_XY_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H511_IN15_Sample_XY_var._position_relative, _H511_IN15_Sample_XY_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H511_IN15_Sample_XY_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H511_IN15_Sample_L
    if (!ABSORBED && _particle->_index == 275) {
#ifndef MULTICORE
        if (_H511_IN15_Sample_L_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H511_IN15_Sample_L_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H511_IN15_Sample_L_var._position_relative, _H511_IN15_Sample_L_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H511_IN15_Sample_L_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H511_IN15_Sample
    if (!ABSORBED && _particle->_index == 276) {
#ifndef MULTICORE
        if (_H511_IN15_Sample_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H511_IN15_Sample_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H511_IN15_Sample_var._position_relative, _H511_IN15_Sample_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Incoherent_trace(&_H511_IN15_Sample_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H511_IN15_Detector
    if (!ABSORBED && _particle->_index == 277) {
#ifndef MULTICORE
        if (_H511_IN15_Detector_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H511_IN15_Detector_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H511_IN15_Detector_var._position_relative, _H511_IN15_Detector_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H511_IN15_Detector_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H511_IN15_Spectrometer
    if (!ABSORBED && _particle->_index == 278) {
#ifndef MULTICORE
        if (_H511_IN15_Spectrometer_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H511_IN15_Spectrometer_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H511_IN15_Spectrometer_var._position_relative, _H511_IN15_Spectrometer_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H511_IN15_Spectrometer_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H511_IN15_Diffractometer
    if (!ABSORBED && _particle->_index == 279) {
#ifndef MULTICORE
        if (_H511_IN15_Diffractometer_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H511_IN15_Diffractometer_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H511_IN15_Diffractometer_var._position_relative, _H511_IN15_Diffractometer_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H511_IN15_Diffractometer_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H512_Start
    if (!ABSORBED && _particle->_index == 280) {
#ifndef MULTICORE
        if (_H512_Start_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H512_Start_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H512_Start_var._position_relative, _H512_Start_var._rotation_relative, _particle);
        _particle_save = *_particle;
        _particle->_index++;
      }

      // H512_S36
    if (!ABSORBED && _particle->_index == 281) {
#ifndef MULTICORE
        if (_H512_S36_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H512_S36_var._position_relative, _H512_S36_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H512_S36_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H512_S36_282
    if (!ABSORBED && _particle->_index == 282) {
#ifndef MULTICORE
        if (_H512_S36_282_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_282_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H512_S36_282_var._position_relative, _H512_S36_282_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H512_S36_282_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H512_S36_283
    if (!ABSORBED && _particle->_index == 283) {
#ifndef MULTICORE
        if (_H512_S36_283_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_283_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H512_S36_283_var._position_relative, _H512_S36_283_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H512_S36_283_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H512_S36_284
    if (!ABSORBED && _particle->_index == 284) {
#ifndef MULTICORE
        if (_H512_S36_284_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_284_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H512_S36_284_var._position_relative, _H512_S36_284_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H512_S36_284_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H512_S36_285
    if (!ABSORBED && _particle->_index == 285) {
#ifndef MULTICORE
        if (_H512_S36_285_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_285_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H512_S36_285_var._position_relative, _H512_S36_285_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H512_S36_285_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H512_S36_286
    if (!ABSORBED && _particle->_index == 286) {
#ifndef MULTICORE
        if (_H512_S36_286_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_286_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H512_S36_286_var._position_relative, _H512_S36_286_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H512_S36_286_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H512_S36_287
    if (!ABSORBED && _particle->_index == 287) {
#ifndef MULTICORE
        if (_H512_S36_287_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_287_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H512_S36_287_var._position_relative, _H512_S36_287_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H512_S36_287_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H512_S36_288
    if (!ABSORBED && _particle->_index == 288) {
#ifndef MULTICORE
        if (_H512_S36_288_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_288_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H512_S36_288_var._position_relative, _H512_S36_288_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H512_S36_288_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H512_S36_289
    if (!ABSORBED && _particle->_index == 289) {
#ifndef MULTICORE
        if (_H512_S36_289_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_289_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H512_S36_289_var._position_relative, _H512_S36_289_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H512_S36_289_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H512_S36_290
    if (!ABSORBED && _particle->_index == 290) {
#ifndef MULTICORE
        if (_H512_S36_290_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_290_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H512_S36_290_var._position_relative, _H512_S36_290_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H512_S36_290_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H512_S36_291
    if (!ABSORBED && _particle->_index == 291) {
#ifndef MULTICORE
        if (_H512_S36_291_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_291_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H512_S36_291_var._position_relative, _H512_S36_291_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H512_S36_291_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H512_S36_292
    if (!ABSORBED && _particle->_index == 292) {
#ifndef MULTICORE
        if (_H512_S36_292_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_292_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H512_S36_292_var._position_relative, _H512_S36_292_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H512_S36_292_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H512_S36_293
    if (!ABSORBED && _particle->_index == 293) {
#ifndef MULTICORE
        if (_H512_S36_293_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_293_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H512_S36_293_var._position_relative, _H512_S36_293_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H512_S36_293_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H512_S36_294
    if (!ABSORBED && _particle->_index == 294) {
#ifndef MULTICORE
        if (_H512_S36_294_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_294_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H512_S36_294_var._position_relative, _H512_S36_294_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H512_S36_294_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H512_S36_295
    if (!ABSORBED && _particle->_index == 295) {
#ifndef MULTICORE
        if (_H512_S36_295_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_295_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H512_S36_295_var._position_relative, _H512_S36_295_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H512_S36_295_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H512_S36_296
    if (!ABSORBED && _particle->_index == 296) {
#ifndef MULTICORE
        if (_H512_S36_296_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H512_S36_296_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H512_S36_296_var._position_relative, _H512_S36_296_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H512_S36_296_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_H512
    if (!ABSORBED && _particle->_index == 297) {
#ifndef MULTICORE
        if (_HCS_Al_H512_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_H512_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_H512_var._position_relative, _HCS_Al_H512_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_H512_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H512_VTE
    if (!ABSORBED && _particle->_index == 298) {
#ifndef MULTICORE
        if (_H512_VTE_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H512_VTE_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H512_VTE_var._position_relative, _H512_VTE_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H512_VTE_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_299
    if (!ABSORBED && _particle->_index == 299) {
#ifndef MULTICORE
        if (_HCS_Al_299_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_299_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_299_var._position_relative, _HCS_Al_299_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_299_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H51_S78
    if (!ABSORBED && _particle->_index == 300) {
#ifndef MULTICORE
        if (_H51_S78_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H51_S78_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H51_S78_var._position_relative, _H51_S78_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H51_S78_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H51_S78_301
    if (!ABSORBED && _particle->_index == 301) {
#ifndef MULTICORE
        if (_H51_S78_301_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H51_S78_301_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H51_S78_301_var._position_relative, _H51_S78_301_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H51_S78_301_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H51_S78_302
    if (!ABSORBED && _particle->_index == 302) {
#ifndef MULTICORE
        if (_H51_S78_302_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H51_S78_302_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H51_S78_302_var._position_relative, _H51_S78_302_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H51_S78_302_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H51_S78_303
    if (!ABSORBED && _particle->_index == 303) {
#ifndef MULTICORE
        if (_H51_S78_303_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H51_S78_303_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H51_S78_303_var._position_relative, _H51_S78_303_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H51_S78_303_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_304
    if (!ABSORBED && _particle->_index == 304) {
#ifndef MULTICORE
        if (_HCS_Al_304_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_304_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_304_var._position_relative, _HCS_Al_304_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_304_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H512_S11
    if (!ABSORBED && _particle->_index == 305) {
#ifndef MULTICORE
        if (_H512_S11_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H512_S11_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H512_S11_var._position_relative, _H512_S11_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_H512_S11_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // HCS_Al_306
    if (!ABSORBED && _particle->_index == 306) {
#ifndef MULTICORE
        if (_HCS_Al_306_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _HCS_Al_306_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_HCS_Al_306_var._position_relative, _HCS_Al_306_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_PowderN_trace(&_HCS_Al_306_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // D22_PreV
    if (!ABSORBED && _particle->_index == 307) {
#ifndef MULTICORE
        if (_D22_PreV_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _D22_PreV_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_D22_PreV_var._position_relative, _D22_PreV_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_D22_PreV_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // D22_Vselector
    if (!ABSORBED && _particle->_index == 308) {
#ifndef MULTICORE
        if (_D22_Vselector_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _D22_Vselector_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_D22_Vselector_var._position_relative, _D22_Vselector_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_V_selector_trace(&_D22_Vselector_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // D22_Collimation
    if (!ABSORBED && _particle->_index == 309) {
#ifndef MULTICORE
        if (_D22_Collimation_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _D22_Collimation_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_D22_Collimation_var._position_relative, _D22_Collimation_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Guide_gravity_trace(&_D22_Collimation_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // D22_Sample_Pos
    if (!ABSORBED && _particle->_index == 310) {
        _particle->_index++;
      }

      // H51_D22_Sample_Div
    if (!ABSORBED && _particle->_index == 311) {
#ifndef MULTICORE
        if (_H51_D22_Sample_Div_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H51_D22_Sample_Div_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H51_D22_Sample_Div_var._position_relative, _H51_D22_Sample_Div_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H51_D22_Sample_Div_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H51_D22_Sample_XY
    if (!ABSORBED && _particle->_index == 312) {
#ifndef MULTICORE
        if (_H51_D22_Sample_XY_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H51_D22_Sample_XY_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H51_D22_Sample_XY_var._position_relative, _H51_D22_Sample_XY_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H51_D22_Sample_XY_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H51_D22_Sample_L
    if (!ABSORBED && _particle->_index == 313) {
#ifndef MULTICORE
        if (_H51_D22_Sample_L_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H51_D22_Sample_L_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H51_D22_Sample_L_var._position_relative, _H51_D22_Sample_L_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_H51_D22_Sample_L_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H51_D22_Sample
    if (!ABSORBED && _particle->_index == 314) {
#ifndef MULTICORE
        if (_H51_D22_Sample_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H51_D22_Sample_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H51_D22_Sample_var._position_relative, _H51_D22_Sample_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Isotropic_Sqw_trace(&_H51_D22_Sample_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // D22_Detector
    if (!ABSORBED && _particle->_index == 315) {
#ifndef MULTICORE
        if (_D22_Detector_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _D22_Detector_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_D22_Detector_var._position_relative, _D22_Detector_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Monitor_nD_trace(&_D22_Detector_var, _particle); /* contains EXTEND code */
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // D22_Detector_vessel
    if (!ABSORBED && _particle->_index == 316) {
#ifndef MULTICORE
        if (_D22_Detector_vessel_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _D22_Detector_vessel_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_D22_Detector_vessel_var._position_relative, _D22_Detector_vessel_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Shape_trace(&_D22_Detector_vessel_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // BOG
    if (!ABSORBED && _particle->_index == 317) {
#ifndef MULTICORE
        if (_BOG_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _BOG_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_BOG_var._position_relative, _BOG_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Shape_trace(&_BOG_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H53_ThALES_Drum
    if (!ABSORBED && _particle->_index == 318) {
#ifndef MULTICORE
        if (_H53_ThALES_Drum_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H53_ThALES_Drum_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H53_ThALES_Drum_var._position_relative, _H53_ThALES_Drum_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Shape_trace(&_H53_ThALES_Drum_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_D16_Drum
    if (!ABSORBED && _particle->_index == 319) {
#ifndef MULTICORE
        if (_H521_D16_Drum_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_D16_Drum_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_D16_Drum_var._position_relative, _H521_D16_Drum_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Shape_trace(&_H521_D16_Drum_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H521_SADAM_Drum
    if (!ABSORBED && _particle->_index == 320) {
#ifndef MULTICORE
        if (_H521_SADAM_Drum_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H521_SADAM_Drum_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H521_SADAM_Drum_var._position_relative, _H521_SADAM_Drum_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Shape_trace(&_H521_SADAM_Drum_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // Traversee
    if (!ABSORBED && _particle->_index == 321) {
#ifndef MULTICORE
        if (_Traversee_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _Traversee_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_Traversee_var._position_relative, _Traversee_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Shape_trace(&_Traversee_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // Core_Centre
    if (!ABSORBED && _particle->_index == 322) {
        _particle->_index++;
      }

      // Core
    if (!ABSORBED && _particle->_index == 323) {
#ifndef MULTICORE
        if (_Core_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _Core_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_Core_var._position_relative, _Core_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Shape_trace(&_Core_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // D2O_Vessel
    if (!ABSORBED && _particle->_index == 324) {
#ifndef MULTICORE
        if (_D2O_Vessel_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _D2O_Vessel_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_D2O_Vessel_var._position_relative, _D2O_Vessel_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Shape_trace(&_D2O_Vessel_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

      // H2O_Vessel
    if (!ABSORBED && _particle->_index == 325) {
#ifndef MULTICORE
        if (_H2O_Vessel_var._rotation_is_identity)
          coords_get(coords_add(coords_set(x,y,z), _H2O_Vessel_var._position_relative),&x, &y, &z);
        else
#endif
          mccoordschange(_H2O_Vessel_var._position_relative, _H2O_Vessel_var._rotation_relative, _particle);
        _particle_save = *_particle;
        class_Shape_trace(&_H2O_Vessel_var, _particle);
        if (_particle->_restore)
        particle_restore(_particle, &_particle_save);
        _particle->_index++;
      }

    }

    // jump to next viable seed
    seed = seed + gpu_innerloop;
  } // outer loop / particle batches

  free(particles);
  free(pbuffer);

  printf("\n");
} /* raytrace_all_funnel */
#endif // FUNNEL

#undef flag
#undef ncol_25
#undef nrow_25
#undef ncol_37
#undef nrow_37
#undef ncol_114
#undef nrow_114
#undef ncol_130
#undef nrow_130
#undef x
#undef y
#undef z
#undef vx
#undef vy
#undef vz
#undef t
#undef sx
#undef sy
#undef sz
#undef p
#undef mcgravitation
#undef mcMagnet
#undef allow_backprop
#undef _mctmp_a
#undef _mctmp_b
#undef _mctmp_c
#ifdef OPENACC
#undef strlen
#undef strcmp
#undef exit
#undef printf
#undef sprintf
#undef fprintf
#endif
#undef SCATTERED
#undef RESTORE
#undef RESTORE_NEUTRON
#undef STORE_NEUTRON
#undef ABSORBED
#undef ABSORB
#undef ABSORB0
/* *****************************************************************************
* instrument 'ILL_H5_new' and components SAVE
***************************************************************************** */

_class_Progress_bar *class_Progress_bar_save(_class_Progress_bar *_comp
) {
  #define profile (_comp->_parameters.profile)
  #define percent (_comp->_parameters.percent)
  #define flag_save (_comp->_parameters.flag_save)
  #define minutes (_comp->_parameters.minutes)
  #define IntermediateCnts (_comp->_parameters.IntermediateCnts)
  #define StartTime (_comp->_parameters.StartTime)
  #define EndTime (_comp->_parameters.EndTime)
  #define CurrentTime (_comp->_parameters.CurrentTime)
  #define infostring (_comp->_parameters.infostring)
  SIG_MESSAGE("[_Origin_save] component Origin=Progress_bar() SAVE [Progress_bar:0]");

  MPI_MASTER (fprintf (stdout, "\nSave [%s]\n", instrument_name););
  if (profile && strlen (profile) && strcmp (profile, "NULL") && strcmp (profile, "0")) {
    char filename[256];
    if (!strlen (profile) || !strcmp (profile, "NULL") || !strcmp (profile, "0"))
      strcpy (filename, instrument_name);
    else
      strcpy (filename, profile);
    DETECTOR_OUT_1D ("Intensity profiler", "Component index [1]", "Intensity", "prof", 1, mcNUMCOMP, mcNUMCOMP - 1, &(instrument->counter_N[1]),
                     &(instrument->counter_P[1]), &(instrument->counter_P2[1]), filename);
  }
  #undef profile
  #undef percent
  #undef flag_save
  #undef minutes
  #undef IntermediateCnts
  #undef StartTime
  #undef EndTime
  #undef CurrentTime
  #undef infostring
  return(_comp);
} /* class_Progress_bar_save */

_class_Monitor_nD *class_Monitor_nD_save(_class_Monitor_nD *_comp
) {
  #define user1 (_comp->_parameters.user1)
  #define user2 (_comp->_parameters.user2)
  #define user3 (_comp->_parameters.user3)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define zdepth (_comp->_parameters.zdepth)
  #define xmin (_comp->_parameters.xmin)
  #define xmax (_comp->_parameters.xmax)
  #define ymin (_comp->_parameters.ymin)
  #define ymax (_comp->_parameters.ymax)
  #define zmin (_comp->_parameters.zmin)
  #define zmax (_comp->_parameters.zmax)
  #define bins (_comp->_parameters.bins)
  #define min (_comp->_parameters.min)
  #define max (_comp->_parameters.max)
  #define restore_neutron (_comp->_parameters.restore_neutron)
  #define radius (_comp->_parameters.radius)
  #define options (_comp->_parameters.options)
  #define filename (_comp->_parameters.filename)
  #define geometry (_comp->_parameters.geometry)
  #define nowritefile (_comp->_parameters.nowritefile)
  #define nexus_bins (_comp->_parameters.nexus_bins)
  #define username1 (_comp->_parameters.username1)
  #define username2 (_comp->_parameters.username2)
  #define username3 (_comp->_parameters.username3)
  #define DEFS (_comp->_parameters.DEFS)
  #define Vars (_comp->_parameters.Vars)
  #define detector (_comp->_parameters.detector)
  #define offdata (_comp->_parameters.offdata)
  SIG_MESSAGE("[_H5_save] component H5=Monitor_nD() SAVE [Monitor_nD:0]");

  if (!nowritefile) {
    /* save results, but do not free pointers */
    detector = Monitor_nD_Save (&DEFS, &Vars);
  }
  #undef user1
  #undef user2
  #undef user3
  #undef xwidth
  #undef yheight
  #undef zdepth
  #undef xmin
  #undef xmax
  #undef ymin
  #undef ymax
  #undef zmin
  #undef zmax
  #undef bins
  #undef min
  #undef max
  #undef restore_neutron
  #undef radius
  #undef options
  #undef filename
  #undef geometry
  #undef nowritefile
  #undef nexus_bins
  #undef username1
  #undef username2
  #undef username3
  #undef DEFS
  #undef Vars
  #undef detector
  #undef offdata
  return(_comp);
} /* class_Monitor_nD_save */

_class_Monitor *class_Monitor_save(_class_Monitor *_comp
) {
  #define xmin (_comp->_parameters.xmin)
  #define xmax (_comp->_parameters.xmax)
  #define ymin (_comp->_parameters.ymin)
  #define ymax (_comp->_parameters.ymax)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define restore_neutron (_comp->_parameters.restore_neutron)
  #define Nsum (_comp->_parameters.Nsum)
  #define psum (_comp->_parameters.psum)
  #define p2sum (_comp->_parameters.p2sum)
  SIG_MESSAGE("[_He3H_save] component He3H=Monitor() SAVE [Monitor:0]");

  char title[1024];
  sprintf (title, "Single monitor %s", NAME_CURRENT_COMP);
  DETECTOR_OUT_0D (title, Nsum, psum, p2sum);
  #undef xmin
  #undef xmax
  #undef ymin
  #undef ymax
  #undef xwidth
  #undef yheight
  #undef restore_neutron
  #undef Nsum
  #undef psum
  #undef p2sum
  return(_comp);
} /* class_Monitor_save */



int save(FILE *handle) { /* called by mccode_main for ILL_H5_new:SAVE */
  if (!handle) siminfo_init(NULL);

  /* call iteratively all components SAVE */
  class_Progress_bar_save(&_Origin_var);







  class_Monitor_nD_save(&_H5_var);


  class_Monitor_nD_save(&_H53_origin_var);

  class_Monitor_nD_save(&_H52_origin_var);

  class_Monitor_nD_save(&_H51_origin_var);






  class_Monitor_nD_save(&_H53_Obt_Out_var);






  class_Monitor_nD_save(&_H53_ThALES_Monochromator_Cradle_var);




  class_Monitor_nD_save(&_H53_ThALES_Sample_Div_var);

  class_Monitor_nD_save(&_H53_ThALES_Sample_XY_var);

  class_Monitor_nD_save(&_H53_ThALES_Sample_L_var);


  class_Monitor_nD_save(&_H53_ThALES_Spectrometer_var);

  class_Monitor_nD_save(&_H53_ThALES_Diffractometer_var);







  class_Monitor_save(&_He3H_var);


  class_Monitor_nD_save(&_H53_ThALES_TransmitXY_var);







  class_Monitor_nD_save(&_H52_Obt_Out_var);
















  class_Monitor_nD_save(&_H52_Common_Out_var);

  class_Monitor_nD_save(&_H523_origin_var);

  class_Monitor_nD_save(&_H521_origin_var);

  class_Monitor_nD_save(&_H522_origin_var);















  class_Monitor_nD_save(&_H521_VTE_var);


























  class_Monitor_nD_save(&_H521_Curved_Out_var);


  class_Monitor_nD_save(&_H521_Straight_Out_var);


  class_Monitor_nD_save(&_H521_D16_Monochromator_Cradle_var);




  class_Monitor_nD_save(&_H521_D16_Sample_Div_var);

  class_Monitor_nD_save(&_H521_D16_Sample_XY_var);

  class_Monitor_nD_save(&_H521_D16_Sample_L_var);


  class_Monitor_nD_save(&_H521_D16_Detector_var);

  class_Monitor_nD_save(&_H521_D16_Spectrometer_var);

  class_Monitor_nD_save(&_H521_D16_Diffractometer_var);






  class_Monitor_nD_save(&_H521_SADAM_Monochromator_Cradle_var);



  class_Monitor_nD_save(&_H521_SADAM_Sample_Div_var);

  class_Monitor_nD_save(&_H521_SADAM_Sample_XY_var);

  class_Monitor_nD_save(&_H521_SADAM_Sample_L_var);


  class_Monitor_nD_save(&_H521_SADAM_Detector_var);

  class_Monitor_nD_save(&_H521_SADAM_Spectrometer_var);

  class_Monitor_nD_save(&_H521_SADAM_Diffractometer_var);













  class_Monitor_nD_save(&_H522_VTE_var);




























  class_Monitor_nD_save(&_H522_Curved_Out_XY_var);

  class_Monitor_nD_save(&_H522_Curved_Out_XL_var);





  class_Monitor_nD_save(&_H522_Vsel_L_var);




  class_Monitor_nD_save(&_H522_mirror_ReflectXY_var);

  class_Monitor_nD_save(&_H522_mirror_TransmitXY_var);

  class_Monitor_nD_save(&_H522_mirror_outdXY_var);



  class_Monitor_nD_save(&_H522_WASP_Sample_Div_var);

  class_Monitor_nD_save(&_H522_WASP_Sample_XY_var);

  class_Monitor_nD_save(&_H522_WASP_Sample_L_var);


  class_Monitor_nD_save(&_H522_WASP_Detector_var);

  class_Monitor_nD_save(&_H522_WASP_Spectrometer_var);

  class_Monitor_nD_save(&_H522_WASP_Diffractometer_var);








  class_Monitor_nD_save(&_H523_VTE_var);
























  class_Monitor_nD_save(&_H523_CryoEDM_In_L_var);




  class_Monitor_nD_save(&_H523_CryoEDM_mirror_ReflectXY_var);

  class_Monitor_nD_save(&_H523_CryoEDM_mirror_TransmitXY_var);

  class_Monitor_nD_save(&_H523_CryoEDM_Sample_L_var);

  class_Monitor_nD_save(&_H523_CryoEDM_Sample_Div_var);

  class_Monitor_nD_save(&_H523_CryoEDM_Sample_XY_var);







  class_Monitor_nD_save(&_H51_Obt_Out_var);






  class_Monitor_nD_save(&_H51_S2_Out_var);

  class_Monitor_nD_save(&_H51_split_2_var);

  class_Monitor_nD_save(&_H51_split_1_var);





  class_Monitor_nD_save(&_H511_mirror_ReflectXY_var);

  class_Monitor_nD_save(&_H511_mirror_TransmitXY_var);

  class_Monitor_nD_save(&_H511_mirror_outdXY_var);




  class_Monitor_nD_save(&_H511_VTE_var);







  class_Monitor_nD_save(&_H511_IN15_Sample_Div_var);

  class_Monitor_nD_save(&_H511_IN15_Sample_XY_var);

  class_Monitor_nD_save(&_H511_IN15_Sample_L_var);


  class_Monitor_nD_save(&_H511_IN15_Detector_var);

  class_Monitor_nD_save(&_H511_IN15_Spectrometer_var);

  class_Monitor_nD_save(&_H511_IN15_Diffractometer_var);



















  class_Monitor_nD_save(&_H512_VTE_var);









  class_Monitor_nD_save(&_D22_PreV_var);




  class_Monitor_nD_save(&_H51_D22_Sample_Div_var);

  class_Monitor_nD_save(&_H51_D22_Sample_XY_var);

  class_Monitor_nD_save(&_H51_D22_Sample_L_var);


  class_Monitor_nD_save(&_D22_Detector_var);











  if (!handle) siminfo_close(); 

  return(0);
} /* save */

/* *****************************************************************************
* instrument 'ILL_H5_new' and components FINALLY
***************************************************************************** */

_class_Progress_bar *class_Progress_bar_finally(_class_Progress_bar *_comp
) {
  #define profile (_comp->_parameters.profile)
  #define percent (_comp->_parameters.percent)
  #define flag_save (_comp->_parameters.flag_save)
  #define minutes (_comp->_parameters.minutes)
  #define IntermediateCnts (_comp->_parameters.IntermediateCnts)
  #define StartTime (_comp->_parameters.StartTime)
  #define EndTime (_comp->_parameters.EndTime)
  #define CurrentTime (_comp->_parameters.CurrentTime)
  #define infostring (_comp->_parameters.infostring)
  SIG_MESSAGE("[_Origin_finally] component Origin=Progress_bar() FINALLY [Progress_bar:0]");

  time_t NowTime;
  time (&NowTime);
  fprintf (stdout, "\nFinally [%s: %s]. Time: ", instrument_name, dirname ? dirname : ".");
  if (difftime (NowTime, StartTime) < 60.0)
    fprintf (stdout, "%g [s] ", difftime (NowTime, StartTime));
  else if (difftime (NowTime, StartTime) > 3600.0)
    fprintf (stdout, "%g [h] ", difftime (NowTime, StartTime) / 3600.0);
  else
    fprintf (stdout, "%g [min] ", difftime (NowTime, StartTime) / 60.0);
  fprintf (stdout, "\n");
  #undef profile
  #undef percent
  #undef flag_save
  #undef minutes
  #undef IntermediateCnts
  #undef StartTime
  #undef EndTime
  #undef CurrentTime
  #undef infostring
  return(_comp);
} /* class_Progress_bar_finally */

_class_Source_gen *class_Source_gen_finally(_class_Source_gen *_comp
) {
  #define flux_file (_comp->_parameters.flux_file)
  #define xdiv_file (_comp->_parameters.xdiv_file)
  #define ydiv_file (_comp->_parameters.ydiv_file)
  #define radius (_comp->_parameters.radius)
  #define dist (_comp->_parameters.dist)
  #define focus_xw (_comp->_parameters.focus_xw)
  #define focus_yh (_comp->_parameters.focus_yh)
  #define focus_aw (_comp->_parameters.focus_aw)
  #define focus_ah (_comp->_parameters.focus_ah)
  #define E0 (_comp->_parameters.E0)
  #define dE (_comp->_parameters.dE)
  #define lambda0 (_comp->_parameters.lambda0)
  #define dlambda (_comp->_parameters.dlambda)
  #define I1 (_comp->_parameters.I1)
  #define yheight (_comp->_parameters.yheight)
  #define xwidth (_comp->_parameters.xwidth)
  #define verbose (_comp->_parameters.verbose)
  #define T1 (_comp->_parameters.T1)
  #define flux_file_perAA (_comp->_parameters.flux_file_perAA)
  #define flux_file_log (_comp->_parameters.flux_file_log)
  #define Lmin (_comp->_parameters.Lmin)
  #define Lmax (_comp->_parameters.Lmax)
  #define Emin (_comp->_parameters.Emin)
  #define Emax (_comp->_parameters.Emax)
  #define T2 (_comp->_parameters.T2)
  #define I2 (_comp->_parameters.I2)
  #define T3 (_comp->_parameters.T3)
  #define I3 (_comp->_parameters.I3)
  #define zdepth (_comp->_parameters.zdepth)
  #define target_index (_comp->_parameters.target_index)
  #define p_in (_comp->_parameters.p_in)
  #define lambda1 (_comp->_parameters.lambda1)
  #define lambda2 (_comp->_parameters.lambda2)
  #define lambda3 (_comp->_parameters.lambda3)
  #define pTable (_comp->_parameters.pTable)
  #define pTable_x (_comp->_parameters.pTable_x)
  #define pTable_y (_comp->_parameters.pTable_y)
  #define pTable_xmin (_comp->_parameters.pTable_xmin)
  #define pTable_xmax (_comp->_parameters.pTable_xmax)
  #define pTable_xsum (_comp->_parameters.pTable_xsum)
  #define pTable_ymin (_comp->_parameters.pTable_ymin)
  #define pTable_ymax (_comp->_parameters.pTable_ymax)
  #define pTable_ysum (_comp->_parameters.pTable_ysum)
  #define pTable_dxmin (_comp->_parameters.pTable_dxmin)
  #define pTable_dxmax (_comp->_parameters.pTable_dxmax)
  #define pTable_dymin (_comp->_parameters.pTable_dymin)
  #define pTable_dymax (_comp->_parameters.pTable_dymax)
  SIG_MESSAGE("[_HCS_finally] component HCS=Source_gen() FINALLY [Source_gen:0]");

  Table_Free(&pTable);
  Table_Free(&pTable_x);
  Table_Free(&pTable_y);
  #undef flux_file
  #undef xdiv_file
  #undef ydiv_file
  #undef radius
  #undef dist
  #undef focus_xw
  #undef focus_yh
  #undef focus_aw
  #undef focus_ah
  #undef E0
  #undef dE
  #undef lambda0
  #undef dlambda
  #undef I1
  #undef yheight
  #undef xwidth
  #undef verbose
  #undef T1
  #undef flux_file_perAA
  #undef flux_file_log
  #undef Lmin
  #undef Lmax
  #undef Emin
  #undef Emax
  #undef T2
  #undef I2
  #undef T3
  #undef I3
  #undef zdepth
  #undef target_index
  #undef p_in
  #undef lambda1
  #undef lambda2
  #undef lambda3
  #undef pTable
  #undef pTable_x
  #undef pTable_y
  #undef pTable_xmin
  #undef pTable_xmax
  #undef pTable_xsum
  #undef pTable_ymin
  #undef pTable_ymax
  #undef pTable_ysum
  #undef pTable_dxmin
  #undef pTable_dxmax
  #undef pTable_dymin
  #undef pTable_dymax
  return(_comp);
} /* class_Source_gen_finally */

_class_PowderN *class_PowderN_finally(_class_PowderN *_comp
) {
  #define reflections (_comp->_parameters.reflections)
  #define geometry (_comp->_parameters.geometry)
  #define format (_comp->_parameters.format)
  #define radius (_comp->_parameters.radius)
  #define yheight (_comp->_parameters.yheight)
  #define xwidth (_comp->_parameters.xwidth)
  #define zdepth (_comp->_parameters.zdepth)
  #define thickness (_comp->_parameters.thickness)
  #define pack (_comp->_parameters.pack)
  #define Vc (_comp->_parameters.Vc)
  #define sigma_abs (_comp->_parameters.sigma_abs)
  #define sigma_inc (_comp->_parameters.sigma_inc)
  #define delta_d_d (_comp->_parameters.delta_d_d)
  #define p_inc (_comp->_parameters.p_inc)
  #define p_transmit (_comp->_parameters.p_transmit)
  #define DW (_comp->_parameters.DW)
  #define nb_atoms (_comp->_parameters.nb_atoms)
  #define d_omega (_comp->_parameters.d_omega)
  #define d_phi (_comp->_parameters.d_phi)
  #define tth_sign (_comp->_parameters.tth_sign)
  #define p_interact (_comp->_parameters.p_interact)
  #define concentric (_comp->_parameters.concentric)
  #define density (_comp->_parameters.density)
  #define weight (_comp->_parameters.weight)
  #define barns (_comp->_parameters.barns)
  #define Strain (_comp->_parameters.Strain)
  #define focus_flip (_comp->_parameters.focus_flip)
  #define target_index (_comp->_parameters.target_index)
  #define order (_comp->_parameters.order)
  #define line_info (_comp->_parameters.line_info)
  #define columns (_comp->_parameters.columns)
  #define offdata (_comp->_parameters.offdata)
  #define tgt_x (_comp->_parameters.tgt_x)
  #define tgt_y (_comp->_parameters.tgt_y)
  #define tgt_z (_comp->_parameters.tgt_z)
  SIG_MESSAGE("[_HCS_Al_finally] component HCS_Al=PowderN() FINALLY [PowderN:0]");

  free (line_info.list);
  free (line_info.q_v);
  free (line_info.w_v);
  free (line_info.my_s_v2);
  MPI_MASTER (if (line_info.flag_warning)
                  printf ("PowderN: %s: Error messages were repeated %i times with absorbed neutrons.\n", NAME_CURRENT_COMP, line_info.flag_warning);

              /* in case this instance is used in a SPLIT, we can recommend the
                 optimal iteration value */
              if (line_info.nb_refl_count) {
                double split_iterations = (double)line_info.nb_reuses / line_info.nb_refl_count + 1;
                double split_optimal = (double)line_info.nb_refl / line_info.nb_refl_count;
                if (split_optimal > split_iterations + 5)
                  printf ("PowderN: %s: Info: you may highly improve the computation efficiency by using\n"
                          "    SPLIT %i COMPONENT %s=PowderN(...)\n"
                          "  in the instrument description %s.\n",
                          NAME_CURRENT_COMP, (int)split_optimal, NAME_CURRENT_COMP, instrument_source);
              });
  #undef reflections
  #undef geometry
  #undef format
  #undef radius
  #undef yheight
  #undef xwidth
  #undef zdepth
  #undef thickness
  #undef pack
  #undef Vc
  #undef sigma_abs
  #undef sigma_inc
  #undef delta_d_d
  #undef p_inc
  #undef p_transmit
  #undef DW
  #undef nb_atoms
  #undef d_omega
  #undef d_phi
  #undef tth_sign
  #undef p_interact
  #undef concentric
  #undef density
  #undef weight
  #undef barns
  #undef Strain
  #undef focus_flip
  #undef target_index
  #undef order
  #undef line_info
  #undef columns
  #undef offdata
  #undef tgt_x
  #undef tgt_y
  #undef tgt_z
  return(_comp);
} /* class_PowderN_finally */

_class_Monitor_nD *class_Monitor_nD_finally(_class_Monitor_nD *_comp
) {
  #define user1 (_comp->_parameters.user1)
  #define user2 (_comp->_parameters.user2)
  #define user3 (_comp->_parameters.user3)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define zdepth (_comp->_parameters.zdepth)
  #define xmin (_comp->_parameters.xmin)
  #define xmax (_comp->_parameters.xmax)
  #define ymin (_comp->_parameters.ymin)
  #define ymax (_comp->_parameters.ymax)
  #define zmin (_comp->_parameters.zmin)
  #define zmax (_comp->_parameters.zmax)
  #define bins (_comp->_parameters.bins)
  #define min (_comp->_parameters.min)
  #define max (_comp->_parameters.max)
  #define restore_neutron (_comp->_parameters.restore_neutron)
  #define radius (_comp->_parameters.radius)
  #define options (_comp->_parameters.options)
  #define filename (_comp->_parameters.filename)
  #define geometry (_comp->_parameters.geometry)
  #define nowritefile (_comp->_parameters.nowritefile)
  #define nexus_bins (_comp->_parameters.nexus_bins)
  #define username1 (_comp->_parameters.username1)
  #define username2 (_comp->_parameters.username2)
  #define username3 (_comp->_parameters.username3)
  #define DEFS (_comp->_parameters.DEFS)
  #define Vars (_comp->_parameters.Vars)
  #define detector (_comp->_parameters.detector)
  #define offdata (_comp->_parameters.offdata)
  SIG_MESSAGE("[_H5_finally] component H5=Monitor_nD() FINALLY [Monitor_nD:0]");

  /* free pointers */
  Monitor_nD_Finally (&DEFS, &Vars);
  #undef user1
  #undef user2
  #undef user3
  #undef xwidth
  #undef yheight
  #undef zdepth
  #undef xmin
  #undef xmax
  #undef ymin
  #undef ymax
  #undef zmin
  #undef zmax
  #undef bins
  #undef min
  #undef max
  #undef restore_neutron
  #undef radius
  #undef options
  #undef filename
  #undef geometry
  #undef nowritefile
  #undef nexus_bins
  #undef username1
  #undef username2
  #undef username3
  #undef DEFS
  #undef Vars
  #undef detector
  #undef offdata
  return(_comp);
} /* class_Monitor_nD_finally */

_class_Guide_gravity *class_Guide_gravity_finally(_class_Guide_gravity *_comp
) {
  #define w1 (_comp->_parameters.w1)
  #define h1 (_comp->_parameters.h1)
  #define w2 (_comp->_parameters.w2)
  #define h2 (_comp->_parameters.h2)
  #define l (_comp->_parameters.l)
  #define R0 (_comp->_parameters.R0)
  #define Qc (_comp->_parameters.Qc)
  #define alpha (_comp->_parameters.alpha)
  #define m (_comp->_parameters.m)
  #define W (_comp->_parameters.W)
  #define nslit (_comp->_parameters.nslit)
  #define d (_comp->_parameters.d)
  #define mleft (_comp->_parameters.mleft)
  #define mright (_comp->_parameters.mright)
  #define mtop (_comp->_parameters.mtop)
  #define mbottom (_comp->_parameters.mbottom)
  #define nhslit (_comp->_parameters.nhslit)
  #define G (_comp->_parameters.G)
  #define aleft (_comp->_parameters.aleft)
  #define aright (_comp->_parameters.aright)
  #define atop (_comp->_parameters.atop)
  #define abottom (_comp->_parameters.abottom)
  #define wavy (_comp->_parameters.wavy)
  #define wavy_z (_comp->_parameters.wavy_z)
  #define wavy_tb (_comp->_parameters.wavy_tb)
  #define wavy_lr (_comp->_parameters.wavy_lr)
  #define chamfers (_comp->_parameters.chamfers)
  #define chamfers_z (_comp->_parameters.chamfers_z)
  #define chamfers_lr (_comp->_parameters.chamfers_lr)
  #define chamfers_tb (_comp->_parameters.chamfers_tb)
  #define nelements (_comp->_parameters.nelements)
  #define nu (_comp->_parameters.nu)
  #define phase (_comp->_parameters.phase)
  #define reflect (_comp->_parameters.reflect)
  #define GVarsGlobal (_comp->_parameters.GVarsGlobal)
  #define pTable (_comp->_parameters.pTable)
  #define table_present (_comp->_parameters.table_present)
  SIG_MESSAGE("[_H5_rect_finally] component H5_rect=Guide_gravity() FINALLY [Guide_gravity:0]");

  if (GVarsGlobal.warnings > 100) {
    fprintf (stderr, "%s: warning: neutron has entered guide, but can not exit !\n", GVarsGlobal.compcurname);
    fprintf (stderr, "%s: warning: This message has been repeated %g times\n", GVarsGlobal.compcurname, GVarsGlobal.warnings);
  }
  #undef w1
  #undef h1
  #undef w2
  #undef h2
  #undef l
  #undef R0
  #undef Qc
  #undef alpha
  #undef m
  #undef W
  #undef nslit
  #undef d
  #undef mleft
  #undef mright
  #undef mtop
  #undef mbottom
  #undef nhslit
  #undef G
  #undef aleft
  #undef aright
  #undef atop
  #undef abottom
  #undef wavy
  #undef wavy_z
  #undef wavy_tb
  #undef wavy_lr
  #undef chamfers
  #undef chamfers_z
  #undef chamfers_lr
  #undef chamfers_tb
  #undef nelements
  #undef nu
  #undef phase
  #undef reflect
  #undef GVarsGlobal
  #undef pTable
  #undef table_present
  return(_comp);
} /* class_Guide_gravity_finally */

_class_Guide_tapering *class_Guide_tapering_finally(_class_Guide_tapering *_comp
) {
  #define option (_comp->_parameters.option)
  #define w1 (_comp->_parameters.w1)
  #define h1 (_comp->_parameters.h1)
  #define l (_comp->_parameters.l)
  #define linw (_comp->_parameters.linw)
  #define loutw (_comp->_parameters.loutw)
  #define linh (_comp->_parameters.linh)
  #define louth (_comp->_parameters.louth)
  #define R0 (_comp->_parameters.R0)
  #define Qcx (_comp->_parameters.Qcx)
  #define Qcy (_comp->_parameters.Qcy)
  #define alphax (_comp->_parameters.alphax)
  #define alphay (_comp->_parameters.alphay)
  #define W (_comp->_parameters.W)
  #define mx (_comp->_parameters.mx)
  #define my (_comp->_parameters.my)
  #define segno (_comp->_parameters.segno)
  #define curvature (_comp->_parameters.curvature)
  #define curvature_v (_comp->_parameters.curvature_v)
  #define w1c (_comp->_parameters.w1c)
  #define w2c (_comp->_parameters.w2c)
  #define ww (_comp->_parameters.ww)
  #define hh (_comp->_parameters.hh)
  #define whalf (_comp->_parameters.whalf)
  #define hhalf (_comp->_parameters.hhalf)
  #define lwhalf (_comp->_parameters.lwhalf)
  #define lhhalf (_comp->_parameters.lhhalf)
  #define h1_in (_comp->_parameters.h1_in)
  #define h2_out (_comp->_parameters.h2_out)
  #define w1_in (_comp->_parameters.w1_in)
  #define w2_out (_comp->_parameters.w2_out)
  #define l_seg (_comp->_parameters.l_seg)
  #define h12 (_comp->_parameters.h12)
  #define h2 (_comp->_parameters.h2)
  #define w12 (_comp->_parameters.w12)
  #define w2 (_comp->_parameters.w2)
  #define a_ell_q (_comp->_parameters.a_ell_q)
  #define b_ell_q (_comp->_parameters.b_ell_q)
  #define lbw (_comp->_parameters.lbw)
  #define lbh (_comp->_parameters.lbh)
  #define mxi (_comp->_parameters.mxi)
  #define u1 (_comp->_parameters.u1)
  #define u2 (_comp->_parameters.u2)
  #define div1 (_comp->_parameters.div1)
  #define p2_para (_comp->_parameters.p2_para)
  #define test (_comp->_parameters.test)
  #define Div1 (_comp->_parameters.Div1)
  #define seg (_comp->_parameters.seg)
  #define fu (_comp->_parameters.fu)
  #define pos (_comp->_parameters.pos)
  #define file_name (_comp->_parameters.file_name)
  #define ep (_comp->_parameters.ep)
  #define num (_comp->_parameters.num)
  #define rotation_h (_comp->_parameters.rotation_h)
  #define rotation_v (_comp->_parameters.rotation_v)
  SIG_MESSAGE("[_H53_Nose_finally] component H53_Nose=Guide_tapering() FINALLY [Guide_tapering:0]");

  free (w1c);
  free (w2c);
  free (ww);
  free (hh);
  free (whalf);
  free (hhalf);
  free (lwhalf);
  free (lhhalf);
  free (h1_in);
  free (h2_out);
  free (w1_in);
  free (w2_out);
  #undef option
  #undef w1
  #undef h1
  #undef l
  #undef linw
  #undef loutw
  #undef linh
  #undef louth
  #undef R0
  #undef Qcx
  #undef Qcy
  #undef alphax
  #undef alphay
  #undef W
  #undef mx
  #undef my
  #undef segno
  #undef curvature
  #undef curvature_v
  #undef w1c
  #undef w2c
  #undef ww
  #undef hh
  #undef whalf
  #undef hhalf
  #undef lwhalf
  #undef lhhalf
  #undef h1_in
  #undef h2_out
  #undef w1_in
  #undef w2_out
  #undef l_seg
  #undef h12
  #undef h2
  #undef w12
  #undef w2
  #undef a_ell_q
  #undef b_ell_q
  #undef lbw
  #undef lbh
  #undef mxi
  #undef u1
  #undef u2
  #undef div1
  #undef p2_para
  #undef test
  #undef Div1
  #undef seg
  #undef fu
  #undef pos
  #undef file_name
  #undef ep
  #undef num
  #undef rotation_h
  #undef rotation_v
  return(_comp);
} /* class_Guide_tapering_finally */

_class_Monochromator_curved *class_Monochromator_curved_finally(_class_Monochromator_curved *_comp
) {
  #define reflect (_comp->_parameters.reflect)
  #define transmit (_comp->_parameters.transmit)
  #define zwidth (_comp->_parameters.zwidth)
  #define yheight (_comp->_parameters.yheight)
  #define gap (_comp->_parameters.gap)
  #define NH (_comp->_parameters.NH)
  #define NV (_comp->_parameters.NV)
  #define mosaich (_comp->_parameters.mosaich)
  #define mosaicv (_comp->_parameters.mosaicv)
  #define r0 (_comp->_parameters.r0)
  #define t0 (_comp->_parameters.t0)
  #define Q (_comp->_parameters.Q)
  #define RV (_comp->_parameters.RV)
  #define RH (_comp->_parameters.RH)
  #define DM (_comp->_parameters.DM)
  #define mosaic (_comp->_parameters.mosaic)
  #define width (_comp->_parameters.width)
  #define height (_comp->_parameters.height)
  #define verbose (_comp->_parameters.verbose)
  #define order (_comp->_parameters.order)
  #define mos_rms_y (_comp->_parameters.mos_rms_y)
  #define mos_rms_z (_comp->_parameters.mos_rms_z)
  #define mos_rms_max (_comp->_parameters.mos_rms_max)
  #define mono_Q (_comp->_parameters.mono_Q)
  #define SlabWidth (_comp->_parameters.SlabWidth)
  #define SlabHeight (_comp->_parameters.SlabHeight)
  #define rTable (_comp->_parameters.rTable)
  #define tTable (_comp->_parameters.tTable)
  #define rTableFlag (_comp->_parameters.rTableFlag)
  #define tTableFlag (_comp->_parameters.tTableFlag)
  #define tiltH (_comp->_parameters.tiltH)
  #define tiltV (_comp->_parameters.tiltV)
  #define ncol_var (_comp->_parameters.ncol_var)
  #define nrow_var (_comp->_parameters.nrow_var)
  SIG_MESSAGE("[_H53_ThALES_Monochromator_finally] component H53_ThALES_Monochromator=Monochromator_curved() FINALLY [Monochromator_curved:0]");

  if (rTableFlag) {
    Table_Free (&rTable);
  }
  if (tTableFlag) {
    Table_Free (&tTable);
  }
  if (tiltH)
    free (tiltH);
  if (tiltV)
    free (tiltV);
  #undef reflect
  #undef transmit
  #undef zwidth
  #undef yheight
  #undef gap
  #undef NH
  #undef NV
  #undef mosaich
  #undef mosaicv
  #undef r0
  #undef t0
  #undef Q
  #undef RV
  #undef RH
  #undef DM
  #undef mosaic
  #undef width
  #undef height
  #undef verbose
  #undef order
  #undef mos_rms_y
  #undef mos_rms_z
  #undef mos_rms_max
  #undef mono_Q
  #undef SlabWidth
  #undef SlabHeight
  #undef rTable
  #undef tTable
  #undef rTableFlag
  #undef tTableFlag
  #undef tiltH
  #undef tiltV
  #undef ncol_var
  #undef nrow_var
  return(_comp);
} /* class_Monochromator_curved_finally */

_class_Isotropic_Sqw *class_Isotropic_Sqw_finally(_class_Isotropic_Sqw *_comp
) {
  #define powder_format (_comp->_parameters.powder_format)
  #define Sqw_coh (_comp->_parameters.Sqw_coh)
  #define Sqw_inc (_comp->_parameters.Sqw_inc)
  #define geometry (_comp->_parameters.geometry)
  #define radius (_comp->_parameters.radius)
  #define thickness (_comp->_parameters.thickness)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define zdepth (_comp->_parameters.zdepth)
  #define threshold (_comp->_parameters.threshold)
  #define order (_comp->_parameters.order)
  #define T (_comp->_parameters.T)
  #define verbose (_comp->_parameters.verbose)
  #define d_phi (_comp->_parameters.d_phi)
  #define concentric (_comp->_parameters.concentric)
  #define rho (_comp->_parameters.rho)
  #define sigma_abs (_comp->_parameters.sigma_abs)
  #define sigma_coh (_comp->_parameters.sigma_coh)
  #define sigma_inc (_comp->_parameters.sigma_inc)
  #define classical (_comp->_parameters.classical)
  #define powder_Dd (_comp->_parameters.powder_Dd)
  #define powder_DW (_comp->_parameters.powder_DW)
  #define powder_Vc (_comp->_parameters.powder_Vc)
  #define density (_comp->_parameters.density)
  #define weight (_comp->_parameters.weight)
  #define p_interact (_comp->_parameters.p_interact)
  #define norm (_comp->_parameters.norm)
  #define powder_barns (_comp->_parameters.powder_barns)
  #define quantum_correction (_comp->_parameters.quantum_correction)
  #define VarSqw (_comp->_parameters.VarSqw)
  #define columns (_comp->_parameters.columns)
  #define offdata (_comp->_parameters.offdata)
  SIG_MESSAGE("[_H53_ThALES_Sample_finally] component H53_ThALES_Sample=Isotropic_Sqw() FINALLY [Isotropic_Sqw:0]");

  int k;

  if (VarSqw.s_coh > 0 || VarSqw.s_inc > 0)
    for (k = 0; k < 2; k++) {
      struct Sqw_Data_struct Data_sqw;

      Data_sqw = (k == 0 ? VarSqw.Data_coh : VarSqw.Data_inc);
      /* Data_sqw->Sqw has already been freed at end of INIT */
      Table_Free (&(Data_sqw.iqSq));

      if (Data_sqw.SW)
        free (Data_sqw.SW);
      if (Data_sqw.SQW)
        free (Data_sqw.SQW);
      if (Data_sqw.SW_lookup)
        free (Data_sqw.SW_lookup);
      if (Data_sqw.QW_lookup)
        free (Data_sqw.QW_lookup);
    } /* end for */

  #ifdef USE_MPI
  if (mpi_node_count > 1) {
    double tmp;
    tmp = (double)VarSqw.neutron_removed;
    mc_MPI_Sum (&tmp, 1);
    VarSqw.neutron_removed = (long)tmp;
    tmp = (double)VarSqw.neutron_exit;
    mc_MPI_Sum (&tmp, 1);
    VarSqw.neutron_exit = (long)tmp;
    tmp = (double)VarSqw.neutron_pmult;
    mc_MPI_Sum (&tmp, 1);
    VarSqw.neutron_pmult = (long)tmp;
    mc_MPI_Sum (&VarSqw.mean_scatt, 1);
    mc_MPI_Sum (&VarSqw.psum_scatt, 1);
    mc_MPI_Sum (&VarSqw.mean_abs, 1);
    mc_MPI_Sum (&VarSqw.single_coh, 1);
    mc_MPI_Sum (&VarSqw.single_inc, 1);
    mc_MPI_Sum (&VarSqw.multi, 1);
  }
  #endif
  MPI_MASTER(
    if (VarSqw.neutron_removed)
      printf("Isotropic_Sqw: %s: %li neutron events (out of %li) that should have\n"
             "               scattered were transmitted because scattering conditions\n"
             "WARNING        could not be satisfied after %i tries.\n",
            NAME_CURRENT_COMP, VarSqw.neutron_removed,
            VarSqw.neutron_exit+VarSqw.neutron_removed, VarSqw.maxloop);
    if (VarSqw.neutron_pmult)
      printf("Isotropic_Sqw: %s: %li neutron events (out of %li) reached\n"
             "WARNING        unrealistic weight. The S(q,w) norm might be too high.\n",
            NAME_CURRENT_COMP, VarSqw.neutron_pmult, VarSqw.neutron_exit);

    if (VarSqw.verbose_output >= 1 && VarSqw.psum_scatt > 0) {
      printf ("Isotropic_Sqw: %s: Scattering fraction=%g of incoming intensity\n"
	      "               Absorption fraction           =%g\n",
	      NAME_CURRENT_COMP, VarSqw.mean_scatt / VarSqw.psum_scatt, VarSqw.mean_abs / VarSqw.psum_scatt);
      printf ("               Single   scattering intensity =%g (coh=%g inc=%g)\n"
	      "               Multiple scattering intensity =%g\n",
	      VarSqw.single_coh + VarSqw.single_inc, VarSqw.single_coh, VarSqw.single_inc, VarSqw.multi);
    }
  );
  /* end FINALLY */
  #undef powder_format
  #undef Sqw_coh
  #undef Sqw_inc
  #undef geometry
  #undef radius
  #undef thickness
  #undef xwidth
  #undef yheight
  #undef zdepth
  #undef threshold
  #undef order
  #undef T
  #undef verbose
  #undef d_phi
  #undef concentric
  #undef rho
  #undef sigma_abs
  #undef sigma_coh
  #undef sigma_inc
  #undef classical
  #undef powder_Dd
  #undef powder_DW
  #undef powder_Vc
  #undef density
  #undef weight
  #undef p_interact
  #undef norm
  #undef powder_barns
  #undef quantum_correction
  #undef VarSqw
  #undef columns
  #undef offdata
  return(_comp);
} /* class_Isotropic_Sqw_finally */

_class_Pol_guide_vmirror *class_Pol_guide_vmirror_finally(_class_Pol_guide_vmirror *_comp
) {
  #define nvs (_comp->_parameters.nvs)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define length (_comp->_parameters.length)
  #define rR0 (_comp->_parameters.rR0)
  #define rQc (_comp->_parameters.rQc)
  #define ralpha (_comp->_parameters.ralpha)
  #define rmSM (_comp->_parameters.rmSM)
  #define rW (_comp->_parameters.rW)
  #define rbeta (_comp->_parameters.rbeta)
  #define rUpR0 (_comp->_parameters.rUpR0)
  #define rUpQc (_comp->_parameters.rUpQc)
  #define rUpalpha (_comp->_parameters.rUpalpha)
  #define rUpmSM (_comp->_parameters.rUpmSM)
  #define rUpW (_comp->_parameters.rUpW)
  #define rUpbeta (_comp->_parameters.rUpbeta)
  #define rDownR0 (_comp->_parameters.rDownR0)
  #define rDownQc (_comp->_parameters.rDownQc)
  #define rDownalpha (_comp->_parameters.rDownalpha)
  #define rDownmSM (_comp->_parameters.rDownmSM)
  #define rDownW (_comp->_parameters.rDownW)
  #define rDownbeta (_comp->_parameters.rDownbeta)
  #define debug (_comp->_parameters.debug)
  #define allow_inside_start (_comp->_parameters.allow_inside_start)
  #define rPar (_comp->_parameters.rPar)
  #define rUpPar (_comp->_parameters.rUpPar)
  #define rDownPar (_comp->_parameters.rDownPar)
  #define rParFile (_comp->_parameters.rParFile)
  #define rUpParFile (_comp->_parameters.rUpParFile)
  #define rDownParFile (_comp->_parameters.rDownParFile)
  #define inputType (_comp->_parameters.inputType)
  #define localG (_comp->_parameters.localG)
  #define normalTop (_comp->_parameters.normalTop)
  #define normalBot (_comp->_parameters.normalBot)
  #define normalLeft (_comp->_parameters.normalLeft)
  #define normalRight (_comp->_parameters.normalRight)
  #define normalInOut (_comp->_parameters.normalInOut)
  #define pointTop (_comp->_parameters.pointTop)
  #define pointBot (_comp->_parameters.pointBot)
  #define pointLeft (_comp->_parameters.pointLeft)
  #define pointRight (_comp->_parameters.pointRight)
  #define pointIn (_comp->_parameters.pointIn)
  #define pointOut (_comp->_parameters.pointOut)
  #define mirrorNormals (_comp->_parameters.mirrorNormals)
  #define mirrorPoints (_comp->_parameters.mirrorPoints)
  #define xwhalf (_comp->_parameters.xwhalf)
  #define xwfull (_comp->_parameters.xwfull)
  #define norm (_comp->_parameters.norm)
  #define n_index (_comp->_parameters.n_index)
  #define i_index (_comp->_parameters.i_index)
  #define rParToFunc (_comp->_parameters.rParToFunc)
  #define rUpParToFunc (_comp->_parameters.rUpParToFunc)
  #define rDownParToFunc (_comp->_parameters.rDownParToFunc)
  #define rParPtr (_comp->_parameters.rParPtr)
  #define rUpParPtr (_comp->_parameters.rUpParPtr)
  #define rDownParPtr (_comp->_parameters.rDownParPtr)
  SIG_MESSAGE("[_WASP_Vpolariser_finally] component WASP_Vpolariser=Pol_guide_vmirror() FINALLY [Pol_guide_vmirror:0]");

  free (mirrorNormals);
  free (mirrorPoints);
  #undef nvs
  #undef xwidth
  #undef yheight
  #undef length
  #undef rR0
  #undef rQc
  #undef ralpha
  #undef rmSM
  #undef rW
  #undef rbeta
  #undef rUpR0
  #undef rUpQc
  #undef rUpalpha
  #undef rUpmSM
  #undef rUpW
  #undef rUpbeta
  #undef rDownR0
  #undef rDownQc
  #undef rDownalpha
  #undef rDownmSM
  #undef rDownW
  #undef rDownbeta
  #undef debug
  #undef allow_inside_start
  #undef rPar
  #undef rUpPar
  #undef rDownPar
  #undef rParFile
  #undef rUpParFile
  #undef rDownParFile
  #undef inputType
  #undef localG
  #undef normalTop
  #undef normalBot
  #undef normalLeft
  #undef normalRight
  #undef normalInOut
  #undef pointTop
  #undef pointBot
  #undef pointLeft
  #undef pointRight
  #undef pointIn
  #undef pointOut
  #undef mirrorNormals
  #undef mirrorPoints
  #undef xwhalf
  #undef xwfull
  #undef norm
  #undef n_index
  #undef i_index
  #undef rParToFunc
  #undef rUpParToFunc
  #undef rDownParToFunc
  #undef rParPtr
  #undef rUpParPtr
  #undef rDownParPtr
  return(_comp);
} /* class_Pol_guide_vmirror_finally */



int finally(void) { /* called by mccode_main for ILL_H5_new:FINALLY */
#pragma acc update host(_Origin_var)
#pragma acc update host(_HCS_var)
#pragma acc update host(_HCS_Al_var)
#pragma acc update host(_HCS_Al_4_var)
#pragma acc update host(_HCS_Al_5_var)
#pragma acc update host(_HCS_Al_6_var)
#pragma acc update host(_HCS_Al_7_var)
#pragma acc update host(_H5_var)
#pragma acc update host(_H5_rect_var)
#pragma acc update host(_H53_origin_var)
#pragma acc update host(_H52_origin_var)
#pragma acc update host(_H51_origin_var)
#pragma acc update host(_H53_start_var)
#pragma acc update host(_H53_inpile_var)
#pragma acc update host(_H53_Al_var)
#pragma acc update host(_H53_Obt_var)
#pragma acc update host(_HCS_Al_17_var)
#pragma acc update host(_H53_Obt_Out_var)
#pragma acc update host(_HCS_Al_19_var)
#pragma acc update host(_H53_VSComC1_var)
#pragma acc update host(_HCS_Al_21_var)
#pragma acc update host(_H53_Nose_var)
#pragma acc update host(_HCS_Al_23_var)
#pragma acc update host(_H53_ThALES_Monochromator_Cradle_var)
#pragma acc update host(_H53_ThALES_Monochromator_var)
#pragma acc update host(_H53_ThALES_Monochromator_Jumper_var)
#pragma acc update host(_H53_ThALES_Monochromator_Out_var)
#pragma acc update host(_H53_ThALES_Sample_Div_var)
#pragma acc update host(_H53_ThALES_Sample_XY_var)
#pragma acc update host(_H53_ThALES_Sample_L_var)
#pragma acc update host(_H53_ThALES_Sample_var)
#pragma acc update host(_H53_ThALES_Spectrometer_var)
#pragma acc update host(_H53_ThALES_Diffractometer_var)
#pragma acc update host(_Sample_Out_var)
#pragma acc update host(_SC3_var)
#pragma acc update host(_Ana_Cradle_var)
#pragma acc update host(_PG2Xtal_var)
#pragma acc update host(_Ana_Out_var)
#pragma acc update host(_SC4_var)
#pragma acc update host(_He3H_var)
#pragma acc update host(_H53_ThALES_Transmit_var)
#pragma acc update host(_H53_ThALES_TransmitXY_var)
#pragma acc update host(_H52_start_var)
#pragma acc update host(_H52_inpile_var)
#pragma acc update host(_H52_Common_var)
#pragma acc update host(_H52_Common_46_var)
#pragma acc update host(_H52_Common_3_var)
#pragma acc update host(_HCS_Al_48_var)
#pragma acc update host(_H52_Obt_Out_var)
#pragma acc update host(_HCS_Al_50_var)
#pragma acc update host(_H52_Common_51_var)
#pragma acc update host(_H52_Common_52_var)
#pragma acc update host(_H52_Common_53_var)
#pragma acc update host(_H52_Common_54_var)
#pragma acc update host(_H52_Common_55_var)
#pragma acc update host(_H52_Common_56_var)
#pragma acc update host(_H52_Common_57_var)
#pragma acc update host(_H52_Common_58_var)
#pragma acc update host(_H52_Common_59_var)
#pragma acc update host(_H52_Common_60_var)
#pragma acc update host(_H52_Common_61_var)
#pragma acc update host(_H52_Common_62_var)
#pragma acc update host(_H52_Common_63_var)
#pragma acc update host(_HCS_Al_64_var)
#pragma acc update host(_H52_Common_Out_var)
#pragma acc update host(_H523_origin_var)
#pragma acc update host(_H521_origin_var)
#pragma acc update host(_H522_origin_var)
#pragma acc update host(_H521_start_var)
#pragma acc update host(_H521_Curved_var)
#pragma acc update host(_H521_Curved_71_var)
#pragma acc update host(_H521_Curved_72_var)
#pragma acc update host(_H521_Curved_73_var)
#pragma acc update host(_H521_Curved_74_var)
#pragma acc update host(_H521_Curved_75_var)
#pragma acc update host(_H521_Curved_76_var)
#pragma acc update host(_H521_Curved_77_var)
#pragma acc update host(_H521_Curved_78_var)
#pragma acc update host(_H521_Curved_79_var)
#pragma acc update host(_H521_Curved_80_var)
#pragma acc update host(_H521_Curved_preVTE_var)
#pragma acc update host(_HCS_Al_82_var)
#pragma acc update host(_H521_VTE_var)
#pragma acc update host(_HCS_Al_84_var)
#pragma acc update host(_H521_Curved_85_var)
#pragma acc update host(_H521_Curved_86_var)
#pragma acc update host(_H521_Curved_87_var)
#pragma acc update host(_H521_Curved_88_var)
#pragma acc update host(_H521_Curved_89_var)
#pragma acc update host(_H521_Curved_90_var)
#pragma acc update host(_H521_Curved_91_var)
#pragma acc update host(_H521_Curved_92_var)
#pragma acc update host(_H521_Curved_93_var)
#pragma acc update host(_H521_Curved_94_var)
#pragma acc update host(_H521_Curved_95_var)
#pragma acc update host(_H521_Curved_96_var)
#pragma acc update host(_H521_Curved_97_var)
#pragma acc update host(_H521_Curved_98_var)
#pragma acc update host(_H521_Curved_99_var)
#pragma acc update host(_H521_Curved_100_var)
#pragma acc update host(_H521_Curved_101_var)
#pragma acc update host(_H521_Curved_102_var)
#pragma acc update host(_H521_Curved_103_var)
#pragma acc update host(_H521_Curved_104_var)
#pragma acc update host(_H521_Curved_105_var)
#pragma acc update host(_H521_Curved_106_var)
#pragma acc update host(_H521_Curved_107_var)
#pragma acc update host(_HCS_Al_108_var)
#pragma acc update host(_H521_Curved_Out_var)
#pragma acc update host(_H521_Straight_var)
#pragma acc update host(_H521_Straight_Out_var)
#pragma acc update host(_HCS_Al_112_var)
#pragma acc update host(_H521_D16_Monochromator_Cradle_var)
#pragma acc update host(_H521_D16_Monochromator_var)
#pragma acc update host(_H521_D16_Monochromator_Jumper_var)
#pragma acc update host(_H521_D16_Monochromator_Out_var)
#pragma acc update host(_H521_D16_Sample_Div_var)
#pragma acc update host(_H521_D16_Sample_XY_var)
#pragma acc update host(_H521_D16_Sample_L_var)
#pragma acc update host(_H521_D16_Sample_var)
#pragma acc update host(_H521_D16_Detector_var)
#pragma acc update host(_H521_D16_Spectrometer_var)
#pragma acc update host(_H521_D16_Diffractometer_var)
#pragma acc update host(_H521_D16_Transmit_var)
#pragma acc update host(_HCS_Al_125_var)
#pragma acc update host(_H521_P6_Start_var)
#pragma acc update host(_H521_P6_var)
#pragma acc update host(_HCS_Al_128_var)
#pragma acc update host(_H521_SADAM_Monochromator_Cradle_var)
#pragma acc update host(_H521_SADAM_Monochromator_var)
#pragma acc update host(_H521_SADAM_Monochromator_Out_var)
#pragma acc update host(_H521_SADAM_Sample_Div_var)
#pragma acc update host(_H521_SADAM_Sample_XY_var)
#pragma acc update host(_H521_SADAM_Sample_L_var)
#pragma acc update host(_H521_SADAM_Sample_var)
#pragma acc update host(_H521_SADAM_Detector_var)
#pragma acc update host(_H521_SADAM_Spectrometer_var)
#pragma acc update host(_H521_SADAM_Diffractometer_var)
#pragma acc update host(_H522_start_var)
#pragma acc update host(_H522_Curved_var)
#pragma acc update host(_H522_Curved_141_var)
#pragma acc update host(_H522_Curved_142_var)
#pragma acc update host(_H522_Curved_143_var)
#pragma acc update host(_H522_Curved_144_var)
#pragma acc update host(_H522_Curved_145_var)
#pragma acc update host(_H522_Curved_146_var)
#pragma acc update host(_H522_Curved_147_var)
#pragma acc update host(_H522_Curved_148_var)
#pragma acc update host(_H522_Curved_149_var)
#pragma acc update host(_HCS_Al_150_var)
#pragma acc update host(_H522_VTE_var)
#pragma acc update host(_HCS_Al_152_var)
#pragma acc update host(_H523_Curved_153_var)
#pragma acc update host(_H523_Curved_154_var)
#pragma acc update host(_H523_Curved_155_var)
#pragma acc update host(_H523_Curved_156_var)
#pragma acc update host(_H523_Curved_157_var)
#pragma acc update host(_H522_Curved_158_var)
#pragma acc update host(_H522_Curved_159_var)
#pragma acc update host(_H522_Curved_160_var)
#pragma acc update host(_H522_Curved_161_var)
#pragma acc update host(_H522_Curved_162_var)
#pragma acc update host(_H522_Curved_163_var)
#pragma acc update host(_H522_Curved_164_var)
#pragma acc update host(_H522_Curved_165_var)
#pragma acc update host(_H522_Curved_166_var)
#pragma acc update host(_H522_Curved_167_var)
#pragma acc update host(_H522_Curved_168_var)
#pragma acc update host(_H522_Curved_169_var)
#pragma acc update host(_H522_Curved_170_var)
#pragma acc update host(_H522_Curved_171_var)
#pragma acc update host(_H522_Curved_172_var)
#pragma acc update host(_H522_Curved_173_var)
#pragma acc update host(_H522_Curved_174_var)
#pragma acc update host(_H522_Curved_175_var)
#pragma acc update host(_H522_Curved_176_var)
#pragma acc update host(_H522_Curved_177_var)
#pragma acc update host(_HCS_Al_178_var)
#pragma acc update host(_H522_Curved_Out_XY_var)
#pragma acc update host(_H522_Curved_Out_XL_var)
#pragma acc update host(_WASP_Vselector_var)
#pragma acc update host(_HCS_Al_182_var)
#pragma acc update host(_H522_Straight_var)
#pragma acc update host(_HCS_Al_184_var)
#pragma acc update host(_H522_Vsel_L_var)
#pragma acc update host(_H522_mirror_centre_var)
#pragma acc update host(_WASP_polariser_var)
#pragma acc update host(_H522_mirror_outdir_var)
#pragma acc update host(_H522_mirror_ReflectXY_var)
#pragma acc update host(_H522_mirror_TransmitXY_var)
#pragma acc update host(_H522_mirror_outdXY_var)
#pragma acc update host(_WASP_Vpolariser_var)
#pragma acc update host(_H522_Straight_Last_var)
#pragma acc update host(_H522_WASP_Sample_Div_var)
#pragma acc update host(_H522_WASP_Sample_XY_var)
#pragma acc update host(_H522_WASP_Sample_L_var)
#pragma acc update host(_H522_WASP_Sample_var)
#pragma acc update host(_H522_WASP_Detector_var)
#pragma acc update host(_H522_WASP_Spectrometer_var)
#pragma acc update host(_H522_WASP_Diffractometer_var)
#pragma acc update host(_H523_start_var)
#pragma acc update host(_H523_Curved_var)
#pragma acc update host(_H523_Curved_203_var)
#pragma acc update host(_H523_Curved_204_var)
#pragma acc update host(_H523_Curved_205_var)
#pragma acc update host(_H523_Curved_206_var)
#pragma acc update host(_HCS_Al_207_var)
#pragma acc update host(_H523_VTE_var)
#pragma acc update host(_HCS_Al_209_var)
#pragma acc update host(_H523_Curved_210_var)
#pragma acc update host(_H523_Curved_211_var)
#pragma acc update host(_H523_Curved_212_var)
#pragma acc update host(_H523_Curved_213_var)
#pragma acc update host(_H523_Curved_214_var)
#pragma acc update host(_H523_Curved_215_var)
#pragma acc update host(_H523_Curved_216_var)
#pragma acc update host(_H523_Curved_217_var)
#pragma acc update host(_H523_Curved_218_var)
#pragma acc update host(_H523_Curved_219_var)
#pragma acc update host(_H523_Curved_220_var)
#pragma acc update host(_H523_Curved_221_var)
#pragma acc update host(_H523_Curved_222_var)
#pragma acc update host(_H523_Curved_223_var)
#pragma acc update host(_H523_Curved_224_var)
#pragma acc update host(_H523_Curved_225_var)
#pragma acc update host(_H523_Curved_226_var)
#pragma acc update host(_H523_Curved_227_var)
#pragma acc update host(_H523_Curved_228_var)
#pragma acc update host(_H523_Curved_229_var)
#pragma acc update host(_HCS_Al_230_var)
#pragma acc update host(_H523_CryoEDM_In_var)
#pragma acc update host(_H523_CryoEDM_In_L_var)
#pragma acc update host(_H523_CryoEDM_mirror_center_var)
#pragma acc update host(_H523_CryoEDM_polariser_var)
#pragma acc update host(_H523_CryoEDM_mirror_outdir_var)
#pragma acc update host(_H523_CryoEDM_mirror_ReflectXY_var)
#pragma acc update host(_H523_CryoEDM_mirror_TransmitXY_var)
#pragma acc update host(_H523_CryoEDM_Sample_L_var)
#pragma acc update host(_H523_CryoEDM_Sample_Div_var)
#pragma acc update host(_H523_CryoEDM_Sample_XY_var)
#pragma acc update host(_H51_start_var)
#pragma acc update host(_H51_inpile_var)
#pragma acc update host(_H51_Obt_1_var)
#pragma acc update host(_H51_Obt_2_var)
#pragma acc update host(_H51_Obt_3_var)
#pragma acc update host(_HCS_Al_246_var)
#pragma acc update host(_H51_Obt_Out_var)
#pragma acc update host(_HCS_Al_248_var)
#pragma acc update host(_H51_S2_var)
#pragma acc update host(_H51_S2_250_var)
#pragma acc update host(_H51_S2_251_var)
#pragma acc update host(_HCS_Al_H51_var)
#pragma acc update host(_H51_S2_Out_var)
#pragma acc update host(_H51_split_2_var)
#pragma acc update host(_H51_split_1_var)
#pragma acc update host(_H511_Start_var)
#pragma acc update host(_H511_mirror_centre_var)
#pragma acc update host(_IN15_polariser_var)
#pragma acc update host(_H511_mirror_outdir_var)
#pragma acc update host(_H511_mirror_ReflectXY_var)
#pragma acc update host(_H511_mirror_TransmitXY_var)
#pragma acc update host(_H511_mirror_outdXY_var)
#pragma acc update host(_H511_S3_var)
#pragma acc update host(_H511_S9_var)
#pragma acc update host(_HCS_Al_265_var)
#pragma acc update host(_H511_VTE_var)
#pragma acc update host(_HCS_Al_267_var)
#pragma acc update host(_H511_S10_var)
#pragma acc update host(_IN15_Vselector_var)
#pragma acc update host(_H511_BeforeV_var)
#pragma acc update host(_IN15_Vpolariser_var)
#pragma acc update host(_H511_AfterV_var)
#pragma acc update host(_H511_IN15_Sample_Div_var)
#pragma acc update host(_H511_IN15_Sample_XY_var)
#pragma acc update host(_H511_IN15_Sample_L_var)
#pragma acc update host(_H511_IN15_Sample_var)
#pragma acc update host(_H511_IN15_Detector_var)
#pragma acc update host(_H511_IN15_Spectrometer_var)
#pragma acc update host(_H511_IN15_Diffractometer_var)
#pragma acc update host(_H512_Start_var)
#pragma acc update host(_H512_S36_var)
#pragma acc update host(_H512_S36_282_var)
#pragma acc update host(_H512_S36_283_var)
#pragma acc update host(_H512_S36_284_var)
#pragma acc update host(_H512_S36_285_var)
#pragma acc update host(_H512_S36_286_var)
#pragma acc update host(_H512_S36_287_var)
#pragma acc update host(_H512_S36_288_var)
#pragma acc update host(_H512_S36_289_var)
#pragma acc update host(_H512_S36_290_var)
#pragma acc update host(_H512_S36_291_var)
#pragma acc update host(_H512_S36_292_var)
#pragma acc update host(_H512_S36_293_var)
#pragma acc update host(_H512_S36_294_var)
#pragma acc update host(_H512_S36_295_var)
#pragma acc update host(_H512_S36_296_var)
#pragma acc update host(_HCS_Al_H512_var)
#pragma acc update host(_H512_VTE_var)
#pragma acc update host(_HCS_Al_299_var)
#pragma acc update host(_H51_S78_var)
#pragma acc update host(_H51_S78_301_var)
#pragma acc update host(_H51_S78_302_var)
#pragma acc update host(_H51_S78_303_var)
#pragma acc update host(_HCS_Al_304_var)
#pragma acc update host(_H512_S11_var)
#pragma acc update host(_HCS_Al_306_var)
#pragma acc update host(_D22_PreV_var)
#pragma acc update host(_D22_Vselector_var)
#pragma acc update host(_D22_Collimation_var)
#pragma acc update host(_D22_Sample_Pos_var)
#pragma acc update host(_H51_D22_Sample_Div_var)
#pragma acc update host(_H51_D22_Sample_XY_var)
#pragma acc update host(_H51_D22_Sample_L_var)
#pragma acc update host(_H51_D22_Sample_var)
#pragma acc update host(_D22_Detector_var)
#pragma acc update host(_D22_Detector_vessel_var)
#pragma acc update host(_BOG_var)
#pragma acc update host(_H53_ThALES_Drum_var)
#pragma acc update host(_H521_D16_Drum_var)
#pragma acc update host(_H521_SADAM_Drum_var)
#pragma acc update host(_Traversee_var)
#pragma acc update host(_Core_Centre_var)
#pragma acc update host(_Core_var)
#pragma acc update host(_D2O_Vessel_var)
#pragma acc update host(_H2O_Vessel_var)
#pragma acc update host(_instrument_var)

  siminfo_init(NULL);
  save(siminfo_file); /* save data when simulation ends */

  /* call iteratively all components FINALLY */
  class_Progress_bar_finally(&_Origin_var);

  class_Source_gen_finally(&_HCS_var);

  class_PowderN_finally(&_HCS_Al_var);

  class_PowderN_finally(&_HCS_Al_4_var);

  class_PowderN_finally(&_HCS_Al_5_var);

  class_PowderN_finally(&_HCS_Al_6_var);

  class_PowderN_finally(&_HCS_Al_7_var);

  class_Monitor_nD_finally(&_H5_var);

  class_Guide_gravity_finally(&_H5_rect_var);

  class_Monitor_nD_finally(&_H53_origin_var);

  class_Monitor_nD_finally(&_H52_origin_var);

  class_Monitor_nD_finally(&_H51_origin_var);


  class_Guide_gravity_finally(&_H53_inpile_var);

  class_PowderN_finally(&_H53_Al_var);

  class_Guide_gravity_finally(&_H53_Obt_var);

  class_PowderN_finally(&_HCS_Al_17_var);

  class_Monitor_nD_finally(&_H53_Obt_Out_var);

  class_PowderN_finally(&_HCS_Al_19_var);

  class_Guide_gravity_finally(&_H53_VSComC1_var);

  class_PowderN_finally(&_HCS_Al_21_var);

  class_Guide_tapering_finally(&_H53_Nose_var);

  class_PowderN_finally(&_HCS_Al_23_var);

  class_Monitor_nD_finally(&_H53_ThALES_Monochromator_Cradle_var);

  class_Monochromator_curved_finally(&_H53_ThALES_Monochromator_var);



  class_Monitor_nD_finally(&_H53_ThALES_Sample_Div_var);

  class_Monitor_nD_finally(&_H53_ThALES_Sample_XY_var);

  class_Monitor_nD_finally(&_H53_ThALES_Sample_L_var);

  class_Isotropic_Sqw_finally(&_H53_ThALES_Sample_var);

  class_Monitor_nD_finally(&_H53_ThALES_Spectrometer_var);

  class_Monitor_nD_finally(&_H53_ThALES_Diffractometer_var);




  class_Monochromator_curved_finally(&_PG2Xtal_var);





  class_Monitor_nD_finally(&_H53_ThALES_TransmitXY_var);


  class_Guide_gravity_finally(&_H52_inpile_var);

  class_Guide_gravity_finally(&_H52_Common_var);

  class_Guide_gravity_finally(&_H52_Common_46_var);

  class_Guide_gravity_finally(&_H52_Common_3_var);

  class_PowderN_finally(&_HCS_Al_48_var);

  class_Monitor_nD_finally(&_H52_Obt_Out_var);

  class_PowderN_finally(&_HCS_Al_50_var);

  class_Guide_gravity_finally(&_H52_Common_51_var);

  class_Guide_gravity_finally(&_H52_Common_52_var);

  class_Guide_gravity_finally(&_H52_Common_53_var);

  class_Guide_gravity_finally(&_H52_Common_54_var);

  class_Guide_gravity_finally(&_H52_Common_55_var);

  class_Guide_gravity_finally(&_H52_Common_56_var);

  class_Guide_gravity_finally(&_H52_Common_57_var);

  class_Guide_gravity_finally(&_H52_Common_58_var);

  class_Guide_gravity_finally(&_H52_Common_59_var);

  class_Guide_gravity_finally(&_H52_Common_60_var);

  class_Guide_gravity_finally(&_H52_Common_61_var);

  class_Guide_gravity_finally(&_H52_Common_62_var);

  class_Guide_gravity_finally(&_H52_Common_63_var);

  class_PowderN_finally(&_HCS_Al_64_var);

  class_Monitor_nD_finally(&_H52_Common_Out_var);

  class_Monitor_nD_finally(&_H523_origin_var);

  class_Monitor_nD_finally(&_H521_origin_var);

  class_Monitor_nD_finally(&_H522_origin_var);


  class_Guide_gravity_finally(&_H521_Curved_var);

  class_Guide_gravity_finally(&_H521_Curved_71_var);

  class_Guide_gravity_finally(&_H521_Curved_72_var);

  class_Guide_gravity_finally(&_H521_Curved_73_var);

  class_Guide_gravity_finally(&_H521_Curved_74_var);

  class_Guide_gravity_finally(&_H521_Curved_75_var);

  class_Guide_gravity_finally(&_H521_Curved_76_var);

  class_Guide_gravity_finally(&_H521_Curved_77_var);

  class_Guide_gravity_finally(&_H521_Curved_78_var);

  class_Guide_gravity_finally(&_H521_Curved_79_var);

  class_Guide_gravity_finally(&_H521_Curved_80_var);

  class_Guide_gravity_finally(&_H521_Curved_preVTE_var);

  class_PowderN_finally(&_HCS_Al_82_var);

  class_Monitor_nD_finally(&_H521_VTE_var);

  class_PowderN_finally(&_HCS_Al_84_var);

  class_Guide_gravity_finally(&_H521_Curved_85_var);

  class_Guide_gravity_finally(&_H521_Curved_86_var);

  class_Guide_gravity_finally(&_H521_Curved_87_var);

  class_Guide_gravity_finally(&_H521_Curved_88_var);

  class_Guide_gravity_finally(&_H521_Curved_89_var);

  class_Guide_gravity_finally(&_H521_Curved_90_var);

  class_Guide_gravity_finally(&_H521_Curved_91_var);

  class_Guide_gravity_finally(&_H521_Curved_92_var);

  class_Guide_gravity_finally(&_H521_Curved_93_var);

  class_Guide_gravity_finally(&_H521_Curved_94_var);

  class_Guide_gravity_finally(&_H521_Curved_95_var);

  class_Guide_gravity_finally(&_H521_Curved_96_var);

  class_Guide_gravity_finally(&_H521_Curved_97_var);

  class_Guide_gravity_finally(&_H521_Curved_98_var);

  class_Guide_gravity_finally(&_H521_Curved_99_var);

  class_Guide_gravity_finally(&_H521_Curved_100_var);

  class_Guide_gravity_finally(&_H521_Curved_101_var);

  class_Guide_gravity_finally(&_H521_Curved_102_var);

  class_Guide_gravity_finally(&_H521_Curved_103_var);

  class_Guide_gravity_finally(&_H521_Curved_104_var);

  class_Guide_gravity_finally(&_H521_Curved_105_var);

  class_Guide_gravity_finally(&_H521_Curved_106_var);

  class_Guide_gravity_finally(&_H521_Curved_107_var);

  class_PowderN_finally(&_HCS_Al_108_var);

  class_Monitor_nD_finally(&_H521_Curved_Out_var);

  class_Guide_gravity_finally(&_H521_Straight_var);

  class_Monitor_nD_finally(&_H521_Straight_Out_var);

  class_PowderN_finally(&_HCS_Al_112_var);

  class_Monitor_nD_finally(&_H521_D16_Monochromator_Cradle_var);

  class_Monochromator_curved_finally(&_H521_D16_Monochromator_var);



  class_Monitor_nD_finally(&_H521_D16_Sample_Div_var);

  class_Monitor_nD_finally(&_H521_D16_Sample_XY_var);

  class_Monitor_nD_finally(&_H521_D16_Sample_L_var);

  class_Isotropic_Sqw_finally(&_H521_D16_Sample_var);

  class_Monitor_nD_finally(&_H521_D16_Detector_var);

  class_Monitor_nD_finally(&_H521_D16_Spectrometer_var);

  class_Monitor_nD_finally(&_H521_D16_Diffractometer_var);


  class_PowderN_finally(&_HCS_Al_125_var);


  class_Guide_gravity_finally(&_H521_P6_var);

  class_PowderN_finally(&_HCS_Al_128_var);

  class_Monitor_nD_finally(&_H521_SADAM_Monochromator_Cradle_var);

  class_Monochromator_curved_finally(&_H521_SADAM_Monochromator_var);


  class_Monitor_nD_finally(&_H521_SADAM_Sample_Div_var);

  class_Monitor_nD_finally(&_H521_SADAM_Sample_XY_var);

  class_Monitor_nD_finally(&_H521_SADAM_Sample_L_var);

  class_Isotropic_Sqw_finally(&_H521_SADAM_Sample_var);

  class_Monitor_nD_finally(&_H521_SADAM_Detector_var);

  class_Monitor_nD_finally(&_H521_SADAM_Spectrometer_var);

  class_Monitor_nD_finally(&_H521_SADAM_Diffractometer_var);


  class_Guide_gravity_finally(&_H522_Curved_var);

  class_Guide_gravity_finally(&_H522_Curved_141_var);

  class_Guide_gravity_finally(&_H522_Curved_142_var);

  class_Guide_gravity_finally(&_H522_Curved_143_var);

  class_Guide_gravity_finally(&_H522_Curved_144_var);

  class_Guide_gravity_finally(&_H522_Curved_145_var);

  class_Guide_gravity_finally(&_H522_Curved_146_var);

  class_Guide_gravity_finally(&_H522_Curved_147_var);

  class_Guide_gravity_finally(&_H522_Curved_148_var);

  class_Guide_gravity_finally(&_H522_Curved_149_var);

  class_PowderN_finally(&_HCS_Al_150_var);

  class_Monitor_nD_finally(&_H522_VTE_var);

  class_PowderN_finally(&_HCS_Al_152_var);

  class_Guide_gravity_finally(&_H523_Curved_153_var);

  class_Guide_gravity_finally(&_H523_Curved_154_var);

  class_Guide_gravity_finally(&_H523_Curved_155_var);

  class_Guide_gravity_finally(&_H523_Curved_156_var);

  class_Guide_gravity_finally(&_H523_Curved_157_var);

  class_Guide_gravity_finally(&_H522_Curved_158_var);

  class_Guide_gravity_finally(&_H522_Curved_159_var);

  class_Guide_gravity_finally(&_H522_Curved_160_var);

  class_Guide_gravity_finally(&_H522_Curved_161_var);

  class_Guide_gravity_finally(&_H522_Curved_162_var);

  class_Guide_gravity_finally(&_H522_Curved_163_var);

  class_Guide_gravity_finally(&_H522_Curved_164_var);

  class_Guide_gravity_finally(&_H522_Curved_165_var);

  class_Guide_gravity_finally(&_H522_Curved_166_var);

  class_Guide_gravity_finally(&_H522_Curved_167_var);

  class_Guide_gravity_finally(&_H522_Curved_168_var);

  class_Guide_gravity_finally(&_H522_Curved_169_var);

  class_Guide_gravity_finally(&_H522_Curved_170_var);

  class_Guide_gravity_finally(&_H522_Curved_171_var);

  class_Guide_gravity_finally(&_H522_Curved_172_var);

  class_Guide_gravity_finally(&_H522_Curved_173_var);

  class_Guide_gravity_finally(&_H522_Curved_174_var);

  class_Guide_gravity_finally(&_H522_Curved_175_var);

  class_Guide_gravity_finally(&_H522_Curved_176_var);

  class_Guide_gravity_finally(&_H522_Curved_177_var);

  class_PowderN_finally(&_HCS_Al_178_var);

  class_Monitor_nD_finally(&_H522_Curved_Out_XY_var);

  class_Monitor_nD_finally(&_H522_Curved_Out_XL_var);


  class_PowderN_finally(&_HCS_Al_182_var);

  class_Guide_gravity_finally(&_H522_Straight_var);

  class_PowderN_finally(&_HCS_Al_184_var);

  class_Monitor_nD_finally(&_H522_Vsel_L_var);




  class_Monitor_nD_finally(&_H522_mirror_ReflectXY_var);

  class_Monitor_nD_finally(&_H522_mirror_TransmitXY_var);

  class_Monitor_nD_finally(&_H522_mirror_outdXY_var);

  class_Pol_guide_vmirror_finally(&_WASP_Vpolariser_var);

  class_Guide_gravity_finally(&_H522_Straight_Last_var);

  class_Monitor_nD_finally(&_H522_WASP_Sample_Div_var);

  class_Monitor_nD_finally(&_H522_WASP_Sample_XY_var);

  class_Monitor_nD_finally(&_H522_WASP_Sample_L_var);


  class_Monitor_nD_finally(&_H522_WASP_Detector_var);

  class_Monitor_nD_finally(&_H522_WASP_Spectrometer_var);

  class_Monitor_nD_finally(&_H522_WASP_Diffractometer_var);


  class_Guide_gravity_finally(&_H523_Curved_var);

  class_Guide_gravity_finally(&_H523_Curved_203_var);

  class_Guide_gravity_finally(&_H523_Curved_204_var);

  class_Guide_gravity_finally(&_H523_Curved_205_var);

  class_Guide_gravity_finally(&_H523_Curved_206_var);

  class_PowderN_finally(&_HCS_Al_207_var);

  class_Monitor_nD_finally(&_H523_VTE_var);

  class_PowderN_finally(&_HCS_Al_209_var);

  class_Guide_gravity_finally(&_H523_Curved_210_var);

  class_Guide_gravity_finally(&_H523_Curved_211_var);

  class_Guide_gravity_finally(&_H523_Curved_212_var);

  class_Guide_gravity_finally(&_H523_Curved_213_var);

  class_Guide_gravity_finally(&_H523_Curved_214_var);

  class_Guide_gravity_finally(&_H523_Curved_215_var);

  class_Guide_gravity_finally(&_H523_Curved_216_var);

  class_Guide_gravity_finally(&_H523_Curved_217_var);

  class_Guide_gravity_finally(&_H523_Curved_218_var);

  class_Guide_gravity_finally(&_H523_Curved_219_var);

  class_Guide_gravity_finally(&_H523_Curved_220_var);

  class_Guide_gravity_finally(&_H523_Curved_221_var);

  class_Guide_gravity_finally(&_H523_Curved_222_var);

  class_Guide_gravity_finally(&_H523_Curved_223_var);

  class_Guide_gravity_finally(&_H523_Curved_224_var);

  class_Guide_gravity_finally(&_H523_Curved_225_var);

  class_Guide_gravity_finally(&_H523_Curved_226_var);

  class_Guide_gravity_finally(&_H523_Curved_227_var);

  class_Guide_gravity_finally(&_H523_Curved_228_var);

  class_Guide_gravity_finally(&_H523_Curved_229_var);

  class_PowderN_finally(&_HCS_Al_230_var);


  class_Monitor_nD_finally(&_H523_CryoEDM_In_L_var);




  class_Monitor_nD_finally(&_H523_CryoEDM_mirror_ReflectXY_var);

  class_Monitor_nD_finally(&_H523_CryoEDM_mirror_TransmitXY_var);

  class_Monitor_nD_finally(&_H523_CryoEDM_Sample_L_var);

  class_Monitor_nD_finally(&_H523_CryoEDM_Sample_Div_var);

  class_Monitor_nD_finally(&_H523_CryoEDM_Sample_XY_var);


  class_Guide_gravity_finally(&_H51_inpile_var);

  class_Guide_gravity_finally(&_H51_Obt_1_var);

  class_Guide_gravity_finally(&_H51_Obt_2_var);

  class_Guide_gravity_finally(&_H51_Obt_3_var);

  class_PowderN_finally(&_HCS_Al_246_var);

  class_Monitor_nD_finally(&_H51_Obt_Out_var);

  class_PowderN_finally(&_HCS_Al_248_var);

  class_Guide_gravity_finally(&_H51_S2_var);

  class_Guide_gravity_finally(&_H51_S2_250_var);

  class_Guide_gravity_finally(&_H51_S2_251_var);

  class_PowderN_finally(&_HCS_Al_H51_var);

  class_Monitor_nD_finally(&_H51_S2_Out_var);

  class_Monitor_nD_finally(&_H51_split_2_var);

  class_Monitor_nD_finally(&_H51_split_1_var);





  class_Monitor_nD_finally(&_H511_mirror_ReflectXY_var);

  class_Monitor_nD_finally(&_H511_mirror_TransmitXY_var);

  class_Monitor_nD_finally(&_H511_mirror_outdXY_var);

  class_Guide_gravity_finally(&_H511_S3_var);

  class_Guide_gravity_finally(&_H511_S9_var);

  class_PowderN_finally(&_HCS_Al_265_var);

  class_Monitor_nD_finally(&_H511_VTE_var);

  class_PowderN_finally(&_HCS_Al_267_var);

  class_Guide_gravity_finally(&_H511_S10_var);


  class_Guide_gravity_finally(&_H511_BeforeV_var);

  class_Pol_guide_vmirror_finally(&_IN15_Vpolariser_var);

  class_Guide_gravity_finally(&_H511_AfterV_var);

  class_Monitor_nD_finally(&_H511_IN15_Sample_Div_var);

  class_Monitor_nD_finally(&_H511_IN15_Sample_XY_var);

  class_Monitor_nD_finally(&_H511_IN15_Sample_L_var);


  class_Monitor_nD_finally(&_H511_IN15_Detector_var);

  class_Monitor_nD_finally(&_H511_IN15_Spectrometer_var);

  class_Monitor_nD_finally(&_H511_IN15_Diffractometer_var);


  class_Guide_gravity_finally(&_H512_S36_var);

  class_Guide_gravity_finally(&_H512_S36_282_var);

  class_Guide_gravity_finally(&_H512_S36_283_var);

  class_Guide_gravity_finally(&_H512_S36_284_var);

  class_Guide_gravity_finally(&_H512_S36_285_var);

  class_Guide_gravity_finally(&_H512_S36_286_var);

  class_Guide_gravity_finally(&_H512_S36_287_var);

  class_Guide_gravity_finally(&_H512_S36_288_var);

  class_Guide_gravity_finally(&_H512_S36_289_var);

  class_Guide_gravity_finally(&_H512_S36_290_var);

  class_Guide_gravity_finally(&_H512_S36_291_var);

  class_Guide_gravity_finally(&_H512_S36_292_var);

  class_Guide_gravity_finally(&_H512_S36_293_var);

  class_Guide_gravity_finally(&_H512_S36_294_var);

  class_Guide_gravity_finally(&_H512_S36_295_var);

  class_Guide_gravity_finally(&_H512_S36_296_var);

  class_PowderN_finally(&_HCS_Al_H512_var);

  class_Monitor_nD_finally(&_H512_VTE_var);

  class_PowderN_finally(&_HCS_Al_299_var);

  class_Guide_gravity_finally(&_H51_S78_var);

  class_Guide_gravity_finally(&_H51_S78_301_var);

  class_Guide_gravity_finally(&_H51_S78_302_var);

  class_Guide_gravity_finally(&_H51_S78_303_var);

  class_PowderN_finally(&_HCS_Al_304_var);

  class_Guide_gravity_finally(&_H512_S11_var);

  class_PowderN_finally(&_HCS_Al_306_var);

  class_Monitor_nD_finally(&_D22_PreV_var);


  class_Guide_gravity_finally(&_D22_Collimation_var);


  class_Monitor_nD_finally(&_H51_D22_Sample_Div_var);

  class_Monitor_nD_finally(&_H51_D22_Sample_XY_var);

  class_Monitor_nD_finally(&_H51_D22_Sample_L_var);

  class_Isotropic_Sqw_finally(&_H51_D22_Sample_var);

  class_Monitor_nD_finally(&_D22_Detector_var);











  siminfo_close(); 

  return(0);
} /* finally */

/* *****************************************************************************
* instrument 'ILL_H5_new' and components DISPLAY
***************************************************************************** */

  #define magnify     mcdis_magnify
  #define line        mcdis_line
  #define dashed_line mcdis_dashed_line
  #define multiline   mcdis_multiline
  #define rectangle   mcdis_rectangle
  #define box         mcdis_box
  #define circle      mcdis_circle
  #define cylinder    mcdis_cylinder
  #define sphere      mcdis_sphere
  #define cone        mcdis_cone
  #define polygon     mcdis_polygon
  #define polyhedron  mcdis_polyhedron
_class_Progress_bar *class_Progress_bar_display(_class_Progress_bar *_comp
) {
  #define profile (_comp->_parameters.profile)
  #define percent (_comp->_parameters.percent)
  #define flag_save (_comp->_parameters.flag_save)
  #define minutes (_comp->_parameters.minutes)
  #define IntermediateCnts (_comp->_parameters.IntermediateCnts)
  #define StartTime (_comp->_parameters.StartTime)
  #define EndTime (_comp->_parameters.EndTime)
  #define CurrentTime (_comp->_parameters.CurrentTime)
  #define infostring (_comp->_parameters.infostring)
  SIG_MESSAGE("[_Origin_display] component Origin=Progress_bar() DISPLAY [Progress_bar:0]");

  printf("MCDISPLAY: component %s\n", _comp->_name);

  #undef profile
  #undef percent
  #undef flag_save
  #undef minutes
  #undef IntermediateCnts
  #undef StartTime
  #undef EndTime
  #undef CurrentTime
  #undef infostring
  return(_comp);
} /* class_Progress_bar_display */

_class_Source_gen *class_Source_gen_display(_class_Source_gen *_comp
) {
  #define flux_file (_comp->_parameters.flux_file)
  #define xdiv_file (_comp->_parameters.xdiv_file)
  #define ydiv_file (_comp->_parameters.ydiv_file)
  #define radius (_comp->_parameters.radius)
  #define dist (_comp->_parameters.dist)
  #define focus_xw (_comp->_parameters.focus_xw)
  #define focus_yh (_comp->_parameters.focus_yh)
  #define focus_aw (_comp->_parameters.focus_aw)
  #define focus_ah (_comp->_parameters.focus_ah)
  #define E0 (_comp->_parameters.E0)
  #define dE (_comp->_parameters.dE)
  #define lambda0 (_comp->_parameters.lambda0)
  #define dlambda (_comp->_parameters.dlambda)
  #define I1 (_comp->_parameters.I1)
  #define yheight (_comp->_parameters.yheight)
  #define xwidth (_comp->_parameters.xwidth)
  #define verbose (_comp->_parameters.verbose)
  #define T1 (_comp->_parameters.T1)
  #define flux_file_perAA (_comp->_parameters.flux_file_perAA)
  #define flux_file_log (_comp->_parameters.flux_file_log)
  #define Lmin (_comp->_parameters.Lmin)
  #define Lmax (_comp->_parameters.Lmax)
  #define Emin (_comp->_parameters.Emin)
  #define Emax (_comp->_parameters.Emax)
  #define T2 (_comp->_parameters.T2)
  #define I2 (_comp->_parameters.I2)
  #define T3 (_comp->_parameters.T3)
  #define I3 (_comp->_parameters.I3)
  #define zdepth (_comp->_parameters.zdepth)
  #define target_index (_comp->_parameters.target_index)
  #define p_in (_comp->_parameters.p_in)
  #define lambda1 (_comp->_parameters.lambda1)
  #define lambda2 (_comp->_parameters.lambda2)
  #define lambda3 (_comp->_parameters.lambda3)
  #define pTable (_comp->_parameters.pTable)
  #define pTable_x (_comp->_parameters.pTable_x)
  #define pTable_y (_comp->_parameters.pTable_y)
  #define pTable_xmin (_comp->_parameters.pTable_xmin)
  #define pTable_xmax (_comp->_parameters.pTable_xmax)
  #define pTable_xsum (_comp->_parameters.pTable_xsum)
  #define pTable_ymin (_comp->_parameters.pTable_ymin)
  #define pTable_ymax (_comp->_parameters.pTable_ymax)
  #define pTable_ysum (_comp->_parameters.pTable_ysum)
  #define pTable_dxmin (_comp->_parameters.pTable_dxmin)
  #define pTable_dxmax (_comp->_parameters.pTable_dxmax)
  #define pTable_dymin (_comp->_parameters.pTable_dymin)
  #define pTable_dymax (_comp->_parameters.pTable_dymax)
  SIG_MESSAGE("[_HCS_display] component HCS=Source_gen() DISPLAY [Source_gen:0]");

  printf("MCDISPLAY: component %s\n", _comp->_name);
  double xmin;
  double xmax;
  double ymin;
  double ymax;

  if (radius)
  {
    
    circle("xy",0,0,0,radius);
    if (zdepth) {
      circle("xy",0,0,-zdepth/2,radius);
      circle("xy",0,0, zdepth/2,radius);
    }
  }
  else
  {
    xmin = -xwidth/2; xmax = xwidth/2;
    ymin = -yheight/2; ymax = yheight/2;

    
    multiline(5, (double)xmin, (double)ymin, 0.0,
             (double)xmax, (double)ymin, 0.0,
             (double)xmax, (double)ymax, 0.0,
             (double)xmin, (double)ymax, 0.0,
             (double)xmin, (double)ymin, 0.0);
    if (zdepth) {
      multiline(5, (double)xmin, (double)ymin, -zdepth/2,
             (double)xmax, (double)ymin, -zdepth/2,
             (double)xmax, (double)ymax, -zdepth/2,
             (double)xmin, (double)ymax, -zdepth/2,
             (double)xmin, (double)ymin, -zdepth/2);
      multiline(5, (double)xmin, (double)ymin, zdepth/2,
             (double)xmax, (double)ymin, zdepth/2,
             (double)xmax, (double)ymax, zdepth/2,
             (double)xmin, (double)ymax, zdepth/2,
             (double)xmin, (double)ymin, zdepth/2);
    }
  }
  if (dist) {
    if (focus_aw) focus_xw=dist*tan(focus_aw*DEG2RAD);
    if (focus_ah) focus_yh=dist*tan(focus_ah*DEG2RAD);
    dashed_line(0,0,0, -focus_xw/2,-focus_yh/2,dist, 4);
    dashed_line(0,0,0,  focus_xw/2,-focus_yh/2,dist, 4);
    dashed_line(0,0,0,  focus_xw/2, focus_yh/2,dist, 4);
    dashed_line(0,0,0, -focus_xw/2, focus_yh/2,dist, 4);
  }
  #undef flux_file
  #undef xdiv_file
  #undef ydiv_file
  #undef radius
  #undef dist
  #undef focus_xw
  #undef focus_yh
  #undef focus_aw
  #undef focus_ah
  #undef E0
  #undef dE
  #undef lambda0
  #undef dlambda
  #undef I1
  #undef yheight
  #undef xwidth
  #undef verbose
  #undef T1
  #undef flux_file_perAA
  #undef flux_file_log
  #undef Lmin
  #undef Lmax
  #undef Emin
  #undef Emax
  #undef T2
  #undef I2
  #undef T3
  #undef I3
  #undef zdepth
  #undef target_index
  #undef p_in
  #undef lambda1
  #undef lambda2
  #undef lambda3
  #undef pTable
  #undef pTable_x
  #undef pTable_y
  #undef pTable_xmin
  #undef pTable_xmax
  #undef pTable_xsum
  #undef pTable_ymin
  #undef pTable_ymax
  #undef pTable_ysum
  #undef pTable_dxmin
  #undef pTable_dxmax
  #undef pTable_dymin
  #undef pTable_dymax
  return(_comp);
} /* class_Source_gen_display */

_class_PowderN *class_PowderN_display(_class_PowderN *_comp
) {
  #define reflections (_comp->_parameters.reflections)
  #define geometry (_comp->_parameters.geometry)
  #define format (_comp->_parameters.format)
  #define radius (_comp->_parameters.radius)
  #define yheight (_comp->_parameters.yheight)
  #define xwidth (_comp->_parameters.xwidth)
  #define zdepth (_comp->_parameters.zdepth)
  #define thickness (_comp->_parameters.thickness)
  #define pack (_comp->_parameters.pack)
  #define Vc (_comp->_parameters.Vc)
  #define sigma_abs (_comp->_parameters.sigma_abs)
  #define sigma_inc (_comp->_parameters.sigma_inc)
  #define delta_d_d (_comp->_parameters.delta_d_d)
  #define p_inc (_comp->_parameters.p_inc)
  #define p_transmit (_comp->_parameters.p_transmit)
  #define DW (_comp->_parameters.DW)
  #define nb_atoms (_comp->_parameters.nb_atoms)
  #define d_omega (_comp->_parameters.d_omega)
  #define d_phi (_comp->_parameters.d_phi)
  #define tth_sign (_comp->_parameters.tth_sign)
  #define p_interact (_comp->_parameters.p_interact)
  #define concentric (_comp->_parameters.concentric)
  #define density (_comp->_parameters.density)
  #define weight (_comp->_parameters.weight)
  #define barns (_comp->_parameters.barns)
  #define Strain (_comp->_parameters.Strain)
  #define focus_flip (_comp->_parameters.focus_flip)
  #define target_index (_comp->_parameters.target_index)
  #define order (_comp->_parameters.order)
  #define line_info (_comp->_parameters.line_info)
  #define columns (_comp->_parameters.columns)
  #define offdata (_comp->_parameters.offdata)
  #define tgt_x (_comp->_parameters.tgt_x)
  #define tgt_y (_comp->_parameters.tgt_y)
  #define tgt_z (_comp->_parameters.tgt_z)
  SIG_MESSAGE("[_HCS_Al_display] component HCS_Al=PowderN() DISPLAY [PowderN:0]");

  printf("MCDISPLAY: component %s\n", _comp->_name);
  if (line_info.V_0) {

    if (line_info.shape == 0) { /* cyl */
      circle ("xz", 0, yheight / 2.0, 0, radius);
      circle ("xz", 0, -yheight / 2.0, 0, radius);
      line (-radius, -yheight / 2.0, 0, -radius, +yheight / 2.0, 0);
      line (+radius, -yheight / 2.0, 0, +radius, +yheight / 2.0, 0);
      line (0, -yheight / 2.0, -radius, 0, +yheight / 2.0, -radius);
      line (0, -yheight / 2.0, +radius, 0, +yheight / 2.0, +radius);
      if (thickness) {
        double radius_i = radius - thickness;
        circle ("xz", 0, yheight / 2.0, 0, radius_i);
        circle ("xz", 0, -yheight / 2.0, 0, radius_i);
        line (-radius_i, -yheight / 2.0, 0, -radius_i, +yheight / 2.0, 0);
        line (+radius_i, -yheight / 2.0, 0, +radius_i, +yheight / 2.0, 0);
        line (0, -yheight / 2.0, -radius_i, 0, +yheight / 2.0, -radius_i);
        line (0, -yheight / 2.0, +radius_i, 0, +yheight / 2.0, +radius_i);
      }
    } else if (line_info.shape == 1) { /* box */
      double xmin = -0.5 * xwidth;
      double xmax = 0.5 * xwidth;
      double ymin = -0.5 * yheight;
      double ymax = 0.5 * yheight;
      double zmin = -0.5 * zdepth;
      double zmax = 0.5 * zdepth;
      multiline (5, xmin, ymin, zmin, xmax, ymin, zmin, xmax, ymax, zmin, xmin, ymax, zmin, xmin, ymin, zmin);
      multiline (5, xmin, ymin, zmax, xmax, ymin, zmax, xmax, ymax, zmax, xmin, ymax, zmax, xmin, ymin, zmax);
      line (xmin, ymin, zmin, xmin, ymin, zmax);
      line (xmax, ymin, zmin, xmax, ymin, zmax);
      line (xmin, ymax, zmin, xmin, ymax, zmax);
      line (xmax, ymax, zmin, xmax, ymax, zmax);
      if (line_info.zdepth_i) {
        xmin = -0.5 * line_info.xwidth_i;
        xmax = 0.5 * line_info.xwidth_i;
        ymin = -0.5 * line_info.yheight_i;
        ymax = 0.5 * line_info.yheight_i;
        zmin = -0.5 * line_info.zdepth_i;
        zmax = 0.5 * line_info.zdepth_i;
        multiline (5, xmin, ymin, zmin, xmax, ymin, zmin, xmax, ymax, zmin, xmin, ymax, zmin, xmin, ymin, zmin);
        multiline (5, xmin, ymin, zmax, xmax, ymin, zmax, xmax, ymax, zmax, xmin, ymax, zmax, xmin, ymin, zmax);
        line (xmin, ymin, zmin, xmin, ymin, zmax);
        line (xmax, ymin, zmin, xmax, ymin, zmax);
        line (xmin, ymax, zmin, xmin, ymax, zmax);
        line (xmax, ymax, zmin, xmax, ymax, zmax);
      }
    }
    if (line_info.shape == 2) { /* sphere */
      if (line_info.radius_i) {
        circle ("xy", 0, 0, 0, line_info.radius_i);
        circle ("xz", 0, 0, 0, line_info.radius_i);
        circle ("yz", 0, 0, 0, line_info.radius_i);
      }
      circle ("xy", 0, 0, 0, radius);
      circle ("xz", 0, 0, 0, radius);
      circle ("yz", 0, 0, 0, radius);
    } else if (line_info.shape == 3) { /* OFF file */
      off_display (offdata);
    }
  }
  #undef reflections
  #undef geometry
  #undef format
  #undef radius
  #undef yheight
  #undef xwidth
  #undef zdepth
  #undef thickness
  #undef pack
  #undef Vc
  #undef sigma_abs
  #undef sigma_inc
  #undef delta_d_d
  #undef p_inc
  #undef p_transmit
  #undef DW
  #undef nb_atoms
  #undef d_omega
  #undef d_phi
  #undef tth_sign
  #undef p_interact
  #undef concentric
  #undef density
  #undef weight
  #undef barns
  #undef Strain
  #undef focus_flip
  #undef target_index
  #undef order
  #undef line_info
  #undef columns
  #undef offdata
  #undef tgt_x
  #undef tgt_y
  #undef tgt_z
  return(_comp);
} /* class_PowderN_display */

_class_Monitor_nD *class_Monitor_nD_display(_class_Monitor_nD *_comp
) {
  #define user1 (_comp->_parameters.user1)
  #define user2 (_comp->_parameters.user2)
  #define user3 (_comp->_parameters.user3)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define zdepth (_comp->_parameters.zdepth)
  #define xmin (_comp->_parameters.xmin)
  #define xmax (_comp->_parameters.xmax)
  #define ymin (_comp->_parameters.ymin)
  #define ymax (_comp->_parameters.ymax)
  #define zmin (_comp->_parameters.zmin)
  #define zmax (_comp->_parameters.zmax)
  #define bins (_comp->_parameters.bins)
  #define min (_comp->_parameters.min)
  #define max (_comp->_parameters.max)
  #define restore_neutron (_comp->_parameters.restore_neutron)
  #define radius (_comp->_parameters.radius)
  #define options (_comp->_parameters.options)
  #define filename (_comp->_parameters.filename)
  #define geometry (_comp->_parameters.geometry)
  #define nowritefile (_comp->_parameters.nowritefile)
  #define nexus_bins (_comp->_parameters.nexus_bins)
  #define username1 (_comp->_parameters.username1)
  #define username2 (_comp->_parameters.username2)
  #define username3 (_comp->_parameters.username3)
  #define DEFS (_comp->_parameters.DEFS)
  #define Vars (_comp->_parameters.Vars)
  #define detector (_comp->_parameters.detector)
  #define offdata (_comp->_parameters.offdata)
  SIG_MESSAGE("[_H5_display] component H5=Monitor_nD() DISPLAY [Monitor_nD:0]");

  printf("MCDISPLAY: component %s\n", _comp->_name);
  if (geometry && strlen (geometry) && strcmp (geometry, "0") && strcmp (geometry, "NULL")) {
    off_display (offdata);
  } else {
    Monitor_nD_McDisplay (&DEFS, &Vars);
  }
  #undef user1
  #undef user2
  #undef user3
  #undef xwidth
  #undef yheight
  #undef zdepth
  #undef xmin
  #undef xmax
  #undef ymin
  #undef ymax
  #undef zmin
  #undef zmax
  #undef bins
  #undef min
  #undef max
  #undef restore_neutron
  #undef radius
  #undef options
  #undef filename
  #undef geometry
  #undef nowritefile
  #undef nexus_bins
  #undef username1
  #undef username2
  #undef username3
  #undef DEFS
  #undef Vars
  #undef detector
  #undef offdata
  return(_comp);
} /* class_Monitor_nD_display */

_class_Guide_gravity *class_Guide_gravity_display(_class_Guide_gravity *_comp
) {
  #define w1 (_comp->_parameters.w1)
  #define h1 (_comp->_parameters.h1)
  #define w2 (_comp->_parameters.w2)
  #define h2 (_comp->_parameters.h2)
  #define l (_comp->_parameters.l)
  #define R0 (_comp->_parameters.R0)
  #define Qc (_comp->_parameters.Qc)
  #define alpha (_comp->_parameters.alpha)
  #define m (_comp->_parameters.m)
  #define W (_comp->_parameters.W)
  #define nslit (_comp->_parameters.nslit)
  #define d (_comp->_parameters.d)
  #define mleft (_comp->_parameters.mleft)
  #define mright (_comp->_parameters.mright)
  #define mtop (_comp->_parameters.mtop)
  #define mbottom (_comp->_parameters.mbottom)
  #define nhslit (_comp->_parameters.nhslit)
  #define G (_comp->_parameters.G)
  #define aleft (_comp->_parameters.aleft)
  #define aright (_comp->_parameters.aright)
  #define atop (_comp->_parameters.atop)
  #define abottom (_comp->_parameters.abottom)
  #define wavy (_comp->_parameters.wavy)
  #define wavy_z (_comp->_parameters.wavy_z)
  #define wavy_tb (_comp->_parameters.wavy_tb)
  #define wavy_lr (_comp->_parameters.wavy_lr)
  #define chamfers (_comp->_parameters.chamfers)
  #define chamfers_z (_comp->_parameters.chamfers_z)
  #define chamfers_lr (_comp->_parameters.chamfers_lr)
  #define chamfers_tb (_comp->_parameters.chamfers_tb)
  #define nelements (_comp->_parameters.nelements)
  #define nu (_comp->_parameters.nu)
  #define phase (_comp->_parameters.phase)
  #define reflect (_comp->_parameters.reflect)
  #define GVarsGlobal (_comp->_parameters.GVarsGlobal)
  #define pTable (_comp->_parameters.pTable)
  #define table_present (_comp->_parameters.table_present)
  SIG_MESSAGE("[_H5_rect_display] component H5_rect=Guide_gravity() DISPLAY [Guide_gravity:0]");

  printf("MCDISPLAY: component %s\n", _comp->_name);

  if (l > 0 && nelements > 0) {
    int i, j, n;
    double x1, x2, x3, x4;
    double y1, y2, y3, y4;
    double nel = (nelements > 11 ? 11 : nelements);

    for (n = 0; n < nel; n++) {
      double z0, z1;
      z0 = n * (l / nel);
      z1 = (n + 1) * (l / nel);

      for (j = 0; j < nhslit; j++) {
        y1 = j * (GVarsGlobal.h1c + d) - h1 / 2.0;
        y2 = j * (GVarsGlobal.h2c + d) - h2 / 2.0;
        y3 = (j + 1) * (GVarsGlobal.h1c + d) - d - h1 / 2.0;
        y4 = (j + 1) * (GVarsGlobal.h2c + d) - d - h2 / 2.0;
        for (i = 0; i < nslit; i++) {
          x1 = i * (GVarsGlobal.w1c + d) - w1 / 2.0;
          x2 = i * (GVarsGlobal.w2c + d) - w2 / 2.0;
          x3 = (i + 1) * (GVarsGlobal.w1c + d) - d - w1 / 2.0;
          x4 = (i + 1) * (GVarsGlobal.w2c + d) - d - w2 / 2.0;
          // Visualize i'th channel with vertical polygons
          polygon (4, x1, y1, z0, x2, y2, z1, x2, y4, z1, x1, y3, z0);
          polygon (4, x3, y1, z0, x4, y2, z1, x4, y4, z1, x3, y3, z0);
        }
        // Visualize "floor/roof" of i'th channel with vertical polygons
        polygon (4, -w1 / 2.0, y1, z0, w1 / 2.0, y1, z0, w2 / 2.0, y2, z1, -w2 / 2.0, y2, z1);
        polygon (4, -w1 / 2.0, y3, z0, w1 / 2.0, y3, z0, w2 / 2.0, y4, z1, -w2 / 2.0, y4, z1);
      }
    }

    if (nu || phase) {
      double radius = sqrt (w1 * w1 + l * l);
      /* cylinder top/center/bottom  */
      circle ("xz", 0, -h1 / 2, l / 2, radius);
      circle ("xz", 0, 0, l / 2, radius);
      circle ("xz", 0, h1 / 2, l / 2, radius);
    }
  } else {
    /* A bit ugly; hard-coded dimensions. */

    line (0, 0, 0, 0.2, 0, 0);
    line (0, 0, 0, 0, 0.2, 0);
    line (0, 0, 0, 0, 0, 0.2);
  }
  #undef w1
  #undef h1
  #undef w2
  #undef h2
  #undef l
  #undef R0
  #undef Qc
  #undef alpha
  #undef m
  #undef W
  #undef nslit
  #undef d
  #undef mleft
  #undef mright
  #undef mtop
  #undef mbottom
  #undef nhslit
  #undef G
  #undef aleft
  #undef aright
  #undef atop
  #undef abottom
  #undef wavy
  #undef wavy_z
  #undef wavy_tb
  #undef wavy_lr
  #undef chamfers
  #undef chamfers_z
  #undef chamfers_lr
  #undef chamfers_tb
  #undef nelements
  #undef nu
  #undef phase
  #undef reflect
  #undef GVarsGlobal
  #undef pTable
  #undef table_present
  return(_comp);
} /* class_Guide_gravity_display */

_class_Arm *class_Arm_display(_class_Arm *_comp
) {
  SIG_MESSAGE("[_H53_start_display] component H53_start=Arm() DISPLAY [Arm:0]");

  printf("MCDISPLAY: component %s\n", _comp->_name);
  /* A bit ugly; hard-coded dimensions. */

  line (0, 0, 0, 0.2, 0, 0);
  line (0, 0, 0, 0, 0.2, 0);
  line (0, 0, 0, 0, 0, 0.2);

  cone (0.2, 0, 0, 0.01, 0.02, 1, 0, 0);
  cone (0, 0.2, 0, 0.01, 0.02, 0, 1, 0);
  cone (0, 0, 0.2, 0.01, 0.02, 0, 0, 1);
  return(_comp);
} /* class_Arm_display */

_class_Guide_tapering *class_Guide_tapering_display(_class_Guide_tapering *_comp
) {
  #define option (_comp->_parameters.option)
  #define w1 (_comp->_parameters.w1)
  #define h1 (_comp->_parameters.h1)
  #define l (_comp->_parameters.l)
  #define linw (_comp->_parameters.linw)
  #define loutw (_comp->_parameters.loutw)
  #define linh (_comp->_parameters.linh)
  #define louth (_comp->_parameters.louth)
  #define R0 (_comp->_parameters.R0)
  #define Qcx (_comp->_parameters.Qcx)
  #define Qcy (_comp->_parameters.Qcy)
  #define alphax (_comp->_parameters.alphax)
  #define alphay (_comp->_parameters.alphay)
  #define W (_comp->_parameters.W)
  #define mx (_comp->_parameters.mx)
  #define my (_comp->_parameters.my)
  #define segno (_comp->_parameters.segno)
  #define curvature (_comp->_parameters.curvature)
  #define curvature_v (_comp->_parameters.curvature_v)
  #define w1c (_comp->_parameters.w1c)
  #define w2c (_comp->_parameters.w2c)
  #define ww (_comp->_parameters.ww)
  #define hh (_comp->_parameters.hh)
  #define whalf (_comp->_parameters.whalf)
  #define hhalf (_comp->_parameters.hhalf)
  #define lwhalf (_comp->_parameters.lwhalf)
  #define lhhalf (_comp->_parameters.lhhalf)
  #define h1_in (_comp->_parameters.h1_in)
  #define h2_out (_comp->_parameters.h2_out)
  #define w1_in (_comp->_parameters.w1_in)
  #define w2_out (_comp->_parameters.w2_out)
  #define l_seg (_comp->_parameters.l_seg)
  #define h12 (_comp->_parameters.h12)
  #define h2 (_comp->_parameters.h2)
  #define w12 (_comp->_parameters.w12)
  #define w2 (_comp->_parameters.w2)
  #define a_ell_q (_comp->_parameters.a_ell_q)
  #define b_ell_q (_comp->_parameters.b_ell_q)
  #define lbw (_comp->_parameters.lbw)
  #define lbh (_comp->_parameters.lbh)
  #define mxi (_comp->_parameters.mxi)
  #define u1 (_comp->_parameters.u1)
  #define u2 (_comp->_parameters.u2)
  #define div1 (_comp->_parameters.div1)
  #define p2_para (_comp->_parameters.p2_para)
  #define test (_comp->_parameters.test)
  #define Div1 (_comp->_parameters.Div1)
  #define seg (_comp->_parameters.seg)
  #define fu (_comp->_parameters.fu)
  #define pos (_comp->_parameters.pos)
  #define file_name (_comp->_parameters.file_name)
  #define ep (_comp->_parameters.ep)
  #define num (_comp->_parameters.num)
  #define rotation_h (_comp->_parameters.rotation_h)
  #define rotation_v (_comp->_parameters.rotation_v)
  SIG_MESSAGE("[_H53_Nose_display] component H53_Nose=Guide_tapering() DISPLAY [Guide_tapering:0]");

  printf("MCDISPLAY: component %s\n", _comp->_name);
  int i, ii;

  for (ii = 0; ii < seg; ii++) {
    multiline (5, -w1_in[ii] / 2.0, -h1_in[ii] / 2.0, l_seg * (double)ii, -w2_out[ii] / 2.0, -h2_out[ii] / 2.0, l_seg * ((double)ii + 1.0), -w2_out[ii] / 2.0,
               h2_out[ii] / 2.0, l_seg * ((double)ii + 1.0), -w1_in[ii] / 2.0, h1_in[ii] / 2.0, l_seg * (double)ii, -w1_in[ii] / 2.0, -h1_in[ii] / 2.0,
               l_seg * (double)ii);
    multiline (5, w1_in[ii] / 2.0, -h1_in[ii] / 2.0, l_seg * (double)ii, w2_out[ii] / 2.0, -h2_out[ii] / 2.0, l_seg * ((double)ii + 1.0), w2_out[ii] / 2.0,
               h2_out[ii] / 2.0, l_seg * ((double)ii + 1.0), w1_in[ii] / 2.0, h1_in[ii] / 2.0, l_seg * (double)ii, w1_in[ii] / 2.0, -h1_in[ii] / 2.0,
               l_seg * (double)ii);
  }
  line (-w1 / 2.0, -h1 / 2.0, 0.0, w1 / 2.0, -h1 / 2.0, 0.0);
  line (-w1 / 2.0, h1 / 2.0, 0.0, w1 / 2.0, h1 / 2.0, 0.0);
  for (i = 0; i < segno; i++) {
    line (-w2_out[i] / 2.0, -h2_out[i] / 2.0, l_seg * (double)(i + 1), w2_out[i] / 2.0, -h2_out[i] / 2.0, l_seg * (double)(i + 1));
    line (-w2_out[i] / 2.0, h2_out[i] / 2.0, l_seg * (double)(i + 1), w2_out[i] / 2.0, h2_out[i] / 2.0, l_seg * (double)(i + 1));
  }
  #undef option
  #undef w1
  #undef h1
  #undef l
  #undef linw
  #undef loutw
  #undef linh
  #undef louth
  #undef R0
  #undef Qcx
  #undef Qcy
  #undef alphax
  #undef alphay
  #undef W
  #undef mx
  #undef my
  #undef segno
  #undef curvature
  #undef curvature_v
  #undef w1c
  #undef w2c
  #undef ww
  #undef hh
  #undef whalf
  #undef hhalf
  #undef lwhalf
  #undef lhhalf
  #undef h1_in
  #undef h2_out
  #undef w1_in
  #undef w2_out
  #undef l_seg
  #undef h12
  #undef h2
  #undef w12
  #undef w2
  #undef a_ell_q
  #undef b_ell_q
  #undef lbw
  #undef lbh
  #undef mxi
  #undef u1
  #undef u2
  #undef div1
  #undef p2_para
  #undef test
  #undef Div1
  #undef seg
  #undef fu
  #undef pos
  #undef file_name
  #undef ep
  #undef num
  #undef rotation_h
  #undef rotation_v
  return(_comp);
} /* class_Guide_tapering_display */

_class_Monochromator_curved *class_Monochromator_curved_display(_class_Monochromator_curved *_comp
) {
  #define reflect (_comp->_parameters.reflect)
  #define transmit (_comp->_parameters.transmit)
  #define zwidth (_comp->_parameters.zwidth)
  #define yheight (_comp->_parameters.yheight)
  #define gap (_comp->_parameters.gap)
  #define NH (_comp->_parameters.NH)
  #define NV (_comp->_parameters.NV)
  #define mosaich (_comp->_parameters.mosaich)
  #define mosaicv (_comp->_parameters.mosaicv)
  #define r0 (_comp->_parameters.r0)
  #define t0 (_comp->_parameters.t0)
  #define Q (_comp->_parameters.Q)
  #define RV (_comp->_parameters.RV)
  #define RH (_comp->_parameters.RH)
  #define DM (_comp->_parameters.DM)
  #define mosaic (_comp->_parameters.mosaic)
  #define width (_comp->_parameters.width)
  #define height (_comp->_parameters.height)
  #define verbose (_comp->_parameters.verbose)
  #define order (_comp->_parameters.order)
  #define mos_rms_y (_comp->_parameters.mos_rms_y)
  #define mos_rms_z (_comp->_parameters.mos_rms_z)
  #define mos_rms_max (_comp->_parameters.mos_rms_max)
  #define mono_Q (_comp->_parameters.mono_Q)
  #define SlabWidth (_comp->_parameters.SlabWidth)
  #define SlabHeight (_comp->_parameters.SlabHeight)
  #define rTable (_comp->_parameters.rTable)
  #define tTable (_comp->_parameters.tTable)
  #define rTableFlag (_comp->_parameters.rTableFlag)
  #define tTableFlag (_comp->_parameters.tTableFlag)
  #define tiltH (_comp->_parameters.tiltH)
  #define tiltV (_comp->_parameters.tiltV)
  #define ncol_var (_comp->_parameters.ncol_var)
  #define nrow_var (_comp->_parameters.nrow_var)
  SIG_MESSAGE("[_H53_ThALES_Monochromator_display] component H53_ThALES_Monochromator=Monochromator_curved() DISPLAY [Monochromator_curved:0]");

  printf("MCDISPLAY: component %s\n", _comp->_name);
  int ih;

  for (ih = 0; ih < NH; ih++) {
    int iv;
    for (iv = 0; iv < NV; iv++) {
      double zmin, zmax, ymin, ymax;
      double xt, yt;

      zmin = (SlabWidth + gap) * (ih - NH / 2.0) + gap / 2;
      zmax = zmin + SlabWidth;
      ymin = (SlabHeight + gap) * (iv - NV / 2.0) + gap / 2;
      ymax = ymin + SlabHeight;

      if (RH)
        xt = -(zmax * zmax - zmin * zmin) / RH / 2;
      else
        xt = 0;

      if (RV)
        yt = -(ymax * ymax - ymin * ymin) / RV / 2;
      else
        yt = 0;
      multiline (5, xt + yt, (double)ymin, (double)zmin, xt - yt, (double)ymax, (double)zmin, -xt - yt, (double)ymax, (double)zmax, -xt + yt, (double)ymin,
                 (double)zmax, xt + yt, (double)ymin, (double)zmin);
    }
  }
  #undef reflect
  #undef transmit
  #undef zwidth
  #undef yheight
  #undef gap
  #undef NH
  #undef NV
  #undef mosaich
  #undef mosaicv
  #undef r0
  #undef t0
  #undef Q
  #undef RV
  #undef RH
  #undef DM
  #undef mosaic
  #undef width
  #undef height
  #undef verbose
  #undef order
  #undef mos_rms_y
  #undef mos_rms_z
  #undef mos_rms_max
  #undef mono_Q
  #undef SlabWidth
  #undef SlabHeight
  #undef rTable
  #undef tTable
  #undef rTableFlag
  #undef tTableFlag
  #undef tiltH
  #undef tiltV
  #undef ncol_var
  #undef nrow_var
  return(_comp);
} /* class_Monochromator_curved_display */

_class_Isotropic_Sqw *class_Isotropic_Sqw_display(_class_Isotropic_Sqw *_comp
) {
  #define powder_format (_comp->_parameters.powder_format)
  #define Sqw_coh (_comp->_parameters.Sqw_coh)
  #define Sqw_inc (_comp->_parameters.Sqw_inc)
  #define geometry (_comp->_parameters.geometry)
  #define radius (_comp->_parameters.radius)
  #define thickness (_comp->_parameters.thickness)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define zdepth (_comp->_parameters.zdepth)
  #define threshold (_comp->_parameters.threshold)
  #define order (_comp->_parameters.order)
  #define T (_comp->_parameters.T)
  #define verbose (_comp->_parameters.verbose)
  #define d_phi (_comp->_parameters.d_phi)
  #define concentric (_comp->_parameters.concentric)
  #define rho (_comp->_parameters.rho)
  #define sigma_abs (_comp->_parameters.sigma_abs)
  #define sigma_coh (_comp->_parameters.sigma_coh)
  #define sigma_inc (_comp->_parameters.sigma_inc)
  #define classical (_comp->_parameters.classical)
  #define powder_Dd (_comp->_parameters.powder_Dd)
  #define powder_DW (_comp->_parameters.powder_DW)
  #define powder_Vc (_comp->_parameters.powder_Vc)
  #define density (_comp->_parameters.density)
  #define weight (_comp->_parameters.weight)
  #define p_interact (_comp->_parameters.p_interact)
  #define norm (_comp->_parameters.norm)
  #define powder_barns (_comp->_parameters.powder_barns)
  #define quantum_correction (_comp->_parameters.quantum_correction)
  #define VarSqw (_comp->_parameters.VarSqw)
  #define columns (_comp->_parameters.columns)
  #define offdata (_comp->_parameters.offdata)
  SIG_MESSAGE("[_H53_ThALES_Sample_display] component H53_ThALES_Sample=Isotropic_Sqw() DISPLAY [Isotropic_Sqw:0]");

  printf("MCDISPLAY: component %s\n", _comp->_name);
  if (VarSqw.s_coh > 0 || VarSqw.s_inc > 0) {

    if (VarSqw.shape == 1) {
      double xmin = -0.5 * xwidth;
      double xmax = 0.5 * xwidth;
      double ymin = -0.5 * yheight;
      double ymax = 0.5 * yheight;
      double zmin = -0.5 * zdepth;
      double zmax = 0.5 * zdepth;
      multiline (5, xmin, ymin, zmin, xmax, ymin, zmin, xmax, ymax, zmin, xmin, ymax, zmin, xmin, ymin, zmin);
      multiline (5, xmin, ymin, zmax, xmax, ymin, zmax, xmax, ymax, zmax, xmin, ymax, zmax, xmin, ymin, zmax);
      line (xmin, ymin, zmin, xmin, ymin, zmax);
      line (xmax, ymin, zmin, xmax, ymin, zmax);
      line (xmin, ymax, zmin, xmin, ymax, zmax);
      line (xmax, ymax, zmin, xmax, ymax, zmax);

      if (thickness) {
        xmin = -0.5 * xwidth + thickness;
        xmax = -xmin;
        ymin = -0.5 * yheight + thickness;
        ymax = -ymin;
        zmin = -0.5 * zdepth + thickness;
        zmax = -zmin;
        multiline (5, xmin, ymin, zmin, xmax, ymin, zmin, xmax, ymax, zmin, xmin, ymax, zmin, xmin, ymin, zmin);
        multiline (5, xmin, ymin, zmax, xmax, ymin, zmax, xmax, ymax, zmax, xmin, ymax, zmax, xmin, ymin, zmax);
        line (xmin, ymin, zmin, xmin, ymin, zmax);
        line (xmax, ymin, zmin, xmax, ymin, zmax);
        line (xmin, ymax, zmin, xmin, ymax, zmax);
        line (xmax, ymax, zmin, xmax, ymax, zmax);
      }
    } else if (VarSqw.shape == 0) {
      circle ("xz", 0, yheight / 2.0, 0, radius);
      circle ("xz", 0, -yheight / 2.0, 0, radius);
      line (-radius, -yheight / 2.0, 0, -radius, +yheight / 2.0, 0);
      line (+radius, -yheight / 2.0, 0, +radius, +yheight / 2.0, 0);
      line (0, -yheight / 2.0, -radius, 0, +yheight / 2.0, -radius);
      line (0, -yheight / 2.0, +radius, 0, +yheight / 2.0, +radius);
      if (thickness) {
        double radius_i = radius - thickness;
        circle ("xz", 0, yheight / 2.0, 0, radius_i);
        circle ("xz", 0, -yheight / 2.0, 0, radius_i);
        line (-radius_i, -yheight / 2.0, 0, -radius_i, +yheight / 2.0, 0);
        line (+radius_i, -yheight / 2.0, 0, +radius_i, +yheight / 2.0, 0);
        line (0, -yheight / 2.0, -radius_i, 0, +yheight / 2.0, -radius_i);
        line (0, -yheight / 2.0, +radius_i, 0, +yheight / 2.0, +radius_i);
      }
    } else if (VarSqw.shape == 2) {
      if (thickness) {
        double radius_i = radius - thickness;
        circle ("xy", 0, 0, 0, radius_i);
        circle ("xz", 0, 0, 0, radius_i);
        circle ("yz", 0, 0, 0, radius_i);
      }
      circle ("xy", 0, 0, 0, radius);
      circle ("xz", 0, 0, 0, radius);
      circle ("yz", 0, 0, 0, radius);
    } else if (VarSqw.shape == 3) { /* OFF file */
      off_display (offdata);
    }
  }
  /* end MCDISPLAY */
  #undef powder_format
  #undef Sqw_coh
  #undef Sqw_inc
  #undef geometry
  #undef radius
  #undef thickness
  #undef xwidth
  #undef yheight
  #undef zdepth
  #undef threshold
  #undef order
  #undef T
  #undef verbose
  #undef d_phi
  #undef concentric
  #undef rho
  #undef sigma_abs
  #undef sigma_coh
  #undef sigma_inc
  #undef classical
  #undef powder_Dd
  #undef powder_DW
  #undef powder_Vc
  #undef density
  #undef weight
  #undef p_interact
  #undef norm
  #undef powder_barns
  #undef quantum_correction
  #undef VarSqw
  #undef columns
  #undef offdata
  return(_comp);
} /* class_Isotropic_Sqw_display */

_class_Collimator_linear *class_Collimator_linear_display(_class_Collimator_linear *_comp
) {
  #define xmin (_comp->_parameters.xmin)
  #define xmax (_comp->_parameters.xmax)
  #define ymin (_comp->_parameters.ymin)
  #define ymax (_comp->_parameters.ymax)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define length (_comp->_parameters.length)
  #define divergence (_comp->_parameters.divergence)
  #define transmission (_comp->_parameters.transmission)
  #define divergenceV (_comp->_parameters.divergenceV)
  #define slope (_comp->_parameters.slope)
  #define slopeV (_comp->_parameters.slopeV)
  SIG_MESSAGE("[_SC3_display] component SC3=Collimator_linear() DISPLAY [Collimator_linear:0]");

  printf("MCDISPLAY: component %s\n", _comp->_name);
  double x;
  int i;

  for (x = xmin, i = 0; i <= 3; i++, x += (xmax - xmin) / 3.0)
    multiline (5, x, (double)ymin, 0.0, x, (double)ymax, 0.0, x, (double)ymax, (double)length, x, (double)ymin, (double)length, x, (double)ymin, 0.0);
  line (xmin, ymin, 0, xmax, ymin, 0);
  line (xmin, ymax, 0, xmax, ymax, 0);
  line (xmin, ymin, length, xmax, ymin, length);
  line (xmin, ymax, length, xmax, ymax, length);
  #undef xmin
  #undef xmax
  #undef ymin
  #undef ymax
  #undef xwidth
  #undef yheight
  #undef length
  #undef divergence
  #undef transmission
  #undef divergenceV
  #undef slope
  #undef slopeV
  return(_comp);
} /* class_Collimator_linear_display */

_class_Monitor *class_Monitor_display(_class_Monitor *_comp
) {
  #define xmin (_comp->_parameters.xmin)
  #define xmax (_comp->_parameters.xmax)
  #define ymin (_comp->_parameters.ymin)
  #define ymax (_comp->_parameters.ymax)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define restore_neutron (_comp->_parameters.restore_neutron)
  #define Nsum (_comp->_parameters.Nsum)
  #define psum (_comp->_parameters.psum)
  #define p2sum (_comp->_parameters.p2sum)
  SIG_MESSAGE("[_He3H_display] component He3H=Monitor() DISPLAY [Monitor:0]");

  printf("MCDISPLAY: component %s\n", _comp->_name);

  multiline (5, (double)xmin, (double)ymin, 0.0, (double)xmax, (double)ymin, 0.0, (double)xmax, (double)ymax, 0.0, (double)xmin, (double)ymax, 0.0, (double)xmin,
             (double)ymin, 0.0);
  #undef xmin
  #undef xmax
  #undef ymin
  #undef ymax
  #undef xwidth
  #undef yheight
  #undef restore_neutron
  #undef Nsum
  #undef psum
  #undef p2sum
  return(_comp);
} /* class_Monitor_display */

_class_V_selector *class_V_selector_display(_class_V_selector *_comp
) {
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define zdepth (_comp->_parameters.zdepth)
  #define radius (_comp->_parameters.radius)
  #define alpha (_comp->_parameters.alpha)
  #define length (_comp->_parameters.length)
  #define d (_comp->_parameters.d)
  #define nu (_comp->_parameters.nu)
  #define nslit (_comp->_parameters.nslit)
  #define omega (_comp->_parameters.omega)
  #define alpha_rad (_comp->_parameters.alpha_rad)
  SIG_MESSAGE("[_WASP_Vselector_display] component WASP_Vselector=V_selector() DISPLAY [V_selector:0]");

  printf("MCDISPLAY: component %s\n", _comp->_name);
  double r = radius + yheight;
  double x0 = -xwidth / 2.0;
  double x1 = xwidth / 2.0;
  double y0 = -yheight / 2.0;
  double y1 = yheight / 2.0;
  double z0 = -zdepth / 2.0;
  double z1 = -length / 2.0;
  double z2 = length / 2.0;
  double z3 = zdepth / 2.0;
  double a;
  double xw, yh;

  xw = xwidth / 2.0;
  yh = yheight / 2.0;
  /* Draw apertures */
  for (a = z0;;) {
    multiline (3, x0 - xw, (double)y1, a, (double)x0, (double)y1, a, (double)x0, y1 + yh, a);
    multiline (3, x1 + xw, (double)y1, a, (double)x1, (double)y1, a, (double)x1, y1 + yh, a);
    multiline (3, x0 - xw, (double)y0, a, (double)x0, (double)y0, a, (double)x0, y0 - yh, a);
    multiline (3, x1 + xw, (double)y0, a, (double)x1, (double)y0, a, (double)x1, y0 - yh, a);
    if (a == z3)
      break;
    else
      a = z3;
  }

  /* Draw cylinder. */
  circle ("xy", 0, -radius, z1, r);
  circle ("xy", 0, -radius, z2, r);
  line (0, -radius, z1, 0, -radius, z2);
  for (a = 0; a < 2 * PI; a += PI / 8) {
    multiline (4, 0.0, -radius, z1, r * cos (a), r * sin (a) - radius, z1, r * cos (a + DEG2RAD * alpha), r * sin (a + DEG2RAD * alpha) - radius, z2, 0.0,
               -radius, z2);
  }
  #undef xwidth
  #undef yheight
  #undef zdepth
  #undef radius
  #undef alpha
  #undef length
  #undef d
  #undef nu
  #undef nslit
  #undef omega
  #undef alpha_rad
  return(_comp);
} /* class_V_selector_display */

_class_Pol_mirror *class_Pol_mirror_display(_class_Pol_mirror *_comp
) {
  #define rUpPar (_comp->_parameters.rUpPar)
  #define rDownPar (_comp->_parameters.rDownPar)
  #define rUpData (_comp->_parameters.rUpData)
  #define rDownData (_comp->_parameters.rDownData)
  #define p_reflect (_comp->_parameters.p_reflect)
  #define zwidth (_comp->_parameters.zwidth)
  #define yheight (_comp->_parameters.yheight)
  #define rUpTable (_comp->_parameters.rUpTable)
  #define rUpTableFlag (_comp->_parameters.rUpTableFlag)
  #define rDownTable (_comp->_parameters.rDownTable)
  #define rDownTableFlag (_comp->_parameters.rDownTableFlag)
  SIG_MESSAGE("[_WASP_polariser_display] component WASP_polariser=Pol_mirror() DISPLAY [Pol_mirror:0]");

  printf("MCDISPLAY: component %s\n", _comp->_name);

  rectangle ("yz", 0, 0, 0, zwidth, yheight);
  #undef rUpPar
  #undef rDownPar
  #undef rUpData
  #undef rDownData
  #undef p_reflect
  #undef zwidth
  #undef yheight
  #undef rUpTable
  #undef rUpTableFlag
  #undef rDownTable
  #undef rDownTableFlag
  return(_comp);
} /* class_Pol_mirror_display */

_class_Pol_guide_vmirror *class_Pol_guide_vmirror_display(_class_Pol_guide_vmirror *_comp
) {
  #define nvs (_comp->_parameters.nvs)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define length (_comp->_parameters.length)
  #define rR0 (_comp->_parameters.rR0)
  #define rQc (_comp->_parameters.rQc)
  #define ralpha (_comp->_parameters.ralpha)
  #define rmSM (_comp->_parameters.rmSM)
  #define rW (_comp->_parameters.rW)
  #define rbeta (_comp->_parameters.rbeta)
  #define rUpR0 (_comp->_parameters.rUpR0)
  #define rUpQc (_comp->_parameters.rUpQc)
  #define rUpalpha (_comp->_parameters.rUpalpha)
  #define rUpmSM (_comp->_parameters.rUpmSM)
  #define rUpW (_comp->_parameters.rUpW)
  #define rUpbeta (_comp->_parameters.rUpbeta)
  #define rDownR0 (_comp->_parameters.rDownR0)
  #define rDownQc (_comp->_parameters.rDownQc)
  #define rDownalpha (_comp->_parameters.rDownalpha)
  #define rDownmSM (_comp->_parameters.rDownmSM)
  #define rDownW (_comp->_parameters.rDownW)
  #define rDownbeta (_comp->_parameters.rDownbeta)
  #define debug (_comp->_parameters.debug)
  #define allow_inside_start (_comp->_parameters.allow_inside_start)
  #define rPar (_comp->_parameters.rPar)
  #define rUpPar (_comp->_parameters.rUpPar)
  #define rDownPar (_comp->_parameters.rDownPar)
  #define rParFile (_comp->_parameters.rParFile)
  #define rUpParFile (_comp->_parameters.rUpParFile)
  #define rDownParFile (_comp->_parameters.rDownParFile)
  #define inputType (_comp->_parameters.inputType)
  #define localG (_comp->_parameters.localG)
  #define normalTop (_comp->_parameters.normalTop)
  #define normalBot (_comp->_parameters.normalBot)
  #define normalLeft (_comp->_parameters.normalLeft)
  #define normalRight (_comp->_parameters.normalRight)
  #define normalInOut (_comp->_parameters.normalInOut)
  #define pointTop (_comp->_parameters.pointTop)
  #define pointBot (_comp->_parameters.pointBot)
  #define pointLeft (_comp->_parameters.pointLeft)
  #define pointRight (_comp->_parameters.pointRight)
  #define pointIn (_comp->_parameters.pointIn)
  #define pointOut (_comp->_parameters.pointOut)
  #define mirrorNormals (_comp->_parameters.mirrorNormals)
  #define mirrorPoints (_comp->_parameters.mirrorPoints)
  #define xwhalf (_comp->_parameters.xwhalf)
  #define xwfull (_comp->_parameters.xwfull)
  #define norm (_comp->_parameters.norm)
  #define n_index (_comp->_parameters.n_index)
  #define i_index (_comp->_parameters.i_index)
  #define rParToFunc (_comp->_parameters.rParToFunc)
  #define rUpParToFunc (_comp->_parameters.rUpParToFunc)
  #define rDownParToFunc (_comp->_parameters.rDownParToFunc)
  #define rParPtr (_comp->_parameters.rParPtr)
  #define rUpParPtr (_comp->_parameters.rUpParPtr)
  #define rDownParPtr (_comp->_parameters.rDownParPtr)
  SIG_MESSAGE("[_WASP_Vpolariser_display] component WASP_Vpolariser=Pol_guide_vmirror() DISPLAY [Pol_guide_vmirror:0]");

  printf("MCDISPLAY: component %s\n", _comp->_name);
  int i, j;

  double dx = xwidth / (2 * nvs);

  // draw box
  box (0, 0, length / 2.0, xwidth, yheight, length, 0, 0, 1, 0);

  for (i = -nvs; i <= nvs; i += 2)
    for (j = -1; j <= 1; j += 2) {
      double dx2 = (i + j) * dx;
      if (dx2 < -xwidth / 2.0)
        dx2 = -xwidth / 2.0;
      if (dx2 > xwidth / 2.0)
        dx2 = xwidth / 2.0;
      line (dx2, j * yheight / 2, 0, i * dx, j * yheight / 2, length);
    }
  #undef nvs
  #undef xwidth
  #undef yheight
  #undef length
  #undef rR0
  #undef rQc
  #undef ralpha
  #undef rmSM
  #undef rW
  #undef rbeta
  #undef rUpR0
  #undef rUpQc
  #undef rUpalpha
  #undef rUpmSM
  #undef rUpW
  #undef rUpbeta
  #undef rDownR0
  #undef rDownQc
  #undef rDownalpha
  #undef rDownmSM
  #undef rDownW
  #undef rDownbeta
  #undef debug
  #undef allow_inside_start
  #undef rPar
  #undef rUpPar
  #undef rDownPar
  #undef rParFile
  #undef rUpParFile
  #undef rDownParFile
  #undef inputType
  #undef localG
  #undef normalTop
  #undef normalBot
  #undef normalLeft
  #undef normalRight
  #undef normalInOut
  #undef pointTop
  #undef pointBot
  #undef pointLeft
  #undef pointRight
  #undef pointIn
  #undef pointOut
  #undef mirrorNormals
  #undef mirrorPoints
  #undef xwhalf
  #undef xwfull
  #undef norm
  #undef n_index
  #undef i_index
  #undef rParToFunc
  #undef rUpParToFunc
  #undef rDownParToFunc
  #undef rParPtr
  #undef rUpParPtr
  #undef rDownParPtr
  return(_comp);
} /* class_Pol_guide_vmirror_display */

_class_Incoherent *class_Incoherent_display(_class_Incoherent *_comp
) {
  #define geometry (_comp->_parameters.geometry)
  #define radius (_comp->_parameters.radius)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define zdepth (_comp->_parameters.zdepth)
  #define thickness (_comp->_parameters.thickness)
  #define target_x (_comp->_parameters.target_x)
  #define target_y (_comp->_parameters.target_y)
  #define target_z (_comp->_parameters.target_z)
  #define focus_r (_comp->_parameters.focus_r)
  #define focus_xw (_comp->_parameters.focus_xw)
  #define focus_yh (_comp->_parameters.focus_yh)
  #define focus_aw (_comp->_parameters.focus_aw)
  #define focus_ah (_comp->_parameters.focus_ah)
  #define target_index (_comp->_parameters.target_index)
  #define pack (_comp->_parameters.pack)
  #define p_interact (_comp->_parameters.p_interact)
  #define f_QE (_comp->_parameters.f_QE)
  #define gamma (_comp->_parameters.gamma)
  #define Etrans (_comp->_parameters.Etrans)
  #define deltaE (_comp->_parameters.deltaE)
  #define sigma_abs (_comp->_parameters.sigma_abs)
  #define sigma_inc (_comp->_parameters.sigma_inc)
  #define Vc (_comp->_parameters.Vc)
  #define concentric (_comp->_parameters.concentric)
  #define order (_comp->_parameters.order)
  #define VarsInc (_comp->_parameters.VarsInc)
  #define offdata (_comp->_parameters.offdata)
  SIG_MESSAGE("[_H522_WASP_Sample_display] component H522_WASP_Sample=Incoherent() DISPLAY [Incoherent:0]");

  printf("MCDISPLAY: component %s\n", _comp->_name);
  if (geometry && strlen (geometry) && strcmp (geometry, "NULL") && strcmp (geometry, "0")) { /* OFF file */
    off_display (offdata);
  } else if (radius > 0 && yheight) { /* cylinder along y*/
    cylinder (0, 0, 0, radius, yheight, thickness, 0, 1, 0);
  } else if (xwidth && yheight) { /* box/rectangle */
    box (0, 0, 0, xwidth, yheight, zdepth, thickness, 0, 1, 0);
  } else if (radius > 0 && !yheight) { /* sphere */
    sphere (0, 0, 0, radius);
  }
  #undef geometry
  #undef radius
  #undef xwidth
  #undef yheight
  #undef zdepth
  #undef thickness
  #undef target_x
  #undef target_y
  #undef target_z
  #undef focus_r
  #undef focus_xw
  #undef focus_yh
  #undef focus_aw
  #undef focus_ah
  #undef target_index
  #undef pack
  #undef p_interact
  #undef f_QE
  #undef gamma
  #undef Etrans
  #undef deltaE
  #undef sigma_abs
  #undef sigma_inc
  #undef Vc
  #undef concentric
  #undef order
  #undef VarsInc
  #undef offdata
  return(_comp);
} /* class_Incoherent_display */

_class_Shape *class_Shape_display(_class_Shape *_comp
) {
  #define geometry (_comp->_parameters.geometry)
  #define radius (_comp->_parameters.radius)
  #define xwidth (_comp->_parameters.xwidth)
  #define yheight (_comp->_parameters.yheight)
  #define zdepth (_comp->_parameters.zdepth)
  #define thickness (_comp->_parameters.thickness)
  #define nx (_comp->_parameters.nx)
  #define ny (_comp->_parameters.ny)
  #define nz (_comp->_parameters.nz)
  #define center (_comp->_parameters.center)
  #define offdata (_comp->_parameters.offdata)
  SIG_MESSAGE("[_D22_Detector_vessel_display] component D22_Detector_vessel=Shape() DISPLAY [Shape:0]");

  printf("MCDISPLAY: component %s\n", _comp->_name);
  if (geometry && strlen (geometry) && strcmp (geometry, "NULL") && strcmp (geometry, "0")) { /* OFF file */
    off_display (offdata);
  } else if (radius > 0 && yheight) { /* cylinder along y*/
    cylinder (0, 0, 0, radius, yheight, thickness, nx, ny, nz);
  } else if (xwidth && yheight) { /* box/rectangle */
    box (0, 0, 0, xwidth, yheight, zdepth, thickness, nx, ny, nz);
  } else if (radius > 0 && !yheight) { /* sphere */
    sphere (0, 0, 0, radius);
  }
  #undef geometry
  #undef radius
  #undef xwidth
  #undef yheight
  #undef zdepth
  #undef thickness
  #undef nx
  #undef ny
  #undef nz
  #undef center
  #undef offdata
  return(_comp);
} /* class_Shape_display */


  #undef magnify
  #undef line
  #undef dashed_line
  #undef multiline
  #undef rectangle
  #undef box
  #undef circle
  #undef cylinder
  #undef sphere

int display(void) { /* called by mccode_main for ILL_H5_new:DISPLAY */
  printf("MCDISPLAY: start\n");

  /* call iteratively all components DISPLAY */
  class_Progress_bar_display(&_Origin_var);

  class_Source_gen_display(&_HCS_var);

  class_PowderN_display(&_HCS_Al_var);

  class_PowderN_display(&_HCS_Al_4_var);

  class_PowderN_display(&_HCS_Al_5_var);

  class_PowderN_display(&_HCS_Al_6_var);

  class_PowderN_display(&_HCS_Al_7_var);

  class_Monitor_nD_display(&_H5_var);

  class_Guide_gravity_display(&_H5_rect_var);

  class_Monitor_nD_display(&_H53_origin_var);

  class_Monitor_nD_display(&_H52_origin_var);

  class_Monitor_nD_display(&_H51_origin_var);

  class_Arm_display(&_H53_start_var);

  class_Guide_gravity_display(&_H53_inpile_var);

  class_PowderN_display(&_H53_Al_var);

  class_Guide_gravity_display(&_H53_Obt_var);

  class_PowderN_display(&_HCS_Al_17_var);

  class_Monitor_nD_display(&_H53_Obt_Out_var);

  class_PowderN_display(&_HCS_Al_19_var);

  class_Guide_gravity_display(&_H53_VSComC1_var);

  class_PowderN_display(&_HCS_Al_21_var);

  class_Guide_tapering_display(&_H53_Nose_var);

  class_PowderN_display(&_HCS_Al_23_var);

  class_Monitor_nD_display(&_H53_ThALES_Monochromator_Cradle_var);

  class_Monochromator_curved_display(&_H53_ThALES_Monochromator_var);

  class_Arm_display(&_H53_ThALES_Monochromator_Jumper_var);

  class_Arm_display(&_H53_ThALES_Monochromator_Out_var);

  class_Monitor_nD_display(&_H53_ThALES_Sample_Div_var);

  class_Monitor_nD_display(&_H53_ThALES_Sample_XY_var);

  class_Monitor_nD_display(&_H53_ThALES_Sample_L_var);

  class_Isotropic_Sqw_display(&_H53_ThALES_Sample_var);

  class_Monitor_nD_display(&_H53_ThALES_Spectrometer_var);

  class_Monitor_nD_display(&_H53_ThALES_Diffractometer_var);

  class_Arm_display(&_Sample_Out_var);

  class_Collimator_linear_display(&_SC3_var);

  class_Arm_display(&_Ana_Cradle_var);

  class_Monochromator_curved_display(&_PG2Xtal_var);

  class_Arm_display(&_Ana_Out_var);

  class_Collimator_linear_display(&_SC4_var);

  class_Monitor_display(&_He3H_var);

  class_Arm_display(&_H53_ThALES_Transmit_var);

  class_Monitor_nD_display(&_H53_ThALES_TransmitXY_var);

  class_Arm_display(&_H52_start_var);

  class_Guide_gravity_display(&_H52_inpile_var);

  class_Guide_gravity_display(&_H52_Common_var);

  class_Guide_gravity_display(&_H52_Common_46_var);

  class_Guide_gravity_display(&_H52_Common_3_var);

  class_PowderN_display(&_HCS_Al_48_var);

  class_Monitor_nD_display(&_H52_Obt_Out_var);

  class_PowderN_display(&_HCS_Al_50_var);

  class_Guide_gravity_display(&_H52_Common_51_var);

  class_Guide_gravity_display(&_H52_Common_52_var);

  class_Guide_gravity_display(&_H52_Common_53_var);

  class_Guide_gravity_display(&_H52_Common_54_var);

  class_Guide_gravity_display(&_H52_Common_55_var);

  class_Guide_gravity_display(&_H52_Common_56_var);

  class_Guide_gravity_display(&_H52_Common_57_var);

  class_Guide_gravity_display(&_H52_Common_58_var);

  class_Guide_gravity_display(&_H52_Common_59_var);

  class_Guide_gravity_display(&_H52_Common_60_var);

  class_Guide_gravity_display(&_H52_Common_61_var);

  class_Guide_gravity_display(&_H52_Common_62_var);

  class_Guide_gravity_display(&_H52_Common_63_var);

  class_PowderN_display(&_HCS_Al_64_var);

  class_Monitor_nD_display(&_H52_Common_Out_var);

  class_Monitor_nD_display(&_H523_origin_var);

  class_Monitor_nD_display(&_H521_origin_var);

  class_Monitor_nD_display(&_H522_origin_var);

  class_Arm_display(&_H521_start_var);

  class_Guide_gravity_display(&_H521_Curved_var);

  class_Guide_gravity_display(&_H521_Curved_71_var);

  class_Guide_gravity_display(&_H521_Curved_72_var);

  class_Guide_gravity_display(&_H521_Curved_73_var);

  class_Guide_gravity_display(&_H521_Curved_74_var);

  class_Guide_gravity_display(&_H521_Curved_75_var);

  class_Guide_gravity_display(&_H521_Curved_76_var);

  class_Guide_gravity_display(&_H521_Curved_77_var);

  class_Guide_gravity_display(&_H521_Curved_78_var);

  class_Guide_gravity_display(&_H521_Curved_79_var);

  class_Guide_gravity_display(&_H521_Curved_80_var);

  class_Guide_gravity_display(&_H521_Curved_preVTE_var);

  class_PowderN_display(&_HCS_Al_82_var);

  class_Monitor_nD_display(&_H521_VTE_var);

  class_PowderN_display(&_HCS_Al_84_var);

  class_Guide_gravity_display(&_H521_Curved_85_var);

  class_Guide_gravity_display(&_H521_Curved_86_var);

  class_Guide_gravity_display(&_H521_Curved_87_var);

  class_Guide_gravity_display(&_H521_Curved_88_var);

  class_Guide_gravity_display(&_H521_Curved_89_var);

  class_Guide_gravity_display(&_H521_Curved_90_var);

  class_Guide_gravity_display(&_H521_Curved_91_var);

  class_Guide_gravity_display(&_H521_Curved_92_var);

  class_Guide_gravity_display(&_H521_Curved_93_var);

  class_Guide_gravity_display(&_H521_Curved_94_var);

  class_Guide_gravity_display(&_H521_Curved_95_var);

  class_Guide_gravity_display(&_H521_Curved_96_var);

  class_Guide_gravity_display(&_H521_Curved_97_var);

  class_Guide_gravity_display(&_H521_Curved_98_var);

  class_Guide_gravity_display(&_H521_Curved_99_var);

  class_Guide_gravity_display(&_H521_Curved_100_var);

  class_Guide_gravity_display(&_H521_Curved_101_var);

  class_Guide_gravity_display(&_H521_Curved_102_var);

  class_Guide_gravity_display(&_H521_Curved_103_var);

  class_Guide_gravity_display(&_H521_Curved_104_var);

  class_Guide_gravity_display(&_H521_Curved_105_var);

  class_Guide_gravity_display(&_H521_Curved_106_var);

  class_Guide_gravity_display(&_H521_Curved_107_var);

  class_PowderN_display(&_HCS_Al_108_var);

  class_Monitor_nD_display(&_H521_Curved_Out_var);

  class_Guide_gravity_display(&_H521_Straight_var);

  class_Monitor_nD_display(&_H521_Straight_Out_var);

  class_PowderN_display(&_HCS_Al_112_var);

  class_Monitor_nD_display(&_H521_D16_Monochromator_Cradle_var);

  class_Monochromator_curved_display(&_H521_D16_Monochromator_var);

  class_Arm_display(&_H521_D16_Monochromator_Jumper_var);

  class_Arm_display(&_H521_D16_Monochromator_Out_var);

  class_Monitor_nD_display(&_H521_D16_Sample_Div_var);

  class_Monitor_nD_display(&_H521_D16_Sample_XY_var);

  class_Monitor_nD_display(&_H521_D16_Sample_L_var);

  class_Isotropic_Sqw_display(&_H521_D16_Sample_var);

  class_Monitor_nD_display(&_H521_D16_Detector_var);

  class_Monitor_nD_display(&_H521_D16_Spectrometer_var);

  class_Monitor_nD_display(&_H521_D16_Diffractometer_var);

  class_Arm_display(&_H521_D16_Transmit_var);

  class_PowderN_display(&_HCS_Al_125_var);

  class_Arm_display(&_H521_P6_Start_var);

  class_Guide_gravity_display(&_H521_P6_var);

  class_PowderN_display(&_HCS_Al_128_var);

  class_Monitor_nD_display(&_H521_SADAM_Monochromator_Cradle_var);

  class_Monochromator_curved_display(&_H521_SADAM_Monochromator_var);

  class_Arm_display(&_H521_SADAM_Monochromator_Out_var);

  class_Monitor_nD_display(&_H521_SADAM_Sample_Div_var);

  class_Monitor_nD_display(&_H521_SADAM_Sample_XY_var);

  class_Monitor_nD_display(&_H521_SADAM_Sample_L_var);

  class_Isotropic_Sqw_display(&_H521_SADAM_Sample_var);

  class_Monitor_nD_display(&_H521_SADAM_Detector_var);

  class_Monitor_nD_display(&_H521_SADAM_Spectrometer_var);

  class_Monitor_nD_display(&_H521_SADAM_Diffractometer_var);

  class_Arm_display(&_H522_start_var);

  class_Guide_gravity_display(&_H522_Curved_var);

  class_Guide_gravity_display(&_H522_Curved_141_var);

  class_Guide_gravity_display(&_H522_Curved_142_var);

  class_Guide_gravity_display(&_H522_Curved_143_var);

  class_Guide_gravity_display(&_H522_Curved_144_var);

  class_Guide_gravity_display(&_H522_Curved_145_var);

  class_Guide_gravity_display(&_H522_Curved_146_var);

  class_Guide_gravity_display(&_H522_Curved_147_var);

  class_Guide_gravity_display(&_H522_Curved_148_var);

  class_Guide_gravity_display(&_H522_Curved_149_var);

  class_PowderN_display(&_HCS_Al_150_var);

  class_Monitor_nD_display(&_H522_VTE_var);

  class_PowderN_display(&_HCS_Al_152_var);

  class_Guide_gravity_display(&_H523_Curved_153_var);

  class_Guide_gravity_display(&_H523_Curved_154_var);

  class_Guide_gravity_display(&_H523_Curved_155_var);

  class_Guide_gravity_display(&_H523_Curved_156_var);

  class_Guide_gravity_display(&_H523_Curved_157_var);

  class_Guide_gravity_display(&_H522_Curved_158_var);

  class_Guide_gravity_display(&_H522_Curved_159_var);

  class_Guide_gravity_display(&_H522_Curved_160_var);

  class_Guide_gravity_display(&_H522_Curved_161_var);

  class_Guide_gravity_display(&_H522_Curved_162_var);

  class_Guide_gravity_display(&_H522_Curved_163_var);

  class_Guide_gravity_display(&_H522_Curved_164_var);

  class_Guide_gravity_display(&_H522_Curved_165_var);

  class_Guide_gravity_display(&_H522_Curved_166_var);

  class_Guide_gravity_display(&_H522_Curved_167_var);

  class_Guide_gravity_display(&_H522_Curved_168_var);

  class_Guide_gravity_display(&_H522_Curved_169_var);

  class_Guide_gravity_display(&_H522_Curved_170_var);

  class_Guide_gravity_display(&_H522_Curved_171_var);

  class_Guide_gravity_display(&_H522_Curved_172_var);

  class_Guide_gravity_display(&_H522_Curved_173_var);

  class_Guide_gravity_display(&_H522_Curved_174_var);

  class_Guide_gravity_display(&_H522_Curved_175_var);

  class_Guide_gravity_display(&_H522_Curved_176_var);

  class_Guide_gravity_display(&_H522_Curved_177_var);

  class_PowderN_display(&_HCS_Al_178_var);

  class_Monitor_nD_display(&_H522_Curved_Out_XY_var);

  class_Monitor_nD_display(&_H522_Curved_Out_XL_var);

  class_V_selector_display(&_WASP_Vselector_var);

  class_PowderN_display(&_HCS_Al_182_var);

  class_Guide_gravity_display(&_H522_Straight_var);

  class_PowderN_display(&_HCS_Al_184_var);

  class_Monitor_nD_display(&_H522_Vsel_L_var);

  class_Arm_display(&_H522_mirror_centre_var);

  class_Pol_mirror_display(&_WASP_polariser_var);

  class_Arm_display(&_H522_mirror_outdir_var);

  class_Monitor_nD_display(&_H522_mirror_ReflectXY_var);

  class_Monitor_nD_display(&_H522_mirror_TransmitXY_var);

  class_Monitor_nD_display(&_H522_mirror_outdXY_var);

  class_Pol_guide_vmirror_display(&_WASP_Vpolariser_var);

  class_Guide_gravity_display(&_H522_Straight_Last_var);

  class_Monitor_nD_display(&_H522_WASP_Sample_Div_var);

  class_Monitor_nD_display(&_H522_WASP_Sample_XY_var);

  class_Monitor_nD_display(&_H522_WASP_Sample_L_var);

  class_Incoherent_display(&_H522_WASP_Sample_var);

  class_Monitor_nD_display(&_H522_WASP_Detector_var);

  class_Monitor_nD_display(&_H522_WASP_Spectrometer_var);

  class_Monitor_nD_display(&_H522_WASP_Diffractometer_var);

  class_Arm_display(&_H523_start_var);

  class_Guide_gravity_display(&_H523_Curved_var);

  class_Guide_gravity_display(&_H523_Curved_203_var);

  class_Guide_gravity_display(&_H523_Curved_204_var);

  class_Guide_gravity_display(&_H523_Curved_205_var);

  class_Guide_gravity_display(&_H523_Curved_206_var);

  class_PowderN_display(&_HCS_Al_207_var);

  class_Monitor_nD_display(&_H523_VTE_var);

  class_PowderN_display(&_HCS_Al_209_var);

  class_Guide_gravity_display(&_H523_Curved_210_var);

  class_Guide_gravity_display(&_H523_Curved_211_var);

  class_Guide_gravity_display(&_H523_Curved_212_var);

  class_Guide_gravity_display(&_H523_Curved_213_var);

  class_Guide_gravity_display(&_H523_Curved_214_var);

  class_Guide_gravity_display(&_H523_Curved_215_var);

  class_Guide_gravity_display(&_H523_Curved_216_var);

  class_Guide_gravity_display(&_H523_Curved_217_var);

  class_Guide_gravity_display(&_H523_Curved_218_var);

  class_Guide_gravity_display(&_H523_Curved_219_var);

  class_Guide_gravity_display(&_H523_Curved_220_var);

  class_Guide_gravity_display(&_H523_Curved_221_var);

  class_Guide_gravity_display(&_H523_Curved_222_var);

  class_Guide_gravity_display(&_H523_Curved_223_var);

  class_Guide_gravity_display(&_H523_Curved_224_var);

  class_Guide_gravity_display(&_H523_Curved_225_var);

  class_Guide_gravity_display(&_H523_Curved_226_var);

  class_Guide_gravity_display(&_H523_Curved_227_var);

  class_Guide_gravity_display(&_H523_Curved_228_var);

  class_Guide_gravity_display(&_H523_Curved_229_var);

  class_PowderN_display(&_HCS_Al_230_var);

  class_Arm_display(&_H523_CryoEDM_In_var);

  class_Monitor_nD_display(&_H523_CryoEDM_In_L_var);

  class_Arm_display(&_H523_CryoEDM_mirror_center_var);

  class_Pol_mirror_display(&_H523_CryoEDM_polariser_var);

  class_Arm_display(&_H523_CryoEDM_mirror_outdir_var);

  class_Monitor_nD_display(&_H523_CryoEDM_mirror_ReflectXY_var);

  class_Monitor_nD_display(&_H523_CryoEDM_mirror_TransmitXY_var);

  class_Monitor_nD_display(&_H523_CryoEDM_Sample_L_var);

  class_Monitor_nD_display(&_H523_CryoEDM_Sample_Div_var);

  class_Monitor_nD_display(&_H523_CryoEDM_Sample_XY_var);

  class_Arm_display(&_H51_start_var);

  class_Guide_gravity_display(&_H51_inpile_var);

  class_Guide_gravity_display(&_H51_Obt_1_var);

  class_Guide_gravity_display(&_H51_Obt_2_var);

  class_Guide_gravity_display(&_H51_Obt_3_var);

  class_PowderN_display(&_HCS_Al_246_var);

  class_Monitor_nD_display(&_H51_Obt_Out_var);

  class_PowderN_display(&_HCS_Al_248_var);

  class_Guide_gravity_display(&_H51_S2_var);

  class_Guide_gravity_display(&_H51_S2_250_var);

  class_Guide_gravity_display(&_H51_S2_251_var);

  class_PowderN_display(&_HCS_Al_H51_var);

  class_Monitor_nD_display(&_H51_S2_Out_var);

  class_Monitor_nD_display(&_H51_split_2_var);

  class_Monitor_nD_display(&_H51_split_1_var);

  class_Arm_display(&_H511_Start_var);

  class_Arm_display(&_H511_mirror_centre_var);

  class_Pol_mirror_display(&_IN15_polariser_var);

  class_Arm_display(&_H511_mirror_outdir_var);

  class_Monitor_nD_display(&_H511_mirror_ReflectXY_var);

  class_Monitor_nD_display(&_H511_mirror_TransmitXY_var);

  class_Monitor_nD_display(&_H511_mirror_outdXY_var);

  class_Guide_gravity_display(&_H511_S3_var);

  class_Guide_gravity_display(&_H511_S9_var);

  class_PowderN_display(&_HCS_Al_265_var);

  class_Monitor_nD_display(&_H511_VTE_var);

  class_PowderN_display(&_HCS_Al_267_var);

  class_Guide_gravity_display(&_H511_S10_var);

  class_V_selector_display(&_IN15_Vselector_var);

  class_Guide_gravity_display(&_H511_BeforeV_var);

  class_Pol_guide_vmirror_display(&_IN15_Vpolariser_var);

  class_Guide_gravity_display(&_H511_AfterV_var);

  class_Monitor_nD_display(&_H511_IN15_Sample_Div_var);

  class_Monitor_nD_display(&_H511_IN15_Sample_XY_var);

  class_Monitor_nD_display(&_H511_IN15_Sample_L_var);

  class_Incoherent_display(&_H511_IN15_Sample_var);

  class_Monitor_nD_display(&_H511_IN15_Detector_var);

  class_Monitor_nD_display(&_H511_IN15_Spectrometer_var);

  class_Monitor_nD_display(&_H511_IN15_Diffractometer_var);

  class_Arm_display(&_H512_Start_var);

  class_Guide_gravity_display(&_H512_S36_var);

  class_Guide_gravity_display(&_H512_S36_282_var);

  class_Guide_gravity_display(&_H512_S36_283_var);

  class_Guide_gravity_display(&_H512_S36_284_var);

  class_Guide_gravity_display(&_H512_S36_285_var);

  class_Guide_gravity_display(&_H512_S36_286_var);

  class_Guide_gravity_display(&_H512_S36_287_var);

  class_Guide_gravity_display(&_H512_S36_288_var);

  class_Guide_gravity_display(&_H512_S36_289_var);

  class_Guide_gravity_display(&_H512_S36_290_var);

  class_Guide_gravity_display(&_H512_S36_291_var);

  class_Guide_gravity_display(&_H512_S36_292_var);

  class_Guide_gravity_display(&_H512_S36_293_var);

  class_Guide_gravity_display(&_H512_S36_294_var);

  class_Guide_gravity_display(&_H512_S36_295_var);

  class_Guide_gravity_display(&_H512_S36_296_var);

  class_PowderN_display(&_HCS_Al_H512_var);

  class_Monitor_nD_display(&_H512_VTE_var);

  class_PowderN_display(&_HCS_Al_299_var);

  class_Guide_gravity_display(&_H51_S78_var);

  class_Guide_gravity_display(&_H51_S78_301_var);

  class_Guide_gravity_display(&_H51_S78_302_var);

  class_Guide_gravity_display(&_H51_S78_303_var);

  class_PowderN_display(&_HCS_Al_304_var);

  class_Guide_gravity_display(&_H512_S11_var);

  class_PowderN_display(&_HCS_Al_306_var);

  class_Monitor_nD_display(&_D22_PreV_var);

  class_V_selector_display(&_D22_Vselector_var);

  class_Guide_gravity_display(&_D22_Collimation_var);

  class_Arm_display(&_D22_Sample_Pos_var);

  class_Monitor_nD_display(&_H51_D22_Sample_Div_var);

  class_Monitor_nD_display(&_H51_D22_Sample_XY_var);

  class_Monitor_nD_display(&_H51_D22_Sample_L_var);

  class_Isotropic_Sqw_display(&_H51_D22_Sample_var);

  class_Monitor_nD_display(&_D22_Detector_var);

  class_Shape_display(&_D22_Detector_vessel_var);

  class_Shape_display(&_BOG_var);

  class_Shape_display(&_H53_ThALES_Drum_var);

  class_Shape_display(&_H521_D16_Drum_var);

  class_Shape_display(&_H521_SADAM_Drum_var);

  class_Shape_display(&_Traversee_var);

  class_Arm_display(&_Core_Centre_var);

  class_Shape_display(&_Core_var);

  class_Shape_display(&_D2O_Vessel_var);

  class_Shape_display(&_H2O_Vessel_var);

  printf("MCDISPLAY: end\n");

  return(0);
} /* display */

void* _getvar_parameters(char* compname)
/* enables settings parameters based use of the GETPAR macro */
{
  #ifdef OPENACC
    #define strcmp(a,b) str_comp(a,b)
  #endif
  if (!strcmp(compname, "Origin")) return (void *) &(_Origin_var._parameters);
  if (!strcmp(compname, "HCS")) return (void *) &(_HCS_var._parameters);
  if (!strcmp(compname, "HCS_Al")) return (void *) &(_HCS_Al_var._parameters);
  if (!strcmp(compname, "HCS_Al_4")) return (void *) &(_HCS_Al_4_var._parameters);
  if (!strcmp(compname, "HCS_Al_5")) return (void *) &(_HCS_Al_5_var._parameters);
  if (!strcmp(compname, "HCS_Al_6")) return (void *) &(_HCS_Al_6_var._parameters);
  if (!strcmp(compname, "HCS_Al_7")) return (void *) &(_HCS_Al_7_var._parameters);
  if (!strcmp(compname, "H5")) return (void *) &(_H5_var._parameters);
  if (!strcmp(compname, "H5_rect")) return (void *) &(_H5_rect_var._parameters);
  if (!strcmp(compname, "H53_origin")) return (void *) &(_H53_origin_var._parameters);
  if (!strcmp(compname, "H52_origin")) return (void *) &(_H52_origin_var._parameters);
  if (!strcmp(compname, "H51_origin")) return (void *) &(_H51_origin_var._parameters);
  if (!strcmp(compname, "H53_start")) return (void *) &(_H53_start_var._parameters);
  if (!strcmp(compname, "H53_inpile")) return (void *) &(_H53_inpile_var._parameters);
  if (!strcmp(compname, "H53_Al")) return (void *) &(_H53_Al_var._parameters);
  if (!strcmp(compname, "H53_Obt")) return (void *) &(_H53_Obt_var._parameters);
  if (!strcmp(compname, "HCS_Al_17")) return (void *) &(_HCS_Al_17_var._parameters);
  if (!strcmp(compname, "H53_Obt_Out")) return (void *) &(_H53_Obt_Out_var._parameters);
  if (!strcmp(compname, "HCS_Al_19")) return (void *) &(_HCS_Al_19_var._parameters);
  if (!strcmp(compname, "H53_VSComC1")) return (void *) &(_H53_VSComC1_var._parameters);
  if (!strcmp(compname, "HCS_Al_21")) return (void *) &(_HCS_Al_21_var._parameters);
  if (!strcmp(compname, "H53_Nose")) return (void *) &(_H53_Nose_var._parameters);
  if (!strcmp(compname, "HCS_Al_23")) return (void *) &(_HCS_Al_23_var._parameters);
  if (!strcmp(compname, "H53_ThALES_Monochromator_Cradle")) return (void *) &(_H53_ThALES_Monochromator_Cradle_var._parameters);
  if (!strcmp(compname, "H53_ThALES_Monochromator")) return (void *) &(_H53_ThALES_Monochromator_var._parameters);
  if (!strcmp(compname, "H53_ThALES_Monochromator_Jumper")) return (void *) &(_H53_ThALES_Monochromator_Jumper_var._parameters);
  if (!strcmp(compname, "H53_ThALES_Monochromator_Out")) return (void *) &(_H53_ThALES_Monochromator_Out_var._parameters);
  if (!strcmp(compname, "H53_ThALES_Sample_Div")) return (void *) &(_H53_ThALES_Sample_Div_var._parameters);
  if (!strcmp(compname, "H53_ThALES_Sample_XY")) return (void *) &(_H53_ThALES_Sample_XY_var._parameters);
  if (!strcmp(compname, "H53_ThALES_Sample_L")) return (void *) &(_H53_ThALES_Sample_L_var._parameters);
  if (!strcmp(compname, "H53_ThALES_Sample")) return (void *) &(_H53_ThALES_Sample_var._parameters);
  if (!strcmp(compname, "H53_ThALES_Spectrometer")) return (void *) &(_H53_ThALES_Spectrometer_var._parameters);
  if (!strcmp(compname, "H53_ThALES_Diffractometer")) return (void *) &(_H53_ThALES_Diffractometer_var._parameters);
  if (!strcmp(compname, "Sample_Out")) return (void *) &(_Sample_Out_var._parameters);
  if (!strcmp(compname, "SC3")) return (void *) &(_SC3_var._parameters);
  if (!strcmp(compname, "Ana_Cradle")) return (void *) &(_Ana_Cradle_var._parameters);
  if (!strcmp(compname, "PG2Xtal")) return (void *) &(_PG2Xtal_var._parameters);
  if (!strcmp(compname, "Ana_Out")) return (void *) &(_Ana_Out_var._parameters);
  if (!strcmp(compname, "SC4")) return (void *) &(_SC4_var._parameters);
  if (!strcmp(compname, "He3H")) return (void *) &(_He3H_var._parameters);
  if (!strcmp(compname, "H53_ThALES_Transmit")) return (void *) &(_H53_ThALES_Transmit_var._parameters);
  if (!strcmp(compname, "H53_ThALES_TransmitXY")) return (void *) &(_H53_ThALES_TransmitXY_var._parameters);
  if (!strcmp(compname, "H52_start")) return (void *) &(_H52_start_var._parameters);
  if (!strcmp(compname, "H52_inpile")) return (void *) &(_H52_inpile_var._parameters);
  if (!strcmp(compname, "H52_Common")) return (void *) &(_H52_Common_var._parameters);
  if (!strcmp(compname, "H52_Common_46")) return (void *) &(_H52_Common_46_var._parameters);
  if (!strcmp(compname, "H52_Common_3")) return (void *) &(_H52_Common_3_var._parameters);
  if (!strcmp(compname, "HCS_Al_48")) return (void *) &(_HCS_Al_48_var._parameters);
  if (!strcmp(compname, "H52_Obt_Out")) return (void *) &(_H52_Obt_Out_var._parameters);
  if (!strcmp(compname, "HCS_Al_50")) return (void *) &(_HCS_Al_50_var._parameters);
  if (!strcmp(compname, "H52_Common_51")) return (void *) &(_H52_Common_51_var._parameters);
  if (!strcmp(compname, "H52_Common_52")) return (void *) &(_H52_Common_52_var._parameters);
  if (!strcmp(compname, "H52_Common_53")) return (void *) &(_H52_Common_53_var._parameters);
  if (!strcmp(compname, "H52_Common_54")) return (void *) &(_H52_Common_54_var._parameters);
  if (!strcmp(compname, "H52_Common_55")) return (void *) &(_H52_Common_55_var._parameters);
  if (!strcmp(compname, "H52_Common_56")) return (void *) &(_H52_Common_56_var._parameters);
  if (!strcmp(compname, "H52_Common_57")) return (void *) &(_H52_Common_57_var._parameters);
  if (!strcmp(compname, "H52_Common_58")) return (void *) &(_H52_Common_58_var._parameters);
  if (!strcmp(compname, "H52_Common_59")) return (void *) &(_H52_Common_59_var._parameters);
  if (!strcmp(compname, "H52_Common_60")) return (void *) &(_H52_Common_60_var._parameters);
  if (!strcmp(compname, "H52_Common_61")) return (void *) &(_H52_Common_61_var._parameters);
  if (!strcmp(compname, "H52_Common_62")) return (void *) &(_H52_Common_62_var._parameters);
  if (!strcmp(compname, "H52_Common_63")) return (void *) &(_H52_Common_63_var._parameters);
  if (!strcmp(compname, "HCS_Al_64")) return (void *) &(_HCS_Al_64_var._parameters);
  if (!strcmp(compname, "H52_Common_Out")) return (void *) &(_H52_Common_Out_var._parameters);
  if (!strcmp(compname, "H523_origin")) return (void *) &(_H523_origin_var._parameters);
  if (!strcmp(compname, "H521_origin")) return (void *) &(_H521_origin_var._parameters);
  if (!strcmp(compname, "H522_origin")) return (void *) &(_H522_origin_var._parameters);
  if (!strcmp(compname, "H521_start")) return (void *) &(_H521_start_var._parameters);
  if (!strcmp(compname, "H521_Curved")) return (void *) &(_H521_Curved_var._parameters);
  if (!strcmp(compname, "H521_Curved_71")) return (void *) &(_H521_Curved_71_var._parameters);
  if (!strcmp(compname, "H521_Curved_72")) return (void *) &(_H521_Curved_72_var._parameters);
  if (!strcmp(compname, "H521_Curved_73")) return (void *) &(_H521_Curved_73_var._parameters);
  if (!strcmp(compname, "H521_Curved_74")) return (void *) &(_H521_Curved_74_var._parameters);
  if (!strcmp(compname, "H521_Curved_75")) return (void *) &(_H521_Curved_75_var._parameters);
  if (!strcmp(compname, "H521_Curved_76")) return (void *) &(_H521_Curved_76_var._parameters);
  if (!strcmp(compname, "H521_Curved_77")) return (void *) &(_H521_Curved_77_var._parameters);
  if (!strcmp(compname, "H521_Curved_78")) return (void *) &(_H521_Curved_78_var._parameters);
  if (!strcmp(compname, "H521_Curved_79")) return (void *) &(_H521_Curved_79_var._parameters);
  if (!strcmp(compname, "H521_Curved_80")) return (void *) &(_H521_Curved_80_var._parameters);
  if (!strcmp(compname, "H521_Curved_preVTE")) return (void *) &(_H521_Curved_preVTE_var._parameters);
  if (!strcmp(compname, "HCS_Al_82")) return (void *) &(_HCS_Al_82_var._parameters);
  if (!strcmp(compname, "H521_VTE")) return (void *) &(_H521_VTE_var._parameters);
  if (!strcmp(compname, "HCS_Al_84")) return (void *) &(_HCS_Al_84_var._parameters);
  if (!strcmp(compname, "H521_Curved_85")) return (void *) &(_H521_Curved_85_var._parameters);
  if (!strcmp(compname, "H521_Curved_86")) return (void *) &(_H521_Curved_86_var._parameters);
  if (!strcmp(compname, "H521_Curved_87")) return (void *) &(_H521_Curved_87_var._parameters);
  if (!strcmp(compname, "H521_Curved_88")) return (void *) &(_H521_Curved_88_var._parameters);
  if (!strcmp(compname, "H521_Curved_89")) return (void *) &(_H521_Curved_89_var._parameters);
  if (!strcmp(compname, "H521_Curved_90")) return (void *) &(_H521_Curved_90_var._parameters);
  if (!strcmp(compname, "H521_Curved_91")) return (void *) &(_H521_Curved_91_var._parameters);
  if (!strcmp(compname, "H521_Curved_92")) return (void *) &(_H521_Curved_92_var._parameters);
  if (!strcmp(compname, "H521_Curved_93")) return (void *) &(_H521_Curved_93_var._parameters);
  if (!strcmp(compname, "H521_Curved_94")) return (void *) &(_H521_Curved_94_var._parameters);
  if (!strcmp(compname, "H521_Curved_95")) return (void *) &(_H521_Curved_95_var._parameters);
  if (!strcmp(compname, "H521_Curved_96")) return (void *) &(_H521_Curved_96_var._parameters);
  if (!strcmp(compname, "H521_Curved_97")) return (void *) &(_H521_Curved_97_var._parameters);
  if (!strcmp(compname, "H521_Curved_98")) return (void *) &(_H521_Curved_98_var._parameters);
  if (!strcmp(compname, "H521_Curved_99")) return (void *) &(_H521_Curved_99_var._parameters);
  if (!strcmp(compname, "H521_Curved_100")) return (void *) &(_H521_Curved_100_var._parameters);
  if (!strcmp(compname, "H521_Curved_101")) return (void *) &(_H521_Curved_101_var._parameters);
  if (!strcmp(compname, "H521_Curved_102")) return (void *) &(_H521_Curved_102_var._parameters);
  if (!strcmp(compname, "H521_Curved_103")) return (void *) &(_H521_Curved_103_var._parameters);
  if (!strcmp(compname, "H521_Curved_104")) return (void *) &(_H521_Curved_104_var._parameters);
  if (!strcmp(compname, "H521_Curved_105")) return (void *) &(_H521_Curved_105_var._parameters);
  if (!strcmp(compname, "H521_Curved_106")) return (void *) &(_H521_Curved_106_var._parameters);
  if (!strcmp(compname, "H521_Curved_107")) return (void *) &(_H521_Curved_107_var._parameters);
  if (!strcmp(compname, "HCS_Al_108")) return (void *) &(_HCS_Al_108_var._parameters);
  if (!strcmp(compname, "H521_Curved_Out")) return (void *) &(_H521_Curved_Out_var._parameters);
  if (!strcmp(compname, "H521_Straight")) return (void *) &(_H521_Straight_var._parameters);
  if (!strcmp(compname, "H521_Straight_Out")) return (void *) &(_H521_Straight_Out_var._parameters);
  if (!strcmp(compname, "HCS_Al_112")) return (void *) &(_HCS_Al_112_var._parameters);
  if (!strcmp(compname, "H521_D16_Monochromator_Cradle")) return (void *) &(_H521_D16_Monochromator_Cradle_var._parameters);
  if (!strcmp(compname, "H521_D16_Monochromator")) return (void *) &(_H521_D16_Monochromator_var._parameters);
  if (!strcmp(compname, "H521_D16_Monochromator_Jumper")) return (void *) &(_H521_D16_Monochromator_Jumper_var._parameters);
  if (!strcmp(compname, "H521_D16_Monochromator_Out")) return (void *) &(_H521_D16_Monochromator_Out_var._parameters);
  if (!strcmp(compname, "H521_D16_Sample_Div")) return (void *) &(_H521_D16_Sample_Div_var._parameters);
  if (!strcmp(compname, "H521_D16_Sample_XY")) return (void *) &(_H521_D16_Sample_XY_var._parameters);
  if (!strcmp(compname, "H521_D16_Sample_L")) return (void *) &(_H521_D16_Sample_L_var._parameters);
  if (!strcmp(compname, "H521_D16_Sample")) return (void *) &(_H521_D16_Sample_var._parameters);
  if (!strcmp(compname, "H521_D16_Detector")) return (void *) &(_H521_D16_Detector_var._parameters);
  if (!strcmp(compname, "H521_D16_Spectrometer")) return (void *) &(_H521_D16_Spectrometer_var._parameters);
  if (!strcmp(compname, "H521_D16_Diffractometer")) return (void *) &(_H521_D16_Diffractometer_var._parameters);
  if (!strcmp(compname, "H521_D16_Transmit")) return (void *) &(_H521_D16_Transmit_var._parameters);
  if (!strcmp(compname, "HCS_Al_125")) return (void *) &(_HCS_Al_125_var._parameters);
  if (!strcmp(compname, "H521_P6_Start")) return (void *) &(_H521_P6_Start_var._parameters);
  if (!strcmp(compname, "H521_P6")) return (void *) &(_H521_P6_var._parameters);
  if (!strcmp(compname, "HCS_Al_128")) return (void *) &(_HCS_Al_128_var._parameters);
  if (!strcmp(compname, "H521_SADAM_Monochromator_Cradle")) return (void *) &(_H521_SADAM_Monochromator_Cradle_var._parameters);
  if (!strcmp(compname, "H521_SADAM_Monochromator")) return (void *) &(_H521_SADAM_Monochromator_var._parameters);
  if (!strcmp(compname, "H521_SADAM_Monochromator_Out")) return (void *) &(_H521_SADAM_Monochromator_Out_var._parameters);
  if (!strcmp(compname, "H521_SADAM_Sample_Div")) return (void *) &(_H521_SADAM_Sample_Div_var._parameters);
  if (!strcmp(compname, "H521_SADAM_Sample_XY")) return (void *) &(_H521_SADAM_Sample_XY_var._parameters);
  if (!strcmp(compname, "H521_SADAM_Sample_L")) return (void *) &(_H521_SADAM_Sample_L_var._parameters);
  if (!strcmp(compname, "H521_SADAM_Sample")) return (void *) &(_H521_SADAM_Sample_var._parameters);
  if (!strcmp(compname, "H521_SADAM_Detector")) return (void *) &(_H521_SADAM_Detector_var._parameters);
  if (!strcmp(compname, "H521_SADAM_Spectrometer")) return (void *) &(_H521_SADAM_Spectrometer_var._parameters);
  if (!strcmp(compname, "H521_SADAM_Diffractometer")) return (void *) &(_H521_SADAM_Diffractometer_var._parameters);
  if (!strcmp(compname, "H522_start")) return (void *) &(_H522_start_var._parameters);
  if (!strcmp(compname, "H522_Curved")) return (void *) &(_H522_Curved_var._parameters);
  if (!strcmp(compname, "H522_Curved_141")) return (void *) &(_H522_Curved_141_var._parameters);
  if (!strcmp(compname, "H522_Curved_142")) return (void *) &(_H522_Curved_142_var._parameters);
  if (!strcmp(compname, "H522_Curved_143")) return (void *) &(_H522_Curved_143_var._parameters);
  if (!strcmp(compname, "H522_Curved_144")) return (void *) &(_H522_Curved_144_var._parameters);
  if (!strcmp(compname, "H522_Curved_145")) return (void *) &(_H522_Curved_145_var._parameters);
  if (!strcmp(compname, "H522_Curved_146")) return (void *) &(_H522_Curved_146_var._parameters);
  if (!strcmp(compname, "H522_Curved_147")) return (void *) &(_H522_Curved_147_var._parameters);
  if (!strcmp(compname, "H522_Curved_148")) return (void *) &(_H522_Curved_148_var._parameters);
  if (!strcmp(compname, "H522_Curved_149")) return (void *) &(_H522_Curved_149_var._parameters);
  if (!strcmp(compname, "HCS_Al_150")) return (void *) &(_HCS_Al_150_var._parameters);
  if (!strcmp(compname, "H522_VTE")) return (void *) &(_H522_VTE_var._parameters);
  if (!strcmp(compname, "HCS_Al_152")) return (void *) &(_HCS_Al_152_var._parameters);
  if (!strcmp(compname, "H523_Curved_153")) return (void *) &(_H523_Curved_153_var._parameters);
  if (!strcmp(compname, "H523_Curved_154")) return (void *) &(_H523_Curved_154_var._parameters);
  if (!strcmp(compname, "H523_Curved_155")) return (void *) &(_H523_Curved_155_var._parameters);
  if (!strcmp(compname, "H523_Curved_156")) return (void *) &(_H523_Curved_156_var._parameters);
  if (!strcmp(compname, "H523_Curved_157")) return (void *) &(_H523_Curved_157_var._parameters);
  if (!strcmp(compname, "H522_Curved_158")) return (void *) &(_H522_Curved_158_var._parameters);
  if (!strcmp(compname, "H522_Curved_159")) return (void *) &(_H522_Curved_159_var._parameters);
  if (!strcmp(compname, "H522_Curved_160")) return (void *) &(_H522_Curved_160_var._parameters);
  if (!strcmp(compname, "H522_Curved_161")) return (void *) &(_H522_Curved_161_var._parameters);
  if (!strcmp(compname, "H522_Curved_162")) return (void *) &(_H522_Curved_162_var._parameters);
  if (!strcmp(compname, "H522_Curved_163")) return (void *) &(_H522_Curved_163_var._parameters);
  if (!strcmp(compname, "H522_Curved_164")) return (void *) &(_H522_Curved_164_var._parameters);
  if (!strcmp(compname, "H522_Curved_165")) return (void *) &(_H522_Curved_165_var._parameters);
  if (!strcmp(compname, "H522_Curved_166")) return (void *) &(_H522_Curved_166_var._parameters);
  if (!strcmp(compname, "H522_Curved_167")) return (void *) &(_H522_Curved_167_var._parameters);
  if (!strcmp(compname, "H522_Curved_168")) return (void *) &(_H522_Curved_168_var._parameters);
  if (!strcmp(compname, "H522_Curved_169")) return (void *) &(_H522_Curved_169_var._parameters);
  if (!strcmp(compname, "H522_Curved_170")) return (void *) &(_H522_Curved_170_var._parameters);
  if (!strcmp(compname, "H522_Curved_171")) return (void *) &(_H522_Curved_171_var._parameters);
  if (!strcmp(compname, "H522_Curved_172")) return (void *) &(_H522_Curved_172_var._parameters);
  if (!strcmp(compname, "H522_Curved_173")) return (void *) &(_H522_Curved_173_var._parameters);
  if (!strcmp(compname, "H522_Curved_174")) return (void *) &(_H522_Curved_174_var._parameters);
  if (!strcmp(compname, "H522_Curved_175")) return (void *) &(_H522_Curved_175_var._parameters);
  if (!strcmp(compname, "H522_Curved_176")) return (void *) &(_H522_Curved_176_var._parameters);
  if (!strcmp(compname, "H522_Curved_177")) return (void *) &(_H522_Curved_177_var._parameters);
  if (!strcmp(compname, "HCS_Al_178")) return (void *) &(_HCS_Al_178_var._parameters);
  if (!strcmp(compname, "H522_Curved_Out_XY")) return (void *) &(_H522_Curved_Out_XY_var._parameters);
  if (!strcmp(compname, "H522_Curved_Out_XL")) return (void *) &(_H522_Curved_Out_XL_var._parameters);
  if (!strcmp(compname, "WASP_Vselector")) return (void *) &(_WASP_Vselector_var._parameters);
  if (!strcmp(compname, "HCS_Al_182")) return (void *) &(_HCS_Al_182_var._parameters);
  if (!strcmp(compname, "H522_Straight")) return (void *) &(_H522_Straight_var._parameters);
  if (!strcmp(compname, "HCS_Al_184")) return (void *) &(_HCS_Al_184_var._parameters);
  if (!strcmp(compname, "H522_Vsel_L")) return (void *) &(_H522_Vsel_L_var._parameters);
  if (!strcmp(compname, "H522_mirror_centre")) return (void *) &(_H522_mirror_centre_var._parameters);
  if (!strcmp(compname, "WASP_polariser")) return (void *) &(_WASP_polariser_var._parameters);
  if (!strcmp(compname, "H522_mirror_outdir")) return (void *) &(_H522_mirror_outdir_var._parameters);
  if (!strcmp(compname, "H522_mirror_ReflectXY")) return (void *) &(_H522_mirror_ReflectXY_var._parameters);
  if (!strcmp(compname, "H522_mirror_TransmitXY")) return (void *) &(_H522_mirror_TransmitXY_var._parameters);
  if (!strcmp(compname, "H522_mirror_outdXY")) return (void *) &(_H522_mirror_outdXY_var._parameters);
  if (!strcmp(compname, "WASP_Vpolariser")) return (void *) &(_WASP_Vpolariser_var._parameters);
  if (!strcmp(compname, "H522_Straight_Last")) return (void *) &(_H522_Straight_Last_var._parameters);
  if (!strcmp(compname, "H522_WASP_Sample_Div")) return (void *) &(_H522_WASP_Sample_Div_var._parameters);
  if (!strcmp(compname, "H522_WASP_Sample_XY")) return (void *) &(_H522_WASP_Sample_XY_var._parameters);
  if (!strcmp(compname, "H522_WASP_Sample_L")) return (void *) &(_H522_WASP_Sample_L_var._parameters);
  if (!strcmp(compname, "H522_WASP_Sample")) return (void *) &(_H522_WASP_Sample_var._parameters);
  if (!strcmp(compname, "H522_WASP_Detector")) return (void *) &(_H522_WASP_Detector_var._parameters);
  if (!strcmp(compname, "H522_WASP_Spectrometer")) return (void *) &(_H522_WASP_Spectrometer_var._parameters);
  if (!strcmp(compname, "H522_WASP_Diffractometer")) return (void *) &(_H522_WASP_Diffractometer_var._parameters);
  if (!strcmp(compname, "H523_start")) return (void *) &(_H523_start_var._parameters);
  if (!strcmp(compname, "H523_Curved")) return (void *) &(_H523_Curved_var._parameters);
  if (!strcmp(compname, "H523_Curved_203")) return (void *) &(_H523_Curved_203_var._parameters);
  if (!strcmp(compname, "H523_Curved_204")) return (void *) &(_H523_Curved_204_var._parameters);
  if (!strcmp(compname, "H523_Curved_205")) return (void *) &(_H523_Curved_205_var._parameters);
  if (!strcmp(compname, "H523_Curved_206")) return (void *) &(_H523_Curved_206_var._parameters);
  if (!strcmp(compname, "HCS_Al_207")) return (void *) &(_HCS_Al_207_var._parameters);
  if (!strcmp(compname, "H523_VTE")) return (void *) &(_H523_VTE_var._parameters);
  if (!strcmp(compname, "HCS_Al_209")) return (void *) &(_HCS_Al_209_var._parameters);
  if (!strcmp(compname, "H523_Curved_210")) return (void *) &(_H523_Curved_210_var._parameters);
  if (!strcmp(compname, "H523_Curved_211")) return (void *) &(_H523_Curved_211_var._parameters);
  if (!strcmp(compname, "H523_Curved_212")) return (void *) &(_H523_Curved_212_var._parameters);
  if (!strcmp(compname, "H523_Curved_213")) return (void *) &(_H523_Curved_213_var._parameters);
  if (!strcmp(compname, "H523_Curved_214")) return (void *) &(_H523_Curved_214_var._parameters);
  if (!strcmp(compname, "H523_Curved_215")) return (void *) &(_H523_Curved_215_var._parameters);
  if (!strcmp(compname, "H523_Curved_216")) return (void *) &(_H523_Curved_216_var._parameters);
  if (!strcmp(compname, "H523_Curved_217")) return (void *) &(_H523_Curved_217_var._parameters);
  if (!strcmp(compname, "H523_Curved_218")) return (void *) &(_H523_Curved_218_var._parameters);
  if (!strcmp(compname, "H523_Curved_219")) return (void *) &(_H523_Curved_219_var._parameters);
  if (!strcmp(compname, "H523_Curved_220")) return (void *) &(_H523_Curved_220_var._parameters);
  if (!strcmp(compname, "H523_Curved_221")) return (void *) &(_H523_Curved_221_var._parameters);
  if (!strcmp(compname, "H523_Curved_222")) return (void *) &(_H523_Curved_222_var._parameters);
  if (!strcmp(compname, "H523_Curved_223")) return (void *) &(_H523_Curved_223_var._parameters);
  if (!strcmp(compname, "H523_Curved_224")) return (void *) &(_H523_Curved_224_var._parameters);
  if (!strcmp(compname, "H523_Curved_225")) return (void *) &(_H523_Curved_225_var._parameters);
  if (!strcmp(compname, "H523_Curved_226")) return (void *) &(_H523_Curved_226_var._parameters);
  if (!strcmp(compname, "H523_Curved_227")) return (void *) &(_H523_Curved_227_var._parameters);
  if (!strcmp(compname, "H523_Curved_228")) return (void *) &(_H523_Curved_228_var._parameters);
  if (!strcmp(compname, "H523_Curved_229")) return (void *) &(_H523_Curved_229_var._parameters);
  if (!strcmp(compname, "HCS_Al_230")) return (void *) &(_HCS_Al_230_var._parameters);
  if (!strcmp(compname, "H523_CryoEDM_In")) return (void *) &(_H523_CryoEDM_In_var._parameters);
  if (!strcmp(compname, "H523_CryoEDM_In_L")) return (void *) &(_H523_CryoEDM_In_L_var._parameters);
  if (!strcmp(compname, "H523_CryoEDM_mirror_center")) return (void *) &(_H523_CryoEDM_mirror_center_var._parameters);
  if (!strcmp(compname, "H523_CryoEDM_polariser")) return (void *) &(_H523_CryoEDM_polariser_var._parameters);
  if (!strcmp(compname, "H523_CryoEDM_mirror_outdir")) return (void *) &(_H523_CryoEDM_mirror_outdir_var._parameters);
  if (!strcmp(compname, "H523_CryoEDM_mirror_ReflectXY")) return (void *) &(_H523_CryoEDM_mirror_ReflectXY_var._parameters);
  if (!strcmp(compname, "H523_CryoEDM_mirror_TransmitXY")) return (void *) &(_H523_CryoEDM_mirror_TransmitXY_var._parameters);
  if (!strcmp(compname, "H523_CryoEDM_Sample_L")) return (void *) &(_H523_CryoEDM_Sample_L_var._parameters);
  if (!strcmp(compname, "H523_CryoEDM_Sample_Div")) return (void *) &(_H523_CryoEDM_Sample_Div_var._parameters);
  if (!strcmp(compname, "H523_CryoEDM_Sample_XY")) return (void *) &(_H523_CryoEDM_Sample_XY_var._parameters);
  if (!strcmp(compname, "H51_start")) return (void *) &(_H51_start_var._parameters);
  if (!strcmp(compname, "H51_inpile")) return (void *) &(_H51_inpile_var._parameters);
  if (!strcmp(compname, "H51_Obt_1")) return (void *) &(_H51_Obt_1_var._parameters);
  if (!strcmp(compname, "H51_Obt_2")) return (void *) &(_H51_Obt_2_var._parameters);
  if (!strcmp(compname, "H51_Obt_3")) return (void *) &(_H51_Obt_3_var._parameters);
  if (!strcmp(compname, "HCS_Al_246")) return (void *) &(_HCS_Al_246_var._parameters);
  if (!strcmp(compname, "H51_Obt_Out")) return (void *) &(_H51_Obt_Out_var._parameters);
  if (!strcmp(compname, "HCS_Al_248")) return (void *) &(_HCS_Al_248_var._parameters);
  if (!strcmp(compname, "H51_S2")) return (void *) &(_H51_S2_var._parameters);
  if (!strcmp(compname, "H51_S2_250")) return (void *) &(_H51_S2_250_var._parameters);
  if (!strcmp(compname, "H51_S2_251")) return (void *) &(_H51_S2_251_var._parameters);
  if (!strcmp(compname, "HCS_Al_H51")) return (void *) &(_HCS_Al_H51_var._parameters);
  if (!strcmp(compname, "H51_S2_Out")) return (void *) &(_H51_S2_Out_var._parameters);
  if (!strcmp(compname, "H51_split_2")) return (void *) &(_H51_split_2_var._parameters);
  if (!strcmp(compname, "H51_split_1")) return (void *) &(_H51_split_1_var._parameters);
  if (!strcmp(compname, "H511_Start")) return (void *) &(_H511_Start_var._parameters);
  if (!strcmp(compname, "H511_mirror_centre")) return (void *) &(_H511_mirror_centre_var._parameters);
  if (!strcmp(compname, "IN15_polariser")) return (void *) &(_IN15_polariser_var._parameters);
  if (!strcmp(compname, "H511_mirror_outdir")) return (void *) &(_H511_mirror_outdir_var._parameters);
  if (!strcmp(compname, "H511_mirror_ReflectXY")) return (void *) &(_H511_mirror_ReflectXY_var._parameters);
  if (!strcmp(compname, "H511_mirror_TransmitXY")) return (void *) &(_H511_mirror_TransmitXY_var._parameters);
  if (!strcmp(compname, "H511_mirror_outdXY")) return (void *) &(_H511_mirror_outdXY_var._parameters);
  if (!strcmp(compname, "H511_S3")) return (void *) &(_H511_S3_var._parameters);
  if (!strcmp(compname, "H511_S9")) return (void *) &(_H511_S9_var._parameters);
  if (!strcmp(compname, "HCS_Al_265")) return (void *) &(_HCS_Al_265_var._parameters);
  if (!strcmp(compname, "H511_VTE")) return (void *) &(_H511_VTE_var._parameters);
  if (!strcmp(compname, "HCS_Al_267")) return (void *) &(_HCS_Al_267_var._parameters);
  if (!strcmp(compname, "H511_S10")) return (void *) &(_H511_S10_var._parameters);
  if (!strcmp(compname, "IN15_Vselector")) return (void *) &(_IN15_Vselector_var._parameters);
  if (!strcmp(compname, "H511_BeforeV")) return (void *) &(_H511_BeforeV_var._parameters);
  if (!strcmp(compname, "IN15_Vpolariser")) return (void *) &(_IN15_Vpolariser_var._parameters);
  if (!strcmp(compname, "H511_AfterV")) return (void *) &(_H511_AfterV_var._parameters);
  if (!strcmp(compname, "H511_IN15_Sample_Div")) return (void *) &(_H511_IN15_Sample_Div_var._parameters);
  if (!strcmp(compname, "H511_IN15_Sample_XY")) return (void *) &(_H511_IN15_Sample_XY_var._parameters);
  if (!strcmp(compname, "H511_IN15_Sample_L")) return (void *) &(_H511_IN15_Sample_L_var._parameters);
  if (!strcmp(compname, "H511_IN15_Sample")) return (void *) &(_H511_IN15_Sample_var._parameters);
  if (!strcmp(compname, "H511_IN15_Detector")) return (void *) &(_H511_IN15_Detector_var._parameters);
  if (!strcmp(compname, "H511_IN15_Spectrometer")) return (void *) &(_H511_IN15_Spectrometer_var._parameters);
  if (!strcmp(compname, "H511_IN15_Diffractometer")) return (void *) &(_H511_IN15_Diffractometer_var._parameters);
  if (!strcmp(compname, "H512_Start")) return (void *) &(_H512_Start_var._parameters);
  if (!strcmp(compname, "H512_S36")) return (void *) &(_H512_S36_var._parameters);
  if (!strcmp(compname, "H512_S36_282")) return (void *) &(_H512_S36_282_var._parameters);
  if (!strcmp(compname, "H512_S36_283")) return (void *) &(_H512_S36_283_var._parameters);
  if (!strcmp(compname, "H512_S36_284")) return (void *) &(_H512_S36_284_var._parameters);
  if (!strcmp(compname, "H512_S36_285")) return (void *) &(_H512_S36_285_var._parameters);
  if (!strcmp(compname, "H512_S36_286")) return (void *) &(_H512_S36_286_var._parameters);
  if (!strcmp(compname, "H512_S36_287")) return (void *) &(_H512_S36_287_var._parameters);
  if (!strcmp(compname, "H512_S36_288")) return (void *) &(_H512_S36_288_var._parameters);
  if (!strcmp(compname, "H512_S36_289")) return (void *) &(_H512_S36_289_var._parameters);
  if (!strcmp(compname, "H512_S36_290")) return (void *) &(_H512_S36_290_var._parameters);
  if (!strcmp(compname, "H512_S36_291")) return (void *) &(_H512_S36_291_var._parameters);
  if (!strcmp(compname, "H512_S36_292")) return (void *) &(_H512_S36_292_var._parameters);
  if (!strcmp(compname, "H512_S36_293")) return (void *) &(_H512_S36_293_var._parameters);
  if (!strcmp(compname, "H512_S36_294")) return (void *) &(_H512_S36_294_var._parameters);
  if (!strcmp(compname, "H512_S36_295")) return (void *) &(_H512_S36_295_var._parameters);
  if (!strcmp(compname, "H512_S36_296")) return (void *) &(_H512_S36_296_var._parameters);
  if (!strcmp(compname, "HCS_Al_H512")) return (void *) &(_HCS_Al_H512_var._parameters);
  if (!strcmp(compname, "H512_VTE")) return (void *) &(_H512_VTE_var._parameters);
  if (!strcmp(compname, "HCS_Al_299")) return (void *) &(_HCS_Al_299_var._parameters);
  if (!strcmp(compname, "H51_S78")) return (void *) &(_H51_S78_var._parameters);
  if (!strcmp(compname, "H51_S78_301")) return (void *) &(_H51_S78_301_var._parameters);
  if (!strcmp(compname, "H51_S78_302")) return (void *) &(_H51_S78_302_var._parameters);
  if (!strcmp(compname, "H51_S78_303")) return (void *) &(_H51_S78_303_var._parameters);
  if (!strcmp(compname, "HCS_Al_304")) return (void *) &(_HCS_Al_304_var._parameters);
  if (!strcmp(compname, "H512_S11")) return (void *) &(_H512_S11_var._parameters);
  if (!strcmp(compname, "HCS_Al_306")) return (void *) &(_HCS_Al_306_var._parameters);
  if (!strcmp(compname, "D22_PreV")) return (void *) &(_D22_PreV_var._parameters);
  if (!strcmp(compname, "D22_Vselector")) return (void *) &(_D22_Vselector_var._parameters);
  if (!strcmp(compname, "D22_Collimation")) return (void *) &(_D22_Collimation_var._parameters);
  if (!strcmp(compname, "D22_Sample_Pos")) return (void *) &(_D22_Sample_Pos_var._parameters);
  if (!strcmp(compname, "H51_D22_Sample_Div")) return (void *) &(_H51_D22_Sample_Div_var._parameters);
  if (!strcmp(compname, "H51_D22_Sample_XY")) return (void *) &(_H51_D22_Sample_XY_var._parameters);
  if (!strcmp(compname, "H51_D22_Sample_L")) return (void *) &(_H51_D22_Sample_L_var._parameters);
  if (!strcmp(compname, "H51_D22_Sample")) return (void *) &(_H51_D22_Sample_var._parameters);
  if (!strcmp(compname, "D22_Detector")) return (void *) &(_D22_Detector_var._parameters);
  if (!strcmp(compname, "D22_Detector_vessel")) return (void *) &(_D22_Detector_vessel_var._parameters);
  if (!strcmp(compname, "BOG")) return (void *) &(_BOG_var._parameters);
  if (!strcmp(compname, "H53_ThALES_Drum")) return (void *) &(_H53_ThALES_Drum_var._parameters);
  if (!strcmp(compname, "H521_D16_Drum")) return (void *) &(_H521_D16_Drum_var._parameters);
  if (!strcmp(compname, "H521_SADAM_Drum")) return (void *) &(_H521_SADAM_Drum_var._parameters);
  if (!strcmp(compname, "Traversee")) return (void *) &(_Traversee_var._parameters);
  if (!strcmp(compname, "Core_Centre")) return (void *) &(_Core_Centre_var._parameters);
  if (!strcmp(compname, "Core")) return (void *) &(_Core_var._parameters);
  if (!strcmp(compname, "D2O_Vessel")) return (void *) &(_D2O_Vessel_var._parameters);
  if (!strcmp(compname, "H2O_Vessel")) return (void *) &(_H2O_Vessel_var._parameters);
  return 0;
}

void* _get_particle_var(char *token, _class_particle *p)
/* enables setpars based use of GET_PARTICLE_DVAR macro and similar */
{
  if (!strcmp(token, "flag")) return (void *) &(p->flag);
  if (!strcmp(token, "ncol_25")) return (void *) &(p->ncol_25);
  if (!strcmp(token, "nrow_25")) return (void *) &(p->nrow_25);
  if (!strcmp(token, "ncol_37")) return (void *) &(p->ncol_37);
  if (!strcmp(token, "nrow_37")) return (void *) &(p->nrow_37);
  if (!strcmp(token, "ncol_114")) return (void *) &(p->ncol_114);
  if (!strcmp(token, "nrow_114")) return (void *) &(p->nrow_114);
  if (!strcmp(token, "ncol_130")) return (void *) &(p->ncol_130);
  if (!strcmp(token, "nrow_130")) return (void *) &(p->nrow_130);
  return 0;
}

int _getcomp_index(char* compname)
/* Enables retrieving the component position & rotation when the index is not known.
 * Component indexing into MACROS, e.g., POS_A_COMP_INDEX, are 1-based! */
{
  if (!strcmp(compname, "Origin")) return 1;
  if (!strcmp(compname, "HCS")) return 2;
  if (!strcmp(compname, "HCS_Al")) return 3;
  if (!strcmp(compname, "HCS_Al_4")) return 4;
  if (!strcmp(compname, "HCS_Al_5")) return 5;
  if (!strcmp(compname, "HCS_Al_6")) return 6;
  if (!strcmp(compname, "HCS_Al_7")) return 7;
  if (!strcmp(compname, "H5")) return 8;
  if (!strcmp(compname, "H5_rect")) return 9;
  if (!strcmp(compname, "H53_origin")) return 10;
  if (!strcmp(compname, "H52_origin")) return 11;
  if (!strcmp(compname, "H51_origin")) return 12;
  if (!strcmp(compname, "H53_start")) return 13;
  if (!strcmp(compname, "H53_inpile")) return 14;
  if (!strcmp(compname, "H53_Al")) return 15;
  if (!strcmp(compname, "H53_Obt")) return 16;
  if (!strcmp(compname, "HCS_Al_17")) return 17;
  if (!strcmp(compname, "H53_Obt_Out")) return 18;
  if (!strcmp(compname, "HCS_Al_19")) return 19;
  if (!strcmp(compname, "H53_VSComC1")) return 20;
  if (!strcmp(compname, "HCS_Al_21")) return 21;
  if (!strcmp(compname, "H53_Nose")) return 22;
  if (!strcmp(compname, "HCS_Al_23")) return 23;
  if (!strcmp(compname, "H53_ThALES_Monochromator_Cradle")) return 24;
  if (!strcmp(compname, "H53_ThALES_Monochromator")) return 25;
  if (!strcmp(compname, "H53_ThALES_Monochromator_Jumper")) return 26;
  if (!strcmp(compname, "H53_ThALES_Monochromator_Out")) return 27;
  if (!strcmp(compname, "H53_ThALES_Sample_Div")) return 28;
  if (!strcmp(compname, "H53_ThALES_Sample_XY")) return 29;
  if (!strcmp(compname, "H53_ThALES_Sample_L")) return 30;
  if (!strcmp(compname, "H53_ThALES_Sample")) return 31;
  if (!strcmp(compname, "H53_ThALES_Spectrometer")) return 32;
  if (!strcmp(compname, "H53_ThALES_Diffractometer")) return 33;
  if (!strcmp(compname, "Sample_Out")) return 34;
  if (!strcmp(compname, "SC3")) return 35;
  if (!strcmp(compname, "Ana_Cradle")) return 36;
  if (!strcmp(compname, "PG2Xtal")) return 37;
  if (!strcmp(compname, "Ana_Out")) return 38;
  if (!strcmp(compname, "SC4")) return 39;
  if (!strcmp(compname, "He3H")) return 40;
  if (!strcmp(compname, "H53_ThALES_Transmit")) return 41;
  if (!strcmp(compname, "H53_ThALES_TransmitXY")) return 42;
  if (!strcmp(compname, "H52_start")) return 43;
  if (!strcmp(compname, "H52_inpile")) return 44;
  if (!strcmp(compname, "H52_Common")) return 45;
  if (!strcmp(compname, "H52_Common_46")) return 46;
  if (!strcmp(compname, "H52_Common_3")) return 47;
  if (!strcmp(compname, "HCS_Al_48")) return 48;
  if (!strcmp(compname, "H52_Obt_Out")) return 49;
  if (!strcmp(compname, "HCS_Al_50")) return 50;
  if (!strcmp(compname, "H52_Common_51")) return 51;
  if (!strcmp(compname, "H52_Common_52")) return 52;
  if (!strcmp(compname, "H52_Common_53")) return 53;
  if (!strcmp(compname, "H52_Common_54")) return 54;
  if (!strcmp(compname, "H52_Common_55")) return 55;
  if (!strcmp(compname, "H52_Common_56")) return 56;
  if (!strcmp(compname, "H52_Common_57")) return 57;
  if (!strcmp(compname, "H52_Common_58")) return 58;
  if (!strcmp(compname, "H52_Common_59")) return 59;
  if (!strcmp(compname, "H52_Common_60")) return 60;
  if (!strcmp(compname, "H52_Common_61")) return 61;
  if (!strcmp(compname, "H52_Common_62")) return 62;
  if (!strcmp(compname, "H52_Common_63")) return 63;
  if (!strcmp(compname, "HCS_Al_64")) return 64;
  if (!strcmp(compname, "H52_Common_Out")) return 65;
  if (!strcmp(compname, "H523_origin")) return 66;
  if (!strcmp(compname, "H521_origin")) return 67;
  if (!strcmp(compname, "H522_origin")) return 68;
  if (!strcmp(compname, "H521_start")) return 69;
  if (!strcmp(compname, "H521_Curved")) return 70;
  if (!strcmp(compname, "H521_Curved_71")) return 71;
  if (!strcmp(compname, "H521_Curved_72")) return 72;
  if (!strcmp(compname, "H521_Curved_73")) return 73;
  if (!strcmp(compname, "H521_Curved_74")) return 74;
  if (!strcmp(compname, "H521_Curved_75")) return 75;
  if (!strcmp(compname, "H521_Curved_76")) return 76;
  if (!strcmp(compname, "H521_Curved_77")) return 77;
  if (!strcmp(compname, "H521_Curved_78")) return 78;
  if (!strcmp(compname, "H521_Curved_79")) return 79;
  if (!strcmp(compname, "H521_Curved_80")) return 80;
  if (!strcmp(compname, "H521_Curved_preVTE")) return 81;
  if (!strcmp(compname, "HCS_Al_82")) return 82;
  if (!strcmp(compname, "H521_VTE")) return 83;
  if (!strcmp(compname, "HCS_Al_84")) return 84;
  if (!strcmp(compname, "H521_Curved_85")) return 85;
  if (!strcmp(compname, "H521_Curved_86")) return 86;
  if (!strcmp(compname, "H521_Curved_87")) return 87;
  if (!strcmp(compname, "H521_Curved_88")) return 88;
  if (!strcmp(compname, "H521_Curved_89")) return 89;
  if (!strcmp(compname, "H521_Curved_90")) return 90;
  if (!strcmp(compname, "H521_Curved_91")) return 91;
  if (!strcmp(compname, "H521_Curved_92")) return 92;
  if (!strcmp(compname, "H521_Curved_93")) return 93;
  if (!strcmp(compname, "H521_Curved_94")) return 94;
  if (!strcmp(compname, "H521_Curved_95")) return 95;
  if (!strcmp(compname, "H521_Curved_96")) return 96;
  if (!strcmp(compname, "H521_Curved_97")) return 97;
  if (!strcmp(compname, "H521_Curved_98")) return 98;
  if (!strcmp(compname, "H521_Curved_99")) return 99;
  if (!strcmp(compname, "H521_Curved_100")) return 100;
  if (!strcmp(compname, "H521_Curved_101")) return 101;
  if (!strcmp(compname, "H521_Curved_102")) return 102;
  if (!strcmp(compname, "H521_Curved_103")) return 103;
  if (!strcmp(compname, "H521_Curved_104")) return 104;
  if (!strcmp(compname, "H521_Curved_105")) return 105;
  if (!strcmp(compname, "H521_Curved_106")) return 106;
  if (!strcmp(compname, "H521_Curved_107")) return 107;
  if (!strcmp(compname, "HCS_Al_108")) return 108;
  if (!strcmp(compname, "H521_Curved_Out")) return 109;
  if (!strcmp(compname, "H521_Straight")) return 110;
  if (!strcmp(compname, "H521_Straight_Out")) return 111;
  if (!strcmp(compname, "HCS_Al_112")) return 112;
  if (!strcmp(compname, "H521_D16_Monochromator_Cradle")) return 113;
  if (!strcmp(compname, "H521_D16_Monochromator")) return 114;
  if (!strcmp(compname, "H521_D16_Monochromator_Jumper")) return 115;
  if (!strcmp(compname, "H521_D16_Monochromator_Out")) return 116;
  if (!strcmp(compname, "H521_D16_Sample_Div")) return 117;
  if (!strcmp(compname, "H521_D16_Sample_XY")) return 118;
  if (!strcmp(compname, "H521_D16_Sample_L")) return 119;
  if (!strcmp(compname, "H521_D16_Sample")) return 120;
  if (!strcmp(compname, "H521_D16_Detector")) return 121;
  if (!strcmp(compname, "H521_D16_Spectrometer")) return 122;
  if (!strcmp(compname, "H521_D16_Diffractometer")) return 123;
  if (!strcmp(compname, "H521_D16_Transmit")) return 124;
  if (!strcmp(compname, "HCS_Al_125")) return 125;
  if (!strcmp(compname, "H521_P6_Start")) return 126;
  if (!strcmp(compname, "H521_P6")) return 127;
  if (!strcmp(compname, "HCS_Al_128")) return 128;
  if (!strcmp(compname, "H521_SADAM_Monochromator_Cradle")) return 129;
  if (!strcmp(compname, "H521_SADAM_Monochromator")) return 130;
  if (!strcmp(compname, "H521_SADAM_Monochromator_Out")) return 131;
  if (!strcmp(compname, "H521_SADAM_Sample_Div")) return 132;
  if (!strcmp(compname, "H521_SADAM_Sample_XY")) return 133;
  if (!strcmp(compname, "H521_SADAM_Sample_L")) return 134;
  if (!strcmp(compname, "H521_SADAM_Sample")) return 135;
  if (!strcmp(compname, "H521_SADAM_Detector")) return 136;
  if (!strcmp(compname, "H521_SADAM_Spectrometer")) return 137;
  if (!strcmp(compname, "H521_SADAM_Diffractometer")) return 138;
  if (!strcmp(compname, "H522_start")) return 139;
  if (!strcmp(compname, "H522_Curved")) return 140;
  if (!strcmp(compname, "H522_Curved_141")) return 141;
  if (!strcmp(compname, "H522_Curved_142")) return 142;
  if (!strcmp(compname, "H522_Curved_143")) return 143;
  if (!strcmp(compname, "H522_Curved_144")) return 144;
  if (!strcmp(compname, "H522_Curved_145")) return 145;
  if (!strcmp(compname, "H522_Curved_146")) return 146;
  if (!strcmp(compname, "H522_Curved_147")) return 147;
  if (!strcmp(compname, "H522_Curved_148")) return 148;
  if (!strcmp(compname, "H522_Curved_149")) return 149;
  if (!strcmp(compname, "HCS_Al_150")) return 150;
  if (!strcmp(compname, "H522_VTE")) return 151;
  if (!strcmp(compname, "HCS_Al_152")) return 152;
  if (!strcmp(compname, "H523_Curved_153")) return 153;
  if (!strcmp(compname, "H523_Curved_154")) return 154;
  if (!strcmp(compname, "H523_Curved_155")) return 155;
  if (!strcmp(compname, "H523_Curved_156")) return 156;
  if (!strcmp(compname, "H523_Curved_157")) return 157;
  if (!strcmp(compname, "H522_Curved_158")) return 158;
  if (!strcmp(compname, "H522_Curved_159")) return 159;
  if (!strcmp(compname, "H522_Curved_160")) return 160;
  if (!strcmp(compname, "H522_Curved_161")) return 161;
  if (!strcmp(compname, "H522_Curved_162")) return 162;
  if (!strcmp(compname, "H522_Curved_163")) return 163;
  if (!strcmp(compname, "H522_Curved_164")) return 164;
  if (!strcmp(compname, "H522_Curved_165")) return 165;
  if (!strcmp(compname, "H522_Curved_166")) return 166;
  if (!strcmp(compname, "H522_Curved_167")) return 167;
  if (!strcmp(compname, "H522_Curved_168")) return 168;
  if (!strcmp(compname, "H522_Curved_169")) return 169;
  if (!strcmp(compname, "H522_Curved_170")) return 170;
  if (!strcmp(compname, "H522_Curved_171")) return 171;
  if (!strcmp(compname, "H522_Curved_172")) return 172;
  if (!strcmp(compname, "H522_Curved_173")) return 173;
  if (!strcmp(compname, "H522_Curved_174")) return 174;
  if (!strcmp(compname, "H522_Curved_175")) return 175;
  if (!strcmp(compname, "H522_Curved_176")) return 176;
  if (!strcmp(compname, "H522_Curved_177")) return 177;
  if (!strcmp(compname, "HCS_Al_178")) return 178;
  if (!strcmp(compname, "H522_Curved_Out_XY")) return 179;
  if (!strcmp(compname, "H522_Curved_Out_XL")) return 180;
  if (!strcmp(compname, "WASP_Vselector")) return 181;
  if (!strcmp(compname, "HCS_Al_182")) return 182;
  if (!strcmp(compname, "H522_Straight")) return 183;
  if (!strcmp(compname, "HCS_Al_184")) return 184;
  if (!strcmp(compname, "H522_Vsel_L")) return 185;
  if (!strcmp(compname, "H522_mirror_centre")) return 186;
  if (!strcmp(compname, "WASP_polariser")) return 187;
  if (!strcmp(compname, "H522_mirror_outdir")) return 188;
  if (!strcmp(compname, "H522_mirror_ReflectXY")) return 189;
  if (!strcmp(compname, "H522_mirror_TransmitXY")) return 190;
  if (!strcmp(compname, "H522_mirror_outdXY")) return 191;
  if (!strcmp(compname, "WASP_Vpolariser")) return 192;
  if (!strcmp(compname, "H522_Straight_Last")) return 193;
  if (!strcmp(compname, "H522_WASP_Sample_Div")) return 194;
  if (!strcmp(compname, "H522_WASP_Sample_XY")) return 195;
  if (!strcmp(compname, "H522_WASP_Sample_L")) return 196;
  if (!strcmp(compname, "H522_WASP_Sample")) return 197;
  if (!strcmp(compname, "H522_WASP_Detector")) return 198;
  if (!strcmp(compname, "H522_WASP_Spectrometer")) return 199;
  if (!strcmp(compname, "H522_WASP_Diffractometer")) return 200;
  if (!strcmp(compname, "H523_start")) return 201;
  if (!strcmp(compname, "H523_Curved")) return 202;
  if (!strcmp(compname, "H523_Curved_203")) return 203;
  if (!strcmp(compname, "H523_Curved_204")) return 204;
  if (!strcmp(compname, "H523_Curved_205")) return 205;
  if (!strcmp(compname, "H523_Curved_206")) return 206;
  if (!strcmp(compname, "HCS_Al_207")) return 207;
  if (!strcmp(compname, "H523_VTE")) return 208;
  if (!strcmp(compname, "HCS_Al_209")) return 209;
  if (!strcmp(compname, "H523_Curved_210")) return 210;
  if (!strcmp(compname, "H523_Curved_211")) return 211;
  if (!strcmp(compname, "H523_Curved_212")) return 212;
  if (!strcmp(compname, "H523_Curved_213")) return 213;
  if (!strcmp(compname, "H523_Curved_214")) return 214;
  if (!strcmp(compname, "H523_Curved_215")) return 215;
  if (!strcmp(compname, "H523_Curved_216")) return 216;
  if (!strcmp(compname, "H523_Curved_217")) return 217;
  if (!strcmp(compname, "H523_Curved_218")) return 218;
  if (!strcmp(compname, "H523_Curved_219")) return 219;
  if (!strcmp(compname, "H523_Curved_220")) return 220;
  if (!strcmp(compname, "H523_Curved_221")) return 221;
  if (!strcmp(compname, "H523_Curved_222")) return 222;
  if (!strcmp(compname, "H523_Curved_223")) return 223;
  if (!strcmp(compname, "H523_Curved_224")) return 224;
  if (!strcmp(compname, "H523_Curved_225")) return 225;
  if (!strcmp(compname, "H523_Curved_226")) return 226;
  if (!strcmp(compname, "H523_Curved_227")) return 227;
  if (!strcmp(compname, "H523_Curved_228")) return 228;
  if (!strcmp(compname, "H523_Curved_229")) return 229;
  if (!strcmp(compname, "HCS_Al_230")) return 230;
  if (!strcmp(compname, "H523_CryoEDM_In")) return 231;
  if (!strcmp(compname, "H523_CryoEDM_In_L")) return 232;
  if (!strcmp(compname, "H523_CryoEDM_mirror_center")) return 233;
  if (!strcmp(compname, "H523_CryoEDM_polariser")) return 234;
  if (!strcmp(compname, "H523_CryoEDM_mirror_outdir")) return 235;
  if (!strcmp(compname, "H523_CryoEDM_mirror_ReflectXY")) return 236;
  if (!strcmp(compname, "H523_CryoEDM_mirror_TransmitXY")) return 237;
  if (!strcmp(compname, "H523_CryoEDM_Sample_L")) return 238;
  if (!strcmp(compname, "H523_CryoEDM_Sample_Div")) return 239;
  if (!strcmp(compname, "H523_CryoEDM_Sample_XY")) return 240;
  if (!strcmp(compname, "H51_start")) return 241;
  if (!strcmp(compname, "H51_inpile")) return 242;
  if (!strcmp(compname, "H51_Obt_1")) return 243;
  if (!strcmp(compname, "H51_Obt_2")) return 244;
  if (!strcmp(compname, "H51_Obt_3")) return 245;
  if (!strcmp(compname, "HCS_Al_246")) return 246;
  if (!strcmp(compname, "H51_Obt_Out")) return 247;
  if (!strcmp(compname, "HCS_Al_248")) return 248;
  if (!strcmp(compname, "H51_S2")) return 249;
  if (!strcmp(compname, "H51_S2_250")) return 250;
  if (!strcmp(compname, "H51_S2_251")) return 251;
  if (!strcmp(compname, "HCS_Al_H51")) return 252;
  if (!strcmp(compname, "H51_S2_Out")) return 253;
  if (!strcmp(compname, "H51_split_2")) return 254;
  if (!strcmp(compname, "H51_split_1")) return 255;
  if (!strcmp(compname, "H511_Start")) return 256;
  if (!strcmp(compname, "H511_mirror_centre")) return 257;
  if (!strcmp(compname, "IN15_polariser")) return 258;
  if (!strcmp(compname, "H511_mirror_outdir")) return 259;
  if (!strcmp(compname, "H511_mirror_ReflectXY")) return 260;
  if (!strcmp(compname, "H511_mirror_TransmitXY")) return 261;
  if (!strcmp(compname, "H511_mirror_outdXY")) return 262;
  if (!strcmp(compname, "H511_S3")) return 263;
  if (!strcmp(compname, "H511_S9")) return 264;
  if (!strcmp(compname, "HCS_Al_265")) return 265;
  if (!strcmp(compname, "H511_VTE")) return 266;
  if (!strcmp(compname, "HCS_Al_267")) return 267;
  if (!strcmp(compname, "H511_S10")) return 268;
  if (!strcmp(compname, "IN15_Vselector")) return 269;
  if (!strcmp(compname, "H511_BeforeV")) return 270;
  if (!strcmp(compname, "IN15_Vpolariser")) return 271;
  if (!strcmp(compname, "H511_AfterV")) return 272;
  if (!strcmp(compname, "H511_IN15_Sample_Div")) return 273;
  if (!strcmp(compname, "H511_IN15_Sample_XY")) return 274;
  if (!strcmp(compname, "H511_IN15_Sample_L")) return 275;
  if (!strcmp(compname, "H511_IN15_Sample")) return 276;
  if (!strcmp(compname, "H511_IN15_Detector")) return 277;
  if (!strcmp(compname, "H511_IN15_Spectrometer")) return 278;
  if (!strcmp(compname, "H511_IN15_Diffractometer")) return 279;
  if (!strcmp(compname, "H512_Start")) return 280;
  if (!strcmp(compname, "H512_S36")) return 281;
  if (!strcmp(compname, "H512_S36_282")) return 282;
  if (!strcmp(compname, "H512_S36_283")) return 283;
  if (!strcmp(compname, "H512_S36_284")) return 284;
  if (!strcmp(compname, "H512_S36_285")) return 285;
  if (!strcmp(compname, "H512_S36_286")) return 286;
  if (!strcmp(compname, "H512_S36_287")) return 287;
  if (!strcmp(compname, "H512_S36_288")) return 288;
  if (!strcmp(compname, "H512_S36_289")) return 289;
  if (!strcmp(compname, "H512_S36_290")) return 290;
  if (!strcmp(compname, "H512_S36_291")) return 291;
  if (!strcmp(compname, "H512_S36_292")) return 292;
  if (!strcmp(compname, "H512_S36_293")) return 293;
  if (!strcmp(compname, "H512_S36_294")) return 294;
  if (!strcmp(compname, "H512_S36_295")) return 295;
  if (!strcmp(compname, "H512_S36_296")) return 296;
  if (!strcmp(compname, "HCS_Al_H512")) return 297;
  if (!strcmp(compname, "H512_VTE")) return 298;
  if (!strcmp(compname, "HCS_Al_299")) return 299;
  if (!strcmp(compname, "H51_S78")) return 300;
  if (!strcmp(compname, "H51_S78_301")) return 301;
  if (!strcmp(compname, "H51_S78_302")) return 302;
  if (!strcmp(compname, "H51_S78_303")) return 303;
  if (!strcmp(compname, "HCS_Al_304")) return 304;
  if (!strcmp(compname, "H512_S11")) return 305;
  if (!strcmp(compname, "HCS_Al_306")) return 306;
  if (!strcmp(compname, "D22_PreV")) return 307;
  if (!strcmp(compname, "D22_Vselector")) return 308;
  if (!strcmp(compname, "D22_Collimation")) return 309;
  if (!strcmp(compname, "D22_Sample_Pos")) return 310;
  if (!strcmp(compname, "H51_D22_Sample_Div")) return 311;
  if (!strcmp(compname, "H51_D22_Sample_XY")) return 312;
  if (!strcmp(compname, "H51_D22_Sample_L")) return 313;
  if (!strcmp(compname, "H51_D22_Sample")) return 314;
  if (!strcmp(compname, "D22_Detector")) return 315;
  if (!strcmp(compname, "D22_Detector_vessel")) return 316;
  if (!strcmp(compname, "BOG")) return 317;
  if (!strcmp(compname, "H53_ThALES_Drum")) return 318;
  if (!strcmp(compname, "H521_D16_Drum")) return 319;
  if (!strcmp(compname, "H521_SADAM_Drum")) return 320;
  if (!strcmp(compname, "Traversee")) return 321;
  if (!strcmp(compname, "Core_Centre")) return 322;
  if (!strcmp(compname, "Core")) return 323;
  if (!strcmp(compname, "D2O_Vessel")) return 324;
  if (!strcmp(compname, "H2O_Vessel")) return 325;
  return -1;
}

/* embedding file "metadata-r.c" */

/** --- Contents of  metadata-r.c ---------------------------------------------------------------------------------- */
// Created by Gregory Tucker, Data Management Software Centre, European Spallation Source ERIC on 07/07/23.
#ifndef MCCODE_NAME
#include "metadata-r.h"
#endif

char * metadata_table_key_component(char* key){
  if (strlen(key) == 0) return NULL;
  char sep[2] = ":\0"; // matches any number of repeated colons
  // look for the separator in the provided key; strtok is allowed to modify the string, so copy it
  char * tok = malloc((strlen(key) + 1) * sizeof(char));
  if (!tok) {
    fprintf(stderr,"Error allocating token\n");
    exit(-1);
  }
  strcpy(tok, key);
  char * pch = strtok(tok, sep); // this *is* the component name (if provided) -- but we need to move the pointer
  char * comp = malloc((1 + strlen(pch)) * sizeof(char));
  if (!comp) {
    fprintf(stderr,"Error allocating comp\n");
    exit(-1);
  }
  strcpy(comp, pch);
  if (tok) free(tok);
  return comp;
}
char * metadata_table_key_literal(char * key){
  if (strlen(key) == 0) return NULL;
  char sep[3] = ":\0";
  char * tok = malloc((strlen(key) + 1 ) * sizeof(char));
  if (!tok) {
    fprintf(stderr,"Error allocating token\n");
    exit(-1);
  }
  strcpy(tok, key);
  char * pch = strtok(tok, sep); // this *is* the component name (if provided)
  if (pch) pch = strtok(NULL, sep); // either NULL or the literal name
  char * name = NULL;
  if (pch) {
    name = malloc((1 + strlen(pch)) * sizeof(char));
    if (!name) {
      fprintf(stderr,"Error allocating name\n");
	exit(-1);
    }
    strcpy(name, pch);
  }
  if (tok) free(tok);
  return name;
}
int metadata_table_defined(int no, metadata_table_t * tab, char * key){
  if (strlen(key) == 0){
    /* This is 0 instead of `no` independent of any wildcard-matching logic
     * because a caller _already_ knows `no` and can verify
     * that `key` is not "" at call-time. So returning `no` is useless.
     */
    return 0;
  }
  char * comp = metadata_table_key_component(key);
  char * name = metadata_table_key_literal(key);
  // look through the table for the matching component and literal names
  int number = 0;
  for (int i=0; i<no; ++i){
    if (!strcmp(comp, tab[i].source)){
      if (name == NULL || !strcmp(name, tab[i].name)) ++number;
    }
  }
  if (comp) free(comp);
  if (name) free(name);
  return number;
}

char * metadata_table_name(int no, metadata_table_t * tab, char *key){
    if (strlen(key) == 0){
        return NULL;
    }
    char * comp = metadata_table_key_component(key);
    char * name = metadata_table_key_literal(key);
    if (name == NULL) {
        for (int i=0; i<no; ++i){
            if (!strcmp(comp, tab[i].source)){
                name = malloc((strlen(tab[i].name) + 1) * sizeof(char));
		if (!name) {
		  fprintf(stderr,"Error allocating metadata_table_name\n");
		  exit(-1);
		}
                strcpy(name, tab[i].name);
                break;
            }
        }
    } else {
        int found=0;
        for (int i=0; i<no; ++i){
            if (!strcmp(comp, tab[i].source) && !strcmp(name, tab[i].name)) {
                found = 1;
                break;
            }
        }
        if (!found) free(name);
    }
    free(comp);
    return name;
}

char * metadata_table_type(int no, metadata_table_t * tab, char * key){
  if (strlen(key) == 0) {
    fprintf(stderr, "Unable to check type of non-existent key\n");
    exit(1);
  }
  char * comp = metadata_table_key_component(key);
  char * name = metadata_table_key_literal(key);
  if (name == NULL){
    fprintf(stderr, "Unable to check type of literal for component %s without its name\n", comp);
    free(comp);
    exit(1);
  }
  char * type = NULL;
  for (int i=0; i<no; ++i){
    if (!strcmp(comp, tab[i].source) && !strcmp(name, tab[i].name)) type = tab[i].type;
  }
  if (comp) free(comp);
  if (name) free(name);
  return type;
}

char * metadata_table_literal(int no, metadata_table_t * tab, char * key){
  if (strlen(key) == 0) {
    fprintf(stderr, "Unable to retrieve literal for non-existent key\n");
    exit(1);
  }
  char * comp = metadata_table_key_component(key);
  char * name = metadata_table_key_literal(key);
  if (name == NULL){
    fprintf(stderr, "Unable to retrieve literal for component %s without its name\n", comp);
    free(comp);
    exit(1);
  }
  char * type = NULL;
  for (int i=0; i<no; ++i){
    if (!strcmp(comp, tab[i].source) && !strcmp(name, tab[i].name)) type = tab[i].value;
  }
  if (comp) free(comp);
  if (name) free(name);
  return type;
}
void metadata_table_print_all_keys(int no, metadata_table_t * tab){
  for (int i=0; i<no; ++i){
    printf("%s::%s ", tab[i].source, tab[i].name);
  }
  printf("\n");
}
int metadata_table_print_all_components(int no, metadata_table_t * tab){
  int count = 0;
  char ** known = malloc(no * sizeof(char*));
  if (!known) {
    fprintf(stderr,"Error allocating table of known metadata\n");
    exit(-1);
  }
  for (int i=0; i<no; ++i){
    int unknown = 1;
    for (int j=0; j<count; ++j) if (!strcmp(tab[i].source, known[j])) unknown = 0;
    if (unknown) known[count++] = tab[i].source;
  }
  size_t nchar = 0;
  for (int i=0; i<count; ++i) nchar += strlen(known[i]) + 1;
  char * line = malloc((nchar + 1) * sizeof(char));
  char * linetmp = malloc((nchar + 1) * sizeof(char));
  if (!line || !linetmp) {
    fprintf(stderr,"Error allocating metadata print arrays\n");
    exit(-1);
  }
  line[0] = '\0';
  for (int i=0; i<count; ++i) sprintf(linetmp, "%s%s ", line, known[i]);
  line=linetmp;
  line[strlen(line)] = '\0'; // eat the trailing space
  printf("%s\n", line);
  free(line);
  free(linetmp);
  free(known);
  return count;
}
int metadata_table_print_component_keys(int no, metadata_table_t * tab, char * key){
  char * comp = metadata_table_key_component(key);
  char * name = metadata_table_key_literal(key);
  int count = 0;
  for (int i=0; i<no; ++i) if (!strcmp(tab[i].source, comp) && (name == NULL || !strcmp(tab[i].name, name))) {
    if (name == NULL) printf("%s ", tab[i].name);
    ++count;
  }
  if (name != NULL) printf("%d", count); // replace count by strlen(tab[i].value)?
  printf("\n");
  return count;
}
/* -------------------------------------------------------------------------------------Contents of  metadata-r.c --- */
/* End of file "metadata-r.c". */

/* embedding file "mccode_main.c" */

/*******************************************************************************
* mccode_main: McCode main() function.
*******************************************************************************/
int mccode_main(int argc, char *argv[])
{
  /*  double run_num = 0; */
  time_t  t;
  clock_t ct;

#ifdef USE_MPI
  char mpi_node_name[MPI_MAX_PROCESSOR_NAME];
  int  mpi_node_name_len;
#endif /* USE_MPI */

#ifdef MAC
  argc = ccommand(&argv);
#endif

#ifdef USE_MPI
  MPI_Init(&argc,&argv);
  MPI_Comm_size(MPI_COMM_WORLD, &mpi_node_count); /* get number of nodes */
  MPI_Comm_rank(MPI_COMM_WORLD, &mpi_node_rank);
  MPI_Comm_set_name(MPI_COMM_WORLD, instrument_name);
  MPI_Get_processor_name(mpi_node_name, &mpi_node_name_len);
#endif /* USE_MPI */

  ct = clock();

  // device and host functional RNG seed
  struct timeval tm;
  gettimeofday(&tm, NULL);
  mcseed = (long) tm.tv_sec*1000000 + tm.tv_usec;
  mcstartdate = (long)tm.tv_sec;  /* set start date before parsing options and creating sim file */
  // init global _particle.randstate for random number use
  // during init(), finally() and display(). NOTE: during trace, a local
  // "_particle" variable is present and thus used instead.
  //
  // PW: srandom deferred until init() since we did not read seed input from commandline
  //srandom(_hash(mcseed-1));

#ifdef USE_MPI
  /* *** print number of nodes *********************************************** */
  if (mpi_node_count > 1) {
    MPI_MASTER(
    printf("Simulation '%s' (%s): running on %i nodes (master is '%s', MPI version %i.%i).\n",
      instrument_name, instrument_source, mpi_node_count, mpi_node_name, MPI_VERSION, MPI_SUBVERSION);
    );
    /* share the same seed, then adapt random seed for each node */
    MPI_Bcast(&mcseed, 1, MPI_LONG, 0, MPI_COMM_WORLD); /* root sends its seed to slaves */
    mcseed += mpi_node_rank; /* make sure we use different seeds per noe */
  }
#endif /* USE_MPI */

#ifdef OPENACC
#ifdef USE_MPI
  int num_devices = acc_get_num_devices(acc_device_nvidia);
  if(num_devices>0){
    int my_device = mpi_node_rank % num_devices;
    acc_set_device_num( my_device, acc_device_nvidia );
    printf("Have found %d GPU devices on rank %d. Will use device %d.\n", num_devices, mpi_node_rank, my_device);
  }else{
    printf("There was an issue probing acc_get_num_devices, fallback to host\n");
    acc_set_device_type( acc_device_host );
  }
#endif
#endif

  /* *** parse options ******************************************************* */
  SIG_MESSAGE("[" __FILE__ "] main START");
  mcformat = getenv(FLAVOR_UPPER "_FORMAT") ?
             getenv(FLAVOR_UPPER "_FORMAT") : FLAVOR_UPPER;
  instrument_exe = argv[0]; /* store the executable path */
  /* read simulation parameters and options */
  mcparseoptions(argc, argv); /* sets output dir and format */


#ifdef USE_MPI
  if (mpi_node_count > 1) {
    /* share the same seed, then adapt random seed for each node */
    MPI_Bcast(&mcseed, 1, MPI_LONG, 0, MPI_COMM_WORLD); /* root sends its seed to slaves */
    mcseed += mpi_node_rank; /* make sure we use different seeds per node */
  }
#endif


/* *** install sig handler, but only once !! after parameters parsing ******* */
#ifndef NOSIGNALS
#ifdef SIGQUIT
  if (signal( SIGQUIT ,sighandler) == SIG_IGN)
    signal( SIGQUIT,SIG_IGN);   /* quit (ASCII FS) */
#endif
#ifdef SIGABRT
  if (signal( SIGABRT ,sighandler) == SIG_IGN)
    signal( SIGABRT,SIG_IGN);   /* used by abort, replace SIGIOT in the future */
#endif
#ifdef SIGTERM
  if (signal( SIGTERM ,sighandler) == SIG_IGN)
    signal( SIGTERM,SIG_IGN);   /* software termination signal from kill */
#endif
#ifdef SIGUSR1
  if (signal( SIGUSR1 ,sighandler) == SIG_IGN)
    signal( SIGUSR1,SIG_IGN);   /* display simulation status */
#endif
#ifdef SIGUSR2
  if (signal( SIGUSR2 ,sighandler) == SIG_IGN)
    signal( SIGUSR2,SIG_IGN);
#endif
#ifdef SIGHUP
  if (signal( SIGHUP ,sighandler) == SIG_IGN)
    signal( SIGHUP,SIG_IGN);
#endif
#ifdef SIGILL
  if (signal( SIGILL ,sighandler) == SIG_IGN)
    signal( SIGILL,SIG_IGN);    /* illegal instruction (not reset when caught) */
#endif
#ifdef SIGFPE
  if (signal( SIGFPE ,sighandler) == SIG_IGN)
    signal( SIGSEGV,SIG_IGN);    /* floating point exception */
#endif
#ifdef SIGBUS
  if (signal( SIGBUS ,sighandler) == SIG_IGN)
    signal( SIGSEGV,SIG_IGN);    /* bus error */
#endif
#ifdef SIGSEGV
  if (signal( SIGSEGV ,sighandler) == SIG_IGN)
    signal( SIGSEGV,SIG_IGN);   /* segmentation violation */
#endif
#endif /* !NOSIGNALS */


  // init executed by master/host
  siminfo_init(NULL); /* open SIM */
  SIG_MESSAGE("[" __FILE__ "] main INITIALISE");
  init();


#ifndef NOSIGNALS
#ifdef SIGINT
  if (signal( SIGINT ,sighandler) == SIG_IGN)
    signal( SIGINT,SIG_IGN);    /* interrupt (rubout) only after INIT */
#endif
#endif /* !NOSIGNALS */

/* ================ main particle generation/propagation loop ================ */
#ifdef USE_MPI
  /* sliced Ncount on each MPI node */
  mcncount = mpi_node_count > 1 ?
    floor(mcncount / mpi_node_count) :
    mcncount; /* number of rays per node */
#endif

// MT specific init, note that per-ray init is empty
#if RNG_ALG == 2
  mt_srandom(mcseed);
#endif


// main raytrace work loop
#ifndef FUNNEL
  // legacy version
  raytrace_all(mcncount, mcseed);
#else
  MPI_MASTER(
  // "funneled" version in which propagation is more parallelizable
  printf("\nNOTE: CPU COMPONENT grammar activated:\n 1) \"FUNNEL\" raytrace algorithm enabled.\n 2) Any SPLIT's are dynamically allocated based on available buffer size. \n");
	     );
  raytrace_all_funnel(mcncount, mcseed);
#endif


#ifdef USE_MPI
 /* merge run_num from MPI nodes */
  if (mpi_node_count > 1) {
  double mcrun_num_double = (double)mcrun_num;
  mc_MPI_Sum(&mcrun_num_double, 1);
  mcrun_num = (unsigned long long)mcrun_num_double;
  }
#endif


  // save/finally executed by master node/thread/host
  finally();


#ifdef USE_MPI
  MPI_Finalize();
#endif /* USE_MPI */


  return 0;
} /* mccode_main */
/* End of file "mccode_main.c". */

/* end of generated C code ./ILL_H5_new.c */
