22# *SymmetryFinder*: platform-independent symmetry finder, wrapping Spglib code
33# *SymmetryHandler*: symmetry inferences for 0D-, 1D-, 2D- and 3D-systems
44# Author: Evgeny Blokhin
5- # v080416
65
76from numpy .linalg import det
87
@@ -26,11 +25,11 @@ def get_spacegroup(self, tilde_obj):
2625 except Exception as ex :
2726 self .error = 'Symmetry finder error: %s' % ex
2827 else :
29- symmetry = symmetry . split ()
30- self .i = symmetry [ 0 ]
31- try : self .n = int ( symmetry [ 1 ]. replace ("(" , "" ). replace ( ")" , "" ) )
32- except (ValueError , IndexError ): self . n = 0
33- if self .n == 0 :
28+ try :
29+ self .sg , self . ng = symmetry . split ()
30+ self .ng = int (self . ng . strip ("()" ) )
31+ except (ValueError , IndexError , AttributeError ):
32+ self .ng = 0
3433 self .error = 'Symmetry finder error (probably, coinciding atoms)'
3534
3635 def refine_cell (self , tilde_obj ):
@@ -53,15 +52,15 @@ def __init__(self, tilde_obj, accuracy=None):
5352 self.error = None
5453 self.accuracy=accuracy if accuracy else SymmetryFinder.accuracy
5554 def get_spacegroup(self, tilde_obj):
56- self.n = 1
57- self.i = 'P1'
55+ self.ng = 1
56+ self.sg = 'P1'
5857"""
5958
6059class SymmetryHandler (SymmetryFinder ):
6160 def __init__ (self , tilde_obj , accuracy = None ):
62- self .i = None
63- self .n = None
64- self .symmetry = None
61+ self .sg = None
62+ self .ng = None
63+ self .system = None
6564 self .pg = None
6665 self .dg = None
6766
@@ -75,61 +74,61 @@ def __init__(self, tilde_obj, accuracy=None):
7574 # NB 7 crystal systems != 7 lattice systems
7675
7776 # space group to crystal system conversion
78- if 195 <= self .n <= 230 : self .symmetry = 'cubic'
79- elif 168 <= self .n <= 194 : self .symmetry = 'hexagonal'
80- elif 143 <= self .n <= 167 : self .symmetry = 'trigonal'
81- elif 75 <= self .n <= 142 : self .symmetry = 'tetragonal'
82- elif 16 <= self .n <= 74 : self .symmetry = 'orthorhombic'
83- elif 3 <= self .n <= 15 : self .symmetry = 'monoclinic'
84- elif 1 <= self .n <= 2 : self .symmetry = 'triclinic'
77+ if 195 <= self .ng <= 230 : self .system = 'cubic'
78+ elif 168 <= self .ng <= 194 : self .system = 'hexagonal'
79+ elif 143 <= self .ng <= 167 : self .system = 'trigonal'
80+ elif 75 <= self .ng <= 142 : self .system = 'tetragonal'
81+ elif 16 <= self .ng <= 74 : self .system = 'orthorhombic'
82+ elif 3 <= self .ng <= 15 : self .system = 'monoclinic'
83+ elif 1 <= self .ng <= 2 : self .system = 'triclinic'
8584
8685 # space group to point group conversion
87- if 221 <= self .n <= 230 : self .pg = 'O<sub>h</sub>'
88- elif 215 <= self .n <= 220 : self .pg = 'T<sub>d</sub>'
89- elif 207 <= self .n <= 214 : self .pg = 'O'
90- elif 200 <= self .n <= 206 : self .pg = 'T<sub>h</sub>'
91- elif 195 <= self .n <= 199 : self .pg = 'T'
92- elif 191 <= self .n <= 194 : self .pg = 'D<sub>6h</sub>'
93- elif 187 <= self .n <= 190 : self .pg = 'D<sub>3h</sub>'
94- elif 183 <= self .n <= 186 : self .pg = 'C<sub>6v</sub>'
95- elif 177 <= self .n <= 182 : self .pg = 'D<sub>6</sub>'
96- elif 175 <= self .n <= 176 : self .pg = 'C<sub>6h</sub>'
97- elif self .n == 174 : self .pg = 'C<sub>3h</sub>'
98- elif 168 <= self .n <= 173 : self .pg = 'C<sub>6</sub>'
99- elif 162 <= self .n <= 167 : self .pg = 'D<sub>3d</sub>'
100- elif 156 <= self .n <= 161 : self .pg = 'C<sub>3v</sub>'
101- elif 149 <= self .n <= 155 : self .pg = 'D<sub>3</sub>'
102- elif 147 <= self .n <= 148 : self .pg = 'C<sub>3i</sub>'
103- elif 143 <= self .n <= 146 : self .pg = 'C<sub>3</sub>'
104- elif 123 <= self .n <= 142 : self .pg = 'D<sub>4h</sub>'
105- elif 111 <= self .n <= 122 : self .pg = 'D<sub>2d</sub>'
106- elif 99 <= self .n <= 110 : self .pg = 'C<sub>4v</sub>'
107- elif 89 <= self .n <= 98 : self .pg = 'D<sub>4</sub>'
108- elif 83 <= self .n <= 88 : self .pg = 'C<sub>4h</sub>'
109- elif 81 <= self .n <= 82 : self .pg = 'S<sub>4</sub>'
110- elif 75 <= self .n <= 80 : self .pg = 'C<sub>4</sub>'
111- elif 47 <= self .n <= 74 : self .pg = 'D<sub>2h</sub>'
112- elif 25 <= self .n <= 46 : self .pg = 'C<sub>2v</sub>'
113- elif 16 <= self .n <= 24 : self .pg = 'D<sub>2</sub>'
114- elif 10 <= self .n <= 15 : self .pg = 'C<sub>2h</sub>'
115- elif 6 <= self .n <= 9 : self .pg = 'C<sub>s</sub>'
116- elif 3 <= self .n <= 5 : self .pg = 'C<sub>2</sub>'
117- elif self .n == 2 : self .pg = 'C<sub>i</sub>'
118- elif self .n == 1 : self .pg = 'C<sub>1</sub>'
86+ if 221 <= self .ng <= 230 : self .pg = 'O<sub>h</sub>'
87+ elif 215 <= self .ng <= 220 : self .pg = 'T<sub>d</sub>'
88+ elif 207 <= self .ng <= 214 : self .pg = 'O'
89+ elif 200 <= self .ng <= 206 : self .pg = 'T<sub>h</sub>'
90+ elif 195 <= self .ng <= 199 : self .pg = 'T'
91+ elif 191 <= self .ng <= 194 : self .pg = 'D<sub>6h</sub>'
92+ elif 187 <= self .ng <= 190 : self .pg = 'D<sub>3h</sub>'
93+ elif 183 <= self .ng <= 186 : self .pg = 'C<sub>6v</sub>'
94+ elif 177 <= self .ng <= 182 : self .pg = 'D<sub>6</sub>'
95+ elif 175 <= self .ng <= 176 : self .pg = 'C<sub>6h</sub>'
96+ elif self .ng == 174 : self .pg = 'C<sub>3h</sub>'
97+ elif 168 <= self .ng <= 173 : self .pg = 'C<sub>6</sub>'
98+ elif 162 <= self .ng <= 167 : self .pg = 'D<sub>3d</sub>'
99+ elif 156 <= self .ng <= 161 : self .pg = 'C<sub>3v</sub>'
100+ elif 149 <= self .ng <= 155 : self .pg = 'D<sub>3</sub>'
101+ elif 147 <= self .ng <= 148 : self .pg = 'C<sub>3i</sub>'
102+ elif 143 <= self .ng <= 146 : self .pg = 'C<sub>3</sub>'
103+ elif 123 <= self .ng <= 142 : self .pg = 'D<sub>4h</sub>'
104+ elif 111 <= self .ng <= 122 : self .pg = 'D<sub>2d</sub>'
105+ elif 99 <= self .ng <= 110 : self .pg = 'C<sub>4v</sub>'
106+ elif 89 <= self .ng <= 98 : self .pg = 'D<sub>4</sub>'
107+ elif 83 <= self .ng <= 88 : self .pg = 'C<sub>4h</sub>'
108+ elif 81 <= self .ng <= 82 : self .pg = 'S<sub>4</sub>'
109+ elif 75 <= self .ng <= 80 : self .pg = 'C<sub>4</sub>'
110+ elif 47 <= self .ng <= 74 : self .pg = 'D<sub>2h</sub>'
111+ elif 25 <= self .ng <= 46 : self .pg = 'C<sub>2v</sub>'
112+ elif 16 <= self .ng <= 24 : self .pg = 'D<sub>2</sub>'
113+ elif 10 <= self .ng <= 15 : self .pg = 'C<sub>2h</sub>'
114+ elif 6 <= self .ng <= 9 : self .pg = 'C<sub>s</sub>'
115+ elif 3 <= self .ng <= 5 : self .pg = 'C<sub>2</sub>'
116+ elif self .ng == 2 : self .pg = 'C<sub>i</sub>'
117+ elif self .ng == 1 : self .pg = 'C<sub>1</sub>'
119118
120119 # space group to layer group conversion
121120 if tilde_obj .structures [- 1 ].periodicity == 2 :
122- if self .n in [25 , 26 , 28 , 51 ]:
121+ if self .ng in [25 , 26 , 28 , 51 ]:
123122 tilde_obj .warning ('Warning! Diperiodical group setting is undefined!' )
124123 DIPERIODIC_MAPPING = {3 :8 , 4 :9 , 5 :10 , 6 :11 , 7 :12 , 8 :13 , 10 :14 , 11 :15 , 12 :16 , 13 :17 , 14 :18 , 16 :19 , 17 :20 , 18 :21 , 21 :22 , 25 :23 , 25 :24 , 26 :25 , 26 :26 , 27 :27 , 28 :28 , 28 :29 , 29 :30 , 30 :31 , 31 :32 , 32 :33 , 35 :34 , 38 :35 , 39 :36 , 47 :37 , 49 :38 , 50 :39 , 51 :40 , 51 :41 , 53 :42 , 54 :43 , 55 :44 , 57 :45 , 59 :46 , 65 :47 , 67 :48 , 75 :49 , 81 :50 , 83 :51 , 85 :52 , 89 :53 , 90 :54 , 99 :55 , 100 :56 , 111 :57 , 113 :58 , 115 :59 , 117 :60 , 123 :61 , 125 :62 , 127 :63 , 129 :64 , 143 :65 , 147 :66 , 149 :67 , 150 :68 , 156 :69 , 157 :70 , 162 :71 , 164 :72 , 168 :73 , 174 :74 , 175 :75 , 177 :76 , 183 :77 , 187 :78 , 189 :79 , 191 :80 }
125124
126125 cellpar = cell_to_cellpar ( tilde_obj .structures [- 1 ].cell ).tolist ()
127126 if cellpar [3 ] != 90 or cellpar [4 ] != 90 or cellpar [5 ] != 90 :
128127 DIPERIODIC_MAPPING .update ({1 :1 , 2 :2 , 3 :3 , 6 :4 , 7 :5 , 10 :6 , 13 :7 })
129- try : self .dg = DIPERIODIC_MAPPING [self .n ]
128+ try : self .dg = DIPERIODIC_MAPPING [self .ng ]
130129 except KeyError : tilde_obj .warning ('No diperiodical group found because rotational axes inconsistent with 2d translations!' )
131130 else :
132- if 65 <= self .dg <= 80 : self .symmetry = '2d-hexagonal'
133- elif 49 <= self .dg <= 64 : self .symmetry = '2d-square'
134- elif 8 <= self .dg <= 48 : self .symmetry = '2d-rectangular'
135- elif 1 <= self .dg <= 7 : self .symmetry = '2d-oblique'
131+ if 65 <= self .dg <= 80 : self .system = '2d-hexagonal'
132+ elif 49 <= self .dg <= 64 : self .system = '2d-square'
133+ elif 8 <= self .dg <= 48 : self .system = '2d-rectangular'
134+ elif 1 <= self .dg <= 7 : self .system = '2d-oblique'
0 commit comments