Files
dev/script/__Lib/diffcalc-2.1/diffcalc/ub/reflections.py
2019-03-20 13:52:00 +01:00

127 lines
4.8 KiB
Python
Executable File

###
# Copyright 2008-2011 Diamond Light Source Ltd.
# This file is part of Diffcalc.
#
# Diffcalc is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Diffcalc is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Diffcalc. If not, see <http://www.gnu.org/licenses/>.
###
from copy import deepcopy
import datetime # @UnusedImport for the eval below
from diffcalc.util import DiffcalcException, bold
from diffcalc.hkl.vlieg.geometry import VliegPosition
class _Reflection:
"""A reflection"""
def __init__(self, h, k, l, position, energy, tag, time):
self.h = float(h)
self.k = float(k)
self.l = float(l)
self.pos = position
self.tag = tag
self.energy = float(energy) # energy=12.39842/lambda
self.wavelength = 12.3984 / self.energy
self.time = time # Saved as e.g. repr(datetime.now())
def __str__(self):
return ("energy=%-6.3f h=%-4.2f k=%-4.2f l=%-4.2f alpha=%-8.4f "
"delta=%-8.4f gamma=%-8.4f omega=%-8.4f chi=%-8.4f "
"phi=%-8.4f %-s %s" % (self.energy, self.h, self.k, self.l,
self.pos.alpha, self.pos.delta, self.pos.gamma, self.pos.omega,
self.pos.chi, self.pos.phi, self.tag, self.time))
class ReflectionList:
def __init__(self, diffractometerPluginObject, externalAngleNames, reflections=None):
self._geometry = diffractometerPluginObject
self._externalAngleNames = externalAngleNames
self._reflist = reflections if reflections else []
def add_reflection(self, h, k, l, position, energy, tag, time):
"""adds a reflection, position in degrees
"""
if type(position) in (list, tuple):
try:
position = self._geometry.create_position(*position)
except AttributeError:
position = VliegPosition(*position)
self._reflist += [_Reflection(h, k, l, position, energy, tag,
time.__repr__())]
def edit_reflection(self, num, h, k, l, position, energy, tag, time):
"""num starts at 1"""
if type(position) in (list, tuple):
position = VliegPosition(*position)
try:
self._reflist[num - 1] = _Reflection(h, k, l, position, energy, tag,
time.__repr__())
except IndexError:
raise DiffcalcException("There is no reflection " + repr(num)
+ " to edit.")
def getReflection(self, num):
"""
getReflection(num) --> ( [h, k, l], position, energy, tag, time ) --
num starts at 1 position in degrees
"""
r = deepcopy(self._reflist[num - 1]) # for convenience
return [r.h, r.k, r.l], deepcopy(r.pos), r.energy, r.tag, eval(r.time)
def get_reflection_in_external_angles(self, num):
"""getReflection(num) --> ( [h, k, l], (angle1...angleN), energy, tag )
-- num starts at 1 position in degrees"""
r = deepcopy(self._reflist[num - 1]) # for convenience
externalAngles = self._geometry.internal_position_to_physical_angles(r.pos)
result = [r.h, r.k, r.l], externalAngles, r.energy, r.tag, eval(r.time)
return result
def removeReflection(self, num):
del self._reflist[num - 1]
def swap_reflections(self, num1, num2):
orig1 = self._reflist[num1 - 1]
self._reflist[num1 - 1] = self._reflist[num2 - 1]
self._reflist[num2 - 1] = orig1
def __len__(self):
return len(self._reflist)
def __str__(self):
return '\n'.join(self.str_lines())
def str_lines(self):
axes = tuple(s.upper() for s in self._externalAngleNames)
if not self._reflist:
return [" <<< none specified >>>"]
lines = []
format = (" %6s %5s %5s %5s " + "%8s " * len(axes) + " TAG")
values = ('ENERGY', 'H', 'K', 'L') + axes
lines.append(bold(format % values))
for n in range(len(self._reflist)):
ref_tuple = self.get_reflection_in_external_angles(n + 1)
[h, k, l], externalAngles, energy, tag, _ = ref_tuple
if tag is None:
tag = ""
format = (" %2d %6.3f % 4.2f % 4.2f % 4.2f " +
"% 8.4f " * len(axes) + " %s")
values = (n + 1, energy, h, k, l) + externalAngles + (tag,)
lines.append(format % values)
return lines