Skip to content

Commit

Permalink
xrdpattern: Merged PowderExperiment into xrdpattern
Browse files Browse the repository at this point in the history
  • Loading branch information
Somerandomguy10111 committed May 28, 2024
1 parent 6df17ea commit 6952244
Show file tree
Hide file tree
Showing 10 changed files with 99 additions and 149 deletions.
15 changes: 4 additions & 11 deletions tests/t_parsing/t_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,10 @@ def test_report_ok(self):
print(f'Parsing report: {as_str}')

def test_metadata_ok(self):
metadata = self.pattern.metadata
properties = [metadata.anode_material, metadata.measurement_date]
print(f'anode material {metadata.anode_material}')
print(f'measurement date {metadata.measurement_date}')

for prop in properties:
self.assertIsNotNone(obj=prop)

primary_wavelength = metadata.primary
secondary_wavelength = metadata.secondary
ratio = metadata.ratio
metadata = self.pattern.experiment
primary_wavelength = metadata.primary_wavelength
secondary_wavelength = metadata.secondary_wavelength
ratio = metadata.artifacts.secondary_to_primary
print(f'prim, sec, ratio {primary_wavelength}, {secondary_wavelength}, {ratio}')

for prop in [primary_wavelength, secondary_wavelength, ratio]:
Expand Down
2 changes: 1 addition & 1 deletion tests/t_pattern/t_xrdpattern.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ def test_data_ok(self):
def test_from_angle_data(self):
angles = [1.0, 2.0, 3.0]
intensities = [10.0, 20.0, 100.0]
pattern = XrdPattern.from_intensitiy_map(angles=angles, intensities=intensities)
pattern = XrdPattern.from_intensitiy_map(two_theta_values=angles, intensities=intensities)
self.check_data_ok(*pattern.get_pattern_data(apply_standardization=False))

if __name__ == "__main__":
Expand Down
3 changes: 1 addition & 2 deletions xrdpattern/core/__init__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
from .metadata import Metadata
from .pattern_info import PatternInfo
from .pattern_data import PatternData
79 changes: 0 additions & 79 deletions xrdpattern/core/metadata.py

This file was deleted.

27 changes: 11 additions & 16 deletions xrdpattern/core/pattern_info.py → xrdpattern/core/pattern_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,22 @@
from holytools.abstract import JsonDataclass
from dataclasses import dataclass, fields
from typing import Optional
from .metadata import Metadata

from xrdpattern.powder import PowderExperiment

# -------------------------------------------

@dataclass
class PatternInfo(JsonDataclass):
class PatternData(JsonDataclass):
two_theta_values : list[float]
intensities : list[float]
metadata: Metadata
experiment : PowderExperiment
name : Optional[str] = None

def get_wavelength(self, primary : bool = True) -> Optional[float]:
wavelength = self.metadata.primary if primary else self.metadata.secondary
return wavelength

def set_wavelength(self, new_wavelength : float, primary : bool = True):
if primary:
self.metadata.primary = new_wavelength
else:
self.metadata.secondary = new_wavelength
@classmethod
def from_intensitiy_map(cls, two_theta_values: list[float], intensities: list[float]) -> PatternData:
metadata = PowderExperiment.make_empty()
return cls(two_theta_values=two_theta_values, intensities=intensities, experiment=metadata)

