Files
sicspsi/amorset.tex
koennecke 3ab4bcdfb9 - Fixed a normalisation problem in diffscan when the first value
did not have enough counts
- Reduced polling frequency in emon
- Fixed a scriptcontext bug which would cause it to dump core in SctTransact
  on interrupts
- Fixed an issue with missing <nl> at the end of batch files
- Added a feature which does not call halt when counting stops in hmcontrol.c
  This is necessary for the BOA CCD
- Initalized doNotFree properly in hipadaba.c
- Added the travelling salesman reflection measurement algorithm
- Added another component to amorset
- Removed old SicsWait from nserver.c
- Added a means to nxscript to write 16 bit data for BOA
- Modified tasub to accept a drivabel as a motor and not only a motor.
  This became necessary to make EIGER work as A2 on EIGER is a virtual
  motor
2011-09-23 07:55:49 +00:00

214 lines
8.8 KiB
TeX

\subsection{AMOR Reflectometer Settings}
This is yet another module for calculating the settings for the AMOR
spectrometer. This version is of 2005 and implements the new calculation
scheme as devised by the Jochen where the base line and height zero point
is the beam height at the chop, chop, chopper.
Again a lot of parameters have to be maintained. For each optical bench
component an active flag, a fixed offset for correcting the scale reading to
the actual position and an offset regarding the zero point of the scale need
to be kept. And of course the value as read. This is offloaded into a
separate module, amorcomp. Beamline components to be controlled are:
\begin{description}
\item[DS] The slit at the monochromator bunker
\item[M] The monochromator
\item[Dx] various slits
\item[A] the analyzer
\item[D] the detector.
\end{description}
A master module encloses all those beamline components and performs the
actual calculation. The calculation is controlled through three virtual
motors: m2t (monochromator 2 theta), s2t (sample 2 theta) and ath, the
analyzer angle. For the formula used for the exact calculation, see the
paper from the Jochen.
The amorcomp module provides the following interface:
\begin{flushleft} \small
\begin{minipage}{\linewidth} \label{scrap1}
$\langle$amorcompint {\footnotesize ?}$\rangle\equiv$
\vspace{-1ex}
\begin{list}{}{} \item
\mbox{}\verb@@\\
\mbox{}\verb@ typedef struct {@\\
\mbox{}\verb@ int activeFlag; /* component present */@\\
\mbox{}\verb@ double markOffset; /* offset mark to real */@\\
\mbox{}\verb@ double scaleOffset; /* offset of the scale */@\\
\mbox{}\verb@ double readPosition; /* the position as read */@\\
\mbox{}\verb@} amorComp, *pamorComp;@\\
\mbox{}\verb@/*----------------------------------------------------------------------*/@\\
\mbox{}\verb@double calcCompPosition(pamorComp comp); @\\
\mbox{}\verb@int handleCompCommand(pamorComp comp, SConnection *pCon, @\\
\mbox{}\verb@ int argc, char *argv[]);@\\
\mbox{}\verb@int saveAmorComp(FILE *fd, char *name, char *compname, pamorComp comp); @\\
\mbox{}\verb@@$\Diamond$
\end{list}
\vspace{-1ex}
\footnotesize\addtolength{\baselineskip}{-1ex}
\begin{list}{}{\setlength{\itemsep}{-\parsep}\setlength{\itemindent}{-\leftmargin}}
\item Macro referenced in scrap ?.
\end{list}
\end{minipage}\\[4ex]
\end{flushleft}
The amorset module implements the container for all the data and the actual
calculation. Most of the interesting stuff is in the functions relating to
the interpreter interface and the drivable interface. Again the virtual
motors only set values in the amorset data structure and amorset then takes
control off the driving operation.
\begin{flushleft} \small
\begin{minipage}{\linewidth} \label{scrap2}
$\langle$amorsetint {\footnotesize ?}$\rangle\equiv$
\vspace{-1ex}
\begin{list}{}{} \item
\mbox{}\verb@@\\
\mbox{}\verb@typedef struct {@\\
\mbox{}\verb@ pObjectDescriptor pDes;@\\
\mbox{}\verb@ pIDrivable pDriv;@\\
\mbox{}\verb@ pIDrivable listDrive;@\\
\mbox{}\verb@ amorComp chopper;@\\
\mbox{}\verb@ amorComp M;@\\
\mbox{}\verb@ amorComp DS;@\\
\mbox{}\verb@ amorComp D1;@\\
\mbox{}\verb@ amorComp D2;@\\
\mbox{}\verb@ amorComp D3;@\\
\mbox{}\verb@ amorComp EL;@\\
\mbox{}\verb@ amorComp S;@\\
\mbox{}\verb@ amorComp D4;@\\
\mbox{}\verb@ amorComp A;@\\
\mbox{}\verb@ amorComp D5;@\\
\mbox{}\verb@ amorComp D;@\\
\mbox{}\verb@ double targetm2t;@\\
\mbox{}\verb@ double targets2t;@\\
\mbox{}\verb@ double targetath;@\\
\mbox{}\verb@ double actualm2t;@\\
\mbox{}\verb@ double actuals2t;@\\
\mbox{}\verb@ double actualath;@\\
\mbox{}\verb@ int mustDrive;@\\
\mbox{}\verb@ int mustRecalculate;@\\
\mbox{}\verb@ int driveList;@\\
\mbox{}\verb@ double dspar;@\\
\mbox{}\verb@ double detectoroffset;@\\
\mbox{}\verb@ int verbose;@\\
\mbox{}\verb@}amorSet, *pamorSet;@\\
\mbox{}\verb@/*--------------------------------------------------------------------*/@\\
\mbox{}\verb@int AmorSetFactory(SConnection *pCon, SicsInterp *pSics, void *pData,@\\
\mbox{}\verb@ int argc, char *argv[]);@\\
\mbox{}\verb@int AmorSetAction(SConnection *pCon, SicsInterp *pSics, void *pData,@\\
\mbox{}\verb@ int argc, char *argv[]);@\\
\mbox{}\verb@/*============ helper functions for the virtual motors ===============*/ @\\
\mbox{}\verb@void amorSetMotor(pamorSet amor, int type, double value);@\\
\mbox{}\verb@double amorGetMotor(pamorSet amor, SConnection *pCon, int type);@\\
\mbox{}\verb@@$\Diamond$
\end{list}
\vspace{-1ex}
\footnotesize\addtolength{\baselineskip}{-1ex}
\begin{list}{}{\setlength{\itemsep}{-\parsep}\setlength{\itemindent}{-\leftmargin}}
\item Macro referenced in scrap ?.
\end{list}
\end{minipage}\\[4ex]
\end{flushleft}
The virtual motors just implement the bare minimum:
\begin{flushleft} \small
\begin{minipage}{\linewidth} \label{scrap3}
$\langle$amordriveint {\footnotesize ?}$\rangle\equiv$
\vspace{-1ex}
\begin{list}{}{} \item
\mbox{}\verb@@\\
\mbox{}\verb@typedef struct{@\\
\mbox{}\verb@ pObjectDescriptor pDes;@\\
\mbox{}\verb@ pIDrivable pDriv;@\\
\mbox{}\verb@ pamorSet mama;@\\
\mbox{}\verb@ int type;@\\
\mbox{}\verb@} amorDrive, *pamorDrive;@\\
\mbox{}\verb@/*-----------------------------------------------------------------*/@\\
\mbox{}\verb@pamorDrive makeAmorDrive(pamorSet papa, int type);@\\
\mbox{}\verb@void killAmorDrive(void *data);@\\
\mbox{}\verb@int AmorDriveAction(SConnection *pCon, SicsInterp *pSics, void *pData,@\\
\mbox{}\verb@ int argc, char *argv[]);@\\
\mbox{}\verb@@$\Diamond$
\end{list}
\vspace{-1ex}
\footnotesize\addtolength{\baselineskip}{-1ex}
\begin{list}{}{\setlength{\itemsep}{-\parsep}\setlength{\itemindent}{-\leftmargin}}
\item Macro referenced in scrap ?.
\end{list}
\end{minipage}\\[4ex]
\end{flushleft}
\begin{flushleft} \small
\begin{minipage}{\linewidth} \label{scrap4}
\verb@"amorset.h"@ {\footnotesize ? }$\equiv$
\vspace{-1ex}
\begin{list}{}{} \item
\mbox{}\verb@@\\
\mbox{}\verb@/*-------------------------------------------------------------------@\\
\mbox{}\verb@ AMORSET together with amorcomp and amordrive implement the position@\\
\mbox{}\verb@ control facility for the reflectometer AMOR. This uses the algorithm@\\
\mbox{}\verb@ with the beam height as the baseline.@\\
\mbox{}\verb@ @\\
\mbox{}\verb@ copyright: see file COPYRIGHT@\\
\mbox{}\verb@ @\\
\mbox{}\verb@ Mark Koennecke, October 2005@\\
\mbox{}\verb@--------------------------------------------------------------------*/@\\
\mbox{}\verb@#ifndef AMORSET@\\
\mbox{}\verb@#define AMORSET@\\
\mbox{}\verb@#include "amorcomp.h"@\\
\mbox{}\verb@@$\langle$amorsetint {\footnotesize ?}$\rangle$\verb@@\\
\mbox{}\verb@#endif@\\
\mbox{}\verb@@\\
\mbox{}\verb@@$\Diamond$
\end{list}
\vspace{-2ex}
\end{minipage}\\[4ex]
\end{flushleft}
\begin{flushleft} \small
\begin{minipage}{\linewidth} \label{scrap5}
\verb@"amorcomp.h"@ {\footnotesize ? }$\equiv$
\vspace{-1ex}
\begin{list}{}{} \item
\mbox{}\verb@@\\
\mbox{}\verb@/*---------------------------------------------------------------------@\\
\mbox{}\verb@ AMOR component handling module. For the new (2005) calculation of the@\\
\mbox{}\verb@ positions using the beam height as zero.@\\
\mbox{}\verb@ @\\
\mbox{}\verb@ copyright: see file COPYRIGHT@\\
\mbox{}\verb@ @\\
\mbox{}\verb@ Mark Koennecke, October 2005@\\
\mbox{}\verb@-----------------------------------------------------------------------*/@\\
\mbox{}\verb@ #ifndef AMORCOMP@\\
\mbox{}\verb@ #define AMORCOMP@\\
\mbox{}\verb@ #include <stdio.h>@\\
\mbox{}\verb@ #include <sics.h>@\\
\mbox{}\verb@ @$\langle$amorcompint {\footnotesize ?}$\rangle$\verb@@\\
\mbox{}\verb@ #endif@\\
\mbox{}\verb@ @\\
\mbox{}\verb@@$\Diamond$
\end{list}
\vspace{-2ex}
\end{minipage}\\[4ex]
\end{flushleft}
\begin{flushleft} \small
\begin{minipage}{\linewidth} \label{scrap6}
\verb@"amordrive.h"@ {\footnotesize ? }$\equiv$
\vspace{-1ex}
\begin{list}{}{} \item
\mbox{}\verb@@\\
\mbox{}\verb@ /*--------------------------------------------------------------------@\\
\mbox{}\verb@ Part of the AMOR position calculation module.@\\
\mbox{}\verb@@\\
\mbox{}\verb@ copyright: see file COPYRIGHT@\\
\mbox{}\verb@@\\
\mbox{}\verb@ Mark Koennecke, October 2005@\\
\mbox{}\verb@----------------------------------------------------------------------*/@\\
\mbox{}\verb@#ifndef AMORDRIVE@\\
\mbox{}\verb@#define AMORDRIVE@\\
\mbox{}\verb@@$\langle$amordriveint {\footnotesize ?}$\rangle$\verb@@\\
\mbox{}\verb@#endif@\\
\mbox{}\verb@@\\
\mbox{}\verb@ @$\Diamond$
\end{list}
\vspace{-2ex}
\end{minipage}\\[4ex]
\end{flushleft}