cif_img.dic v1.1.3

# # #

# # #

# # Extensions Dictionary #

    ##############################################################################
    #                                                                            #
    #                       Image CIF Dictionary (imgCIF)                        #
    #             and Crystallographic Binary File Dictionary (CBF)              #
    #            Extending the Macromolecular CIF Dictionary (mmCIF)             #
    #                                                                            #
    #                              Version 1.1.3                                 #
    #                              of 2001-04-19                                 #
    #                                                                            #
    #                             Adapted from the                               #
    #                       imgCIF Workshop, BNL Oct 1997                        #
    #                                    and                                     #
    #               Crystallographic Binary File Format Draft Proposal           #
    #                            by Andy Hammersley                              #
    #                                                                            #
    ##############################################################################
    #                                                                            #
    #                           First DDL 2.1 Version                            #
    #                                    by                                      #
    #                               John Westbrook                               #
    #                           Nucleic Acid Database                            #
    #                             Rutgers University                             #
    #                                                                            #
    ##############################################################################
    # These revisions by:  Herbert J. Bernstein, yaya@bernstein-plus-sons.com    #
    # Incorporating comments by I. David Brown, John Westbrook, Brian McMahon.   #
    # Bob Sweet, Paul Ellis, Harry Powell, Wilfred Li and others                 #
    ##############################################################################

    data_cif_img.dic

        _dictionary.title           cif_img.dic
        _dictionary.version         1.1.3
        _dictionary.datablock_id    cif_img.dic

    ##############################################################################
    #    CONTENTS
    #
    #        CATEGORY_GROUP_LIST
    #
    #        category  ARRAY_DATA
    #
    #                  _array_data.array_id
    #                  _array_data.binary_id
    #                  _array_data.data
    #
    #        category  ARRAY_ELEMENT_SIZE
    #
    #                  _array_element_size.array_id
    #                  _array_element_size.index
    #                  _array_element_size.size
    #
    #        category  ARRAY_INTENSITIES
    #
    #                  _array_intensities.array_id
    #                  _array_intensities.binary_id
    #                  _array_intensities.gain
    #                  _array_intensities.gain_esd
    #                  _array_intensities.linearity
    #                  _array_intensities.offset
    #                  _array_intensities.scaling
    #                  _array_intensities.overload
    #                  _array_intensities.undefined_value
    #
    #        category  ARRAY_STRUCTURE
    #
    #                  _array_structure.byte_order
    #                  _array_structure.compression_type
    #                  _array_structure.encoding_type
    #                  _array_structure.id
    #
    #        category  ARRAY_STRUCTURE_LIST
    #
    #                  _array_structure_list.axis_set_id
    #                  _array_structure_list.array_id
    #                  _array_structure_list.dimension
    #                  _array_structure_list.direction
    #                  _array_structure_list.index
    #                  _array_structure_list.precedence
    #
    #        category  ARRAY_STRUCTURE_LIST_AXIS
    #
    #                  _array_structure_list_axis.axis_id
    #                  _array_structure_list_axis.axis_set_id
    #                  _array_structure_list_axis.angle
    #                  _array_structure_list_axis.angle_increment
    #                  _array_structure_list_axis.displacement_increment
    #                  _array_structure_list_axis.angular_pitch
    #                  _array_structure_list_axis.radial_pitch
    #
    #        category  AXIS
    #
    #                  _axis.depends_on
    #                  _axis.equipment
    #                  _axis.id
    #                  _axis.offset[1]
    #                  _axis.offset[2]
    #                  _axis.offset[3]
    #                  _axis.type
    #                  _axis.vector[1]
    #                  _axis.vector[2]
    #                  _axis.vector[3]
    #
    #        category  DIFFRN_DATA_FRAME
    #
    #                  _diffrn_data_frame.array_id
    #                  _diffrn_data_frame.binary_id
    #                  _diffrn_data_frame.detector_element_id
    #                  _diffrn_data_frame.id
    #
    #        category  DIFFRN_DETECTOR
    #
    #                  _diffrn_detector.details
    #                  _diffrn_detector.detector
    #                  _diffrn_detector.diffrn_id
    #                  _diffrn_detector.dtime
    #                  _diffrn_detector.id
    #                  _diffrn_detector.number_of_axes
    #                  _diffrn_detector.type
    #
    #        category  DIFFRN_DETECTOR_AXIS
    #
    #                  _diffrn_detector_axis.axis_id
    #                  _diffrn_detector_axis.detector_id
    #
    #        category  DIFFRN_DETECTOR_ELEMENT
    #
    #                  _diffrn_detector_element.center[1]
    #                  _diffrn_detector_element.center[2]
    #                  _diffrn_detector_element.id
    #                  _diffrn_detector_element.detector_id
    #
    #        category  DIFFRN_MEASUREMENT
    #
    #                  _diffrn_measurement.diffrn_id
    #                  _diffrn_measurement.details
    #                  _diffrn_measurement.device
    #                  _diffrn_measurement.device_details
    #                  _diffrn_measurement.device_type
    #                  _diffrn_measurement.id
    #                  _diffrn_measurement.method
    #                  _diffrn_measurement.number_of_axes
    #                  _diffrn_measurement.specimen_support
    #
    #        category  DIFFRN_MEASUREMENT_AXIS
    #
    #                  _diffrn_measurement_axis.axis_id
    #                  _diffrn_measurement_axis.measurement_device
    #                  _diffrn_measurement_axis.measurement_id
    #
    #        category  DIFFRN_RADIATION
    #
    #                  _diffrn_radiation.collimation
    #                  _diffrn_radiation.diffrn_id
    #                  _diffrn_radiation.div_x_source
    #                  _diffrn_radiation.div_y_source
    #                  _diffrn_radiation.div_x_y_source
    #                  _diffrn_radiation.filter_edge'
    #                  _diffrn_radiation.inhomogeneity
    #                  _diffrn_radiation.monochromator
    #                  _diffrn_radiation.polarisn_norm
    #                  _diffrn_radiation.polarisn_ratio
    #                  _diffrn_radiation.polarizn_source_norm
    #                  _diffrn_radiation.polarizn_source_ratio
    #                  _diffrn_radiation.probe
    #                  _diffrn_radiation.type
    #                  _diffrn_radiation.xray_symbol
    #                  _diffrn_radiation.wavelength_id
    #
    #        category  DIFFRN_REFLN
    #
    #                  _diffrn_refln.frame_id
    #
    #        category  DIFFRN_SCAN
    #
    #                  _diffrn_scan.id
    #                  _diffrn_scan.date_end
    #                  _diffrn_scan.date_start
    #                  _diffrn_scan.integration_time
    #                  _diffrn_scan.frame_id_start
    #                  _diffrn_scan.frame_id_end
    #                  _diffrn_scan.frames
    #
    #        category  DIFFRN_SCAN_AXIS
    #
    #                  _diffrn_scan_axis.axis_id
    #                  _diffrn_scan_axis.angle_start
    #                  _diffrn_scan_axis.angle_range
    #                  _diffrn_scan_axis.angle_increment
    #                  _diffrn_scan_axis.angle_rstrt_incr
    #                  _diffrn_scan_axis.displacement_start
    #                  _diffrn_scan_axis.displacement_range
    #                  _diffrn_scan_axis.displacement_increment
    #                  _diffrn_scan_axis.displacement_rstrt_incr
    #                  _diffrn_scan_axis.scan_id
    #
    #        category  DIFFRN_SCAN_FRAME
    #
    #                  _diffrn_scan_frame.date
    #                  _diffrn_scan_frame.frame_id
    #                  _diffrn_scan_frame.frame_number
    #                  _diffrn_scan_frame.integration_time
    #                  _diffrn_scan_frame.scan_id
    #
    #        category  DIFFRN_SCAN_FRAME_AXIS
    #
    #                  _diffrn_scan_frame_axis.axis_id
    #                  _diffrn_scan_frame_axis.angle
    #                  _diffrn_scan_frame_axis.angle_increment
    #                  _diffrn_scan_frame_axis.angle_rstrt_incr
    #                  _diffrn_scan_frame_axis.displacement
    #                  _diffrn_scan_frame_axis.displacement_increment
    #                  _diffrn_scan_frame_axis.displacement_rstrt_incr
    #                  _diffrn_scan_frame_axis.frame_id
    #
    #        ITEM_TYPE_LIST
    #        ITEM_UNITS_LIST
    #        DICTIONARY_HISTORY
    #
    ##############################################################################

    #########################
    ## CATEGORY_GROUP_LIST ##
    #########################

         loop_
        _category_group_list.id
        _category_group_list.parent_id
        _category_group_list.description
                 'inclusive_group'   .
    ;             Categories that belong to the dictionary extension.
    ;
                 'array_data_group'
                 'inclusive_group'
    ;             Categories that describe array data.
    ;
                 'axis_group'
                 'inclusive_group'
    ;             Categories that describe axes.
    ;
                 'diffrn_group'
                 'inclusive_group'
    ;            Categories that describe details of the diffraction experiment.
    ;

    ##############
    # ARRAY_DATA #
    ##############

    save_ARRAY_DATA
        _category.description
    ;
         Data items in the ARRAY_DATA category are the containers for
         the array data items described in category ARRAY_STRUCTURE.
    ;
        _category.id                   array_data
        _category.mandatory_code       no
         loop_
        _category_key.name             '_array_data.array_id'
                                       '_array_data.binary_id'
        loop_
        _category_group.id             'inclusive_group'
                                       'array_data_group'
        loop_
        _category_examples.detail
        _category_examples.case
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;
            Example 1 -

            This example shows two binary data blocks.  The first one
            was compressed by the CBF_CANONICAL compression algorithm and
            presented as hexadecimal data.  The first character "H" on the
            data lines means hexadecimal.  It could have been "O" for octal
            or "D" for decimal.  The second character on the line shows
            the number of bytes in each word (in this case "4"), which then
            requires 8 hexadecimal digits per word.  The third character
            gives the order of octets within a word, in this case "<"
            for the ordering 4321 (i.e. "big-endian").  Alternatively the
            character ">" could have been used for the ordering 1234
            (i.e. "little-endian").  The block has a "message digest"
            to check the integrity of the data.

            The second block is similar, but uses CBF_PACKED compression
            and BASE64 encoding.  Note that the size and the digest are
            different.
    ;
    ;

            loop_
            _array_data.array_id
            _array_data.binary_id
            _array_data.data
            image_1 1
            ;
            --CIF-BINARY-FORMAT-SECTION--
            Content-Type: application/octet-stream;
                 conversions="x-CBF_CANONICAL"
            Content-Transfer-Encoding: X-BASE16
            X-Binary-Size: 3927126
            X-Binary-ID: 1
            Content-MD5: u2sTJEovAHkmkDjPi+gWsg==

            # Hexadecimal encoding, byte 0, byte order ...21
            #
            H4< 0050B810 00000000 00000000 00000000 000F423F 00000000 00000000 ...
            ....
            --CIF-BINARY-FORMAT-SECTION----
            ;
            image_2 2
            ;
            --CIF-BINARY-FORMAT-SECTION--
            Content-Type: application/octet-stream;
                 conversions="x-CBF-PACKED"
            Content-Transfer-Encoding: BASE64
            X-Binary-Size: 3745758
            X-Binary-ID: 1
            Content-MD5: 1zsJjWPfol2GYl2V+QSXrw==

            ELhQAAAAAAAA...
            ...
            --CIF-BINARY-FORMAT-SECTION----
            ;
    ;
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    save_

    save__array_data.array_id
        _item_description.description
    ;             This item is a pointer to _array_structure.id in the
                  ARRAY_STRUCTURE category.
    ;
        _item.name                  '_array_data.array_id'
        _item.category_id             array_data
        _item.mandatory_code          yes
        _item_type.code               code
         save_

    save__array_data.binary_id
        _item_description.description
    ;             This item is an integer identifier which, along with
                  _array_data.array_id should uniquely identify the
                  particular block of array data.

                  If _array_data.binary_id is not explicitly given,
                  it defaults to 1.

                  The value of _array_data.binary_id distinguishes
                  among multiple sets of data with the same array
                  structure.

                  If the MIME header of the data array specifies a
                  value for X-Binary-Id, these values should be equal.
    ;
         loop_
        _item.name
        _item.category_id
        _item.mandatory_code
                 '_array_data.binary_id'            array_data
                                                                    implicit
                 '_diffrn_data_frame.binary_id'     diffrn_data_frame
                                                                    implicit
                 '_array_intensities.binary_id'     array_intensities
                                                                    implicit
         loop_
        _item_linked.child_name
        _item_linked.parent_name
                 '_diffrn_data_frame.binary_id'     '_array_data.binary_id'
                 '_array_intensities.binary_id'     '_array_data.binary_id'

        _item_default.value           1
        _item_type.code               int
         loop_
        _item_range.maximum
        _item_range.minimum
                                1  1
                                .  1
         save_

    save__array_data.data
        _item_description.description
    ;             The value of _array_data.data contains the array data
                  encapsulated in a STAR string.

                  The representation used is a variant on the
                  Multipurpose Internet Mail Extensions (MIME) specified
                  in RFC 2045-2049 by N. Freed et al.  The boundary
                  delimiter used in writing an imgCIF or CBF is
                  "--CIF-BINARY-FORMAT-SECTION--" (including the
                  required initial "--").

                  The Content-Type may be any of the discrete types permitted
                  in RFC 2045; "application/octet-stream" is recommended.
                  If an octet stream was compressed, the compression should
                  be specified by the parameter 'conversions="x-CBF_PACKED"'
                  or the parameter 'conversions="x-CBF_CANONICAL"'.

                  The Content-Transfer-Encoding may be "BASE-64",
                  "Quoted-Printable", "X-BASE-8", "X-BASE-10", or
                  "X-BASE-16" for an imgCIF or "BINARY" for a CBF.  The
                  octal, decimal and hexadecimal transfer encodings are
                  for convenience in debugging, and are not recommended
                  for archiving and data interchange.

                  In an imgCIF file, the encoded binary data begins after
                  the empty line terminating the header.  In a CBF, the
                  raw binary data begins after an empty line terminating
                  the header and after the sequence:

                  Octet   Hex   Decimal  Purpose
                    0     0C       12    (ctrl-L) Page break
                    1     1A       26    (ctrl-Z) Stop listings in MS-DOS
                    2     04       04    (Ctrl-D) Stop listings in UNIX
                    3     D5      213    Binary section begins

                  None of these octets are included in the calculation of
                  the message size, nor in the calculation of the
                  message digest.

                  The X-Binary-Size header specifies the size of the
                  equivalent binary data in octets.  If compression was
                  used, this size is the size after compression, including
                  any book-keeping fields.  And adjustment is made for
                  the deprecated binary formats in which 8 bytes of binary
                  header are used for the compression type.  In that case,
                  the 8 bytes used for the compression type is subtracted
                  from the size, so that the same size will be reported
                  if the compression type is supplied in the MIME header.
                  Use of the MIME header is the recommended way to
                  supply the compression type.  In general, no portion of
                  the  binary header is included in the calculation of the size.

                  The X-Binary-Element-Type header specifies the type of
                  binary data in the octets, using the same descriptive
                  phrases as in _array_structure.encoding_type.  The default
                  value is "unsigned 32-bit integer".

                  An MD5 message digest may, optionally, be used. The "RSA Data
                  Security, Inc. MD5 Message-Digest Algorithm" should be used.
                  No portion of the header is included in the calculation of the
                  message digest.

                  If the Transfer Encoding is "X-BASE-8", "X-BASE-10", or
                  "X-BASE-16", the data is presented as octal, decimal or
                  hexadecimal data organized into lines or words.  Each word
                  is created by composing octets of data in fixed groups of
                  2, 3, 4, 6 or 8 octets, either in the order ...4321 ("big-
                  endian") or 1234... (little-endian).  If there are fewer
                  than the specified number of octets to fill the last word,
                  then the missing octets are presented as "==" for each
                  missing octet.  Exactly two equal signs are used for each
                  missing octet even for octal and decimal encoding.
                  The format of lines is:

                  rnd xxxxxx xxxxxx xxxxxx

                  where r is "H", "O", or "D" for hexadecimal, octal or
                  decimal, n is the number of octets per word. and d is "<"
                  for ">" for the "...4321" and "1234..." octet orderings
                  respectively.  The "==" padding for the last word should
                  be on the appropriate side to correspond to the missing
                  octets, e.g.

                  H4< FFFFFFFF FFFFFFFF 07FFFFFF ====0000

                  or

                  H3> FF0700 00====

                  For these hex, octal and decimal formats, only, comments
                  beginning with "#" are permitted to improve readability.

                  BASE64 encoding follows MIME conventions.  Octets are
                  in groups of three, c1, c2, c3.  The resulting 24 bits
                  are broken into four 6-bit quantities, starting with
                  the high-order six bits (c1 >> 2) of the first octet, then
                  the low-order two bits of the first octet followed by the
                  high-order 4 bits of the second octet ((c1 & 3)<<4 | (c2>>4)),
                  then the bottom 4 bits of the second octet followed by the
                  high order two bits of the last octet ((c2 & 15)<<2 | (c3>>6)),
                  then the bottom six bits of the last octet (c3 & 63).  Each
                  of these four quantities is translated into an ASCII character
                  using the mapping:

                            1         2         3         4         5         6
                  0123456789012345678901234567890123456789012345678901234567890123
                  |         |         |         |         |         |         |
                  ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

                  With short groups of octets padded on the right with one "="
                  if c3 is missing, and with "==" if both c2 and c3 are missing.

                  QUOTED-PRINTABLE encoding also follows MIME conventions, copying
                  octets without translation if their ASCII values are 32..38,
                  42, 48..57, 59..60, 62, 64..126 and the octet is not a ";"
                  in column 1.  All other characters are translated to =nn, where
                  nn is the hexadecimal encoding of the octet.  All lines are
                  "wrapped" with a terminating "=" (i.e. the MIME conventions
                  for an implicit line terminator are never used).
    ;
        _item.name                  '_array_data.data'
        _item.category_id             array_data
        _item.mandatory_code          yes
        _item_type.code               binary
    save_

    ######################
    # ARRAY_ELEMENT_SIZE #
    ######################

    save_ARRAY_ELEMENT_SIZE
        _category.description
    ;
         Data items in the ARRAY_ELEMENT_SIZE category record the physical
         size of array elements along each array dimension.
    ;
        _category.id                   array_element_size
        _category.mandatory_code       no
         loop_
        _category_key.name             '_array_element_size.array_id'
                                       '_array_element_size.index'
        loop_
        _category_group.id             'inclusive_group'
                                       'array_data_group'
        loop_
        _category_examples.detail
        _category_examples.case
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;
            Example 1 - A regular 2D array with a uniform element dimension
                        of 1220 nanometres.
    ;
    ;
            loop_
           _array_element_size.array_id
           _array_element_size.index
           _array_element_size.size
            image_1   1    1.22e-6
            image_1   2    1.22e-6
    ;
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
         save_

    save__array_element_size.array_id
        _item_description.description
    ;
                  This item is a pointer to _array_structure.id in the
                  ATOM_STRUCTURE category.
    ;
        _item.name                  '_array_element_size.array_id'
        _item.category_id             array_element_size
        _item.mandatory_code          yes
        _item_type.code               code
         save_

    save__array_element_size.index
        _item_description.description
    ;
                  This item is a pointer to _array_structure_list.index in the
                  ATOM_STRUCTURE_LIST category.
    ;
        _item.name                  '_array_element_size.index'
        _item.category_id             array_element_size
        _item.mandatory_code          yes
        _item_type.code               code
         save_

    save__array_element_size.size
        _item_description.description
    ;
                   The size in metres of an image element in this
                   dimension. This supposes that the elements are arranged
                   on a regular grid.
    ;
        _item.name               '_array_element_size.size'
        _item.category_id          array_element_size
        _item.mandatory_code       yes
        _item_type.code            float
        _item_units.code           'metres'
         loop_
        _item_range.maximum
        _item_range.minimum
                                .   0.0
         save_

    #####################
    # ARRAY_INTENSITIES #
    #####################

    save_ARRAY_INTENSITIES
        _category.description
    ;
                  Data items in the ARRAY_INTENSITIES category record the
                  information required to recover the intensity data from
                  the set of data values stored in the ARRAY_DATA category.

                  The actual detector may have a complex relationship
                  between the raw intensity values and the number of
                  incident photons.  In most cases, the number stored
                  in the final array will have a simple linear relationship
                  to the actual number of incident photons, given by
                  '_array_intensities.gain'.  If raw, uncorrected values
                  are presented (e.g for calibration experiments), the
                  value of '_array_intensities.linearity' will be 'raw'
                  and '_array_intensities.gain' will not be used.

    ;
        _category.id                   array_intensities
        _category.mandatory_code       no
        loop_
        _category_key.name             '_array_intensities.array_id'
                                       '_array_intensities.binary_id'
        loop_
        _category_group.id             'inclusive_group'
                                       'array_data_group'
        loop_
        _category_examples.detail
        _category_examples.case
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;
            Example 1
    ;
    ;
            loop_
            _array_intensities.array_id
            _array_intensities.linearity
            _array_intensities.gain
            _array_intensities.overload
            _array_intensities.undefined_value
            image_1   linear  1.2    655535   0
    ;
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
         save_

    save__array_intensities.array_id
        _item_description.description
    ;
                  This item is a pointer to _array_structure.id in the
                  ATOM_STRUCTURE category.
    ;
        _item.name                  '_array_intensities.array_id'
        _item.category_id             array_intensities
        _item.mandatory_code          yes
        _item_type.code               code
         save_

    save__array_intensities.binary_id
        _item_description.description
    ;             This item is a pointer to _array_data.binary_id in the
                  ARRAY_STRUCTURE category.
    ;
        _item.name                  '_array_intensities.binary_id'
        _item.category_id             array_intensities
        _item.mandatory_code          implicit
        _item_type.code               int
         save_

    save__array_intensities.gain
        _item_description.description
    ;
                   Detector "gain". The factor by which linearized
                   intensity count values should be divided to produce
                   true photon counts.
    ;
        _item.name              '_array_intensities.gain'
        _item.category_id          array_intensities
        _item.mandatory_code       yes
        _item_type.code            float
         loop_
        _item_range.maximum
        _item_range.minimum
                                .   0.0
        _item_units.code           'counts_per_photon'
         loop_
        _item_related.related_name
        _item_related.function_code  '_array_intensities.gain_esd'
                                     'associated_value'
        save_

    save__array_intensities.gain_esd
        _item_description.description
    ;
                  The estimated standard deviation in detector "gain".
    ;
        _item.name              '_array_intensities.gain_esd'
        _item.category_id          array_intensities
        _item.mandatory_code       yes
        _item_type.code            float

        _item_units.code          'counts_per_photon'
         loop_
        _item_related.related_name
        _item_related.function_code  '_array_intensities.gain'
                                     'associated_esd'
        save_

    save__array_intensities.linearity
        _item_description.description
    ;
                   The intensity linearity scaling used from raw intensity
                   to the stored element value:

                   'linear' is obvious

                   'offset'  means that the value defined by
                   '_array_intensities.offset' should be added to each
                    element value.

                   'scaling' means that the value defined by
                   '_array_intensities.scaling' should be multiplied with each
                   element value.

                   'scaling_offset' is the combination of the two previous cases,
                   with the scale factor applied before the offset value.

                   'sqrt_scaled' means that the square root of raw
                   intensities multiplied by '_array_intensities.scaling' is
                   calculated and stored, perhaps rounded to the nearest
                   integer. Thus, linearization involves dividing the stored
                   values by '_array_intensities.scaling' and squaring the
                   result.

                   'logarithmic_scaled' means that the logarithm based 10 of
                   raw intensities multiplied by '_array_intensities.scaling'
                   is calculated and stored, perhaps rounded to the nearest
                   integer. Thus, linearization involves dividing the stored
                   values by '_array_intensities.scaling' and calculating 10
                   to the power of this number.

                   'raw' means that the data is the raw is a set of raw values
                   straight from the detector.
    ;

        _item.name               '_array_intensities.linearity'
        _item.category_id          array_intensities
        _item.mandatory_code       yes
        _item_type.code            code
         loop_
        _item_enumeration.value
        _item_enumeration.detail
                                  'linear' .
                                  'offset'
    ;
                   The value defined by  '_array_intensities.offset' should
                   be added to each element value.
    ;
                                  'scaling'
    ;
                   The value defined by '_array_intensities.scaling' should be
                   multiplied with each element value.
    ;
                                  'scaling_offset'
    ;
                   The combination of the scaling and offset
                   with the scale factor applied before the offset value.
    ;
                                  'sqrt_scaled'
    ;
                   The square root of raw intensities multiplied by
                   '_array_intensities.scaling' is calculated and stored,
                   perhaps rounded to the nearest integer. Thus,
                   linearization involves dividing the stored
                   values by '_array_intensities.scaling' and squaring the
                   result.
    ;
                                  'logarithmic_scaled'
    ;
                   The logarithm based 10 of raw intensities multiplied by
                   '_array_intensities.scaling'  is calculated and stored,
                   perhaps rounded to the nearest integer. Thus,
                   linearization involves dividing the stored values by
                   '_array_intensities.scaling' and calculating 10 to the
                   power of this number.
    ;
                                  'raw'
    ;
                   The array consists of raw values to which no corrections have
                   been applied.  While the handling of the data is similar to
                   that given for 'linear' data with no offset, the meaning of
                   the data differs in that the number of incident photons is
                   not necessarily linearly related to the number of counts
                   reported.  This value is intended for use either in
                   calibration experiments or to allow for handling more
                   complex data fitting algorithms than are allowed for by
                   this data item.
    ;

        save_

    save__array_intensities.offset
        _item_description.description
    ;
                   Offset value to add to array element values in the manner
                   described by item _array_intensities.linearity.
    ;
        _item.name                 '_array_intensities.offset'
        _item.category_id          array_intensities
        _item.mandatory_code       no
        _item_type.code            float
        save_

    save__array_intensities.scaling
        _item_description.description
    ;
                   Multiplicative scaling value to be applied to array data
                   in the manner described by item _array_intensities.linearity.
    ;
        _item.name                 '_array_intensities.scaling'
        _item.category_id          array_intensities
        _item.mandatory_code       no
        _item_type.code            float
        save_

    save__array_intensities.overload
        _item_description.description
    ;
                   The saturation intensity level for this data array.
    ;
        _item.name                 '_array_intensities.overload'
        _item.category_id          array_intensities
        _item.mandatory_code       no
        _item_type.code            float
        _item_units.code          'counts'
        save_

    save__array_intensities.undefined_value
        _item_description.description
    ;
                   A value to be substituted for undefined values in
                   the data array.
    ;
        _item.name                 '_array_intensities.undefined_value'
        _item.category_id          array_intensities
        _item.mandatory_code       no
        _item_type.code            float
        save_

    ###################
    # ARRAY_STRUCTURE #
    ###################

    save_ARRAY_STRUCTURE
        _category.description
    ;
         Data items in the ARRAY_STRUCTURE category record the organization and
         encoding of array data which may be stored in the ARRAY_DATA category.
    ;
        _category.id                   array_structure
        _category.mandatory_code       no
        _category_key.name             '_array_structure.id'
        loop_
        _category_group.id             'inclusive_group'
                                       'array_data_group'
        loop_
        _category_examples.detail
        _category_examples.case
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;
        Example 1 -
    ;
    ;
         loop_
        _array_structure.id
        _array_structure.encoding_type
        _array_structure.compression_type
        _array_structure.byte_order
         image_1       "unsigned 16-bit integer"  none  little_endian
    ;
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
         save_

    save__array_structure.byte_order
        _item_description.description
    ;
                   The order of bytes for integer values which require more
                   than 1-byte.

                   (IBM-PC's and compatibles, and Dec-Vaxes use low-byte-first
                   ordered integers, whereas Hewlett Packard 700
                   series, Sun-4 and Silicon Graphics use high-byte-first
                   ordered integers.  Dec-Alphas can produce/use either
                   depending on a compiler switch.)
    ;

        _item.name                     '_array_structure.byte_order'
        _item.category_id               array_structure
        _item.mandatory_code            yes
        _item_type.code                 code
         loop_
        _item_enumeration.value
        _item_enumeration.detail
                                       'big_endian'
    ;
            The first byte in the byte stream of the bytes which make up an
            integer value is the most significant byte of an integer.
    ;
                                       'little_endian'
    ;
            The last byte in the byte stream of the bytes which make up an
            integer value is the most significant byte of an integer.
    ;
         save_

    save__array_structure.compression_type
        _item_description.description
    ;
                  Type of data compression method used to compress the array
                  data.
    ;
        _item.name                   '_array_structure.compression_type'
        _item.category_id             array_structure
        _item.mandatory_code          no
        _item_type.code               code
        _item_default.value           'none'
         loop_
        _item_enumeration.value
        _item_enumeration.detail
                                      'none'
    ;
            Data are stored in normal format as defined by
            '_array_structure.encoding_type' and
            '_array_structure.byte_order'.
    ;
                                      'byte_offsets'
    ;
            Using the compression scheme defined in CBF definition
            Section 5.0.
    ;
                                      'packed'
    ;
            Using the 'packed' compression scheme, a CCP4-style packing
            (CBFlib section 3.3.2)
    ;
                                      'canonical'
    ;
            Using the 'canonical' compression scheme (CBFlib section
            3.3.1)
    ;
        save_

    save__array_structure.encoding_type
        _item_description.description
    ;
                   Data encoding of a single element of array data.

                   In several cases, the IEEE format is referenced.
                   See "IEEE Standard for Binary Floating-Point Arithmetic",
                   ANSI/IEEE Std 754-1985, the Institute of Electrical and
                   Electronics Engineers, Inc., NY 1985.
    ;

        _item.name                '_array_structure.encoding_type'
        _item.category_id          array_structure
        _item.mandatory_code       yes
        _item_type.code            uline
         loop_
        _item_enumeration.value
                                  'unsigned 8-bit integer'
                                  'signed 8-bit integer'
                                  'unsigned 16-bit integer'
                                  'signed 16-bit_integer'
                                  'unsigned 32-bit integer'
                                  'signed 32-bit integer'
                                  'signed 32-bit real IEEE'
                                  'signed 64-bit real IEEE'
                                  'signed 32-bit complex IEEE'
         save_

    save__array_structure.id
        _item_description.description
    ;             The value of _array_structure.id must uniquely identify
                  each item of array data.
    ;
        loop_
        _item.name
        _item.category_id
        _item.mandatory_code
                 '_array_structure.id'              array_structure      yes
                 '_array_data.array_id'             array_data           yes
                 '_array_structure_list.array_id'   array_structure_list yes
                 '_array_intensities.array_id'      array_intensities    yes
                 '_diffrn_data_frame.array_id'      diffrn_data_frame    yes

        _item_type.code               code
         loop_
        _item_linked.child_name
        _item_linked.parent_name
                 '_array_data.array_id'             '_array_structure.id'
                 '_array_structure_list.array_id'   '_array_structure.id'
                 '_array_intensities.array_id'      '_array_structure.id'
                 '_diffrn_data_frame.array_id'      '_array_structure.id'

         save_

    ########################
    # ARRAY_STRUCTURE_LIST #
    ########################

    save_ARRAY_STRUCTURE_LIST
        _category.description
    ;
         Data items in the ARRAY_STRUCTURE_LIST category record the size
         and organization of each array dimension.

         The relationship to physical axes may be given.
    ;
        _category.id                   array_structure_list
        _category.mandatory_code       no
         loop_
        _category_key.name             '_array_structure_list.array_id'
                                       '_array_structure_list.index'
        loop_
        _category_group.id             'inclusive_group'
                                       'array_data_group'
        loop_
        _category_examples.detail
        _category_examples.case
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;
            Example 1 - An image array of 1300 x 1200 elements.  The raster
                        order of the image is left-to-right (increasing) in
                        first dimension and bottom-to-top (decreasing) in
                        the second dimension.
    ;
    ;
            loop_
           _array_structure_list.array_id
           _array_structure_list.index
           _array_structure_list.dimension
           _array_structure_list.precedence
           _array_structure_list.direction
           _array_structure_list.axis_set_id
            image_1   1    1300    1     increasing  ELEMENT_X
            image_1   2    1200    2     decreasing  ELEMENY_Y
    ;
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
         save_

    save__array_structure_list.array_id
        _item_description.description
    ;
                  This item is a pointer to _array_structure.id in the
                  ARRAY_STRUCTURE category.
    ;
        _item.name                  '_array_structure_list.array_id'
        _item.category_id             array_structure_list
        _item.mandatory_code          yes
        _item_type.code               code
    save_

    save__array_structure_list.axis_set_id
        _item_description.description
    ;              This is a descriptor for the physical axis or set of axes
                   corresponding to an array index.

                   This data item is related to the axes of the detector
                   itself given in DIFFRN_DETECTOR_AXIS, but usually differ
                   in that the axes in this category are the axes of the
                   coordinate system of reported data points, while the axes in
                   DIFFRN_DETECTOR_AXIS are the physical axes
                   of the detector describing the "poise" of the detector as an
                   overall physical object.

                   If there is only one axis in the set, the identifier of
                   that axis should be used as the identifier of the set.

    ;
         loop_
        _item.name
        _item.category_id
        _item.mandatory_code
               '_array_structure_list.axis_set_id'
                                      array_structure_list            yes
               '_array_structure_list_axis.axis_set_id'
                                      array_structure_list_axis       implicit
        _item_type.code               code
         loop_
        _item_linked.child_name
        _item_linked.parent_name
               '_array_structure_list_axis.axis_set_id'
                                   '_array_structure_list.axis_set_id'

         save_

    save__array_structure_list.dimension
        _item_description.description
    ;
                   The number of elements stored in the array structure in this
                   dimension.
    ;
        _item.name                '_array_structure_list.dimension'
        _item.category_id          array_structure_list
        _item.mandatory_code       yes
        _item_type.code            int
         loop_
        _item_range.maximum
        _item_range.minimum
                                1  1
                                .  1
         save_

    save__array_structure_list.direction
        _item_description.description
    ;
                  Identifies the direction in which this array index changes.
    ;
        _item.name                '_array_structure_list.direction'
        _item.category_id          array_structure_list
        _item.mandatory_code       yes
        _item_type.code            int
         loop_
        _item_enumeration.value
        _item_enumeration.detail

                                  'increasing'
    ;
             Indicates the index changes from 1 to the maximum dimension.
    ;
                                  'decreasing'
    ;
             Indicates the index changes from the maximum dimension to 1.
    ;
         save_

    save__array_structure_list.index
        _item_description.description
    ;
                   Identifies the one-based index of the row or column in the
                   array structure.
    ;
         loop_
        _item.name
        _item.category_id
        _item.mandatory_code
               '_array_structure_list.index'        array_structure_list   yes
               '_array_structure_list.precedence'   array_structure_list   yes
               '_array_element_size.index'          array_element_size     yes

        _item_type.code            int

         loop_
        _item_linked.child_name
        _item_linked.parent_name
              '_array_element_size.index'         '_array_structure_list.index'
         loop_
        _item_range.maximum
        _item_range.minimum
                                1  1
                                .  1
         save_

    save__array_structure_list.precedence
        _item_description.description
    ;
                   Identifies the rank order in which this array index changes
                   with respect to other array indices.  The precedence of 1
                   indicates the index which changes fastest.
    ;
        _item.name                '_array_structure_list.precedence'
        _item.category_id          array_structure_list
        _item.mandatory_code       yes
        _item_type.code            int
         loop_
        _item_range.maximum
        _item_range.minimum
                                1  1
                                .  1
         save_

    #############################
    # ARRAY_STRUCTURE_LIST_AXIS #
    #############################

    save_ARRAY_STRUCTURE_LIST_AXIS
        _category.description
    ;
         Data items in the ARRAY_STRUCTURE_LIST_AXIS category describes
         the physical settings of sets axes for the centres of pixels that
         correspond to data points described in the
         ARRAY_STRUCTURE_LIST category.

         In the simplest cases, the physical increments of a single axis correspond
         to the increments of a single array index.  More complex organizations,
         e.g. spiral scans, may require coupled motions along multiple axes.

         Note that a spiral scan uses two coupled axis, one for the angular
         direction, one for the radial direction.  This differs from a
         cylindrical scan for which the two axes are not coupled into one set.

    ;
        _category.id                   array_structure_list_axis
        _category.mandatory_code       no
         loop_
        _category_key.name
                                      '_array_structure_list_axis.axis_set_id'
                                      '_array_structure_list_axis.axis_id'
         loop_
        _category_group.id           'inclusive_group'
                                     'array_data_group'
         save_

    save__array_structure_list_axis.axis_id
        _item_description.description
    ;
                   The value of this data item is the identifier of one of
                   the axes for the set of axes for which settings are being
                   specified.

                   Multiple axes may be specified for the same value of
                   '_array_structure_list_axis.axis_set_id'

                   This item is a pointer to _axis.id in the
                   AXIS category.
    ;
        _item.name                 '_array_structure_list_axis.axis_id'
        _item.category_id          array_structure_list_axis
        _item.mandatory_code       yes
         save_

    save__array_structure_list_axis.axis_set_id
        _item_description.description
    ;
                   The value of this data item is the identifier of the
                   set of axes for which axis settings are being specified.

                   Multiple axes may be specified for the same value of
                   _array_structure_list_axis.axis_set_id .

                   This item is a pointer to _array_structure_list.axis_set_id
                   in the ARRAY_STRUCTURE_LIST category.

                   If this item is not specified, it defaults to the corresponding
                   axis identifier.
    ;
        _item.name                 '_array_structure_list_axis.axis_set_id'
        _item.category_id          array_structure_list_axis
        _item.mandatory_code       implicit
         save_

    save__array_structure_list_axis.angle
        _item_description.description
    ;
                   The setting of the specified axis in degrees for the first
                   data point of the array index with the corresponding value
                   of '_array_structure_list.axis_set_id'.  If the index is
                   specified as 'increasing' this will be the center of the
                   pixel with index value 1.  If the index is specified as
                   'decreasing' this will be the center of the pixel with
                   maximum index value.
    ;
        _item.name                 '_array_structure_list_axis.angle'
        _item.category_id          array_structure_list_axis
        _item.mandatory_code       no
        _item_default.value        0.0
        _item_type.code            float
        _item_units.code           'degrees'
         save_

    save__array_structure_list_axis.angle_increment
        _item_description.description
    ;
                   The pixel-center-to-pixel-center increment in the angular
                   setting of the specified axis in degrees.  This is not
                   meaningful in the case of 'constant velocity' spiral scans
                   and should not be specified in that case.

                   See '_array_structure_list_axis.angular_pitch'.

    ;
        _item.name                 '_array_structure_list_axis.angle_increment'
        _item.category_id          array_structure_list_axis
        _item.mandatory_code       no
        _item_default.value        0.0
        _item_type.code            float
        _item_units.code           'degrees'
         save_

    save__array_structure_list_axis.displacement
        _item_description.description
    ;
                   The setting of the specified axis in millimetres for the first
                   data point of the array index with the corresponding value
                   of '_array_structure_list.axis_set_id'.  If the index is
                   specified as 'increasing' this will be the center of the
                   pixel with index value 1.  If the index is specified as
                   'decreasing' this will be the center of the pixel with
                   maximum index value.

    ;
        _item.name               '_array_structure_list_axis.displacement'
        _item.category_id          array_structure_list_axis
        _item.mandatory_code       no
        _item_default.value        0.0
        _item_type.code            float
        _item_units.code           'millimetres'
         save_

    save__array_structure_list_axis.displacement_increment
        _item_description.description
    ;
                   The pixel-center-to-pixel-center increment for the displacement
                   setting of the specified axis in millimetres.

    ;
        _item.name
            '_array_structure_list_axis.displacement_increment'
        _item.category_id          array_structure_list_axis
        _item.mandatory_code       no
        _item_default.value        0.0
        _item_type.code            float
        _item_units.code           'millimetres'
         save_

    save__array_structure_list_axis.angular_pitch
        _item_description.description
    ;
                   The pixel-center-to-pixel-center distance for a one step
                   change in the setting of the specified axis in millimetres.

                   This is meaningful only for 'constant velocity' spiral scans,
                   or for uncoupled angular scans at a constant radius
                   (cylindrical scan) and should not be specified for cases
                   in which the angle between pixels, rather than the distance
                   between pixels is uniform.

                   See '_array_structure_list_axis.angle_increment'.

    ;
        _item.name               '_array_structure_list_axis.angular_pitch'
        _item.category_id          array_structure_list_axis
        _item.mandatory_code       no
        _item_default.value        0.0
        _item_type.code            float
        _item_units.code           'millimetres'
         save_

    save__array_structure_list_axis.radial_pitch
        _item_description.description
    ;
                   The radial distance from one "cylinder" of pixels to the
                   next in millimetres.  If the scan is a 'constant velocity'
                   scan with differing angular displacements between pixels,
                   the value of this item may differ significantly from the
                   value of '_array_structure_list_axis.displacement_increment'.

    ;
        _item.name               '_array_structure_list_axis.radial_pitch'
        _item.category_id          array_structure_list_axis
        _item.mandatory_code       no
        _item_default.value        0.0
        _item_type.code            float
        _item_units.code           'millimetres'
         save_

    ########
    # AXIS #
    ########

    save_AXIS
        _category.description
    ;
         Data items in the AXIS category record the information required
         to describe the various goniometer, detector, source and other
         axes needed to specify a data collection.  The location of each
         axis is specified by two vectors: the axis itself, given as a unit
         vector, and an offset to the base of the unit vector.  These vectors
         are referenced to a right-handed laboratory coordinate system with
         its origin in the sample or specimen:

                                 | Y (to complete right-handed system)
                                 |
                                 |
                                 |
                                 |
                                 |
                                 |________________X
                                /       principal goniometer axis
                               /
                              /
                             /
                            /
                           /Z (to source)

         Axis 1 (X): The X-axis is aligned to the mechanical axis pointing from
         the sample or specimen along the  principal axis of the goniometer.

         Axis 2 (Y): The Y-axis completes an orthogonal right-handed system
         defined by the X-axis and the Z-axis (see below).

         Axis 3 (Z): The Z-axis is derived from the source axis which goes from
         the sample to the source.  The Z-axis is the component of the source axis
         in the direction of the source orthogonal to the X-axis in the plane
         defined by the X-axis and the source axis.

         These axes are based on the goniometer, not on the orientation of the
         detector, gravity, etc.  The vectors necessary to specify all other
         axes are given by sets of three components in the order (X, Y, Z).
         If the axis involved is a rotation axis, it is right handed, i.e. as
         one views the object to be rotated from the origin (the tail) of the
         unit vector, the rotation is clockwise.  If a translation axis is
         specified, the direction of the unit vector specifies the sense of
         positive translation.

         Note:  This choice of coordinate system is similar to, but significantly
         different from the choice in MOSFLM (Andrew G.W. Leslie, Harry Powell,
         MRC Laboratory of Molecular Biology, Hills Road, Cambridge CB2 2QH,UK
         http://www.dl.ac.uk/CCP/CCP4/dist/x-windows/Mosflm/).  In MOSFLM,
         X is along the X-ray beam (our Z axis) and Z is along the rotation axis.

         All rotations are given in degrees and all translations are given in mm.

         Axes may be dependent on one another.  The X-axis is the only goniometer
         axis the direction of which is strictly connected to the hardware.  All
         other axes are specified by the positions they would assume when the
         axes upon which they depend are at their zero points.

         When specifying detector axes, the axis is given to the beam center.
         The location of the beam center on the detector should be given in the
         DIFFRN_DETECTOR category in distortion-corrected mm from the (0,0) corner
         of the detector.

         It should be noted that many different origins arise in the definition
         of an experiment.  In particular, as noted above, we need to specify the
         location of the beam center on the detector in terms of the origin of the
         detector, which is, of course, not coincident with the center of the
         sample.
    ;
        _category.id                   axis
        _category.mandatory_code       no
         loop_
        _category_key.name          '_axis.id'
                                    '_axis.equipment'
         loop_
        _category_group.id           'inclusive_group'
                                     'axis_group'
                                     'diffrn_group'
        loop_
        _category_examples.detail
        _category_examples.case
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;
            Example 1 -

            This example shows the axis specification of the axes of a kappa
            geometry goniometer (See "X-Ray Structure Determination, A Practical
            Guide", 2nd ed. by  G. H. Stout, L. H. Jensen, Wiley Interscience,
            1989, 453 pp, p 134.).

            There are three axes specified, and no offsets.  The outermost axis,
            omega, is pointed along the X-axis.  The next innermost axis, kappa,
            is at a 50 degree angle to the X-axis, pointed away from the source.
            The innermost axis, phi, aligns with the X-axis when omega and
            phi are at their zero-points.  If T-omega, T-kappa and T-phi
            are the transformation matrices derived from the axis settings,
            the complete transformation would be:
                x' = (T-omega) (T-kappa) (T-phi) x
    ;
    ;
             loop_
            _axis.id
            _axis.type
            _axis.equipment
            _axis.depends_on
            _axis.vector[1] _axis.vector[2] _axis.vector[3]
            omega rotation goniometer     .    1        0        0
            kappa rotation goniometer omega    -.64279  0       -.76604
            phi   rotation goniometer kappa    1        0        0
    ;
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;
            Example 2 -

            This example show the axis specification of the axes of a
            detector, source and gravity.  We have juggled the order as a
            reminder that the ordering of presentation of tokens is not
            significant.  We have taken the center of rotation of the detector
            to be 68 millimetres in the direction away from the source.
    ;
    ;
            loop_
            _axis.id
            _axis.type
            _axis.equipment
            _axis.depends_on
            _axis.vector[1] _axis.vector[2] _axis.vector[3]
            _axis.offset[1] _axis.offset[2] _axis.offset[3]
            source       .        source     .       0     0     1   . . .
            gravity      .        gravity    .       0    -1     0   . . .
            tranz     translation detector rotz      0     0     1   0 0 -68
            twotheta  rotation    detector   .       1     0     0   . . .
            roty      rotation    detector twotheta  0     1     0   0 0 -68
            rotz      rotation    detector roty      0     0     1   0 0 -68
    ;
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
         save_

    save__axis.depends_on
        _item_description.description
    ;             The value of  _axis.type specifies the next outermost
                  axis upon which this axis depends.

                  This item is a pointer to axis.id in the same category.
    ;
        _item.name                      '_axis.depends_on'
        _item.category_id                 axis
        _item.mandatory_code              no

         save_

    save__axis.equipment
        _item_description.description
    ;             The value of  _axis.type specifies the type of equipment
                  using the axis:  goniometer, detector, gravity, source
                  or general
    ;
        _item.name                      '_axis.equipment'
        _item.category_id                 axis
        _item.mandatory_code              no
        _item_type.code                   ucode
        _item_default.value               general
         loop_
        _item_enumeration.value
        _item_enumeration.detail   goniometer
                                  'equipment used to orient or position samples'
                                   detector
                                  'equipment used to detect reflections'
                                   general
                                  'equipment used for general purposes'
                                   gravity
                                  'axis specifying the downward direction'
                                   source
                                  'axis specifying the direction sample to source'

         save_

    save__axis.offset[1]
        _item_description.description
    ;              The [1] element of the 3-element vector used to specify
                   the offset to the base of a rotation or translation axis.

                   The vector is specified in millimetres
    ;
        _item.name                  '_axis.offset[1]'
        _item.category_id             axis
        _item.mandatory_code          no
        _item_default.value           0.0
        _item_sub_category.id         vector
        _item_type.code               float
        _item_units.code              millimetres
         save_

    save__axis.offset[2]
        _item_description.description
    ;              The [2] element of the 3-element vector used to specify
                   the offset to the base of a rotation or translation axis.

                   The vector is specified in millimetres
    ;
        _item.name                  '_axis.offset[2]'
        _item.category_id             axis
        _item.mandatory_code          no
        _item_default.value           0.0
        _item_sub_category.id         vector
        _item_type.code               float
        _item_units.code              millimetres
         save_

    save__axis.offset[3]
        _item_description.description
    ;              The [3] element of the 3-element vector used to specify
                   the offset to the base of a rotation or translation axis.

                   The vector is specified in millimetres
    ;
        _item.name                  '_axis.offset[3]'
        _item.category_id             axis
        _item.mandatory_code          no
        _item_default.value           0.0
        _item_sub_category.id         vector
        _item_type.code               float
        _item_units.code              millimetres
         save_

    save__axis.id
        _item_description.description
    ;             The value of _axis.id must uniquely identify
                  each axis relevant to the experiment.  Note that multiple
                  pieces of equipment may share the same axis (e.g. a twotheta
                  arm), so that the category key for AXIS also includes the
                  equipment.
    ;
        loop_
        _item.name
        _item.category_id
        _item.mandatory_code
             '_axis.id'                         axis                    yes
             '_array_structure_list_axis.axis_id'
                                                array_structure_list_axis
                                                                        yes
             '_diffrn_detector_axis.axis_id'    diffrn_detector_axis    yes
             '_diffrn_measurement_axis.axis_id' diffrn_measurement_axis yes
             '_diffrn_scan_axis.axis_id'        diffrn_scan_axis        yes
             '_diffrn_scan_frame_axis.axis_id'  diffrn_scan_frame_axis  yes

        _item_type.code               code
         loop_
        _item_linked.child_name
        _item_linked.parent_name
             '_axis.depends_on'                   '_axis.id'
             '_array_structure_list_axis.axis_id' '_axis.id'
             '_diffrn_detector_axis.axis_id'      '_axis.id'
             '_diffrn_measurement_axis.axis_id'   '_axis.id'
             '_diffrn_scan_axis.axis_id'          '_axis.id'
             '_diffrn_scan_frame_axis.axis_id'    '_axis.id'

         save_

    save__axis.type
        _item_description.description
    ;             The value of _axis.type specifies the type of
                  axis:  rotation, translation (or general when the type is
                  not relevant, as for gravity)
    ;
        _item.name                      '_axis.type'
        _item.category_id                 axis
        _item.mandatory_code              no
        _item_type.code                   ucode
        _item_default.value               general
         loop_
        _item_enumeration.value
        _item_enumeration.detail      rotation
                                     'right-handed axis of rotation'
                                      translation
                                     'translation in the direction of the axis'
                                      general
                                     'axis for which the type is not relevant'

         save_

    save__axis.vector[1]
        _item_description.description
    ;              The [1] element of the 3-element vector used to specify
                   the direction of a rotation or translation axis.
                   The vector should be normalized to be a unit vector, and
                   is dimensionless.
    ;
        _item.name                  '_axis.vector[1]'
        _item.category_id             axis
        _item.mandatory_code          no
        _item_default.value           0.0
        _item_sub_category.id         vector
        _item_type.code               float
         save_

    save__axis.vector[2]
        _item_description.description
    ;              The [2] element of the 3-element vector used to specify
                   the direction of a rotation or translation axis.
                   The vector should be normalized to be a unit vector, and
                   is dimensionless.
    ;
        _item.name                  '_axis.vector[2]'
        _item.category_id             axis
        _item.mandatory_code          no
        _item_default.value           0.0
        _item_sub_category.id         vector
        _item_type.code               float
         save_

    save__axis.vector[3]
        _item_description.description
    ;              The [3] element of the 3-element vector used to specify
                   the direction of a rotation or translation axis.
                   The vector should be normalized to be a unit vector, and
                   is dimensionless.
    ;
        _item.name                  '_axis.vector[3]'
        _item.category_id             axis
        _item.mandatory_code          no
        _item_default.value           0.0
        _item_sub_category.id         vector
        _item_type.code               float
         save_

    #####################
    # DIFFRN_DATA_FRAME #
    #####################

    save_DIFFRN_DATA_FRAME
        _category.description
    ;
                  Data items in the DIFFRN_DATA_FRAME category record
                  the details about each frame of data.

                  The items in this category were previously in a
                  DIFFRN_FRAME_DATA category, which is now deprecated.
                  The items from the old category are provided
                  as aliases, but should not be used for new work.
    ;
        _category.id                   diffrn_data_frame
        _category.mandatory_code       no
         loop_
        _category_key.name             '_diffrn_data_frame.id'
                                       '_diffrn_data_frame.detector_element_id'
        loop_
        _category_group.id             'inclusive_group'
                                       'array_data_group'
        loop_
        _category_examples.detail
        _category_examples.case
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;
        Example 1 - A frame containing data from 4 frame elements.
                    Each frame element has a common array configuration
                    'array_1' described in ARRAY_STRUCTURE and related
                    categories.  The data for each detector element is
                    stored in four groups of binary data in the
                    ARRAY_DATA category, linked by the array_id and
                    binary_id
    ;
    ;
            loop_
            _diffrn_data_frame.id
            _diffrn_data_frame.detector_element_id
            _diffrn_data_frame.array_id
            _diffrn_data_frame.binary_id
            frame_1   d1_ccd_1  array_1  1
            frame_1   d1_ccd_2  array_1  2
            frame_1   d1_ccd_3  array_1  3
            frame_1   d1_ccd_4  array_1  4
    ;
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        save_

    save__diffrn_data_frame.array_id
        _item_description.description
    ;
                  This item is a pointer to _array_structure.id in the
                  ARRAY_STRUCTURE category.
    ;
        _item.name                  '_diffrn_data_frame.array_id'
        _item.category_id             diffrn_data_frame
        _item.mandatory_code          yes
        _item_aliases.alias_name    '_diffrn_frame_data.array_id'
        _item_aliases.dictionary      cif_img.dic
        _item_aliases.version         1.0.00
        _item_type.code               code
         save_

    save__diffrn_data_frame.binary_id
        _item_description.description
    ;             This item is a pointer to _array_data.binary_id in the
                  ARRAY_DATA category.
    ;
        _item.name                  '_diffrn_data_frame.binary_id'
        _item.category_id             diffrn_data_frame
        _item.mandatory_code          implicit
        _item_aliases.alias_name    '_diffrn_frame_data.binary_id'
        _item_aliases.dictionary      cif_img.dic
        _item_aliases.version         1.0
        _item_type.code               int
         save_

    save__diffrn_data_frame.detector_element_id
        _item_description.description
    ;
                   This item is a pointer to _diffrn_detector_element.id
                   in the DIFFRN_DETECTOR_ELEMENT category.
    ;
        _item.name                  '_diffrn_data_frame.detector_element_id'
        _item.category_id             diffrn_data_frame
        _item.mandatory_code          yes
        _item_aliases.alias_name    '_diffrn_frame_data.detector_element_id'
        _item_aliases.dictionary      cif_img.dic
        _item_aliases.version         1.0
        _item_type.code               code
         save_

    save__diffrn_data_frame.id
        _item_description.description
    ;
                  The value of _diffrn_data_frame.id must uniquely identify
                  each complete frame of data.
    ;
         loop_
        _item.name
        _item.category_id
        _item.mandatory_code
               '_diffrn_data_frame.id'        diffrn_data_frame  yes
               '_diffrn_refln.frame_id'       diffrn_refln       yes
               '_diffrn_scan.frame_id_start'  diffrn_scan        yes
               '_diffrn_scan.frame_id_end'    diffrn_scan        yes
               '_diffrn_scan_frame.frame_id'  diffrn_scan_frame  yes
               '_diffrn_scan_frame_axis.frame_id'
                                              diffrn_scan_frame_axis
                                                                 yes
        _item_aliases.alias_name    '_diffrn_frame_data.id'
        _item_aliases.dictionary      cif_img.dic
        _item_aliases.version         1.0
        _item_type.code               code
         loop_
        _item_linked.child_name
        _item_linked.parent_name
               '_diffrn_refln.frame_id'        '_diffrn_data_frame.id'
               '_diffrn_scan.frame_id_start'   '_diffrn_data_frame.id'
               '_diffrn_scan.frame_id_end'     '_diffrn_data_frame.id'
               '_diffrn_scan_frame.frame_id'   '_diffrn_data_frame.id'
               '_diffrn_scan_frame_axis.frame_id'
                                               '_diffrn_data_frame.id'
         save_

    ##########################################################################
    #  The following is a restatement of the mmCIF DIFFRN_DETECTOR,          #
    #  DIFFRN_MEASUREMENT and DIFFRN_RADIATION categories, modified for      #
    #  the CBF/imgCIF extensions                                             #
    ##########################################################################

    ###################
    # DIFFRN_DETECTOR #
    ###################

    save_DIFFRN_DETECTOR
        _category.description
    ;              Data items in the DIFFRN_DETECTOR category describe the
                   detector used to measure the scattered radiation, including
                   any analyser and post-sample collimation.
    ;
        _category.id                  diffrn_detector
        _category.mandatory_code      no
         loop_
        _category_key.name          '_diffrn_detector.diffrn_id'
                                    '_diffrn_detector.id'
         loop_
        _category_group.id           'inclusive_group'
                                     'diffrn_group'
         loop_
        _category_examples.detail
        _category_examples.case
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;
        Example 1 - based on PDB entry 5HVP and laboratory records for the
                    structure corresponding to PDB entry 5HVP
    ;
    ;
        _diffrn_detector.diffrn_id             'd1'
        _diffrn_detector.detector              'multiwire'
        _diffrn_detector.type                  'Siemens'
    ;
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
         save_

    save__diffrn_detector.details
        _item_description.description
    ;              A description of special aspects of the radiation detector.
    ;
        _item.name                  '_diffrn_detector.details'
        _item.category_id             diffrn_detector
        _item.mandatory_code          no
        _item_aliases.alias_name    '_diffrn_detector_details'
        _item_aliases.dictionary      cif_core.dic
        _item_aliases.version         2.0.1
        _item_type.code               text
        _item_examples.case
    ;                                 Need new example here.
    ;
         save_

    save__diffrn_detector.detector
        _item_description.description
    ;              The general class of the radiation detector.
    ;
        _item.name                  '_diffrn_detector.detector'
        _item.category_id             diffrn_detector
        _item.mandatory_code          no
         loop_
        _item_aliases.alias_name
        _item_aliases.dictionary
        _item_aliases.version       '_diffrn_radiation_detector'
                                      cifdic.c91
                                      1.0
                                    '_diffrn_detector'
                                      cif_core.dic
                                      2.0
        _item_type.code               text
         loop_
        _item_examples.case          'photographic film'
                                     'scintillation counter'
                                     'CCD plate'
                                     'BF~3~ counter'
         save_

    save__diffrn_detector.diffrn_id
        _item_description.description
    ;              This data item is a pointer to _diffrn.id in the DIFFRN
                   category.

                   The value of _diffrn.id uniquely defines a set of
                   diffraction data.
    ;
        _item.name                  '_diffrn_detector.diffrn_id'
        _item.mandatory_code          yes
         save_

    save__diffrn_detector.dtime
        _item_description.description
    ;              The deadtime in microseconds of the detectors used to measure
                   the diffraction intensities.
    ;
        _item.name                  '_diffrn_detector.dtime'
        _item.category_id             diffrn_detector
        _item.mandatory_code          no
         loop_
        _item_aliases.alias_name
        _item_aliases.dictionary
        _item_aliases.version       '_diffrn_radiation_detector_dtime'
                                      cifdic.c91
                                      1.0
                                    '_diffrn_detector_dtime'
                                      cif_core.dic
                                      2.0
         loop_
        _item_range.maximum
        _item_range.minimum            .    0.0
                                      0.0   0.0
        _item_type.code               float
        _item_units.code              microseconds
         save_

    save__diffrn_detector.id
        _item_description.description
    ;
                   The value of _diffrn_detector.id must uniquely identify
                   each detector used to collect each diffraction data set.

                   If the value of _diffrn_detector.id is not given, it is
                   implicitly equal to the value of _diffrn_detector.diffrn_id
    ;
         loop_
        _item.name
        _item.category_id
        _item.mandatory_code
                 '_diffrn_detector.id'         diffrn_detector       implicit
                 '_diffrn_detector_axis.detector_id'
                                               diffrn_detector_axis       yes
         loop_
        _item_linked.child_name
        _item_linked.parent_name
                 '_diffrn_detector_axis.detector_id'
                                             '_diffrn_detector.id'

        _item_type.code               code
         save_

    save__diffrn_detector.number_of_axes
        _item_description.description
    ;
                   The value of _diffrn_detector.number_of_axes gives the
                   number of axes of the positioner for the detector identified
                   by _diffrn_detector.id

                   The word "positioner" is a general term used in instrumentation
                   design for devices that are used to change the positions of
                   portions of apparatus by linear translation, rotation, or
                   combinations of such motions.

                   Axes which are used to provide a coordinate system for the
                   face of an area detetctor should not be counted for this
                   data item.

                   The description of each axis should be provided by entries
                   in DIFFRN_DETECTOR_AXIS.
    ;
        _item.name                  '_diffrn_detector.number_of_axes'
        _item.category_id             diffrn_detector
        _item.mandatory_code          no
         loop_
        _item_range.maximum
        _item_range.minimum           .   1
                                      1   1
        _item_type.code               int
         save_

    save__diffrn_detector.type
        _item_description.description
    ;              The make, model or name of the detector device used.
    ;
        _item.name                  '_diffrn_detector.type'
        _item.category_id             diffrn_detector
        _item.mandatory_code          no
        _item_aliases.alias_name    '_diffrn_detector_type'
        _item_aliases.dictionary      cif_core.dic
        _item_aliases.version         2.0.1
        _item_type.code               text
         save_

    ########################
    # DIFFRN_DETECTOR_AXIS #
    ########################

    save_DIFFRN_DETECTOR_AXIS
        _category.description
    ;
         Data items in the DIFFRN_DETECTOR_AXIS category associate
         axes with detectors.
    ;
        _category.id                   diffrn_detector_axis
        _category.mandatory_code       no
         loop_
        _category_key.name          '_diffrn_detector_axis.detector_id'
                                    '_diffrn_detector_axis.axis_id'
         loop_
        _category_group.id           'inclusive_group'
                                     'diffrn_group'
         save_

    save__diffrn_detector_axis.axis_id
        _item_description.description
    ;
                   This data item is a pointer to _axis.id in
                   the AXIS category.
    ;
        _item.name                  '_diffrn_detector_axis.axis_id'
        _item.category_id             diffrn_detector_axis
        _item.mandatory_code          yes
        _item_type.code               code
         save_

    save__diffrn_detector_axis.detector_id
        _item_description.description
    ;
                   This data item is a pointer to _diffrn_detector.id in
                   the DIFFRN_DETECTOR category.

                   This item was previously named '_diffrn_detector_axis.id'
                   which is now a deprecated name.  The old name is
                   provided as an alias, but should not be used for new work.

    ;
        _item.name                  '_diffrn_detector_axis.detector_id'
        _item.category_id             diffrn_detector_axis
        _item.mandatory_code          yes
        _item_aliases.alias_name    '_diffrn_detector_axis.id'
        _item_aliases.dictionary      cif_img.dic
        _item_aliases.version         1.0
         save_

    ###########################
    # DIFFRN_DETECTOR_ELEMENT #
    ###########################

    save_DIFFRN_DETECTOR_ELEMENT
        _category.description
    ;
                  Data items in the DIFFRN_DETECTOR_ELEMENT category record
                  the details about spatial layout and other characteristics
                  of each element of a detector which may have multiple elements.

                  In most cases, the more detailed information provided
                  in ARRAY_STRUCTURE_LIST and ARRAY_STRUCTURE_LIST_AXIS
                  are preferable to simply providing the centre.

    ;
        _category.id                   diffrn_detector_element
        _category.mandatory_code       no
         loop_
        _category_key.name             '_diffrn_detector_element.id'
                                       '_diffrn_detector_element.detector_id'
        loop_
        _category_group.id             'inclusive_group'
                                       'array_data_group'
        loop_
        _category_examples.detail
        _category_examples.case
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;
            Example 1 - Detector d1 is composed of four CCD detector elements,
            each 200 mm by 200 mm, arranged in a square. in the pattern

                       1     2
                          *
                       3     4

            Note that the beam center is slightly off of each of the
            detector elements, just beyond the lower right corner of 1,
            the lower left corner of 2, the upper right corner of 3 and
            the upper left corner of 4.
    ;
    ;
            loop_
            _diffrn_detector_element.id
            _diffrn_detector_element.detector_id
            _diffrn_detector_element.center[1]
            _diffrn_detector_element.center[2]
            d1     d1_ccd_1  201.5 -1.5
            d1     d1_ccd_2  -1.8  -1.5
            d1     d1_ccd_3  201.6 201.4
            d1     d1_ccd_4  -1.7  201.5
    ;
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        save_

    save__diffrn_detector_element.center[1]
        _item_description.description
    ;
                  The value of _diffrn_detector_element.center[1] is the X
                  component of the distortion-corrected beam-center in mm from the
                  (0, 0) (lower left) corner of the detector element viewed from
                  the sample side.
    ;
        _item.name                  '_diffrn_detector_element.center[1]'
        _item.category_id             diffrn_detector_element
        _item.mandatory_code          no
        _item_default.value           0.0
        _item_sub_category.id         vector
        _item_type.code               float
        _item_units.code              millimetres

        save_

    save__diffrn_detector_element.center[2]
        _item_description.description
    ;
                  The value of _diffrn_detector_element.center[2] is the Y
                  component of the distortion-corrected beam-center in mm from the
                  (0, 0) (lower left) corner of the detector element viewed from
                  the sample side.
    ;
        _item.name                  '_diffrn_detector_element.center[2]'
        _item.category_id             diffrn_detector_element
        _item.mandatory_code          no
        _item_default.value           0.0
        _item_sub_category.id         vector
        _item_type.code               float
        _item_units.code              millimetres

        save_

    save__diffrn_detector_element.id
        _item_description.description
    ;
                  The value of _diffrn_detector_element.id must uniquely identify
                  each element of a detector.
    ;
         loop_
        _item.name
        _item.category_id
        _item.mandatory_code
               '_diffrn_detector_element.id'
               diffrn_detector_element
               yes
        _item_type.code               code
         loop_
        _item_linked.child_name
        _item_linked.parent_name
               '_diffrn_data_frame.detector_element_id'
               '_diffrn_detector_element.id'

         save_

    save__diffrn_detector_element.detector_id
        _item_description.description
    ;
                   This item is a pointer to _diffrn_detector.id
                   in the DIFFRN_DETECTOR category.
    ;
        _item.name                  '_diffrn_detector_element.detector_id'
        _item.category_id             diffrn_detector_element
        _item.mandatory_code          yes
        _item_type.code               code
         save_

    ########################
    ## DIFFRN_MEASUREMENT ##
    ########################

    save_DIFFRN_MEASUREMENT
        _category.description
    ;              Data items in the DIFFRN_MEASUREMENT category record details
                   about the device used to orient and/or position the crystal
                   during data measurement and the manner in which the diffraction
                   data were measured.
    ;
        _category.id                  diffrn_measurement
        _category.mandatory_code      no
         loop_
        _category_key.name          '_diffrn_measurement.device'
                                    '_diffrn_measurement.diffrn_id'
                                    '_diffrn_measurement.id'
         loop_
        _category_group.id           'inclusive_group'
                                     'diffrn_group'
         loop_
        _category_examples.detail
        _category_examples.case
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;
        Example 1 - based on PDB entry 5HVP and laboratory records for the
                    structure corresponding to PDB entry 5HVP
    ;
    ;
        _diffrn_measurement.diffrn_id          'd1'
        _diffrn_measurement.device             '3-circle camera'
        _diffrn_measurement.device_type        'Supper model x'
        _diffrn_measurement.device_details     'none'
        _diffrn_measurement.method             'omega scan'
        _diffrn_measurement.details
        ; Need new example here
        ;
    ;
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;
        Example 2 - based on data set TOZ of Willis, Beckwith & Tozer [(1991).
                    Acta Cryst. C47, 2276-2277].
    ;
    ;
        _diffrn_measurement.diffrn_id       's1'
        _diffrn_measurement.device_type     'Philips PW1100/20 diffractometer'
        _diffrn_measurement.method          'theta/2theta (\q/2\q)'
    ;
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
         save_

    save__diffrn_measurement.device
        _item_description.description
    ;              The general class of goniometer or device used to support and
                   orient the specimen.

                   If the value of _diffrn_measurement.device is not given, it is
                   implicitly equal to the value of _diffrn_measurement.diffrn_id

                   Either '_diffrn_measurement.device' or '_diffrn_measurement.id'
                   may be used to link to other categories.  If the experimental
                   setup admits multiple devices, then '_diffrn_measurement.id'
                   is used to provide a unique link.

    ;
         loop_
        _item.name
        _item.category_id
        _item.mandatory_code
                 '_diffrn_measurement.device'  diffrn_measurement      implicit
                 '_diffrn_measurement_axis.measurement_device'
                                               diffrn_measurement_axis implicit
         loop_
        _item_linked.child_name
        _item_linked.parent_name
                 '_diffrn_measurement_axis.measurement_device'
                                             '_diffrn_measurement.device'
        _item_aliases.alias_name    '_diffrn_measurement_device'
        _item_aliases.dictionary      cif_core.dic
        _item_aliases.version         2.0.1
        _item_type.code               text
         loop_
        _item_examples.case          '3-circle camera'
                                     '4-circle camera'
                                     'kappa-geometry camera'
                                     'oscillation camera'
                                     'precession camera'
         save_

    save__diffrn_measurement.device_details
        _item_description.description
    ;              A description of special aspects of the device used to measure
                   the diffraction intensities.
    ;
        _item.name                  '_diffrn_measurement.device_details'
        _item.category_id             diffrn_measurement
        _item.mandatory_code          no
        _item_aliases.alias_name    '_diffrn_measurement_device_details'
        _item_aliases.dictionary      cif_core.dic
        _item_aliases.version         2.0.1
        _item_type.code               text
        _item_examples.case
    ;                                 commercial goniometer modified locally to
                                      allow for 90\% \t arc
    ;
         save_

    save__diffrn_measurement.device_type
        _item_description.description
    ;              The make, model or name of the measurement device
                   (goniometer) used.
    ;
        _item.name                  '_diffrn_measurement.device_type'
        _item.category_id             diffrn_measurement
        _item.mandatory_code          no
        _item_aliases.alias_name    '_diffrn_measurement_device_type'
        _item_aliases.dictionary      cif_core.dic
        _item_aliases.version         2.0.1
        _item_type.code               text
         loop_
        _item_examples.case          'Supper model q'
                                     'Huber model r'
                                     'Enraf-Nonius model s'
                                     'homemade'
         save_

    save__diffrn_measurement.diffrn_id
        _item_description.description
    ;              This data item is a pointer to _diffrn.id in the DIFFRN
                   category.
    ;
        _item.name                  '_diffrn_measurement.diffrn_id'
        _item.mandatory_code          yes
         save_

    save__diffrn_measurement.details
        _item_description.description
    ;              A description of special aspects of the intensity measurement.
    ;
        _item.name                  '_diffrn_measurement.details'
        _item.category_id             diffrn_measurement
        _item.mandatory_code          no
        _item_aliases.alias_name    '_diffrn_measurement_details'
        _item_aliases.dictionary      cif_core.dic
        _item_aliases.version         2.0.1
        _item_type.code               text
        _item_examples.case
    ;                                 440 frames, 0.20 degrees, 150 sec, detector
                                      distance 12 cm, detector angle 22.5 degrees
    ;
         save_

    save__diffrn_measurement.id
        _item_description.description
    ;
                   The value of _diffrn_measurement.id must uniquely identify
                   the set of mechanical characteristics of the device used to
                   orient and/or position the sample used during collection
                   of each diffraction data set.

                   If the value of _diffrn_measurement.id is not given, it is
                   implicitly equal to the value of _diffrn_measurement.diffrn_id

                   Either '_diffrn_measurement.device' or '_diffrn_measurement.id'
                   may be used to link to other categories.  If the experimental
                   setup admits multiple devices, then '_diffrn_measurement.id'
                   is used to provide a unique link.
    ;
         loop_
        _item.name
        _item.category_id
        _item.mandatory_code
                 '_diffrn_measurement.id'      diffrn_measurement      implicit
                 '_diffrn_measurement_axis.measurement_id'
                                               diffrn_measurement_axis implicit
         loop_
        _item_linked.child_name
        _item_linked.parent_name
                 '_diffrn_measurement_axis.measurement_id'
                                             '_diffrn_measurement.id'

        _item_type.code               code
         save_

    save__diffrn_measurement.method
        _item_description.description
    ;              Method used to measure intensities.
    ;
        _item.name                  '_diffrn_measurement.method'
        _item.category_id             diffrn_measurement
        _item.mandatory_code          no
        _item_aliases.alias_name    '_diffrn_measurement_method'
        _item_aliases.dictionary      cif_core.dic
        _item_aliases.version         2.0.1
        _item_type.code               text
        _item_examples.case         'profile data from theta/2theta (\q/2\q) scans'
         save_

    save__diffrn_measurement.number_of_axes
        _item_description.description
    ;
                   The value of _diffrn_measurement.number_of_axes gives the
                   number of axes of the positioner for the goniometer or
                   other sample orientation or positioning device identified
                   by _diffrn_measurement.id

                   The description of the axes should be provided by entries in
                   DIFFRN_MEASUREMENT_AXIS.
    ;
        _item.name                  '_diffrn_measurement.number_of_axes'
        _item.category_id             diffrn_measurement
        _item.mandatory_code          no
         loop_
        _item_range.maximum
        _item_range.minimum           .   1
                                      1   1
        _item_type.code               int
         save_

    save__diffrn_measurement.specimen_support
        _item_description.description
    ;              The physical device used to support the crystal during data
                   collection.
    ;
        _item.name                  '_diffrn_measurement.specimen_support'
        _item.category_id             diffrn_measurement
        _item.mandatory_code          no
        _item_aliases.alias_name    '_diffrn_measurement_specimen_support'
        _item_aliases.dictionary      cif_core.dic
        _item_aliases.version         2.0.1
        _item_type.code               text
         loop_
        _item_examples.case          'glass capillary'
                                     'quartz capillary'
                                     'fiber'
                                     'metal loop'
         save_

    ###########################
    # DIFFRN_MEASUREMENT_AXIS #
    ###########################

    save_DIFFRN_MEASUREMENT_AXIS
        _category.description
    ;
         Data items in the DIFFRN_MEASUREMENT_AXIS category associate
         axes with goniometers.
    ;
        _category.id                   diffrn_measurement_axis
        _category.mandatory_code       no
         loop_
        _category_key.name          '_diffrn_measurement_axis.measurement_device'
                                    '_diffrn_measurement_axis.measurement_id'
                                    '_diffrn_measurement_axis.axis_id'
         loop_
        _category_group.id           'inclusive_group'
                                     'diffrn_group'
         save_

    save__diffrn_measurement_axis.axis_id
        _item_description.description
    ;
                   This data item is a pointer to _axis.id in
                   the AXIS category.
    ;
        _item.name                  '_diffrn_measurement_axis.axis_id'
        _item.category_id             diffrn_measurement_axis
        _item.mandatory_code          yes
        _item_type.code               code
         save_

    save__diffrn_measurement_axis.measurement_device
        _item_description.description
    ;
                   This data item is a pointer to _diffrn_measurement.device in
                   the DIFFRN_MEASUREMENT category.

    ;
        _item.name                  '_diffrn_measurement_axis.measurement_device'
        _item.category_id             diffrn_measurement_axis
        _item.mandatory_code          implicit
         save_

    save__diffrn_measurement_axis.measurement_id
        _item_description.description
    ;
                   This data item is a pointer to _diffrn_measurement.id in
                   the DIFFRN_MEASUREMENT category.

                   This item was previously named '_diffrn_measurement_axis.id'
                   which is now a deprecated name.  The old name is
                   provided as an alias, but should not be used for new work.

    ;
        _item.name                  '_diffrn_measurement_axis.measurement_id'
        _item.category_id             diffrn_measurement_axis
        _item_aliases.alias_name    '_diffrn_measurement_axis.id'
        _item_aliases.dictionary      cif_img.dic
        _item_aliases.version         1.0.00
        _item.mandatory_code          implicit
         save_

    ####################
    # DIFFRN_RADIATION #
    ####################

    save_DIFFRN_RADIATION
        _category.description
    ;              Data items in the DIFFRN_RADIATION category describe
                   the radiation used in measuring diffraction intensities,
                   its collimation and monochromatisation before the sample.

                   Post-sample treatment of the beam is described by data
                   items in the DIFFRN_DETECTOR category.

    ;
        _category.id                  diffrn_radiation
        _category.mandatory_code      no
        _category_key.name          '_diffrn_radiation.diffrn_id'
         loop_
        _category_group.id           'inclusive_group'
                                     'diffrn_group'
         loop_
        _category_examples.detail
        _category_examples.case
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;
        Example 1 - based on PDB entry 5HVP and laboratory records for the
                    structure corresponding to PDB entry 5HVP
    ;
    ;
        _diffrn_radiation.diffrn_id            'set1'

        _diffrn_radiation.collimation          '0.3 mm double pinhole'
        _diffrn_radiation.monochromator        'graphite'
        _diffrn_radiation.type                 'Cu K\a'
        _diffrn_radiation.wavelength_id         1
    ;
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;
        Example 2 - based on data set TOZ of Willis, Beckwith & Tozer [(1991).
                    Acta Cryst. C47, 2276-2277].
    ;
    ;
        _diffrn_radiation.wavelength_id    1
        _diffrn_radiation.type             'Cu K\a'
        _diffrn_radiation.monochromator    'graphite'
    ;
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
         save_

    save__diffrn_radiation.collimation
        _item_description.description
    ;              The collimation or focusing applied to the radiation.
    ;
        _item.name                  '_diffrn_radiation.collimation'
        _item.category_id             diffrn_radiation
        _item.mandatory_code          no
        _item_aliases.alias_name    '_diffrn_radiation_collimation'
        _item_aliases.dictionary      cif_core.dic
        _item_aliases.version         2.0.1
        _item_type.code               text
         loop_
        _item_examples.case          '0.3 mm double-pinhole'
                                     '0.5 mm'
                                     'focusing mirrors'
         save_

    save__diffrn_radiation.diffrn_id
        _item_description.description
    ;              This data item is a pointer to _diffrn.id in the DIFFRN
                   category.
    ;
        _item.name                  '_diffrn_radiation.diffrn_id'
        _item.mandatory_code          yes
         save_

    save__diffrn_radiation.div_x_source
        _item_description.description
    ;              Beam crossfire in degrees parallel to the laboratory X axis
                   (see AXIS category).

                   This is a characteristic of the xray beam as it illuminates
                   the sample (or specimen) after all monochromation and
                   collimation.

                   This is the esd of the directions of photons in the X-Z plane
                   around the mean source beam direction.

                   Note that some synchrotrons specify this value in milliradians,
                   in which case a conversion would be needed.  To go from a
                   value in milliradians to a value in degrees, multiply by 0.180
                   and divide by Pi.

    ;
        _item.name                  '_diffrn_radiation.div_x_source'
        _item.category_id             diffrn_radiation
        _item.mandatory_code          no
        _item_type.code               float
        _item_units.code              degrees
         save_

    save__diffrn_radiation.div_y_source
        _item_description.description
    ;              Beam crossfire in degrees parallel to the laboratory Y axis
                   (see AXIS category).

                   This is a characteristic of the xray beam as it illuminates
                   the sample (or specimen) after all monochromation and
                   collimation.

                   This is the esd of the directions of photons in the Y-Z plane
                   around the mean source beam direction.

                   Note that some synchrotrons specify this value in milliradians,
                   in which case a conversion would be needed.  To go from a
                   value in milliradians to a value in degrees, multiply by 0.180
                   and divide by Pi.

    ;
        _item.name                  '_diffrn_radiation.div_y_source'
        _item.category_id             diffrn_radiation
        _item.mandatory_code          no
        _item_type.code               float
        _item_units.code              degrees
        _item_default.value           0.0
         save_

    save__diffrn_radiation.div_x_y_source
        _item_description.description
    ;              Beam crossfire correlation degrees**2 between the
                   crossfire laboratory X-axis component and the crossfire
                   laboratory Y-axis component (see AXIS category).

                   This is a characteristic of the xray beam as it illuminates
                   the sample (or specimen) after all monochromation and
                   collimation.

                   This is the mean of the products of the deviations of the
                   directin of each photons in X-Z plane times the deviations
                   of the direction of the same photon in the Y-Z plane
                   around the mean source beam direction.  This will be zero
                   for uncorrelated crossfire.

                   Note that some synchrotrons specify this value in
                   milliradians**2, in which case a conversion would be needed.
                   To go from a value in milliradians**2 to a value in
                   degrees**2, multiply by 0.180**2 and divide by Pi**2.

    ;
        _item.name                  '_diffrn_radiation.div_x_y_source'
        _item.category_id             diffrn_radiation
        _item.mandatory_code          no
        _item_type.code               float
        _item_units.code              degrees_squared
        _item_default.value           0.0
         save_

    save__diffrn_radiation.filter_edge
        _item_description.description
    ;              Absorption edge in angstroms of the radiation filter used.
    ;
        _item.name                  '_diffrn_radiation.filter_edge'
        _item.category_id             diffrn_radiation
        _item.mandatory_code          no
        _item_aliases.alias_name    '_diffrn_radiation_filter_edge'
        _item_aliases.dictionary      cif_core.dic
        _item_aliases.version         2.0.1
         loop_
        _item_range.maximum
        _item_range.minimum            .    0.0
                                      0.0   0.0
        _item_type.code               float
        _item_units.code              angstroms
         save_

    save__diffrn_radiation.inhomogeneity
        _item_description.description
    ;              Half-width in millimetres of the incident beam in the
                   direction perpendicular to the diffraction plane.
    ;
        _item.name                  '_diffrn_radiation.inhomogeneity'
        _item.category_id             diffrn_radiation
        _item.mandatory_code          no
        _item_aliases.alias_name    '_diffrn_radiation_inhomogeneity'
        _item_aliases.dictionary      cif_core.dic
        _item_aliases.version         2.0.1
         loop_
        _item_range.maximum
        _item_range.minimum            .    0.0
                                      0.0   0.0
        _item_type.code               float
        _item_units.code              millimetres
         save_

    save__diffrn_radiation.monochromator
        _item_description.description
    ;              The method used to obtain monochromatic radiation. If a mono-
                   chromator crystal is used the material and the indices of the
                   Bragg reflection are specified.
    ;
        _item.name                  '_diffrn_radiation.monochromator'
        _item.category_id             diffrn_radiation
        _item.mandatory_code          no
        _item_aliases.alias_name    '_diffrn_radiation_monochromator'
        _item_aliases.dictionary      cif_core.dic
        _item_aliases.version         2.0.1
        _item_type.code               text
         loop_
        _item_examples.case          'Zr filter'
                                     'Ge 220'
                                     'none'
                                     'equatorial mounted graphite'
         save_

    save__diffrn_radiation.polarisn_norm
        _item_description.description
    ;              The angle in degrees, as viewed from the specimen, between the
                   perpendicular component of the polarisation and the diffraction
                   plane. See _diffrn_radiation_polarisn_ratio.
    ;
        _item.name                  '_diffrn_radiation.polarisn_norm'
        _item.category_id             diffrn_radiation
        _item.mandatory_code          no
        _item_aliases.alias_name    '_diffrn_radiation_polarisn_norm'
        _item_aliases.dictionary      cif_core.dic
        _item_aliases.version         2.0.1
         loop_
        _item_range.maximum
        _item_range.minimum            .    0.0
                                      0.0   0.0
        _item_type.code               float
        _item_units.code              degrees
         save_

    save__diffrn_radiation.polarisn_ratio
        _item_description.description
    ;              Polarisation ratio of the diffraction beam incident on the
                   crystal. It is the ratio of the perpendicularly polarised to the
                   parallel polarised component of the radiation. The perpendicular
                   component forms an angle of _diffrn_radiation.polarisn_norm to
                   the normal to the diffraction plane of the sample (i.e. the
                   plane containing the incident and reflected beams).
    ;
        _item.name                  '_diffrn_radiation.polarisn_ratio'
        _item.category_id             diffrn_radiation
        _item.mandatory_code          no
        _item_aliases.alias_name    '_diffrn_radiation_polarisn_ratio'
        _item_aliases.dictionary      cif_core.dic
        _item_aliases.version         2.0.1
         loop_
        _item_range.maximum
        _item_range.minimum            .    0.0
                                      0.0   0.0
        _item_type.code               float
         save_

    save__diffrn_radiation.polarizn_source_norm
        _item_description.description
    ;              The angle in degrees, as viewed from the specimen, between the
                   normal to the polarization plane and the laboratory Y axis as
                   defined in the AXIS category.

                   Note that this is the angle of polarization of the source
                   photons, either directly from a synchrotron beamline or
                   from a monchromater.

                   This differs from the value of '_diffrn_radiation.polarisn_norm'
                   in that '_diffrn_radiation.polarisn_norm' refers to polarization
                   relative to the diffraction plane rather than to the laboratory
                   axis system.

                   In the case of an unpolarized beam, or a beam with true circular
                   polarization, in which no single plane of polarization can be
                   determined, the plane should be taken as the X-Z plane, and the
                   angle as 0.

                   See '_diffrn_radiation.polarizn_source_ratio'.
    ;
        _item.name                  '_diffrn_radiation.polarizn_source_norm'
        _item.category_id             diffrn_radiation
        _item.mandatory_code          no
         loop_
        _item_range.maximum
        _item_range.minimum           90.0   90.0
                                      90.0  -90.0
                                     -90.0  -90.0
        _item_type.code               float
        _item_units.code              degrees
        _item_default.value           0.0
         save_

    save__diffrn_radiation.polarizn_source_ratio
        _item_description.description
    ;              (Ip-In)/(Ip+In), where Ip is the intensity (amplitude squared)
                   of the electric vector in the plane of polarization and In is
                   the intensity (amplitude squared) of the electric vector
                   in plane of the normal to the plane of polarization.

                   Thus, if we had complete polarization in the plane of
                   polarization, the value of
                   '_diffrn_radiation.polarizn_source_ratio' would
                   be 1, and an unpolarized beam would have a value of 0.

                   If the X-axis has been chosen to lie in the plane of
                   polarization, this definition will agree with the definition
                   of "MONOCHROMATOR" in the Denzo glossary, and values of near
                   1 should be expected for a bending magnet source.  However,
                   if the X-axis were, for some reason to be, say, perpendicular
                   to the polarization plane (not a common choice), then the
                   Denzo value would be the negative of
                   '_diffrn_radiation.polarizn_source_ratio'.

                   See http://www.hkl-xray.com for information on Denzo, and
                   Z. Otwinowski and W. Minor, " Processing of X-ray Diffraction
                   Data Collected in Oscillation Mode ", Methods in Enzymology,
                   Volume 276: Macromolecular Crystallography, part A, p.307-326,
                   1997,C.W. Carter, Jr. & R. M. Sweet, Eds., Academic Press.

                   This differs both in the choice of ratio and choice of
                   orientation from '_diffrn_radiation.polarisn_ratio', which,
                   unlike '_diffrn_radiation.polarizn_source_ratio', is unbounded.

    ;
        _item.name                  '_diffrn_radiation.polarizn_source_ratio'
        _item.category_id             diffrn_radiation
        _item.mandatory_code          no
         loop_
        _item_range.maximum
        _item_range.minimum           1.0    1.0
                                      1.0   -1.0
                                     -1.0   -1.0
        _item_type.code               float
         save_

    save__diffrn_radiation.probe
        _item_description.description
    ;              Name of the type of radiation used. It is strongly encouraged
                   that this field be specified so that the probe radiation
                   can be simply determined.
    ;
        _item.name                  '_diffrn_radiation.probe'
        _item.category_id             diffrn_radiation
        _item.mandatory_code          no
        _item_aliases.alias_name    '_diffrn_radiation_probe'
        _item_aliases.dictionary      cif_core.dic
        _item_aliases.version         2.0.1
        _item_type.code               line
         loop_
        _item_enumeration.value      'x-ray'
                                     'neutron'
                                     'electron'
                                     'gamma'
         save_

    save__diffrn_radiation.type
        _item_description.description
    ;              The nature of the radiation. This is typically a description
                   of the X-ray wavelength in Siegbahn notation.
    ;
        _item.name                  '_diffrn_radiation.type'
        _item.category_id             diffrn_radiation
        _item.mandatory_code          no
        _item_aliases.alias_name    '_diffrn_radiation_type'
        _item_aliases.dictionary      cif_core.dic
        _item_aliases.version         2.0.1
        _item_type.code               line
         loop_
        _item_examples.case          'CuK\a'
                                     'Cu K\a~1~'
                                     'Cu K-L~2,3~'
                                     'white-beam'

         save_

    save__diffrn_radiation.xray_symbol
        _item_description.description
    ;              The IUPAC symbol for the X-ray wavelength for probe radiation.
    ;
        _item.name                  '_diffrn_radiation.xray_symbol'
        _item.category_id             diffrn_radiation
        _item.mandatory_code          no
        _item_aliases.alias_name    '_diffrn_radiation_xray_symbol'
        _item_aliases.dictionary      cif_core.dic
        _item_aliases.version         2.0.1
        _item_type.code               line
         loop_
        _item_enumeration.value
        _item_enumeration.detail     'K-L~3~'
                                     'K\a~1~ in older Siegbahn notation'
                                     'K-L~2~'
                                     'K\a~2~ in older Siegbahn notation'
                                     'K-M~3~'
                                     'K\b~1~ in older Siegbahn notation'
                                     'K-L~2,3~'
                                     'use where K-L~3~ and K-L~2~ are not resolved'
         save_

    save__diffrn_radiation.wavelength_id
        _item_description.description
    ;              This data item is a pointer to _diffrn_radiation_wavelength.id
                   in the DIFFRN_RADIATION_WAVELENGTH category.
    ;
        _item.name                  '_diffrn_radiation.wavelength_id'
        _item.mandatory_code          yes
         save_

    ################
    # DIFFRN_REFLN #
    ################

    save_DIFFRN_REFLN
        _category.description
    ;
         This category redefinition has been added to extend the key of
         the standard DIFFRN_REFLN category.
    ;
        _category.id                   diffrn_refln
        _category.mandatory_code       no
        _category_key.name             '_diffrn_refln.frame_id'
         loop_
        _category_group.id             'inclusive_group'
                                       'diffrn_group'
         save_

    save__diffrn_refln.frame_id
        _item_description.description
    ;
                   This item is a pointer to _diffrn_data_frame.id
                   in the DIFFRN_DATA_FRAME category.
    ;
        _item.name                  '_diffrn_refln.frame_id'
        _item.category_id             diffrn_refln
        _item.mandatory_code          yes
        _item_type.code               code
         save_

    ###############
    # DIFFRN_SCAN #
    ###############

    save_DIFFRN_SCAN
        _category.description
    ;
         Data items in the DIFFRN_SCAN category describe the parameters of one
         or more scans, relating axis positions to frames.

    ;
        _category.id                   diffrn_scan
        _category.mandatory_code       no
        _category_key.name            '_diffrn_scan.id'
         loop_
        _category_group.id            'inclusive_group'
                                      'diffrn_group'
         loop_
        _category_examples.detail
        _category_examples.case
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;
        Example 1 - derived from a suggestion by R. M. Sweet.

       The vector of each axis is not given here, because it is provided in
       the AXIS category.  By making _diffrn_scan_axis.scan_id and
       _diffrn_scan_axis.axis_id keys of the DIFFRN_SCAN_AXIS category,
       an arbitrary number of scanning and fixed axes can be specified for a
       scan.  We have specified three rotation axes and one translation axis
       at non-zero values, with one axis stepping.  There is no reason why
       more axes could not have been specified to step.   We have specified
       range information, but note that it is redundant from the  number of
       frames and the increment, so we could drop the data item
       _diffrn_scan_axis.angle_range .

       We have specified both the sweep data and the data for a single frame.

       Note that the information on how the axes are stepped is given twice,
       once in terms of the overall averages in the value of
       '_diffrn_scan.integration_time' and the values for DIFFRN_SCAN_AXIS,
       and precisely for the given frame in the value for
       '_diffrn_scan_frame.integration_time' and the values for
       DIFFRN_SCAN_FRAME_AXIS.  If dose-related adjustements are made to
       scan times and non-linear stepping is done, these values may differ.
       Therefore, in interpreting the data for a particular frame it is
       important to use the frame-specific data.

    ;
    ;
          _diffrn_scan.id                   1
          _diffrn_scan.date_start         '2001-11-18T03:26:42'
          _diffrn_scan.date_end           '2001-11-18T03:36:45'
          _diffrn_scan.integration_time    3.0
          _diffrn_scan.frame_id_start      mad_L2_000
          _diffrn_scan.frame_id_end        mad_L2_200
          _diffrn_scan.frames              201

           loop_
          _diffrn_scan_axis.scan_id
          _diffrn_scan_axis.axis_id
          _diffrn_scan_axis.angle_start
          _diffrn_scan_axis.angle_range
          _diffrn_scan_axis.angle_increment
          _diffrn_scan_axis.displacement_start
          _diffrn_scan_axis.displacement_range
          _diffrn_scan_axis.displacement_increment

           1 omega 200.0 20.0 0.1 . . .
           1 kappa -40.0  0.0 0.0 . . .
           1 phi   127.5  0.0 0.0 . . .
           1 tranz  . . .   2.3 0.0 0.0

          _diffrn_scan_frame.scan_id                   1
          _diffrn_scan_frame.date               '2001-11-18T03:27:33'
          _diffrn_scan_frame.integration_time    3.0
          _diffrn_scan_frame.frame_id            mad_L2_018
          _diffrn_scan_frame.frame_number        18

          loop_
          _diffrn_scan_frame_axis.frame_id
          _diffrn_scan_frame_axis.axis_id
          _diffrn_scan_frame_axis.angle
          _diffrn_scan_frame_axis.angle_increment
          _diffrn_scan_frame_axis.displacement
          _diffrn_scan_frame_axis.displacement_increment

           mad_L2_018 omega 201.8  0.1 . .
           mad_L2_018 kappa -40.0  0.0 . .
           mad_L2_018 phi   127.5  0.0 . .
           mad_L2_018 tranz  .     .  2.3 0.0

    ;

    ;
        Example 2 - a more extensive example, R. M. Sweet, P. Ellis, H. Bernstein.

       We place a detector 240 mm along the Z axis from the goniometer.
       This presents us with a choice -- either we define the axes of
       the detector at the origin, and then put a Z setting of -240 in
       for the actual use, or we define the axes with the necessary Z-offset.
       In this case we use the setting, and leave the offset as zero.
       We call this axis DETECTOR_Z.

       The axis for positioning the detector in the Y-direction depends
       on the detector Z-axis.  We call this axis, DETECTOR_Y.

       The axis for positioning the dector in the X-direction depends
       on the detector Y-axis (and therefore on the detector Z-axis).
       We call this axis DETECTOR_X.

       This detector may be rotated around the Y-axis.  This rotation axis
       depends on the three translation axies.  We call it DETECTOR_PITCH.

       We define a coordinate system on the face of the detector in terms of
       2300 0.150 mm pixels in each direction.  The ELEMENT_X axis is used to
       index the first array index of the data array and the ELEMENT_Y
       axis is used to index the second array index.  Because the pixels
       are 0.150mm x 0.150mm, the center of the first pixel is at (0.075,
       0.075) in this coordinate system.

    ;
    ;
         ###CBF: VERSION 1.1

         data_image_1

         # category DIFFRN

         _diffrn.id P6MB
         _diffrn.crystal_id P6MB_CRYSTAL7

         # category DIFFRN_SOURCE

         loop_
         _diffrn_source.diffrn_id
         _diffrn_source.source
         _diffrn_source.type
          P6MB synchrotron 'SSRL beamline 9-1'

         # category DIFFRN_RADIATION

              loop_
         _diffrn_radiation.diffrn_id
         _diffrn_radiation.wavelength_id
         _diffrn_radiation.monochromator
         _diffrn_radiation.polarizn_source_ratio
         _diffrn_radiation.polarizn_source_norm
         _diffrn_radiation.div_x_source
         _diffrn_radiation.div_y_source
         _diffrn_radiation.div_x_y_source
          P6MB WAVELENGTH1 'Si 111' 0.8 0.0 0.08
         0.01 0.00

         # category DIFFRN_RADIATION_WAVELENGTH

         loop_
         _diffrn_radiation_wavelength.id
         _diffrn_radiation_wavelength.wavelength
         _diffrn_radiation_wavelength.wt
          WAVELENGTH1 0.98 1.0

         # category DIFFRN_DETECTOR

         loop_
         _diffrn_detector.diffrn_id
         _diffrn_detector.id
         _diffrn_detector.type
         _diffrn_detector.number_of_axes
          P6MB MAR345-SN26 'MAR 345' 4

         # category DIFFRN_DETECTOR_AXIS

         loop_
         _diffrn_detector_axis.id
         _diffrn_detector_axis.axis_id
          MAR345-SN26 DETECTOR_X
          MAR345-SN26 DETECTOR_Y
          MAR345-SN26 DETECTOR_Z
          MAR345-SN26 DETECTOR_PITCH

         # category DIFFRN_DETECTOR_ELEMENT

         loop_
         _diffrn_detector_element.id
         _diffrn_detector_element.detector_id
          ELEMENT1 MAR345-SN26

         # category DIFFRN_DATA_FRAME

         loop_
         _diffrn_data_frame.id
         _diffrn_data_frame.detector_element_id
         _diffrn_data_frame.array_id
         _diffrn_data_frame.binary_id
          FRAME1 ELEMENT1 ARRAY1 1

         # category DIFFRN_MEASUREMENT

         loop_
         _diffrn_measurement.diffrn_id
         _diffrn_measurement.id
         _diffrn_measurement.number_of_axes
         _diffrn_measurement.method
          P6MB GONIOMETER 3 rotation

         # category DIFFRN_MEASUREMENT_AXIS

         loop_
         _diffrn_measurement_axis.measurement_id
         _diffrn_measurement_axis.axis_id
          GONIOMETER GONIOMETER_PHI
          GONIOMETER GONIOMETER_KAPPA
          GONIOMETER GONIOMETER_OMEGA

         # category DIFFRN_SCAN

         loop_
         _diffrn_scan.id
         _diffrn_scan.frame_id_start
         _diffrn_scan.frame_id_end
         _diffrn_scan.frames
          SCAN1 FRAME1 FRAME1 1

         # category DIFFRN_SCAN_AXIS

         loop_
         _diffrn_scan_axis.scan_id
         _diffrn_scan_axis.axis_id
         _diffrn_scan_axis.angle_start
         _diffrn_scan_axis.angle_range
         _diffrn_scan_axis.angle_increment
         _diffrn_scan_axis.displacement_start
         _diffrn_scan_axis.displacement_range
         _diffrn_scan_axis.displacement_increment
          SCAN1 GONIOMETER_OMEGA 12.0 1.0 1.0 0.0 0.0 0.0
          SCAN1 GONIOMETER_KAPPA 23.3 0.0 0.0 0.0 0.0 0.0
          SCAN1 GONIOMETER_PHI -165.8 0.0 0.0 0.0 0.0 0.0
          SCAN1 DETECTOR_Z 0.0 0.0 0.0 -240.0 0.0 0.0
          SCAN1 DETECTOR_Y 0.0 0.0 0.0 0.6 0.0 0.0
          SCAN1 DETECTOR_X 0.0 0.0 0.0 -0.5 0.0 0.0
          SCAN1 DETECTOR_PITCH 0.0 0.0 0.0 0.0 0.0 0.0

         # category DIFFRN_SCAN_FRAME

         loop_
         _diffrn_scan_frame.frame_id
         _diffrn_scan_frame.frame_number
         _diffrn_scan_frame.integration_time
         _diffrn_scan_frame.scan_id
         _diffrn_scan_frame.date
          FRAME1 1 20.0 SCAN1 1997-12-04T10:23:48

         # category DIFFRN_SCAN_FRAME_AXIS

         loop_
         _diffrn_scan_frame_axis.frame_id
         _diffrn_scan_frame_axis.axis_id
         _diffrn_scan_frame_axis.angle
         _diffrn_scan_frame_axis.displacement
          FRAME1 GONIOMETER_OMEGA 12.0 0.0
          FRAME1 GONIOMETER_KAPPA 23.3 0.0
          FRAME1 GONIOMETER_PHI -165.8 0.0
          FRAME1 DETECTOR_Z 0.0 -240.0
          FRAME1 DETECTOR_Y 0.0 0.6
          FRAME1 DETECTOR_X 0.0 -0.5
          FRAME1 DETECTOR_PITCH 0.0 0.0

         # category AXIS

         loop_
         _axis.id
         _axis.type
         _axis.equipment
         _axis.depends_on
         _axis.vector[1] _axis.vector[2] _axis.vector[3]
         _axis.offset[1] _axis.offset[2] _axis.offset[3]
          GONIOMETER_OMEGA rotation goniometer . 1 0 0 . . .
          GONIOMETER_KAPPA rotation goniometer GONIOMETER_OMEGA 0.64279
          0 0.76604 . . .
          GONIOMETER_PHI   rotation goniometer GONIOMETER_KAPPA 1 0 0
         . . .
          SOURCE           general source . 0 0 1 . . .
          GRAVITY          general gravity . 0 -1 0 . . .
          DETECTOR_Z       translation detector . 0 0 1 0 0 0
          DETECTOR_Y       translation detector DETECTOR_Z 0 1 0 0 0 0
          DETECTOR_X       translation detector DETECTOR_Y 1 0 0 0 0 0
          DETECTOR_PITCH   rotation    detector DETECTOR_X 0 1 0 0 0 0
          ELEMENT_X        translation detector DETECTOR_PITCH
         1 0 0 172.43 -172.43 0
          ELEMENT_Y        translation detector ELEMENT_X
         0 1 0 0 0 0

         # category ARRAY_STRUCTURE_LIST

         loop_
         _array_structure_list.array_id
         _array_structure_list.index
         _array_structure_list.dimension
         _array_structure_list.precedence
         _array_structure_list.direction
         _array_structure_list.axis_set_id
          ARRAY1 1 2300 1 increasing ELEMENT_X
          ARRAY1 2 2300 2 increasing ELEMENT_Y

         # category ARRAY_STRUCTURE_LIST_AXIS

         loop_
         _array_structure_list_axis.axis_set_id
         _array_structure_list_axis.axis_id
         _array_structure_list_axis.displacement
         _array_structure_list_axis.displacement_increment
          ELEMENT_X ELEMENT_X 0.075 0.150
          ELEMENT_Y ELEMENT_Y 0.075 0.150

         # category ARRAY_ELEMENT_SIZE

         loop_
         _array_element_size.array_id
         _array_element_size.index
         _array_element_size.size
          ARRAY1 1 150e-6
          ARRAY1 2 150e-6

         # category ARRAY_INTENSITIES

         loop_
         _array_intensities.array_id
         _array_intensities.binary_id
         _array_intensities.linearity
         _array_intensities.gain
         _array_intensities.gain_esd
         _array_intensities.overload
         _array_intensities.undefined_value
          ARRAY1 1 linear 1.15 0.2 240000 0

          # category ARRAY_STRUCTURE

          loop_
          _array_structure.id
          _array_structure.encoding_type
          _array_structure.compression_type
          _array_structure.byte_order
          ARRAY1 "signed 32-bit integer" packed little_endian

         # category ARRAY_DATA

         loop_
         _array_data.array_id
         _array_data.binary_id
         _array_data.data
          ARRAY1 1
         ;
         --CIF-BINARY-FORMAT-SECTION--
         Content-Type: application/octet-stream;
             conversions="x-CBF_PACKED"
         Content-Transfer-Encoding: BASE64
         X-Binary-Size: 3801324
         X-Binary-ID: 1
         X-Binary-Element-Type: "signed 32-bit integer"
         Content-MD5: 07lZFvF+aOcW85IN7usl8A==

         AABRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZBQSr1sKNBOeOe9HITdMdDUnbq7bg
         ...
         8REo6TtBrxJ1vKqAvx9YDMD6J18Qg83OMr/tgssjMIJMXATDsZobL90AEXc4KigE

         --CIF-BINARY-FORMAT-SECTION----
         ;
    ;

    ;
        Example 3 - Example 2 revised for a spiral scan, R. M. Sweet,
        P. Ellis, H. Bernstein.

       We place a detector 240 mm along the Z axis from the goniometer,
       as in Example 2, above, but in this example, the image plate is
       scanned in a spiral pattern outside edge in.

       The axis for positioning the detector in the Y-direction depends
       on the detector Z-axis.  We call this axis, DETECTOR_Y.

       The axis for positioning the dector in the X-direction depends
       on the detector Y-axis (and therefore on the detector Z-axis).
       We call this axis DETECTOR_X.

       This detector may be rotated around the Y-axis.  This rotation axis
       depends on the three translation axies.  We call it DETECTOR_PITCH.

       We define a coordinate system on the face of the detector in
       terms of a coupled rotation axis and radial scan axis to form
       a spiral scan.  Let us call rotation axis ELEMENT_ROT, and the
       radial axis ELEMENT_RAD.   We assume 150 um radial pitch and 75 um
       'constant velocity' angular pitch.

       We index first on the rotation axis and make the radial axis
       dependent on
       it.

       The two axes are coupled to form an axis set ELEMENT_SPIRAL.

    ;
    ;
         ###CBF: VERSION 1.1

         data_image_1

         # category DIFFRN

         _diffrn.id P6MB
         _diffrn.crystal_id P6MB_CRYSTAL7

         # category DIFFRN_SOURCE

         loop_
         _diffrn_source.diffrn_id
         _diffrn_source.source
         _diffrn_source.type
          P6MB synchrotron 'SSRL beamline 9-1'

         # category DIFFRN_RADIATION

              loop_
         _diffrn_radiation.diffrn_id
         _diffrn_radiation.wavelength_id
         _diffrn_radiation.monochromator
         _diffrn_radiation.polarizn_source_ratio
         _diffrn_radiation.polarizn_source_norm
         _diffrn_radiation.div_x_source
         _diffrn_radiation.div_y_source
         _diffrn_radiation.div_x_y_source
          P6MB WAVELENGTH1 'Si 111' 0.8 0.0 0.08
         0.01 0.00

         # category DIFFRN_RADIATION_WAVELENGTH

         loop_
         _diffrn_radiation_wavelength.id
         _diffrn_radiation_wavelength.wavelength
         _diffrn_radiation_wavelength.wt
          WAVELENGTH1 0.98 1.0

         # category DIFFRN_DETECTOR

         loop_
         _diffrn_detector.diffrn_id
         _diffrn_detector.id
         _diffrn_detector.type
         _diffrn_detector.number_of_axes
          P6MB MAR345-SN26 'MAR 345' 4

         # category DIFFRN_DETECTOR_AXIS

         loop_
         _diffrn_detector_axis.id
         _diffrn_detector_axis.axis_id
          MAR345-SN26 DETECTOR_X
          MAR345-SN26 DETECTOR_Y
          MAR345-SN26 DETECTOR_Z
          MAR345-SN26 DETECTOR_PITCH

         # category DIFFRN_DETECTOR_ELEMENT

         loop_
         _diffrn_detector_element.id
         _diffrn_detector_element.detector_id
          ELEMENT1 MAR345-SN26

         # category DIFFRN_DATA_FRAME

         loop_
         _diffrn_data_frame.id
         _diffrn_data_frame.detector_element_id
         _diffrn_data_frame.array_id
         _diffrn_data_frame.binary_id
          FRAME1 ELEMENT1 ARRAY1 1

         # category DIFFRN_MEASUREMENT

         loop_
         _diffrn_measurement.diffrn_id
         _diffrn_measurement.id
         _diffrn_measurement.number_of_axes
         _diffrn_measurement.method
          P6MB GONIOMETER 3 rotation

         # category DIFFRN_MEASUREMENT_AXIS

         loop_
         _diffrn_measurement_axis.measurement_id
         _diffrn_measurement_axis.axis_id
          GONIOMETER GONIOMETER_PHI
          GONIOMETER GONIOMETER_KAPPA
          GONIOMETER GONIOMETER_OMEGA

         # category DIFFRN_SCAN

         loop_
         _diffrn_scan.id
         _diffrn_scan.frame_id_start
         _diffrn_scan.frame_id_end
         _diffrn_scan.frames
          SCAN1 FRAME1 FRAME1 1

         # category DIFFRN_SCAN_AXIS

         loop_
         _diffrn_scan_axis.scan_id
         _diffrn_scan_axis.axis_id
         _diffrn_scan_axis.angle_start
         _diffrn_scan_axis.angle_range
         _diffrn_scan_axis.angle_increment
         _diffrn_scan_axis.displacement_start
         _diffrn_scan_axis.displacement_range
         _diffrn_scan_axis.displacement_increment
          SCAN1 GONIOMETER_OMEGA 12.0 1.0 1.0 0.0 0.0 0.0
          SCAN1 GONIOMETER_KAPPA 23.3 0.0 0.0 0.0 0.0 0.0
          SCAN1 GONIOMETER_PHI -165.8 0.0 0.0 0.0 0.0 0.0
          SCAN1 DETECTOR_Z 0.0 0.0 0.0 -240.0 0.0 0.0
          SCAN1 DETECTOR_Y 0.0 0.0 0.0 0.6 0.0 0.0
          SCAN1 DETECTOR_X 0.0 0.0 0.0 -0.5 0.0 0.0
          SCAN1 DETECTOR_PITCH 0.0 0.0 0.0 0.0 0.0 0.0

         # category DIFFRN_SCAN_FRAME

         loop_
         _diffrn_scan_frame.frame_id
         _diffrn_scan_frame.frame_number
         _diffrn_scan_frame.integration_time
         _diffrn_scan_frame.scan_id
         _diffrn_scan_frame.date
          FRAME1 1 20.0 SCAN1 1997-12-04T10:23:48

         # category DIFFRN_SCAN_FRAME_AXIS

         loop_
         _diffrn_scan_frame_axis.frame_id
         _diffrn_scan_frame_axis.axis_id
         _diffrn_scan_frame_axis.angle
         _diffrn_scan_frame_axis.displacement
          FRAME1 GONIOMETER_OMEGA 12.0 0.0
          FRAME1 GONIOMETER_KAPPA 23.3 0.0
          FRAME1 GONIOMETER_PHI -165.8 0.0
          FRAME1 DETECTOR_Z 0.0 -240.0
          FRAME1 DETECTOR_Y 0.0 0.6
          FRAME1 DETECTOR_X 0.0 -0.5
          FRAME1 DETECTOR_PITCH 0.0 0.0

         # category AXIS

         loop_
         _axis.id
         _axis.type
         _axis.equipment
         _axis.depends_on
         _axis.vector[1] _axis.vector[2] _axis.vector[3]
         _axis.offset[1] _axis.offset[2] _axis.offset[3]
          GONIOMETER_OMEGA rotation goniometer . 1 0 0 . . .
          GONIOMETER_KAPPA rotation goniometer GONIOMETER_OMEGA 0.64279
          0 0.76604 . . .
          GONIOMETER_PHI   rotation goniometer GONIOMETER_KAPPA 1 0 0
         . . .
          SOURCE           general source . 0 0 1 . . .
          GRAVITY          general gravity . 0 -1 0 . . .
          DETECTOR_Z       translation detector . 0 0 1 0 0 0
          DETECTOR_Y       translation detector DETECTOR_Z 0 1 0 0 0 0
          DETECTOR_X       translation detector DETECTOR_Y 1 0 0 0 0 0
          DETECTOR_PITCH   rotation    detector DETECTOR_X 0 1 0 0 0 0
          ELEMENT_ROT      translation detector DETECTOR_PITCH 0 0 1 0 0 0
          ELEMENT_RAD      translation detector ELEMENT_ROT 0 1 0 0 0 0

         # category ARRAY_STRUCTURE_LIST

         loop_
         _array_structure_list.array_id
         _array_structure_list.index
         _array_structure_list.dimension
         _array_structure_list.precedence
         _array_structure_list.direction
         _array_structure_list.axis_set_id
          ARRAY1 1 8309900 1 increasing ELEMENT_SPIRAL

         # category ARRAY_STRUCTURE_LIST_AXIS

         loop_
         _array_structure_list_axis.axis_set_id
         _array_structure_list_axis.axis_id
         _array_structure_list_axis.angle
         _array_structure_list_axis.displacement
         _array_structure_list_axis.angular_pitch
         _array_structure_list_axis.radial_pitch
          ELEMENT_SPIRAL ELEMENT_ROT 0    .  0.075   .
          ELEMENT_SPIRAL ELEMENT_RAD . 172.5  .    -0.150

         # category ARRAY_ELEMENT_SIZE
         # the actual pixels are 0.075 by 0.150 mm
         # We give the coarser dimension here.

         loop_
         _array_element_size.array_id
         _array_element_size.index
         _array_element_size.size
          ARRAY1 1 150e-6

         # category ARRAY_INTENSITIES

         loop_
         _array_intensities.array_id
         _array_intensities.binary_id
         _array_intensities.linearity
         _array_intensities.gain
         _array_intensities.gain_esd
         _array_intensities.overload
         _array_intensities.undefined_value
          ARRAY1 1 linear 1.15 0.2 240000 0

          # category ARRAY_STRUCTURE

          loop_
          _array_structure.id
          _array_structure.encoding_type
          _array_structure.compression_type
          _array_structure.byte_order
          ARRAY1 "signed 32-bit integer" packed little_endian

         # category ARRAY_DATA

         loop_
         _array_data.array_id
         _array_data.binary_id
         _array_data.data
          ARRAY1 1
         ;
         --CIF-BINARY-FORMAT-SECTION--
         Content-Type: application/octet-stream;
             conversions="x-CBF_PACKED"
         Content-Transfer-Encoding: BASE64
         X-Binary-Size: 3801324
         X-Binary-ID: 1
         X-Binary-Element-Type: "signed 32-bit integer"
         Content-MD5: 07lZFvF+aOcW85IN7usl8A==

         AABRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZBQSr1sKNBOeOe9HITdMdDUnbq7bg
         ...
         8REo6TtBrxJ1vKqAvx9YDMD6J18Qg83OMr/tgssjMIJMXATDsZobL90AEXc4KigE

         --CIF-BINARY-FORMAT-SECTION----
         ;
    ;

    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
           save_

    save__diffrn_scan.id
        _item_description.description
    ;             The value of _diffrn_scan.id uniquely identifies each
                  scan.  The identifier is used to tie together all the
                  information about the scan.
    ;
         loop_
        _item.name
        _item.category_id
        _item.mandatory_code
           '_diffrn_scan.id'                 diffrn_scan             yes
           '_diffrn_scan_axis.scan_id'       diffrn_scan_axis        yes
           '_diffrn_scan_frame.scan_id'      diffrn_scan_frame       yes
        _item_type.code               code
         loop_
        _item_linked.child_name
        _item_linked.parent_name
           '_diffrn_scan_axis.scan_id'          '_diffrn_scan.id'
           '_diffrn_scan_frame.scan_id'         '_diffrn_scan.id'
         save_

    save__diffrn_scan.date_end
        _item_description.description
    ;
                   The date and time of the end of the scan.  Note that this
                   may be an estimate generated during the scan, before the
                   precise time of the end of the scan is known.
    ;
        _item.name                 '_diffrn_scan.date_end'
        _item.category_id          diffrn_scan
        _item.mandatory_code       no
        _item_type.code            yyyy-mm-dd
         save_

    save__diffrn_scan.date_start
        _item_description.description
    ;
                   The date and time of the start of the scan.
    ;
        _item.name                 '_diffrn_scan.date_start'
        _item.category_id          diffrn_scan
        _item.mandatory_code       no
        _item_type.code            yyyy-mm-dd
         save_

    save__diffrn_scan.integration_time
        _item_description.description
    ;
                   Approximate average time in seconds to integrate each
                   step of the scan.  The precise time for integration
                   of each particular step must be provided in
                   '_diffrn_scan_frame.integration_time', even
                   if all steps have the same integration time.
    ;
        _item.name                 '_diffrn_scan.integration_time'
        _item.category_id          diffrn_scan
        _item.mandatory_code       no
        _item_type.code            float
        _item_units.code           'seconds'
         loop_
        _item_range.maximum
        _item_range.minimum
                                .   0.0
         save_

    save__diffrn_scan.frame_id_start
        _item_description.description
    ;
                   The value of this data item is the identifier of the
                   first frame in the scan.

                   This item is a pointer to _diffrn_data_frame.id in the
                   DIFFRN_DATA_FRAME category.
    ;
        _item.name                 '_diffrn_scan.frame_id_start'
        _item.category_id          diffrn_scan
        _item.mandatory_code       yes
         save_

    save__diffrn_scan.frame_id_end
        _item_description.description
    ;
                   The value of this data item is the identifier of the
                   last frame in the scan.

                   This item is a pointer to _diffrn_data_frame.id in the
                   DIFFRN_DATA_FRAME category.
    ;
        _item.name                 '_diffrn_scan.frame_id_end'
        _item.category_id          diffrn_scan
        _item.mandatory_code       yes
         save_

    save__diffrn_scan.frames
        _item_description.description
    ;
                   The value of this data item is the number of frames in
                   the scan.

    ;
        _item.name                 '_diffrn_scan.frames'
        _item.category_id          diffrn_scan
        _item.mandatory_code       no
        _item_type.code            int
         loop_
        _item_range.maximum
        _item_range.minimum
                                .   1
                                1   1
         save_

    ####################
    # DIFFRN_SCAN_AXIS #
    ####################

    save_DIFFRN_SCAN_AXIS
        _category.description
    ;
         Data items in the DIFFRN_SCAN_AXIS category describe the settings of
         axes for particular scans.  Unspecified axes are assumed to be at
         their zero points.

    ;
        _category.id                   diffrn_scan_axis
        _category.mandatory_code       no
         loop_
        _category_key.name
                                      '_diffrn_scan_axis.scan_id'
                                      '_diffrn_scan_axis.axis_id'
         loop_
        _category_group.id           'inclusive_group'
                                     'diffrn_group'
         save_

    save__diffrn_scan_axis.scan_id
        _item_description.description
    ;
                   The value of this data item is the identifier of the
                   scan for which axis settings are being specified.

                   Multiple axes may be specified for the same value of
                   '_diffrn_scan.id'.

                   This item is a pointer to _diffrn_scan.id in the
                   DIFFRN_SCAN category.
    ;
        _item.name                 '_diffrn_scan_axis.scan_id'
        _item.category_id          diffrn_scan_axis
        _item.mandatory_code       yes
         save_

    save__diffrn_scan_axis.axis_id
        _item_description.description
    ;
                   The value of this data item is the identifier of one of
                   the axes for the scan for which settings are being specified.

                   Multiple axes may be specified for the same value of
                   '_diffrn_scan.id'.

                   This item is a pointer to _axis.id in the
                   AXIS category.
    ;
        _item.name                 '_diffrn_scan_axis.axis_id'
        _item.category_id          diffrn_scan_axis
        _item.mandatory_code       yes
         save_

    save__diffrn_scan_axis.angle_start
        _item_description.description
    ;
                   The starting position for the specified axis in degrees.
    ;
        _item.name                 '_diffrn_scan_axis.angle_start'
        _item.category_id          diffrn_scan_axis
        _item.mandatory_code       no
        _item_default.value        0.0
        _item_type.code            float
        _item_units.code           'degrees'
         save_

    save__diffrn_scan_axis.angle_range
        _item_description.description
    ;
                   The range from the starting position for the specified axis
                   in degrees.
    ;
        _item.name                 '_diffrn_scan_axis.angle_range'
        _item.category_id          diffrn_scan_axis
        _item.mandatory_code       no
        _item_default.value        0.0
        _item_type.code            float
        _item_units.code           'degrees'
         save_

    save__diffrn_scan_axis.angle_increment
        _item_description.description
    ;
                   The increment for each step for the specified axis
                   in degrees.  In general, this will agree with
                   '_array_structure_list_axis.angle_increment', which
                   see for a precise description.
    ;
        _item.name                 '_diffrn_scan_axis.angle_increment'
        _item.category_id          diffrn_scan_axis
        _item.mandatory_code       no
        _item_default.value        0.0
        _item_type.code            float
        _item_units.code           'degrees'
         save_

    save__diffrn_scan_axis.angle_rstrt_incr
        _item_description.description
    ;
                   The increment after each step for the specified axis
                   in degrees.  In general, this will agree with
                   '_array_structure_list_axis.angle_increment', which
                   see for a precise description.
    ;
        _item.name                 '_diffrn_scan_axis.angle_rstrt_incr'
        _item.category_id          diffrn_scan_axis
        _item.mandatory_code       no
        _item_default.value        0.0
        _item_type.code            float
        _item_units.code           'degrees'
         save_

    save__diffrn_scan_axis.displacement_start
        _item_description.description
    ;
                   The starting position for the specified axis in millimetres.
    ;
        _item.name                 '_diffrn_scan_axis.displacement_start'
        _item.category_id          diffrn_scan_axis
        _item.mandatory_code       no
        _item_default.value        0.0
        _item_type.code            float
        _item_units.code           'millimetres'
         save_

    save__diffrn_scan_axis.displacement_range
        _item_description.description
    ;
                   The range from the starting position for the specified axis
                   in millimetres.
    ;
        _item.name                 '_diffrn_scan_axis.displacement_range'
        _item.category_id          diffrn_scan_axis
        _item.mandatory_code       no
        _item_default.value        0.0
        _item_type.code            float
        _item_units.code           'millimetres'
         save_

    save__diffrn_scan_axis.displacement_increment
        _item_description.description
    ;
                   The increment for each step for the specified axis
                   in millimetres.  In general, this will agree with
                   '_diffrn_scan_frame_axis.displacement_increment', which
                   see for a precise description.
    ;
        _item.name                 '_diffrn_scan_axis.displacement_increment'
        _item.category_id          diffrn_scan_axis
        _item.mandatory_code       no
        _item_default.value        0.0
        _item_type.code            float
        _item_units.code           'millimetres'
         save_

    save__diffrn_scan_axis.displacement_rstrt_incr
        _item_description.description
    ;
                   The increment for each step for the specified axis
                   in millimetres.  In general, this will agree with
                   '_diffrn_scan_frame_axis.displacement_rstrt_incr', which
                   see for a precise description.
    ;
        _item.name                 '_diffrn_scan_axis.displacement_rstrt_incr'
        _item.category_id          diffrn_scan_axis
        _item.mandatory_code       no
        _item_default.value        0.0
        _item_type.code            float
        _item_units.code           'millimetres'
         save_

    #####################
    # DIFFRN_SCAN_FRAME #
    #####################

    save_DIFFRN_SCAN_FRAME
        _category.description
    ;
         Data items in the DIFFRN_SCAN_FRAME category describe the settings of
         axes for particular frames.  Unspecified axes are assumed to be at
         their zero points.

    ;
        _category.id                   diffrn_scan_frame
        _category.mandatory_code       no
         loop_
        _category_key.name
                                      '_diffrn_scan_frame.scan_id'
                                      '_diffrn_scan_frame.frame_id'
         loop_
        _category_group.id            'inclusive_group'
                                      'diffrn_group'
         save_

    save__diffrn_scan_frame.date
        _item_description.description
    ;
                   The date and time of the start of the frame being scanned.
    ;
        _item.name                 '_diffrn_scan_frame.date'
        _item.category_id          diffrn_scan_frame
        _item.mandatory_code       no
        _item_type.code            yyyy-mm-dd
         save_

    save__diffrn_scan_frame.frame_id
        _item_description.description
    ;
                   The value of this data item is the identifier of the
                   frame being examined.

                   This item is a pointer to _diffrn_data_frame.id in the
                   DIFFRN_DATA_FRAME category.
    ;
        _item.name                 '_diffrn_scan_frame.frame_id'
        _item.category_id          diffrn_scan_frame
        _item.mandatory_code       yes
         save_

    save__diffrn_scan_frame.frame_number
        _item_description.description
    ;
                   The value of this data item is the number of the frame within
                   the scan, starting with 1.  It is not necessarily the same as
                   the value of _diffrn_scan_frame.frame_id, but may
                   be.

    ;
        _item.name                 '_diffrn_scan_frame.frame_number'
        _item.category_id          diffrn_scan_frame
        _item.mandatory_code       no
        _item_type.code            int
         loop_
        _item_range.maximum
        _item_range.minimum
                                .   0
                                0   0
         save_

    save__diffrn_scan_frame.integration_time
        _item_description.description
    ;
                   The time in seconds to integrate this step of the scan.
                   This should be the precise time of integration of each
                   particular frame.  The value of this data item should
                   be given explicitly for each frame and not inferred
                   from the value of '_diffrn_scan.integration_time'.
    ;
        _item.name                 '_diffrn_scan_frame.integration_time'
        _item.category_id          diffrn_scan_frame
        _item.mandatory_code       yes
        _item_type.code            float
        _item_units.code           'seconds'
         loop_
        _item_range.maximum
        _item_range.minimum
                                .   0.0
         save_

    save__diffrn_scan_frame.scan_id
        _item_description.description
    ;             The value of _diffrn_scan_frame.scan_id identifies the scan
                  containing this frame.

                  This item is a pointer to _diffrn_scan.id in the
                  DIFFRN_SCAN category.
    ;
        _item.name             '_diffrn_scan_frame.scan_id'
        _item.category_id        diffrn_scan_frame
        _item.mandatory_code     yes
         save_

    ##########################
    # DIFFRN_SCAN_FRAME_AXIS #
    ##########################

    save_DIFFRN_SCAN_FRAME_AXIS
        _category.description
    ;
         Data items in the DIFFRN_SCAN_FRAME_AXIS category describes the settings
         of axes for particular frames.  Unspecified axes are assumed to be at
         their zero points.  If, for any given frame, non-zero values apply
         for any of the data items in this category, those values should be
         given explicitly in this category and not simply inferred from values
         in DIFFRN_SCAN_AXIS.

    ;
        _category.id                   diffrn_scan_frame_axis
        _category.mandatory_code       no
         loop_
        _category_key.name
                                      '_diffrn_scan_frame_axis.frame_id'
                                      '_diffrn_scan_frame_axis.axis_id'
         loop_
        _category_group.id           'inclusive_group'
                                     'diffrn_group'
         save_

    save__diffrn_scan_frame_axis.axis_id
        _item_description.description
    ;
                   The value of this data item is the identifier of one of
                   the axes for the frame for which settings are being specified.

                   Multiple axes may be specified for the same value of
                   _diffrn_scan_frame.frame_id

                   This item is a pointer to _axis.id in the
                   AXIS category.
    ;
        _item.name                 '_diffrn_scan_frame_axis.axis_id'
        _item.category_id          diffrn_scan_frame_axis
        _item.mandatory_code       yes
         save_

    save__diffrn_scan_frame_axis.angle
        _item_description.description
    ;
                   The setting of the specified axis in degrees for this frame.
                   This is the setting at the start of the integration time.
    ;
        _item.name                 '_diffrn_scan_frame_axis.angle'
        _item.category_id          diffrn_scan_frame_axis
        _item.mandatory_code       no
        _item_default.value        0.0
        _item_type.code            float
        _item_units.code           'degrees'
         save_

    save__diffrn_scan_frame_axis.angle_increment
        _item_description.description
    ;
                   The increment for this frame for angular setting of
                   the specified axis in degrees.  The sum of the values
                   of '_diffrn_scan_frame_axis.angle' and
                   '_diffrn_scan_frame_axis.angle_increment' is the
                   angular setting of the axis at the end of the integration
                   time for this frame.
    ;
        _item.name                 '_diffrn_scan_frame_axis.angle_increment'
        _item.category_id          diffrn_scan_frame_axis
        _item.mandatory_code       no
        _item_default.value        0.0
        _item_type.code            float
        _item_units.code           'degrees'
         save_

    save__diffrn_scan_frame_axis.angle_rstrt_incr
        _item_description.description
    ;
                   The increment after this frame for angular setting of
                   the specified axis in degrees.  The sum of the values
                   of '_diffrn_scan_frame_axis.angle' and
                   '_diffrn_scan_frame_axis.angle_increment' and
                   '_diffrn_scan_frame_axis.angle_rstrt_incr' is the
                   angular setting of the axis at the start of the integration
                   time for the next frame, and should equal
                   '_diffrn_scan_frame_axis.angle' for that next frame.
    ;
        _item.name               '_diffrn_scan_frame_axis.angle_rstrt_incr'
        _item.category_id          diffrn_scan_frame_axis
        _item.mandatory_code       no
        _item_default.value        0.0
        _item_type.code            float
        _item_units.code           'degrees'
         save_

    save__diffrn_scan_frame_axis.displacement
        _item_description.description
    ;
                   The setting of the specified axis in millimetres for this
                   frame.  This is the setting at the start of the integration
                   time.

    ;
        _item.name               '_diffrn_scan_frame_axis.displacement'
        _item.category_id          diffrn_scan_frame_axis
        _item.mandatory_code       no
        _item_default.value        0.0
        _item_type.code            float
        _item_units.code           'millimetres'
         save_

    save__diffrn_scan_frame_axis.displacement_increment
        _item_description.description
    ;
                   The increment for this frame for displacement setting of
                   the specified axis in millimetres.  The sum of the values
                   of '_diffrn_scan_frame_axis.displacement' and
                   '_diffrn_scan_frame_axis.displacement_increment' is the
                   angular setting of the axis at the end of the integration
                   time for this frame.
    ;
        _item.name               '_diffrn_scan_frame_axis.displacement_increment'
        _item.category_id          diffrn_scan_frame_axis
        _item.mandatory_code       no
        _item_default.value        0.0
        _item_type.code            float
        _item_units.code           'millimetres'
         save_

    save__diffrn_scan_frame_axis.displacement_rstrt_incr
        _item_description.description
    ;
                   The increment for this frame for displacement setting of
                   the specified axis in millimetres.  The sum of the values
                   of '_diffrn_scan_frame_axis.displacement' and
                   '_diffrn_scan_frame_axis.displacement_increment' and
                   '_diffrn_scan_frame_axis.displacement_rstrt_incr' is the
                   angular setting of the axis at the start of the integration
                   time for the next frame, and should equal
                   '_diffrn_scan_frame_axis.displacement' for that next frame.
    ;
        _item.name               '_diffrn_scan_frame_axis.displacement_rstrt_incr'
        _item.category_id          diffrn_scan_frame_axis
        _item.mandatory_code       no
        _item_default.value        0.0
        _item_type.code            float
        _item_units.code           'millimetres'
         save_

    save__diffrn_scan_frame_axis.frame_id
        _item_description.description
    ;
                   The value of this data item is the identifier of the
                   frame for which axis settings are being specified.

                   Multiple axes may be specified for the same value of
                   _diffrn_scan_frame.frame_id .

                   This item is a pointer to _diffrn_data_frame.id in the
                   DIFFRN_DATA_FRAME category.
    ;
        _item.name               '_diffrn_scan_frame_axis.frame_id'
        _item.category_id          diffrn_scan_frame_axis
        _item.mandatory_code       yes
         save_

    ####################
    ## ITEM_TYPE_LIST ##
    ####################
    #
    #
    #  The regular expressions defined here are not compliant
    #  with the POSIX 1003.2 standard as they include the
    #  '\n' and '\t' special characters.  These regular expressions
    #  have been tested using version 0.12 of Richard Stallman's
    #  GNU regular expression library in POSIX mode.
    #  In order to allow presentation of a regular expression
    #  in a text field concatenate any line ending in a backslash
    #  with the following line, after discarding the backslash.
    #
    #  A formal definition of the '\n' and '\t' special characters
    #  is most properly done in the DDL, but for completeness, please
    #  note that '\n' is the line termination character ('newline')
    #  and '\t' is the horizontal tab character.  There is a formal
    #  ambiguity in the use of '\n' for line termination, in that
    #  the intention is that the equivalent machine/OS-dependent line
    #  termination character sequence should be accepted as a match, e.g.
    #
    #      '\r' (control-M) under MacOS
    #      '\n' (control-J) under Unix
    #      '\r\n' (control-M control-J) under DOS and MS Windows
    #
         loop_
        _item_type_list.code
        _item_type_list.primitive_code
        _item_type_list.construct
        _item_type_list.detail
                   code      char
    '[_,.;:"&<>/\{}'`~!@#$%A-Za-z0-9*|+-]*'
    ;              code item types/single words ...
    ;
                   ucode      uchar
    '[_,.;:"&<>/\{}'`~!@#$%A-Za-z0-9*|+-]*'
    ;              code item types/single words (case insensitive)
    ;
                   line      char
    '[][ \t_(),.;:"&<>/\{}'`~!@#$%A-Za-z0-9*|+-]*'
    ;              code item types / multi-word items  ...
    ;
                   uline     uchar
    '[][ \t_(),.;:"&<>/\{}'`~!@#$%A-Za-z0-9*|+-]*'
    ;              code item types / multi-word items (case insensitive)
    ;
                   text      char
    '[][ \n\t()_,.;:"&<>/\{}'`~!@#$%?+=*A-Za-z0-9|^-]*'
    ;              text item types / multi-line text ...
    ;
                   binary    char
    ;\n--CIF-BINARY-FORMAT-SECTION--\n\
    [][ \n\t()_,.;:"&<>/\{}'`~!@#$%?+=*A-Za-z0-9|^-]*}\
    \n--CIF-BINARY-FORMAT-SECTION----
    ;
    ;              binary items are presented as MIME-like ascii-encoded
                   sections in an imgCIF.  In a CBF, raw octet streams
                   are used to convey the same information.
    ;
                   int       numb
    '-?[0-9]+'
    ;              int item types are the subset of numbers that are the negative
                   or positive integers.
    ;
                   float     numb
    '-?(([0-9]+)|([0-9]*[.][0-9]+))([(][0-9]+[)])?([eE][+-]?[0-9]+)?'
    ;              float item types are the subset of numbers that are the floating
                   numbers.
    ;
                   any       char
    '.*'
    ;              A catch all for items that may take any form...
    ;
                   yyyy-mm-dd  char
    ;\
    [0-9]?[0-9]?[0-9][0-9]-[0-9]?[0-9]-[0-9][0-9]\
    (T[0-2][0-9]:[0-5][0-9]:[0-5][0-9](.[0-9]+)([+-][0-5][0-9]:[0-5][0-9]))
    ;
    ;
                   Standard format for CIF date and time strings (see
                   http://www.iucr.orgiucr-top/cif/spec/datetime.html),
                   consisting of a yyyy-mm-dd date optionally followed by
                   the character "T" followed by a 24-hour clock time,
                   optionally followed by a signed time-zone offset.

                   The IUCr standard has been extended to allow for an optional
                   deciaml fraction on the seconds of time.

                   Time is local time if no time-zone offset is given.
    ;

    #####################
    ## ITEM_UNITS_LIST ##
    #####################

         loop_
        _item_units_list.code
        _item_units_list.detail
    #
         'metres'                 'metres'
         'centimetres'            'centimetres (metres * 10^( -2))'
         'millimetres'            'millimetres (metres * 10^( -3))'
         'nanometres'             'nanometres  (metres * 10^( -9))'
         'angstroms'              'angstroms   (metres * 10^(-10))'
         'picometres'             'picometres  (metres * 10^(-12))'
         'femtometres'            'femtometres (metres * 10^(-15))'
    #
         'reciprocal_metres'      'reciprocal metres (metres * 10^-1)'
         'reciprocal_centimetres' 'reciprocal centimetres (metres * 10^( -2)^-1)'
         'reciprocal_millimetres' 'reciprocal millimetres (metres * 10^( -3)^-1)'
         'reciprocal_nanometres'  'reciprocal nanometres  (metres * 10^( -9)^-1)'
         'reciprocal_angstroms'   'reciprocal angstroms   (metres * 10^(-10)^-1)'
         'reciprocal_picometres'  'reciprocal picometres  (metres * 10^(-12)^-1)'
    #
         'nanometres_squared'     'nanometres squared (metres * 10^( -9))^2'
         'angstroms_squared'      'angstroms squared  (metres * 10^(-10))^2'
         '8pi2_angstroms_squared' '8pi^2 * angstroms squared (metres * 10^(-10))^2'
         'picometres_squared'     'picometres squared (metres * 10^(-12))^2'
    #
         'nanometres_cubed'       'nanometres cubed (metres * 10^( -9))^3'
         'angstroms_cubed'        'angstroms cubed  (metres * 10^(-10))^3'
         'picometres_cubed'       'picometres cubed (metres * 10^(-12))^3'
    #
         'kilopascals'            'kilopascals'
         'gigapascals'            'gigapascals'
    #
         'hours'                  'hours'
         'minutes'                'minutes'
         'seconds'                'seconds'
         'microseconds'           'microseconds'
    #
         'degrees'                'degrees (of arc)'
         'degrees_squared'        'degrees (of arc) squared'
    #
         'degrees_per_minute'     'degrees (of arc) per minute'
    #
         'celsius'                'degrees (of temperature) Celsius'
         'kelvins'                'degrees (of temperature) Kelvin'
    #
         'counts'                 'counts'
         'counts_per_photon'      'counts per photon'
    #
         'electrons'              'electrons'
    #
         'electrons_squared'      'electrons squared'
    #
         'electrons_per_nanometres_cubed'
    ; electrons per nanometres cubed (metres * 10^( -9))^3
    ;
         'electrons_per_angstroms_cubed'
    ; electrons per angstroms  cubed (metres * 10^(-10))^3
    ;
         'electrons_per_picometres_cubed'
    ; electrons per picometres cubed (metres * 10^(-12))^3
    ;
         'kilowatts'              'kilowatts'
         'milliamperes'           'milliamperes'
         'kilovolts'              'kilovolts'
    #
         'arbitrary'
    ; arbitrary system of units.
    ;
    #

         loop_
        _item_units_conversion.from_code
        _item_units_conversion.to_code
        _item_units_conversion.operator
        _item_units_conversion.factor
    ###
         'metres'                   'centimetres'              '*'   1.0E+02
         'metres'                   'millimetres'              '*'   1.0E+03
         'metres'                   'nanometres'               '*'   1.0E+09
         'metres'                   'angstroms'                '*'   1.0E+10
         'metres'                   'picometres'               '*'   1.0E+12
         'metres'                   'femtometres'              '*'   1.0E+15
    #
         'centimetres'              'metres'                   '*'   1.0E-02
         'centimetres'              'millimetres'              '*'   1.0E+01
         'centimetres'              'nanometres'               '*'   1.0E+07
         'centimetres'              'angstroms'                '*'   1.0E+08
         'centimetres'              'picometres'               '*'   1.0E+10
         'centimetres'              'femtometres'              '*'   1.0E+13
    #
         'millimetres'              'metres'                   '*'   1.0E-03
         'millimetres'              'centimetres'              '*'   1.0E-01
         'millimetres'              'nanometres'               '*'   1.0E+06
         'millimetres'              'angstroms'                '*'   1.0E+07
         'millimetres'              'picometres'               '*'   1.0E+09
         'millimetres'              'femtometres'              '*'   1.0E+12
    #
         'nanometres'               'metres'                   '*'   1.0E-09
         'nanometres'               'centimetres'              '*'   1.0E-07
         'nanometres'               'millimetres'              '*'   1.0E-06
         'nanometres'               'angstroms'                '*'   1.0E+01
         'nanometres'               'picometres'               '*'   1.0E+03
         'nanometres'               'femtometres'              '*'   1.0E+06
    #
         'angstroms'                'metres'                   '*'   1.0E-10
         'angstroms'                'centimetres'              '*'   1.0E-08
         'angstroms'                'millimetres'              '*'   1.0E-07
         'angstroms'                'nanometres'               '*'   1.0E-01
         'angstroms'                'picometres'               '*'   1.0E+02
         'angstroms'                'femtometres'              '*'   1.0E+05
    #
         'picometres'               'metres'                   '*'   1.0E-12
         'picometres'               'centimetres'              '*'   1.0E-10
         'picometres'               'millimetres'              '*'   1.0E-09
         'picometres'               'nanometres'               '*'   1.0E-03
         'picometres'               'angstroms'                '*'   1.0E-02
         'picometres'               'femtometres'              '*'   1.0E+03
    #
         'femtometres'              'metres'                   '*'   1.0E-15
         'femtometres'              'centimetres'              '*'   1.0E-13
         'femtometres'              'millimetres'              '*'   1.0E-12
         'femtometres'              'nanometres'               '*'   1.0E-06
         'femtometres'              'angstroms'                '*'   1.0E-05
         'femtometres'              'picometres'               '*'   1.0E-03
    ###
         'reciprocal_centimetres'   'reciprocal_metres'        '*'   1.0E+02
         'reciprocal_centimetres'   'reciprocal_millimetres'   '*'   1.0E-01
         'reciprocal_centimetres'   'reciprocal_nanometres'    '*'   1.0E-07
         'reciprocal_centimetres'   'reciprocal_angstroms'     '*'   1.0E-08
         'reciprocal_centimetres'   'reciprocal_picometres'    '*'   1.0E-10
    #
         'reciprocal_millimetres'   'reciprocal_metres'        '*'   1.0E+03
         'reciprocal_millimetres'   'reciprocal_centimetres'   '*'   1.0E+01
         'reciprocal_millimetres'   'reciprocal_nanometres'    '*'   1.0E-06
         'reciprocal_millimetres'   'reciprocal_angstroms'     '*'   1.0E-07
         'reciprocal_millimetres'   'reciprocal_picometres'    '*'   1.0E-09
    #
         'reciprocal_nanometres'    'reciprocal_metres'        '*'   1.0E+09
         'reciprocal_nanometres'    'reciprocal_centimetres'   '*'   1.0E+07
         'reciprocal_nanometres'    'reciprocal_millimetres'   '*'   1.0E+06
         'reciprocal_nanometres'    'reciprocal_angstroms'     '*'   1.0E-01
         'reciprocal_nanometres'    'reciprocal_picometres'    '*'   1.0E-03
    #
         'reciprocal_angstroms'     'reciprocal_metres'        '*'   1.0E+10
         'reciprocal_angstroms'     'reciprocal_centimetres'   '*'   1.0E+08
         'reciprocal_angstroms'     'reciprocal_millimetres'   '*'   1.0E+07
         'reciprocal_angstroms'     'reciprocal_nanometres'    '*'   1.0E+01
         'reciprocal_angstroms'     'reciprocal_picometres'    '*'   1.0E-02
    #
         'reciprocal_picometres'    'reciprocal_metres'        '*'   1.0E+12
         'reciprocal_picometres'    'reciprocal_centimetres'   '*'   1.0E+10
         'reciprocal_picometres'    'reciprocal_millimetres'   '*'   1.0E+09
         'reciprocal_picometres'    'reciprocal_nanometres'    '*'   1.0E+03
         'reciprocal_picometres'    'reciprocal_angstroms'     '*'   1.0E+01
    ###
         'nanometres_squared'       'angstroms_squared'        '*'   1.0E+02
         'nanometres_squared'       'picometres_squared'       '*'   1.0E+06
    #
         'angstroms_squared'        'nanometres_squared'       '*'   1.0E-02
         'angstroms_squared'        'picometres_squared'       '*'   1.0E+04
         'angstroms_squared'        '8pi2_angstroms_squared'   '*'   78.9568

    #
         'picometres_squared'       'nanometres_squared'       '*'   1.0E-06
         'picometres_squared'       'angstroms_squared'        '*'   1.0E-04
    ###
         'nanometres_cubed'         'angstroms_cubed'          '*'   1.0E+03
         'nanometres_cubed'         'picometres_cubed'         '*'   1.0E+09
    #
         'angstroms_cubed'          'nanometres_cubed'         '*'   1.0E-03
         'angstroms_cubed'          'picometres_cubed'         '*'   1.0E+06
    #
         'picometres_cubed'         'nanometres_cubed'         '*'   1.0E-09
         'picometres_cubed'         'angstroms_cubed'          '*'   1.0E-06
    ###
         'kilopascals'              'gigapascals'              '*'   1.0E-06
         'gigapascals'              'kilopascals'              '*'   1.0E+06
    ###
         'hours'                    'minutes'                  '*'   6.0E+01
         'hours'                    'seconds'                  '*'   3.6E+03
         'hours'                    'microseconds'             '*'   3.6E+09
    #
         'minutes'                  'hours'                    '/'   6.0E+01
         'minutes'                  'seconds'                  '*'   6.0E+01
         'minutes'                  'microseconds'             '*'   6.0E+07
    #
         'seconds'                  'hours'                    '/'   3.6E+03
         'seconds'                  'minutes'                  '/'   6.0E+01
         'seconds'                  'microseconds'             '*'   1.0E+06
    #
         'microseconds'             'hours'                    '/'   3.6E+09
         'microseconds'             'minutes'                  '/'   6.0E+07
         'microseconds'             'seconds'                  '/'   1.0E+06
    ###
         'celsius'                  'kelvins'                  '-'     273.0
         'kelvins'                  'celsius'                  '+'     273.0
    ###
         'electrons_per_nanometres_cubed'
         'electrons_per_angstroms_cubed'                       '*'   1.0E-03
         'electrons_per_nanometres_cubed'
         'electrons_per_picometres_cubed'                      '*'   1.0E-09
    #
         'electrons_per_angstroms_cubed'
         'electrons_per_nanometres_cubed'                      '*'   1.0E+03
         'electrons_per_angstroms_cubed'
         'electrons_per_picometres_cubed'                      '*'   1.0E-06
    #
         'electrons_per_picometres_cubed'
         'electrons_per_nanometres_cubed'                      '*'   1.0E+09
         'electrons_per_picometres_cubed'
         'electrons_per_angstroms_cubed'                       '*'   1.0E+06
    ###

    ########################
    ## DICTIONARY_HISTORY ##
    ########################

         loop_
        _dictionary_history.version
        _dictionary_history.update
        _dictionary_history.revision

       1.1.3   2001-04-19
    ;
       Another typo corrections by Wilfred Li, and cleanup by HJB
    ;

       1.1.2   2001-03-06
    ;
       Several typo corrections by Wilfred Li
    ;

       1.1.1   2001-02-16
    ;
       Several typo corrections by JW
    ;

       1.1     2001-02-06
    ;
       Draft resulting from discussions on header for use at NSLS (HJB)

       + Change DIFFRN_FRAME_DATA to DIFFRN_DATA_FRAME

       + Change '_diffrn_detector_axis.id' to '_diffrn_detector_axis.detector_id'.

       + Add '_diffrn_measurement_axis.measurement_device' and change
       '_diffrn_measurement_axis.id' to '_diffrn_measurement_axis.measurement_id'.

       + Add '_diffrn_radiation.div_x_source', '_diffrn_radiation.div_y_source',
       '_diffrn_radiation.div_x_y_source', '_diffrn_radiation.polarizn_source_norm',
       '_diffrn_radiation.polarizn_source_ratio', '_diffrn_scan.date_end',
       '_diffrn_scan.date_start', '_diffrn_scan_axis.angle_rstrt_incr',
       '_diffrn_scan_axis.displacement_rstrt_incr',
       '_diffrn_scan_frame_axis.angle_increment',
       '_diffrn_scan_frame_axis.angle_rstrt_incr',
       '_diffrn_scan_frame_axis.displacement',
       '_diffrn_scan_frame_axis.displacement_increment',and
       '_diffrn_scan_frame_axis.displacement_rstrt_incr'.

       + Add _diffrn_measurement.device to category key

       + Update yyyy-mm-dd to allow optional time with fractional seconds
       for time stamps.

       + Fix typos caught by RS.

       + Add ARRAY_STRUCTURE_LIST_AXIS category, and use concept of axis sets to allow
       for coupled axes, as in spiral scans.

       + Add examples for fairly complete headers thanks to R. Sweet and P.
       Ellis.
    ;

       1.0     2000-12-21
    ;
       Release version - few typos and tidying up (BM & HJB)

       + Move ITEM_TYPE_LIST, ITEM_UNITS_LIST and DICTIONARY_HISTORY to end
       of dictionary.

       + Alphabetize dictionary.
    ;

       0.7.1   2000-09-29
    ;
       Cleanup fixes (JW)

       + Correct spelling of diffrn_measurement_axis in _axis.id

       + Correct ordering of uses of _item.mandatory_code and _item_default.value
    ;

       0.7.0   2000-09-09
    ;
       Respond to comments by I. David Brown (HJB)

       + Added further comments on '\n' and '\t'

       + Updated ITEM_UNITS_LIST by taking section from mmCIF dictionary
     and adding metres.  Changed all spelling 'meter' to 'metre' throughout.

       + Added missing enumerations to _array_structure.compression_type
     and made 'none' the default.

       + Removed parent-child relationship between _array_structure_list.index
     and _array_structure_list.precedence .

       + Improve alphabetization.

       + Fix _array_intensities_gain.esd related function.

       + Improved comments in AXIS.

       + Fixed DIFFRN_FRAME_DATA example.

       + Removed erroneous DIFFRN_MEASUREMENT example.

       + Added _diffrn_measurement_axis.id to the category key.
    ;

       0.6.0   1999-01-14
    ;
       Remove redundant information for ENC_NONE data (HJB)

       + After the D5 remove binary section identifier, size and
     compression type.

       + Add Control-L to header.
    ;
       0.5.1   1999-01-03
    ;
       Cleanup of typos and syntax errors (HJB)

       + Cleanup example details for DIFFRN_SCAN category.

       + Add missing quote marks for _diffrn_scan.id definition.
    ;

       0.5   1999-01-01
    ;
       Modifications for axis definitions and reduction of binary header (HJB)

       + Restored _diffrn_detector.diffrn_id to DIFFRN_DETECTOR KEY.

       + Added AXIS category.

       + Brought complete DIFFRN_DETECTOR and DIFFRN_MEASUREMENT categories
     in from cif_mm.dic for clarity.

       + changed _array_structure.encoding_type from type code to uline and
     added X-Binary-Element-Type to MIME header.

       + added detector beam center _diffrn_detector_element.center[1] and
    _diffrn_detector_element.center[2]

       + corrected item name of _diffrn_refln.frame_id

       + replace reference to _array_intensities.undefined by
     _array_intensities.undefined_value

       + replace references to _array_intensity.scaling with
     _array_intensities.scaling

       + added DIFFRN_SCAN... categories
    ;

       0.4   1998-08-11
    ;
       Modifications to the 0.3 imgCIF draft (HJB)

       +  Reflowed comment lines over 80 characters and corrected typos.

       +  Updated examples and descriptions of MIME encoded data.

       +  Change name to cbfext98.dic.
    ;

       0.3   1998-07-04
    ;
       Modifications for imgCIF (HJB)

       +  Added binary type, which is a text field containing a variant on
          MIME encoded data.

       +  Changed type of _array_data.data to binary and specified internal
          structure of raw binary data.

       +  Added _array_data.binary_id, and made
          _diffrn_frame_data.binary_id and _array_intensities.binary_id
          into pointers to this item.
    ;

       0.2   1997-12-02
    ;
       Modifications to the CBF draft (JW):

       +  Added category hierarchy for describing frame data developed from
          discussions at the BNL imgCIF Workshop Oct 1997.   The following
          changes were made in implementing the workshop draft.  Category
          DIFFRN_ARRAY_DATA was renamed to DIFFRN_FRAME_DATA.  Category
          DIFFRN_FRAME_TYPE was renamed to DIFFRN_DETECTOR_ELEMENT.   The
          parent item for _diffrn_frame_data.array_id was changed from
          array_structure_list.array_id to array_structure.id. Item
          _diffrn_detector.array_id was deleted.
       +  Added data item _diffrn_frame_data.binary_id to identify data groups
          within a binary section.  The formal identification of the binary section
          is still fuzzy.
    ;

       0.1   1997-01-24
    ;
       First draft of this dictionary in DDL 2.1 compliant format by John
       Westbrook (JW).  This version was adapted from the Crystallographic
       Binary File (CBF) Format Draft Proposal provided by Andy Hammersley (AH).

       Modifications to the CBF draft (JW):

       + In this version the array description has been cast in the categories
         ARRAY_STRUCTURE and ARRAY_STRUCTURE_LIST.  These categories have been
         generalized to describe array data  of arbitrary dimension.

       + Array data in this description are contained in the category ARRAY_DATA        .
         This departs from the CBF notion of data existing in some special comment.
         In this description, data is handled as an ordinary data item encapsulated
         in a character data type.   Although handling binary data this manner
         deviates from CIF conventions, it does not violate any DDL 2.1 rules.
         DDL 2.1 regular expressions can be used to define the binary
         representation which will permit some level of data validation.  In
         this version, the placeholder type code "any" has been used.
         This translates to a regular expression which will match any pattern.

         It should be noted that DDL 2.1 already supports array data objects
         although these have not been used in the current mmCIF dictionary.  It
         may be possible to use the DDL 2.1 ITEM_STRUCTURE and ITEM_STRUCTURE_LIST
         categories to provide the information that is carried in by the
         ARRAY_STRUCTURE and ARRAY_STRUCTURE_LIST.  By moving the array
         structure to the DDL level it would be possible to define an array
         type as well as a regular expression defining the data format.

       + Multiple array sections can be properly handled within a single datablock.
    ;

    #-eof-eof-eof-eof-eof-eof-eof-eof-eof-eof-eof-eof-eof-eof-eof-eof-eof-eof-eof