Trying to match SED data to simulated ED patterns from a .cif file + list of rotation:
%matplotlib tk
import pycrystem as pc
import numpy as np
import transforms3d
dp = pc.load('QuantumDots\QD-03.blo')
dp.apply_affine_transformation(D = np.array([[0.99, 0.00, 0.00],
[0.00, 0.69, 0.00],
[0.00, 0.00, 1.00]]))
dp.set_calibration(0.032)
structure = pc.Structure.from_file("CsPbBr3_1.cif")
Initially I used a full list of 32000 (or so) combinations of Euler angles to define a rotation list:
rot_array = np.loadtxt('mmm_grid_euler')
rot_list = rot_array.tolist()
edc = pc.ElectronDiffractionCalculator(300, 0.025)
diff_gen = pc.DiffractionLibraryGenerator(edc)
struc_lib = dict()
struc_lib["CsPbBr3"] = (structure, rot_list)
library = diff_gen.get_diffraction_library(struc_lib,
calibration=1.2/128,
reciprocal_radius=1.,
representation='euler')
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-11-7c406103d17d> in <module>()
----> 1 match_results = indexer.correlate(parallel = True)
~\Anaconda3\lib\site-packages\pycrystem-0.4-py3.6-win-amd64.egg\pycrystem\indexation_generator.py in correlate(self, n_largest, *args, **kwargs)
119 n_largest=n_largest,
120 inplace=False,
--> 121 *args, **kwargs)
122 return MatchingResults(matching_results)
123
~\Anaconda3\lib\site-packages\hyperspy\signal.py in map(self, function, show_progressbar, parallel, inplace, ragged, **kwargs)
3530 parallel=parallel, inplace=inplace,
3531 ragged=ragged,
-> 3532 **kwargs)
3533 if inplace:
3534 self.events.data_changed.trigger(obj=self)
~\Anaconda3\lib\site-packages\hyperspy\signal.py in _map_iterate(self, function, iterating_kwargs, show_progressbar, parallel, ragged, inplace, **kwargs)
3650 show_progressbar)
3651 for ind, res in zip(range(res_data.size),
-> 3652 thismap(func, zip(*iterators))):
3653 res_data.flat[ind] = res
3654 if ragged is False:
~\Anaconda3\lib\concurrent\futures\_base.py in result_iterator()
584 # Careful not to keep a reference to the popped future
585 if timeout is None:
--> 586 yield fs.pop().result()
587 else:
588 yield fs.pop().result(end_time - time.time())
~\Anaconda3\lib\concurrent\futures\_base.py in result(self, timeout)
430 raise CancelledError()
431 elif self._state == FINISHED:
--> 432 return self.__get_result()
433 else:
434 raise TimeoutError()
~\Anaconda3\lib\concurrent\futures\_base.py in __get_result(self)
382 def __get_result(self):
383 if self._exception:
--> 384 raise self._exception
385 else:
386 return self._result
~\Anaconda3\lib\concurrent\futures\thread.py in run(self)
54
55 try:
---> 56 result = self.fn(*self.args, **self.kwargs)
57 except BaseException as exc:
58 self.future.set_exception(exc)
~\Anaconda3\lib\site-packages\hyperspy\misc\utils.py in func(*args)
973 def func(*args):
974 dat, these_kwargs = figure_out_kwargs(*args)
--> 975 return function(dat, **these_kwargs)
976
977 return func, iterators
~\Anaconda3\lib\site-packages\pycrystem-0.4-py3.6-win-amd64.egg\pycrystem\indexation_generator.py in correlate_library(image, library, n_largest)
45 correlations = dict()
46 for orientation, diffraction_pattern in library[key].items():
---> 47 correlation = correlate(image, diffraction_pattern)
48 correlations[orientation] = correlation
49 res = nlargest(n_largest, correlations.items(), key=itemgetter(1))
~\Anaconda3\lib\site-packages\pycrystem-0.4-py3.6-win-amd64.egg\pycrystem\utils\__init__.py in correlate(image, pattern, include_direct_beam, sim_threshold, interpolate, **kwargs)
77 image_intensities = image.T[pixel_coordinates[:, 0][in_bounds], pixel_coordinates[:, 1][in_bounds]]
78 pattern_intensities = pattern_intensities[mask]
---> 79 return np.nan_to_num(_correlate(image_intensities, pattern_intensities))
80
81
~\Anaconda3\lib\site-packages\pycrystem-0.4-py3.6-win-amd64.egg\pycrystem\utils\__init__.py in _correlate(intensities_1, intensities_2)
114
115 def _correlate(intensities_1, intensities_2):
--> 116 return np.dot(intensities_1, intensities_2) / (
117 np.sqrt(np.dot(intensities_1, intensities_1)) *
118 np.sqrt(np.dot(intensities_2, intensities_2))
ValueError: shapes (14,) and (13,) not aligned: 14 (dim 0) != 13 (dim 0)
I found that there is a special triplet of Euler angles that causes that problem.
rot_list_test = [(2.692794, 1.352630, 4.288523)]
rot_list_test
edc = pc.ElectronDiffractionCalculator(300, 0.025)
diff_gen = pc.DiffractionLibraryGenerator(edc)
struc_lib = dict()
struc_lib["CsPbBr3"] = (structure, rot_list_test)
library = diff_gen.get_diffraction_library(struc_lib,
calibration=1.2/128,
reciprocal_radius=1.,
representation='euler')
indexer = IndexationGenerator(dp, library)
match_results = indexer.correlate(parallel = True)
Which gives the same error as above. After removing this one set of angles from original file everything works fine. Even changing one of the angles slightly can fix the issue (for example changing the last one from 4.288523 to 4.288525. The issue repeats for different files with this set of angles, is fixed when the set is removed.