Changeset 155


Ignore:
Timestamp:
Sep 24, 2010 4:07:24 PM (13 years ago)
Author:
vondreele
Message:

changes for structure drawing

Location:
trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/ElementTable.py

    r147 r155  
    11#Element table for building periodic table with valences & JMOL colors
     2import wx       
    23#Need these in case go back to this periodic table coloring scheme
    3 import wx       
    44REcolor = wx.Colour(128, 128, 255)
    55Metcolor = wx.Colour(192, 192, 192)
     
    1111White = wx.Colour(255, 255, 255)           
    1212ElTable = [
    13     (["H","H-1"],                  0,0, "Hydrogen",    White,           0.0000,wx.Colour(0xff,0xff,0xff)),
    14     (["He",],                     17,0, "Helium",      Noblecolor,      0.0000,wx.Colour(0xd9,0xff,0xff)),
    15     (["Li","Li+1"],                0,1, "Lithium",     Alkcolor,        0.0004,wx.Colour(0xcc,0x80,0xff)),
    16     (["Be","Be+2"],                1,1, "Beryllium",   AlkEcolor,       0.0006,wx.Colour(0xc2,0xff,0x00)),
    17     (["B",],                       2,1, "Boron",       NonMetcolor,     0.0012,wx.Colour(0xff,0xb5,0xb5)),
    18     (["C",],                      13,1, "Carbon",      NonMetcolor,     0.0018,wx.Colour(0x90,0x90,0x90)),
    19     (["N",],                      14,1, "Nitrogen",    NonMetcolor,     0.0030,wx.Colour(0x30,0x50,0xf8)),
    20     (["O","O-1","O-2"],            15,1, "Oxygen",      NonMetcolor,     0.0042,wx.Colour(0xff,0x0d,0x0d)),
    21     (["F","F-1"],                  16,1, "Fluorine",    NonMetcolor,     0.0054,wx.Colour(0x90,0xe0,0x50)),
    22     (["Ne",],                     17,1, "Neon",        Noblecolor,      0.0066,wx.Colour(0xb3,0xe3,0xf5)),
    23     (["Na","Na+1"],                 0,2, "Sodium",      Alkcolor,        0.0084,wx.Colour(0xab,0x5c,0xf2)),
    24     (["Mg","Mg+2"],                1,2, "Magnesium",   AlkEcolor,       0.0110,wx.Colour(0x8a,0xff,0x00)),
    25     (["Al","Al+3"],                2,2, "Aluminum",    SemMetcolor,     0.0125,wx.Colour(0xbf,0xa6,0xa6)),
    26     (["Si","Si+4"],               13,2, "Silicon",     NonMetcolor,     0.0158,wx.Colour(0xf0,0xc8,0xa0)),
    27     (["P",],                      14,2, "Phosphorus",  NonMetcolor,     0.0180,wx.Colour(0xff,0x80,0x00)),
    28     (["S",],                      15,2, "Sulphur",     NonMetcolor,     0.0210,wx.Colour(0xff,0xff,0x30)),
    29     (["Cl","Cl-1"],               16,2, "Chlorine",    NonMetcolor,     0.0250,wx.Colour(0x1f,0xf0,0x1f)),
    30     (["Ar",],                     17,2, "Argon",       Noblecolor,      0.0285,wx.Colour(0x80,0xd1,0xe3)),
    31     (["K","K+1"],                  0,3, "Potassium",   Alkcolor,        0.0320,wx.Colour(0x3d,0xff,0x00)),
    32     (["Ca","Ca+2"],                1,3, "Calcium",     AlkEcolor,       0.0362,wx.Colour(0x3d,0xff,0x00)),
    33     (["Sc","Sc+3"],                2,3, "Scandium",    Metcolor,        0.0410,wx.Colour(0xe6,0xe6,0xe6)),
    34     (["Ti","Ti+2","Ti+3","Ti+4"],  3,3, "Titanium",    Metcolor,        0.0460,wx.Colour(0xbf,0xc2,0xc7)),
    35     (["V","V+2","V+3","V+5"],      4,3, "Vanadium",    Metcolor,        0.0510,wx.Colour(0xa6,0xa6,0xab)),
    36     (["Cr","Cr+2","Cr+3"],         5,3, "Chromium",    Metcolor,        0.0560,wx.Colour(0x8a,0x99,0xc7)),
    37     (["Mn","Mn+2","Mn+3","Mn+4"],  6,3, "Manganese",   Metcolor,        0.0616,wx.Colour(0x9c,0x7a,0xc7)),
    38     (["Fe","Fe+2","Fe3"],          7,3, "Iron",        Metcolor,        0.0680,wx.Colour(0xe0,0x66,0x33)),
    39     (["Co","Co+2","Co+3"],         8,3, "Cobalt",      Metcolor,        0.0740,wx.Colour(0xf0,0x90,0xa0)),
    40     (["Ni","Ni+2","Ni+3"],         9,3, "Nickel",      Metcolor,        0.0815,wx.Colour(0x50,0xd0,0x50)),
    41     (["Cu","Cu+1","Cu+2"],        10,3, "Copper",      Metcolor,        0.0878,wx.Colour(0xc8,0x80,0x33)),
    42     (["Zn","Zn+2"],               11,3, "Zinc",        Metcolor,        0.0960,wx.Colour(0x7d,0x80,0xb0)),
    43     (["Ga","Ga+3"],               12,3, "Gallium",     SemMetcolor,      0.104,wx.Colour(0xc2,0x8f,0x8f)),
    44     (["Ge","Ge+4"],               13,3, "Germanium",   SemMetcolor,      0.114,wx.Colour(0x66,0x8f,0x8f)),
    45     (["As",],                     14,3, "Arsenic",     NonMetcolor,      0.120,wx.Colour(0xbd,0x80,0xe3)),
    46     (["Se",],                     15,3, "Selenium",    NonMetcolor,      0.132,wx.Colour(0xff,0xa1,0x00)),
    47     (["Br","Br-1"],               16,3, "Bromine",     NonMetcolor,      0.141,wx.Colour(0xa6,0x29,0x29)),
    48     (["Kr",],                     17,3, "Krypton",     Noblecolor,       0.150,wx.Colour(0x5c,0xb8,0xd1)),
    49     (["Rb","Rb+1"],                0,4, "Rubidium",    Alkcolor,         0.159,wx.Colour(0x70,0x2e,0xb0)),
    50     (["Sr","Sr+2"],                1,4, "Strontium",   AlkEcolor,        0.171,wx.Colour(0x00,0xff,0x00)),
    51     (["Y","Y+3"],                  2,4, "Yittrium",    Metcolor,         0.180,wx.Colour(0x94,0xff,0xff)),
    52     (["Zr","Zr+4"],                3,4, "Zirconium",   Metcolor,         0.192,wx.Colour(0x94,0xe0,0xe0)),
    53     (["Nb","Nb+3","Nb+5"],         4,4, "Niobium",     Metcolor,         0.204,wx.Colour(0x73,0xc2,0xc9)),
    54     (["Mo","Mo+3","Mo+5","Mo+6"],  5,4, "Molybdenium", Metcolor,         0.216,wx.Colour(0x54,0xb5,0xb5)),
    55     (["Tc",],                      6,4, "Technetium",  Metcolor,         0.228,wx.Colour(0x3b,0x9e,0x9e)),
    56     (["Ru","Ru+3","Ru+4"],         7,4, "Ruthenium",   Metcolor,         0.246,wx.Colour(0x24,0x8f,0x8f)),
    57     (["Rh","Rh+3","Rh+4"],         8,4, "Rhodium",     Metcolor,         0.258,wx.Colour(0x0a,0x7d,0x8c)),
    58     (["Pd","Pd+2","Pd+4"],         9,4, "Palladium",   Metcolor,         0.270,wx.Colour(0x00,0x69,0x85)),
    59     (["Ag","Ag+1","Ag+2"],        10,4, "Silver",      Metcolor,         0.285,wx.Colour(0xc0,0xc0,0xc0)),
    60     (["Cd","Cd+2"],               11,4, "Cadmium",     Metcolor,         0.300,wx.Colour(0xff,0xd9,0x8f)),
    61     (["In","In+3"],               12,4, "Indium",      SemMetcolor,      0.318,wx.Colour(0xa6,0x75,0x73)),
    62     (["Sn","Sn+2","Sn+4"],        13,4, "Tin",         SemMetcolor,      0.330,wx.Colour(0x66,0x80,0x80)),
    63     (["Sb","Sb+3","Sb+5"],        14,4, "Antimony",    SemMetcolor,      0.348,wx.Colour(0x9e,0x63,0xb5)),
    64     (["Te",],                     15,4, "Tellurium",   NonMetcolor,      0.363,wx.Colour(0xd4,0x7a,0x00)),
    65     (["I","I-1"],                 16,4, "Iodine",      NonMetcolor,      0.384,wx.Colour(0x94,0x00,0x94)),
    66     (["Xe",],                     17,4, "Xenon",       Noblecolor,       0.396,wx.Colour(0x42,0x9e,0xb0)),
    67     (["Cs","Cs+1"],                0,5, "Caesium",     Alkcolor,         0.414,wx.Colour(0x57,0x17,0x8f)),
    68     (["Ba","Ba+2"],                1,5, "Barium",      AlkEcolor,        0.438,wx.Colour(0x00,0xc9,0x00)),
    69     (["La","La+3"],                2,5, "Lanthanium",  Metcolor,         0.456,wx.Colour(0x70,0xd4,0xff)),
    70     (["Ce","Ce+3","Ce+4"],     3.5,6.5, "Cerium",      REcolor,          0.474,wx.Colour(0xff,0xff,0xc7)),
    71     (["Pr","Pr+3","Pr+4"],     4.5,6.5, "Praseodymium",REcolor,          0.492,wx.Colour(0xd9,0xff,0xc7)),
    72     (["Nd","Nd+3"],            5.5,6.5, "Neodymium",   REcolor,          0.516,wx.Colour(0xc7,0xff,0xc7)),
    73     (["Pm","Pm+3"],            6.5,6.5, "Promethium",  REcolor,          0.534,wx.Colour(0xa3,0xff,0xc7)),
    74     (["Sm","Sm+3"],            7.5,6.5, "Samarium",    REcolor,          0.558,wx.Colour(0x8f,0xff,0xc7)),
    75     (["Eu","Eu+2","Eu+3"],     8.5,6.5, "Europium",    REcolor,          0.582,wx.Colour(0x61,0xff,0xc7)),
    76     (["Gd","Gd+3"],            9.5,6.5, "Gadolinium",  REcolor,          0.610,wx.Colour(0x45,0xff,0xc7)),
    77     (["Tb","Tb+3"],           10.5,6.5, "Terbium",     REcolor,          0.624,wx.Colour(0x30,0xff,0xc7)),
    78     (["Dy","Dy+3"],           11.5,6.5, "Dysprosium",  REcolor,          0.648,wx.Colour(0x1f,0xff,0xc7)),
    79     (["Ho","Ho+3"],           12.5,6.5, "Holmium",     REcolor,          0.672,wx.Colour(0x00,0xff,0x9c)),
    80     (["Er","Er+3"],           13.5,6.5, "Erbium",      REcolor,          0.696,wx.Colour(0x00,0xe6,0x75)),
    81     (["Tm","Tm+3"],           14.5,6.5, "Thulium",     REcolor,          0.723,wx.Colour(0x00,0xd4,0x52)),
    82     (["Yb","Yb+2","Yb+3"],    15.5,6.5, "Ytterbium",   REcolor,          0.750,wx.Colour(0x00,0xbf,0x38)),
    83     (["Lu","Lu+3"],           16.5,6.5, "Lutetium",    REcolor,          0.780,wx.Colour(0x00,0xab,0x24)),
    84     (["Hf","Hf+4"],                3,5, "Hafnium",     Metcolor,         0.804,wx.Colour(0x4d,0xc2,0xff)),
    85     (["Ta","Ta+5"],                4,5, "Tantalum",    Metcolor,         0.834,wx.Colour(0x4d,0xa6,0xff)),
    86     (["W","W+6"],                  5,5, "Tungsten",    Metcolor,         0.864,wx.Colour(0x21,0x94,0xd6)),
    87     (["Re",],                      6,5, "Rhenium",     Metcolor,         0.900,wx.Colour(0x26,0x7d,0xab)),
    88     (["Os","Os+4"],                7,5, "Osmium",      Metcolor,         0.919,wx.Colour(0x26,0x66,0x96)),
    89     (["Ir","Ir+3","Ir+4"],         8,5, "Iridium",     Metcolor,         0.948,wx.Colour(0x17,0x54,0x87)),
    90     (["Pt","Pt+2","Pt+4"],         9,5, "Platinium",   Metcolor,         0.984,wx.Colour(0xd0,0xd0,0xe0)),
    91     (["Au","Au+1","Au+3"],        10,5, "Gold",        Metcolor,         1.014,wx.Colour(0xff,0xd1,0x23)),
    92     (["Hg","Hg+1","Hg+2"],        11,5, "Mercury",     Metcolor,         1.046,wx.Colour(0xb8,0xb8,0xd0)),
    93     (["Tl","Tl+1","Tl+3"],        12,5, "Thallium",    SemMetcolor,      1.080,wx.Colour(0xa6,0x54,0x4d)),
    94     (["Pb","Pb+2","Pb+4"],        13,5, "Lead",        SemMetcolor,      1.116,wx.Colour(0x57,0x59,0x61)),
    95     (["Bi","Bi+3","Bi+5"],        14,5, "Bismuth",     SemMetcolor,      1.149,wx.Colour(0x9e,0x4f,0xb5)),
    96     (["Po",],                     15,5, "Polonium",    SemMetcolor,      1.189,wx.Colour(0xab,0x5c,0x00)),
    97     (["At",],                     16,5, "Astatine",    NonMetcolor,      1.224,wx.Colour(0x75,0x4f,0x45)),
    98     (["Rn",],                     17,5, "Radon",       Noblecolor,       1.260,wx.Colour(0x42,0x82,0x96)),
    99     (["Fr",],                      0,6, "Francium",    Alkcolor,         1.296,wx.Colour(0x42,0x00,0x66)),
    100     (["Ra","Ra+2"],                1,6, "Radium",      AlkEcolor,        1.332,wx.Colour(0x00,0x7d,0x00)),
    101     (["Ac","Ac+3"],                2,6, "Actinium",    Metcolor,         1.374,wx.Colour(0x70,0xab,0xfa)),
    102     (["Th","Th+4"],            3.5,7.5, "Thorium",     REcolor,          1.416,wx.Colour(0x00,0xba,0xff)),
    103     (["Pa",],                  4.5,7.5, "Protactinium",REcolor,          1.458,wx.Colour(0x00,0xa1,0xff)),
    104     (["U","U+3","U+4","U+6"],  5.5,7.5, "Uranium",     REcolor,          1.470,wx.Colour(0x00,0x8f,0xff)),
    105     (["Np","Np+3","Np+4","Np+6"], 6.5,7.5, "Neptunium",   REcolor,       1.536,wx.Colour(0x00,0x80,0xff)),
    106     (["Pu","Pu+3","Pu+4","Pu+6"], 7.5,7.5, "Plutonium",   REcolor,       1.584,wx.Colour(0x00,0x6b,0xff)),
    107     (["Am",],                  8.5,7.5, "Americium",   REcolor,          1.626,wx.Colour(0x54,0x5c,0xf2)),
    108     (["Cm",],                  9.5,7.5, "Curium",      REcolor,          1.669,wx.Colour(0x78,0x5c,0xe3)),
    109     (["Bk",],                 10.5,7.5, "Berkelium",   REcolor,          1.716,wx.Colour(0x8a,0x4f,0xe3)),
    110     (["Cf",],                 11.5,7.5, "Californium", REcolor,          1.764,wx.Colour(0xa1,0x36,0xd4)),
    111     (["Q","QA","QB","QC","QD"],  14.5,7.5, "Special form factor", REcolor,  0.000,wx.Colour(0xa1,0x36,0xd4)),
     13    (["H","H-1"],                  0,0, "Hydrogen",    White,           0.0000,wx.Colour(255,255,255)),
     14    (["He",],                     17,0, "Helium",      Noblecolor,      0.0000,wx.Colour(217,255,255)),
     15    (["Li","Li+1"],                0,1, "Lithium",     Alkcolor,        0.0004,wx.Colour(204,128,255)),
     16    (["Be","Be+2"],                1,1, "Beryllium",   AlkEcolor,       0.0006,wx.Colour(194,255,0)),
     17    (["B",],                       2,1, "Boron",       NonMetcolor,     0.0012,wx.Colour(255,181,181)),
     18    (["C",],                      13,1, "Carbon",      NonMetcolor,     0.0018,wx.Colour(144,144,144)),
     19    (["N",],                      14,1, "Nitrogen",    NonMetcolor,     0.0030,wx.Colour(48,80,248)),
     20    (["O","O-1","O-2"],            15,1, "Oxygen",      NonMetcolor,     0.0042,wx.Colour(255,13,13)),
     21    (["F","F-1"],                  16,1, "Fluorine",    NonMetcolor,     0.0054,wx.Colour(144,224,80)),
     22    (["Ne",],                     17,1, "Neon",        Noblecolor,      0.0066,wx.Colour(179,227,245)),
     23    (["Na","Na+1"],                 0,2, "Sodium",      Alkcolor,        0.0084,wx.Colour(171,92,242)),
     24    (["Mg","Mg+2"],                1,2, "Magnesium",   AlkEcolor,       0.0110,wx.Colour(138,255,0)),
     25    (["Al","Al+3"],                2,2, "Aluminum",    SemMetcolor,     0.0125,wx.Colour(191,166,166)),
     26    (["Si","Si+4"],               13,2, "Silicon",     NonMetcolor,     0.0158,wx.Colour(240,200,160)),
     27    (["P",],                      14,2, "Phosphorus",  NonMetcolor,     0.0180,wx.Colour(255,128,0)),
     28    (["S",],                      15,2, "Sulphur",     NonMetcolor,     0.0210,wx.Colour(255,255,48)),
     29    (["Cl","Cl-1"],               16,2, "Chlorine",    NonMetcolor,     0.0250,wx.Colour(31,240,31)),
     30    (["Ar",],                     17,2, "Argon",       Noblecolor,      0.0285,wx.Colour(128,209,227)),
     31    (["K","K+1"],                  0,3, "Potassium",   Alkcolor,        0.0320,wx.Colour(61,255,0)),
     32    (["Ca","Ca+2"],                1,3, "Calcium",     AlkEcolor,       0.0362,wx.Colour(61,255,0)),
     33    (["Sc","Sc+3"],                2,3, "Scandium",    Metcolor,        0.0410,wx.Colour(230,230,230)),
     34    (["Ti","Ti+2","Ti+3","Ti+4"],  3,3, "Titanium",    Metcolor,        0.0460,wx.Colour(191,194,199)),
     35    (["V","V+2","V+3","V+5"],      4,3, "Vanadium",    Metcolor,        0.0510,wx.Colour(166,166,171)),
     36    (["Cr","Cr+2","Cr+3"],         5,3, "Chromium",    Metcolor,        0.0560,wx.Colour(138,153,199)),
     37    (["Mn","Mn+2","Mn+3","Mn+4"],  6,3, "Manganese",   Metcolor,        0.0616,wx.Colour(156,122,199)),
     38    (["Fe","Fe+2","Fe3"],          7,3, "Iron",        Metcolor,        0.0680,wx.Colour(224,102,51)),
     39    (["Co","Co+2","Co+3"],         8,3, "Cobalt",      Metcolor,        0.0740,wx.Colour(240,144,160)),
     40    (["Ni","Ni+2","Ni+3"],         9,3, "Nickel",      Metcolor,        0.0815,wx.Colour(80,208,80)),
     41    (["Cu","Cu+1","Cu+2"],        10,3, "Copper",      Metcolor,        0.0878,wx.Colour(200,128,51)),
     42    (["Zn","Zn+2"],               11,3, "Zinc",        Metcolor,        0.0960,wx.Colour(125,128,176)),
     43    (["Ga","Ga+3"],               12,3, "Gallium",     SemMetcolor,      0.104,wx.Colour(194,143,143)),
     44    (["Ge","Ge+4"],               13,3, "Germanium",   SemMetcolor,      0.114,wx.Colour(102,143,143)),
     45    (["As",],                     14,3, "Arsenic",     NonMetcolor,      0.120,wx.Colour(189,128,227)),
     46    (["Se",],                     15,3, "Selenium",    NonMetcolor,      0.132,wx.Colour(255,161,0)),
     47    (["Br","Br-1"],               16,3, "Bromine",     NonMetcolor,      0.141,wx.Colour(166,41,41)),
     48    (["Kr",],                     17,3, "Krypton",     Noblecolor,       0.150,wx.Colour(92,184,209)),
     49    (["Rb","Rb+1"],                0,4, "Rubidium",    Alkcolor,         0.159,wx.Colour(112,46,176)),
     50    (["Sr","Sr+2"],                1,4, "Strontium",   AlkEcolor,        0.171,wx.Colour(0,255,0)),
     51    (["Y","Y+3"],                  2,4, "Yittrium",    Metcolor,         0.180,wx.Colour(148,255,255)),
     52    (["Zr","Zr+4"],                3,4, "Zirconium",   Metcolor,         0.192,wx.Colour(148,224,224)),
     53    (["Nb","Nb+3","Nb+5"],         4,4, "Niobium",     Metcolor,         0.204,wx.Colour(115,194,201)),
     54    (["Mo","Mo+3","Mo+5","Mo+6"],  5,4, "Molybdenium", Metcolor,         0.216,wx.Colour(84,181,181)),
     55    (["Tc",],                      6,4, "Technetium",  Metcolor,         0.228,wx.Colour(59,158,158)),
     56    (["Ru","Ru+3","Ru+4"],         7,4, "Ruthenium",   Metcolor,         0.246,wx.Colour(36,143,143)),
     57    (["Rh","Rh+3","Rh+4"],         8,4, "Rhodium",     Metcolor,         0.258,wx.Colour(10,125,140)),
     58    (["Pd","Pd+2","Pd+4"],         9,4, "Palladium",   Metcolor,         0.270,wx.Colour(0,105,133)),
     59    (["Ag","Ag+1","Ag+2"],        10,4, "Silver",      Metcolor,         0.285,wx.Colour(192,192,192)),
     60    (["Cd","Cd+2"],               11,4, "Cadmium",     Metcolor,         0.300,wx.Colour(255,217,143)),
     61    (["In","In+3"],               12,4, "Indium",      SemMetcolor,      0.318,wx.Colour(166,117,115)),
     62    (["Sn","Sn+2","Sn+4"],        13,4, "Tin",         SemMetcolor,      0.330,wx.Colour(102,128,128)),
     63    (["Sb","Sb+3","Sb+5"],        14,4, "Antimony",    SemMetcolor,      0.348,wx.Colour(158,99,181)),
     64    (["Te",],                     15,4, "Tellurium",   NonMetcolor,      0.363,wx.Colour(212,122,0)),
     65    (["I","I-1"],                 16,4, "Iodine",      NonMetcolor,      0.384,wx.Colour(148,0,148)),
     66    (["Xe",],                     17,4, "Xenon",       Noblecolor,       0.396,wx.Colour(66,158,176)),
     67    (["Cs","Cs+1"],                0,5, "Caesium",     Alkcolor,         0.414,wx.Colour(87,23,143)),
     68    (["Ba","Ba+2"],                1,5, "Barium",      AlkEcolor,        0.438,wx.Colour(0,201,0)),
     69    (["La","La+3"],                2,5, "Lanthanium",  Metcolor,         0.456,wx.Colour(112,212,255)),
     70    (["Ce","Ce+3","Ce+4"],     3.5,6.5, "Cerium",      REcolor,          0.474,wx.Colour(255,255,199)),
     71    (["Pr","Pr+3","Pr+4"],     4.5,6.5, "Praseodymium",REcolor,          0.492,wx.Colour(217,255,199)),
     72    (["Nd","Nd+3"],            5.5,6.5, "Neodymium",   REcolor,          0.516,wx.Colour(199,255,199)),
     73    (["Pm","Pm+3"],            6.5,6.5, "Promethium",  REcolor,          0.534,wx.Colour(163,255,199)),
     74    (["Sm","Sm+3"],            7.5,6.5, "Samarium",    REcolor,          0.558,wx.Colour(143,255,199)),
     75    (["Eu","Eu+2","Eu+3"],     8.5,6.5, "Europium",    REcolor,          0.582,wx.Colour(97,255,199)),
     76    (["Gd","Gd+3"],            9.5,6.5, "Gadolinium",  REcolor,          0.610,wx.Colour(69,255,199)),
     77    (["Tb","Tb+3"],           10.5,6.5, "Terbium",     REcolor,          0.624,wx.Colour(48,255,199)),
     78    (["Dy","Dy+3"],           11.5,6.5, "Dysprosium",  REcolor,          0.648,wx.Colour(31,255,199)),
     79    (["Ho","Ho+3"],           12.5,6.5, "Holmium",     REcolor,          0.672,wx.Colour(0,255,156)),
     80    (["Er","Er+3"],           13.5,6.5, "Erbium",      REcolor,          0.696,wx.Colour(0,230,117)),
     81    (["Tm","Tm+3"],           14.5,6.5, "Thulium",     REcolor,          0.723,wx.Colour(0,212,82)),
     82    (["Yb","Yb+2","Yb+3"],    15.5,6.5, "Ytterbium",   REcolor,          0.750,wx.Colour(0,191,56)),
     83    (["Lu","Lu+3"],           16.5,6.5, "Lutetium",    REcolor,          0.780,wx.Colour(0,171,36)),
     84    (["Hf","Hf+4"],                3,5, "Hafnium",     Metcolor,         0.804,wx.Colour(77,194,255)),
     85    (["Ta","Ta+5"],                4,5, "Tantalum",    Metcolor,         0.834,wx.Colour(77,166,255)),
     86    (["W","W+6"],                  5,5, "Tungsten",    Metcolor,         0.864,wx.Colour(33,148,214)),
     87    (["Re",],                      6,5, "Rhenium",     Metcolor,         0.900,wx.Colour(38,125,171)),
     88    (["Os","Os+4"],                7,5, "Osmium",      Metcolor,         0.919,wx.Colour(38,102,150)),
     89    (["Ir","Ir+3","Ir+4"],         8,5, "Iridium",     Metcolor,         0.948,wx.Colour(23,84,135)),
     90    (["Pt","Pt+2","Pt+4"],         9,5, "Platinium",   Metcolor,         0.984,wx.Colour(208,208,224)),
     91    (["Au","Au+1","Au+3"],        10,5, "Gold",        Metcolor,         1.014,wx.Colour(255,209,35)),
     92    (["Hg","Hg+1","Hg+2"],        11,5, "Mercury",     Metcolor,         1.046,wx.Colour(184,184,208)),
     93    (["Tl","Tl+1","Tl+3"],        12,5, "Thallium",    SemMetcolor,      1.080,wx.Colour(166,84,77)),
     94    (["Pb","Pb+2","Pb+4"],        13,5, "Lead",        SemMetcolor,      1.116,wx.Colour(87,89,97)),
     95    (["Bi","Bi+3","Bi+5"],        14,5, "Bismuth",     SemMetcolor,      1.149,wx.Colour(158,79,181)),
     96    (["Po",],                     15,5, "Polonium",    SemMetcolor,      1.189,wx.Colour(171,92,0)),
     97    (["At",],                     16,5, "Astatine",    NonMetcolor,      1.224,wx.Colour(117,79,69)),
     98    (["Rn",],                     17,5, "Radon",       Noblecolor,       1.260,wx.Colour(66,130,150)),
     99    (["Fr",],                      0,6, "Francium",    Alkcolor,         1.296,wx.Colour(66,0,102)),
     100    (["Ra","Ra+2"],                1,6, "Radium",      AlkEcolor,        1.332,wx.Colour(0,125,0)),
     101    (["Ac","Ac+3"],                2,6, "Actinium",    Metcolor,         1.374,wx.Colour(112,171,250)),
     102    (["Th","Th+4"],            3.5,7.5, "Thorium",     REcolor,          1.416,wx.Colour(0,186,255)),
     103    (["Pa",],                  4.5,7.5, "Protactinium",REcolor,          1.458,wx.Colour(0,161,255)),
     104    (["U","U+3","U+4","U+6"],  5.5,7.5, "Uranium",     REcolor,          1.470,wx.Colour(0,143,255)),
     105    (["Np","Np+3","Np+4","Np+6"], 6.5,7.5, "Neptunium",   REcolor,       1.536,wx.Colour(0,128,255)),
     106    (["Pu","Pu+3","Pu+4","Pu+6"], 7.5,7.5, "Plutonium",   REcolor,       1.584,wx.Colour(0,107,255)),
     107    (["Am",],                  8.5,7.5, "Americium",   REcolor,          1.626,wx.Colour(84,92,242)),
     108    (["Cm",],                  9.5,7.5, "Curium",      REcolor,          1.669,wx.Colour(120,92,227)),
     109    (["Bk",],                 10.5,7.5, "Berkelium",   REcolor,          1.716,wx.Colour(138,79,227)),
     110    (["Cf",],                 11.5,7.5, "Californium", REcolor,          1.764,wx.Colour(161,54,212)),
     111    (["Q","QA","QB","QC","QD"],  14.5,7.5, "Special form factor", REcolor,  0.000,wx.Colour(161,54,212)),
    112112    ]
  • trunk/GSASII.py

    r144 r155  
    1717import GSASIIplot as G2plt
    1818import GSASIIpwdGUI as G2pdG
     19import OpenGL as ogl
    1920
    2021# print versions
     
    2425print "matplotlib: ",mpl.__version__
    2526print "numpy:      ",np.__version__
    26 
    27 __version__ = '0.1.3'
     27print "OpenGL:     ",ogl.__version__
     28
     29__version__ = '0.1.4'
    2830
    2931# useful degree trig functions
     
    264266        if pltNum >= 0:                         #to avoid the startup with no plot!
    265267            pltPage = self.G2plotNB.nb.GetPage(pltNum)
    266             pltPlot = pltPage.figure.gca()
     268#            pltPlot = pltPage.figure.gca()
     269            pltPlot = pltPage.figure
    267270        item = event.GetItem()
    268271        G2gd.MovePatternTreeToGrid(self,item)
     
    520523            parent = self.GetParent()
    521524            parent.Raise()
    522             self.SetReturnCode(wx.ID_OK)
    523             self.MakeModal(False)             
     525            self.EndModal(wx.ID_OK)             
    524526            self.Destroy()
    525527           
     
    527529            parent = self.GetParent()
    528530            parent.Raise()
    529             self.SetReturnCode(wx.ID_CANCEL)
    530             self.MakeModal(False)             
     531            self.EndModal(wx.ID_CANCEL)             
    531532            self.Destroy()
    532533           
     
    592593            parent = self.GetParent()
    593594            parent.Raise()
    594             self.SetReturnCode(wx.ID_OK)
    595             self.MakeModal(False)             
     595            self.EndModal(wx.ID_OK)             
    596596            self.Destroy()
    597597           
     
    599599            parent = self.GetParent()
    600600            parent.Raise()
    601             self.SetReturnCode(wx.ID_CANCEL)
    602             self.MakeModal(False)             
     601            self.EndModal(wx.ID_CANCEL)             
    603602            self.Destroy()
    604603           
     
    810809        SGData = {'SpGrp':'P 1'}
    811810        self.PatternTree.SetItemPyData(sub, \
    812             {'General':{'Name':'phase name','Type':'nuclear','SGData':SGData,'Cell':[False,10.,10.,10.,90.,90.,90,1000.],
    813             'Scale':[False,1.0],'Pawley dmin':0.25},'Atoms':[]})
     811            {'General':{'Name':PhaseName,'Type':'nuclear','SGData':SGData,'Cell':[False,10.,10.,10.,90.,90.,90,1000.],
     812            'Scale':[False,1.0],'Pawley dmin':0.25},'Atoms':[],'Drawing':{}})
    814813
    815814       
     
    841840                        i += 1
    842841                    for item in DelItemList:
     842                        name = self.PatternTree.GetItemText(item)
    843843                        self.PatternTree.Delete(item)
     844                        self.G2plotNB.Delete(name)
    844845            finally:
    845846                dlg.Destroy()
     
    10041005                    EXPfile = dlg.GetPath()
    10051006                    self.dirname = dlg.GetDirectory()
    1006                     Phase = G2IO.ReadEXPPhase(EXPfile)
     1007                    Phase = G2IO.ReadEXPPhase(self,EXPfile)
    10071008            finally:
    10081009                dlg.Destroy()
  • trunk/GSASIIElem.py

    r153 r155  
    7878                    Drad = float(S[12:22])
    7979                    Arad = float(S[22:32])
     80                    Vdrad = float(S[32:38])
    8081                    Color = ET.ElTable[Elements.index(Symbol)][6]
    8182    FFdata.close()
    82     AtomInfo={'Symbol':Symbol,'Mass':Mass,'Z':Z,'Drad':Drad,'Arad':Arad,'Color':Color}   
     83    AtomInfo={'Symbol':Symbol,'Mass':Mass,'Z':Z,'Drad':Drad,'Arad':Arad,'Vdrad':Vdrad,'Color':Color}   
    8384    return AtomInfo
    8485     
  • trunk/GSASIIIO.py

    r142 r155  
    844844    print 'index peak list saved'
    845845   
    846 def ReadEXPPhase(filename):
     846def ReadEXPPhase(self,filename):
    847847    import GSASIIspc as G2spc
    848848    import GSASIIlattice as G2lat
     
    930930    Phase['General'] = {'Name':PhaseName,'Type':Ptype,'SGData':SGData,'Cell':[False,]+abc+angles+[Volume,],'Scale':[False,1.0]}
    931931    Phase['Atoms'] = Atoms
     932    Phase['Drawing'] = {}
    932933    return Phase
    933934       
     
    974975            if Type[0] in '123456789':
    975976                Type = Type[1:]
    976             Atom = [int(S[22:27]),S[17:20].upper(),S[20:22],
     977            Atom = [S[22:27].strip(),S[17:20].upper(),S[20:22],
    977978                S[12:17].strip(),Type.strip(),'',XYZ[0],XYZ[1],XYZ[2],
    978979                float(S[55:61]),SytSym,Mult,'I',Uiso,0,0,0,0,0,0]
     
    997998    Phase['General'] = {'Name':PhaseName,'Type':'macromolecular','SGData':SGData,'Cell':[False,]+cell+[Volume,],'Scale':[False,1.0]}
    998999    Phase['Atoms'] = Atoms
     1000    Phase['Drawing'] = {}
    9991001   
    10001002    return Phase
  • trunk/GSASIIgrid.py

    r149 r155  
    1414] = [wx.NewId() for _init_coll_Atom_Items in range(6)]
    1515
     16[ wxID_DRAWATOMSTYLE, wxID_DRAWATOMLABEL, wxID_DRAWVIEWPOINT, wxID_DRAWTRANSFORM,
     17    wxID_DRAWDELETE, wxID_DRAWFILLCELL, wxID_DRAWADDEQUIV, wxID_DRAWFILLCOORD,
     18] = [wx.NewId() for _init_coll_DrawAtom_Items in range(8)]
     19
    1620[ wxID_IMCALIBRATE, wxID_IMINTEGRATE, wxID_IMCLEARCALIB, wxID_SAVEINTG,
    1721    wxID_IMCOPYCONTROLS, wxID_INTEGRATEALL,
     
    4044       
    4145    def _init_coll_AtomsMenu(self,parent):
    42         parent.Append(menu=self.AtomEdit, title='Edit atom list')
     46        parent.Append(menu=self.AtomEdit, title='Edit')
     47       
     48    def _init_coll_DrawAtomsMenu(self,parent):
     49        parent.Append(menu=self.DrawAtomEdit, title='Edit')       
    4350
    4451    def _init_coll_IndPeaksMenu(self,parent):
     
    7380            help='Select atoms to transform first')
    7481           
     82    def _init_coll_DrawAtom_Items(self,parent):
     83        parent.Append(id=wxID_DRAWATOMSTYLE, kind=wx.ITEM_NORMAL,text='Atom style',
     84            help='Select atoms first')
     85        parent.Append(id=wxID_DRAWATOMLABEL, kind=wx.ITEM_NORMAL,text='Atom label',
     86            help='Select atoms first')
     87        parent.Append(id=wxID_DRAWVIEWPOINT, kind=wx.ITEM_NORMAL,text='View point',
     88            help='View point is 1st atom selected')
     89        parent.Append(id=wxID_DRAWADDEQUIV, kind=wx.ITEM_NORMAL,text='Add atoms',
     90            help='Add symmetry & cell equivalents to drawing set from selected atoms')
     91        parent.Append(id=wxID_DRAWTRANSFORM, kind=wx.ITEM_NORMAL,text='Transform atoms',
     92            help='Transform selected atoms by symmetry & cell translations')
     93        parent.Append(id=wxID_DRAWFILLCOORD, kind=wx.ITEM_NORMAL,text='Fill CN-sphere',
     94            help='Fill coordination sphere for selected atoms')           
     95        parent.Append(id=wxID_DRAWFILLCELL, kind=wx.ITEM_NORMAL,text='Fill unit cell',
     96            help='Fill unit cell with selected atoms')
     97        parent.Append(id=wxID_DRAWDELETE, kind=wx.ITEM_NORMAL,text='Delete atoms',
     98            help='Delete atoms from drawing set')
     99
    75100    def _init_coll_IndPeaks_Items(self,parent):
    76101        parent.Append(help='Load/Reload index peaks from peak list',id=wxID_INDXRELOAD,
     
    121146       
    122147        self.AtomsMenu = wx.MenuBar()
     148        self.DrawAtomsMenu = wx.MenuBar()
    123149        self.ImageMenu = wx.MenuBar()
    124150        self.MaskMenu = wx.MenuBar()
     
    128154        self.IndexMenu = wx.MenuBar()
    129155        self.AtomEdit = wx.Menu(title='')
     156        self.DrawAtomEdit = wx.Menu(title='')
    130157        self.ImageEdit = wx.Menu(title='')
    131158        self.MaskEdit = wx.Menu(title='')
     
    136163        self._init_coll_AtomsMenu(self.AtomsMenu)
    137164        self._init_coll_Atom_Items(self.AtomEdit)
     165        self._init_coll_DrawAtomsMenu(self.DrawAtomsMenu)
     166        self._init_coll_DrawAtom_Items(self.DrawAtomEdit)
    138167        self._init_coll_ImageMenu(self.ImageMenu)
    139168        self._init_coll_Image_Items(self.ImageEdit)
  • trunk/GSASIIlattice.py

    r110 r155  
    11'''Perform lattice-related computations'''
    22
     3import math
    34import numpy as np
    45import numpy.linalg as nl
     
    118119    '''Computes orthogonalization matrix from unit cell constants
    119120    cell is tuple with a,b,c,alpha, beta, gamma (degrees)
    120     returns list of two 3x3 numpy arrays
    121        A for crystal to Cartesian transformations A*x = X
    122        B (inverse) for Cartesian to crystal transformation B*X = x
     121    returns tuple of two 3x3 numpy arrays (A,B)
     122       A for crystal to Cartesian transformations A*x = np.inner(A,x) = X
     123       B (= inverse of A) for Cartesian to crystal transformation B*X = np.inner(B*x) = x
    123124    '''
    124125    G,g = cell2Gmat(cell)
     
    134135    B = nl.inv(A)
    135136    return A,B
     137   
     138#def U2Uij(U):
     139#    #returns the UIJ vector U11,U22,U33,U12,U13,U23 from tensor U
     140#    return [U[0][0],U[1][1],U[2][2],U[0][1],U[0][2],U[1][2]]
     141#   
     142#def Uij2U(Uij):
     143#    #returns the thermal motion tensor U from Uij as numpy array
     144#    return np.array([[Uij[0],Uij[3],Uij[4]],[Uij[3],Uij[1],Uij[5]],[Uij[4],Uij[5],Uij[2]]])
     145#   
     146def Uij2betaij(Uij,G):
     147    '''
     148    Convert Uij to beta-ij tensors
     149    input:
     150    Uij - numpy array [Uij]
     151    G - reciprocal metric tensor
     152    returns:
     153    beta-ij - numpy array [beta-ij]
     154    '''
     155    pass
     156   
     157def criticalEllipse(prob):
     158    '''
     159    Calculate critical values for probability ellipsoids from probability
     160    '''
     161    if not ( 0.01 <= prob < 1.0):
     162        return 1.54
     163    coeff = np.array([6.44988E-09,4.16479E-07,1.11172E-05,1.58767E-04,0.00130554,
     164        0.00604091,0.0114921,-0.040301,-0.6337203,1.311582])
     165    llpr = math.log(-math.log(prob))
     166    return np.polyval(coeff,llpr)
     167   
     168def CellBlock(nCells):
     169    '''
     170    Generate block of unit cells n*n*n on a side; [0,0,0] centered, n = 2*nCells+1
     171    currently only works for nCells = 0 or 1 (not >1)
     172    '''
     173    if nCells:
     174        N = 2*nCells+1
     175        N2 = N*N
     176        N3 = N*N*N
     177        cellArray = []
     178        A = np.array(range(N3))
     179        cellGen = np.array([A/N2-1,A/N%N-1,A%N-1]).T
     180        for cell in cellGen:
     181            cellArray.append(cell)
     182        return cellArray
     183    else:
     184        return [0,0,0]
     185                       
     186   
     187
     188#Permutations and Combinations
     189# Four routines: combinations,uniqueCombinations, selections & permutations
     190#These taken from Python Cookbook, 2nd Edition. 19.15 p724-726
     191#   
     192def _combinators(_handle, items, n):
     193    ''' factored-out common structure of all following combinators '''
     194    if n==0:
     195        yield [ ]
     196        return
     197    for i, item in enumerate(items):
     198        this_one = [ item ]
     199        for cc in _combinators(_handle, _handle(items, i), n-1):
     200            yield this_one + cc
     201def combinations(items, n):
     202    ''' take n distinct items, order matters '''
     203    def skipIthItem(items, i):
     204        return items[:i] + items[i+1:]
     205    return _combinators(skipIthItem, items, n)
     206def uniqueCombinations(items, n):
     207    ''' take n distinct items, order is irrelevant '''
     208    def afterIthItem(items, i):
     209        return items[i+1:]
     210    return _combinators(afterIthItem, items, n)
     211def selections(items, n):
     212    ''' take n (not necessarily distinct) items, order matters '''
     213    def keepAllItems(items, i):
     214        return items
     215    return _combinators(keepAllItems, items, n)
     216def permutations(items):
     217    ''' take all items, order matters '''
     218    return combinations(items, len(items))
    136219
    137220#reflection generation routines
  • trunk/GSASIIphsGUI.py

    r152 r155  
    2424cosd = lambda x: math.cos(x*math.pi/180.)
    2525asind = lambda x: 180.*math.asin(x)/math.pi
    26            
    27 def UpdatePhaseData(self,item,data,oldPage):
    28    
    29     class SymOpDialog(wx.Dialog):
    30         def __init__(self,parent,SGData):
    31             wx.Dialog.__init__(self,parent,-1,'Select symmetry operator',
    32                 pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE)
    33             panel = wx.Panel(self)
    34             self.SGData = SGData
    35             self.OpSelected = [0,0,0,0,0,0]
    36             mainSizer = wx.BoxSizer(wx.VERTICAL)           
    37             mainSizer.Add((5,5),0)
    38             if SGData['SGInv']:
    39                 choice = ['No','Yes']
    40                 self.inv = wx.RadioBox(panel,-1,'Choose inversion?',choices=choice)
    41                 self.inv.Bind(wx.EVT_RADIOBOX, self.OnOpSelect)
    42                 mainSizer.Add(self.inv,0,wx.ALIGN_CENTER_VERTICAL)
    43             mainSizer.Add((5,5),0)
    44             if SGData['SGLatt'] != 'P':
    45                 LattOp = G2spc.Latt2text(SGData['SGLatt']).split(';')
    46                 self.latt = wx.RadioBox(panel,-1,'Choose cell centering?',choices=LattOp)
    47                 self.latt.Bind(wx.EVT_RADIOBOX, self.OnOpSelect)
    48                 mainSizer.Add(self.latt,0,wx.ALIGN_CENTER_VERTICAL)
    49             mainSizer.Add((5,5),0)
    50             if SGData['SGLaue'] in ['-1','2/m','mmm','4/m','4/mmm']:
    51                 Ncol = 2
    52             else:
    53                 Ncol = 3
    54             OpList = []
    55             for M,T in SGData['SGOps']:
    56                 OpList.append(G2spc.MT2text(M,T))
    57             self.oprs = wx.RadioBox(panel,-1,'Choose space group operator?',choices=OpList,
    58                 majorDimension=Ncol)
    59             self.oprs.Bind(wx.EVT_RADIOBOX, self.OnOpSelect)
    60             mainSizer.Add(self.oprs,0,wx.ALIGN_CENTER_VERTICAL)
    61             mainSizer.Add((5,5),0)
    62             mainSizer.Add(wx.StaticText(panel,-1,"   Choose unit cell?"),0,wx.ALIGN_CENTER_VERTICAL)
    63             mainSizer.Add((5,5),0)
    64             cellSizer = wx.BoxSizer(wx.HORIZONTAL)
    65             cellSizer.Add((5,0),0)
    66             cellName = ['X','Y','Z']
    67             self.cell = []
    68             for i in range(3):
    69                 self.cell.append(wx.SpinCtrl(panel,-1,cellName[i],size=wx.Size(50,20)))
    70                 self.cell[-1].SetRange(-3,3)
    71                 self.cell[-1].SetValue(0)
    72                 self.cell[-1].Bind(wx.EVT_SPINCTRL, self.OnOpSelect)
    73                 cellSizer.Add(self.cell[-1],0,wx.ALIGN_CENTER_VERTICAL)
    74             mainSizer.Add(cellSizer,0,)
     26
     27class SymOpDialog(wx.Dialog):
     28    def __init__(self,parent,SGData,New=True):
     29        wx.Dialog.__init__(self,parent,-1,'Select symmetry operator',
     30            pos=wx.DefaultPosition,style=wx.DEFAULT_DIALOG_STYLE)
     31        panel = wx.Panel(self)
     32        self.SGData = SGData
     33        self.New = New
     34        self.OpSelected = [0,0,0,0,0,0]
     35        mainSizer = wx.BoxSizer(wx.VERTICAL)
     36        mainSizer.Add((5,5),0)
     37        if SGData['SGInv']:
     38            choice = ['No','Yes']
     39            self.inv = wx.RadioBox(panel,-1,'Choose inversion?',choices=choice)
     40            self.inv.Bind(wx.EVT_RADIOBOX, self.OnOpSelect)
     41            mainSizer.Add(self.inv,0,wx.ALIGN_CENTER_VERTICAL)
     42        mainSizer.Add((5,5),0)
     43        if SGData['SGLatt'] != 'P':
     44            LattOp = G2spc.Latt2text(SGData['SGLatt']).split(';')
     45            self.latt = wx.RadioBox(panel,-1,'Choose cell centering?',choices=LattOp)
     46            self.latt.Bind(wx.EVT_RADIOBOX, self.OnOpSelect)
     47            mainSizer.Add(self.latt,0,wx.ALIGN_CENTER_VERTICAL)
     48        mainSizer.Add((5,5),0)
     49        if SGData['SGLaue'] in ['-1','2/m','mmm','4/m','4/mmm']:
     50            Ncol = 2
     51        else:
     52            Ncol = 3
     53        OpList = []
     54        for M,T in SGData['SGOps']:
     55            OpList.append(G2spc.MT2text(M,T))
     56        self.oprs = wx.RadioBox(panel,-1,'Choose space group operator?',choices=OpList,
     57            majorDimension=Ncol)
     58        self.oprs.Bind(wx.EVT_RADIOBOX, self.OnOpSelect)
     59        mainSizer.Add(self.oprs,0,wx.ALIGN_CENTER_VERTICAL)
     60        mainSizer.Add((5,5),0)
     61        mainSizer.Add(wx.StaticText(panel,-1,"   Choose unit cell?"),0,wx.ALIGN_CENTER_VERTICAL)
     62        mainSizer.Add((5,5),0)
     63        cellSizer = wx.BoxSizer(wx.HORIZONTAL)
     64        cellSizer.Add((5,0),0)
     65        cellName = ['X','Y','Z']
     66        self.cell = []
     67        for i in range(3):
     68            self.cell.append(wx.SpinCtrl(panel,-1,cellName[i],size=wx.Size(50,20)))
     69            self.cell[-1].SetRange(-3,3)
     70            self.cell[-1].SetValue(0)
     71            self.cell[-1].Bind(wx.EVT_SPINCTRL, self.OnOpSelect)
     72            cellSizer.Add(self.cell[-1],0,wx.ALIGN_CENTER_VERTICAL)
     73        mainSizer.Add(cellSizer,0,)
     74        if self.New:
    7575            choice = ['No','Yes']
    7676            self.new = wx.RadioBox(panel,-1,'Generate new positions?',choices=choice)
    7777            self.new.Bind(wx.EVT_RADIOBOX, self.OnOpSelect)
    7878            mainSizer.Add(self.new,0,wx.ALIGN_CENTER_VERTICAL)
    79             mainSizer.Add((5,5),0)
    80                            
    81             OkBtn = wx.Button(panel,-1,"Ok")
    82             OkBtn.Bind(wx.EVT_BUTTON, self.OnOk)
    83             cancelBtn = wx.Button(panel,-1,"Cancel")
    84             cancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel)
    85             btnSizer = wx.BoxSizer(wx.HORIZONTAL)
    86             btnSizer.Add((20,20),1)
    87             btnSizer.Add(OkBtn)
    88             btnSizer.Add((20,20),1)
    89             btnSizer.Add(cancelBtn)
    90             btnSizer.Add((20,20),1)
    91            
    92             mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10)
    93             panel.SetSizer(mainSizer)
    94             panel.Fit()
    95             self.Fit()
    96            
    97         def OnOpSelect(self,event):
    98             self.OpSelected = [0,0,0,[],0]
    99             if self.SGData['SGInv']:
    100                 self.OpSelected[0] = self.inv.GetSelection()
    101             if self.SGData['SGLatt'] != 'P':           
    102                 self.OpSelected[1] = self.latt.GetSelection()
    103             self.OpSelected[2] = self.oprs.GetSelection()
    104             for i in range(3):
    105                 self.OpSelected[3].append(float(self.cell[i].GetValue()))
    106             self.OpSelected[4] = self.new.GetSelection()
    107                
    108         def GetSelection(self):
    109             return self.OpSelected
    110                            
    111         def OnOk(self,event):
    112             parent = self.GetParent()
    113             parent.Raise()
    114             self.SetReturnCode(wx.ID_OK)
    115             self.MakeModal(False)             
    116             self.Destroy()
    117            
    118         def OnCancel(self,event):
    119             parent = self.GetParent()
    120             parent.Raise()
    121             self.SetReturnCode(wx.ID_CANCEL)
    122             self.MakeModal(False)             
    123             self.Destroy()           
    124        
     79        mainSizer.Add((5,5),0)
     80
     81        OkBtn = wx.Button(panel,-1,"Ok")
     82        OkBtn.Bind(wx.EVT_BUTTON, self.OnOk)
     83        cancelBtn = wx.Button(panel,-1,"Cancel")
     84        cancelBtn.Bind(wx.EVT_BUTTON, self.OnCancel)
     85        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
     86        btnSizer.Add((20,20),1)
     87        btnSizer.Add(OkBtn)
     88        btnSizer.Add((20,20),1)
     89        btnSizer.Add(cancelBtn)
     90        btnSizer.Add((20,20),1)
     91
     92        mainSizer.Add(btnSizer,0,wx.EXPAND|wx.BOTTOM|wx.TOP, 10)
     93        panel.SetSizer(mainSizer)
     94        panel.Fit()
     95        self.Fit()
     96
     97    def OnOpSelect(self,event):
     98        self.OpSelected = [0,0,0,[]]
     99        if self.SGData['SGInv']:
     100            self.OpSelected[0] = self.inv.GetSelection()
     101        if self.SGData['SGLatt'] != 'P':
     102            self.OpSelected[1] = self.latt.GetSelection()
     103        self.OpSelected[2] = self.oprs.GetSelection()
     104        for i in range(3):
     105            self.OpSelected[3].append(float(self.cell[i].GetValue()))
     106        if self.New:
     107            self.OpSelected.append(self.new.GetSelection())
     108
     109    def GetSelection(self):
     110        return self.OpSelected
     111
     112    def OnOk(self,event):
     113        parent = self.GetParent()
     114        parent.Raise()
     115        self.EndModal(wx.ID_OK)
     116        self.Destroy()
     117
     118    def OnCancel(self,event):
     119        parent = self.GetParent()
     120        parent.Raise()
     121        self.EndModal(wx.ID_CANCEL)
     122        self.Destroy()
     123
     124def UpdatePhaseData(self,item,data,oldPage):
     125
    125126    Atoms = []
    126127    self.SelectedRow = 0
    127    
     128
    128129    def BookResize(event):
    129130        w,h = self.GetSize()
    130131        self.dataDisplay.SetSize(wx.Size(w,h))
    131132       
     133    def UpdateGeneral():
     134        generalData = data['General']
     135        atomData = data['Atoms']
     136        generalData['AtomTypes'] = []
     137        generalData['NoAtoms'] = {}
     138        generalData['BondRadii'] = []
     139        generalData['AngleRadii'] = []
     140        generalData['vdWRadii'] = []
     141        generalData['AtomMass'] = []
     142        generalData['Color'] = []
     143        colType = 1
     144        colSS = 7
     145        if generalData['Type'] =='macromolecular':
     146            colType = 4
     147            colSS = 10
     148        for atom in atomData:
     149            atom[colType] = atom[colType].lower().capitalize()              #force to standard form
     150            if generalData['AtomTypes'].count(atom[colType]):
     151                generalData['NoAtoms'][atom[colType]] += atom[colSS-1]*float(atom[colSS+1])
     152            elif atom[colType] != 'UNK':
     153                Info = G2elem.GetAtomInfo(atom[colType])
     154                generalData['AtomTypes'].append(atom[colType])
     155                generalData['BondRadii'].append(Info['Drad'])
     156                generalData['AngleRadii'].append(Info['Arad'])
     157                generalData['vdWRadii'].append(Info['Vdrad'])
     158                generalData['AtomMass'].append(Info['Mass'])
     159                generalData['NoAtoms'][atom[colType]] = atom[colSS-1]*float(atom[colSS+1])
     160                generalData['Color'].append(Info['Color'])
     161
    132162    def FillGeneralGrid():
    133163        rowLabels = ['Phase name','Phase type','Space group',
    134             'Lattice ',' parameters','Scale factor','Elements','No. per cell',
    135             'Atom weight','','Bond radii','Angle radii','Color']
     164            'Lattice ',' parameters','Scale factor','Density','Elements','No. per cell',
     165            'Atom weight','Bond radii','Angle radii','vdw radii','Color']
    136166        def SetLatticeParametersStyle(SGData,table):
    137167            clist = [1,2,3,4,5,6]
     
    167197                    clist = [4,5]
    168198            for c in clist:
    169                 General.SetCellStyle(4,c,VERY_LIGHT_GREY,True)               
    170            
     199                General.SetCellStyle(4,c,VERY_LIGHT_GREY,True)
     200
    171201        def RefreshGeneralGrid(event):
    172                
     202
    173203            r,c =  event.GetRow(),event.GetCol()
    174204            generalData['Name'] = table[0][0]
     
    177207            SpcGp = table[2][0]
    178208            SGErr,SGData = G2spc.SpcGroup(SpcGp)
    179             if r == 2 and c == 0:
     209            if r == 0:
     210                self.G2plotNB.Rename(oldName,generalData['Name'])
     211            elif r == 2 and c == 0:
    180212                if SGErr:
    181213                    text = [G2spc.SGErrors(SGErr)+'\nSpace Group set to previous']
     
    200232            generalData['Scale'][1] = float(General.GetCellValue(5,1))
    201233            General.ForceRefresh()
    202            
     234
     235        UpdateGeneral()
    203236        generalData = data['General']
    204         atomData = data['Atoms']
    205         generalData['AtomTypes'] = []
    206         generalData['NoAtoms'] = {}
    207         generalData['BondRadii'] = []
    208         generalData['AngleRadii'] = []
    209         generalData['AtomMass'] = []
    210         generalData['Color'] = []
    211         colType = 1
    212         colSS = 7
    213         self.dataFrame.setSizePosLeft([600,350])
    214         if generalData['Type'] =='macromolecular':
    215             colType = 4
    216             colSS = 10
    217         for atom in atomData:
    218             atom[colType] = atom[colType].lower().capitalize()              #force to standard form
    219             if generalData['AtomTypes'].count(atom[colType]):
    220                 generalData['NoAtoms'][atom[colType]] += atom[colSS-1]*atom[colSS+1]
    221             elif atom[colType] != 'UNK':
    222                 Info = G2elem.GetAtomInfo(atom[colType])
    223                 generalData['AtomTypes'].append(atom[colType])
    224                 generalData['BondRadii'].append(Info['Drad'])
    225                 generalData['AngleRadii'].append(Info['Arad'])
    226                 generalData['AtomMass'].append(Info['Mass'])
    227                 generalData['NoAtoms'][atom[colType]] = atom[colSS-1]*atom[colSS+1]
    228                 generalData['Color'].append(Info['Color'])
     237        self.dataFrame.setSizePosLeft([750,340])
    229238        colLabels = []
    230239        colLabels += ['' for i in range(max(8,len(generalData['AtomTypes'])))]
     
    242251            rowLabels[6] = 'd min'
    243252        else:
    244             table.append(generalData['AtomTypes']+['' for i in range(max(8,len(generalData['AtomTypes'])))]) #element list
    245253            mass = 0.
    246254            for i,elem in enumerate(generalData['AtomTypes']):
    247255                mass += generalData['NoAtoms'][elem]*generalData['AtomMass'][i]
     256            Volume = generalData['Cell'][7]
     257            if generalData['Type'] == 'macromolecular' and mass > 0.0:
     258                table.append([mass/(0.6022137*Volume),'Matthews coeff.',Volume/mass,'','','','','',''])
     259            else:
     260                table.append([mass/(0.6022137*Volume),'','','','','','','',''])
     261            for i,elem in enumerate(generalData['AtomTypes']):
    248262                line.append(generalData['NoAtoms'][elem])
    249             Volume = generalData['Cell'][7]
     263            table.append(generalData['AtomTypes']+['' for i in range(max(8,len(generalData['AtomTypes'])))]) #element list
    250264            table.append(line+['' for i in range(max(8,len(generalData['AtomTypes'])))]) #No. per cell
    251265            table.append(generalData['AtomMass']+['' for i in range(max(8,len(generalData['AtomTypes'])))])  #At. wt.
    252             if generalData['Type'] == 'macromolecular' and mass > 0.0:
    253                 table.append(['density',mass/(0.6022137*Volume),'Matthews coeff.',Volume/mass,'','','','',''])           
    254             else:
    255                 table.append(['density',mass/(0.6022137*Volume),'','','','','','',''])
    256266            table.append(generalData['BondRadii']+['' for i in range(max(8,len(generalData['AtomTypes'])))])
    257267            table.append(generalData['AngleRadii']+['' for i in range(max(8,len(generalData['AtomTypes'])))])
     268            table.append(generalData['vdWRadii']+['' for i in range(max(8,len(generalData['AtomTypes'])))])
    258269            table.append(['','','','','','','',''])                        #contains colors
    259270        Types = [wg.GRID_VALUE_STRING for i in range(max(8,len(generalData['AtomTypes'])))]
     
    275286                General.SetCellRenderer(4,c,wg.GridCellFloatRenderer(10,5))
    276287                General.SetCellEditor(4,c,wg.GridCellFloatEditor(10,5))
    277                 General.SetReadOnly(9,c,isReadOnly=True)
    278288            else:
    279289                General.SetCellRenderer(4,c,wg.GridCellFloatRenderer(10,3))
    280290                General.SetCellEditor(4,c,wg.GridCellFloatEditor(10,3))
    281             for r in range(6,12):
     291            for r in range(6,13):
    282292                General.SetReadOnly(r,c,isReadOnly=True)
    283293        r = rowLabels.index('Color')
     
    286296
    287297        General.SetReadOnly(4,7,isReadOnly=True)                            #cell volume - no edit
    288         General.SetCellEditor(1,0,wg.GridCellChoiceEditor(['nuclear','modulated',   #phase type 
     298        General.SetCellEditor(1,0,wg.GridCellChoiceEditor(['nuclear','modulated',   #phase type
    289299            'magnetic','macromolecular','Pawley'],False))                           #- change only if no atoms
    290300        if line:                                                    #no.of atoms not zero!
    291301            General.SetReadOnly(1,0,isReadOnly=True)                #can't change phase type
    292         General.SetCellRenderer(4,0,wg.GridCellBoolRenderer())              #lattice parameters           
     302        General.SetCellRenderer(4,0,wg.GridCellBoolRenderer())              #lattice parameters
    293303        General.SetCellEditor(4,0,wg.GridCellBoolEditor())
    294304        SetLatticeParametersStyle(SGData,table)
    295305        General.SetCellRenderer(5,1,wg.GridCellFloatRenderer(10,4))         #scale factor
    296306        General.SetCellEditor(5,1,wg.GridCellFloatEditor(10,4))
    297         General.SetCellRenderer(5,0,wg.GridCellBoolRenderer())           
     307        General.SetCellRenderer(5,0,wg.GridCellBoolRenderer())
    298308        General.SetCellEditor(5,0,wg.GridCellBoolEditor())
    299         General.SetCellRenderer(9,1,wg.GridCellFloatRenderer(8,3))
    300         General.SetCellRenderer(9,3,wg.GridCellFloatRenderer(8,3))
    301    
     309        General.SetCellRenderer(6,0,wg.GridCellFloatRenderer(8,3))
     310        General.SetCellRenderer(6,2,wg.GridCellFloatRenderer(8,3))
     311
    302312    def FillAtomsGrid():
    303        
     313
     314        self.dataFrame.setSizePosLeft([700,300])
    304315        generalData = data['General']
    305316        atomData = data['Atoms']
     317        AAchoice = ": ,ALA,ARG,ASN,ASP,CYS,GLN,GLU,GLY,HIS,ILE,LEU,LYS,MET,PHE,PRO,SER,THR,TRP,TYR,VAL,MSE,HOH,UNK"
    306318        Types = [wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING,wg.GRID_VALUE_CHOICE+": ,X,XU,U,F,FX,FXU,FU",
    307319            wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,4', #x,y,z,frac
    308             wg.GRID_VALUE_STRING,wg.GRID_VALUE_NUMBER,wg.GRID_VALUE_CHOICE+":I,A",
     320            wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING,wg.GRID_VALUE_CHOICE+":I,A",
    309321            wg.GRID_VALUE_FLOAT+':10,4',                                                            #Uiso
    310322            wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING,                         #Uij - placeholders
     
    318330        elif generalData['Type'] == 'macromolecular':
    319331            colLabels = ['res no','residue','chain'] + colLabels
    320             Types = [wg.GRID_VALUE_NUMBER,
    321                 wg.GRID_VALUE_CHOICE+": ,ALA,ARG,ASN,ASP,CYS,GLN,GLU,GLY,HIS,ILE,LEU,LYS,MET,PHE,PRO,SER,THR,TRP,TYR,VAL,MSE,HOH,UNK",
     332            Types = [wg.GRID_VALUE_STRING,
     333                wg.GRID_VALUE_CHOICE+AAchoice,
    322334                wg.GRID_VALUE_STRING] + Types
    323335        elif generalData['Type'] == 'modulated':
    324336            Types += []
    325337            colLabels += []
    326                    
     338
    327339        def RefreshAtomGrid(event):
    328            
     340
    329341            def chkUij(Uij,CSI):
    330342                return Uij
    331                
     343
    332344            r,c =  event.GetRow(),event.GetCol()
    333345            if r < 0 and c < 0:
    334                 Atoms.ClearSelection()
     346                for row in range(Atoms.GetNumberRows()):
     347                    Atoms.SelectRow(row,True)                   
    335348            if r < 0:                          #double click on col label! Change all atoms!
    336349                sel = -1
     
    341354                        choice = ['F - site fraction','X - coordinates','U - thermal parameters']
    342355                    elif Type in ['magnetic',]:
    343                         choice = ['F - site fraction','X - coordinates','U - thermal parameters','M - magnetic moment']                       
     356                        choice = ['F - site fraction','X - coordinates','U - thermal parameters','M - magnetic moment']
    344357                    dlg = wx.MultiChoiceDialog(self,'Select','Refinement controls',choice)
    345358                    if dlg.ShowModal() == wx.ID_OK:
     
    348361                        for x in sel:
    349362                            parms += choice[x][0]
    350                     dlg.Destroy()                           
     363                    dlg.Destroy()
    351364                elif Atoms.GetColLabelValue(c) == 'I/A':
    352365                    choice = ['Isotropic','Anisotropic']
     
    357370                    dlg.Destroy()
    358371                elif Atoms.GetColLabelValue(c) == 'Type':
    359                     choice = generalData['AtomTypes']                           
     372                    choice = generalData['AtomTypes']
    360373                    dlg = wx.SingleChoiceDialog(self,'Select','Atom types',choice)
    361374                    if dlg.ShowModal() == wx.ID_OK:
     
    411424                                Atoms.SelectRow(row,True)
    412425                    dlg.Destroy()
     426                elif Atoms.GetColLabelValue(c) == 'Uiso':       #this needs to ask for value
     427                    pass                                        #& then change all 'I' atoms
    413428                if sel >= 0 and noSkip:
    414429                    ui = colLabels.index('U11')
     
    434449                                Uij = atomData[r][ui:ui+6]
    435450                                atomData[r][us] = (Uij[0]+Uij[1]+Uij[2])/3.0
    436                                 atomData[r][ui:ui+6] = [0,0,0,0,0,0] 
     451                                atomData[r][ui:ui+6] = [0,0,0,0,0,0]
    437452                                Atoms.SetCellRenderer(r,us,wg.GridCellFloatRenderer(10,4))
    438453                                Atoms.SetCellStyle(r,us,WHITE,False)
     
    441456                                    Atoms.SetCellRenderer(r,ci,wg.GridCellStringRenderer())
    442457                                    Atoms.SetCellValue(r,ci,'')
    443                                     Atoms.SetCellStyle(r,ci,VERY_LIGHT_GREY,True)                       
     458                                    Atoms.SetCellStyle(r,ci,VERY_LIGHT_GREY,True)
    444459                        Atoms.SetCellValue(r,c,parms)
    445             elif c < 0:                    #picked atom row
    446                 self.SelectedRow = r
    447460            elif Atoms.GetColLabelValue(c) in ['Name']:
    448461                atomData[r][c] = Atoms.GetCellValue(r,c)
    449462            elif Atoms.GetColLabelValue(c) in ['x','y','z']:
     463                atomData[r][c] = float(Atoms.GetCellValue(r,c))
    450464                ci = colLabels.index('x')
    451465                XYZ = atomData[r][ci:ci+3]
     
    458472                atomData[r][SScol] = Sytsym
    459473                atomData[r][Mulcol] = Mult
     474                Atoms.SetCellValue(r,SScol,Sytsym)
     475                Atoms.SetCellValue(r,Mulcol,str(Mult))
    460476                if atomData[r][colLabels.index('I/A')] == 'A':
    461477                    ui = colLabels.index('U11')
     
    466482                        Atoms.SetCellStyle(r,ci,VERY_LIGHT_GREY,True)
    467483                        if CSI[2][i]:
    468                             Atoms.SetCellStyle(r,ci,WHITE,False)                   
     484                            Atoms.SetCellStyle(r,ci,WHITE,False)
     485                UpdateGeneral()
    469486            elif Atoms.GetColLabelValue(c) == 'I/A':
     487                atomData[r][c] = Atoms.GetCellValue(r,c)
    470488                if atomData[r][c] == 'I':
    471489                    Uij = atomData[r][c+2:c+8]
     
    478496                        Atoms.SetCellRenderer(r,ci,wg.GridCellStringRenderer())
    479497                        Atoms.SetCellValue(r,ci,'')
    480                         Atoms.SetCellStyle(r,ci,VERY_LIGHT_GREY,True)                       
     498                        Atoms.SetCellStyle(r,ci,VERY_LIGHT_GREY,True)
    481499                else:
    482500                    Uiso = atomData[r][c+1]
     
    493511                            Atoms.SetCellStyle(r,ci,WHITE,False)
    494512            elif Atoms.GetColLabelValue(c) in ['U11','U22','U33','U12','U13','U23']:
     513                atomData[r][c] = float(Atoms.GetCellValue(r,c))
    495514                CSI = G2spc.GetCSuinel(atomData[r][colLabels.index('site sym')])
    496                 value = atomData[r][c]
    497515                iUij = CSI[0][c-colLabels.index('U11')]
    498516                for i in range(6):
    499517                    if iUij == CSI[0][i]:
    500518                        atomData[r][i+colLabels.index('U11')] = value*CSI[1][i]
    501             Atoms.ForceRefresh()
    502            
     519            elif Atoms.GetColLabelValue(c) == 'Uiso':
     520                atomData[r][c] = float(Atoms.GetCellValue(r,c))               
     521            data['Atoms'] = atomData
     522
     523        def RowSelect(event):
     524            r,c =  event.GetRow(),event.GetCol()
     525            if r < 0 and c < 0:
     526                if Atoms.IsSelection():
     527                    Atoms.ClearSelection()
     528            elif c < 0:                   #only row clicks
     529                if event.ControlDown():                   
     530                    if r in Atoms.GetSelectedRows():
     531                        Atoms.DeselectRow(r)
     532                    else:
     533                        Atoms.SelectRow(r,True)
     534                elif event.ShiftDown():
     535                    for row in range(r+1):
     536                        Atoms.SelectRow(row,True)
     537                else:
     538                    Atoms.ClearSelection()
     539                    Atoms.SelectRow(r,True)               
     540               
    503541        def ChangeSelection(event):
    504542            r,c =  event.GetRow(),event.GetCol()
     
    514552                    Atoms.DeselectCol(c)
    515553                else:
    516                     Atoms.SelectCol(c,True)           
    517                    
     554                    Atoms.SelectCol(c,True)
     555
    518556        def AtomTypeSelect(event):
    519557            r,c =  event.GetRow(),event.GetCol()
     
    528566                        atomData[r][c-1] = name[:1]+'(%d)'%(r+1)
    529567                PE.Destroy()
    530                 Atoms.ForceRefresh()
     568                UpdateGeneral()
     569                FillAtomsGrid()
    531570            else:
    532571                event.Skip()
    533        
     572
    534573        table = []
    535574        rowLabels = []
     
    544583        Atoms.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshAtomGrid)
    545584        Atoms.Bind(wg.EVT_GRID_LABEL_LEFT_DCLICK, RefreshAtomGrid)
     585        Atoms.Bind(wg.EVT_GRID_LABEL_LEFT_CLICK, RowSelect)
    546586        Atoms.Bind(wg.EVT_GRID_LABEL_RIGHT_CLICK, ChangeSelection)
    547587        Atoms.Bind(wg.EVT_GRID_SELECT_CELL, AtomTypeSelect)
     
    571611                    if CSI[2][i]:
    572612                        Atoms.SetCellStyle(row,ci,WHITE,False)
    573                            
     613
    574614    def AtomAdd(event):
    575615        atomData = data['Atoms']
     
    584624        elif generalData['Type'] == 'magnetic':
    585625            atomData.append(['UNK','UNK','',0,0,0,1,Sytsym,Mult,0,'I',0.01,0,0,0,0,0,0,0,0,0])
    586         FillAtomsGrid()           
     626        FillAtomsGrid()
    587627        event.StopPropagation()
    588                
     628
    589629    def AtomInsert(event):
    590630        indx = Atoms.GetSelectedRows()
     
    602642            elif generalData['Type'] == 'magnetic':
    603643                atomData.insert(indx,['UNK','UNK','',0,0,0,1,Sytsym,Mult,'I',0.01,0,0,0,0,0,0,0,0,0])
    604             FillAtomsGrid()           
     644            FillAtomsGrid()
    605645        event.StopPropagation()
    606        
     646
    607647    def AtomDelete(event):
    608648        indx = Atoms.GetSelectedRows()
     
    612652            for ind in indx:
    613653                atom = atomData[ind]
    614                 del atomData[ind]               
    615             FillAtomsGrid()           
     654                del atomData[ind]
     655            FillAtomsGrid()
    616656        event.StopPropagation()
    617        
     657
    618658    def AtomRefine(event):
     659        colLabels = [Atoms.GetColLabelValue(c) for c in range(Atoms.GetNumberCols())]
     660        c = colLabels.index('refine')
    619661        indx = Atoms.GetSelectedRows()
    620662        if indx:
     
    624666            if Type in ['nuclear','macromolecular']:
    625667                choice = ['F - site fraction','X - coordinates','U - thermal parameters']
    626             elif Type in ['magnetic',]:
    627                 choice = ['F - site fraction','X - coordinates','U - thermal parameters','M - magnetic moment']                       
     668            elif Type == 'magnetic':
     669                choice = ['F - site fraction','X - coordinates','U - thermal parameters','M - magnetic moment']
    628670            dlg = wx.MultiChoiceDialog(self,'Select','Refinement controls',choice)
    629671            if dlg.ShowModal() == wx.ID_OK:
     
    631673                parms = ''
    632674                for x in sel:
    633                     parms += choice[x][0]                           
    634             dlg.Destroy()           
    635             colLabels = [Atoms.GetColLabelValue(c) for c in range(Atoms.GetNumberCols())]
    636             c = colLabels.index('refine')
    637             for r in indx:
    638                 atomData[r][c] = parms
    639             Atoms.ForceRefresh()                           
    640        
    641     def AtomModify(event):
     675                    parms += choice[x][0]
     676                for r in indx:
     677                    atomData[r][c] = parms
     678                Atoms.ForceRefresh()
     679            dlg.Destroy()
     680
     681    def AtomModify(event):                  #intent to implement global modifications (+,-,*,/, etc.)?
    642682        indx = Atoms.GetSelectedRows()
    643683        if indx:
    644684            atomData = data['Atoms']
    645685            generalData = data['General']
    646        
    647     def AtomTransform(event):       
     686
     687    def AtomTransform(event):
    648688        indx = Atoms.GetSelectedRows()
    649689        if indx:
     
    656696            generalData = data['General']
    657697            SGData = generalData['SGData']
    658             dlg = SymOpDialog(self,SGData)
     698            dlg = SymOpDialog(self,SGData,True)
    659699            try:
    660700                if dlg.ShowModal() == wx.ID_OK:
     
    663703                    cent = SGData['SGCen'][Cent]
    664704                    M,T = SGData['SGOps'][Opr]
     705                    print M,T
    665706                    for ind in indx:
    666707                        XYZ = np.array(atomData[ind][cx:cx+3])
     
    678719                            Uij = atom[cuij:cuij+6]
    679720                            U = G2spc.Uij2U(Uij)
    680                             U = np.inner(np.inner(M.T,U),M)
     721                            U = np.inner(np.inner(M,U),M)
    681722                            Uij = G2spc.U2Uij(U)
    682723                            atom[cuij:cuij+6] = Uij
     
    687728            Atoms.ClearSelection()
    688729            if New:
    689                 FillAtomsGrid()           
    690             else:                       
     730                FillAtomsGrid()
     731            else:
    691732                Atoms.ForceRefresh()
     733
     734    def SetupDrawingData():
     735        generalData = data['General']
     736        atomData = data['Atoms']
     737        AA3letter = ['ALA','ARG','ASN','ASP','CYS','GLN','GLU','GLY','HIS','ILE',
     738            'LEU','LYS','MET','PHE','PRO','SER','THR','TRP','TYR','VAL','MSE','HOH','WAT','UNK']
     739        AA1letter = ['A','R','N','D','C','Q','E','G','H','I',
     740            'L','K','M','F','P','S','T','W','Y','V','M',' ',' ',' ']
     741        defaultDrawing = {'viewPoint':[[0.5,0.5,0.5],[0,0]],'showHydrogen':True,'backColor':[0,0,0],'depthFog':False,
     742            'Zclip':50.0,'cameraPos':50.,'pickItem':'Atoms','showBadContacts':False,
     743            'bondRadius':0.1,'ballScale':0.33,'vdwScale':0.67,'ellipseProb':50,'sizeH':0.50,'packing':False,
     744            'unitCellBox':False,'showABC':True,'fogFactor':1.0,'showSymElem':False,'selectedAtoms':[],
     745            'Rotation':[0.0,0.0,0.0,np.array([0,0])],'bondList':{}}
     746        try:
     747            drawingData = data['Drawing']
     748        except KeyError:
     749            data['Drawing'] = {}
     750            drawingData = data['Drawing']
     751        if not drawingData:                 #fill with defaults if empty
     752            drawingData = copy.copy(defaultDrawing)
     753            drawingData['Atoms'] = []
     754        if not drawingData['Atoms']:
     755            for atom in atomData:
     756                if generalData['Type'] == 'nuclear':
     757                    drawingData['Atoms'].append(atom[:2]+atom[3:6]+['1',]+['lines',]+
     758                        ['',]+atom[9:17]+[[]])
     759                    drawingData['atomPtrs'] = [2,1,6]         #x, type & style
     760                elif generalData['Type'] == 'macromolecular':
     761                    try:
     762                        oneLetter = AA3letter.index(atom[1])
     763                    except ValueError:
     764                        oneLetter = -1
     765                    drawingData['Atoms'].append([atom[1].strip()+atom[0],]+
     766                        [AA1letter[oneLetter]+atom[0],]+atom[2:5]+
     767                        atom[6:9]+['1',]+['lines',]+['',]+atom[12:20]+[[]])
     768                    drawingData['atomPtrs'] = [5,4,9]         #x, type & style
     769                elif generalData['Type'] == 'magnetic':
     770                    drawingData['Atoms'].append(atom[:2]+atom[3:6]+['lines',]+['',]+atom[9:20]+[[]])
     771#            elif generalData['Type'] == 'modulated':
     772#                ?????   for future
     773            data['Drawing'] = drawingData
     774
     775    def UpdateDrawAtoms():
     776        self.dataFrame.setSizePosLeft([600,300])
     777        generalData = data['General']
     778        SetupDrawingData()
     779        drawingData = data['Drawing']
     780        atomData = drawingData['Atoms']
     781        Types = [wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING,
     782            wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',wg.GRID_VALUE_FLOAT+':10,5',    #x,y,z
     783            wg.GRID_VALUE_STRING,wg.GRID_VALUE_CHOICE+": ,lines,vdW balls,sticks,balls & sticks,ellipsoids,polyhedra",
     784            wg.GRID_VALUE_CHOICE+": ,type,name,number",wg.GRID_VALUE_STRING,]
     785        styleChoice = [' ','lines','vdW balls','sticks','balls & sticks','ellipsoids','polyhedra']
     786        labelChoice = [' ','type','name','number']
     787        colLabels = ['Name','Type','x','y','z','Sym Op','Style','Label','I/A']
     788        if generalData['Type'] == 'macromolecular':
     789            colLabels = ['Residue','1-letter','Chain'] + colLabels
     790            Types = [wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING,wg.GRID_VALUE_STRING]+Types
     791            Types[8] = wg.GRID_VALUE_CHOICE+": ,lines,vdW balls,sticks,balls & sticks,ellipsoids,ribbons,schematic"
     792            styleChoice = [' ','lines','vdW balls','sticks','balls & sticks','ellipsoids','ribbons','schematic']
     793            labelChoice = [' ','type','name','number','residue','1-letter','chain']
     794            Types[9] = wg.GRID_VALUE_CHOICE+": ,type,name,number,residue,1-letter,chain"
     795#        elif generalData['Type'] == 'modulated':
     796#            Types += []
     797#            colLabels += []
     798
     799        def RefreshAtomGrid(event):
     800
     801            def SetChoice(name,c,n=0):
     802                choice = []
     803                for r in range(len(atomData)):
     804                    if n:
     805                        srchStr = str(atomData[r][c][:n])
     806                    else:
     807                        srchStr = str(atomData[r][c])
     808                    if srchStr not in choice:
     809                        if n:
     810                            choice.append(str(atomData[r][c][:n]))
     811                        else:
     812                            choice.append(str(atomData[r][c]))
     813                choice.sort()
     814
     815                dlg = wx.MultiChoiceDialog(self,'Select',name,choice)
     816                if dlg.ShowModal() == wx.ID_OK:
     817                    sel = dlg.GetSelections()
     818                    parms = []
     819                    for x in sel:
     820                        parms.append(choice[x])
     821                    noSkip = False
     822                    drawAtoms.ClearSelection()
     823                    drawingData['selectedAtoms'] = []
     824                    for row in range(len(atomData)):
     825                        test = atomData[row][c]
     826                        if n:
     827                            test = test[:n]
     828                        if  test in parms:
     829                            drawAtoms.SelectRow(row,True)
     830                            drawingData['selectedAtoms'].append(row)
     831                dlg.Destroy()
     832               
     833            r,c =  event.GetRow(),event.GetCol()
     834            if r < 0 and c < 0:
     835                for row in range(drawAtoms.GetNumberRows()):
     836                    drawingData['selectedAtoms'].append(row)
     837                    drawAtoms.SelectRow(row,True)                   
     838            elif r < 0:                          #dclick on col label
     839                sel = -1
     840                Parms = False
     841                noSkip = True
     842                if drawAtoms.GetColLabelValue(c) == 'Style':
     843                    dlg = wx.SingleChoiceDialog(self,'Select','Atom drawing style',styleChoice)
     844                    if dlg.ShowModal() == wx.ID_OK:
     845                        sel = dlg.GetSelection()
     846                        parms = styleChoice[sel]
     847                        for r in range(len(atomData)):
     848                            atomData[r][c] = parms
     849                            drawAtoms.SetCellValue(r,c,parms)
     850                        FindBonds()
     851                        G2plt.PlotStructure(self,data)
     852                    dlg.Destroy()
     853                elif drawAtoms.GetColLabelValue(c) == 'Label':
     854                    dlg = wx.SingleChoiceDialog(self,'Select','Atom labelling style',labelChoice)
     855                    if dlg.ShowModal() == wx.ID_OK:
     856                        sel = dlg.GetSelection()
     857                        parms = labelChoice[sel]
     858                        for r in range(len(atomData)):
     859                            atomData[r][c] = parms
     860                            drawAtoms.SetCellValue(r,c,parms)
     861                        G2plt.PlotStructure(self,data)
     862                    dlg.Destroy()                   
     863                elif drawAtoms.GetColLabelValue(c) == 'Residue':
     864                    SetChoice('Residue',c,3)
     865                elif drawAtoms.GetColLabelValue(c) == '1-letter':
     866                    SetChoice('1-letter',c,1)
     867                elif drawAtoms.GetColLabelValue(c) == 'Chain':
     868                    SetChoice('Chain',c)
     869                elif drawAtoms.GetColLabelValue(c) == 'Name':
     870                    SetChoice('Name',c)
     871                elif drawAtoms.GetColLabelValue(c) == 'Sym Op':
     872                    SetChoice('Name',c)
     873                elif drawAtoms.GetColLabelValue(c) == 'Type':
     874                    SetChoice('Type',c)
     875                elif drawAtoms.GetColLabelValue(c) in ['x','y','z','I/A']:
     876                    drawAtoms.ClearSelection()
     877            else:
     878                if drawAtoms.GetColLabelValue(c) in ['Style','Label']:
     879                    atomData[r][c] = drawAtoms.GetCellValue(r,c)
     880                    FindBonds()
     881                    G2plt.PlotStructure(self,data)                   
     882                   
     883        def RowSelect(event):
     884            r,c =  event.GetRow(),event.GetCol()
     885            if r < 0 and c < 0:
     886                if drawAtoms.IsSelection():
     887                    drawAtoms.ClearSelection()
     888            elif c < 0:                   #only row clicks
     889                if event.ControlDown():                   
     890                    if r in drawAtoms.GetSelectedRows():
     891                        drawAtoms.DeselectRow(r)
     892                    else:
     893                        drawAtoms.SelectRow(r,True)
     894                elif event.ShiftDown():
     895                    for row in range(r+1):
     896                        drawAtoms.SelectRow(row,True)
     897                else:
     898                    drawAtoms.ClearSelection()
     899                    drawAtoms.SelectRow(r,True)               
     900            drawingData['selectedAtoms'] = []
     901            drawingData['selectedAtoms'] = drawAtoms.GetSelectedRows()
     902               
     903        table = []
     904        rowLabels = []
     905        for i,atom in enumerate(drawingData['Atoms']):
     906            table.append(atom[:colLabels.index('I/A')+1])
     907            rowLabels.append(str(i+1))
     908
     909        atomTable = G2gd.Table(table,rowLabels=rowLabels,colLabels=colLabels,types=Types)
     910        drawAtoms.SetTable(atomTable, True)
     911        drawAtoms.SetMargins(0,0)
     912        drawAtoms.AutoSizeColumns(True)
     913        drawAtoms.SetColSize(colLabels.index('Style'),80)
     914        drawAtoms.Bind(wg.EVT_GRID_CELL_CHANGE, RefreshAtomGrid)
     915        drawAtoms.Bind(wg.EVT_GRID_LABEL_LEFT_DCLICK, RefreshAtomGrid)
     916        drawAtoms.Bind(wg.EVT_GRID_LABEL_LEFT_CLICK, RowSelect)
     917        indx = drawingData['selectedAtoms']
     918        if indx:
     919            for r in range(len(atomData)):
     920                if r in indx:
     921                    drawAtoms.SelectRow(r)
     922        for c in range(len(colLabels)):
     923            if colLabels[c] not in ['Style','Label']:
     924                attr = wg.GridCellAttr()                #needs to be here - gets lost if outside loop!
     925                attr.SetReadOnly(True)
     926                attr.SetBackgroundColour(VERY_LIGHT_GREY)
     927                drawAtoms.SetColAttr(c,attr)
     928        FindBonds()
     929        G2plt.PlotStructure(self,data)
     930
     931    def DrawAtomStyle(event):
     932        indx = drawAtoms.GetSelectedRows()
     933        if indx:
     934            generalData = data['General']
     935            atomData = data['Drawing']['Atoms']
     936            cx,ct,cs = data['Drawing']['atomPtrs']
     937            styleChoice = [' ','lines','vdW balls','sticks','balls & sticks','ellipsoids','polyhedra']
     938            if generalData['Type'] == 'macromolecular':
     939                styleChoice = [' ','lines','vdW balls','sticks','balls & sticks','ellipsoids','ribbons','schematic']
     940            dlg = wx.SingleChoiceDialog(self,'Select','Atom drawing style',styleChoice)
     941            if dlg.ShowModal() == wx.ID_OK:
     942                sel = dlg.GetSelection()
     943                parms = styleChoice[sel]
     944                for r in indx:
     945                    atomData[r][cs] = parms
     946                    drawAtoms.SetCellValue(r,cs,parms)
     947            dlg.Destroy()
     948            FindBonds()
     949            G2plt.PlotStructure(self,data)
     950
     951    def DrawAtomLabel(event):
     952        indx = drawAtoms.GetSelectedRows()
     953        if indx:
     954            generalData = data['General']
     955            atomData = data['Drawing']['Atoms']
     956            cx,ct,cs = data['Drawing']['atomPtrs']
     957            styleChoice = [' ','type','name','number']
     958            if generalData['Type'] == 'macromolecular':
     959                styleChoice = [' ','type','name','number','residue','1-letter','chain']
     960            dlg = wx.SingleChoiceDialog(self,'Select','Atom label style',styleChoice)
     961            if dlg.ShowModal() == wx.ID_OK:
     962                sel = dlg.GetSelection()
     963                parms = styleChoice[sel]
     964                for r in indx:
     965                    atomData[r][cs+1] = parms
     966                    drawAtoms.SetCellValue(r,cs+1,parms)
     967            dlg.Destroy()
     968            G2plt.PlotStructure(self,data)
     969
     970    def SetViewPoint(event):
     971        indx = drawAtoms.GetSelectedRows()
     972        if indx:
     973            atomData = data['Drawing']['Atoms']
     974            cx = data['Drawing']['atomPtrs'][0]
     975            data['Drawing']['viewPoint'] = [atomData[indx[0]][cx:cx+3],[indx[0],0]]
     976            drawAtoms.ClearSelection()                                  #do I really want to do this?
     977            G2plt.PlotStructure(self,data)
     978           
     979    def noDuplicate(xyz,atomData):                  #be careful where this is used - it's slow
     980        cx = data['Drawing']['atomPtrs'][0]
     981        if True in [np.allclose(np.array(xyz),np.array(atom[cx:cx+3]),atol=0.0002) for atom in atomData]:
     982            return False
     983        else:
     984            return True
     985               
     986    def AddSymEquiv(event):
     987        indx = drawAtoms.GetSelectedRows()
     988        indx.sort()
     989        if indx:
     990            colLabels = [drawAtoms.GetColLabelValue(c) for c in range(drawAtoms.GetNumberCols())]
     991            cx = colLabels.index('x')
     992            cuia = colLabels.index('I/A')
     993            cuij = cuia+2
     994            atomData = data['Drawing']['Atoms']
     995            generalData = data['General']
     996            SGData = generalData['SGData']
     997            dlg = SymOpDialog(self,SGData,False)
     998            try:
     999                if dlg.ShowModal() == wx.ID_OK:
     1000                    Inv,Cent,Opr,Cell = dlg.GetSelection()
     1001                    Cell = np.array(Cell)
     1002                    cent = SGData['SGCen'][Cent]
     1003                    M,T = SGData['SGOps'][Opr]
     1004                    for ind in indx:
     1005                        XYZ = np.array(atomData[ind][cx:cx+3])
     1006                        XYZ = np.inner(M,XYZ)+T
     1007                        if Inv:
     1008                            XYZ = -XYZ
     1009                        XYZ = XYZ+cent+Cell
     1010                        if noDuplicate(XYZ,atomData):
     1011                            atom = copy.copy(atomData[ind])
     1012                            atom[cx:cx+3] = XYZ
     1013                            atom[cx+3] = str(((Opr+1)+100*Cent)*(1-2*Inv))+'+'+ \
     1014                                str(int(Cell[0]))+str(int(Cell[1]))+str(int(Cell[2]))
     1015                            if atom[cuia] == 'A':
     1016                                Uij = atom[cuij:cuij+6]
     1017                                U = G2spc.Uij2U(Uij)
     1018                                U = np.inner(np.inner(M,U),M)
     1019                                Uij = G2spc.U2Uij(U)
     1020                                atom[cuij:cuij+6] = Uij
     1021                            atomData.append(atom)
     1022            finally:
     1023                dlg.Destroy()
     1024            UpdateDrawAtoms()
     1025            G2plt.PlotStructure(self,data)
     1026           
     1027    def TransformSymEquiv(event):
     1028        indx = drawAtoms.GetSelectedRows()
     1029        indx.sort()
     1030        if indx:
     1031            atomData = data['Drawing']['Atoms']
     1032            colLabels = [drawAtoms.GetColLabelValue(c) for c in range(drawAtoms.GetNumberCols())]
     1033            cx = colLabels.index('x')
     1034            cuia = colLabels.index('I/A')
     1035            cuij = cuia+2
     1036            atomData = data['Drawing']['Atoms']
     1037            generalData = data['General']
     1038            SGData = generalData['SGData']
     1039            dlg = SymOpDialog(self,SGData,False)
     1040            try:
     1041                if dlg.ShowModal() == wx.ID_OK:
     1042                    Inv,Cent,Opr,Cell = dlg.GetSelection()
     1043                    Cell = np.array(Cell)
     1044                    cent = SGData['SGCen'][Cent]
     1045                    M,T = SGData['SGOps'][Opr]
     1046                    for ind in indx:
     1047                        XYZ = np.array(atomData[ind][cx:cx+3])
     1048                        XYZ = np.inner(M,XYZ)+T
     1049                        if Inv:
     1050                            XYZ = -XYZ
     1051                        XYZ = XYZ+cent+Cell
     1052                        atom = atomData[ind]
     1053                        atom[cx:cx+3] = XYZ
     1054                        atom[cx+3] = str(((Opr+1)+100*Cent)*(1-2*Inv))+'+'+ \
     1055                            str(int(Cell[0]))+str(int(Cell[1]))+str(int(Cell[2]))
     1056                        if atom[cuia] == 'A':
     1057                            Uij = atom[cuij:cuij+6]
     1058                            U = G2spc.Uij2U(Uij)
     1059                            U = np.inner(np.inner(M,U),M)
     1060                            Uij = G2spc.U2Uij(U)
     1061                            atom[cuij:cuij+6] = Uij
     1062                    data['Drawing']['Atoms'] = atomData
     1063            finally:
     1064                dlg.Destroy()
     1065            UpdateDrawAtoms()
     1066            G2plt.PlotStructure(self,data)
     1067           
     1068    def FillCoordSphere(event):
     1069        generalData = data['General']
     1070        Amat,Bmat = G2lat.cell2AB(generalData['Cell'][1:7])
     1071        radii = generalData['BondRadii']
     1072        atomTypes = generalData['AtomTypes']
     1073        try:
     1074            indH = atomTypes.index('H')
     1075            radii[indH] = 0.5
     1076        except:
     1077            pass           
     1078        indx = drawAtoms.GetSelectedRows()
     1079        if indx:
     1080            indx.sort()
     1081            atomData = data['Drawing']['Atoms']
     1082            numAtoms = len(atomData)
     1083            cx,ct,cs = data['Drawing']['atomPtrs']
     1084            generalData = data['General']
     1085            SGData = generalData['SGData']
     1086            cellArray = G2lat.CellBlock(1)
     1087            for ind in indx:
     1088                atomA = atomData[ind]
     1089                xyzA = np.array(atomA[cx:cx+3])
     1090                indA = atomTypes.index(atomA[ct])
     1091                for atomB in atomData[:numAtoms]:
     1092                    indB = atomTypes.index(atomB[ct])
     1093                    sumR = radii[indA]+radii[indB]
     1094                    xyzB = np.array(atomB[cx:cx+3])
     1095                    for xyz in cellArray+xyzB:
     1096                        dist = np.sqrt(np.sum(np.inner(Amat,xyz-xyzA)**2))
     1097                        if 0 < dist <= 0.85*sumR:
     1098                            if noDuplicate(xyz,atomData):
     1099                                newAtom = atomB[:]
     1100                                newAtom[cx:cx+3] = xyz
     1101                                atomData.append(newAtom)
     1102            data['Drawing']['Atoms'] = atomData
     1103            UpdateDrawAtoms()
     1104            FindBonds()
     1105            G2plt.PlotStructure(self,data)
     1106           
     1107    def FillUnitCell(event):
     1108        indx = drawAtoms.GetSelectedRows()
     1109        indx.sort()
     1110        if indx:
     1111            atomData = data['Drawing']['Atoms']
     1112            colLabels = [drawAtoms.GetColLabelValue(c) for c in range(drawAtoms.GetNumberCols())]
     1113            cx = colLabels.index('x')
     1114            cuia = colLabels.index('I/A')
     1115            cuij = cuia+2
     1116            generalData = data['General']
     1117            SGData = generalData['SGData']
     1118            for ind in indx:
     1119                atom = atomData[ind]
     1120                XYZ = np.array(atom[cx:cx+3])
     1121                if atom[cuia] == 'A':
     1122                    Uij = atom[cuij:cuij+6]
     1123                    result = G2spc.GenAtom(XYZ,SGData,False,Uij)
     1124                    for item in result:
     1125                        atom = copy.copy(atomData[ind])
     1126                        atom[cx:cx+3] = item[0]
     1127                        atom[cx+3] = str(item[2])+'+000'
     1128                        atom[cuij:cuij+6] = item[1]
     1129                        Opp = G2spc.Opposite(item[0])
     1130                        for xyz in Opp:
     1131                            if noDuplicate(xyz,atomData):
     1132                                atom[cx:cx+3] = xyz
     1133                                atomData.append(atom[:])
     1134                else:
     1135                    result = G2spc.GenAtom(XYZ,SGData,False)
     1136                    for item in result:
     1137                        atom = copy.copy(atomData[ind])
     1138                        atom[cx:cx+3] = item[0]
     1139                        atom[cx+3] = str(item[1])+'+000'
     1140                        Opp = G2spc.Opposite(item[0])
     1141                        for xyz in Opp:
     1142                            if noDuplicate(xyz,atomData):
     1143                                atom[cx:cx+3] = xyz
     1144                                atomData.append(atom[:])               
     1145                data['Drawing']['Atoms'] = atomData
     1146               
     1147            UpdateDrawAtoms()
     1148            G2plt.PlotStructure(self,data)
     1149           
     1150    def FindBonds6():
     1151        cx,ct,cs = data['Drawing']['atomPtrs']
     1152        atomData = data['Drawing']['Atoms']
     1153        generalData = data['General']
     1154        Amat,Bmat = G2lat.cell2AB(generalData['Cell'][1:7])
     1155        radii = generalData['BondRadii']
     1156        atomTypes = generalData['AtomTypes']
     1157        try:
     1158            indH = atomTypes.index('H')
     1159            radii[indH] = 0.5
     1160        except:
     1161            pass           
     1162        for atom in atomData:
     1163            atom[-1] = []               #clear out old bonds
    6921164       
    693     def UpdateDrawing():
    694         print 'Drawing'
     1165           
     1166    def FindBonds():
     1167        cx,ct,cs = data['Drawing']['atomPtrs']
     1168        atomData = data['Drawing']['Atoms']
     1169        generalData = data['General']
     1170        Amat,Bmat = G2lat.cell2AB(generalData['Cell'][1:7])
     1171        radii = generalData['BondRadii']
     1172        atomTypes = generalData['AtomTypes']
     1173        try:
     1174            indH = atomTypes.index('H')
     1175            radii[indH] = 0.5
     1176        except:
     1177            pass           
     1178        for atom in atomData:
     1179            atom[-1] = []               #clear out old bonds
     1180        for i,atomA in enumerate(atomData):
     1181            if atomA[cs] in ['lines','sticks','ellipsoids','balls & sticks','polyhedra']:
     1182                xyzA = np.array(atomA[cx:cx+3])
     1183                indA = atomTypes.index(atomA[ct])
     1184                for j,atomB in enumerate(atomData):
     1185                    xyzB = np.array(atomB[cx:cx+3])
     1186                    indB = atomTypes.index(atomB[ct])
     1187                    Dx = xyzB-xyzA
     1188                    DX = np.inner(Amat,Dx)
     1189                    dist = np.sqrt(np.sum(DX**2))
     1190                    sumR = radii[indA]+radii[indB]
     1191                    if 0 < dist <= 0.85*sumR:
     1192                        inc = i+1
     1193                        if atomA[cs] == 'polyhedra':
     1194                            atomA[-1].append(np.inner(Amat,Dx))
     1195                        elif atomB[cs] != 'polyhedra':
     1196                            atomA[-1].append(Dx*radii[indA]/sumR)
     1197                            atomB[-1].append(-Dx*radii[indB]/sumR)
     1198
     1199    def DrawAtomsDelete(event):   
     1200        indx = drawAtoms.GetSelectedRows()
     1201        indx.sort()
     1202        if indx:
     1203            atomData = data['Drawing']['Atoms']
     1204            indx.reverse()
     1205            for ind in indx:
     1206                atom = atomData[ind]
     1207                del atomData[ind]
     1208            UpdateDrawAtoms()
     1209            G2plt.PlotStructure(self,data)
     1210        event.StopPropagation()
     1211
     1212    def UpdateDrawOptions():
     1213        import copy
     1214        import wx.lib.colourselect as wcs
     1215        self.dataFrame.setSizePosLeft([300,470])
     1216        generalData = data['General']
     1217        SetupDrawingData()
     1218        drawingData = data['Drawing']
     1219        if generalData['Type'] == 'nuclear':
     1220            pickChoice = ['Atoms','Bonds','Torsions','Planes']
     1221        elif generalData['Type'] == 'macromolecular':
     1222            pickChoice = ['Atoms','Residues','Chains','Bonds','Torsions','Planes','phi/psi']
     1223
     1224        def OnZclip(event):
     1225            drawingData['Zclip'] = Zclip.GetValue()
     1226            ZclipTxt.SetLabel('Z clipping: '+'%.2fA'%(drawingData['Zclip']*drawingData['cameraPos']/100.))
     1227            G2plt.PlotStructure(self,data)
     1228           
     1229        def OnCameraPos(event):
     1230            drawingData['cameraPos'] = cameraPos.GetValue()
     1231            cameraPosTxt.SetLabel('Camera Position: '+'%.2f'%(drawingData['cameraPos']))
     1232            ZclipTxt.SetLabel('Z clipping: '+'%.2fA'%(drawingData['Zclip']*drawingData['cameraPos']/100.))
     1233            G2plt.PlotStructure(self,data)
     1234
     1235        def OnBackColor(event):
     1236            drawingData['backColor'] = event.GetValue()
     1237            G2plt.PlotStructure(self,data)
     1238
     1239        def OnDepthFog(event):
     1240            drawingData['depthFog'] = depthFog.GetValue()
     1241            G2plt.PlotStructure(self,data)
     1242
     1243        def OnFogFactor(event):
     1244            drawingData['fogFactor'] = fogFactor.GetValue()/100.
     1245            fogFactorTxt.SetLabel('Fog factor: '+'%.2f'%(drawingData['fogFactor']))
     1246            G2plt.PlotStructure(self,data)
     1247
     1248        def OnBallScale(event):
     1249            drawingData['ballScale'] = ballScale.GetValue()/100.
     1250            ballScaleTxt.SetLabel('Ball scale: '+'%.2f'%(drawingData['ballScale']))
     1251            G2plt.PlotStructure(self,data)
     1252
     1253        def OnVdWScale(event):
     1254            drawingData['vdwScale'] = vdwScale.GetValue()/100.
     1255            vdwScaleTxt.SetLabel('van der Waals scale: '+'%.2f'%(drawingData['vdwScale']))
     1256            G2plt.PlotStructure(self,data)
     1257
     1258        def OnEllipseProb(event):
     1259            drawingData['ellipseProb'] = ellipseProb.GetValue()
     1260            ellipseProbTxt.SetLabel('Ellipsoid probability: '+'%d%%'%(drawingData['ellipseProb']))
     1261            G2plt.PlotStructure(self,data)
     1262
     1263        def OnBondRadius(event):
     1264            drawingData['bondRadius'] = bondRadius.GetValue()/100.
     1265            bondRadiusTxt.SetLabel('Bond radius, A: '+'%.2f'%(drawingData['bondRadius']))
     1266            G2plt.PlotStructure(self,data)
     1267
     1268        def OnShowABC(event):
     1269            drawingData['showABC'] = showABC.GetValue()
     1270            G2plt.PlotStructure(self,data)
     1271
     1272        def OnShowUnitCell(event):
     1273            drawingData['unitCellBox'] = unitCellBox.GetValue()
     1274            G2plt.PlotStructure(self,data)
     1275
     1276        def OnPacking(event):
     1277            drawingData['packing'] = packing.GetValue()
     1278
     1279        def OnShowBadContacts(event):
     1280            drawingData['showBadContacts'] = showBadContacts.GetValue()
     1281
     1282        def OnShowSymElem(event):
     1283            drawingData['showSymElem'] = showSymElem.GetValue()
     1284
     1285        def OnShowHyd(event):
     1286            drawingData['showHydrogen'] = showHydrogen.GetValue()
     1287            G2plt.PlotStructure(self,data)
     1288
     1289        def OnSizeHatoms(event):
     1290            try:
     1291                value = max(0.1,min(1.2,float(sizeH.GetValue())))
     1292            except ValueError:
     1293                value = 0.5
     1294            drawingData['sizeH'] = value
     1295            sizeH.SetValue("%.2f"%(value))
     1296            G2plt.PlotStructure(self,data)
     1297
     1298        def OnPickItem(event):
     1299            drawingData['pickItem'] = pickChoice[pickItem.GetSelection()]
     1300
     1301        dataDisplay = wx.Panel(drawOptions)
     1302        mainSizer = wx.BoxSizer(wx.VERTICAL)
     1303        mainSizer.Add((5,5),0)
     1304        mainSizer.Add(wx.StaticText(dataDisplay,-1,'Drawing controls:'),0,wx.ALIGN_CENTER_VERTICAL)
     1305        mainSizer.Add((5,5),0)
    6951306       
     1307        slopSizer = wx.BoxSizer(wx.HORIZONTAL)
     1308        slideSizer = wx.FlexGridSizer(7,2,5,0)
     1309        slideSizer.AddGrowableCol(1,1)
     1310
     1311        cameraPosTxt = wx.StaticText(dataDisplay,-1,
     1312            'Camera Position: '+'%.2f'%(drawingData['cameraPos']),name='cameraPos')
     1313        slideSizer.Add(cameraPosTxt,0,wx.ALIGN_CENTER_VERTICAL)
     1314        cameraPos = wx.Slider(dataDisplay,style=wx.SL_HORIZONTAL,value=drawingData['cameraPos'],name='cameraSlider')
     1315        cameraPos.SetRange(10,500)
     1316        cameraPos.Bind(wx.EVT_SLIDER, OnCameraPos)
     1317        slideSizer.Add(cameraPos,1,wx.EXPAND|wx.RIGHT)
     1318       
     1319        ZclipTxt = wx.StaticText(dataDisplay,-1,'Z clipping: '+'%.2fA'%(drawingData['Zclip']*drawingData['cameraPos']/100.))
     1320        slideSizer.Add(ZclipTxt,0,wx.ALIGN_CENTER_VERTICAL)
     1321        Zclip = wx.Slider(dataDisplay,style=wx.SL_HORIZONTAL,value=drawingData['Zclip'])
     1322        Zclip.SetRange(1,99)
     1323        Zclip.Bind(wx.EVT_SLIDER, OnZclip)
     1324        slideSizer.Add(Zclip,1,wx.EXPAND|wx.RIGHT)
     1325       
     1326        vdwScaleTxt = wx.StaticText(dataDisplay,-1,'van der Waals scale: '+'%.2f'%(drawingData['vdwScale']))
     1327        slideSizer.Add(vdwScaleTxt,0,wx.ALIGN_CENTER_VERTICAL)
     1328        vdwScale = wx.Slider(dataDisplay,style=wx.SL_HORIZONTAL,value=int(100*drawingData['vdwScale']))
     1329        vdwScale.Bind(wx.EVT_SLIDER, OnVdWScale)
     1330        slideSizer.Add(vdwScale,1,wx.EXPAND|wx.RIGHT)
     1331
     1332        ellipseProbTxt = wx.StaticText(dataDisplay,-1,'Ellipsoid probability: '+'%d%%'%(drawingData['ellipseProb']))
     1333        slideSizer.Add(ellipseProbTxt,0,wx.ALIGN_CENTER_VERTICAL)
     1334        ellipseProb = wx.Slider(dataDisplay,style=wx.SL_HORIZONTAL,value=drawingData['ellipseProb'])
     1335        ellipseProb.SetRange(1,99)
     1336        ellipseProb.Bind(wx.EVT_SLIDER, OnEllipseProb)
     1337        slideSizer.Add(ellipseProb,1,wx.EXPAND|wx.RIGHT)
     1338
     1339        ballScaleTxt = wx.StaticText(dataDisplay,-1,'Ball scale: '+'%.2f'%(drawingData['ballScale']))
     1340        slideSizer.Add(ballScaleTxt,0,wx.ALIGN_CENTER_VERTICAL)
     1341        ballScale = wx.Slider(dataDisplay,style=wx.SL_HORIZONTAL,value=int(100*drawingData['ballScale']))
     1342        ballScale.Bind(wx.EVT_SLIDER, OnBallScale)
     1343        slideSizer.Add(ballScale,1,wx.EXPAND|wx.RIGHT)
     1344
     1345        bondRadiusTxt = wx.StaticText(dataDisplay,-1,'Bond radius, A: '+'%.2f'%(drawingData['bondRadius']))
     1346        slideSizer.Add(bondRadiusTxt,0,wx.ALIGN_CENTER_VERTICAL)
     1347        bondRadius = wx.Slider(dataDisplay,style=wx.SL_HORIZONTAL,value=int(100*drawingData['bondRadius']))
     1348        bondRadius.SetRange(1,25)
     1349        bondRadius.Bind(wx.EVT_SLIDER, OnBondRadius)
     1350        slideSizer.Add(bondRadius,1,wx.EXPAND|wx.RIGHT)
     1351       
     1352        fogFactorTxt = wx.StaticText(dataDisplay,-1,'Fog factor: '+'%.2f'%(drawingData['fogFactor']))
     1353        slideSizer.Add(fogFactorTxt,0,wx.ALIGN_CENTER_VERTICAL)
     1354        fogFactor = wx.Slider(dataDisplay,style=wx.SL_HORIZONTAL,value=int(100*drawingData['fogFactor']))
     1355        fogFactor.Bind(wx.EVT_SLIDER, OnFogFactor)
     1356        slideSizer.Add(fogFactor,1,wx.EXPAND|wx.RIGHT)
     1357
     1358        slopSizer.Add(slideSizer,1,wx.EXPAND|wx.RIGHT)
     1359        slopSizer.Add((10,5),0)
     1360        mainSizer.Add(slopSizer,1,wx.EXPAND)
     1361
     1362        flexSizer = wx.FlexGridSizer(7,2,5,0)
     1363        flexSizer.Add(wx.StaticText(dataDisplay,-1,'View Point:  '),0,wx.ALIGN_CENTER_VERTICAL)
     1364        VP = drawingData['viewPoint'][0]
     1365        viewPoint = wx.TextCtrl(dataDisplay,value='%.3f, %.3f, %.3f'%(VP[0],VP[1],VP[2]),
     1366            style=wx.TE_READONLY,size=wx.Size(120,20),name='viewPoint')
     1367        viewPoint.SetBackgroundColour(VERY_LIGHT_GREY)
     1368        flexSizer.Add(viewPoint,0,wx.ALIGN_CENTER_VERTICAL)
     1369       
     1370        depthFog = wx.CheckBox(dataDisplay,-1,label='Use depth fog?')
     1371        depthFog.Bind(wx.EVT_CHECKBOX, OnDepthFog)
     1372        depthFog.SetValue(drawingData['depthFog'])
     1373        flexSizer.Add(depthFog,0,wx.ALIGN_CENTER_VERTICAL)
     1374        lineSizer = wx.BoxSizer(wx.HORIZONTAL)
     1375        lineSizer.Add(wx.StaticText(dataDisplay,-1,'Background color:'),0,wx.ALIGN_CENTER_VERTICAL)
     1376        backColor = wcs.ColourSelect(dataDisplay, -1,colour=drawingData['backColor'],size=wx.Size(25,25))
     1377        backColor.Bind(wcs.EVT_COLOURSELECT, OnBackColor)
     1378        lineSizer.Add(backColor,0,wx.ALIGN_CENTER_VERTICAL)
     1379        flexSizer.Add(lineSizer,0,)
     1380
     1381        showABC = wx.CheckBox(dataDisplay,-1,label='Show cell vectors?')
     1382        showABC.Bind(wx.EVT_CHECKBOX, OnShowABC)
     1383        showABC.SetValue(drawingData['showABC'])
     1384        flexSizer.Add(showABC,0,wx.ALIGN_CENTER_VERTICAL)
     1385
     1386        unitCellBox = wx.CheckBox(dataDisplay,-1,label='Show unit cell?')
     1387        unitCellBox.Bind(wx.EVT_CHECKBOX, OnShowUnitCell)
     1388        unitCellBox.SetValue(drawingData['unitCellBox'])
     1389        flexSizer.Add(unitCellBox,0,wx.ALIGN_CENTER_VERTICAL)
     1390
     1391        packing = wx.CheckBox(dataDisplay,-1,label='Packing diagram?')
     1392        packing.Bind(wx.EVT_CHECKBOX, OnPacking)
     1393        packing.SetValue(drawingData['packing'])
     1394        flexSizer.Add(packing,0,wx.ALIGN_CENTER_VERTICAL)
     1395
     1396        showBadContacts = wx.CheckBox(dataDisplay,-1,label='Show bad contacts?')
     1397        showBadContacts.Bind(wx.EVT_CHECKBOX, OnShowBadContacts)
     1398        showBadContacts.SetValue(drawingData['showBadContacts'])
     1399        flexSizer.Add(showBadContacts,0,wx.ALIGN_CENTER_VERTICAL)
     1400
     1401        showSymElem = wx.CheckBox(dataDisplay,-1,label='Show sym. elem.?')
     1402        showSymElem.Bind(wx.EVT_CHECKBOX, OnShowSymElem)
     1403        showSymElem.SetValue(drawingData['showSymElem'])
     1404        flexSizer.Add(showSymElem,0,wx.ALIGN_CENTER_VERTICAL)
     1405
     1406        showHydrogen = wx.CheckBox(dataDisplay,-1,label='Show hydrogens?')
     1407        showHydrogen.Bind(wx.EVT_CHECKBOX, OnShowHyd)
     1408        showHydrogen.SetValue(drawingData['showHydrogen'])
     1409        flexSizer.Add(showHydrogen,0,wx.ALIGN_CENTER_VERTICAL)
     1410
     1411        flexSizer.Add(wx.StaticText(dataDisplay,-1,'Hydrogen radius, A:  '),0,wx.ALIGN_CENTER_VERTICAL)
     1412        sizeH = wx.TextCtrl(dataDisplay,-1,value='%.2f'%(drawingData['sizeH']),style=wx.TE_PROCESS_ENTER)
     1413        sizeH.Bind(wx.EVT_TEXT_ENTER,OnSizeHatoms)
     1414        sizeH.Bind(wx.EVT_KILL_FOCUS,OnSizeHatoms)
     1415        flexSizer.Add(sizeH,0,wx.ALIGN_CENTER_VERTICAL)
     1416
     1417        flexSizer.Add(wx.StaticText(dataDisplay,-1,'Pick items on drawing by:  '),0,wx.ALIGN_CENTER_VERTICAL)
     1418        pickItem = wx.Choice(dataDisplay,-1,choices=pickChoice)
     1419        pickItem.Bind(wx.EVT_CHOICE, OnPickItem)
     1420        pickItem.SetSelection(pickChoice.index(drawingData['pickItem']))
     1421        flexSizer.Add(pickItem,0,wx.ALIGN_CENTER_VERTICAL)
     1422        mainSizer.Add(flexSizer,0,)
     1423        mainSizer.SetMinSize(wx.Size(300,370))
     1424
     1425        dataDisplay.SetSizer(mainSizer)
     1426        self.dataFrame.SetSize(dataDisplay.Fit())
     1427
    6961428    def FillPawleyReflectionsGrid():
    6971429        generalData = data['General']
    698        
     1430
    6991431        print 'Pawley reflections'
    700        
     1432
    7011433    def OnPageChanged(event):
    7021434        page = event.GetSelection()
     
    7121444            FillAtomsGrid()
    7131445        elif text == 'General':
    714             FillGeneralGrid()                   
     1446            FillGeneralGrid()
    7151447            self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
     1448        elif text == 'Draw Options':
     1449            self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
     1450            UpdateDrawOptions()
     1451            G2plt.PlotStructure(self,data)
     1452        elif text == 'Draw Atoms':
     1453            self.dataFrame.SetMenuBar(self.dataFrame.DrawAtomsMenu)
     1454            self.dataFrame.Bind(wx.EVT_MENU, DrawAtomStyle, id=G2gd.wxID_DRAWATOMSTYLE)
     1455            self.dataFrame.Bind(wx.EVT_MENU, DrawAtomLabel, id=G2gd.wxID_DRAWATOMLABEL)
     1456            self.dataFrame.Bind(wx.EVT_MENU, SetViewPoint, id=G2gd.wxID_DRAWVIEWPOINT)
     1457            self.dataFrame.Bind(wx.EVT_MENU, AddSymEquiv, id=G2gd.wxID_DRAWADDEQUIV)
     1458            self.dataFrame.Bind(wx.EVT_MENU, TransformSymEquiv, id=G2gd.wxID_DRAWTRANSFORM)
     1459            self.dataFrame.Bind(wx.EVT_MENU, FillCoordSphere, id=G2gd.wxID_DRAWFILLCOORD)           
     1460            self.dataFrame.Bind(wx.EVT_MENU, FillUnitCell, id=G2gd.wxID_DRAWFILLCELL)
     1461            self.dataFrame.Bind(wx.EVT_MENU, DrawAtomsDelete, id=G2gd.wxID_DRAWDELETE)
     1462            UpdateDrawAtoms()
     1463            G2plt.PlotStructure(self,data)
    7161464        else:
    7171465            self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
    7181466        event.Skip()
    719        
     1467
    7201468    if self.dataDisplay:
    721         self.dataDisplay.Destroy()                   
     1469        self.dataDisplay.Destroy()
    7221470    PhaseName = self.PatternTree.GetItemText(item)
    7231471    self.dataFrame.SetMenuBar(self.dataFrame.BlankMenu)
     
    7251473    self.dataFrame.CreateStatusBar()
    7261474    self.dataDisplay = G2gd.GSNoteBook(parent=self.dataFrame,size=self.dataFrame.GetClientSize())
    727    
     1475
    7281476    General = G2gd.GSGrid(self.dataDisplay)
    7291477    FillGeneralGrid()
    7301478    self.dataDisplay.AddPage(General,'General')
    731      
     1479
    7321480    GeneralData = data['General']
    7331481    if GeneralData['Type'] == 'Pawley':
     
    7371485        Atoms = G2gd.GSGrid(self.dataDisplay)
    7381486        self.dataDisplay.AddPage(Atoms,'Atoms')
    739         Drawing = wx.Window(self.dataDisplay)
    740         self.dataDisplay.AddPage(Drawing,'Drawing')
    741    
     1487        drawOptions = wx.Window(self.dataDisplay)
     1488        self.dataDisplay.AddPage(drawOptions,'Draw Options')
     1489        drawAtoms = G2gd.GSGrid(self.dataDisplay)
     1490        self.dataDisplay.AddPage(drawAtoms,'Draw Atoms')
     1491
    7421492    self.dataDisplay.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, OnPageChanged)
    7431493    self.dataDisplay.SetSelection(oldPage)
    7441494   
     1495           
  • trunk/GSASIIplot.py

    r137 r155  
    33import copy
    44import numpy as np
     5import numpy.linalg as nl
    56import wx
    67import wx.aui
     8import wx.glcanvas
    79import matplotlib as mpl
    810import GSASIIpath
     
    1214import GSASIIpwdGUI as G2pdG
    1315import GSASIIimgGUI as G2imG
     16import GSASIIphsGUI as G2phG
     17import GSASIIlattice as G2lat
     18import GSASIIspc as G2spc
     19from  OpenGL.GL import *
     20from OpenGL.GLU import *
     21from OpenGL.GLUT import *
    1422from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as Canvas
    1523from matplotlib.backends.backend_wxagg import NavigationToolbar2Wx as Toolbar
     
    2432atand = lambda x: 180.*math.atan(x)/math.pi
    2533   
    26 class G2Plot(wx.Panel):
    27    
     34class G2PlotMpl(wx.Panel):   
    2835    def __init__(self,parent,id=-1,dpi=None,**kwargs):
    2936        wx.Panel.__init__(self,parent,id=id,**kwargs)
     
    3845        sizer.Add(self.toolbar,0,wx.LEFT|wx.EXPAND)
    3946        self.SetSizer(sizer)
     47       
     48class G2PlotOgl(wx.Panel):
     49    def __init__(self,parent,id=-1,dpi=None,**kwargs):
     50        self.figure = wx.Panel.__init__(self,parent,id=id,**kwargs)
     51        self.canvas = wx.glcanvas.GLCanvas(self,-1,**kwargs)
     52        self.camera = {}
     53        sizer=wx.BoxSizer(wx.VERTICAL)
     54        sizer.Add(self.canvas,1,wx.EXPAND)
     55        self.SetSizer(sizer)           
    4056               
    4157class G2PlotNoteBook(wx.Panel):
     
    5571        self.plotList = []
    5672           
    57     def add(self,name=""):
    58         page = G2Plot(self.nb)
     73    def addMpl(self,name=""):
     74        page = G2PlotMpl(self.nb)
    5975        self.nb.AddPage(page,name)
    6076       
     
    6379        return page.figure
    6480       
     81    def addOgl(self,name=""):
     82        page = G2PlotOgl(self.nb)
     83        self.nb.AddPage(page,name)
     84       
     85        self.plotList.append(name)
     86       
     87        return page.figure
     88       
     89    def Delete(self,name):
     90        try:
     91            item = self.plotList.index(name)
     92            del self.plotList[item]
     93            self.nb.DeletePage(item)
     94        except ValueError:          #no plot of this name - do nothing
     95            return     
     96               
    6597    def clear(self):
    6698        while self.nb.GetPageCount():
     
    68100        self.plotList = []
    69101        self.status.DestroyChildren()
     102       
     103    def Rename(self,oldName,newName):
     104        try:
     105            item = self.plotList.index(oldName)
     106            self.plotList[item] = newName
     107            self.nb.SetPageText(item,newName)
     108        except ValueError:          #no plot of this name - do nothing
     109            return     
    70110       
    71111    def OnPageChanged(self,event):
     
    122162        Plot = Page.figure.gca()          #get a fresh plot after clf()
    123163    except ValueError,error:
    124         Plot = self.G2plotNB.add('Structure Factors').gca()
     164        Plot = self.G2plotNB.addMpl('Structure Factors').gca()
    125165        plotNum = self.G2plotNB.plotList.index('Structure Factors')
    126166        Page = self.G2plotNB.nb.GetPage(plotNum)
     
    338378    except ValueError,error:
    339379        newPlot = True
    340         Plot = self.G2plotNB.add('Powder Patterns').gca()
     380        Plot = self.G2plotNB.addMpl('Powder Patterns').gca()
    341381        plotNum = self.G2plotNB.plotList.index('Powder Patterns')
    342382        Page = self.G2plotNB.nb.GetPage(plotNum)
     
    476516        Plot = Page.figure.gca()
    477517    except ValueError,error:
    478         Plot = self.G2plotNB.add('Powder Lines').gca()
     518        Plot = self.G2plotNB.addMpl('Powder Lines').gca()
    479519        plotNum = self.G2plotNB.plotList.index('Powder Lines')
    480520        Page = self.G2plotNB.nb.GetPage(plotNum)
     
    526566        Plot = Page.figure.gca()
    527567    except ValueError,error:
    528         Plot = self.G2plotNB.add('Peak Widths').gca()
     568        Plot = self.G2plotNB.addMpl('Peak Widths').gca()
    529569        plotNum = self.G2plotNB.plotList.index('Peak Widths')
    530570        Page = self.G2plotNB.nb.GetPage(plotNum)
     
    809849       
    810850    except ValueError,error:
    811         Plot = self.G2plotNB.add('2D Powder Image').gca()
     851        Plot = self.G2plotNB.addMpl('2D Powder Image').gca()
    812852        plotNum = self.G2plotNB.plotList.index('2D Powder Image')
    813853        Page = self.G2plotNB.nb.GetPage(plotNum)
     
    9621002       
    9631003    except ValueError,error:
    964         Plot = self.G2plotNB.add('2D Integration').gca()
     1004        Plot = self.G2plotNB.addMpl('2D Integration').gca()
    9651005        plotNum = self.G2plotNB.plotList.index('2D Integration')
    9661006        Page = self.G2plotNB.nb.GetPage(plotNum)
     
    10041044    else:
    10051045        Page.canvas.draw()
    1006        
    1007        
     1046               
    10081047def PlotTRImage(self,tax,tay,taz,newPlot=False):
    10091048    #a test plot routine - not normally used
     
    10281067       
    10291068    except ValueError,error:
    1030         Plot = self.G2plotNB.add('2D Transformed Powder Image').gca()
     1069        Plot = self.G2plotNB.addMpl('2D Transformed Powder Image').gca()
    10311070        plotNum = self.G2plotNB.plotList.index('2D Transformed Powder Image')
    10321071        Page = self.G2plotNB.nb.GetPage(plotNum)
     
    10781117        Page.canvas.draw()
    10791118       
    1080        
     1119def PlotStructure(self,data):
     1120    generalData = data['General']
     1121    atomData = data['Atoms']
     1122    drawingData = data['Drawing']
     1123    drawAtoms = drawingData['Atoms']
     1124    Wt = [255,255,255,255]
     1125    Rd = [255,0,0,255]
     1126    Gr = [0,255,0,255]
     1127    Bl = [0,0,255,255]
     1128    uBox = np.array([[0,0,0],[1,0,0],[1,1,0],[0,1,0],[0,0,1],[1,0,1],[1,1,1],[0,1,1]])
     1129    uEdges = np.array([
     1130        [uBox[0],uBox[1]],[uBox[0],uBox[3]],[uBox[0],uBox[4]],[uBox[1],uBox[2]],
     1131        [uBox[2],uBox[3]],[uBox[1],uBox[5]],[uBox[2],uBox[6]],[uBox[3],uBox[7]],
     1132        [uBox[4],uBox[5]],[uBox[5],uBox[6]],[uBox[6],uBox[7]],[uBox[7],uBox[4]]])
     1133    uColors = [Rd,Gr,Bl,Wt, Wt,Wt,Wt,Wt, Wt,Wt,Wt,Wt]
     1134   
     1135    def OnMouseDown(event):
     1136        drawingData['Rotation'][3] = event.GetPosition()
     1137    def OnMouseWheel(event):
     1138        drawingData['cameraPos'] += event.GetWheelRotation()/24
     1139        drawingData['cameraPos'] = max(10,min(500,drawingData['cameraPos']))
     1140        page = self.dataDisplay.GetSelection()
     1141        if self.dataDisplay.GetPageText(page) == 'Draw Options':
     1142            panel = self.dataDisplay.GetPage(page).GetChildren()[0].GetChildren()
     1143            names = [child.GetName() for child in panel]
     1144            panel[names.index('cameraPos')].SetLabel('Camera Position: '+'%.2f'%(drawingData['cameraPos']))
     1145            panel[names.index('cameraSlider')].SetValue(drawingData['cameraPos'])
     1146        Draw()
     1147           
     1148    def SetViewPointText(VP):
     1149        page = self.dataDisplay.GetSelection()
     1150        if self.dataDisplay.GetPageText(page) == 'Draw Options':
     1151            panel = self.dataDisplay.GetPage(page).GetChildren()[0].GetChildren()
     1152            names = [child.GetName() for child in panel]
     1153            panel[names.index('viewPoint')].SetValue('%.3f, %.3f, %.3f'%(VP[0],VP[1],VP[2]))
     1154                           
     1155    def OnKey(event):
     1156        keyCode = event.GetKeyCode()
     1157        key,xyz = chr(keyCode),event.GetPosition()
     1158        indx = drawingData['selectedAtoms']
     1159        cx,ct,cs = drawingData['atomPtrs']
     1160        if key in ['c','C']:
     1161            drawingData['viewPoint'] = [[.5,.5,.5],[0,0]]
     1162            drawingData['Rotation'] = [0.0,0.0,0.0,np.array([0,0])]
     1163            SetViewPointText(drawingData['viewPoint'][0])
     1164        elif key in ['n','N']:
     1165            drawAtoms = drawingData['Atoms']
     1166            pI = drawingData['viewPoint'][1]
     1167            if indx:
     1168                pI[0] = indx[pI[1]]
     1169                Tx,Ty,Tz = drawAtoms[pI[0]][cx:cx+3]
     1170                pI[1] += 1
     1171                if pI[1] >= len(indx):
     1172                    pI[1] = 0
     1173            else:
     1174                Tx,Ty,Tz = drawAtoms[pI[0]][cx:cx+3]               
     1175                pI[0] += 1
     1176                if pI[0] >= len(drawAtoms):
     1177                    pI[0] = 0
     1178            drawingData['viewPoint'] = [[Tx,Ty,Tz],pI]
     1179            SetViewPointText(drawingData['viewPoint'][0])
     1180               
     1181        elif key in ['p','P']:
     1182            drawAtoms = drawingData['Atoms']
     1183            pI = drawingData['viewPoint'][1]
     1184            if indx:
     1185                pI[0] = indx[pI[1]]
     1186                Tx,Ty,Tz = drawAtoms[pI[0]][cx:cx+3]
     1187                pI[1] -= 1
     1188                if pI[1] < 0:
     1189                    pI[1] = len(indx)-1
     1190            else:
     1191                Tx,Ty,Tz = drawAtoms[pI[0]][cx:cx+3]               
     1192                pI[0] -= 1
     1193                if pI[0] < 0:
     1194                    pI[0] = len(drawAtoms)-1
     1195            drawingData['viewPoint'] = [[Tx,Ty,Tz],pI]
     1196            SetViewPointText(drawingData['viewPoint'][0])
     1197           
     1198        elif key in ['a','A']:
     1199            print xyz,GetTruePosition(xyz)
     1200        Draw()
     1201           
     1202    def OnMouseMove(event):
     1203        newxy = event.GetPosition()
     1204        if event.Dragging():
     1205            if event.LeftIsDown():
     1206                SetRotation(newxy)
     1207            elif event.RightIsDown():
     1208                SetTranslation(newxy)
     1209            elif event.MiddleIsDown():
     1210                SetRotationZ(newxy)
     1211            Draw()
     1212       
     1213    def GetTruePosition(xy):
     1214        View = glGetIntegerv(GL_VIEWPORT)
     1215        x,y,z = gluUnProject(xy[0],xy[1],0,view=View)
     1216        return x,y,z
     1217       
     1218    def SetBackground():
     1219        R,G,B,A = Page.camera['backColor']
     1220        glClearColor(R,G,B,A)
     1221        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
     1222       
     1223    def SetLights():
     1224        glEnable(GL_DEPTH_TEST)
     1225        glShadeModel(GL_SMOOTH)
     1226        glEnable(GL_LIGHTING)
     1227        glEnable(GL_LIGHT0)
     1228        glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,0)
     1229        glLightfv(GL_LIGHT0,GL_AMBIENT,[1,1,1,.8])
     1230        glLightfv(GL_LIGHT0,GL_DIFFUSE,[1,1,1,1])
     1231       
     1232    def SetFog():       #doesn't work for some reason
     1233        cPos = drawingData['cameraPos']
     1234        Zclip = drawingData['Zclip']*cPos/200.
     1235        glFogi(GL_FOG_MODE,GL_LINEAR)
     1236        glFogfv(GL_FOG_COLOR,Page.camera['backColor'])
     1237        glFogf(GL_FOG_START,cPos-Zclip)
     1238        glFogf(GL_FOG_END,cPos+Zclip)
     1239        glFogf(GL_FOG_DENSITY,drawingData['fogFactor'])
     1240                 
     1241    def SetTranslation(newxy):
     1242        Tx,Ty,Tz = drawingData['viewPoint'][0]
     1243        oldxy = drawingData['Rotation'][3]
     1244        dxy = newxy-oldxy
     1245        Tx += dxy[0]*0.01
     1246        Ty -= dxy[1]*0.01
     1247        drawingData['Rotation'][3] = newxy
     1248        drawingData['viewPoint'][0] =  Tx,Ty,Tz
     1249               
     1250    def SetRotation(newxy):       
     1251        anglex,angley,anglez,oldxy = drawingData['Rotation']
     1252        dxy = newxy-oldxy
     1253        anglex += dxy[1]
     1254        angley += dxy[0]
     1255        oldxy = newxy
     1256        drawingData['Rotation'] = [anglex,angley,anglez,oldxy]
     1257       
     1258    def SetRotationZ(newxy):
     1259        def sign(x):
     1260            if x < 0:
     1261                return -1
     1262            else:
     1263                return 1
     1264                       
     1265        anglex,angley,anglez,oldxy = drawingData['Rotation']
     1266        dxy = newxy-oldxy
     1267        anglez += dxy[0]+dxy[1]
     1268        oldxy = newxy
     1269        drawingData['Rotation'] = [anglex,angley,anglez,oldxy]
     1270       
     1271    def RenderBox():
     1272        glEnable(GL_COLOR_MATERIAL)
     1273        glBegin(GL_LINES)
     1274        for line,color in zip(uEdges,uColors):
     1275            glColor4ubv(color)
     1276            glVertex3fv(line[0])
     1277            glVertex3fv(line[1])
     1278        glEnd()
     1279        glColor4ubv([0,0,0,0])
     1280        glDisable(GL_COLOR_MATERIAL)
     1281       
     1282    def RenderUnitVectors():
     1283        glEnable(GL_COLOR_MATERIAL)
     1284        glBegin(GL_LINES)
     1285        for line,color in zip(uEdges,uColors)[:3]:
     1286            glColor4ubv(color)
     1287            glVertex3fv(line[0])
     1288            glVertex3fv(line[1])
     1289        glEnd()
     1290        glColor4ubv([0,0,0,0])
     1291        glDisable(GL_COLOR_MATERIAL)
     1292               
     1293    def RenderSphere(x,y,z,radius,color):
     1294        glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,color)
     1295        glPushMatrix()
     1296        glTranslate(x,y,z)
     1297        glMultMatrixf(B4mat.T)
     1298        q = gluNewQuadric()
     1299        gluSphere(q,radius,20,20)
     1300        glPopMatrix()
     1301       
     1302    def RenderEllipsoid(x,y,z,ellipseProb,E,R4,color):
     1303        s1,s2,s3 = E
     1304        glLightfv(GL_LIGHT0,GL_DIFFUSE,[.7,.7,.7,1])       
     1305        glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,color)
     1306        glPushMatrix()
     1307        glTranslate(x,y,z)
     1308        glMultMatrixf(B4mat.T)
     1309        glMultMatrixf(R4.T)
     1310        glEnable(GL_RESCALE_NORMAL)
     1311        glScale(s1,s2,s3)
     1312        q = gluNewQuadric()
     1313        gluSphere(q,ellipseProb,20,20)
     1314        glDisable(GL_RESCALE_NORMAL)
     1315        glPopMatrix()
     1316        glLightfv(GL_LIGHT0,GL_DIFFUSE,[1,1,1,1])       
     1317       
     1318    def RenderBonds(x,y,z,Bonds,radius,color):
     1319        glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,color)
     1320        glPushMatrix()
     1321        glTranslate(x,y,z)
     1322        glMultMatrixf(B4mat.T)
     1323        for bond in Bonds:
     1324            glPushMatrix()
     1325            Dx = np.inner(Amat,bond)
     1326            Z = np.sqrt(np.sum(Dx**2))
     1327            azm = atan2d(-Dx[1],-Dx[0])
     1328            phi = acosd(Dx[2]/Z)
     1329            glRotate(-azm,0,0,1)
     1330            glRotate(phi,1,0,0)
     1331            q = gluNewQuadric()
     1332            gluCylinder(q,radius,radius,Z,20,2)
     1333            glPopMatrix()           
     1334        glPopMatrix()
     1335       
     1336    def RenderLines(x,y,z,Bonds,color):
     1337        glEnable(GL_COLOR_MATERIAL)
     1338        glPushMatrix()
     1339        glTranslate(x,y,z)
     1340        glBegin(GL_LINES)
     1341        for bond in Bonds:
     1342            glColor4fv(color)
     1343            glVertex3fv([0,0,0])
     1344            glVertex3fv(bond)
     1345        glEnd()
     1346        glColor4ubv([0,0,0,0])
     1347        glPopMatrix()
     1348        glDisable(GL_COLOR_MATERIAL)
     1349       
     1350    def RenderPolyhedra(x,y,z,Faces,color):
     1351        glPushMatrix()
     1352        glTranslate(x,y,z)
     1353        glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,color)
     1354        glShadeModel(GL_SMOOTH)
     1355        glMultMatrixf(B4mat.T)
     1356        for face,norm in Faces:
     1357            glPolygonMode(GL_FRONT,GL_FILL)
     1358            glColor3fv(color[:3])
     1359            glBegin(GL_TRIANGLES)
     1360            glNormal3fv(norm)
     1361            for vert in face:
     1362                glVertex3fv(vert)
     1363            glEnd()
     1364        glPopMatrix()
     1365       
     1366    def RenderLabel(x,y,z,label,r):       
     1367        glPushMatrix()
     1368        glTranslate(x,y,z)
     1369        glMultMatrixf(B4mat.T)
     1370        glDisable(GL_LIGHTING)
     1371        glColor3f(0,1.,0)
     1372        glRasterPos3f(r,r,r)
     1373        for c in list(label):
     1374            glutBitmapCharacter(GLUT_BITMAP_8_BY_13,ord(c))
     1375        glEnable(GL_LIGHTING)
     1376        glPopMatrix()
     1377                           
     1378    def Draw():
     1379        import numpy.linalg as nl
     1380        VS = np.array(Page.canvas.GetSize())
     1381        aspect = float(VS[0])/float(VS[1])
     1382        cPos = drawingData['cameraPos']
     1383        Zclip = drawingData['Zclip']*cPos/200.
     1384        anglex,angley,anglez, = drawingData['Rotation'][:3]
     1385        Tx,Ty,Tz = drawingData['viewPoint'][0]
     1386        cx,ct,cs = drawingData['atomPtrs']
     1387        bondR = drawingData['bondRadius']
     1388        G,g = G2lat.cell2Gmat(cell)
     1389        GS = G
     1390        GS[0][1] = GS[1][0] = math.sqrt(GS[0][0]*GS[1][1])
     1391        GS[0][2] = GS[2][0] = math.sqrt(GS[0][0]*GS[2][2])
     1392        GS[1][2] = GS[2][1] = math.sqrt(GS[1][1]*GS[2][2])
     1393        ellipseProb = G2lat.criticalEllipse(drawingData['ellipseProb']/100.)
     1394       
     1395        SetBackground()
     1396       
     1397        glMatrixMode(GL_PROJECTION)
     1398        glLoadIdentity()
     1399        glViewport(0,0,VS[0],VS[1])
     1400        gluPerspective(20.,aspect,cPos-Zclip,cPos+Zclip)
     1401        gluLookAt(0,0,cPos,0,0,0,0,1,0)
     1402        SetLights()           
     1403        if drawingData['depthFog']:
     1404            glEnable(GL_FOG)
     1405            SetFog()
     1406        else:
     1407            glDisable(GL_FOG)
     1408       
     1409        glMatrixMode(GL_MODELVIEW)
     1410        glLoadIdentity()
     1411        glRotate(anglez,0,0,1)
     1412        glRotate(anglex,1,0,0)
     1413        glRotate(angley,0,1,0)
     1414        glMultMatrixf(A4mat.T)
     1415        glTranslate(-Tx,-Ty,-Tz)
     1416        if drawingData['unitCellBox']:
     1417            RenderBox()
     1418        if drawingData['showABC']:
     1419            glPushMatrix()
     1420            glTranslate(-.1,-.1,-.1)
     1421            glScalef(1/cell[0],1/cell[1],1/cell[2])
     1422            RenderUnitVectors()
     1423            glPopMatrix()
     1424        for iat,atom in enumerate(drawingData['Atoms']):
     1425            x,y,z = atom[cx:cx+3]
     1426            Bonds = atom[-1]
     1427            atNum = generalData['AtomTypes'].index(atom[ct])
     1428            CL = list(generalData['Color'][atNum])
     1429            CL.extend([255,])
     1430            color = np.array(CL)/255.
     1431            radius = 0.5
     1432            if 'balls' in atom[cs]:
     1433                vdwScale = drawingData['vdwScale']
     1434                ballScale = drawingData['ballScale']
     1435                if 'H' == atom[ct]:
     1436                    if drawingData['showHydrogen']:
     1437                        if 'vdW' in atom[cs]:
     1438                            radius = vdwScale*generalData['vdWRadii'][atNum]
     1439                        else:
     1440                            radius = ballScale*drawingData['sizeH']
     1441                    else:
     1442                        radius = 0.0
     1443                else:
     1444                    if 'vdW' in atom[cs]:
     1445                        radius = vdwScale*generalData['vdWRadii'][atNum]
     1446                    else:
     1447                        radius = ballScale*generalData['BondRadii'][atNum]
     1448                RenderSphere(x,y,z,radius,color)
     1449                if 'sticks' in atom[cs]:
     1450                    RenderBonds(x,y,z,Bonds,bondR,color)
     1451            elif 'ellipsoids' in atom[cs]:
     1452                RenderBonds(x,y,z,Bonds,bondR,color)
     1453                if atom[cs+2] == 'A':                   
     1454                    Uij = atom[cs+4:cs+10]
     1455                    U = np.multiply(G2spc.Uij2U(Uij),GS)
     1456                    U = np.inner(Amat,np.inner(U,Amat).T)
     1457                    E,R = nl.eigh(U)
     1458                    R4 = np.concatenate((np.concatenate((R,[[0],[0],[0]]),axis=1),[[0,0,0,1],]),axis=0)
     1459                    E = np.sqrt(E)
     1460                    RenderEllipsoid(x,y,z,ellipseProb,E,R4,color)
     1461                else:
     1462                    radius = ellipseProb*math.sqrt(abs(atom[cs+3]))
     1463                    RenderSphere(x,y,z,radius,color)
     1464            elif 'lines' in atom[cs]:
     1465                radius = 0.5
     1466                RenderLines(x,y,z,Bonds,color)
     1467            elif atom[cs] == 'sticks':
     1468                radius = 0.5
     1469                RenderBonds(x,y,z,Bonds,bondR,color)
     1470            elif atom[cs] == 'polyhedra':
     1471                if len(Bonds) > 2:
     1472                    FaceGen = G2lat.uniqueCombinations(Bonds,3)     #N.B. this is a generator
     1473                    Faces = []
     1474                    for face in FaceGen:
     1475                        vol = nl.det(face)
     1476                        if abs(vol) > 1.:
     1477                            if vol < 0.:
     1478                                face = [face[0],face[2],face[1]]
     1479                            norm = np.cross(face[1]-face[0],face[2]-face[0])
     1480                            norm /= np.sqrt(np.sum(norm**2))
     1481                            Faces.append([face,norm])
     1482                    RenderPolyhedra(x,y,z,Faces,color)
     1483            if atom[cs+1] == 'type':
     1484                RenderLabel(x,y,z,atom[ct],radius)
     1485            elif atom[cs+1] == 'name':
     1486                RenderLabel(x,y,z,atom[ct-1],radius)
     1487            elif atom[cs+1] == 'number':
     1488                RenderLabel(x,y,z,str(iat+1),radius)
     1489            elif atom[cs+1] == 'residue' and atom[ct-1] == 'CA':
     1490                RenderLabel(x,y,z,atom[ct-4],radius)
     1491            elif atom[cs+1] == '1-letter' and atom[ct-1] == 'CA':
     1492                RenderLabel(x,y,z,atom[ct-3],radius)
     1493            elif atom[cs+1] == 'chain' and atom[ct-1] == 'CA':
     1494                RenderLabel(x,y,z,atom[ct-2],radius)
     1495           
     1496        Page.canvas.SwapBuffers()
     1497       
     1498    def OnSize(event):
     1499        Draw()
     1500       
     1501    try:
     1502        plotNum = self.G2plotNB.plotList.index(generalData['Name'])
     1503        Page = self.G2plotNB.nb.GetPage(plotNum)       
     1504    except ValueError,error:
     1505        Plot = self.G2plotNB.addOgl(generalData['Name'])
     1506        plotNum = self.G2plotNB.plotList.index(generalData['Name'])
     1507        Page = self.G2plotNB.nb.GetPage(plotNum)
     1508        Page.views = False
     1509        view = False
     1510    Page.SetFocus()
     1511    Page.canvas.Bind(wx.EVT_MOUSEWHEEL, OnMouseWheel)
     1512    Page.canvas.Bind(wx.EVT_LEFT_DOWN, OnMouseDown)
     1513    Page.canvas.Bind(wx.EVT_RIGHT_DOWN, OnMouseDown)
     1514    Page.canvas.Bind(wx.EVT_MIDDLE_DOWN, OnMouseDown)
     1515    Page.canvas.Bind(wx.EVT_KEY_UP, OnKey)
     1516    Page.canvas.Bind(wx.EVT_MOTION, OnMouseMove)
     1517    Page.canvas.Bind(wx.EVT_SIZE, OnSize)
     1518    cell = generalData['Cell'][1:7]
     1519    Amat,Bmat = G2lat.cell2AB(cell)         #Amat - crystal to cartesian, Bmat - inverse
     1520    A4mat = np.concatenate((np.concatenate((Amat,[[0],[0],[0]]),axis=1),[[0,0,0,1],]),axis=0)
     1521    B4mat = np.concatenate((np.concatenate((Bmat,[[0],[0],[0]]),axis=1),[[0,0,0,1],]),axis=0)
     1522    Page.camera['position'] = drawingData['cameraPos']
     1523    Page.camera['viewPoint'] = np.inner(Amat,drawingData['viewPoint'][0])
     1524    Page.camera['backColor'] = np.array(list(drawingData['backColor'])+[0,])/255.
     1525    Page.canvas.SetCurrent()
     1526    Draw()
     1527       
  • trunk/GSASIIspc.py

    r143 r155  
    22
    33import numpy as np
     4import math
    45import sys
    56import os.path as ospath
     
    198199    '''
    199200    Translates a set of coordinates so that all values are >=0 and < 1
    200       input: a list or numpy array of any length. Note that the object is modified  in place.
    201       output: none
     201      input: a list or numpy array of any length.
     202      output: none; the object is modified in place.
    202203    '''
    203204    for i,x in enumerate(XYZ):
    204         x = ((x % 1.0)+1.0) % 1.0
    205         if x > 0.9999: x = 0.0
    206         XYZ[i] = x
     205        XYZ[i] = (x-int(x))%1.0
    207206       
    208 def GenAtom(XYZ,SGData,ifAll=False):
     207def Opposite(XYZ,toler=0.0002):
     208    '''
     209    Gives opposite corner, edge or face of unit cell for position within tolerance.
     210        Result may be just outside the cell within tolerance
     211    input:
     212        XYZ: 0 >= np.array[x,y,z] > 1 as by MoveToUnitCell
     213        toler: unit cell fraction tolerance making opposite
     214    returns:
     215        XYZ: array of opposite positions; always contains XYZ
     216    '''
     217    perm3 = [[1,1,1],[0,1,1],[1,0,1],[1,1,0],[1,0,0],[0,1,0],[0,0,1],[0,0,0]]
     218    TB = np.where(abs(XYZ-1)<toler,-1,0)+np.where(abs(XYZ)<toler,1,0)
     219    perm = TB*perm3
     220    cperm = ['%d%d%d'%(i,j,k) for i,j,k in perm]
     221    D = dict(zip(cperm,perm))
     222    new = []
     223    for key in D:
     224        new.append(np.array(D[key])+np.array(XYZ))
     225    return new
     226       
     227def GenAtom(XYZ,SGData,All=False,Uij=[]):
    209228    '''
    210229    Generates the equivalent positions for a specified coordinate and space group
    211230    input: 
    212        XYZ an array, tuple or list containing 3 elements: x, y & z
    213        SGData, from SpcGroup
    214        ifAll=True causes the return to provide the unique set of
    215                   equivalent positions
    216             =False causes the input position to be repeated. This is the default,
    217                    but why someone would want this, I am not sure.
    218     Returns a list of two element tuples:
    219        The first element is the coordinate as a three-element array and
    220        the second describes the symmetry used to generate the site, of form [-][C]SS
    221           C indicates a centering operation was used (omitted if the 1st, [0,0,0])
    222           SS is the symmetry operator number (1-24)
    223           - indicates the center of symmetry was used (omitted otherwise)     
     231        XYZ an array, tuple or list containing 3 elements: x, y & z
     232        SGData, from SpcGroup
     233        All  = True return all equivalent positions including duplicates
     234             = False return only unique positions
     235        Uij  = [U11,U22,U33,U12,U13,U23] or [] if no Uij       
     236    return: [[XYZEquiv],Idup,[UijEquiv]]
     237        [XYZEquiv] is list of equivalent positions (XYZ is first entry)
     238        Idup = [-][C]SS where SS is the symmetry operator number (1-24), C (if not 0,0,0)
     239        is centering operator number (1-4) and - is for inversion
     240        [UijEquiv] - equivalent Uij; absent if no Uij given
    224241    '''
    225242    XYZEquiv = []
     243    UijEquiv = []
    226244    Idup = []
    227245    X = np.array(XYZ)
    228246    MoveToUnitCell(X)
    229     XYZEquiv.append(np.array(X))
    230     Idup.append(1)
    231247    for ic,cen in enumerate(SGData['SGCen']):
    232248        C = np.array(cen)
     
    236252                T = np.array(ops[1])
    237253                M =  np.array(ops[0])
    238                 newX = np.sum(M*X,axis=1)+T
     254                newX = np.inner(M,X)+T
     255                if len(Uij):
     256                    U = Uij2U(Uij)
     257                    U = np.inner(M,np.inner(U,M).T)
     258                    newUij = U2Uij(U)
    239259                if invers:
    240260                    newX = -newX
    241261                newX += C
    242262                MoveToUnitCell(newX)
    243                 New = True
    244                 if ifAll:
     263                if All:
    245264                    if np.allclose(newX,X,atol=0.0002):
    246                         New = False
    247                         idup = 0                   
     265                        idup = 0
     266                else:
     267                    if True in [np.allclose(newX,X,atol=0.0002) for oldX in XYZEquiv]:
     268                        idup = 0
     269                if All or idup:
    248270                    XYZEquiv.append(newX)
    249                 else:
    250                     for oldX in XYZEquiv[:-1]:
    251                         if np.allclose(newX,oldX,atol=0.0002):
    252                             New = False
    253                             idup = 0
    254                     if New or ifAll:
    255                         XYZEquiv.append(newX)
    256                 if ifAll and len(XYZEquiv) == 2:
    257                     Idup.append(1)
    258                 else:
    259271                    Idup.append(idup)
    260     if ifAll:
    261         return zip(XYZEquiv[1:],Idup[1:])                  #eliminate duplicate initial entry
     272                    if len(Uij):
     273                        UijEquiv.append(newUij)                   
     274    if len(Uij):
     275        return zip(XYZEquiv,UijEquiv,Idup)
    262276    else:
    263277        return zip(XYZEquiv,Idup)
     
    454468       SGData: from SpcGroup
    455469    Returns a two element tuple:
    456        The 1st element is a code for the site symmetry (see GetOprPtrName)
     470       The 1st element is a code for the site symmetry (see GetKNsym)
    457471       The 2nd element is the site multiplicity
    458472    '''
     
    474488    if SGData['SGLaue'] in ['3','3m1','31m','6/m','6/mmm']:
    475489        Isym = 1073741824
    476     Jdup = 1
     490    Jdup = 0
    477491    Xeqv = GenAtom(XYZ,SGData,True)
    478492    IRT = PackRot(SGData['SGOps'])
Note: See TracChangeset for help on using the changeset viewer.