Skip to content

Commit

Permalink
initial work on full tof support in EDA.
Browse files Browse the repository at this point in the history
  • Loading branch information
rozyczko committed Feb 7, 2025
1 parent c459983 commit 436cde0
Show file tree
Hide file tree
Showing 6 changed files with 1,271 additions and 3 deletions.
1,201 changes: 1,200 additions & 1 deletion src/easydiffraction/calculators/cryspy/parser.py

Large diffs are not rendered by default.

45 changes: 44 additions & 1 deletion src/easydiffraction/io/cif.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from typing import Tuple
from typing import Union

import numpy as np
from easycrystallography.Components.AtomicDisplacement import AtomicDisplacement
from easycrystallography.Components.Lattice import Lattice
from easycrystallography.Components.SpaceGroup import SpaceGroup
Expand Down Expand Up @@ -1050,9 +1051,51 @@ def str2float(text):
return 0
raise ex


def dataBlockToCif(block, includeBlockName=True):
cif = ''

if includeBlockName:
cif += f"data_{block['name']['value']}"
cif += '\n\n'

if 'params' in block:
for category in block['params'].values():
for param in category.values():
# if param["optional"]:
# continue

value = param["value"]
if value is None:
continue

if isinstance(value, (float, int)): # If parameter is of float type
value = np.float32(value) # Simplifies output
if param["fit"]:
error = param["error"]
#error = np.float32(error) # Simplifies output
if error == 0:
paramStr = f'{value}()' # Adds empty brackets for standard uncertainty for free params
else:
_, _, paramStr = IO.toStdDevSmalestPrecision(value, error) # Adds brackets with standard uncertainty for free params
else:
paramStr = str(value) # Keeps 32bit presicion format in contrast to f'{...}'
elif isinstance(value, str): # If parameter is of string type
if ' ' in value: # Adds quotes to text with spaces, e.g. P n m a -> "P n m a"
paramStr = f'"{value}"'
else:
paramStr = f'{value}'
else:
console.error(f'Unsupported parameter type {type(value)} for {value}')
continue

cif += f'{param["category"]}.{param["name"]} {paramStr}'
cif += '\n'
cif += '\n'
return cif


def dataBlockToCif_old(block, includeBlockName=True):
cif = ''
if includeBlockName:
cif += f'data_{block["name"]["value"]}'
cif += '\n\n'
Expand Down
7 changes: 7 additions & 0 deletions src/easydiffraction/io/cif_reader.py
Original file line number Diff line number Diff line change
Expand Up @@ -145,10 +145,17 @@ def parameters_from_cif_block(block) -> dict:
if value is not None:
parameters['dtt2'] = {}
parameters['dtt2']['value'], parameters['dtt2']['error'] = parse_with_error(value)

value = block.find_value('_pd_instr_2theta_bank') or block.find_value('_pd_instr.2theta_bank')
if value is not None:
parameters['2theta_bank'] = {}
parameters['2theta_bank']['value'], parameters['2theta_bank']['error'] = parse_with_error(value)

value = block.find_value('_pd_instr.zero') or block.find_value('_pd_instr_zero')
if value is not None:
parameters['zero'] = {}
parameters['zero']['value'], parameters['zero']['error'] = parse_with_error(value)

value = block.find_value('_pd_instr_peak_shape') or block.find_value('_pd_instr.peak_shape')
if value is not None:
parameters['peak_shape'] = value
Expand Down
5 changes: 5 additions & 0 deletions src/easydiffraction/job/experiment/experiment.py
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,11 @@ def tof_parameters_from_dict(self, p: dict):
if p['2theta_bank'].get('error') is not None:
parameters.ttheta_bank.error = p['2theta_bank'].get('error')
parameters.ttheta_bank.fixed = False
if 'zero' in p:
parameters.zero = p['zero'].get('value', 0.0)
if p['zero'].get('error') is not None:
parameters.zero.error = p['zero'].get('error')
parameters.zero.fixed = False
if 'alpha0' in p:
parameters.alpha0 = p['alpha0'].get('value', 0.0)
if p['alpha0'].get('error') is not None:
Expand Down
10 changes: 10 additions & 0 deletions src/easydiffraction/job/experiment/pd_1d.py
Original file line number Diff line number Diff line change
Expand Up @@ -461,6 +461,12 @@ class Instrument1DTOFParameters(BaseObj):
'value': 0.00224,
'fixed': True,
},
'zero': {
'name': 'zero',
'url': 'https://docs.easydiffraction.org/lib/dictionaries/_pd_instr/',
'value': 0.0,
'fixed': True,
},
}

ttheta_bank: ClassVar[Parameter]
Expand All @@ -476,6 +482,7 @@ class Instrument1DTOFParameters(BaseObj):
alpha1: ClassVar[Parameter]
beta0: ClassVar[Parameter]
beta1: ClassVar[Parameter]
zero: ClassVar[Parameter]

def __init__(
self,
Expand All @@ -492,6 +499,7 @@ def __init__(
alpha1: Optional[Union[Parameter, float]] = None,
beta0: Optional[Union[Parameter, float]] = None,
beta1: Optional[Union[Parameter, float]] = None,
zero: Optional[Union[Parameter, float]] = None,
interface: Optional[iF] = None,
):
super().__init__(
Expand Down Expand Up @@ -525,6 +533,8 @@ def __init__(
self.beta0 = beta0
if beta1 is not None:
self.beta1 = beta1
if zero is not None:
self.zero = zero

self.name = self._name
self.interface = interface
Expand Down
6 changes: 5 additions & 1 deletion src/easydiffraction/job/job.py
Original file line number Diff line number Diff line change
Expand Up @@ -420,7 +420,11 @@ def add_experiment_from_file(self, file_url: str) -> None:
self.experiment.from_xye_file(file_url)
else:
self.experiment.from_cif_file(file_url)
self.update_after_new_experiment()

def update_after_new_experiment(self) -> None:
"""
"""
self.update_experiment_type()
# re-do the sample in case of type change.
# Different type read in (likely TOF), so re-create the sample
Expand Down Expand Up @@ -453,7 +457,7 @@ def add_experiment_from_string(self, cif_string: str) -> None:
Just a wrapper around the Experiment class method.
"""
self.experiment.from_cif_string(cif_string)
self.update_experiment_type()
self.update_after_new_experiment()

def add_sample_from_file(self, file_url: str) -> None:
"""
Expand Down

0 comments on commit 436cde0

Please sign in to comment.