Provided by: libxray-spacegroup-perl_0.1.1-3_all bug

NAME

       Xray::SpaceGroup - Symmetry operations for the crystal space groups

VERSION

       This documentation refers to libperlxray version 0.1.

SYNOPSIS

          my $sg = Xray::SpaceGroup -> new("Pm3m");
          $sg -> fix({a     => $a,     b    => $b,    c     => $c,
                      alpha => $alpha, beta => $beta, gamma => $gamma})
          @symmetry_ops  = $sg -> positions;
          @bravais_trans = $sg -> bravais;
          print $sg -> report;

       The two lists can be used to populate a unit cell, given a set of Wyckoff positions.  The
       report is a user-readable summary of the properties of the space group.

DESCRIPTION

       This provides an object-oriented interface to a database of space group symmetries
       transcribed from volume A of the International Tables for Crystallography.

METHODS

   Accessor Methods
       "new"
           This creates a new Xray::SpaceGroup object.

             my $sg = Xray::SpaceGroup -> new({group=>"Pm3m"});

           The space group symbol can be a Hermann-Maguin symbol, a Schoenflies symbol, the
           number of the space group, one of several nicknames (diamond, cscl, etc), or a few
           other symbols from the International Tables.

           The H-M symbol can contain any number of spaces and is case insensitive.  An overscore
           is indicated by a leading dash ("-") and a subscript is simply written as a normal
           character, as in "p 42 3 2" where "4 sub 2" is written as 42.  A slash is indicated by
           a forward slash ("/").

           The sub- and superscripts of the Schoenflies symbol can come in either order and are
           indicated by caret ("^") and underscore ("_").

           The nicknames are as follows:

               symbol       number        nicknames
              ------------------------------------------------------------
               p 63 m c      186        graphite, gra
               p 63/m m c    194        hex, hcp
               f -4 3 m      216        zincblende, zns
               p m -3 m      221        cubic, cscl, perov, perovskite
               f m -3 m      225        fcc, salt, nacl
               f m -3 d      227        diamond
               i m -3 m      229        bcc

       "fix"
           Set the crystal setting based on the values of the lattice constants and verify that
           the lattice constants make sense for the selected crystal class.

              $sg -> fix({a     => $a,     b    => $b,    c     => $c,
                          alpha => $alpha, beta => $beta, gamma => $gamma})

           The first chore of this method is quite necessary for a space group with multiple
           settings.  Selecting the correct setting requires knowledge of the lattice parameters.
           For many space groups, including all cubic groups, this is a no-op.

       "warning"
           This will return a non-empty string if a problem was found in the "fix" method.  Most
           such problems result from a mismatch between the lattice constant values and what is
           expected for the crystal class.  For instance, if a monoclinic space group symbol is
           given but all three angles are 90 degrees, a warning will be returned by this method.
           This sort of problem rarely requires that your program stops, so no explicit exception
           is thrown when "fix" finds a problem.  If you want to know whether a problem was
           found, you must explicitly call this method.

       "positions"
           This method is the meaty part of this module.  This returns a list of lists containing
           the symmetry operations for your space group and the appropriate crystal setting.
           Here is an example using a monoclinic space group, which has a short list of symmetry
           operations.

               use Data::Dumper;
               my $sg = Xray::SpaceGroup -> new({group=>'7'});
               my @positions = $sg->positions;
               print Data::Dumper->Dump([\@positions], [qw(positions)]);
                 ==prints==>
                   $positions = [
                                 [ '$x', '$y', '$z'      ],
                                 [ '$x', '-$y', '$z+1/2' ]
                                ];

           The elements of these lists are strings and are intended to be evaluated using perl's
           eval function.  For example, if you have a Wyckoff position of "(0.2, 0.3, 0.4)", then
           you might do this:

               ($x, $y, $z) = (0.2, 0.3, 0.4);
               @pos0 = (eval "$positions[0]->[0]",
                        eval "$positions[0]->[1]",
                        eval "$positions[0]->[2]"  );
               @pos1 = (eval "$positions[1]->[0]",
                        eval "$positions[1]->[1]",
                        eval "$positions[1]->[2]"  );

           This will result in "@pos0 = (0.2, 0.3, 0.4)" and "@pos2 = (0.2, -0.3, 0.9)".  You
           would, in practice, wrap these evaluations inside proper control structures.  You
           might also use a Safe compartment if you are worried about the possibility of the
           database having been tainted.

           For high symmetry groups and high symmetry Wyckoff positions, these evaluations will
           generate the same positions repeatedly.  It is the responsibility of your application
           to weed out these repetitions.

       There are also "set" and "get" methods, but properties of the space group should be
       obtained via the reporting methods listed below.

   Reporting Methods
       "report"
           This writes a summary of the properties of the space group in a human-readable form.

              my $space = Xray::SpaceGroup -> new({group=>7});
              print join(", ", $space->bravais), $/;
               ==prints==>
                  Space group: p c (7)
                    supplied symbol        : 7
                    crystal class          : monoclinic
                      Schoenflies symbol   : c_s^2
                      crystal setting      : b_unique_1
                      Bravais translations :
                        none
                      Positions :
                        $x           $y           $z
                        $x           -$y          $z+1/2

       "group"
           This returns the canonical space symbol for this space group.

              print $sg->group, $/;
               ==prints==>
                  p m -3 m

       "given"
           This returns the space symbol supplied when the object was created.

              print $sg->given, $/;
               ==prints==>
                  Pm3m

       "number"
           This returns the number of the space group as in the International Tables.

              print $sg->number, $/;
               ==prints==>
                  221

       "full"
           This returns the full symbol of the space group as in the International Tables.

              print $sg->full, $/;
               ==prints==>
                  p 4/m -3 2/m

       "schoenflies"
           This returns the Schoenflies symbol of the space group.

              print $sg->schoenflies, $/;
               ==prints==>
                  o_h^1

       "thirtyfive"
           This returns the symbol of the space group as it appeared in the 1935 edition of the
           International Tables, if it was different from the canonical symbol.  Otherwise this
           returns an empty string.

              print $sg->thirtyfive, $/;
               ==prints==>
                  p m 3 m

       "newsymbol"
           This returns the new symbol of the space group as introduced by the IUCr nomenclature
           report of 1992.  Only a handful of groups with glide planes have new symbols.  An
           empty string is returned for most groups.

              my $sgnew = Xray::SpaceGroup -> new({group=>"a b a 2"});
              print $sgnew->newsymbol, $/;
               ==prints==>
                  a e a 2

       "class"
           This returns the crystal class of the space group

              print $sg->class, $/;
               ==prints==>
                  cubic

       "setting"
           This returns the setting of the space group using the nomenclature of the database
           used by this module.  If there is only one setting, this returns 0.

           For rhombohedral space groups, this returns a string -- either "positions" or
           "rhombohedral" -- indicating which set of symmetry operations should be used.

           For most monoclinic groups, this returns one of "b_unique", "c_unique", or "a_unique",
           indicating which set of symmetry operations should be used.  If the beta angle is not
           90 degrees, the "b_unique" setting should be used.  If the gamma or alpha angles are
           not 90 degrees, the "c_unique" or "a_unique" settings should be used, respectively.

           For several monoclinic space groups, there are additional settings for each unique
           axis. These are indicated as "b_unique_1", "b_unique_2", "b_unique_3", and so on.

       "bravais"
           This returns a 0, 3, 6, or 9 element list containing the Bravais translation vectors
           associated with the space group.

              my $diamond = Xray::SpaceGroup -> new({group=>"f d -3 m"});
              print join(", ", $diamond->bravais), $/;
               ==prints==>
                   0.000, 0.500, 0.500, 0.500, 0.000, 0.500, 0.500, 0.500, 0.000

           Each triplet is a Bravais translation.

           The Bravais translations attempt to be sensitive to the specified crystal setting.  If
           you use ambiguous input (i.e. the number or the Schoenflies symbol) it is possible
           that a Bravais translation other than the one you want will be returned.  The
           telepathic interface is planned for version 2.0.

