205 lines
8.2 KiB
TeX
205 lines
8.2 KiB
TeX
\subsection{AMOR Two Theta}
|
|
AMOR is SINQ's new reflectometer. It has the peculiar feature that the
|
|
two theta movement of the detector is expressed in translations along
|
|
the reflectometer base axis and the detector height. Additionally the
|
|
detector is tilted. The height of two diaphragms has to be adjusted as
|
|
well. And, in polarizing mode, the analyzer has to be operated as
|
|
well. Quite a complicated movement. I fear this module may only be
|
|
useful for AMOR, but may be, other reflectometers may profit as well.
|
|
This object implements this complex movement as a virtual motor.
|
|
|
|
The following formulas are used for the necessary calculations:
|
|
\begin{eqnarray}
|
|
delta height & = & h_{s} - \sin \alpha \\
|
|
delta x & = & |x_{c} - x_{s}| - R \cos \alpha \\
|
|
omega & = & -2 MOM + 2 SOM \\
|
|
\end{eqnarray}
|
|
with
|
|
\begin{eqnarray}
|
|
h_{s} & = & \tan(2MOM)|x_{c} - x_{s}| \\
|
|
R & = & \sqrt{hs^{2} - |x_{c} - x_{s}|^{2}} \\
|
|
\alpha & = & ATT - 2SOM \\
|
|
\beta & = & 180 - 90 - 2MOM \\
|
|
MOM & = & polarizer \omega \\
|
|
SOM & = & sample \omega \\
|
|
x_{c} & = & counter position \\
|
|
x_{s} & = & sample position\\
|
|
\end{eqnarray}
|
|
The same equations hold true for the calculations of the diaphragm
|
|
heights, just replace the distances. The equations for the analyzer
|
|
are not yet known.
|
|
|
|
Due to this complicated movement this module needs to know about a lot
|
|
of motors and a lot of parameters. The distances of the various
|
|
components need to be modified at run time in order to allow for
|
|
configuration changes. These are not motorized but must be entered
|
|
manually.
|
|
|
|
\subsubsection{Data Structures}
|
|
Consequently data structures are complex. The first data structure
|
|
used is an entry in an array of motors to start:
|
|
\begin{flushleft} \small
|
|
\begin{minipage}{\linewidth} \label{scrap1}
|
|
$\langle$putput {\footnotesize ?}$\rangle\equiv$
|
|
\vspace{-1ex}
|
|
\begin{list}{}{} \item
|
|
\mbox{}\verb@@\\
|
|
\mbox{}\verb@ typedef struct {@\\
|
|
\mbox{}\verb@ pMotor pMot;@\\
|
|
\mbox{}\verb@ char pName[80];@\\
|
|
\mbox{}\verb@ float fTarget;@\\
|
|
\mbox{}\verb@ }MotEntry, *pMotEntry;@\\
|
|
\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{description}
|
|
\item[pMot] is a pointer to the motors data structure.
|
|
\item[pName] is the name of the motor to start.
|
|
\item[fTarget] is the target value for the motor.
|
|
\end{description}
|
|
|
|
The next data structure is the class data structure for amor2t:
|
|
\begin{flushleft} \small
|
|
\begin{minipage}{\linewidth} \label{scrap2}
|
|
$\langle$amoredata {\footnotesize ?}$\rangle\equiv$
|
|
\vspace{-1ex}
|
|
\begin{list}{}{} \item
|
|
\mbox{}\verb@@\\
|
|
\mbox{}\verb@ typedef struct __AMOR2T {@\\
|
|
\mbox{}\verb@ pObjectDescriptor pDes;@\\
|
|
\mbox{}\verb@ pIDrivable pDriv;@\\
|
|
\mbox{}\verb@ pMotor aEngine[MAXMOT];@\\
|
|
\mbox{}\verb@ MotEntry toStart[MAXMOT];@\\
|
|
\mbox{}\verb@ int iStart;@\\
|
|
\mbox{}\verb@ ObPar *aParameter;@\\
|
|
\mbox{}\verb@ }Amor2T;@\\
|
|
\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{description}
|
|
\item[pDes] The standard SICS object descriptor.
|
|
\item[pDriv] The drivable interface. The functions defined for the
|
|
drivable interface implement most of the work of this class.
|
|
\item[aEngine] An array of pointers to the motor data structures this
|
|
class has to deal with. The proper initialization of this is taken
|
|
care of during the initialization of the object.
|
|
\item[toStart] An array of motors to start when all calculations have
|
|
been performed.
|
|
\item[iStart] The number of valid entries in toStart.
|
|
\item[aParameter] An array of parameters for this object.
|
|
\end{description}
|
|
|
|
\subsubsection{The Interface}
|
|
The interface to this module is quite primitive. Most of the
|
|
functionality is hidden in the drivable interface. So there are only
|
|
functions for interacting with the interpreter.
|
|
|
|
\begin{flushleft} \small
|
|
\begin{minipage}{\linewidth} \label{scrap3}
|
|
$\langle$amorinterface {\footnotesize ?}$\rangle\equiv$
|
|
\vspace{-1ex}
|
|
\begin{list}{}{} \item
|
|
\mbox{}\verb@@\\
|
|
\mbox{}\verb@ typedef struct __AMOR2T *pAmor2T;@\\
|
|
\mbox{}\verb@@\\
|
|
\mbox{}\verb@ int Amor2TFactory(SConnection *pCon, SicsInterp *pSics, void *pData,@\\
|
|
\mbox{}\verb@ int argc, char *argv[]);@\\
|
|
\mbox{}\verb@ int Amor2TAction(SConnection *pCon, SicsInterp *pSics, void *pData,@\\
|
|
\mbox{}\verb@ int argc, char *argv[]);@\\
|
|
\mbox{}\verb@ void Amor2TKill(void *pData); @\\
|
|
\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@"amor2t.i"@ {\footnotesize ? }$\equiv$
|
|
\vspace{-1ex}
|
|
\begin{list}{}{} \item
|
|
\mbox{}\verb@@\\
|
|
\mbox{}\verb@/*--------------------------------------------------------------------------@\\
|
|
\mbox{}\verb@ A m o r 2 T . i@\\
|
|
\mbox{}\verb@ Internal data structure definitions for Amor2T. For details see amor2t.tex.@\\
|
|
\mbox{}\verb@ DO NOT TOUCH! This file is automatically created from amor2t.w.@\\
|
|
\mbox{}\verb@@\\
|
|
\mbox{}\verb@ Mark Koennecke, September 1999@\\
|
|
\mbox{}\verb@----------------------------------------------------------------------------*/@\\
|
|
\mbox{}\verb@@\\
|
|
\mbox{}\verb@/* distance detector sample */@\\
|
|
\mbox{}\verb@#define PARDS 0@\\
|
|
\mbox{}\verb@/* constant height of sample: height = PARDH + MOTSOZ + MOTSTZ */@\\
|
|
\mbox{}\verb@#define PARDH 1@\\
|
|
\mbox{}\verb@/* distance diaphragm 4 - sample */@\\
|
|
\mbox{}\verb@#define PARDD4 2@\\
|
|
\mbox{}\verb@/* distance to diaphragm 5 */@\\
|
|
\mbox{}\verb@#define PARDD5 3@\\
|
|
\mbox{}\verb@/* interrupt to issue when a motor fails on this */@\\
|
|
\mbox{}\verb@#define PARINT 4@\\
|
|
\mbox{}\verb@/* base height of counter station */@\\
|
|
\mbox{}\verb@#define PARDDH 5@\\
|
|
\mbox{}\verb@/* height of D4 */@\\
|
|
\mbox{}\verb@#define PARD4H 6@\\
|
|
\mbox{}\verb@/* height of D5 */@\\
|
|
\mbox{}\verb@#define PARD5H 7@\\
|
|
\mbox{}\verb@/* base height of analyzer */@\\
|
|
\mbox{}\verb@#define PARANA 8@\\
|
|
\mbox{}\verb@/* distance of analyzer from sample */@\\
|
|
\mbox{}\verb@#define PARADIS 9@\\
|
|
\mbox{}\verb@/* flag analyzer calculation on/off */@\\
|
|
\mbox{}\verb@#define ANAFLAG 10@\\
|
|
\mbox{}\verb@/* constant for second detector */@\\
|
|
\mbox{}\verb@#define PARDDD 11@\\
|
|
\mbox{}\verb@/* constant part of AOM */@\\
|
|
\mbox{}\verb@#define PARAOM 12@\\
|
|
\mbox{}\verb@@\\
|
|
\mbox{}\verb@@$\langle$putput {\footnotesize ?}$\rangle$\verb@@\\
|
|
\mbox{}\verb@@\\
|
|
\mbox{}\verb@@$\langle$amoredata {\footnotesize ?}$\rangle$\verb@@\\
|
|
\mbox{}\verb@@\\
|
|
\mbox{}\verb@@$\diamond$
|
|
\end{list}
|
|
\vspace{-2ex}
|
|
\end{minipage}\\[4ex]
|
|
\end{flushleft}
|
|
\begin{flushleft} \small
|
|
\begin{minipage}{\linewidth} \label{scrap5}
|
|
\verb@"amor2t.h"@ {\footnotesize ? }$\equiv$
|
|
\vspace{-1ex}
|
|
\begin{list}{}{} \item
|
|
\mbox{}\verb@@\\
|
|
\mbox{}\verb@/*-------------------------------------------------------------------------@\\
|
|
\mbox{}\verb@ A m o r 2 T@\\
|
|
\mbox{}\verb@ A class for controlling the two theta movement of a reflectometer. @\\
|
|
\mbox{}\verb@ Especially the AMOR reflectometer at SINQ. For details see the file @\\
|
|
\mbox{}\verb@ amor2t.tex. DO NOT TOUCH! This file is automatically created from amor2t.w@\\
|
|
\mbox{}\verb@ with nuweb.@\\
|
|
\mbox{}\verb@@\\
|
|
\mbox{}\verb@ Mark Koennecke, September 1999@\\
|
|
\mbox{}\verb@---------------------------------------------------------------------------*/@\\
|
|
\mbox{}\verb@#ifndef AMOR2T@\\
|
|
\mbox{}\verb@#define AMOR2T@\\
|
|
\mbox{}\verb@@$\langle$amorinterface {\footnotesize ?}$\rangle$\verb@@\\
|
|
\mbox{}\verb@#endif @\\
|
|
\mbox{}\verb@@$\diamond$
|
|
\end{list}
|
|
\vspace{-2ex}
|
|
\end{minipage}\\[4ex]
|
|
\end{flushleft}
|