def to_dict(self):
return {f.name: getattr(self, f.name) for f in fields(self)}
Expand All @@ -51,15 +47,14 @@ def get_standardized_map(self, start_val : float, stop_val : float, num_entries
return std_angles,std_intensities


def __eq__(self, other : PatternInfo):
if not isinstance(other, PatternInfo):
def __eq__(self, other : PatternData):
if not isinstance(other, PatternData):
return False

angles_equal = self.two_theta_values == other.two_theta_values
intensities_equal = self.intensities == other.intensities
metadata_equal = self.metadata == other.metadata

return angles_equal and intensities_equal and metadata_equal
return angles_equal and intensities_equal


if __name__ == '__main__':
Expand Down
6 changes: 3 additions & 3 deletions xrdpattern/parsing/csv/csv_read.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

from holytools.abstract import SelectableEnum

from xrdpattern.core import Metadata, PatternInfo
from xrdpattern.core import PatternData
from .table_selector import TableSelector, TextTable, NumericalTable


Expand Down Expand Up @@ -44,7 +44,7 @@ def as_matrix(self, fpath : str) -> NumericalTable:
return TableSelector.get_numerical_subtable(table=table)


def read_csv(self, fpath: str) -> list[PatternInfo]:
def read_csv(self, fpath: str) -> list[PatternData]:
matrix = self.as_matrix(fpath=fpath)
x_axis_row = matrix.get_data(row=0)
data_rows = [matrix.get_data(row=row) for row in range(1, matrix.get_row_count())]
Expand All @@ -63,7 +63,7 @@ def read_csv(self, fpath: str) -> list[PatternInfo]:
two_theta_degs = x_axis_row

for intensities in data_rows:
new = PatternInfo(two_theta_values=two_theta_degs, intensities=intensities, metadata=Metadata.make_empty())
new = PatternData.from_intensitiy_map(two_theta_values=two_theta_degs, intensities=intensities)
pattern_infos.append(new)

x_axis_type = 'QValues' if is_qvalues else 'TwoThetaDegs'
Expand Down
23 changes: 13 additions & 10 deletions xrdpattern/parsing/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@
from typing import Optional
from dataclasses import dataclass
from holytools.fsys import SaveManager
from xrdpattern.core import PatternInfo, Metadata
from xrdpattern.core import PatternData
from .data_files import XrdFormat, Formats, get_xylib_repr
from .csv import CsvParser, Orientation
from xrdpattern.parsing.stoe import StoeReader
from ..powder import PowderExperiment


# -------------------------------------------

@dataclass
Expand All @@ -27,7 +30,7 @@ def __init__(self, parser_options : ParserOptions = ParserOptions()):
# -------------------------------------------
# pattern

def get_pattern_info_list(self, fpath : str) -> list[PatternInfo]:
def get_pattern_info_list(self, fpath : str) -> list[PatternData]:
suffix = SaveManager.get_suffix(fpath)
if not suffix in Formats.get_allowed_suffixes():
raise ValueError(f"File {fpath} has unsupported format .{suffix}")
Expand All @@ -47,26 +50,26 @@ def get_pattern_info_list(self, fpath : str) -> list[PatternInfo]:
else:
raise ValueError(f"Format .{the_format} is not supported")
for pattern in pattern_infos:
if pattern.get_wavelength(primary=True) is None and self.default_wavelength_angstr:
pattern.set_wavelength(new_wavelength=self.default_wavelength_angstr)
if pattern.experiment.primary_wavelength is None and self.default_wavelength_angstr:
pattern.experiment.artifacts.primary_wavelength = self.default_wavelength_angstr
for info in pattern_infos:
info.name = os.path.basename(fpath)
return pattern_infos


@staticmethod
def from_json(fpath: str) -> PatternInfo:
def from_json(fpath: str) -> PatternData:
with open(fpath, 'r') as file:
data = file.read()
new_pattern = PatternInfo.from_str(json_str=data)
new_pattern = PatternData.from_str(json_str=data)
return new_pattern


@staticmethod
def from_data_file(fpath: str, format_hint : XrdFormat) -> PatternInfo:
def from_data_file(fpath: str, format_hint : XrdFormat) -> PatternData:
xylib_repr = get_xylib_repr(fpath=fpath, format_hint=format_hint)
header,data_str = xylib_repr.get_header(), xylib_repr.get_data()
metadata = Metadata.from_header_str(header_str=header)
metadata = PowderExperiment.from_xylib_header(header_str=header)

angles, intensities= [], []
data_rows = [row for row in data_str.split('\n') if not row.strip() == '']
Expand All @@ -75,11 +78,11 @@ def from_data_file(fpath: str, format_hint : XrdFormat) -> PatternInfo:
deg, intensity = float(deg_str), float(intensity_str)
angles.append(deg)
intensities.append(intensity)
return PatternInfo(two_theta_values=angles,intensities=intensities,metadata=metadata)
return PatternData(two_theta_values=angles, intensities=intensities, experiment=metadata)


@staticmethod
def from_csv(fpath : str) -> list[PatternInfo]:
def from_csv(fpath : str) -> list[PatternData]:
if CsvParser.has_two_columns(fpath=fpath):
orientation = Orientation.VERTICAL
else:
Expand Down
15 changes: 9 additions & 6 deletions xrdpattern/parsing/stoe/reader.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from xrdpattern.core import Metadata, PatternInfo
from xrdpattern.core import PatternData
from .quantities import Quantity, FloatQuantity, IntegerQuantity
from ...powder import Artifacts, PowderExperiment


class BinaryReader:
def read(self, fpath : str):
Expand Down Expand Up @@ -35,16 +37,17 @@ def read(self, fpath : str):
super().read_bytes(byte_content=byte_content)


def get_pattern_info(self, fpath : str) -> PatternInfo:
def get_pattern_info(self, fpath : str) -> PatternData:
self.read(fpath=fpath)
metadata = Metadata(primary=self.primary_wavelength.get_value(),
secondary=self.secondary_wavelength.get_value(),
ratio=self.ratio.get_value())
experiment = PowderExperiment.make_empty()
experiment.artifacts = Artifacts(primary_wavelength=self.primary_wavelength.get_value(),
secondary_wavelength=self.secondary_wavelength.get_value(),
secondary_to_primary=self.ratio.get_value())

two_theta_values = self._get_x_values()
intensities = self._get_y_values()

return PatternInfo(metadata=metadata, two_theta_values=two_theta_values, intensities=intensities)
return PatternData(two_theta_values=two_theta_values, intensities=intensities, experiment=experiment)


def _get_x_values(self) -> list[float]:
Expand Down
29 changes: 12 additions & 17 deletions xrdpattern/pattern/pattern.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
from __future__ import annotations
import matplotlib.pyplot as plt

import os
from uuid import uuid4
from typing import Optional
from holytools.fsys import SaveManager
from uuid import uuid4

import matplotlib.pyplot as plt

from holytools.fsys import SaveManager
from xrdpattern.core import PatternData
from xrdpattern.parsing import Parser, ParserOptions
from xrdpattern.core import PatternInfo, Metadata
from .pattern_report import PatternReport


# -------------------------------------------

class XrdPattern(PatternInfo):
class XrdPattern(PatternData):
def plot(self, apply_standardization=True):
plt.figure(figsize=(10, 6))
plt.ylabel('Intensity')
Expand Down Expand Up @@ -52,11 +56,6 @@ def save(self, fpath : str, force_overwrite : bool = False):
with open(fpath, 'w') as f:
f.write(self.to_str())

@classmethod
def from_intensitiy_map(cls, angles: list[float], intensities: list[float]) -> XrdPattern:
metadata = Metadata.make_empty()
return XrdPattern(two_theta_values=angles, intensities=intensities, metadata=metadata)

# -------------------------------------------
# get

Expand All @@ -66,15 +65,11 @@ def get_parsing_report(self, datafile_fpath : str) -> PatternReport:
pattern_health.add_critical('No data found. Degree over intensity is empty!')
elif len(self.two_theta_values) < 10:
pattern_health.add_critical('Data is too short. Less than 10 entries!')
if self.get_wavelength(primary=True) is None:
pattern_health.add_error('Primary wavelength missing!')

if self.get_wavelength(primary=False) is None:
if self.experiment.primary_wavelength is None:
pattern_health.add_error('Primary wavelength missing!')
if self.experiment.secondary_wavelength is None:
pattern_health.add_warning('No secondary wavelength found')
if self.metadata.anode_material is None:
pattern_health.add_warning('No anode material found')
if self.metadata.measurement_date is None:
pattern_health.add_warning('No measurement datetime found')

return pattern_health

Expand Down
Loading

0 comments on commit 6952244

Please sign in to comment.