COERCIONS

       When the reference to the Xray::SpaceGroup object is used in string context, the "group"
       method is returned.  When used in numerical context, the "number" method is returned.

CONFIGURATION AND ENVIRONMENT

       This requires that the space_groups.db file, which is generated by the space_groups.db.PL
       script, be installed in the correct location.  There are no other configuration options.

DEPENDENCIES

       This module uses several things from the standard distribution along with:

       Class::Std

       List::MoreUtils

       Readonly

       Regexp::List

BUGS AND LIMITATIONS

       Missing features:

       •   Groups 5, 8, 12 list 9 symbols, but 3 sets of positions.  What's up with that?

       •   Groups 12 - 15, short notation is ambiguous, requires angles to resolve.

       •   "_determine_monoclinic" should use alpha/beta/gamma, "_canonicalize_group" already
           parsed the given_group

       •   Recognize setting for R groups

       •   Rotate symmetry ops for orthorhombic groups to the setting specified by the symbol.
           In atoms, I rotate the coordinates and rotate them back.  Rotating the symmetry ops is
           a better, more general purpose solution.

       •   Handle alternate tetragonal group settings here rather than in the application.

       Please report problems to Bruce Ravel (bravel AT bnl DOT gov)

       Patches are welcome.

AUTHOR

       Bruce Ravel (bravel AT bnl DOT gov)

       http://cars9.uchicago.edu/~ravel/software/

ACKNOWLEDGEMENTS

       Julie Cross and Matt Newville gave me a copy of volume A of the International Tables for
       Crystallography as a graduation present from grad school.  Was that a blessing or a curse?

       Saulius Grazulis, whose useful feedback inspired this most recent rewrite of this code.
       Earlier versions of Atoms benefited from the help and criticism of Shelly Kelly, Daniel
       Haskel, Chuck Bouldin, Hannes Fischer, Glenn Forney, Chris Glover, John Rehr, Hubert
       Renevier, Julia Wienold, Andrzej Wilamowski, Boyan Boyanovich, Ed Stern, Hans Stragier,
       Kalle Voss, Steve Zabinsky, and Yanjun Zhang.  All the users of my codes over the years
       have driven me to provide the best possible code.

LICENCE AND COPYRIGHT

       Copyright (c) 1999-2008 Bruce Ravel (bravel AT bnl DOT gov). All rights reserved.

       This module is free software; you can redistribute it and/or modify it under the same
       terms as Perl itself. See perlartistic.

       This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
       without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.