IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 288


Ignore:
Timestamp:
Mar 23, 2004, 3:54:57 PM (22 years ago)
Author:
Paul Price
Message:

Hacked following Monet's comments.
Renamed psFrame to psReadout to remove confusion. Added psGetParallaxFactor().

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/doc/pslib/psLibSDRS.tex

    r285 r288  
    418418\end{verbatim}
    419419\caption{An example of reference counting}
     420\label{tabReferenceCounting}
    420421\end{table}
    421422
     
    470471int psGetTraceLevel(const char *name);  // facilty of interest
    471472
    472 void psTraceReset(void);                // turn off all tracing, and free trace's allocated memory
     473void psTraceReset(void);                // turn off all tracing, and free trace's allocated memory
    473474
    474475void psPrintTraceLevels(void);          // print trace levels
     
    815816
    816817This type and functions may be declared and defined using two macros
    817 from \file{psArray.h} (table \ref{tabPsArray}),
    818 \code{PS_DECLARE_ARRAY_TYPE(psType)} and
    819 \code{PS_CREATE_ARRAY_TYPE(psType)}.  The former defines the \code{typedef}
    820 and declares the prototypes (and is thus suitable for use in a
    821 header file); the latter generates the code for the three functions
    822 \code{psType(Alloc|Realloc|Free)} (and should thus appear in exactly one
    823 source file for a given type).
     818from \file{psArray.h}, \code{PS_DECLARE_ARRAY_TYPE(psType)} and
     819\code{PS_CREATE_ARRAY_TYPE(psType)}.  The former defines the
     820\code{typedef} and declares the prototypes (and is thus suitable for
     821use in a header file); the latter generates the code for the three
     822functions \code{psType(Alloc|Realloc|Free)} (and should thus appear in
     823exactly one source file for a given type).
    824824
    825825The \code{psType} should be a single word (e.g. \code{psXY}); in particular,
     
    837837If you wish to use arrays of pointers, use the macros
    838838\code{PS_DECLARE_ARRAY_PTR_TYPE(psType)} and
    839 \code{PS_CREATE_ARRAY_PTR_TYPE(psType)} (table \ref{tabPsArray}). These
     839\code{PS_CREATE_ARRAY_PTR_TYPE(psType)}. These
    840840create types \code{typedef psType *psTypePtr} and \code{psTypePtrArray}:
    841841\begin{verbatim}
     
    931931
    932932    for (int i = 0; i < t->n; i++) {
    933         t->arr[i].x = i;
    934         pt->arr[i]->y = 10*i;
     933        t->arr[i].x = i;
     934        pt->arr[i]->y = 10*i;
    935935    }
    936936
     
    939939
    940940    for (int i = 0; i < t->n; i++) {
    941         printf("%d %d  ", t->arr[i].x, pt->arr[i]->y);
     941        printf("%d %d  ", t->arr[i].x, pt->arr[i]->y);
    942942    }
    943943    printf("\n");
     
    11001100/** Set a bit mask */
    11011101psBitMask *
    1102 psBitMaskSet(psBitMask *outMask,        //!< Output bit mask or NULL
    1103              const psBitMask *myMask,   //!< Input bit mask
    1104              int bit                    //!< Bit to set
     1102psBitMaskSet(psBitMask *outMask,        //!< Output bit mask or NULL
     1103             const psBitMask *myMask,   //!< Input bit mask
     1104             int bit                    //!< Bit to set
    11051105    );
    11061106\end{verbatim}
     
    11101110int
    11111111psBitMaskTest(const psBitMask *checkMask, //!< Bit mask to check
    1112               int bit                   //!< Bit to check
     1112              int bit                   //!< Bit to check
    11131113    );
    11141114\end{verbatim}
     
    11171117/** apply the given operator to two bit masks */
    11181118psBitMask *
    1119 psBitMaskOp(psBitMask *outMask,         //!< Output bit mask or NULL
    1120             const psBitMask *restrict inMask1, //!< Input bit mask 1
    1121             char *operator,             //!< bit mask operator (AND, OR, XOR)
    1122             const psBitMask *restrict inMask2 //!< Input bit mask 2
     1119psBitMaskOp(psBitMask *outMask,         //!< Output bit mask or NULL
     1120            const psBitMask *restrict inMask1, //!< Input bit mask 1
     1121            char *operator,             //!< bit mask operator (AND, OR, XOR)
     1122            const psBitMask *restrict inMask2 //!< Input bit mask 2
    11231123    );
    11241124\end{verbatim}
     
    11761176/** create a psType-ed structure from a specified type  */
    11771177p_ps_Scalar *
    1178 psScalarType (char *mode,               ///< type description
    1179               ...                       ///< value (or values) of specified types
     1178psScalarType (char *mode,               ///< type description
     1179              ...                       ///< value (or values) of specified types
    11801180);
    11811181\end{verbatim}
     
    11851185    psType type;
    11861186    union {
    1187         int i;
    1188         float f;
    1189         double d;
    1190         complex float c;
     1187        int i;
     1188        float f;
     1189        double d;
     1190        complex float c;
    11911191    }
    11921192} p_psScalar;
     
    12131213/** Sort an array. Inputs not restrict-ed to allow sort in place */
    12141214psFloatArray *
    1215 psSort(psFloatArray *out,               //!< Sorted array to return. May be NULL
    1216        const psFloatArray *myArray      //!< Array to sort
     1215psSort(psFloatArray *out,               //!< Sorted array to return. May be NULL
     1216       const psFloatArray *myArray      //!< Array to sort
    12171217    );
    12181218\end{verbatim}
     
    12261226/** Sort an array, along with some other stuff.  Returns an index array */
    12271227psIntArray *
    1228 psSortIndex(psIntArray *restrict out;   //!< Output index array (may be NULL)
    1229             const psFloatArray *restrict myArray //!< Array to sort
     1228psSortIndex(psIntArray *restrict out;   //!< Output index array (may be NULL)
     1229            const psFloatArray *restrict myArray //!< Array to sort
    12301230    );
    12311231\end{verbatim}
     
    12671267psStats *
    12681268psArrayStats(const psFloatArray *restrict myArray, //!< Array to be analysed
    1269              const psIntArray *restrict maskArray, //!< Ignore elements where (maskArray & maskVal) != 0
    1270                                                    //!< May be NULL
    1271              unsigned int maskVal,      //!< Only mask elements with one of these bits set in maskArray
    1272              psStats *stats             //!< stats structure defines stats to be calculated and how
    1273              );
     1269             const psIntArray *restrict maskArray, //!< Ignore elements where (maskArray & maskVal) != 0
     1270                                                   //!< May be NULL
     1271             unsigned int maskVal,      //!< Only mask elements with one of these bits set in maskArray
     1272             psStats *stats             //!< stats structure defines stats to be calculated and how
     1273             );
    12741274\end{verbatim}
    12751275
     
    12801280/** generic statistics structure */
    12811281typedef struct {
    1282     double sampleMean;                  //<! formal mean of sample
    1283     double sampleMedian;                //<! formal median of sample
    1284     double sampleMode;                  //!< Formal mode of sample
    1285     double sampleStdev;                 //<! standard deviation of sample
    1286     double sampleUQ;                    //<! upper quartile of sample
    1287     double sampleLQ;                    //<! lower quartile of sample
    1288     double robustMean;                  //<! robust mean of array
    1289     double robustMeanError;             //<! error on robust mean
    1290     int    robustMeanNvalues;           //<! number of measurements used for robust mean
    1291     double robustMedian;                //<! robust median of array
    1292     double robustMedianError;           //<! error on robust median
    1293     int    robustMedianNvalues;         //<! number of measurements used for robust median
    1294     double robustMode;                  //!< Robust mode of array
    1295     double robustModeErr;               //!< Error in robust mode
    1296     int    robustModeNvalues;           //!< Number of measurements used for robust mode
    1297     double robustStdev;                 //<! robust standard deviation of array
    1298     double robustUQ;                    //<! robust upper quartile
    1299     double robustLQ;                    //<! robust lower quartile
    1300     double clippedMean;                 //<! Nsigma clipped mean
    1301     double clippedMeanError;            //<! error on clipped mean
    1302     int    clippedMeanNvalues;          //<! number of data points used for clipped mean
    1303     double clippedStdev;                //!< standard deviation after clipping
    1304     double clipSigma;                   //<! Nsigma used for clipping; user input
    1305     int    clipIter;                    //!< Number of clipping iterations; user input
    1306     double min;                         //<! minimum data value in array
    1307     double max;                         //<! maximum data value in array
    1308     int    nValues;                     //<! number of data values in array
    1309     psStatsOptions options;             //<! bitmask of calculated values
     1282    double sampleMean;                  //<! formal mean of sample
     1283    double sampleMedian;                //<! formal median of sample
     1284    double sampleMode;                  //!< Formal mode of sample
     1285    double sampleStdev;                 //<! standard deviation of sample
     1286    double sampleUQ;                    //<! upper quartile of sample
     1287    double sampleLQ;                    //<! lower quartile of sample
     1288    double robustMean;                  //<! robust mean of array
     1289    double robustMeanError;             //<! error on robust mean
     1290    int    robustMeanNvalues;           //<! number of measurements used for robust mean
     1291    double robustMedian;                //<! robust median of array
     1292    double robustMedianError;           //<! error on robust median
     1293    int    robustMedianNvalues;         //<! number of measurements used for robust median
     1294    double robustMode;                  //!< Robust mode of array
     1295    double robustModeErr;               //!< Error in robust mode
     1296    int    robustModeNvalues;           //!< Number of measurements used for robust mode
     1297    double robustStdev;                 //<! robust standard deviation of array
     1298    double robustUQ;                    //<! robust upper quartile
     1299    double robustLQ;                    //<! robust lower quartile
     1300    double clippedMean;                 //<! Nsigma clipped mean
     1301    double clippedMeanError;            //<! error on clipped mean
     1302    int    clippedMeanNvalues;          //<! number of data points used for clipped mean
     1303    double clippedStdev;                //!< standard deviation after clipping
     1304    double clipSigma;                   //<! Nsigma used for clipping; user input
     1305    int    clipIter;                    //!< Number of clipping iterations; user input
     1306    double min;                         //<! minimum data value in array
     1307    double max;                         //<! maximum data value in array
     1308    int    nValues;                     //<! number of data values in array
     1309    psStatsOptions options;             //<! bitmask of calculated values
    13101310} psStats;
    13111311\end{verbatim}
     
    13201320/** Histograms */
    13211321typedef struct {
    1322     const psFloatArray *restrict lower; //!< Lower bounds for the bins
     1322    const psFloatArray *restrict lower; //!< Lower bounds for the bins
    13231323    const psFloatArray *restrict upper; //!< Upper bounds for the bins
    1324     psIntArray *nums;                   //!< Number in each of the bins
    1325     const float minVal, maxVal;         //!< Minimum and maximum values
    1326     int minNum, maxNum;                 //!< Number below the minimum and above the maximum
     1324    psIntArray *nums;                   //!< Number in each of the bins
     1325    const float minVal, maxVal;         //!< Minimum and maximum values
     1326    int minNum, maxNum;                 //!< Number below the minimum and above the maximum
    13271327} psHistogram;
    13281328\end{verbatim}
     
    13361336/** Constructor */
    13371337psHistogram *
    1338 psHistogramAlloc(float lower,           //!< Lower limit for the bins
    1339                  float upper,           //!< Upper limit for the bins
    1340                  float size             //!< Size of the bins
     1338psHistogramAlloc(float lower,           //!< Lower limit for the bins
     1339                 float upper,           //!< Upper limit for the bins
     1340                 float size             //!< Size of the bins
    13411341    );
    13421342\end{verbatim}
     
    13461346psHistogram *
    13471347psHistogramAllocGeneric(const psFloatArray *restrict lower, //!< Lower bounds for the bins
    1348                         const psFloatArray *restrict upper, //!< Upper bounds for the bins
    1349                         float minVal,   //!< Minimum value
    1350                         float maxVal    //!< Maximum value
     1348                        const psFloatArray *restrict upper, //!< Upper bounds for the bins
     1349                        float minVal,   //!< Minimum value
     1350                        float maxVal    //!< Maximum value
    13511351    );
    13521352\end{verbatim}
     
    13691369/** A matrix */
    13701370typedef struct {
    1371     int xSize, ySize;                   //!< Dimensions in x and y
    1372     float *restrict *restrict value;    //!< Values in matrix
     1371    int xSize, ySize;                   //!< Dimensions in x and y
     1372    float *restrict *restrict value;    //!< Values in matrix
    13731373} psMatrix;
    13741374\end{verbatim}
     
    13791379/** Constructor */
    13801380psMatrix *
    1381 psMatrixAlloc(int Xdimen,                       //!< x dimension of new matrix
    1382               int Ydimen                        //!< y dimension of new matrix
    1383               );
     1381psMatrixAlloc(int Xdimen,                       //!< x dimension of new matrix
     1382              int Ydimen                        //!< y dimension of new matrix
     1383              );
    13841384\end{verbatim}
    13851385
     
    13871387/** Destructor */
    13881388void
    1389 psMatrixFree(psMatrix *restrict myMatrix        //!< Matrix to destroy
    1390              );
     1389psMatrixFree(psMatrix *restrict myMatrix        //!< Matrix to destroy
     1390             );
    13911391\end{verbatim}
    13921392
     
    14041404/** Invert matrix.  Not using restrict, to allow inversion to be done in-place */
    14051405psMatrix *
    1406 psMatrixInvert(psMatrix *out,           //!< Matrix to return, or NULL
    1407                const psMatrix *myMatrix, //!< Matrix to be inverted
    1408                float *restrict determinant //!< Determinant to return, or NULL
     1406psMatrixInvert(psMatrix *out,           //!< Matrix to return, or NULL
     1407               const psMatrix *myMatrix, //!< Matrix to be inverted
     1408               float *restrict determinant //!< Determinant to return, or NULL
    14091409    );
    14101410\end{verbatim}
     
    14141414float
    14151415psMatrixDeterminant(const psMatrix *restrict myMatrix //!< Matrix to get determinant for
    1416                     );
     1416                    );
    14171417\end{verbatim}
    14181418
     
    14201420/** Matrix operations */
    14211421psMatrix *
    1422 psMatrixOp(psMatrix *out,               //!< Matrix to return, or NULL
    1423            const psMatrix *matrix1,     //!< Matrix 1
    1424            const char *op,              //!< Operation to perform
    1425            const psMatrix *matrix2      //!< Matrix 2
    1426            );
     1422psMatrixOp(psMatrix *out,               //!< Matrix to return, or NULL
     1423           const psMatrix *matrix1,     //!< Matrix 1
     1424           const char *op,              //!< Operation to perform
     1425           const psMatrix *matrix2      //!< Matrix 2
     1426           );
    14271427\end{verbatim}
    14281428
     
    14301430/** Transpose Matrix */
    14311431psMatrix *
    1432 psMatrixTranspose(psMatrix *out,        //!< Matrix to return, or NULL
    1433                   const psMatrix *myMatrix //!< Matrix to transpose
    1434                   );
     1432psMatrixTranspose(psMatrix *out,        //!< Matrix to return, or NULL
     1433                  const psMatrix *myMatrix //!< Matrix to transpose
     1434                  );
    14351435\end{verbatim}
    14361436
     
    14381438/** Convert matrix to vector.  Intended for a 1-d matrix. */
    14391439psVector *
    1440 psMatrixToVector(psMatrix *myMatrix     //!< Matrix to convert
     1440psMatrixToVector(psMatrix *myMatrix     //!< Matrix to convert
    14411441    );
    14421442\end{verbatim}
     
    14581458/** Return Fourier Transform of an array */
    14591459psComplexArray *
    1460 psRealFFT(psComplexArray *restrict out, //!< Output array to be returned; may be NULL
    1461           const psFloatArray *restrict myArray //!< Input array
    1462           );
     1460psRealFFT(psComplexArray *restrict out, //!< Output array to be returned; may be NULL
     1461          const psFloatArray *restrict myArray //!< Input array
     1462          );
    14631463\end{verbatim}
    14641464
     
    14671467psComplexArray *
    14681468psComplexFFT(psComplexArray *restrict out, //!< Output array to be returned; may be NULL
    1469              const psComplexArray *restrict myArray, //!< Input array
    1470              int sign                   //!< +1 or -1 to indicate direction of FT
    1471              );
     1469             const psComplexArray *restrict myArray, //!< Input array
     1470             int sign                   //!< +1 or -1 to indicate direction of FT
     1471             );
    14721472\end{verbatim}
    14731473
     
    14751475/** Return Power spectrum of a array */
    14761476psFloatArray *
    1477 psPowerSpec(psFloatArray *restrict out, //!< Output array to be returned
    1478             const psFloatArray *restrict myArray //!< Input array
    1479             );
     1477psPowerSpec(psFloatArray *restrict out, //!< Output array to be returned
     1478            const psFloatArray *restrict myArray //!< Input array
     1479            );
    14801480\end{verbatim}
    14811481
     
    14911491    is not a Gaussian deviate.  The evaluated Gaussian is: \f[ exp(-\frac{(x-mean)^2}{2\sigma^2}) \f] */
    14921492float
    1493 psGaussian(float x,                     //!< Value at which to evaluate
    1494            float mean,                  //!< Mean for the Gaussian
    1495            float stddev                 //!< Standard deviation for the Gaussian
    1496            );
     1493psGaussian(float x,                     //!< Value at which to evaluate
     1494           float mean,                  //!< Mean for the Gaussian
     1495           float stddev                 //!< Standard deviation for the Gaussian
     1496           );
    14971497\end{verbatim}
    14981498
     
    15091509/** One-dimensional polynomial */
    15101510typedef struct {
    1511     int n;                              //!< Number of terms
    1512     float *restrict coeff;              //!< Coefficients
    1513     float *restrict coeffErr;           //!< Error in coefficients
    1514     char *restrict mask;                //!< Coefficient mask
     1511    int n;                              //!< Number of terms
     1512    float *restrict coeff;              //!< Coefficients
     1513    float *restrict coeffErr;           //!< Error in coefficients
     1514    char *restrict mask;                //!< Coefficient mask
    15151515} psPolynomial1D;
    15161516\end{verbatim}
     
    15191519/** Two-dimensional polynomial */
    15201520typedef struct {
    1521     int nX, nY;                         //!< Number of terms in x and y
    1522     float *restrict *restrict coeff;    //!< Coefficients
    1523     float *restrict *restrict coeffErr; //!< Error in coefficients
    1524     char *restrict *restrict mask;      //!< Coefficients mask
     1521    int nX, nY;                         //!< Number of terms in x and y
     1522    float *restrict *restrict coeff;    //!< Coefficients
     1523    float *restrict *restrict coeffErr; //!< Error in coefficients
     1524    char *restrict *restrict mask;      //!< Coefficients mask
    15251525} psPolynomial2D;
    15261526\end{verbatim}
     
    15311531/** Double-precision one-dimensional polynomial */
    15321532typedef struct {
    1533     int n;                              //!< Number of terms
    1534     double *restrict coeff;             //!< Coefficients
    1535     double *restrict coeffErr;          //!< Error in coefficients
    1536     char *restrict mask;                //!< Coefficient mask
     1533    int n;                              //!< Number of terms
     1534    double *restrict coeff;             //!< Coefficients
     1535    double *restrict coeffErr;          //!< Error in coefficients
     1536    char *restrict mask;                //!< Coefficient mask
    15371537} psDPolynomial1D;
    15381538\end{verbatim}
     
    15411541/** Double-precision two-dimensional polynomial */
    15421542typedef struct {
    1543     int nX, nY;                         //!< Number of terms in x and y
    1544     double *restrict *restrict coeff;   //!< Coefficients
     1543    int nX, nY;                         //!< Number of terms in x and y
     1544    double *restrict *restrict coeff;   //!< Coefficients
    15451545    double *restrict *restrict coeffErr; //!< Error in coefficients
    1546     char *restrict *restrict mask;      //!< Coefficients mask
     1546    char *restrict *restrict mask;      //!< Coefficients mask
    15471547} psDPolynomial2D;
    15481548\end{verbatim}
     
    15651565/** Evaluate 2D polynomial (double precision) */
    15661566double
    1567 psEvalDPolynomial2D(double x,           //!< Value x at which to evaluate
    1568                     double y,           //!< Value y at which to evaluate
    1569                     const psDPolynomial2D *restrict myPoly //!< Coefficients for the polynomial
    1570                     );
     1567psEvalDPolynomial2D(double x,           //!< Value x at which to evaluate
     1568                    double y,           //!< Value y at which to evaluate
     1569                    const psDPolynomial2D *restrict myPoly //!< Coefficients for the polynomial
     1570                    );
    15711571\end{verbatim}
    15721572
     
    15831583/** Minimize a particular function */
    15841584psFloatArray *
    1585 psMinimize(float (*myFunction)(const psFloatArray *restrict),   //!< Function to minimize
    1586            psFloatArray *restrict initialGuess //!< Initial guess
    1587            );
     1585psMinimize(float (*myFunction)(const psFloatArray *restrict),   //!< Function to minimize
     1586           psFloatArray *restrict initialGuess //!< Initial guess
     1587           );
    15881588\end{verbatim}
    15891589
     
    15921592psFloatArray *
    15931593psMinimizeChi2(float (*evalModel)(const psFloatArray *restrict,
    1594                                   const psFloatArray *restrict), //!< Model to fit; receives domain and
    1595                                                                 //!< parameters
    1596                const psFloatArray *restrict domain, //!< The domain values for the corresponding measurements
    1597                const psFloatArray *restrict data, //!< Data to fit
    1598                const psFloatArray *restrict errors, //!< Errors in the data
    1599                psFloatArray *restrict initialGuess, //!< Initial guess
    1600                const psIntArray *restrict guessMask //!< 1 = fit for parameter, 0 = hold parameter constant
    1601                );
     1594                                  const psFloatArray *restrict), //!< Model to fit; receives domain and
     1595                                                                //!< parameters
     1596               const psFloatArray *restrict domain, //!< The domain values for the corresponding measurements
     1597               const psFloatArray *restrict data, //!< Data to fit
     1598               const psFloatArray *restrict errors, //!< Errors in the data
     1599               psFloatArray *restrict initialGuess, //!< Initial guess
     1600               const psIntArray *restrict guessMask //!< 1 = fit for parameter, 0 = hold parameter constant
     1601               );
    16021602\end{verbatim}
    16031603
     
    16061606psFloatArray *
    16071607psGetArrayPolynomial(const psFloatArray *restrict ord, //!< Ordinates (or NULL to just use the indices)
    1608                      const psFloatArray *restrict coord //!< Coordinates
     1608                     const psFloatArray *restrict coord //!< Coordinates
    16091609    );
    16101610\end{verbatim}
     
    17071707\begin{verbatim}
    17081708void
    1709 psImageFree(psImage *restrict image     ///< free this image
     1709psImageFree(psImage *restrict image     ///< free this image
    17101710    );
    17111711\end{verbatim}
     
    20372037definitions do not influence the understanding of this document.
    20382038
    2039 A ``frame'' is a read of the detector.
     2039A ``readout'' is a read of the detector.
    20402040
    20412041A ``cell'' is defined as the smallest element of the detector readout;
    20422042usually associated with an amplifier.  Correspondingly, each cell has
    2043 its own overscan region.  There may be multiple frames in a cell if
     2043its own overscan region.  There may be multiple readouts in a cell if
    20442044the cell was used to provide fast guiding.
    20452045
     
    205520552k$.  There would be eight chips, each consisting of two cells, and
    20562056the focal plane consists of these eight chips.
     2057
     2058As another example, consider an observation by PS1.  The focal plane
     2059would consist of 60 chips, each of which consist of 64 cells (or less;
     2060a few cells may be dead).  Some cells (those containing guide stars
     2061for the orthogonal transfer) will contain multiple readouts.
    20572062
    20582063\subsubsection{Coordinate frames}
     
    20942099well as the pixel data.
    20952100
    2096 \subsubsection{A Frame}
    2097 
    2098 A frame is the result of a single read of a cell (or a portion
     2101\subsubsection{A Readout}
     2102
     2103A readout is the result of a single read of a cell (or a portion
    20992104thereof).  It contains a pointer to the pixel data, a separate pointer
    21002105to the overscan pixels, and additional pointers to the objects found
    2101 in the frame, and the frame metadata.  It also contains the offset
     2106in the readout, and the readout metadata.  It also contains the offset
    21022107from the lower-left corner of the chip, in the case that the CCD was
    21032108windowed.
    21042109
    21052110\begin{verbatim}
    2106 /** a Frame: a collection of pixels */
     2111/** a Readout: a collection of pixels */
    21072112typedef struct {
    2108     int x0, y0;                         //!< Offset from the lower-left corner
     2113    int x0, y0;                         //!< Offset from the lower-left corner
    21092114    psImage *image;                     ///< imaging area of cell
    2110     psDlist *objects;                   ///< objects derived from cell
     2115    psDlist *objects;                   ///< objects derived from cell
    21112116    psImage *overscan;                  ///< bias region (subimage) of cell
    2112     psMetaDataSet *md;                  //!< Frame-level metadata
    2113 } psFrame;
     2117    psMetaDataSet *md;                  //!< Readout-level metadata
     2118} psReadout;
    21142119\end{verbatim}   
    21152120
     
    21172122\subsubsection{A Cell}
    21182123
    2119 A cell consists of one or more frames (usually only one except in the
     2124A cell consists of one or more readouts (usually only one except in the
    21202125case that the cell has been used for fast guiding).  It also contains
    21212126a pointer to the cell metadata, and a pointer to its parent chip.  On
     
    21332138
    21342139\begin{verbatim}
    2135 /** a Cell: a collection of frames.
     2140/** a Cell: a collection of readouts.
    21362141 */
    21372142typedef struct {
    2138     int nFrames;                        ///< number of frames in this cell realization; each may have its own
    2139                                         ///< image, objects and overscan.
    2140     struct psFrame *frames;             //!< Frames from the cell
    2141     psMetaDataSet *md;                  ///< Cell-level metadata
    2142 
    2143     psCoordXform *cellToChip;           ///< Transformations from cell coordinates to chip coordinates
    2144     psCoordXform *cellToFPA;            ///< Transformations from cell coordinates to FPA coordinates
    2145     psCoordXform *cellToSky;            ///< Quick and Dirty transformations from cell coordinates to sky
    2146 
    2147     struct psChip  *parentChip;         ///< chip which contains this cell
     2143    int nReadouts;                      ///< number of readouts in this cell realization; each may have its own
     2144                                        ///< image, objects and overscan.
     2145    struct psReadout *readouts;         //!< Readouts from the cell
     2146    psMetaDataSet *md;                  ///< Cell-level metadata
     2147
     2148    psCoordXform *cellToChip;           ///< Transformations from cell coordinates to chip coordinates
     2149    psCoordXform *cellToFPA;            ///< Transformations from cell coordinates to FPA coordinates
     2150    psCoordXform *cellToSky;            ///< Quick and Dirty transformations from cell coordinates to sky
     2151
     2152    struct psChip  *parentChip;         ///< chip which contains this cell
    21482153} psCell;
    21492154\end{verbatim}
     
    21692174    struct psCell *cells;               ///< Cells in the Chip
    21702175
    2171     psMetaDataSet *md;                  ///< Chip-level metadata
     2176    psMetaDataSet *md;                  ///< Chip-level metadata
    21722177    psCoordXform *chipToFPA;            ///< Transformations from chip coordinates to FPA coordinates
    21732178
    2174     struct psFPA *parentFPA;            ///< FPA which contains this chip
     2179    struct psFPA *parentFPA;            ///< FPA which contains this chip
    21752180} psChip;
    21762181\end{verbatim}
     
    22022207    int nChips;                         ///< Number of Cells assigned
    22032208    int nAlloc;                         ///< Number of Cells available
    2204     struct psChip *chips;               ///< Chips in the Focal Plane Array
    2205 
    2206     psMetaDataSet *md;                  ///< FPA-level metadata
    2207     psDistortion *TPtoFP;               ///< Transformation term from
    2208     psDistortion *FPtoTP;               ///< Transformation term from
    2209     psFixedPattern *pattern;            //!< Fixed pattern residual offsets
     2209    struct psChip *chips;               ///< Chips in the Focal Plane Array
     2210
     2211    psMetaDataSet *md;                  ///< FPA-level metadata
     2212    psDistortion *TPtoFP;               ///< Transformation term from
     2213    psDistortion *FPtoTP;               ///< Transformation term from
     2214    psFixedPattern *pattern;            //!< Fixed pattern residual offsets
    22102215    psExposure *exp;                    ///< information about this exposure
    22112216    psPhotSystem colorPlus, colorMinus; ///< Colour reference
     
    22892294/** The fixed pattern residual offsets.  These are specified via a coarse grid of x and y offsets. */
    22902295typedef struct {
    2291     int nX, nY;                         //!< Number of elements in x and y
    2292     double x0, y0;                      //!< Position of the lower-left corner of the grid on the focal plane
    2293     double xScale, yScale;              //!< Scale of the grid
    2294     double **x, **y;                    //!< The grid of offsets in x and y
     2296    int nX, nY;                         //!< Number of elements in x and y
     2297    double x0, y0;                      //!< Position of the lower-left corner of the grid on the focal plane
     2298    double xScale, yScale;              //!< Scale of the grid
     2299    double **x, **y;                    //!< The grid of offsets in x and y
    22952300} psFixedPattern;
    22962301\end{verbatim}
     
    23192324                float humidity,         //!< Relative humidity
    23202325                float exptime           //!< Exposure time
    2321                 );
     2326                );
    23222327\end{verbatim}
    23232328
     
    23252330\subsubsection{Finding}
    23262331
    2327 We require functions to return the structure containing given coordinates.
    2328 For example, we want the chip that corresponds to the focal plane coordinates
    2329 $(p,q) = (-1.234,+5.678)$.
     2332We require functions to return the structure containing given
     2333coordinates.  For example, we want the chip that corresponds to the
     2334focal plane coordinates $(p,q) = (-1.234,+5.678)$.  These routines
     2335handle the one-to-many problem --- i.e., for one given focal plane
     2336coordinate, there are many chips that this coordinate may be
     2337correspond to; these functions will select the correct one.
    23302338
    23312339
     
    23332341/** returns Chip in FPA which contains the given FPA coordinate */
    23342342psChip *
    2335 psChipInFPA (psFPA *fpa,                ///< FPA description
    2336              psCoord *coord             ///< coordinate in FPA
    2337              );
     2343psChipInFPA (psFPA *fpa,                ///< FPA description
     2344             psCoord *coord             ///< coordinate in FPA
     2345             );
    23382346\end{verbatim}
    23392347
     
    23412349/** returns Cell in Chip which contains the given chip coordinate */
    23422350psCell *
    2343 psCellInChip (psChip *chip,             ///< chip description
    2344               psCoord *coord            ///< coordinate in chip
    2345               );
     2351psCellInChip (psChip *chip,             ///< chip description
     2352              psCoord *coord            ///< coordinate in chip
     2353              );
    23462354\end{verbatim}
    23472355
     
    23532361/** Return the cell in FPA which contains the given FPA coordinates */
    23542362psCell *
    2355 psCellInFPA(psCell *out,                //!< Cell to return, or NULL
    2356             psFPA *fpa,                 //!< FPA description
    2357             psCoord *coord              //!< Coordinate in FPA
    2358             );
     2363psCellInFPA(psCell *out,                //!< Cell to return, or NULL
     2364            psFPA *fpa,                 //!< FPA description
     2365            psCoord *coord              //!< Coordinate in FPA
     2366            );
    23592367\end{verbatim}
    23602368
     
    23922400/** returns Chip in FPA which contains the given FPA coordinate */
    23932401psChip *
    2394 psChipInFPA (psChip *out,               //!< Chip to return, or NULL
    2395              psFPA *fpa,                ///< FPA description
    2396              psCoord *coord             ///< coordinate in FPA
    2397              );
     2402psChipInFPA (psChip *out,               //!< Chip to return, or NULL
     2403             psFPA *fpa,                ///< FPA description
     2404             psCoord *coord             ///< coordinate in FPA
     2405             );
    23982406\end{verbatim}
    23992407
     
    24012409/** returns Cell in Chip which contains the given chip coordinate */
    24022410psCell *
    2403 psCellInChip(psCell *out,               //!< Cell to return, or NULL
    2404              psChip *chip,              ///< chip description
    2405              psCoord *coord             ///< coordinate in chip
    2406              );
     2411psCellInChip(psCell *out,               //!< Cell to return, or NULL
     2412             psChip *chip,              ///< chip description
     2413             psCoord *coord             ///< coordinate in chip
     2414             );
    24072415\end{verbatim}
    24082416
     
    24102418/** Return the cell in FPA which contains the given FPA coordinates */
    24112419psCell *
    2412 psCellInFPA(psCell *out,                //!< Cell to return, or NULL
    2413             psFPA *fpa,                 //!< FPA description
    2414             psCoord *coord              //!< Coordinate in FPA
    2415             );
     2420psCellInFPA(psCell *out,                //!< Cell to return, or NULL
     2421            psFPA *fpa,                 //!< FPA description
     2422            psCoord *coord              //!< Coordinate in FPA
     2423            );
    24162424\end{verbatim}
    24172425
     
    24192427/** Convert (RA,Dec) to cell and cell coordinates */
    24202428psCoord *
    2421 psCoordSkyToCell(psCoord *out,          //!< Coordinates to return, or NULL
    2422                  psCell *cell,          //!< Cell to return
    2423                  const psFPA *fpa       //!< FPA description
    2424                 );
     2429psCoordSkyToCell(psCoord *out,          //!< Coordinates to return, or NULL
     2430                 psCell *cell,          //!< Cell to return
     2431                 const psFPA *fpa       //!< FPA description
     2432                );
    24252433\end{verbatim}
    24262434
     
    24282436/** Convert cell and cell coordinate to (RA,Dec) */
    24292437psCoord *
    2430 psCoordCellToSky(psCoord *out,          //!< Coordinates to return, or NULL
    2431                  const psCell *cell,    //!< Cell to get coordinates for
    2432                  psCoord *coord         //!< cell coordinates to transform
    2433                 );
     2438psCoordCellToSky(psCoord *out,          //!< Coordinates to return, or NULL
     2439                 const psCell *cell,    //!< Cell to get coordinates for
     2440                 psCoord *coord         //!< cell coordinates to transform
     2441                );
    24342442\end{verbatim}
    24352443
     
    24372445/** Quick and dirty cell to (RA,Dec) --- employs cellToSky transformation */
    24382446psCoord *
    2439 psCoordCellToSkyQuick(psCoord *out,     //!< Coordinates to return, or NULL
    2440                       const psCell *cell, //!< Cell description
    2441                       psCoord *coord    //!< cell coordinates to transform
    2442                       );
     2447psCoordCellToSkyQuick(psCoord *out,     //!< Coordinates to return, or NULL
     2448                      const psCell *cell, //!< Cell description
     2449                      psCoord *coord    //!< cell coordinates to transform
     2450                      );
    24432451\end{verbatim}
    24442452
     
    24462454/** Convert (RA,Dec) to tangent plane coords */
    24472455psCoord *
    2448 psCoordSkyToTP(psCoord *out,            //!< Coordinates to return, or NULL
    2449                psexposure *exp,         //!< Exposure description
    2450                psCoord *coord           //!< input Sky coordinate
    2451                );
     2456psCoordSkyToTP(psCoord *out,            //!< Coordinates to return, or NULL
     2457               psexposure *exp,         //!< Exposure description
     2458               psCoord *coord           //!< input Sky coordinate
     2459               );
    24522460\end{verbatim}
    24532461
     
    24552463/** Convert tangent plane coords to focal plane coordinates */
    24562464psCoord *
    2457 psCoordTPtoFPA(psCoord *out,            //!< Coordinates to return, or NULL
    2458                const psFPA *fpa,        //!< FPA description
    2459                psCoord *coord           //!< input TP coordinate
    2460                );
     2465psCoordTPtoFPA(psCoord *out,            //!< Coordinates to return, or NULL
     2466               const psFPA *fpa,        //!< FPA description
     2467               psCoord *coord           //!< input TP coordinate
     2468               );
    24612469\end{verbatim}
    24622470
     
    24642472/** converts the specified FPA coord to the coord on the given Chip */
    24652473psCoord *
    2466 psCoordFPAtoChip (psCoord *out,         //!< Coordinates to return, or NULL
    2467                   psFPA *fpa,           ///< FPA description
    2468                   psChip *chip,         ///< Chip of interest
    2469                   psCoord *coord        ///< input FPA coordinate
    2470                   );
     2474psCoordFPAtoChip (psCoord *out,         //!< Coordinates to return, or NULL
     2475                  psFPA *fpa,           ///< FPA description
     2476                  psChip *chip,         ///< Chip of interest
     2477                  psCoord *coord        ///< input FPA coordinate
     2478                  );
    24712479\end{verbatim}
    24722480
     
    24742482/** converts the specified Chip coord to the coord on the given Cell */
    24752483psCoord *
    2476 psCoordChiptoCell (psCoord *out,        //!< Coordinates to return, or NULL
    2477                    psChip *chip,        ///< Chip description
    2478                    psCell *cell,        ///< Cell of interest
    2479                    psCoord *coord       ///< input Chip coordinate
    2480                    );
     2484psCoordChiptoCell (psCoord *out,        //!< Coordinates to return, or NULL
     2485                   psChip *chip,        ///< Chip description
     2486                   psCell *cell,        ///< Cell of interest
     2487                   psCoord *coord       ///< input Chip coordinate
     2488                   );
    24812489\end{verbatim}
    24822490
     
    24842492/** converts the specified Cell coord to the coord on the parent Chip */
    24852493psCoord *
    2486 psCoordCelltoChip (psCoord *out,        //!< Coordinates to return, or NULL
    2487                    psCell *cell,        ///< Cell description
    2488                    psCoord *coord       ///< input Cell coordinate
    2489                    );
     2494psCoordCelltoChip (psCoord *out,        //!< Coordinates to return, or NULL
     2495                   psCell *cell,        ///< Cell description
     2496                   psCoord *coord       ///< input Cell coordinate
     2497                   );
    24902498\end{verbatim}
    24912499
     
    24932501/** converts the specified Chip coord to the coord on the parent FPA */
    24942502psCoord *
    2495 psCoordChiptoFPA (psCoord *out,         //!< Coordinates to return, or NULL
    2496                   psChip *chip,         ///< Chip description
    2497                   psCoord *coord        ///< input Chip coordinate
    2498                   );
     2503psCoordChiptoFPA (psCoord *out,         //!< Coordinates to return, or NULL
     2504                  psChip *chip,         ///< Chip description
     2505                  psCoord *coord        ///< input Chip coordinate
     2506                  );
    24992507\end{verbatim}
    25002508
     
    25022510/** Convert focal plane coords to tangent plane coordinates */
    25032511psCoord *
    2504 psCoordFPAToTP(psCoord *out,            //!< Coordinates to return, or NULL
    2505                psFPA *fpa,              //!< FPA description
    2506                psCoord *coord           //!< input FPA coordinate
    2507                );
     2512psCoordFPAToTP(psCoord *out,            //!< Coordinates to return, or NULL
     2513               psFPA *fpa,              //!< FPA description
     2514               psCoord *coord           //!< input FPA coordinate
     2515               );
    25082516\end{verbatim}
    25092517
     
    25112519/** Convert tangent plane coords to (RA,Dec) */
    25122520psCoord *
    2513 psCoordTPtoSky(psCoord *out,            //!< Coordinates to return, or NULL
    2514                psExposure *exp,         //!< Exposure description
    2515                psCoord *coord           //!< input TP coordinate
    2516                );
     2521psCoordTPtoSky(psCoord *out,            //!< Coordinates to return, or NULL
     2522               psExposure *exp,         //!< Exposure description
     2523               psCoord *coord           //!< input TP coordinate
     2524               );
    25172525\end{verbatim}
    25182526
     
    25202528/** Convert Cell coords to FPA coordinates */
    25212529psCoord *
    2522 psCoordCellToFPA(psCoord *out,          //!< Coordinates to return, or NULL
    2523                  psCell *cell,          //!< Cell description
    2524                  psCoord *coord         //!< Input cell coordinates
    2525                 );
     2530psCoordCellToFPA(psCoord *out,          //!< Coordinates to return, or NULL
     2531                 psCell *cell,          //!< Cell description
     2532                 psCoord *coord         //!< Input cell coordinates
     2533                );
    25262534\end{verbatim}
    25272535
     
    25362544/** Get the airmass for a given position and sidereal time */
    25372545float
    2538 psGetAirmass(const psCoord *coord,      //!< Position on the sky
    2539              double siderealTime,       //!< Sidereal time
    2540              float height               //!< Height above sea level
     2546psGetAirmass(const psCoord *coord,      //!< Position on the sky
     2547             double siderealTime,       //!< Sidereal time
     2548             float height               //!< Height above sea level
    25412549             );
    25422550\end{verbatim}
     
    25452553/** Get the parallactic angle for a given position and sidereal time */
    25462554float
    2547 psGetParallactic(const psCoord *coord,  //!< Position on the sky
     2555psGetParallactic(const psCoord *coord,  //!< Position on the sky
    25482556                 double siderealTime    //!< Sidereal time
    25492557                 );
     
    25542562float
    25552563psGetRefraction(float colour,           //!< Colour of object
    2556                 psPhotSystem colorPlus, ///< Colour reference
    2557                 psPhotSystem colorMinus, ///< Colour reference
    2558                 const psExposure *exp   //!< Telescope pointing information, for airmass, temp and pressure
    2559                 );
    2560 \end{verbatim}
    2561 
     2564                psPhotSystem colorPlus, ///< Colour reference
     2565                psPhotSystem colorMinus, ///< Colour reference
     2566                const psExposure *exp   //!< Telescope pointing information, for airmass, temp and pressure
     2567                );
     2568\end{verbatim}
     2569
     2570\begin{verbatim}
     2571/** Calculate the parallax factor */
     2572double
     2573psGetParallaxFactor(const psExposure *exp //!< Exposure details
     2574    );
     2575\end{verbatim}
    25622576
    25632577%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    26492663\begin{verbatim}
    26502664typedef struct {
    2651     psDlist *list;                      // list of psMetaDataItem
    2652     psHash *table;                      // hash table of the same metadata
     2665    psDlist *list;                      // list of psMetaDataItem
     2666    psHash *table;                      // hash table of the same metadata
    26532667} psMetaDataSet;
    26542668\end{verbatim}
     
    27322746\begin{verbatim}
    27332747psMetaDataItem *psMetaDataItemAlloc(
    2734     psMetaDataType type,                // type of this piece of metadata
    2735     const void *val,                    // value of new item
    2736                                         // N.b. a pointer even if the item
    2737                                         // is of type e.g. int
    2738     const char *comment,                // comment associated with item
    2739     const char *name,                   // name of new item of metadata (may be an sprintf format)
    2740     ...);                               // possible arguments for name format
     2748    psMetaDataType type,                // type of this piece of metadata
     2749    const void *val,                    // value of new item
     2750                                        // N.b. a pointer even if the item
     2751                                        // is of type e.g. int
     2752    const char *comment,                // comment associated with item
     2753    const char *name,                   // name of new item of metadata (may be an sprintf format)
     2754    ...);                               // possible arguments for name format
    27412755
    27422756void psMetaDataItemFree(psMetaDataItem *ms); // piece of metadata to destroy
    27432757
    2744 psMetaDataSet *psMetaDataSetAlloc(void);          // make a new set of metadata
     2758psMetaDataSet *psMetaDataSetAlloc(void);          // make a new set of metadata
    27452759void psMetaDataSetDel(psMetaDataSet *ms); // destroy a set of metadata
    27462760
     
    27562770psMetaDataItem *psMetaDataLookup(const psMetaDataSet *ms, const char *key);
    27572771
    2758 void psMetaDataItemPrint(FILE *fd,              // file descriptor to write to
    2759                         const psMetaDataItem *ms); // item of metadata to print
     2772void psMetaDataItemPrint(FILE *fd,              // file descriptor to write to
     2773                        const psMetaDataItem *ms); // item of metadata to print
    27602774\end{verbatim}
    27612775
     
    27722786typedef union {
    27732787    struct {
    2774         double x;                       //!< x position
    2775         double y;                       //!< y position
    2776         double xErr;                    //!< Error in x position
    2777         double yErr;                    //!< Error in y position
     2788        double x;                       //!< x position
     2789        double y;                       //!< y position
     2790        double xErr;                    //!< Error in x position
     2791        double yErr;                    //!< Error in y position
    27782792    } xy;
    27792793    struct {
    2780         double r;                       //!< RA
    2781         double d;                       //!< Dec
    2782         double rErr;                    //!< Error in RA
    2783         double dErr;                    //!< Error in Dec
     2794        double r;                       //!< RA
     2795        double d;                       //!< Dec
     2796        double rErr;                    //!< Error in RA
     2797        double dErr;                    //!< Error in Dec
    27842798    } rd;
    27852799} psCoord;
     
    28212835/** apply the coordinate transformation to the given coordinate */
    28222836psCoord *psCoordXformApply (psCoordXform *frame, ///< coordinate transformation
    2823                             psCoord *coords) ///< input coordiate
     2837                            psCoord *coords) ///< input coordiate
    28242838;
    28252839\end{verbatim}
     
    28282842/** apply the optical distortion to the given coordinate, magnitude, color */
    28292843psCoord *psDistortionApply (psDistortion *pattern, ///< optical distortion pattern
    2830 psCoord *coords,                        ///< input coordinate
    2831 float mag,                              ///< magnitude of object
    2832 float color)                            ///< color of object
     2844psCoord *coords,                        ///< input coordinate
     2845float mag,                              ///< magnitude of object
     2846float color)                            ///< color of object
    28332847;
    28342848\end{verbatim}
     
    28442858psCoord *
    28452859psGetOffset(const psCoord *restrict position1, //!< Position 1
    2846             const psCoord *restrict position2, //!< Position 2
    2847             const char *type            //!< Type of offset: Linear, Spherical/Arcsec, Spherical/Degreees etc
     2860            const psCoord *restrict position2, //!< Position 2
     2861            const char *type            //!< Type of offset: Linear, Spherical/Arcsec, Spherical/Degreees etc
    28482862    );
    28492863\end{verbatim}
     
    28532867psCoord *
    28542868psApplyOffset(const psCoord *restrict position, //!< Position
    2855               const psCoord *restrict offset, //!< Offset
    2856               const char *type          //!< Type of offset: Linear, Spherical/Arcsec, Spherical/Degreees etc
     2869              const psCoord *restrict offset, //!< Offset
     2870              const char *type          //!< Type of offset: Linear, Spherical/Arcsec, Spherical/Degreees etc
    28572871    );
    28582872\end{verbatim}
     
    28672881/** Get Sun Position */
    28682882psCoord *
    2869 psGetSunPos(float mjd)                  //!< MJD to get position for
     2883psGetSunPos(float mjd)                  //!< MJD to get position for
    28702884;
    28712885\end{verbatim}
     
    28742888/** Get Moon position */
    28752889psCoord *
    2876 psGetMoonPos(float mjd,                 //!< MJD to get position for
    2877              double latitude,           //!< Latitude for apparent position
    2878              double longitude)          //!< Longitude for apparent position
     2890psGetMoonPos(float mjd,                 //!< MJD to get position for
     2891             double latitude,           //!< Latitude for apparent position
     2892             double longitude)          //!< Longitude for apparent position
    28792893;
    28802894\end{verbatim}
     
    28832897/** Get Moon phase */
    28842898float
    2885 psGetMoonPhase(float mjd)               //!< MJD to get phase for
     2899psGetMoonPhase(float mjd)               //!< MJD to get phase for
    28862900;
    28872901\end{verbatim}
     
    28912905psCoord *
    28922906psGetSolarSystemPos(char *solarSystemObject, //!< Named S.S. object
    2893                     float mjd)          //!< MJD to get position for
     2907                    float mjd)          //!< MJD to get position for
    28942908;
    28952909\end{verbatim}
     
    29552969\begin{verbatim}
    29562970typedef struct {
    2957     int ID;                             //!< ID number for this photometric system
    2958     char *name;                         //!< Name of photometric system
    2959     char *camera;                       //!< Camera for photometric system
    2960     char *filter;                       //!< Filter used for photometric system
    2961     char *detector;                     //!< Detector used for photometric system
     2971    int ID;                             //!< ID number for this photometric system
     2972    char *name;                         //!< Name of photometric system
     2973    char *camera;                       //!< Camera for photometric system
     2974    char *filter;                       //!< Filter used for photometric system
     2975    char *detector;                     //!< Detector used for photometric system
    29622976} psPhotSystem;
    29632977\end{verbatim}
     
    29672981\begin{verbatim}
    29682982typedef struct {
    2969     psPhotSystem src;                   //!< Source photometric system
    2970     psPhotSystem dst;                   //!< Destination photometric system
    2971     psPhotSystem pP, pM;                ///< Primary colour reference
    2972     psPhotSystem sP, sM;                ///< Secondary colour reference
    2973     float pA, sA;                       ///< Colour offset for primary and secondary references
    2974     psPolynomial3D transform;           //!< Transformation from source to destination
     2983    psPhotSystem src;                   //!< Source photometric system
     2984    psPhotSystem dst;                   //!< Destination photometric system
     2985    psPhotSystem pP, pM;                ///< Primary colour reference
     2986    psPhotSystem sP, sM;                ///< Secondary colour reference
     2987    float pA, sA;                       ///< Colour offset for primary and secondary references
     2988    psPolynomial3D transform;           //!< Transformation from source to destination
    29752989} psPhotTransform;
    29762990\end{verbatim}
Note: See TracChangeset for help on using the changeset viewer.