# # #

# # Extensions Dictionary #

    ##############################################################################
    #                                                                            #
    #                       Image CIF Dictionary (imgCIF)                        #
    #             and Crystallographic Binary File Dictionary (CBF)              #
    #            Extending the Macromolecular CIF Dictionary (mmCIF)             #
    #                                                                            #
    #                              Version 1.5.2                                 #
    #                              of 2007-05-07                                 #
    #    ###################################################################     #
    #    # *** WARNING *** THIS IS A DRAFT FOR DISCUSSSION *** WARNING *** #     #
    #    #                 SUBJECT TO CHANGE WITHOUT NOTICE                #     #
    #    #     VERSIONS WILL BE POSTED AS cif_img_1.5_DDMMMYY_draft.html   #     #
    #    #       SEND COMMENTS TO imgcif-l@iucr.org CITING THE VERSION     #     #
    #    ###################################################################     #
    #                  This draft edited by H. J. Bernstein                      #
    #                                                                            #
    #     by Andrew P. Hammersley, Herbert J. Bernstein and John D. Westbrook    #
    #                                                                            #
    # This dictionary was adapted from format discussed at the imgCIF Workshop,  #
    # held at BNL Oct 1997 and the Crystallographic Binary File Format Draft     #
    # Proposal by Andrew Hammersley.  The first DDL 2.1 Version was created by   #
    # John Westbrook.  This version was drafted by Herbert J. Bernstein and      #
    # incorporates comments by I. David Brown, John Westbrook, Brian McMahon,    #
    # Bob Sweet, Paul Ellis, Harry Powell, Wilfred Li, Gotzon Madariaga,         #
    # Frances C. Bernstein, Chris Nielsen, Nicola Ashcroft and others.           #
    ##############################################################################

    data_cif_img.dic

        _dictionary.title           cif_img.dic
        _dictionary.version         1.5.2
        _dictionary.datablock_id    cif_img.dic

    ##############################################################################
    #    CONTENTS
    #
    #        CATEGORY_GROUP_LIST
    #        SUB_CATEGORY
    #
    #        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
    #                  _array_intensities.pixel_fast_bin_size
    #                  _array_intensities.pixel_slow_bin_size
    #                  _array_intensities.pixel_binning_method
    #
    #        category  ARRAY_STRUCTURE
    #
    #                  _array_structure.byte_order
    #                  _array_structure.compression_type
    #                  _array_structure.compression_type_flag
    #                  _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
    #                  _array_structure_list_axis.fract_displacement
    #                  _array_structure_list_axis.displacement_increment
    #                  _array_structure_list_axis.fract_displacement_increment
    #                  _array_structure_list_axis.angular_pitch
    #                  _array_structure_list_axis.radial_pitch
    #                  _array_structure_list_axis.reference_angle
    #                  _array_structure_list_axis.reference_displacement
    #
    #        category  AXIS
    #
    #                  _axis.depends_on
    #                  _axis.equipment
    #                  _axis.id
    #                  _axis.offset[1]
    #                  _axis.offset[2]
    #                  _axis.offset[3]
    #                  _axis.type
    #                  _axis.system
    #                  _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
    #                  _diffrn_data_frame.details
    #
    #        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
    #                  _diffrn_detector_element.reference_center_fast
    #                  _diffrn_detector_element.reference_center_slow
    #
    #        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.reference_angle
    #                  _diffrn_scan_axis.reference_displacement
    #                  _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.reference_angle
    #                  _diffrn_scan_frame_axis.reference_displacement
    #                  _diffrn_scan_frame_axis.frame_id
    #
    #       categor    MAP
    #
    #                  _map.details
    #                  _map.diffrn_id
    #                  _map.entry_id
    #                  _map.id
    #
    #       categor    MAP_SEGMENT
    #
    #                  _map_segment.array_id
    #                  _map_segment.binary_id
    #                  _map_segment.mask_array_id
    #                  _map_segment.mask_binary_id
    #                  _map_segment.id
    #                  _map_segment.map_id
    #                  _map_segment.details
    #
    #       ***DEPRECATED*** data items
    #
    #                  _diffrn_detector_axis.id
    #                  _diffrn_measurement_axis.id
    #
    #       ***DEPRECATED*** category  DIFFRN_FRAME_DATA
    #
    #                  _diffrn_frame_data.array_id
    #                  _diffrn_frame_data.binary_id
    #                  _diffrn_frame_data.detector_element_id
    #                  _diffrn_frame_data.id
    #                  _diffrn_frame_data.details
    #
    #
    #        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.
    ;

    ##################
    ## SUB_CATEGORY ##
    ##################

         loop_
        _sub_category.id
        _sub_category.description
                  'matrix'
    ;              The collection of elements of a matrix.
    ;
                  'vector'
    ;              The collection of elements of a vector.
    ;

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

    save_ARRAY_DATA
        _category.description
    ;    Data items in the ARRAY_DATA category are the containers for
         the array data items described in the 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 is
            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 eight 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: 2
            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, the value of  _array_data.binary_id
                  should be equal to the value given for X-Binary-ID.
    ;
         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
                  '\n--CIF-BINARY-FORMAT-SECTION--' (including the
                  required initial '\n--').

                  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"'
                  or the parameter
                    'conversions="X-CBF_BYTE_OFFSET"'

                  If the parameter
                    'conversions="X-CBF_PACKED"'
                  is given it may be further modified with the parameters
                    '"uncorrelated_sections"'
                  or
                    '"flat"'

                  If the '"uncorrelated_sections"' parameter is
                  given, each section will be compressed without using
                  the prior section for averaging.

                  If the '"flat"' parameter is given, each the
                  image will be treated as one long row.

                  The Content-Transfer-Encoding may be 'BASE64',
                  'Quoted-Printable', 'X-BASE8', 'X-BASE10',
                  'X-BASE16' or 'X-BASE32K', for an imgCIF or 'BINARY'
                  for a CBF.  The octal, decimal and hexadecimal transfer
                  encodings are provided for convenience in debugging and
                  are not recommended for archiving and data interchange.

                  In a CIF, one of the parameters 'charset=us-ascii',
                  'charset=utf-8' or 'charset=utf-16' may be used on the
                  Content-Transfer-Encoding to specify the character set
                  used for the external presentation of the encoded data.
                  If no charset parameter is given, the character set of
                  the enclosing CIF is assumed.  In any case, if a BOM
                  flag is detected (FE FF for big-endian UTF-16, FF FE for
                  little-endian UTF-16 or EF BB BF for UTF-8) is detected,
                  the indicated charset will be assumed until the end of the
                  encoded data or the detection of a different BOM.  The
                  charset of the Content-Transfer-Encoding is not the character
                  set of the encoded data, only the character set of the
                  presentation of the encoded data and should be respecified
                  for each distinct STAR string.

                  In an imgCIF file, the encoded binary data begins after
                  the empty line terminating the header.  In an imgCIF file,
                  the encoded binary data ends with the terminating boundary
                  delimiter '\n--CIF-BINARY-FORMAT-SECTION----'
                  in the currently effective charset or with the '\n; '
                  that terminates the STAR string.

                  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 or 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.  An adjustment is made for
                  the deprecated binary formats in which eight bytes of binary
                  header are used for the compression type.  In this case,
                  the eight bytes used for the compression type are 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-BASE8', 'X-BASE10' or
                  'X-BASE16', the data are 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 '<'
                  or '>' 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 hexadecimal, 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 six-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 four bits of the second octet [(c1 & 3)<<4 | (c2>>4)],
                  then the bottom four 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.

                  X-BASE32K encoding is similar to BASE64 encoding, except that
                  sets of 15 octets are encoded as sets of 8 16-bit unicode
                  characters, by breaking the 120 bits into 8 15-bit quantities.
                  256 is added to each 15 bit quantity to bring it into a
                  printable uncode range.  When encoding, zero padding is used
                  to fill out the last 15 bit quantity.  If 8 or more bits of
                  padding are used, a single equals sign (hexadecimal 003D) is
                  appended.  Embedded whitespace and newlines are introduced
                  to produce lines of no more than 80 characters each.  On
                  decoding, all printable ascii characters and ascii whitespace
                  characters are ignored except for any trailing equals signs.
                  The number of trailing equals signs indicated the number of
                  trailing octets to be trimmed from the end of the decoded data.
                  (see Georgi Darakev, Vassil Litchev, Kostadin Z. Mitev, Herbert
                  J. Bernstein, 'Efficient Support of Binary Data in the XML
                  Implementation of the NeXus File Format',absract W0165,
                  ACA Summer Meeting, Honolulu, HI, July 2006).

                  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).

                  The "X-Binary-Element-Byte-Order" can specify either
                  '"BIG_ENDIAN"' or '"LITTLE_ENDIAN"' byte order of the imaage
                  data.  Only LITTLE_ENDIAN is recommended.  Processors
                  may treat BIG_ENDIAN as a warning of data that can
                  only be processed by special software.

                  The "X-Binary-Number-of-Elements" specifies the number of
                  elements (not the number of octets) in the decompressed, decoded
                  image.

                  The optional "X-Binary-Size-Fastest-Dimension" specifies the
                  number of elements (not the number of octets) in one row of the
                  fastest changing dimension of the binary data array. This
                  information must be in the MIME header for proper operation of
                  some of the decompression algorithms.

                  The optional "X-Binary-Size-Second-Dimension" specifies the
                  number of elements (not the number of octets) in one column of
                  the second-fastest changing dimension of the binary data array.
                  This information must be in the MIME header for proper operation
                  of some of the decompression algorithms.

                  The optional "X-Binary-Size-Third-Dimension" specifies the number
                  of sections for the third-fastest changing dimension of the
                  binary data array.

                  The optional "X-Binary-Size-Padding" specifies the size in
                  octets of an optional padding after the binary array data and
                  before the closing flags for a binary section.
    ;
        _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
                  ARRAY_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 ARRAY_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 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
            _array_intensities.pixel_fast_bin_size
            _array_intensities.pixel_slow_bin_size
            _array_intensities.pixel_binning_method
            image_1   linear  1.2    655535   0   2   2    hardware
    ;
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
         save_

    save__array_intensities.array_id
        _item_description.description
    ;             This item is a pointer to _array_structure.id in the
                  ARRAY_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_DATA 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
         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'
                                     'associated_esd'
        save_

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

                   'linear' is linear.

                   '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 base 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 are 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 base 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 the 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.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.pixel_fast_bin_size
        _item_description.description
    ;              The value of _array_intensities.pixel_fast_bin_size specifies
                   the number of pixels that compose one element in the direction
                   of the most rapidly varying array dimension.

                   Typical values are 1, 2, 4 or 8.  When there is 1 pixel per
                   array element in both directions, the value given for
                   _array_intensities.pixel_binning_method normally should be
                   'none'.

                   It is specified as a float to allow for binning algorithms that
                   create array elements that are not integer multiples of the
                   detector pixel size.
    ;
        _item.name              '_array_intensities.pixel_fast_bin_size'
        _item.category_id          array_intensities
        _item.mandatory_code       implicit
        _item_type.code            float
        _item_default.value        1.
         loop_
        _item_range.maximum
        _item_range.minimum
                                .   0.0
        _item_units.code           'pixels_per_element'
        save_

    save__array_intensities.pixel_slow_bin_size
        _item_description.description
    ;              The value of _array_intensities.pixel_slow_bin_size specifies
                   the number of pixels that compose one element in the direction
                   of the second most rapidly varying array dimension.

                   Typical values are 1, 2, 4 or 8.  When there is 1 pixel per
                   array element in both directions, the value given for
                   _array_intensities.pixel_binning_method normally should be
                   'none'.

                   It is specified as a float to allow for binning algorithms that
                   create array elements that are not integer multiples of the
                   detector pixel size.
    ;
        _item.name              '_array_intensities.pixel_slow_bin_size'
        _item.category_id          array_intensities
        _item.mandatory_code       implicit
        _item_type.code            float
        _item_default.value        1.
         loop_
        _item_range.maximum
        _item_range.minimum
                                .   0.0
        _item_units.code           'pixels_per_element'
        save_

    save__array_intensities.pixel_binning_method
        _item_description.description
    ;              The value of _array_intensities.pixel_binning_method specifies
                   the method used to derive array elements from multiple pixels.
    ;
        _item.name              '_array_intensities.pixel_binning_method'
        _item.category_id          array_intensities
        _item.mandatory_code       implicit
        _item_type.code            code
         loop_
        _item_enumeration.value
        _item_enumeration.detail
                                   'hardware'
    ;              The element intensities were derived from the raw data of one
                   or more pixels by used of hardware in the detector, e.g. by use
                   of shift registers in a CCD to combine pixels into super-pixels.
    ;
                                   'software'
    ;              The element intensities were derived from the raw data of more
                   than one pixel by use of software.
    ;
                                   'combined'
    ;              The element intensities were derived from the raw data of more
                   than one pixel by use of both hardware and software, as when
                   hardware binning is used in one direction and software in the
                   other.
    ;
                                   'none'
    ;              In the both directions, the data has not been binned.  The
                   number of pixels is equal to the number of elements.

                   When the value of _array_intensities.pixel_binning_method is
                   'none' the values of _array_intensities.pixel_fast_bin_size
                   and _array_intensities.pixel_slow_bin_size both must be 1.
    ;
                                   'unspecified'
    ;              The method used to derive element intensities is not specified.
    ;
        _item_default.value        'unspecified'
        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.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 that 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 VAXs 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                 ucode
         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               ucode
        _item_default.value           'none'
         loop_
        _item_enumeration.value
        _item_enumeration.detail
                                      'byte_offset'
    ;       Using the 'byte_offset' compression scheme as per A. Hammersley
            and the CBFlib manual, section 3.3.3
    ;
                                      'canonical'
    ;       Using the 'canonical' compression scheme (International Tables
            for Crystallography Volume G, Section 5.6.3.1) and CBFlib
            manual section 3.3.1
    ;
                                      'none'
    ;       Data are stored in normal format as defined by
            _array_structure.encoding_type and
            _array_structure.byte_order.
    ;
                                      'packed'
    ;       Using the 'packed' compression scheme, a CCP4-style packing
            as per J. P. Abrahams pack_c.c and CBFlib manual, section 3.3.2.
    ;
                                      'packed_v2'
    ;       Using the 'packed' compression scheme, version 2, as per
            J. P. Abrahams pack_c.c and CBFlib manual, section 3.3.2.
    ;
        save_

    save__array_structure.compression_type_flag
        _item_description.description
    ;             Flags modifying the type of data-compression method used to
                  compress the arraydata.
    ;
        _item.name                   '_array_structure.compression_type_flag'
        _item.category_id             array_structure
        _item.mandatory_code          no
        _item_type.code               ucode
         loop_
        _item_enumeration.value
        _item_enumeration.detail
                                      'uncorrelated_sections'
    ;       When applying packed or packed_v2 compression on an array with
            uncorrelated sections, do not average in points from the prior
            section.
    ;
                                      'flat'
    ;       When applying packed or packed_v2 compression on an array with
            treat the entire image as a single line set the maximum number
            of bits for an offset to 65 bits.

            The flag is included for compatibility with software prior to
            CBFlib_0.7.7, and should not be used for new data sets.

    ;

        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 754-1985 (IEEE, 1985).

                   Ref: IEEE (1985). IEEE Standard for Binary Floating-Point
                   Arithmetic. ANSI/IEEE Std 754-1985. New York: Institute of
                   Electrical and Electronics Engineers.
    ;

        _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 the
                        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 differs
                   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            code
         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 describe
         the physical settings of sets of 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 axes: one for the angular
         direction and 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 in 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
        _item_type.code            code
         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
        _item_type.code            code
         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 centre of the
                   pixel with index value 1.  If the index is specified as
                   'decreasing', this will be the centre 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-centre-to-pixel-centre 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 for this 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 centre of the
                   pixel with index value 1.  If the index is specified as
                   'decreasing', this will be the centre 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.fract_displacement
        _item_description.description
    ;              The setting of the specified axis as a decimal fraction of
                   the axis unit vector 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
                   centre of the pixel with index value 1.  If the index is
                   specified as 'decreasing', this will be the centre of the
                   pixel with maximum index value.
    ;
        _item.name               '_array_structure_list_axis.fract_displacement'
        _item.category_id          array_structure_list_axis
        _item.mandatory_code       no
        _item_default.value        0.0
        _item_type.code            float
         save_

    save__array_structure_list_axis.displacement_increment
        _item_description.description
    ;              The pixel-centre-to-pixel-centre 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.fract_displacement_increment
        _item_description.description
    ;              The pixel-centre-to-pixel-centre increment for the displacement
                   setting of the specified axis as a decimal fraction of the
                   axis unit vector.
    ;
        _item.name
            '_array_structure_list_axis.fract_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-centre-to-pixel-centre 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 scans) 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_

    save__array_structure_list_axis.reference_angle
         _item_description.description
    ;              The value of _array_structure_list_axis.reference_angle
                   specifies the setting of the angle of this axis used for
                   determining a reference beam center and a reference detector
                   distance.  It is normally expected to be identical to the
                   value of _array_structure_list.angle.

    ;
         _item.name '_array_structure_list_axis.reference_angle'
         _item.category_id          array_structure_list_axis
         _item.mandatory_code       implicit
         _item_type.code            float
         _item_units.code           'degrees'
          save_

    save__array_structure_list_axis.reference_displacement
         _item_description.description
    ;              The value of _array_structure_list_axis.reference_displacement
                   specifies the setting of the displacement of this axis used
                   for determining a reference beam center and a reference detector
                   distance.  It is normally expected to be identical to the value
                   of _array_structure_list.displacement.

    ;
         _item.name '_array_structure_list_axis.reference_displacement'
         _item.category_id          array_structure_list_axis
         _item.mandatory_code       implicit
         _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 or the axes defining the
         coordinate system of an image.

         The location of each axis is specified by two vectors: the axis
         itself, given by a  unit vector in the direction of the axis, and
         an offset to the base of the unit vector.

         The vectors defining an axis are referenced to an appropriate
         coordinate system.  The axis vector, itself, is a dimensionless
         unit vector.  Where meaningful, the offset vector is given in
         millimetres.  In coordinate systems not measured in metres,
         the offset is not specified and is taken as zero.

         The available coordinate systems are:

             The imgCIF standard laboratory coordinate system
             The direct lattice (fractional atomic coordinates)
             The orthogonal Cartesian coordinate system (real space)
             The reciprocal lattice
             An abstract orthogonal Cartesian coordinate frame

         For consistency in this discussion, we call the three coordinate
         system axes X, Y and Z.  This is appropriate for the imgCIF
         standard laboratory coordinate system, and last two Cartesian
         coordinate systems, but for the direct lattice, X corresponds
         to a, Y to b and Z to c, while for the reciprocal lattice,
         X corresponds to a*, Y to b* and Z to c*.

         For purposes of visualization, all the coordinate systems are
         taken as right-handed, i.e., using the convention that the extended
         thumb of a right hand could point along the first (X) axis, the
         straightened pointer finger could point along the second (Y) axis
         and the middle finger folded inward could point along the third (Z)
         axis.

         THE IMGCIF STANDARD LABORATORY COORDINATE SYSTEM

         The imgCIF standard laboratory coordinate system is a right-handed
         orthogonal coordinate similar to the MOSFLM coordinate system,
         but imgCIF puts Z along the X-ray beam, rather than putting X along the
         X-ray beam as in MOSFLM.

         The vectors for the imgCIF standard laboratory coordinate system
         form a right-handed Cartesian coordinate system with its origin
         in the sample or specimen.  The origin of the axis system should,
         if possible, be defined in terms of mechanically stable axes to be
         in the sample and in the beam.  If the sample goniometer or other
         sample positioner has two axes the intersection which defines a
         unique point at which the sample should be mounted to be bathed
         by the beam, that will be the origin of the axis system.  If no such
         point is defined, then the midpoint of the line of intersection
         between the sample and the center of the beam will define the origin.
         For this definition the sample positioning system will be set at
         its initial reference position for the experiment.

                                 | 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 or
         sample positioning system if the sample positioning system has an axis that
         intersects the origin and which form an angle of more than 22.5 degrees
         with the beam axis.

         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.

         If the conditions for the X-axis can be met, the coordinate system
         will be based on the goniometer or other sample positioning system
         and the beam and 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 (Leslie & Powell, 2004).  In MOSFLM,
         X is along the X-ray beam (the CBF/imgCIF Z axis) and Z is along the
         rotation axis.

         In some experimental techniques, there is no goniometer or the principal
         axis of the goniometer is at a small acute angle with respect to
         the source axis.  In such cases, other reference axes are needed
         to define a useful coordinate system.  The order of priority in
         defining directions in such cases is to use the detector, then
         gravity, then north.

         If the X-axis cannot be defined as above, then the
         direction (not the origin) of the X-axis should be parallel to the axis
         of the primary detector element corresponding to the most rapidly
         varying dimension of that detector element's data array, with its
         positive sense corresponding to increasing values of the index for
         that dimension.  If the detector is such that such a direction cannot
         be defined (as with a point detector) or that direction forms an
         angle of less than 22.5 degrees with respect to the source axis, then
         the X-axis should be chosen so that if the Y-axis is chosen
         in the direction of gravity, and the Z-axis is chosen to be along
         the source axis, a right-handed orthogonal coordinate system is chosen.
         In the case of a vertical source axis, as a last resort, the
         X-axis should be chosen to point North.

         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 centre.
         The location of the beam centre on the detector should be given in the
         DIFFRN_DETECTOR category in distortion-corrected millimetres 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, it is necessary to
         specify the location of the beam centre on the detector in terms
         of the origin of the detector, which is, of course, not coincident
         with the centre of the sample.

         The unit cell, reciprocal cell and crystallographic orthogonal
         Cartesian coordinate system are defined by the CELL and the matrices
         in the ATOM_SITES category.

         THE DIRECT LATTICE (FRACTIONAL COORDINATES)

         The direct lattice coordinate system is a system of fractional
         coordinates aligned to the crystal, rather than to the laboratory.
         This is a natural coordinate system for maps and atomic coordinates.
         It is the simplest coordinate system in which to apply symmetry.
         The axes are determined by the cell edges, and are not necessarily
         othogonal.  This coordinate system is not uniquely defined and
         depends on the cell parameters in the CELL category and the
         settings chosen to index the crystal.

         Molecules in a crystal studied by X-ray diffracraction are organized
         into a repeating regular array of unit cells.  Each unit cell is defined
         by three vectors, a, b and c.  To quote from Drenth,

         "The choice of the unit cell is not unique and therefore, guidelines
         have been established for selecting the standard basis vectors and
         the origin.  They are based on symmetry and metric considerations:

          "(1)  The axial system should be right handed.
           (2)  The basis vectors should coincide as much as possible with
           directions of highest symmetry."
           (3)  The cell taken should be the smallest one that satisfies
           condition (2)
           (4)  Of all the lattice vectors, none is shorter than a.
           (5)  Of those not directed along a, none is shorter than b.
           (6)  Of those not lying in the ab plane, none is shorter than c.
           (7)  The three angles between the basis vectors a, b and c are
           either all acute (<90°) or all obtuse (≥90°)."

         These rules do not produce a unique result that is stable under
         the assumption of experimental errors, and the the resulting cell
         may not be primitive.

         In this coordinate system, the vector (.5, .5, .5) is in the middle
         of the given unit cell.

         Grid coordinates are an important variation on fractional coordinates
         used when working with maps.  In imgCIF, the conversion from
         fractional to grid coordinates is implicit in the array indexing
         specified by _array_structure_list.dimension.  Note that this
         implicit grid-coordinate scheme is 1-based, not zero-based, i.e.
         the origin of the cell for axes along the cell edges with no
         specified _array_structure_list_axis.displacement will have
         grid coordinates of (1,1,1), i.e. array indices of (1,1,1).

         THE ORTHOGONAL CARTESIAN COORDINATE SYSTEM (REAL SPACE)

         The orthogonal Cartesian coordinate system is a transformation of
         the direct lattice to the actual physical coordinates of atoms in
         space.  It is similar to the laboratory coordinate system, but
         is anchored to and moves with the crystal, rather than being
         schored to the laboratory.  The transformation from fractional
         to orthogonal cartesian coordinates is given by the
                  _atom_sites.Cartn_transf_matrix[i][j]  and
                  _atom_sites.Cartn_transf_vector[i]
         tags.  A common choice for the matrix of the transformation is
         given in the 1992 PDB format document

                  | a      b cos(γ)   c cos(β)                         |
                  | 0      b sin(γ)   c (cos(α) - cos(β)cos(γ))/sin(γ) |
                  | 0      0          V/(a b sin(γ))                   |

         This is a convenient coordinate system in which to do fitting
         of models to maps and in which to understand the chemistry of
         a molecule.

         THE RECIPROCAL LATTICE

         The reciprocal lattice coordinate system is used for diffraction
         intensitities.  It is based on the reciprocal cell, the dual of the cell,
         in which reciprocal cell edges are derived from direct cell faces:

            a* = bc sin(α)/V  b* = ac sin(β)/V  c* = ab sin(γ)/V
            cos(α*) = (cos(β)  cos(γ) - cos(α))/(sin(β)  sin(γ))
            cos(β*)  = (cos(γ) cos(γ) - cos(β) )/(sin(α) sin(γ))
            cos(γ*) = (cos(α) cos(β)  - cos(γ))/(sin(α) sin(β))
            V = abc √(1 - cos(α)2 -  cos(β)2 - cos(γ)2
                               + 2 cos(α) cos(β) cos(γ) )

         In this form the dimensions of the reciprocal lattice are in reciprocal
         Ångstroms (&A-1).  A dimensionless form can be obtained by
         multiplying by the wavelength.  Reflections are commonly indexed against
         this coordinate system as (h, k, l) triples.

         References:

         Drenth, J., "Introduction to basic crystallography." chapter
         2.1 in Rossmann, M. G. and Arnold, E. "Crystallography of
         biological macromolecules", Volume F of the IUCr's "International
         tables for crystallography", Kluwer, Dordrecht 2001, pp 44 -- 63

         Leslie, A. G. W. and Powell, H. (2004). MOSFLM v6.11.
         MRC Laboratory of Molecular Biology, Hills Road, Cambridge, England.
         http://www.CCP4.ac.uk/dist/X-windows/Mosflm/.

         Stout, G. H. and Jensen, L. H., "X-ray structure determination",
         2nd ed., Wiley, New York, 1989, 453 pp.

         __, "PROTEIN DATA BANK ATOMIC COORDINATE AND BIBLIOGRAPHIC ENTRY
         FORMAT DESCRIPTION," Brookhaven National Laboratory, February 1992.
    ;
        _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 Stout, G. H. & Jensen, L. H. (1989). X-ray
            structure determination. A practical
            guide, 2nd ed. p. 134. New York: Wiley Interscience].

            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 shows the axis specification of the axes of a
            detector, source and gravity.  The order has been changed as a
            reminder that the ordering of presentation of tokens is not
            significant.  The centre of rotation of the detector has been taken
            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
    ;
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;       Example 3 -

            This example show the axis specification of the axes for a map,
            using fractional coordinates.  Each cell edge has been divided
            into a grid of 50 divisions in the ARRAY_STRUCTURE_LIST_AXIS
            category.  The map is using only the first octant of the grid
            in the ARRAY_STRUCTURE_LIST category.

            The fastest changing axis is the gris along A, then along B,
            and the slowest is along C.

            The map sampling is being done in the middle of each grid
            division

    ;
    ;
            loop_
            _axis.id
            _axis.system
            _axis.vector[1] _axis.vector[2] _axis.vector[3]
            CELL_A_AXIS    fractional       1 0 0
            CELL_B_AXIS    fractional       0 1 0
            CELL_C_AXIS    fractional       0 0 1

            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_id
            MAP 1 25 1 increasing CELL_A_AXIS
            MAP 1 25 2 increasing CELL_B_AXIS
            MAP 1 25 3 increasing CELL_C_AXIS

            loop_
            _array_structure_list_axis.axis_id
            _array_structure_list_axis.fract_displacement
            _array_structure_list_axis.fract_displacement_increment
            CELL_A_AXIS 0.01 0.02
            CELL_B_AXIS 0.01 0.02
            CELL_C_AXIS 0.01 0.02

    ;
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;       Example 4 -

            This example show the axis specification of the axes for a map,
            this time as orthogonal Angstroms, using the same coordinate system
            as for the atomic coordinates.  The map is sampling every 1.5
            Angstroms (1.5e-7 millimeters) in a map segment 37.5 Angstroms on
            a side.

    ;
    ;
            loop_
            _axis.id
            _axis.system
            _axis.vector[1] _axis.vector[2] _axis.vector[3]
            X    orthogonal       1 0 0
            Y    orthogonal       0 1 0
            Z    orthogonal       0 0 1

                    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_id
            MAP 1 25 1 increasing X
            MAP 2 25 2 increasing Y
            MAP 3 25 3 increasing Z

            loop_
            _array_structure_list_axis.axis_id
            _array_structure_list_axis.displacement
            _array_structure_list_axis.displacement_increment
            X 7.5e-8 1.5e-7
            Y 7.5e-8 1.5e-7
            Z 7.5e-8 1.5e-7

    ;
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
         save_

    save__axis.depends_on
        _item_description.description
    ;             The value of _axis.depends_on 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.equipment 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 three-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 three-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 three-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 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.system
        _item_description.description
    ;             The value of  _axis.system specifies the coordinate
                  system used to define the axis: 'laboratory', 'direct', 'orthogonal',
                  'reciprocal' or 'abstract'.
    ;
        _item.name                      '_axis.system'
        _item.category_id                 axis
        _item.mandatory_code              no
        _item_type.code                   ucode
        _item_default.value               laboratory
         loop_
        _item_enumeration.value
        _item_enumeration.detail

    laboratory
    ;  the axis is referenced to the imgCIF standard laboratory Cartesian
       coordinate system
    ;

    direct
    ;  the axis is referenced to the direct lattice
    ;

    orthogonal
    ;  the axis is referenced to the cell Cartesian orthogonal coordinates
    ;

    reciprocal
    ;  the axis is referenced to the reciprocal lattice
    ;

    abstract
    ;  the axis is referenced to abstract Cartesian cooridinate system
    ;

         save_

    save__axis.type
        _item_description.description
    ;             The value of _axis.type specifies the type of
                  axis:  'rotation' or '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 three-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 three-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 three-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 are
                    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
        _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_

    save__diffrn_data_frame.details
         _item_description.description
    ;              The value of _diffrn_data_frame.details should give a
                   description of special aspects of each frame of data.

                   This is an appropriate location in which to record
                   information from vendor headers as presented in those
                   headers, but it should never be used as a substitute
                   for providing the fully parsed information within
                   the appropriate imgCIF/CBF categories.
    ;
        _item.name                  '_diffrn_data_frame.details'
        _item.category_id             diffrn_data_frame
        _item.mandatory_code          no
        _item_aliases.alias_name    '_diffrn_frame_data.details'
        _item_aliases.dictionary      cif_img.dic
        _item_aliases.version         1.4
        _item_type.code               text
         loop_
        _item_examples.case
        _item_examples.detail
    ;
     HEADER_BYTES = 512;
     DIM = 2;
     BYTE_ORDER = big_endian;
     TYPE = unsigned_short;
     SIZE1 = 3072;
     SIZE2 = 3072;
     PIXEL_SIZE = 0.102588;
     BIN = 2x2;
     DETECTOR_SN = 901;
     TIME = 29.945155;
     DISTANCE = 200.000000;
     PHI = 85.000000;
     OSC_START = 85.000000;
     OSC_RANGE = 1.000000;
     WAVELENGTH = 0.979381;
     BEAM_CENTER_X = 157.500000;
     BEAM_CENTER_Y = 157.500000;
     PIXEL SIZE = 0.102588;
     OSCILLATION RANGE = 1;
     EXPOSURE TIME = 29.9452;
     TWO THETA = 0;
     BEAM CENTRE = 157.5 157.5;
    ;
    ;               Example of header information extracted from an ADSC Quantum
                    315 detector header by CBFlib_0.7.6.  Image provided by Chris
                    Nielsen of ADSC from a data collection at SSRL beamline 1-5.
    ;
          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        'slow mode'
         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
        _item_type.code               code
         save_

    save__diffrn_detector.dtime
        _item_description.description
    ;              The deadtime in microseconds of the detector(s) 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
        _item_type.code               code
         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, giving more detailed information
                  in ARRAY_STRUCTURE_LIST and ARRAY_STRUCTURE_LIST_AXIS
                  is preferable to simply providing the centre of the
                  detector element.
    ;
        _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 centre is slightly displaced from 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.detector_id
            _diffrn_detector_element.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 centre in
                  millimetres from the (0, 0) (lower-left) corner of the
                  detector element viewed from the sample side.

                  The X and Y axes are the laboratory coordinate system
                  coordinates defined in the AXIS category measured
                  when all positioning axes for the detector are at their zero
                  settings.  If the resulting X or Y axis is then orthogonal to the
                  detector, the Z axis is used instead of the orthogonal axis.

    ;
        _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 centre in
                  millimetres from the (0, 0) (lower-left) corner of the
                  detector element viewed from the sample side.

                  The X and Y axes are the laboratory coordinate system
                  coordinates defined in the AXIS category measured
                  when all positioning axes for the detector are at their zero
                  settings.  If the resulting X or Y axis is then orthogonal to the
                  detector, the Z axis is used instead of the orthogonal axis.

    ;
        _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_

    save__diffrn_detector_element.reference_center_fast
         _item_description.description
    ;             The value of _diffrn_detector_element.reference_center_fast is
                  the fast index axis beam center position relative to the detector
                  element face in millimetres along that from the first pixel to
                  the point at which the Z-axis (which should be colinear with the
                  beam) intersects the face of the detector, if in fact is does.
                  At the time of the measurement all settings of the detector
                  positioner should be at their reference settings.  If more than
                  one reference setting has been used the value given whould be
                  representive of the beam center as determined from the ensemble
                  of settings.

                  It is important to note that the sense of the axis is used,
                  rather than the sign of the pixel-to-pixel increments.

    ;
         _item.name '_diffrn_detector_element.reference_center_fast'
         _item.category_id             diffrn_detector_element
         _item.mandatory_code          no
         _item_type.code               float
         _item_units.code              millimetres

         save_

    save__diffrn_detector_element.reference_center_slow
         _item_description.description
    ;             The value of _diffrn_detector_element.reference_center_slow is
                  the slow index axis beam center position relative to the detector
                  element face in millimetres along that from the first pixel to
                  the point at which the Z-axis (which should be colinear with the
                  beam) intersects the face of the detector, if in fact is does.
                  At the time of the measurement all settings of the detector
                  positioner should be at their reference settings.  If more than
                  one reference setting has been used the value givien whould be
                  representive of the beam center as determined from the ensemble
                  of settings.

                  It is important to note that the sense of the axis is used,
                  rather than the sign of the pixel-to-pixel increments.

    ;
         _item.name '_diffrn_detector_element.reference_center_slow'
         _item.category_id             diffrn_detector_element
         _item.mandatory_code          no
         _item_type.code               float
         _item_units.code              millimetres

         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
        ; 440 frames, 0.20 degrees, 150 sec, detector distance 12 cm, detector
          angle 22.5 degrees
        ;
    ;
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;     Example 2 - based on data set TOZ of Willis, Beckwith & Tozer
                      [Acta Cryst. (1991), 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'
                                     'home-made'
         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
        _item_type.code               code
         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 the 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
        _item_type.code               text
         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.mandatory_code          implicit
        _item_aliases.alias_name    '_diffrn_measurement_axis.id'
        _item_aliases.dictionary      cif_img.dic
        _item_aliases.version         1.0
        _item_type.code               code
         save_

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

    save_DIFFRN_RADIATION
        _category.description
    ;              Data items in the DIFFRN_RADIATION category describe
                   the radiation used for measuring diffraction intensities,
                   its collimation and monochromatization 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
                    [Acta Cryst. (1991), 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
        _item_type.code               code
         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 X-ray beam as it illuminates
                   the sample (or specimen) after all monochromation and
                   collimation.

                   This is the standard uncertainty (e.s.d.)  of the directions of
                   photons in the XZ plane around the mean source beam
                   direction.

                   Note that for some synchrotrons this value is specified
                   in milliradians, in which case a conversion is needed.
                   To convert a value in milliradians to a value in degrees,
                   multiply by 0.180 and divide by \p.
    ;
        _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 X-ray beam as it illuminates
                   the sample (or specimen) after all monochromation and
                   collimation.

                   This is the standard uncertainty (e.s.d.) of the directions
                   of photons in the YZ plane around the mean source beam
                   direction.

                   Note that for some synchrotrons this value is specified
                   in milliradians, in which case a conversion is needed.
                   To convert a value in milliradians to a value in degrees,
                   multiply by 0.180 and divide by \p.
    ;
        _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 X-ray 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
                   direction of each photon in XZ plane times the deviations
                   of the direction of the same photon in the YZ plane
                   around the mean source beam direction.  This will be zero
                   for uncorrelated crossfire.

                   Note that some synchrotrons, this value is specified 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 \p^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
                   monochromator 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 polarization 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           90.0  90.0
                                      90.0 -90.0
                                     -90.0 -90.0
        _item_type.code               float
        _item_units.code              degrees
         save_

    save__diffrn_radiation.polarisn_ratio
        _item_description.description
    ;              Polarization ratio of the diffraction beam incident on the
                   crystal. This is the ratio of the perpendicularly polarized to
                   the parallel polarized 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 monochromater.

                   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 XZ 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 the plane of the normal to the
                   plane of polarization.

                   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 is to be taken
                   as the XZ plane and the normal is parallel to the Y axis.

                   Thus, if there was complete polarization in the plane of
                   polarization, the value of
                   _diffrn_radiation.polarizn_source_ratio would be 1, and
                   for an unpolarized beam
                   _diffrn_radiation.polarizn_source_ratio 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 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
                   Otwinowski & Minor (1997).

                   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.

                   Reference: Otwinowski, Z. & Minor, W. (1997). 'Processing of
                   X-ray diffraction data collected in oscillation mode.' Methods
                   Enzymol. 276, 307-326.
    ;
        _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
                   recommended that this be given so that the
                   probe radiation is clearly specified.
    ;
        _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 the 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.category_id             diffrn_radiation
        _item.mandatory_code          yes
        _item_type.code               code
         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.  In this example, three rotation axes and one translation axis
       at nonzero values are specified, with one axis stepping.  There is no
       reason why more axes could not have been specified to step. Range
       information has been specified, but note that it can be calculated from
       the  number of frames and the increment, so the data item
       _diffrn_scan_axis.angle_range could be dropped.

       Both the sweep data and the data for a single frame are specified.

       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 adjustments are made to
       scan times and nonlinear 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. J. Ellis &
       H. J. Bernstein).

       A detector is placed 240 mm along the Z axis from the goniometer.
       This leads to a choice:  either the axes of
       the detector are defined at the origin, and then a Z setting of -240
       is entered, or the axes are defined with the necessary Z offset.
       In this case, the setting is used and the offset is left as zero.
       This axis is called DETECTOR_Z.

       The axis for positioning the detector in the Y direction depends
       on the detector Z axis.  This axis is called DETECTOR_Y.

       The axis for positioning the detector in the X direction depends
       on the detector Y axis (and therefore on the detector Z axis).
       This axis is called DETECTOR_X.

       This detector may be rotated around the Y axis.  This rotation axis
       depends on the three translation axes.  It is called DETECTOR_PITCH.

       A coordinate system is defined 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 centre 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.detector_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. J. Ellis & H. J. Bernstein).

       A detector is placed 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 from the outside edge in.

       The axis for positioning the detector in the Y direction depends
       on the detector Z axis.  This axis is called DETECTOR_Y.

       The axis for positioning the detector in the X direction depends
       on the detector Y axis (and therefore on the detector Z axis).
       This axis is called DETECTOR_X.

       This detector may be rotated around the Y axis.  This rotation axis
       depends on the three translation axes.  It is called DETECTOR_PITCH.

       A coordinate system is defined on the face of the detector in
       terms of a coupled rotation axis and radial scan axis to form
       a spiral scan.  The rotation axis is called  ELEMENT_ROT  and the
       radial axis is called ELEMENT_RAD.  A 150 micrometre radial pitch
       and a 75 micrometre 'constant velocity' angular pitch are assumed.

       Indexing is carried out first on the rotation axis and the radial axis
       is made to be 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.detector_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
        _item_type.code            code
         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
        _item_type.code            code
         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
        _item_type.code            code
         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
        _item_type.code            code
         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
                   _diffrn_scan_frame_axis.angle_increment. 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 a given frame.  If the individual frame values
                   vary, then the value of
                   _diffrn_scan_axis.angle_increment will be
                   representative
                   of the ensemble of values of
                   _diffrn_scan_frame_axis.angle_increment (e.g.
                   the mean).
    ;
        _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
                   _diffrn_scan_frame_axis.angle_rstrt_incr.  The
                   sum of the values of _diffrn_scan_frame_axis.angle,
                   _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 relative to a given frame and
                   should equal _diffrn_scan_frame_axis.angle for this
                   next frame.   If the individual frame values
                   vary, then the value of
                   _diffrn_scan_axis.angle_rstrt_incr will be
                   representative
                   of the ensemble of values of
                   _diffrn_scan_frame_axis.angle_rstrt_incr (e.g.
                   the mean).
    ;
        _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.
                   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 a given frame.  If the individual frame values
                   vary, then the value of
                   _diffrn_scan_axis.displacement_increment will be
                   representative
                   of the ensemble of values of
                   _diffrn_scan_frame_axis.displacement_increment (e.g.
                   the mean).
    ;
        _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.
                   The sum of the values of
                   _diffrn_scan_frame_axis.displacement,
                   _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 relative to a given frame and
                   should equal _diffrn_scan_frame_axis.displacement
                   for this next frame.  If the individual frame values
                   vary, then the value of
                   _diffrn_scan_axis.displacement_rstrt_incr will be
                   representative
                   of the ensemble of values of
                   _diffrn_scan_frame_axis.displacement_rstrt_incr (e.g.
                   the mean).
    ;
        _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_

    save__diffrn_scan_axis.reference_angle
         _item_description.description
    ;              The setting of the specified axis in degrees
                   against which measurements of the reference beam center
                   and reference detector distance should be made.

                   In general, this will agree with
                   _diffrn_scan_frame_axis.reference_angle.

                   If the individual frame values vary, then the value of
                   _diffrn_scan_axis.reference_angle will be
                   representative of the ensemble of values of
                   _diffrn_scan_frame_axis.reference_angle (e.g.
                   the mean).

                   If not specified, the value defaults to zero.
    ;
         _item.name                 '_diffrn_scan_axis.reference_angle'
         _item.category_id          diffrn_scan_axis
         _item.mandatory_code       implicit
         _item_default.value        0.0
         _item_type.code            float
         _item_units.code           'degrees'
          save_

    save__diffrn_scan_axis.reference_displacement
         _item_description.description
    ;              The setting of the specified axis in millimetres
                   against which measurements of the reference beam center
                   and reference detector distance should be made.

                   In general, this will agree with
                   _diffrn_scan_frame_axis.reference_displacement.

                   If the individual frame values vary, then the value of
                   _diffrn_scan_axis.reference_displacement will be
                   representative of the ensemble of values of
                   _diffrn_scan_frame_axis.reference_displacement (e.g.
                   the mean).

                   If not specified, the value defaults to to the value of
                   _diffrn_scan_axis.displacement.
    ;
         _item.name                 '_diffrn_scan_axis.reference_displacement'
         _item.category_id          diffrn_scan_axis
         _item.mandatory_code       implicit
         _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 relationships of particular frames to scans.
    ;
        _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
        _item_type.code            code
         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 it 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
        _item_type.code          code
         save_

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

    save_DIFFRN_SCAN_FRAME_AXIS
        _category.description
    ;    Data items in the DIFFRN_SCAN_FRAME_AXIS category describe the
         settings of axes for particular frames.  Unspecified axes are
         assumed to be at their zero points.  If, for any given frame,
         nonzero 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
        _item_type.code            code
         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 the 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 the angular setting of
                   the specified axis in degrees.  The sum of the values
                   of _diffrn_scan_frame_axis.angle,
                   _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 this 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 the 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 the displacement setting of
                   the specified axis in millimetres.  The sum of the values
                   of _diffrn_scan_frame_axis.displacement,
                   _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 this 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
        _item_type.code            code
         save_

    save__diffrn_scan_frame_axis.reference_angle
         _item_description.description
    ;              The setting of the specified axis in degrees
                   against which measurements of the reference beam center
                   and reference detector distance should be made.

                   This is normally the same for all frames, but the
                   option is provided here of making changes when
                   needed.

                   If not provided, it is assumed to be zero.
    ;
         _item.name               '_diffrn_scan_frame_axis.reference_angle'
         _item.category_id          diffrn_scan_frame_axis
         _item.mandatory_code       implicit
         _item_default.value        0.0
         _item_type.code            float
         _item_units.code           'degrees'
          save_

    save__diffrn_scan_frame_axis.reference_displacement
         _item_description.description
    ;              The setting of the specified axis in millimetres for this
                   frame against which measurements of the reference beam center
                   and reference detector distance should be made.

                   This is normally the same for all frames, but the
                   option is provided here of making changes when
                   needed.

                   If not provided, it is assumed to be equal to
                   _diffrn_scan_frame_axis.displacement.
    ;
         _item.name               '_diffrn_scan_frame_axis.reference_displacement'
         _item.category_id          diffrn_scan_frame_axis
         _item.mandatory_code       implicit
         _item_type.code            float
         _item_units.code           'millimetres'
          save_

    #######
    # MAP #
    #######

    save_MAP
        _category.description
    ;             Data items in the MAP category record
                  the details of a maps. Maps record values of parameters,
                  such as density, that are functions of position within
                  a cell or are functions of orthogonal coordinates in
                  three space.

                  A map may is composed of one or more map segments
                  specified in the MAP_SEGMENT category.

                  Examples are given in the MAP_SEGMENT category.
    ;
        _category.id                   map
        _category.mandatory_code       no
         loop_
        _category_key.name             '_map.id'
                                       '_map.diffrn_id'
                                       '_map.entry_id'
        loop_
        _category_group.id             'inclusive_group'
                                       'array_data_group'
        loop_
        _category_examples.detail
        _category_examples.case
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;   Example 1 - Identifying an observed density map
                    and a calculated density map
    ;
    ;

            loop_
            _map.id
            _map.details

            rho_calc
       ;
            density calculated from F_calc derived from the ATOM_SITE list
       ;
            rho_obs
       ;
            density combining the observed structure factors with the
            calculated phases
       ;
    ;

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

    save__map.details
         _item_description.description
    ;              The value of _map.details should give a
                   description of special aspects of each map.

    ;
        _item.name                  '_map.details'
        _item.category_id             map
        _item.mandatory_code          no
        _item_type.code               text
         loop_
        _item_examples.case
        _item_examples.detail
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;   Example 1 - Identifying an observed density map
                    and a calculated density map
    ;
    ;

            loop_
            _map.id
            _map.details

            rho_calc
        ;
            density calculated from F_calc derived from the ATOM_SITE list
        ;
            rho_obs
        ;
            density combining the observed structure factors with the
            calculated phases
        ;
    ;

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

    save__map.diffrn_id
        _item_description.description
    ;             This item is a pointer to _diffrn.id in the
                  DIFFRN category.
    ;
        _item.name                  '_map.diffrn_id'
        _item.category_id             map
        _item.mandatory_code          implicit
        _item_type.code               code
         save_

    save__map.entry_id
        _item_description.description
    ;             This item is a pointer to _entry.id in the
                  ENTRY category.
    ;
        _item.name                  '_map.entry_id'
        _item.category_id             map
        _item.mandatory_code          implicit
        _item_type.code               code
         save_

    save__map.id
        _item_description.description
    ;             The value of _map.id must uniquely identify
                  each map for the given diffrn.id or entry.id.
    ;
         loop_
        _item.name
        _item.category_id
        _item.mandatory_code
               '_map.id'                map          yes
               '_map_segment.id'        map_segment  yes
        _item_type.code               code
         loop_
        _item_linked.child_name
        _item_linked.parent_name
               '_map_segment.id'        '_map.id'
         save_

    ###########################
    # MAP_SEGMENT #
    ###########################

    save_MAP_SEGMENT
        _category.description
    ;             Data items in the MAP_SEGMENT category record
                  the details about each segment (section or brick) of a map.
    ;
        _category.id                   map_segment
        _category.mandatory_code       no
         loop_
        _category_key.name             '_map_segment.id'
                                       '_map_segment.map_id'
        loop_
        _category_group.id             'inclusive_group'
                                       'array_data_group'
        loop_
        _category_examples.detail
        _category_examples.case
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;   Example 1 - Identifying an observed density map
                    and a calculated density map, each consisting of one
                    segment, both using the same array structure
                    and mask.
    ;
    ;

            loop_
            _map.id
            _map.details

            rho_calc
         ;
            density calculated from F_calc derived from the ATOM_SITE list
         ;
            rho_obs
         ;
            density combining the observed structure factors with the
            calculated phases
         ;

            loop_
            _map_segment.map_id
            _map_segment.id
            _map_segment.array_id
            _map_segment.binary_id
            _map_segment.mask_array_id
            _map_segment.mask_binary_id
            rho_calc rho_calc map_structure 1 mask_structure 1
            rho_obs  rho_obs  map_structure 2 mask_structure 1
    ;

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

    save__map_segment.array_id
        _item_description.description
    ;             The value of _map_segment.array_id identifies the array structure
                  into which the map is organized.

                  This item is a pointer to _array_structure.id in the
                  ARRAY_STRUCTURE category.
    ;
        _item.name                  '_map_segment.array_id'
        _item.category_id             map_segment
        _item.mandatory_code          yes
        _item_type.code               code
         save_

    save__map_segment.binary_id
        _item_description.description
    ;             The value of _map_segment.binary_id distinguishes the particular
                  set of data organized according to _map_segment.array_id in
                  which the data values of the map are stored.

                  This item is a pointer to _array_data.binary_id in the
                  ARRAY_DATA category.
    ;
        _item.name                  '_map_segment.binary_id'
        _item.category_id             map_segment
        _item.mandatory_code          implicit
        _item_type.code               int
         save_

    save__map_segment.mask_array_id
        _item_description.description
    ;             The value of _map_segment.mask_array_id, if given, the array
                  structure into which the mask for the map is organized.  If no
                  value is given, then all elements of the map are valid.  If a
                  value is given, then only elements of the map for which the
                  corresponding element of the mask is non-zero are valid.  The
                  value of _map_segment.mask_array_id differs from the value of
                  _map_segment.array_id in order to permit the mask to be given
                  as, say, unsigned 8-bit integers, while the map is given as
                  a data type with more range.  However, the two array structures
                  must be aligned, using the same axes in the same order with the
                  same displacements and increments

                  This item is a pointer to _array_structure.id in the
                  ARRAY_STRUCTURE category.
    ;
        _item.name                  '_map_segment.mask_array_id'
        _item.category_id             map_segment
        _item.mandatory_code          no
        _item_type.code               code
         save_

    save__map_segment.mask_binary_id
        _item_description.description
    ;             The value of _map_segment.mask_binary_id identifies the
                  particular set of data organized according to
                  _map_segment.mask_array_id specifying the mask for the map.

                  This item is a pointer to _array_data.mask_binary_id in the
                  ARRAY_DATA category.
    ;
        _item.name                  '_map_segment.mask_binary_id'
        _item.category_id             map_segment
        _item.mandatory_code          implicit
        _item_type.code               int
         save_

    save__map_segment.id
        _item_description.description
    ;             The value of _map_segment.id must uniquely
                  identify each segment of a map.
    ;
         loop_
        _item.name
        _item.category_id
        _item.mandatory_code
               '_map_segment.id'
               map_segment
               yes
        _item_type.code               code
         loop_
        _item_linked.child_name
        _item_linked.parent_name
               '_map_data_frame.map_segment_id'
               '_map_segment.id'

         save_

    save__map_segment.map_id
        _item_description.description
    ;              This item is a pointer to _map.id
                   in the MAP category.
    ;
        _item.name                  '_map_segment.map_id'
        _item.category_id             map_segment
        _item.mandatory_code          yes
        _item_type.code               code
         save_

    save__map_segment.details
         _item_description.description
    ;              The value of _map_segment.details should give a
                   description of special aspects of each segment of a map.

    ;
        _item.name                  '_map_segment.details'
        _item.category_id             map_segment
        _item.mandatory_code          no
        _item_type.code               text
         loop_
        _item_examples.case
        _item_examples.detail
    ;               Example to be provided
    ;
    ;

    ;
          save_

    ########################   DEPRECATED DATA ITEMS ########################

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

                   DEPRECATED -- DO NOT USE
    ;
        _item.name                  '_diffrn_detector_axis.id'
        _item.category_id             diffrn_detector_axis
        _item.mandatory_code          yes
        _item_type.code               code
         save_

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

                   DEPRECATED -- DO NOT USE
    ;
        _item.name                  '_diffrn_measurement_axis.id'
        _item.category_id             diffrn_measurement_axis
        _item.mandatory_code          yes
        _item_type.code               code
         save_

    #########################   DEPRECATED CATEGORY #########################
    #####################
    # DIFFRN_FRAME_DATA #
    #####################

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

                  The items in this category are now in the
                  DIFFRN_DATA_FRAME category.

                  The items in the DIFFRN_FRAME_DATA category
                  are now deprecated.  The items from this category
                  are provided as aliases in the 1.0 dictionary
                  or, in the case of _diffrn_frame_data.details,
                  in the 1.4 dictionary.  THESE ITEMS SHOULD NOT
                  BE USED FOR NEW WORK.

                  The items from the old category are provided
                  in this dictionary for completeness
                  but should not be used or cited.  To avoid
                  confusion, the example has been removed
                  and the redundant parent-child links to other
                  categories have been removed.
    ;
        _category.id                   diffrn_frame_data
        _category.mandatory_code       no
         loop_
        _category_key.name             '_diffrn_frame_data.id'
                                       '_diffrn_frame_data.detector_element_id'
        loop_
        _category_group.id             'inclusive_group'
                                       'array_data_group'
        loop_
        _category_examples.detail
        _category_examples.case
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;
        THE DIFFRN_FRAME_DATA category is deprecated and should not be used.
    ;
    ;
           # EXAMPLE REMOVED #
    ;
    # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        save_

    save__diffrn_frame_data.array_id
        _item_description.description
    ;             This item is a pointer to _array_structure.id in the
                  ARRAY_STRUCTURE category.

                  DEPRECATED -- DO NOT USE
    ;
        _item.name                  '_diffrn_frame_data.array_id'
        _item.category_id             diffrn_frame_data
        _item.mandatory_code          yes
        _item_type.code               code
         save_

    save__diffrn_frame_data.binary_id
        _item_description.description
    ;             This item is a pointer to _array_data.binary_id in the
                  ARRAY_STRUCTURE category.

                  DEPRECATED -- DO NOT USE
    ;
        _item.name                  '_diffrn_frame_data.binary_id'
        _item.category_id             diffrn_frame_data
        _item.mandatory_code          implicit
        _item_type.code               int
         save_

    save__diffrn_frame_data.detector_element_id
        _item_description.description
    ;             This item is a pointer to _diffrn_detector_element.id
                  in the DIFFRN_DETECTOR_ELEMENT category.

                  DEPRECATED -- DO NOT USE
    ;
        _item.name                  '_diffrn_frame_data.detector_element_id'
        _item.category_id             diffrn_frame_data
        _item.mandatory_code          yes
        _item_type.code               code
         save_

    save__diffrn_frame_data.id
        _item_description.description
    ;             The value of _diffrn_frame_data.id must uniquely identify
                  each complete frame of data.

                  DEPRECATED -- DO NOT USE
    ;
         loop_
        _item.name
        _item.category_id
        _item.mandatory_code
               '_diffrn_frame_data.id'        diffrn_frame_data  yes
        _item_type.code               code
         save_

    save__diffrn_frame_data.details
         _item_description.description
    ;             The value of _diffrn_data_frame.details should give a
                  description of special aspects of each frame of data.

                  DEPRECATED -- DO NOT USE
    ;
         _item.name                  '_diffrn_frame_data.details'
         _item.category_id             diffrn_frame_data
         _item.mandatory_code          no
         _item_type.code               text
          save_

    ################ END DEPRECATED SECTION ###########

    ####################
    ## 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|^-]*'
    ;              char item types / multi-word items ...
    ;
                   uline     uchar
                   '[][ \t_(),.;:"&<>/\{}'`~!@#$%?+=*A-Za-z0-9|^-]*'
    ;              char 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
                   point 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.org/iucr-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
                   decimal fraction on the seconds of time.

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

                   Note that this type extends the mmCIF yyyy-mm-dd type
                   but does not conform to the mmCIF yyyy-mm-dd:hh:mm
                   type that uses a ':' in place if the 'T' specified
                   by the IUCr standard.  For reading, both forms should
                   be accepted,  but for writing, only the IUCr form should
                   be used.

                   For maximal compatibility, the special time zone
                   indicator 'Z' (for 'zulu') should be accepted on
                   reading in place of '+00:00' for GMT.
    ;

    #####################
    ## 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^(-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'
           '8\p^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 (electrons/(metres * 10^( -9)^)^(-3)^)
    ;
         'electrons_per_angstroms_cubed'
    ; electrons per \%Angstroms cubed (electrons/(metres * 10^(-10)^)^(-3)^)
    ;
         'electrons_per_picometres_cubed'
    ; electrons per picometres cubed (electrons/(metres * 10^(-12)^)^(-3)^)
    ;
         'kilowatts'              'kilowatts'
         'milliamperes'           'milliamperes'
         'kilovolts'              'kilovolts'
    #
         'pixels_per_element'     '(image) pixels per (array) element'
    #
         '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.5.2   2007-05-06

    ;  Further clarifications of the coordinate system. (HJB)
    ;

       1.5.1   2007-04-26

    ;  Improve defintion of X-axis to cover the case of no goniometer
       and clean up more line folds (HJB)
    ;

       1.5     2007-07-25

    ;  This is a cummulative list of the changes proposed since the
       imgCIF workshop in Hawaii in July 2006.  It is the result
       of contributions by H. J. Bernstein, A. Hammersley,
       J. Wright and W. Kabsch.

       2007-02-19 Consolidated changes (edited by HJB)
         + Added new data items
           '_array_structure.compression_type_flag',
           '_array_structure_list_axis.fract_displacement',
           '_array_structure_list_axis.displacement_increment',
           '_array_structure_list_axis.reference_angle',
           '_array_structure_list_axis.reference_displacement',
           '_axis.system',
           '_diffrn_detector_element.reference_center_fast',
           '_diffrn_detector_element.reference_center_slow',
           '_diffrn_scan_axis.reference_angle',
           '_diffrn_scan_axis.reference_displacement',
           '_map.details', '_map.diffrn_id',
           '_map.entry_id', '_map.id',
           '_map_segment.array_id', '_map_segment.binary_id',
           '_map_segment.mask_array_id', '_map_segment.mask_binary_id',
           '_map_segment.id', '_map_segment.map_id',
           '_map_segment.details.
         + Change type of
           '_array_structure.byte_order' and
           '_array_structure.compression_type'
           to ucode to make these values case-insensitive
         + Add values 'packed_v2' and 'byte_offset' to enumeration of values for
           '_array_structure.compression_type'
         + Add to defintions for the binary data type to handle new compression types, maps,
           and a variety of new axis types.
        2007-07-25 Cleanup of typos for formal release (HJB)
         + Corrected text fields for reference_ tag descriptions that
           were off by one column
         + Fix typos in comments listing fract_ tags
         + Changed name of release from 1.5_DRAFT to 1.5
         + Fix unclosed text fields in various map definitions

    ;

       1.4     2006-07-04

    ;  This is a change to reintegrate all changes made in the course of
       publication of ITVG, by the RCSB from April 2005 through
       August 2008 and changes for the 2006 imgCIF workshop in
       Hawaii.

       2006-07-04 Consolidated changes for the 2006 imgCIF workshop (edited by HJB)
         + Correct type of '_array_structure_list.direction' from 'int' to 'code'.
         + Added new data items suggested by CN
           '_diffrn_data_frame.details'
           '_array_intensities.pixel_fast_bin_size',
           '_array_intensities.pixel_slow_bin_size and
           '_array_intensities.pixel_binning_method
         + Added deprecated item for completeness
           '_diffrn_frame_data.details'
         + Added entry for missing item in contents list
           '_array_structure_list_axis.displacement'
         + Added new MIME type X-BASE32K based on work by VL, KM, GD, HJB
         + Correct description of MIME boundary delimiter to start in
           column 1.
         + General cleanup of text fields to conform to changes for ITVG
           by removing empty lines at start and finish of text field.
         + Amend example for ARRAY_INTENSITIES to include binning.
         + Add local copy of type specification (as 'code') for all children
           of '_diffrn.id'.
         + For consistency, change all references to 'pi' to '\p' and all
           references to 'Angstroms' to '\%Angstroms'.
         + Clean up all powers to use IUCr convention of '^power^', as in
           '10^3^' for '10**3'.
         + Update 'yyyy-mm-dd' type regex to allow truncation from the right
           and improve comments to explain handling of related mmCIF
           'yyyy-mm-dd:hh:mm' type, and use of 'Z' for GMT time zone.

       2005-03-08 and
       2004-08-08 fixed cases where _item_units.code  used
                  instead of _item_type.code (JDW)
       2004-04-15 fixed item ordering in
                   _diffrn_measurement_axis.measurement_id
                   added sub_category 'vector' (JDW)
    ;

       1.3.2   2005-06-25

    ;  2005-06-25 ITEM_TYPE_LIST: code, ucode, line, uline regexps updated
                  to those of current mmCIF; float modified by allowing integers
                  terminated by a point as valid. The 'time' part of
                  yyyy-mm-dd types made optional in the regexp. (BM)

       2005-06-17 Minor corrections as for proofs for IT G Chapter 4.6
       (NJA)

       2005-02-21  Minor corrections to spelling and punctuation
       (NJA)

       2005-01-08 Changes as per Nicola Ashcroft.
       + Updated example 1 for DIFFRN_MEASUREMENT to agree with mmCIF.
       + Spelled out "micrometres" for "um" and "millimetres" for "mm".
       + Removed phrase "which may be stored" from ARRAY_STRUCTURE
         description.
       + Removed unused 'byte-offsets' compressions and updated
         cites to ITVG for '_array_structure.compression_type'.
       (HJB)
    ;

       1.3.1   2003-08-13
    ;
       Changes as per Frances C. Bernstein.
       + Identify initials.
       + Adopt British spelling for centre in text.
       + Set \p and \%Angstrom and powers.
       + Clean up commas and unclear wordings.
       + Clean up tenses in history.
       Changes as per Gotzon Madariaga.
       + Fix the ARRAY_DATA example to align '_array_data.binary_id'
       and X-Binary-ID.
       + Add a range to '_array_intensities.gain_esd'.
       + In the example of DIFFRN_DETECTOR_ELEMENT,
       '_diffrn_detector_element.id' and
       '_diffrn_detector_element.detector_id' interchanged.
       + Fix typos for direction, detector and axes.
       + Clarify description of polarisation.
       + Clarify axes in '_diffrn_detector_element.center[1]'
        '_diffrn_detector_element.center[2]'.
       + Add local item types for items that are pointers.
       (HJB)
    ;

       1.3.0   2003-07-24
    ;
       Changes as per Brian McMahon.
       + Consistently quote tags embedded in text.
       + Clean up introductory comments.
       + Adjust line lengths to fit in 80 character window.
       + Fix several descriptions in AXIS category which
         referred to '_axis.type' instead of the current item.
       + Fix erroneous use of deprecated item
         '_diffrn_detector_axis.id' in examples for
         DIFFRN_SCAN_AXIS.
       + Add deprecated items '_diffrn_detector_axis.id'
         and '_diffrn_measurement_axis.id'.
       (HJB)
    ;

       1.2.4   2003-07-14
    ;
       Changes as per I. David Brown.
       + Enhance descriptions in DIFFRN_SCAN_AXIS to make them less
         dependent on the descriptions in DIFFRN_SCAN_FRAME_AXIS.
       + Provide a copy of the deprecated DIFFRN_FRAME_DATA
         category for completeness.
       (HJB)
    ;

       1.2.3   2003-07-03
    ;
       Cleanup to conform to ITVG.
       + Correct sign error in ..._cubed units.
       + Correct '_diffrn_radiation.polarisn_norm' range.
       (HJB)
    ;

       1.2.2   2003-03-10
    ;
       Correction of typos in various DIFFRN_SCAN_AXIS descriptions.
       (HJB)
    ;

       1.2.1   2003-02-22
    ;
       Correction of ATOM_ for ARRAY_ typos in various descriptions.
       (HJB)
    ;

       1.2     2003-02-07
    ;
       Corrections to encodings (remove extraneous hyphens) remove
       extraneous underscore in '_array_structure.encoding_type'
       enumeration.  Correct typos in items units list.  (HJB)
    ;

       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)

       + Add further comments on '\n' and '\t'.

       + Update ITEM_UNITS_LIST by taking section from mmCIF dictionary
         and adding metres.  Change 'meter' to 'metre' throughout.

       + Add missing enumerations to '_array_structure.compression_type'
         and make 'none' the default.

       + Remove parent-child relationship between
         '_array_structure_list.index' and '_array_structure_list.precedence'.

       + Improve alphabetization.

       + Fix '_array_intensities_gain.esd' related function.

       + Improve comments in AXIS.

       + Fix DIFFRN_FRAME_DATA example.

       + Remove erroneous DIFFRN_MEASUREMENT example.

       + Add '_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)

       + Restore '_diffrn_detector.diffrn_id' to DIFFRN_DETECTOR KEY.

       + Add AXIS category.

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

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

       + Add detector beam centre '_diffrn_detector_element.center[1]' and
         '_diffrn_detector_element.center[2]'.

       + Correct 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'.

       + Add DIFFRN_SCAN... categories.
    ;

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

       + Reflow comment lines over 80 characters and corrected typos.

       + Update examples and descriptions of MIME encoded data.

       + Change name to cbfext98.dic.
    ;

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

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

       + Change type of '_array_data.data' to binary and specify internal
         structure of raw binary data.

       + Add '_array_data.binary_id', and make
         '_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)

       + Add category hierarchy for describing frame data developed from
         discussions at the BNL imgCIF Workshop Oct 1997.   The following
         changes are made in implementing the workshop draft.  Category
         DIFFRN_ARRAY_DATA is renamed to DIFFRN_FRAME_DATA.  Category
         DIFFRN_FRAME_TYPE is renamed to DIFFRN_DETECTOR_ELEMENT.   The
         parent item for '_diffrn_frame_data.array_id' is changed from
         '_array_structure_list.array_id' to '_array_structure.id'. Item
         '_diffrn_detector.array_id' is deleted.
       + Add 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 is 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 are handled as an
         ordinary data item encapsulated in a character data type.   Although
         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