source: sphinxdocs/build/html/_modules/G2phase_CIF.html @ 1832

Last change on this file since 1832 was 1832, checked in by toby, 8 years ago

bug fix in unused grid code; doc fixes and cleanup

  • Property svn:mime-type set to text/html
File size: 101.7 KB
Line 
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
4
5<html xmlns="http://www.w3.org/1999/xhtml">
6  <head>
7    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
8   
9    <title>G2phase_CIF &mdash; GSAS-II 0.2.0 documentation</title>
10   
11    <link rel="stylesheet" href="../_static/default.css" type="text/css" />
12    <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
13   
14    <script type="text/javascript">
15      var DOCUMENTATION_OPTIONS = {
16        URL_ROOT:    '../',
17        VERSION:     '0.2.0',
18        COLLAPSE_INDEX: false,
19        FILE_SUFFIX: '.html',
20        HAS_SOURCE:  true
21      };
22    </script>
23    <script type="text/javascript" src="../_static/jquery.js"></script>
24    <script type="text/javascript" src="../_static/underscore.js"></script>
25    <script type="text/javascript" src="../_static/doctools.js"></script>
26    <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
27    <link rel="top" title="GSAS-II 0.2.0 documentation" href="../index.html" />
28    <link rel="up" title="Module code" href="index.html" /> 
29  </head>
30  <body>
31    <div class="related">
32      <h3>Navigation</h3>
33      <ul>
34        <li class="right" style="margin-right: 10px">
35          <a href="../genindex.html" title="General Index"
36             accesskey="I">index</a></li>
37        <li class="right" >
38          <a href="../py-modindex.html" title="Python Module Index"
39             >modules</a> |</li>
40        <li><a href="../index.html">GSAS-II 0.2.0 documentation</a> &raquo;</li>
41          <li><a href="index.html" accesskey="U">Module code</a> &raquo;</li> 
42      </ul>
43    </div> 
44
45    <div class="document">
46      <div class="documentwrapper">
47        <div class="bodywrapper">
48          <div class="body">
49           
50  <h1>Source code for G2phase_CIF</h1><div class="highlight"><pre>
51<span class="c"># -*- coding: utf-8 -*-</span>
52<span class="c">########### SVN repository information ###################</span>
53<span class="c"># $Date: 2015-03-25 15:42:15 -0500 (Wed, 25 Mar 2015) $</span>
54<span class="c"># $Author: vondreele $</span>
55<span class="c"># $Revision: 1762 $</span>
56<span class="c"># $URL: https://subversion.xray.aps.anl.gov/pyGSAS/trunk/imports/G2phase_CIF.py $</span>
57<span class="c"># $Id: G2phase_CIF.py 1762 2015-03-25 20:42:15Z vondreele $</span>
58<span class="c">########### SVN repository information ###################</span>
59<span class="sd">&#39;&#39;&#39;</span>
60<span class="sd">*Module G2phase_CIF: Coordinates from CIF*</span>
61<span class="sd">------------------------------------------</span>
62
63<span class="sd">Parses a CIF using  PyCifRW from James Hester and pulls out the</span>
64<span class="sd">structural information.</span>
65
66<span class="sd">If a CIF generated by ISODISTORT is encountered, extra information is</span>
67<span class="sd">added to the phase entry and constraints are generated. </span>
68
69<span class="sd">&#39;&#39;&#39;</span>
70<span class="c"># Routines to import Phase information from CIF files</span>
71<span class="kn">import</span> <span class="nn">sys</span>
72<span class="kn">import</span> <span class="nn">random</span> <span class="kn">as</span> <span class="nn">ran</span>
73<span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">as</span> <span class="nn">np</span>
74<span class="kn">import</span> <span class="nn">re</span>
75<span class="kn">import</span> <span class="nn">GSASIIIO</span> <span class="kn">as</span> <span class="nn">G2IO</span>
76<span class="kn">import</span> <span class="nn">GSASIIobj</span> <span class="kn">as</span> <span class="nn">G2obj</span>
77<span class="kn">import</span> <span class="nn">GSASIIspc</span> <span class="kn">as</span> <span class="nn">G2spc</span>
78<span class="kn">import</span> <span class="nn">GSASIIElem</span> <span class="kn">as</span> <span class="nn">G2elem</span>
79<span class="kn">import</span> <span class="nn">GSASIIlattice</span> <span class="kn">as</span> <span class="nn">G2lat</span>
80<span class="kn">import</span> <span class="nn">GSASIIpy3</span> <span class="kn">as</span> <span class="nn">G2p3</span>
81<span class="kn">import</span> <span class="nn">GSASIIpath</span>
82<span class="n">GSASIIpath</span><span class="o">.</span><span class="n">SetVersionNumber</span><span class="p">(</span><span class="s">&quot;$Revision: 1762 $&quot;</span><span class="p">)</span>
83<span class="kn">import</span> <span class="nn">CifFile</span> <span class="kn">as</span> <span class="nn">cif</span> <span class="c"># PyCifRW from James Hester</span>
84
85<div class="viewcode-block" id="CIFPhaseReader"><a class="viewcode-back" href="../imports.html#G2phase_CIF.CIFPhaseReader">[docs]</a><span class="k">class</span> <span class="nc">CIFPhaseReader</span><span class="p">(</span><span class="n">G2IO</span><span class="o">.</span><span class="n">ImportPhase</span><span class="p">):</span>
86    <span class="s">&#39;Implements a phase importer from a possibly multi-block CIF file&#39;</span>
87    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
88        <span class="nb">super</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="p">,</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span> <span class="c"># fancy way to say ImportPhase.__init__</span>
89            <span class="n">extensionlist</span><span class="o">=</span><span class="p">(</span><span class="s">&#39;.CIF&#39;</span><span class="p">,</span><span class="s">&#39;.cif&#39;</span><span class="p">,</span><span class="s">&#39;.txt&#39;</span><span class="p">),</span>
90            <span class="n">strictExtension</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
91            <span class="n">formatName</span> <span class="o">=</span> <span class="s">&#39;CIF&#39;</span><span class="p">,</span>
92            <span class="n">longFormatName</span> <span class="o">=</span> <span class="s">&#39;Crystallographic Information File import&#39;</span>
93            <span class="p">)</span>
94       
95    <span class="k">def</span> <span class="nf">ContentsValidator</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filepointer</span><span class="p">):</span>
96        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">CIFValidator</span><span class="p">(</span><span class="n">filepointer</span><span class="p">)</span>
97
98    <span class="k">def</span> <span class="nf">Reader</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">filename</span><span class="p">,</span><span class="n">filepointer</span><span class="p">,</span> <span class="n">ParentFrame</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">usedRanIdList</span><span class="o">=</span><span class="p">[],</span> <span class="o">**</span><span class="n">unused</span><span class="p">):</span>
99        <span class="bp">self</span><span class="o">.</span><span class="n">isodistort_warnings</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
100        <span class="bp">self</span><span class="o">.</span><span class="n">Phase</span> <span class="o">=</span> <span class="n">G2IO</span><span class="o">.</span><span class="n">SetNewPhase</span><span class="p">(</span><span class="n">Name</span><span class="o">=</span><span class="s">&#39;new phase&#39;</span><span class="p">,</span><span class="n">SGData</span><span class="o">=</span><span class="n">G2IO</span><span class="o">.</span><span class="n">P1SGData</span><span class="p">)</span> <span class="c"># create a new empty phase dict</span>
101        <span class="c"># make sure the ranId is really unique!</span>
102        <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">Phase</span><span class="p">[</span><span class="s">&#39;ranId&#39;</span><span class="p">]</span> <span class="ow">in</span> <span class="n">usedRanIdList</span><span class="p">:</span>
103            <span class="bp">self</span><span class="o">.</span><span class="n">Phase</span><span class="p">[</span><span class="s">&#39;ranId&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">ran</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">sys</span><span class="o">.</span><span class="n">maxint</span><span class="p">)</span>
104        <span class="n">returnstat</span> <span class="o">=</span> <span class="bp">False</span>
105        <span class="n">cellitems</span> <span class="o">=</span> <span class="p">(</span>
106            <span class="s">&#39;_cell_length_a&#39;</span><span class="p">,</span><span class="s">&#39;_cell_length_b&#39;</span><span class="p">,</span><span class="s">&#39;_cell_length_c&#39;</span><span class="p">,</span>
107            <span class="s">&#39;_cell_angle_alpha&#39;</span><span class="p">,</span><span class="s">&#39;_cell_angle_beta&#39;</span><span class="p">,</span><span class="s">&#39;_cell_angle_gamma&#39;</span><span class="p">,)</span>
108        <span class="n">cellwaveitems</span> <span class="o">=</span> <span class="p">(</span>
109            <span class="s">&#39;_cell_wave_vector_seq_id&#39;</span><span class="p">,</span>
110            <span class="s">&#39;_cell_wave_vector_x&#39;</span><span class="p">,</span><span class="s">&#39;_cell_wave_vector_y&#39;</span><span class="p">,</span><span class="s">&#39;_cell_wave_vector_z&#39;</span><span class="p">)</span>
111        <span class="n">reqitems</span> <span class="o">=</span> <span class="p">(</span>
112             <span class="s">&#39;_atom_site_fract_x&#39;</span><span class="p">,</span>
113             <span class="s">&#39;_atom_site_fract_y&#39;</span><span class="p">,</span>
114             <span class="s">&#39;_atom_site_fract_z&#39;</span><span class="p">,</span>
115            <span class="p">)</span>
116        <span class="n">phasenamefields</span> <span class="o">=</span> <span class="p">(</span>
117            <span class="s">&#39;_chemical_name_common&#39;</span><span class="p">,</span>
118            <span class="s">&#39;_pd_phase_name&#39;</span><span class="p">,</span>
119            <span class="s">&#39;_chemical_formula_sum&#39;</span>
120            <span class="p">)</span>
121        <span class="k">try</span><span class="p">:</span>
122            <span class="bp">self</span><span class="o">.</span><span class="n">ShowBusy</span><span class="p">()</span> <span class="c"># this can take a while</span>
123            <span class="k">try</span><span class="p">:</span>
124                <span class="n">cf</span> <span class="o">=</span> <span class="n">G2IO</span><span class="o">.</span><span class="n">ReadCIF</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
125            <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">detail</span><span class="p">:</span>
126                <span class="bp">self</span><span class="o">.</span><span class="n">errors</span> <span class="o">=</span> <span class="s">&quot;Parse or reading of file failed in pyCifRW; check syntax of file in enCIFer or CheckCIF&quot;</span>
127                <span class="k">return</span> <span class="bp">False</span>
128            <span class="k">finally</span><span class="p">:</span>
129                <span class="bp">self</span><span class="o">.</span><span class="n">DoneBusy</span><span class="p">()</span>
130            <span class="c"># scan blocks for structural info</span>
131            <span class="bp">self</span><span class="o">.</span><span class="n">errors</span> <span class="o">=</span> <span class="s">&#39;Error during scan of blocks for datasets&#39;</span>
132            <span class="n">str_blklist</span> <span class="o">=</span> <span class="p">[]</span>
133            <span class="k">for</span> <span class="n">blk</span> <span class="ow">in</span> <span class="n">cf</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span>
134                <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">reqitems</span><span class="o">+</span><span class="n">cellitems</span><span class="p">:</span>
135                    <span class="k">if</span> <span class="n">r</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">cf</span><span class="p">[</span><span class="n">blk</span><span class="p">]</span><span class="o">.</span><span class="n">keys</span><span class="p">():</span>
136                        <span class="k">break</span>
137                <span class="k">else</span><span class="p">:</span>
138                    <span class="n">str_blklist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">blk</span><span class="p">)</span>
139            <span class="k">if</span> <span class="ow">not</span> <span class="n">str_blklist</span><span class="p">:</span>
140                <span class="n">selblk</span> <span class="o">=</span> <span class="bp">None</span> <span class="c"># no block to choose</span>
141            <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">str_blklist</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="c"># only one choice</span>
142                <span class="n">selblk</span> <span class="o">=</span> <span class="mi">0</span>
143            <span class="k">else</span><span class="p">:</span>                       <span class="c"># choose from options</span>
144                <span class="n">choice</span> <span class="o">=</span> <span class="p">[]</span>
145                <span class="k">for</span> <span class="n">blknm</span> <span class="ow">in</span> <span class="n">str_blklist</span><span class="p">:</span>
146                    <span class="n">choice</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">&#39;&#39;</span><span class="p">)</span>
147                    <span class="c"># accumumlate some info about this phase</span>
148                    <span class="n">choice</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="n">blknm</span> <span class="o">+</span> <span class="s">&#39;: &#39;</span>
149                    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">phasenamefields</span><span class="p">:</span> <span class="c"># get a name for the phase</span>
150                        <span class="n">name</span> <span class="o">=</span> <span class="n">cf</span><span class="p">[</span><span class="n">blknm</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">i</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
151                        <span class="k">if</span> <span class="n">name</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">or</span> <span class="n">name</span> <span class="o">==</span> <span class="s">&#39;?&#39;</span> <span class="ow">or</span> <span class="n">name</span> <span class="o">==</span> <span class="s">&#39;.&#39;</span><span class="p">:</span>
152                            <span class="k">continue</span>
153                        <span class="k">else</span><span class="p">:</span>
154                            <span class="n">choice</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="n">name</span><span class="o">.</span><span class="n">strip</span><span class="p">()[:</span><span class="mi">20</span><span class="p">]</span> <span class="o">+</span> <span class="s">&#39;, &#39;</span>
155                            <span class="k">break</span>
156                    <span class="n">na</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">cf</span><span class="p">[</span><span class="n">blknm</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;_atom_site_fract_x&quot;</span><span class="p">))</span>
157                    <span class="k">if</span> <span class="n">na</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
158                        <span class="n">choice</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="s">&#39;1 atom&#39;</span>
159                    <span class="k">else</span><span class="p">:</span>
160                        <span class="n">choice</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="p">(</span><span class="s">&#39;</span><span class="si">%d</span><span class="s">&#39;</span> <span class="o">%</span> <span class="n">nd</span><span class="p">)</span> <span class="o">+</span> <span class="s">&#39; atoms&#39;</span>
161                    <span class="n">choice</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="s">&#39;, cell: &#39;</span>
162                    <span class="n">fmt</span> <span class="o">=</span> <span class="s">&quot;</span><span class="si">%.2f</span><span class="s">,&quot;</span>
163                    <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">key</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">cellitems</span><span class="p">):</span>
164                        <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span> <span class="n">fmt</span> <span class="o">=</span> <span class="s">&quot;%.f,&quot;</span>
165                        <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">5</span><span class="p">:</span> <span class="n">fmt</span> <span class="o">=</span> <span class="s">&quot;%.f&quot;</span>
166                        <span class="n">choice</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="n">fmt</span> <span class="o">%</span> <span class="n">cif</span><span class="o">.</span><span class="n">get_number_with_esd</span><span class="p">(</span>
167                            <span class="n">cf</span><span class="p">[</span><span class="n">blknm</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">))[</span><span class="mi">0</span><span class="p">]</span>
168                    <span class="n">sg</span> <span class="o">=</span> <span class="n">cf</span><span class="p">[</span><span class="n">blknm</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;_symmetry_space_group_name_H-M&quot;</span><span class="p">,</span><span class="s">&#39;&#39;</span><span class="p">)</span>
169                    <span class="k">if</span> <span class="ow">not</span> <span class="n">sg</span><span class="p">:</span> <span class="n">sg</span> <span class="o">=</span> <span class="n">cf</span><span class="p">[</span><span class="n">blknm</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;_space_group_name_H-M_alt&quot;</span><span class="p">,</span><span class="s">&#39;&#39;</span><span class="p">)</span>
170                    <span class="k">if</span> <span class="n">sg</span><span class="p">:</span> <span class="n">choice</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="s">&#39;, (&#39;</span> <span class="o">+</span> <span class="n">sg</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="o">+</span> <span class="s">&#39;)&#39;</span>
171                <span class="n">selblk</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">PhaseSelector</span><span class="p">(</span>
172                    <span class="n">choice</span><span class="p">,</span>
173                    <span class="n">ParentFrame</span><span class="o">=</span><span class="n">ParentFrame</span><span class="p">,</span>
174                    <span class="n">title</span><span class="o">=</span> <span class="s">&#39;Select a phase from one the CIF data_ blocks below&#39;</span><span class="p">,</span>
175                    <span class="n">size</span><span class="o">=</span><span class="p">(</span><span class="mi">600</span><span class="p">,</span><span class="mi">100</span><span class="p">)</span>
176                    <span class="p">)</span>
177            <span class="bp">self</span><span class="o">.</span><span class="n">errors</span> <span class="o">=</span> <span class="s">&#39;Error during reading of selected block&#39;</span>
178            <span class="k">if</span> <span class="n">selblk</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
179                <span class="n">returnstat</span> <span class="o">=</span> <span class="bp">False</span> <span class="c"># no block selected or available</span>
180            <span class="k">else</span><span class="p">:</span>
181                <span class="n">blknm</span> <span class="o">=</span> <span class="n">str_blklist</span><span class="p">[</span><span class="n">selblk</span><span class="p">]</span>
182                <span class="n">blk</span> <span class="o">=</span> <span class="n">cf</span><span class="p">[</span><span class="n">str_blklist</span><span class="p">[</span><span class="n">selblk</span><span class="p">]]</span>
183                <span class="n">E</span> <span class="o">=</span> <span class="bp">True</span>
184                <span class="n">Super</span> <span class="o">=</span> <span class="bp">False</span>
185                <span class="n">SpGrp</span> <span class="o">=</span> <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;_symmetry_space_group_name_H-M&quot;</span><span class="p">,</span><span class="s">&#39;&#39;</span><span class="p">)</span>
186                <span class="k">if</span> <span class="ow">not</span> <span class="n">SpGrp</span><span class="p">:</span>
187                    <span class="n">SpGrp</span> <span class="o">=</span> <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;_space_group_name_H-M_alt&quot;</span><span class="p">,</span><span class="s">&#39;&#39;</span><span class="p">)</span>
188                <span class="k">if</span> <span class="ow">not</span> <span class="n">SpGrp</span><span class="p">:</span>
189                    <span class="n">sspgrp</span> <span class="o">=</span> <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&quot;_space_group_ssg_name&quot;</span><span class="p">,</span><span class="s">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;(&#39;</span><span class="p">)</span>
190                    <span class="n">SpGrp</span> <span class="o">=</span> <span class="n">sspgrp</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
191                    <span class="n">SuperSg</span> <span class="o">=</span> <span class="s">&#39;(&#39;</span><span class="o">+</span><span class="n">sspgrp</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;</span><span class="se">\\</span><span class="s">&#39;</span><span class="p">,</span><span class="s">&#39;&#39;</span><span class="p">)</span>
192                    <span class="n">Super</span> <span class="o">=</span> <span class="bp">True</span>
193                    <span class="n">SuperVec</span> <span class="o">=</span> <span class="p">[[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="o">.</span><span class="mi">1</span><span class="p">],</span><span class="bp">False</span><span class="p">,</span><span class="mi">4</span><span class="p">]</span>
194                <span class="c"># try normalizing the space group, to see if we can pick the space group out of a table</span>
195                <span class="n">SpGrpNorm</span> <span class="o">=</span> <span class="n">G2spc</span><span class="o">.</span><span class="n">StandardizeSpcName</span><span class="p">(</span><span class="n">SpGrp</span><span class="p">)</span>
196                <span class="k">if</span> <span class="n">SpGrpNorm</span><span class="p">:</span>
197                    <span class="n">E</span><span class="p">,</span><span class="n">SGData</span> <span class="o">=</span> <span class="n">G2spc</span><span class="o">.</span><span class="n">SpcGroup</span><span class="p">(</span><span class="n">SpGrpNorm</span><span class="p">)</span>
198                <span class="c"># nope, try the space group &quot;out of the Box&quot;</span>
199                <span class="k">if</span> <span class="n">E</span> <span class="ow">and</span> <span class="n">SpGrp</span><span class="p">:</span>
200                    <span class="n">E</span><span class="p">,</span><span class="n">SGData</span> <span class="o">=</span> <span class="n">G2spc</span><span class="o">.</span><span class="n">SpcGroup</span><span class="p">(</span><span class="n">SpGrp</span><span class="p">)</span>
201                <span class="k">if</span> <span class="n">E</span><span class="p">:</span>
202                    <span class="k">if</span> <span class="ow">not</span> <span class="n">SpGrp</span><span class="p">:</span>
203                        <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">+=</span> <span class="s">&#39;No space group name was found in the CIF.&#39;</span>
204                        <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">The space group has been set to &quot;P 1&quot;. &#39;</span>
205                        <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">+=</span> <span class="s">&quot;Change this in phase&#39;s General tab.&quot;</span>
206                    <span class="k">else</span><span class="p">:</span>
207                        <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">+=</span> <span class="s">&#39;ERROR in space group symbol &#39;</span><span class="o">+</span><span class="n">SpGrp</span>
208                        <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">The space group has been set to &quot;P 1&quot;. &#39;</span>
209                        <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">+=</span> <span class="s">&quot;Change this in phase&#39;s General tab.&quot;</span>
210                        <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">Are there spaces separating axial fields?</span><span class="se">\n\n</span><span class="s">Error msg: &#39;</span>
211                        <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">+=</span> <span class="n">G2spc</span><span class="o">.</span><span class="n">SGErrors</span><span class="p">(</span><span class="n">E</span><span class="p">)</span>
212                    <span class="n">SGData</span> <span class="o">=</span> <span class="n">G2IO</span><span class="o">.</span><span class="n">SGData</span> <span class="c"># P 1</span>
213                <span class="bp">self</span><span class="o">.</span><span class="n">Phase</span><span class="p">[</span><span class="s">&#39;General&#39;</span><span class="p">][</span><span class="s">&#39;SGData&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">SGData</span>
214                <span class="c"># cell parameters</span>
215                <span class="n">cell</span> <span class="o">=</span> <span class="p">[]</span>
216                <span class="k">for</span> <span class="n">lbl</span> <span class="ow">in</span> <span class="n">cellitems</span><span class="p">:</span>
217                    <span class="n">cell</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cif</span><span class="o">.</span><span class="n">get_number_with_esd</span><span class="p">(</span><span class="n">blk</span><span class="p">[</span><span class="n">lbl</span><span class="p">])[</span><span class="mi">0</span><span class="p">])</span>
218                <span class="n">Volume</span> <span class="o">=</span> <span class="n">G2lat</span><span class="o">.</span><span class="n">calc_V</span><span class="p">(</span><span class="n">G2lat</span><span class="o">.</span><span class="n">cell2A</span><span class="p">(</span><span class="n">cell</span><span class="p">))</span>
219                <span class="bp">self</span><span class="o">.</span><span class="n">Phase</span><span class="p">[</span><span class="s">&#39;General&#39;</span><span class="p">][</span><span class="s">&#39;Cell&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="bp">False</span><span class="p">,]</span><span class="o">+</span><span class="n">cell</span><span class="o">+</span><span class="p">[</span><span class="n">Volume</span><span class="p">,]</span>
220                <span class="c"># read in atoms</span>
221                <span class="bp">self</span><span class="o">.</span><span class="n">errors</span> <span class="o">=</span> <span class="s">&#39;Error during reading of atoms&#39;</span>
222                <span class="n">atomlbllist</span> <span class="o">=</span> <span class="p">[]</span> <span class="c"># table to look up atom IDs</span>
223                <span class="n">atomloop</span> <span class="o">=</span> <span class="n">blk</span><span class="o">.</span><span class="n">GetLoop</span><span class="p">(</span><span class="s">&#39;_atom_site_label&#39;</span><span class="p">)</span>
224                <span class="n">atomkeys</span> <span class="o">=</span> <span class="p">[</span><span class="n">i</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">atomloop</span><span class="o">.</span><span class="n">keys</span><span class="p">()]</span>
225                <span class="k">if</span> <span class="ow">not</span> <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;_atom_site_type_symbol&#39;</span><span class="p">):</span>
226                    <span class="bp">self</span><span class="o">.</span><span class="n">isodistort_warnings</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">lack of atom types prevents ISODISTORT processing&#39;</span>
227                <span class="k">if</span> <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;_atom_site_aniso_label&#39;</span><span class="p">):</span>
228                    <span class="n">anisoloop</span> <span class="o">=</span> <span class="n">blk</span><span class="o">.</span><span class="n">GetLoop</span><span class="p">(</span><span class="s">&#39;_atom_site_aniso_label&#39;</span><span class="p">)</span>
229                    <span class="n">anisokeys</span> <span class="o">=</span> <span class="p">[</span><span class="n">i</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">anisoloop</span><span class="o">.</span><span class="n">keys</span><span class="p">()]</span>
230                <span class="k">else</span><span class="p">:</span>
231                    <span class="n">anisoloop</span> <span class="o">=</span> <span class="bp">None</span>
232                    <span class="n">anisokeys</span> <span class="o">=</span> <span class="p">[]</span>
233                <span class="bp">self</span><span class="o">.</span><span class="n">Phase</span><span class="p">[</span><span class="s">&#39;Atoms&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
234                <span class="n">G2AtomDict</span> <span class="o">=</span> <span class="p">{</span>  <span class="s">&#39;_atom_site_type_symbol&#39;</span> <span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
235                                <span class="s">&#39;_atom_site_label&#39;</span> <span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
236                                <span class="s">&#39;_atom_site_fract_x&#39;</span> <span class="p">:</span> <span class="mi">3</span><span class="p">,</span>
237                                <span class="s">&#39;_atom_site_fract_y&#39;</span> <span class="p">:</span> <span class="mi">4</span><span class="p">,</span>
238                                <span class="s">&#39;_atom_site_fract_z&#39;</span> <span class="p">:</span> <span class="mi">5</span><span class="p">,</span>
239                                <span class="s">&#39;_atom_site_occupancy&#39;</span> <span class="p">:</span> <span class="mi">6</span><span class="p">,</span>
240                                <span class="s">&#39;_atom_site_aniso_u_11&#39;</span> <span class="p">:</span> <span class="mi">11</span><span class="p">,</span>
241                                <span class="s">&#39;_atom_site_aniso_u_22&#39;</span> <span class="p">:</span> <span class="mi">12</span><span class="p">,</span>
242                                <span class="s">&#39;_atom_site_aniso_u_33&#39;</span> <span class="p">:</span> <span class="mi">13</span><span class="p">,</span>
243                                <span class="s">&#39;_atom_site_aniso_u_12&#39;</span> <span class="p">:</span> <span class="mi">14</span><span class="p">,</span>
244                                <span class="s">&#39;_atom_site_aniso_u_13&#39;</span> <span class="p">:</span> <span class="mi">15</span><span class="p">,</span>
245                                <span class="s">&#39;_atom_site_aniso_u_23&#39;</span> <span class="p">:</span> <span class="mi">16</span><span class="p">,</span> <span class="p">}</span>
246                <span class="n">ranIdlookup</span> <span class="o">=</span> <span class="p">{}</span>
247                <span class="k">for</span> <span class="n">aitem</span> <span class="ow">in</span> <span class="n">atomloop</span><span class="p">:</span>
248                    <span class="n">atomlist</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;&#39;</span><span class="p">,</span><span class="s">&#39;&#39;</span><span class="p">,</span><span class="s">&#39;&#39;</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mf">1.0</span><span class="p">,</span><span class="s">&#39;&#39;</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="s">&#39;I&#39;</span><span class="p">,</span><span class="mf">0.01</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">]</span>
249                    <span class="n">atomlist</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">ran</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">sys</span><span class="o">.</span><span class="n">maxint</span><span class="p">)</span> <span class="c"># add a random Id</span>
250                    <span class="k">while</span> <span class="n">atomlist</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="ow">in</span> <span class="n">ranIdlookup</span><span class="p">:</span>
251                        <span class="n">atomlist</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">ran</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">sys</span><span class="o">.</span><span class="n">maxint</span><span class="p">)</span> <span class="c"># make it unique</span>
252                    <span class="k">for</span> <span class="n">val</span><span class="p">,</span><span class="n">key</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">aitem</span><span class="p">,</span><span class="n">atomkeys</span><span class="p">):</span>
253                        <span class="n">col</span> <span class="o">=</span> <span class="n">G2AtomDict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
254                        <span class="k">if</span> <span class="n">col</span> <span class="o">&gt;=</span> <span class="mi">3</span><span class="p">:</span>
255                            <span class="n">atomlist</span><span class="p">[</span><span class="n">col</span><span class="p">]</span> <span class="o">=</span> <span class="n">cif</span><span class="o">.</span><span class="n">get_number_with_esd</span><span class="p">(</span><span class="n">val</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
256                        <span class="k">elif</span> <span class="n">col</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
257                            <span class="n">atomlist</span><span class="p">[</span><span class="n">col</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span>
258                        <span class="k">elif</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s">&#39;_atom_site_thermal_displace_type&#39;</span><span class="p">,</span>
259                                   <span class="s">&#39;_atom_site_adp_type&#39;</span><span class="p">):</span>   <span class="c">#Iso or Aniso?</span>
260                            <span class="k">if</span> <span class="n">val</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s">&#39;uani&#39;</span><span class="p">:</span>
261                                <span class="n">atomlist</span><span class="p">[</span><span class="mi">9</span><span class="p">]</span> <span class="o">=</span> <span class="s">&#39;A&#39;</span>
262                        <span class="k">elif</span> <span class="n">key</span> <span class="o">==</span> <span class="s">&#39;_atom_site_u_iso_or_equiv&#39;</span><span class="p">:</span>
263                            <span class="n">atomlist</span><span class="p">[</span><span class="mi">10</span><span class="p">]</span> <span class="o">=</span><span class="n">cif</span><span class="o">.</span><span class="n">get_number_with_esd</span><span class="p">(</span><span class="n">val</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
264                    <span class="k">if</span> <span class="ow">not</span> <span class="n">atomlist</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">and</span> <span class="n">atomlist</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
265                        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">):</span>
266                            <span class="n">typ</span> <span class="o">=</span> <span class="n">atomlist</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()[:</span><span class="n">i</span><span class="p">]</span>
267                            <span class="k">if</span> <span class="n">G2elem</span><span class="o">.</span><span class="n">CheckElement</span><span class="p">(</span><span class="n">typ</span><span class="p">):</span>
268                                <span class="n">atomlist</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">typ</span>
269                            <span class="k">if</span> <span class="ow">not</span> <span class="n">atomlist</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span> <span class="n">atomlist</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="s">&#39;Xe&#39;</span>
270                    <span class="n">ulbl</span> <span class="o">=</span> <span class="s">&#39;_atom_site_aniso_label&#39;</span>
271                    <span class="k">if</span>  <span class="n">atomlist</span><span class="p">[</span><span class="mi">9</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;A&#39;</span> <span class="ow">and</span> <span class="n">atomlist</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">ulbl</span><span class="p">):</span>
272                        <span class="k">for</span> <span class="n">val</span><span class="p">,</span><span class="n">key</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">anisoloop</span><span class="o">.</span><span class="n">GetKeyedPacket</span><span class="p">(</span><span class="n">ulbl</span><span class="p">,</span><span class="n">atomlist</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span>
273                                           <span class="n">anisokeys</span><span class="p">):</span>
274                            <span class="n">col</span> <span class="o">=</span> <span class="n">G2AtomDict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
275                            <span class="k">if</span> <span class="n">col</span><span class="p">:</span>
276                                <span class="n">atomlist</span><span class="p">[</span><span class="n">col</span><span class="p">]</span> <span class="o">=</span> <span class="n">cif</span><span class="o">.</span><span class="n">get_number_with_esd</span><span class="p">(</span><span class="n">val</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
277                    <span class="n">atomlist</span><span class="p">[</span><span class="mi">7</span><span class="p">],</span><span class="n">atomlist</span><span class="p">[</span><span class="mi">8</span><span class="p">]</span> <span class="o">=</span> <span class="n">G2spc</span><span class="o">.</span><span class="n">SytSym</span><span class="p">(</span><span class="n">atomlist</span><span class="p">[</span><span class="mi">3</span><span class="p">:</span><span class="mi">6</span><span class="p">],</span><span class="n">SGData</span><span class="p">)</span>
278                    <span class="n">atomlist</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">G2elem</span><span class="o">.</span><span class="n">FixValence</span><span class="p">(</span><span class="n">atomlist</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
279                    <span class="bp">self</span><span class="o">.</span><span class="n">Phase</span><span class="p">[</span><span class="s">&#39;Atoms&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">atomlist</span><span class="p">)</span>
280                    <span class="n">ranIdlookup</span><span class="p">[</span><span class="n">atomlist</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span> <span class="o">=</span> <span class="n">atomlist</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
281                    <span class="k">if</span> <span class="n">atomlist</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="n">atomlbllist</span><span class="p">:</span>
282                        <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">+=</span> <span class="s">&#39; ERROR: repeated atom label: &#39;</span><span class="o">+</span><span class="n">atomlist</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
283                    <span class="k">else</span><span class="p">:</span>
284                        <span class="n">atomlbllist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">atomlist</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
285                <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">atomlbllist</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">Phase</span><span class="p">[</span><span class="s">&#39;Atoms&#39;</span><span class="p">]):</span>
286                    <span class="bp">self</span><span class="o">.</span><span class="n">isodistort_warnings</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">Repeated atom labels prevents ISODISTORT decode&#39;</span>
287                <span class="k">for</span> <span class="n">lbl</span> <span class="ow">in</span> <span class="n">phasenamefields</span><span class="p">:</span> <span class="c"># get a name for the phase</span>
288                    <span class="n">name</span> <span class="o">=</span> <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">lbl</span><span class="p">)</span>
289                    <span class="k">if</span> <span class="n">name</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
290                        <span class="k">continue</span>
291                    <span class="n">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
292                    <span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="s">&#39;?&#39;</span> <span class="ow">or</span> <span class="n">name</span> <span class="o">==</span> <span class="s">&#39;.&#39;</span><span class="p">:</span>
293                        <span class="k">continue</span>
294                    <span class="k">else</span><span class="p">:</span>
295                        <span class="k">break</span>
296                <span class="k">else</span><span class="p">:</span> <span class="c"># no name found, use block name for lack of a better choice</span>
297                    <span class="n">name</span> <span class="o">=</span> <span class="n">blknm</span>
298                <span class="bp">self</span><span class="o">.</span><span class="n">Phase</span><span class="p">[</span><span class="s">&#39;General&#39;</span><span class="p">][</span><span class="s">&#39;Name&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">strip</span><span class="p">()[:</span><span class="mi">20</span><span class="p">]</span>
299                <span class="bp">self</span><span class="o">.</span><span class="n">Phase</span><span class="p">[</span><span class="s">&#39;General&#39;</span><span class="p">][</span><span class="s">&#39;Super&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Super</span>
300                <span class="k">if</span> <span class="n">Super</span><span class="p">:</span>
301                    <span class="bp">self</span><span class="o">.</span><span class="n">Phase</span><span class="p">[</span><span class="s">&#39;General&#39;</span><span class="p">][</span><span class="s">&#39;Type&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s">&#39;modulated&#39;</span>
302                    <span class="bp">self</span><span class="o">.</span><span class="n">Phase</span><span class="p">[</span><span class="s">&#39;General&#39;</span><span class="p">][</span><span class="s">&#39;SuperVec&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">SuperVec</span>
303                    <span class="bp">self</span><span class="o">.</span><span class="n">Phase</span><span class="p">[</span><span class="s">&#39;General&#39;</span><span class="p">][</span><span class="s">&#39;SuperSg&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">SuperSg</span>
304                    <span class="bp">self</span><span class="o">.</span><span class="n">Phase</span><span class="p">[</span><span class="s">&#39;General&#39;</span><span class="p">][</span><span class="s">&#39;SSGData&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">G2spc</span><span class="o">.</span><span class="n">SSpcGroup</span><span class="p">(</span><span class="n">SGData</span><span class="p">,</span><span class="n">SuperSg</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
305                <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">isodistort_warnings</span><span class="p">:</span>
306                    <span class="k">if</span> <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;_iso_displacivemode_label&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;_iso_occupancymode_label&#39;</span><span class="p">):</span>
307                        <span class="bp">self</span><span class="o">.</span><span class="n">errors</span> <span class="o">=</span> <span class="s">&quot;Error while processing ISODISTORT constraints&quot;</span>
308                        <span class="bp">self</span><span class="o">.</span><span class="n">ISODISTORT_proc</span><span class="p">(</span><span class="n">blk</span><span class="p">,</span><span class="n">atomlbllist</span><span class="p">,</span><span class="n">ranIdlookup</span><span class="p">)</span>
309                <span class="k">else</span><span class="p">:</span>
310                    <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">isodistort_warnings</span>
311                <span class="n">returnstat</span> <span class="o">=</span> <span class="bp">True</span>
312        <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">detail</span><span class="p">:</span>
313            <span class="bp">self</span><span class="o">.</span><span class="n">errors</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">  &#39;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">detail</span><span class="p">)</span>
314            <span class="k">print</span> <span class="s">&#39;CIF error:&#39;</span><span class="p">,</span><span class="n">detail</span> <span class="c"># for testing</span>
315            <span class="k">print</span> <span class="n">sys</span><span class="o">.</span><span class="n">exc_info</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span> <span class="c"># for testing</span>
316            <span class="kn">import</span> <span class="nn">traceback</span>
317            <span class="k">print</span> <span class="n">traceback</span><span class="o">.</span><span class="n">format_exc</span><span class="p">()</span>
318            <span class="n">returnstat</span> <span class="o">=</span> <span class="bp">False</span>
319        <span class="k">return</span> <span class="n">returnstat</span>
320
321<div class="viewcode-block" id="CIFPhaseReader.ISODISTORT_proc"><a class="viewcode-back" href="../imports.html#G2phase_CIF.CIFPhaseReader.ISODISTORT_proc">[docs]</a>    <span class="k">def</span> <span class="nf">ISODISTORT_proc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">blk</span><span class="p">,</span><span class="n">atomlbllist</span><span class="p">,</span><span class="n">ranIdlookup</span><span class="p">):</span>
322        <span class="s">&#39;Process ISODISTORT items to create constraints etc.&#39;</span>
323        <span class="n">varLookup</span> <span class="o">=</span> <span class="p">{</span><span class="s">&#39;dx&#39;</span><span class="p">:</span><span class="s">&#39;dAx&#39;</span><span class="p">,</span><span class="s">&#39;dy&#39;</span><span class="p">:</span><span class="s">&#39;dAy&#39;</span><span class="p">,</span><span class="s">&#39;dz&#39;</span><span class="p">:</span><span class="s">&#39;dAz&#39;</span><span class="p">,</span><span class="s">&#39;do&#39;</span><span class="p">:</span><span class="s">&#39;Afrac&#39;</span><span class="p">}</span>
324        <span class="s">&#39;Maps ISODISTORT parm names to GSAS-II names&#39;</span>
325        <span class="c">#----------------------------------------------------------------------</span>
326        <span class="c"># read in the ISODISTORT displacement modes</span>
327        <span class="c">#----------------------------------------------------------------------</span>
328        <span class="bp">self</span><span class="o">.</span><span class="n">Constraints</span> <span class="o">=</span> <span class="p">[]</span>
329        <span class="n">explaination</span> <span class="o">=</span> <span class="p">{}</span>
330        <span class="k">if</span> <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;_iso_displacivemode_label&#39;</span><span class="p">):</span>
331            <span class="n">modelist</span> <span class="o">=</span> <span class="p">[]</span>
332            <span class="n">shortmodelist</span> <span class="o">=</span> <span class="p">[]</span>
333            <span class="k">for</span> <span class="n">lbl</span> <span class="ow">in</span> <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;_iso_displacivemode_label&#39;</span><span class="p">):</span>
334                <span class="n">modelist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">lbl</span><span class="p">)</span>
335                <span class="c"># assume lbl is of form SSSSS[x,y,z]AAAA(a,b,...)BBBBB</span>
336                <span class="c"># where SSSSS is the parent spacegroup, [x,y,z] is a location </span>
337                <span class="n">regexp</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s">r&#39;.*?\[.*?\](.*?)\(.*?\)(.*)&#39;</span><span class="p">,</span><span class="n">lbl</span><span class="p">)</span>
338                <span class="c"># this extracts the AAAAA and BBBBB parts of the string</span>
339                <span class="k">if</span> <span class="n">regexp</span><span class="p">:</span>
340                    <span class="n">lbl</span> <span class="o">=</span> <span class="n">regexp</span><span class="o">.</span><span class="n">expand</span><span class="p">(</span><span class="s">r&#39;\1\2&#39;</span><span class="p">)</span> <span class="c"># parse succeeded, make a short version</span>
341                <span class="n">G2obj</span><span class="o">.</span><span class="n">MakeUniqueLabel</span><span class="p">(</span><span class="n">lbl</span><span class="p">,</span><span class="n">shortmodelist</span><span class="p">)</span> <span class="c"># make unique and add to list</span>
342            <span class="c"># read in the coordinate offset variables names and map them to G2 names/objects</span>
343            <span class="n">coordVarLbl</span> <span class="o">=</span> <span class="p">[]</span>
344            <span class="n">G2varLbl</span> <span class="o">=</span> <span class="p">[]</span>
345            <span class="n">G2varObj</span> <span class="o">=</span> <span class="p">[]</span>
346            <span class="n">error</span> <span class="o">=</span> <span class="bp">False</span>
347            <span class="k">for</span> <span class="n">lbl</span> <span class="ow">in</span> <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;_iso_deltacoordinate_label&#39;</span><span class="p">):</span>
348                <span class="n">coordVarLbl</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">lbl</span><span class="p">)</span>
349                <span class="k">if</span> <span class="s">&#39;_&#39;</span> <span class="ow">in</span> <span class="n">lbl</span><span class="p">:</span>
350                    <span class="n">albl</span> <span class="o">=</span> <span class="n">lbl</span><span class="p">[:</span><span class="n">lbl</span><span class="o">.</span><span class="n">rfind</span><span class="p">(</span><span class="s">&#39;_&#39;</span><span class="p">)]</span>
351                    <span class="n">vlbl</span> <span class="o">=</span> <span class="n">lbl</span><span class="p">[</span><span class="n">lbl</span><span class="o">.</span><span class="n">rfind</span><span class="p">(</span><span class="s">&#39;_&#39;</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">:]</span>
352                <span class="k">else</span><span class="p">:</span>
353                    <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">+=</span> <span class="s">&#39; ERROR: _iso_deltacoordinate_label not parsed: &#39;</span><span class="o">+</span><span class="n">lbl</span>
354                    <span class="n">error</span> <span class="o">=</span> <span class="bp">True</span>
355                    <span class="k">continue</span>
356                <span class="k">if</span> <span class="n">albl</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">atomlbllist</span><span class="p">:</span>
357                    <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">+=</span> <span class="s">&#39; ERROR: _iso_deltacoordinate_label atom not found: &#39;</span><span class="o">+</span><span class="n">lbl</span>
358                    <span class="n">error</span> <span class="o">=</span> <span class="bp">True</span>
359                    <span class="k">continue</span>
360                <span class="k">else</span><span class="p">:</span>
361                    <span class="n">anum</span> <span class="o">=</span> <span class="n">atomlbllist</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">albl</span><span class="p">)</span>
362                <span class="n">var</span> <span class="o">=</span> <span class="n">varLookup</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">vlbl</span><span class="p">)</span>
363                <span class="k">if</span> <span class="ow">not</span> <span class="n">var</span><span class="p">:</span>
364                    <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">+=</span> <span class="s">&#39; ERROR: _iso_deltacoordinate_label variable not found: &#39;</span><span class="o">+</span><span class="n">lbl</span>
365                    <span class="n">error</span> <span class="o">=</span> <span class="bp">True</span>
366                    <span class="k">continue</span>
367                <span class="n">G2varLbl</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">&#39;::&#39;</span><span class="o">+</span><span class="n">var</span><span class="o">+</span><span class="s">&#39;:&#39;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">anum</span><span class="p">))</span> <span class="c"># variable name, less phase ID</span>
368                <span class="n">G2varObj</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">G2obj</span><span class="o">.</span><span class="n">G2VarObj</span><span class="p">(</span>
369                    <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">Phase</span><span class="p">[</span><span class="s">&#39;ranId&#39;</span><span class="p">],</span><span class="bp">None</span><span class="p">,</span><span class="n">var</span><span class="p">,</span><span class="n">ranIdlookup</span><span class="p">[</span><span class="n">albl</span><span class="p">])</span>
370                    <span class="p">))</span>
371            <span class="k">if</span> <span class="n">error</span><span class="p">:</span>
372                <span class="k">raise</span> <span class="ne">Exception</span><span class="p">,</span><span class="s">&quot;Error decoding variable labels&quot;</span>
373
374            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">G2varObj</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">modelist</span><span class="p">):</span>
375                <span class="k">print</span> <span class="s">&quot;non-square input&quot;</span>
376                <span class="k">raise</span> <span class="ne">Exception</span><span class="p">,</span><span class="s">&quot;Rank of _iso_displacivemode != _iso_deltacoordinate&quot;</span>
377
378            <span class="n">error</span> <span class="o">=</span> <span class="bp">False</span>
379            <span class="n">ParentCoordinates</span> <span class="o">=</span> <span class="p">{}</span>
380            <span class="k">for</span> <span class="n">lbl</span><span class="p">,</span><span class="n">exp</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span>
381                <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;_iso_coordinate_label&#39;</span><span class="p">),</span>
382                <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;_iso_coordinate_formula&#39;</span><span class="p">),</span>
383                <span class="p">):</span>
384                <span class="k">if</span> <span class="s">&#39;_&#39;</span> <span class="ow">in</span> <span class="n">lbl</span><span class="p">:</span>
385                    <span class="n">albl</span> <span class="o">=</span> <span class="n">lbl</span><span class="p">[:</span><span class="n">lbl</span><span class="o">.</span><span class="n">rfind</span><span class="p">(</span><span class="s">&#39;_&#39;</span><span class="p">)]</span>
386                    <span class="n">vlbl</span> <span class="o">=</span> <span class="n">lbl</span><span class="p">[</span><span class="n">lbl</span><span class="o">.</span><span class="n">rfind</span><span class="p">(</span><span class="s">&#39;_&#39;</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">:]</span>
387                <span class="k">else</span><span class="p">:</span>
388                    <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">+=</span> <span class="s">&#39; ERROR: _iso_coordinate_label not parsed: &#39;</span><span class="o">+</span><span class="n">lbl</span>
389                    <span class="n">error</span> <span class="o">=</span> <span class="bp">True</span>
390                    <span class="k">continue</span>
391                <span class="k">if</span> <span class="n">vlbl</span> <span class="ow">not</span> <span class="ow">in</span> <span class="s">&#39;xyz&#39;</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">vlbl</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
392                    <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">+=</span> <span class="s">&#39; ERROR: _iso_coordinate_label coordinate not parsed: &#39;</span><span class="o">+</span><span class="n">lbl</span>
393                    <span class="n">error</span> <span class="o">=</span> <span class="bp">True</span>
394                    <span class="k">continue</span>
395                <span class="n">i</span> <span class="o">=</span> <span class="s">&#39;xyz&#39;</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">vlbl</span><span class="p">)</span>
396                <span class="k">if</span> <span class="ow">not</span> <span class="n">ParentCoordinates</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">albl</span><span class="p">):</span>
397                    <span class="n">ParentCoordinates</span><span class="p">[</span><span class="n">albl</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="bp">None</span><span class="p">,</span><span class="bp">None</span><span class="p">,</span><span class="bp">None</span><span class="p">]</span>
398                <span class="k">if</span> <span class="s">&#39;+&#39;</span> <span class="ow">in</span> <span class="n">exp</span><span class="p">:</span>
399                    <span class="n">val</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;+&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
400                    <span class="n">val</span> <span class="o">=</span> <span class="n">G2p3</span><span class="o">.</span><span class="n">FormulaEval</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
401                    <span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
402                        <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">+=</span> <span class="s">&#39; ERROR: _iso_coordinate_formula coordinate not interpreted: &#39;</span><span class="o">+</span><span class="n">lbl</span>
403                        <span class="n">error</span> <span class="o">=</span> <span class="bp">True</span>
404                        <span class="k">continue</span>
405                    <span class="n">ParentCoordinates</span><span class="p">[</span><span class="n">albl</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span>
406                <span class="k">else</span><span class="p">:</span>
407                    <span class="n">ParentCoordinates</span><span class="p">[</span><span class="n">albl</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">G2p3</span><span class="o">.</span><span class="n">FormulaEval</span><span class="p">(</span><span class="n">exp</span><span class="p">)</span>
408            <span class="k">if</span> <span class="n">error</span><span class="p">:</span>
409                <span class="k">print</span> <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span>
410                <span class="k">raise</span> <span class="ne">Exception</span><span class="p">,</span><span class="s">&quot;Error decoding variable labels&quot;</span>
411            <span class="c"># get mapping of modes to atomic coordinate displacements</span>
412            <span class="n">displacivemodematrix</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">G2varObj</span><span class="p">),</span><span class="nb">len</span><span class="p">(</span><span class="n">G2varObj</span><span class="p">)))</span>
413            <span class="k">for</span> <span class="n">row</span><span class="p">,</span><span class="n">col</span><span class="p">,</span><span class="n">val</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span>
414                <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;_iso_displacivemodematrix_row&#39;</span><span class="p">),</span>
415                <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;_iso_displacivemodematrix_col&#39;</span><span class="p">),</span>
416                <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;_iso_displacivemodematrix_value&#39;</span><span class="p">),):</span>
417                <span class="n">displacivemodematrix</span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">row</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="nb">int</span><span class="p">(</span><span class="n">col</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
418            <span class="c"># Invert to get mapping of atom displacements to modes</span>
419            <span class="n">displacivemodeInvmatrix</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">inv</span><span class="p">(</span><span class="n">displacivemodematrix</span><span class="p">)</span>
420            <span class="c"># create the constraints</span>
421            <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">row</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">displacivemodeInvmatrix</span><span class="p">):</span>
422                <span class="n">constraint</span> <span class="o">=</span> <span class="p">[]</span>
423                <span class="k">for</span> <span class="n">j</span><span class="p">,(</span><span class="n">lbl</span><span class="p">,</span><span class="n">k</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">coordVarLbl</span><span class="p">,</span><span class="n">row</span><span class="p">)):</span>
424                    <span class="k">if</span> <span class="n">k</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">continue</span>
425                    <span class="n">constraint</span><span class="o">.</span><span class="n">append</span><span class="p">([</span><span class="n">k</span><span class="p">,</span><span class="n">G2varObj</span><span class="p">[</span><span class="n">j</span><span class="p">]])</span>
426                <span class="n">constraint</span> <span class="o">+=</span> <span class="p">[</span><span class="n">shortmodelist</span><span class="p">[</span><span class="n">i</span><span class="p">],</span><span class="bp">False</span><span class="p">,</span><span class="s">&#39;f&#39;</span><span class="p">]</span>
427                <span class="bp">self</span><span class="o">.</span><span class="n">Constraints</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">constraint</span><span class="p">)</span>
428            <span class="c">#----------------------------------------------------------------------</span>
429            <span class="c"># save the ISODISTORT info for &quot;mode analysis&quot;</span>
430            <span class="k">if</span> <span class="s">&#39;ISODISTORT&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">Phase</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">Phase</span><span class="p">[</span><span class="s">&#39;ISODISTORT&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
431            <span class="bp">self</span><span class="o">.</span><span class="n">Phase</span><span class="p">[</span><span class="s">&#39;ISODISTORT&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">update</span><span class="p">({</span>
432                <span class="s">&#39;IsoModeList&#39;</span> <span class="p">:</span> <span class="n">modelist</span><span class="p">,</span>
433                <span class="s">&#39;G2ModeList&#39;</span> <span class="p">:</span> <span class="n">shortmodelist</span><span class="p">,</span>
434                <span class="s">&#39;IsoVarList&#39;</span> <span class="p">:</span> <span class="n">coordVarLbl</span><span class="p">,</span>
435                <span class="s">&#39;G2VarList&#39;</span> <span class="p">:</span> <span class="n">G2varObj</span><span class="p">,</span>
436                <span class="s">&#39;ParentStructure&#39;</span> <span class="p">:</span> <span class="n">ParentCoordinates</span><span class="p">,</span>
437                <span class="s">&#39;Var2ModeMatrix&#39;</span> <span class="p">:</span> <span class="n">displacivemodeInvmatrix</span><span class="p">,</span>
438                <span class="s">&#39;Mode2VarMatrix&#39;</span> <span class="p">:</span> <span class="n">displacivemodematrix</span><span class="p">,</span>
439                <span class="p">})</span>
440            <span class="c"># make explaination dictionary</span>
441            <span class="k">for</span> <span class="n">mode</span><span class="p">,</span><span class="n">shortmode</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">modelist</span><span class="p">,</span><span class="n">shortmodelist</span><span class="p">):</span>
442                <span class="n">explaination</span><span class="p">[</span><span class="n">shortmode</span><span class="p">]</span> <span class="o">=</span> <span class="s">&quot;ISODISTORT full name &quot;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">mode</span><span class="p">)</span>
443        <span class="c">#----------------------------------------------------------------------</span>
444        <span class="c"># now read in the ISODISTORT occupancy modes</span>
445        <span class="c">#----------------------------------------------------------------------</span>
446        <span class="k">if</span> <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;_iso_occupancymode_label&#39;</span><span class="p">):</span>
447            <span class="n">modelist</span> <span class="o">=</span> <span class="p">[]</span>
448            <span class="n">shortmodelist</span> <span class="o">=</span> <span class="p">[]</span>
449            <span class="k">for</span> <span class="n">lbl</span> <span class="ow">in</span> <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;_iso_occupancymode_label&#39;</span><span class="p">):</span>
450                <span class="n">modelist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">lbl</span><span class="p">)</span>
451                <span class="c"># assume lbl is of form SSSSS[x,y,z]AAAA(a,b,...)BBBBB</span>
452                <span class="c"># where SSSSS is the parent spacegroup, [x,y,z] is a location </span>
453                <span class="n">regexp</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s">r&#39;.*?\[.*?\](.*?)\(.*?\)(.*)&#39;</span><span class="p">,</span><span class="n">lbl</span><span class="p">)</span>
454                <span class="c"># this extracts the AAAAA and BBBBB parts of the string</span>
455                <span class="k">if</span> <span class="n">regexp</span><span class="p">:</span>
456                    <span class="n">lbl</span> <span class="o">=</span> <span class="n">regexp</span><span class="o">.</span><span class="n">expand</span><span class="p">(</span><span class="s">r&#39;\1\2&#39;</span><span class="p">)</span> <span class="c"># parse succeeded, make a short version</span>
457                <span class="n">lbl</span> <span class="o">=</span> <span class="n">lbl</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">&#39;order&#39;</span><span class="p">,</span><span class="s">&#39;o&#39;</span><span class="p">)</span>
458                <span class="n">G2obj</span><span class="o">.</span><span class="n">MakeUniqueLabel</span><span class="p">(</span><span class="n">lbl</span><span class="p">,</span><span class="n">shortmodelist</span><span class="p">)</span> <span class="c"># make unique and add to list</span>
459            <span class="c"># read in the coordinate offset variables names and map them to G2 names/objects</span>
460            <span class="n">occVarLbl</span> <span class="o">=</span> <span class="p">[]</span>
461            <span class="n">G2varLbl</span> <span class="o">=</span> <span class="p">[]</span>
462            <span class="n">G2varObj</span> <span class="o">=</span> <span class="p">[]</span>
463            <span class="n">error</span> <span class="o">=</span> <span class="bp">False</span>
464            <span class="k">for</span> <span class="n">lbl</span> <span class="ow">in</span> <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;_iso_deltaoccupancy_label&#39;</span><span class="p">):</span>
465                <span class="n">occVarLbl</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">lbl</span><span class="p">)</span>
466                <span class="k">if</span> <span class="s">&#39;_&#39;</span> <span class="ow">in</span> <span class="n">lbl</span><span class="p">:</span>
467                    <span class="n">albl</span> <span class="o">=</span> <span class="n">lbl</span><span class="p">[:</span><span class="n">lbl</span><span class="o">.</span><span class="n">rfind</span><span class="p">(</span><span class="s">&#39;_&#39;</span><span class="p">)]</span>
468                    <span class="n">vlbl</span> <span class="o">=</span> <span class="n">lbl</span><span class="p">[</span><span class="n">lbl</span><span class="o">.</span><span class="n">rfind</span><span class="p">(</span><span class="s">&#39;_&#39;</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">:]</span>
469                <span class="k">else</span><span class="p">:</span>
470                    <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">+=</span> <span class="s">&#39; ERROR: _iso_deltaoccupancy_label not parsed: &#39;</span><span class="o">+</span><span class="n">lbl</span>
471                    <span class="n">error</span> <span class="o">=</span> <span class="bp">True</span>
472                    <span class="k">continue</span>
473                <span class="k">if</span> <span class="n">albl</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">atomlbllist</span><span class="p">:</span>
474                    <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">+=</span> <span class="s">&#39; ERROR: _iso_deltaoccupancy_label atom not found: &#39;</span><span class="o">+</span><span class="n">lbl</span>
475                    <span class="n">error</span> <span class="o">=</span> <span class="bp">True</span>
476                    <span class="k">continue</span>
477                <span class="k">else</span><span class="p">:</span>
478                    <span class="n">anum</span> <span class="o">=</span> <span class="n">atomlbllist</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">albl</span><span class="p">)</span>
479                <span class="n">var</span> <span class="o">=</span> <span class="n">varLookup</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">vlbl</span><span class="p">)</span>
480                <span class="k">if</span> <span class="ow">not</span> <span class="n">var</span><span class="p">:</span>
481                    <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">+=</span> <span class="s">&#39; ERROR: _iso_deltaoccupancy_label variable not found: &#39;</span><span class="o">+</span><span class="n">lbl</span>
482                    <span class="n">error</span> <span class="o">=</span> <span class="bp">True</span>
483                    <span class="k">continue</span>
484                <span class="n">G2varLbl</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">&#39;::&#39;</span><span class="o">+</span><span class="n">var</span><span class="o">+</span><span class="s">&#39;:&#39;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">anum</span><span class="p">))</span> <span class="c"># variable name, less phase ID</span>
485                <span class="n">G2varObj</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">G2obj</span><span class="o">.</span><span class="n">G2VarObj</span><span class="p">(</span>
486                    <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">Phase</span><span class="p">[</span><span class="s">&#39;ranId&#39;</span><span class="p">],</span><span class="bp">None</span><span class="p">,</span><span class="n">var</span><span class="p">,</span><span class="n">ranIdlookup</span><span class="p">[</span><span class="n">albl</span><span class="p">])</span>
487                    <span class="p">))</span>
488            <span class="k">if</span> <span class="n">error</span><span class="p">:</span>
489                <span class="k">raise</span> <span class="ne">Exception</span><span class="p">,</span><span class="s">&quot;Error decoding variable labels&quot;</span>
490
491            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">G2varObj</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">modelist</span><span class="p">):</span>
492                <span class="k">print</span> <span class="s">&quot;non-square input&quot;</span>
493                <span class="k">raise</span> <span class="ne">Exception</span><span class="p">,</span><span class="s">&quot;Rank of _iso_occupancymode != _iso_deltaoccupancy&quot;</span>
494
495            <span class="n">error</span> <span class="o">=</span> <span class="bp">False</span>
496            <span class="n">ParentCoordinates</span> <span class="o">=</span> <span class="p">{}</span>
497            <span class="k">for</span> <span class="n">lbl</span><span class="p">,</span><span class="n">exp</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span>
498                <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;_iso_occupancy_label&#39;</span><span class="p">),</span>
499                <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;_iso_occupancy_formula&#39;</span><span class="p">),</span>
500                <span class="p">):</span>
501                <span class="k">if</span> <span class="s">&#39;_&#39;</span> <span class="ow">in</span> <span class="n">lbl</span><span class="p">:</span>
502                    <span class="n">albl</span> <span class="o">=</span> <span class="n">lbl</span><span class="p">[:</span><span class="n">lbl</span><span class="o">.</span><span class="n">rfind</span><span class="p">(</span><span class="s">&#39;_&#39;</span><span class="p">)]</span>
503                    <span class="n">vlbl</span> <span class="o">=</span> <span class="n">lbl</span><span class="p">[</span><span class="n">lbl</span><span class="o">.</span><span class="n">rfind</span><span class="p">(</span><span class="s">&#39;_&#39;</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">:]</span>
504                <span class="k">else</span><span class="p">:</span>
505                    <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">+=</span> <span class="s">&#39; ERROR: _iso_occupancy_label not parsed: &#39;</span><span class="o">+</span><span class="n">lbl</span>
506                    <span class="n">error</span> <span class="o">=</span> <span class="bp">True</span>
507                    <span class="k">continue</span>
508                <span class="k">if</span> <span class="n">vlbl</span> <span class="o">!=</span> <span class="s">&#39;occ&#39;</span><span class="p">:</span>
509                    <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">+=</span> <span class="s">&#39; ERROR: _iso_occupancy_label coordinate not parsed: &#39;</span><span class="o">+</span><span class="n">lbl</span>
510                    <span class="n">error</span> <span class="o">=</span> <span class="bp">True</span>
511                    <span class="k">continue</span>
512                <span class="k">if</span> <span class="s">&#39;+&#39;</span> <span class="ow">in</span> <span class="n">exp</span><span class="p">:</span>
513                    <span class="n">val</span> <span class="o">=</span> <span class="n">exp</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;+&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
514                    <span class="n">val</span> <span class="o">=</span> <span class="n">G2p3</span><span class="o">.</span><span class="n">FormulaEval</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
515                    <span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
516                        <span class="bp">self</span><span class="o">.</span><span class="n">warnings</span> <span class="o">+=</span> <span class="s">&#39; ERROR: _iso_occupancy_formula coordinate not interpreted: &#39;</span><span class="o">+</span><span class="n">lbl</span>
517                        <span class="n">error</span> <span class="o">=</span> <span class="bp">True</span>
518                        <span class="k">continue</span>
519                    <span class="n">ParentCoordinates</span><span class="p">[</span><span class="n">albl</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span>
520            <span class="k">if</span> <span class="n">error</span><span class="p">:</span>
521                <span class="k">raise</span> <span class="ne">Exception</span><span class="p">,</span><span class="s">&quot;Error decoding occupancy labels&quot;</span>
522            <span class="c"># get mapping of modes to atomic coordinate displacements</span>
523            <span class="n">occupancymodematrix</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">G2varObj</span><span class="p">),</span><span class="nb">len</span><span class="p">(</span><span class="n">G2varObj</span><span class="p">)))</span>
524            <span class="k">for</span> <span class="n">row</span><span class="p">,</span><span class="n">col</span><span class="p">,</span><span class="n">val</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span>
525                <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;_iso_occupancymodematrix_row&#39;</span><span class="p">),</span>
526                <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;_iso_occupancymodematrix_col&#39;</span><span class="p">),</span>
527                <span class="n">blk</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;_iso_occupancymodematrix_value&#39;</span><span class="p">),):</span>
528                <span class="n">occupancymodematrix</span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">row</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="nb">int</span><span class="p">(</span><span class="n">col</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
529            <span class="c"># Invert to get mapping of atom displacements to modes</span>
530            <span class="n">occupancymodeInvmatrix</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">inv</span><span class="p">(</span><span class="n">occupancymodematrix</span><span class="p">)</span>
531            <span class="c"># create the constraints</span>
532            <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">row</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">occupancymodeInvmatrix</span><span class="p">):</span>
533                <span class="n">constraint</span> <span class="o">=</span> <span class="p">[]</span>
534                <span class="k">for</span> <span class="n">j</span><span class="p">,(</span><span class="n">lbl</span><span class="p">,</span><span class="n">k</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">occVarLbl</span><span class="p">,</span><span class="n">row</span><span class="p">)):</span>
535                    <span class="k">if</span> <span class="n">k</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">continue</span>
536                    <span class="n">constraint</span><span class="o">.</span><span class="n">append</span><span class="p">([</span><span class="n">k</span><span class="p">,</span><span class="n">G2varObj</span><span class="p">[</span><span class="n">j</span><span class="p">]])</span>
537                <span class="n">constraint</span> <span class="o">+=</span> <span class="p">[</span><span class="n">shortmodelist</span><span class="p">[</span><span class="n">i</span><span class="p">],</span><span class="bp">False</span><span class="p">,</span><span class="s">&#39;f&#39;</span><span class="p">]</span>
538                <span class="bp">self</span><span class="o">.</span><span class="n">Constraints</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">constraint</span><span class="p">)</span>
539            <span class="c">#----------------------------------------------------------------------</span>
540            <span class="c"># save the ISODISTORT info for &quot;mode analysis&quot;</span>
541            <span class="k">if</span> <span class="s">&#39;ISODISTORT&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">Phase</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">Phase</span><span class="p">[</span><span class="s">&#39;ISODISTORT&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
542            <span class="bp">self</span><span class="o">.</span><span class="n">Phase</span><span class="p">[</span><span class="s">&#39;ISODISTORT&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">update</span><span class="p">({</span>
543                <span class="s">&#39;OccModeList&#39;</span> <span class="p">:</span> <span class="n">modelist</span><span class="p">,</span>
544                <span class="s">&#39;G2OccModeList&#39;</span> <span class="p">:</span> <span class="n">shortmodelist</span><span class="p">,</span>
545                <span class="s">&#39;OccVarList&#39;</span> <span class="p">:</span> <span class="n">occVarLbl</span><span class="p">,</span>
546                <span class="s">&#39;G2OccVarList&#39;</span> <span class="p">:</span> <span class="n">G2varObj</span><span class="p">,</span>
547                <span class="s">&#39;BaseOcc&#39;</span> <span class="p">:</span> <span class="n">ParentCoordinates</span><span class="p">,</span>
548                <span class="s">&#39;Var2OccMatrix&#39;</span> <span class="p">:</span> <span class="n">occupancymodeInvmatrix</span><span class="p">,</span>
549                <span class="s">&#39;Occ2VarMatrix&#39;</span> <span class="p">:</span> <span class="n">occupancymodematrix</span><span class="p">,</span>
550                <span class="p">})</span>
551            <span class="c"># make explaination dictionary</span>
552            <span class="k">for</span> <span class="n">mode</span><span class="p">,</span><span class="n">shortmode</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">modelist</span><span class="p">,</span><span class="n">shortmodelist</span><span class="p">):</span>
553                <span class="n">explaination</span><span class="p">[</span><span class="n">shortmode</span><span class="p">]</span> <span class="o">=</span> <span class="s">&quot;ISODISTORT full name &quot;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">mode</span><span class="p">)</span>
554        <span class="c">#----------------------------------------------------------------------</span>
555        <span class="c"># done with read</span>
556        <span class="c">#----------------------------------------------------------------------</span>
557        <span class="k">if</span> <span class="n">explaination</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">Constraints</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">explaination</span><span class="p">)</span>
558
559        <span class="c"># # debug: show the mode var to mode relations</span>
560        <span class="c"># for i,row in enumerate(displacivemodeInvmatrix):</span>
561        <span class="c">#     l = &#39;&#39;</span>
562        <span class="c">#     for j,(lbl,k) in enumerate(zip(coordVarLbl,row)):</span>
563        <span class="c">#         if k == 0: continue</span>
564        <span class="c">#         if l: l += &#39; + &#39;</span>
565        <span class="c">#         #l += lbl+&#39; * &#39;+str(k)</span>
566        <span class="c">#         l += G2varLbl[j]+&#39; * &#39;+str(k)</span>
567        <span class="c">#     print str(i) + &#39;: &#39;+shortmodelist[i]+&#39; = &#39;+l</span>
568        <span class="c"># print 70*&#39;=&#39;</span>
569
570        <span class="c"># # debug: Get the ISODISTORT offset values</span>
571        <span class="c"># coordVarDelta = {}</span>
572        <span class="c"># for lbl,val in zip(</span>
573        <span class="c">#     blk.get(&#39;_iso_deltacoordinate_label&#39;),</span>
574        <span class="c">#     blk.get(&#39;_iso_deltacoordinate_value&#39;),):</span>
575        <span class="c">#     coordVarDelta[lbl] = float(val)</span>
576        <span class="c"># modeVarDelta = {}</span>
577        <span class="c"># for lbl,val in zip(</span>
578        <span class="c">#     blk.get(&#39;_iso_displacivemode_label&#39;),</span>
579        <span class="c">#     blk.get(&#39;_iso_displacivemode_value&#39;),):</span>
580        <span class="c">#     modeVarDelta[lbl] = cif.get_number_with_esd(val)[0]</span>
581
582        <span class="c"># print 70*&#39;=&#39;</span>
583        <span class="c"># # compute the mode values from the reported coordinate deltas</span>
584        <span class="c"># for i,row in enumerate(displacivemodeInvmatrix):</span>
585        <span class="c">#     l = &#39;&#39;</span>
586        <span class="c">#     sl = &#39;&#39;</span>
587        <span class="c">#     s = 0.</span>
588        <span class="c">#     for lbl,k in zip(coordVarLbl,row):</span>
589        <span class="c">#         if k == 0: continue</span>
590        <span class="c">#         if l: l += &#39; + &#39;</span>
591        <span class="c">#         l += lbl+&#39; * &#39;+str(k)</span>
592        <span class="c">#         if sl: sl += &#39; + &#39;</span>
593        <span class="c">#         sl += str(coordVarDelta[lbl])+&#39; * &#39;+str(k)</span>
594        <span class="c">#         s += coordVarDelta[lbl] * k</span>
595        <span class="c">#     print &#39;a&#39;+str(i)+&#39; = &#39;+l</span>
596        <span class="c">#     print &#39;\t= &#39;+sl</span>
597        <span class="c">#     print  modelist[i],shortmodelist[i],modeVarDelta[modelist[i]],s</span>
598        <span class="c">#     print</span>
599
600        <span class="c"># print 70*&#39;=&#39;</span>
601        <span class="c"># # compute the coordinate displacements from the reported mode values</span>
602        <span class="c"># for i,lbl,row in zip(range(len(coordVarLbl)),coordVarLbl,displacivemodematrix):</span>
603        <span class="c">#     l = &#39;&#39;</span>
604        <span class="c">#     sl = &#39;&#39;</span>
605        <span class="c">#     s = 0.0</span>
606        <span class="c">#     for j,k in enumerate(row):</span>
607        <span class="c">#         if k == 0: continue</span>
608        <span class="c">#         if l: l += &#39; + &#39;</span>
609        <span class="c">#         l += &#39;a&#39;+str(j+1)+&#39; * &#39;+str(k)</span>
610        <span class="c">#         if sl: sl += &#39; + &#39;</span>
611        <span class="c">#         sl += str(shortmodelist[j]) +&#39; = &#39;+ str(modeVarDelta[modelist[j]]) + &#39; * &#39;+str(k)</span>
612        <span class="c">#         s += modeVarDelta[modelist[j]] * k</span>
613        <span class="c">#     print lbl+&#39; = &#39;+l</span>
614        <span class="c">#     print &#39;\t= &#39;+sl</span>
615        <span class="c">#     print lbl,G2varLbl[i],coordVarDelta[lbl],s</span>
616        <span class="c">#     print</span>
617
618        <span class="c"># determine the coordinate delta values from deviations from the parent structure</span>
619        <span class="c"># for atmline in self.Phase[&#39;Atoms&#39;]:</span>
620        <span class="c">#     lbl = atmline[0]</span>
621        <span class="c">#     x,y,z = atmline[3:6]</span>
622        <span class="c">#     if lbl not in ParentCoordinates:</span>
623        <span class="c">#         print lbl,x,y,z</span>
624        <span class="c">#         continue</span>
625        <span class="c">#     px,py,pz = ParentCoordinates[lbl]</span>
626        <span class="c">#     print lbl,x,y,z,x-px,y-py,z-pz</span></div></div>
627</pre></div>
628
629          </div>
630        </div>
631      </div>
632      <div class="sphinxsidebar">
633        <div class="sphinxsidebarwrapper">
634            <p class="logo"><a href="../index.html">
635              <img class="logo" src="../_static/G2_html_logo.png" alt="Logo"/>
636            </a></p>
637<div id="searchbox" style="display: none">
638  <h3>Quick search</h3>
639    <form class="search" action="../search.html" method="get">
640      <input type="text" name="q" />
641      <input type="submit" value="Go" />
642      <input type="hidden" name="check_keywords" value="yes" />
643      <input type="hidden" name="area" value="default" />
644    </form>
645    <p class="searchtip" style="font-size: 90%">
646    Enter search terms or a module, class or function name.
647    </p>
648</div>
649<script type="text/javascript">$('#searchbox').show(0);</script>
650        </div>
651      </div>
652      <div class="clearer"></div>
653    </div>
654    <div class="related">
655      <h3>Navigation</h3>
656      <ul>
657        <li class="right" style="margin-right: 10px">
658          <a href="../genindex.html" title="General Index"
659             >index</a></li>
660        <li class="right" >
661          <a href="../py-modindex.html" title="Python Module Index"
662             >modules</a> |</li>
663        <li><a href="../index.html">GSAS-II 0.2.0 documentation</a> &raquo;</li>
664          <li><a href="index.html" >Module code</a> &raquo;</li> 
665      </ul>
666    </div>
667    <div class="footer">
668        &copy; Copyright 2013, Von Dreele and Toby for Argonne National Laboratory.
669      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.2.
670    </div>
671  </body>
672</html>
Note: See TracBrowser for help on using the repository browser.