#! python
# -*- coding: utf-8 -*-
"""Module for sample related classes and functions.
Authors:
* Victor Hugo de Mello Pessoa <victor.pessoa@usp.br>
* Daniel Cosmo Pizetta <daniel.pizetta@usp.br>
Since:
2017/07/01
"""
import logging
import pyqtgraph.parametertree as pt
_logger = logging.getLogger(__name__)
[docs]class SampleConfig(pt.parameterTypes.GroupParameter):
"""Class that configure the limit parameters of each sample.
Todo:
This class needs to be reviewed for its parameters.
"""
def __init__(self, **opts):
opts['name'] = 'Sample Config'
opts['type'] = 'bool'
opts['value'] = True
pt.parameterTypes.GroupParameter.__init__(self, **opts)
# Sample size
self.maxSizeX = self.addChild({'name': 'Size X Max', 'type': 'float', 'value': 50.0, 'suffix': ' cm', 'limits': (1, 100)})
self.SizeX = self.addChild({'name': 'Size X Default', 'type': 'float', 'value': 10.0, 'suffix': ' cm', 'limits': (1, 100)})
self.maxSizeY = self.addChild({'name': 'Size Y Max', 'type': 'float', 'value': 50.0, 'suffix': ' cm', 'limits': (1, 100)})
self.SizeY = self.addChild({'name': 'Size Y Default', 'type': 'float', 'value': 10.0, 'suffix': ' cm', 'limits': (1, 100)})
self.maxSizeZ = self.addChild({'name': 'Size Z Max', 'type': 'float', 'value': 50.0, 'suffix': ' cm', 'limits': (1, 100)})
self.SizeZ = self.addChild({'name': 'Size Z Default', 'type': 'float', 'value': 10.0, 'suffix': ' cm', 'limits': (1, 100)})
# Number of points
self.Nx = self.addChild({'name': 'Nx Default', 'type': 'int', 'value': 2, 'step': 1, 'limits': (1, 2048)})
self.Ny = self.addChild({'name': 'Ny Default', 'type': 'int', 'value': 2, 'step': 1, 'limits': (1, 2048)})
self.Nz = self.addChild({'name': 'Nz Default', 'type': 'int', 'value': 2, 'step': 1, 'limits': (1, 2048)})
self.maxN = self.addChild({'name': 'Max Number of points', 'type': 'int', 'value': 1024, 'step': 1, 'limits': (1, 2048)})
[docs]class Sample(pt.parameterTypes.GroupParameter):
"""Class that represents the parameters of each sample.
Args:
sample_config (SampleConfig): An object that represents the limits to this sample.
Todo:
This class needs to be reviewed for its parameters.
"""
def __init__(self, sample_config, **opts):
opts['name'] = 'Sample'
opts['type'] = 'bool'
opts['value'] = True
pt.parameterTypes.GroupParameter.__init__(self, **opts)
# Sample size
self.SizeX = self.addChild({'name': 'Size X', 'type': 'float', 'value': 10.0, 'suffix': ' cm'})
self.SizeX.setValue(sample_config.SizeX.value())
self.SizeX.setLimits((1, sample_config.maxSizeX.value()))
self.SizeY = self.addChild({'name': 'Size Y', 'type': 'float', 'value': 10.0, 'suffix': ' cm'})
self.SizeY.setValue(sample_config.SizeY.value())
self.SizeY.setLimits((1, sample_config.maxSizeY.value()))
self.SizeZ = self.addChild({'name': 'Size Z', 'type': 'float', 'value': 10.0, 'suffix': ' cm'})
self.SizeZ.setValue(sample_config.SizeZ.value())
self.SizeZ.setLimits((1, sample_config.maxSizeZ.value()))
# Number of points in each direction
self.Nx = self.addChild({'name': 'Nx', 'value': 5, 'type': 'int'})
self.Nx.setValue(sample_config.Nx.value())
self.Nx.setLimits((1, sample_config.maxN.value()))
self.Ny = self.addChild({'name': 'Ny', 'value': 5, 'type': 'int'})
self.Ny.setValue(sample_config.Ny.value())
self.Ny.setLimits((1, sample_config.maxN.value()))
self.Nz = self.addChild({'name': 'Nz', 'value': 5, 'type': 'int'})
self.Nz.setValue(sample_config.Nz.value())
self.Nz.setLimits((1, sample_config.maxN.value()))
# Sample element size
self.dX = self.addChild({'name': 'dX', 'type': 'float', 'value': 10.0, 'suffix': ' cm', 'readonly': True})
self.dY = self.addChild({'name': 'dY', 'type': 'float', 'value': 10.0, 'suffix': ' cm', 'readonly': True})
self.dZ = self.addChild({'name': 'dZ', 'type': 'float', 'value': 10.0, 'suffix': ' cm', 'readonly': True})
# Connecting signals
self.Nx.sigValueChanged.connect(self.dXUpdate)
self.Ny.sigValueChanged.connect(self.dYUpdate)
self.Nz.sigValueChanged.connect(self.dZUpdate)
self.SizeX.sigValueChanged.connect(self.dXUpdate)
self.SizeY.sigValueChanged.connect(self.dYUpdate)
self.SizeZ.sigValueChanged.connect(self.dZUpdate)
[docs] def dXUpdate(self):
"""Update the value for dX."""
self.dX.setValue(self.SizeX.value() / self.Nx.value())
[docs] def dYUpdate(self):
"""Update the value for dY."""
self.dY.setValue(self.SizeY.value() / self.Ny.value())
[docs] def dZUpdate(self):
"""Update the value for dZ."""
self.dZ.setValue(self.SizeZ.value() / self.Nz.value())
[docs]class SampleElementConfig(pt.parameterTypes.GroupParameter):
"""Class that configure the limit parameters of each sample element.
Todo:
This class needs to be reviewed for its parameters.
"""
def __init__(self, **opts):
opts['name'] = 'Sample Element Config'
opts['type'] = 'bool'
opts['value'] = True
pt.parameterTypes.GroupParameter.__init__(self, **opts)
# T1 Limits and Default
self.maxT1 = self.addChild({'name': 'T1 Max Value', 'type': 'float', 'value': 5., 'step': 1, 'limits': (0, 100), 'suffix': ' s', 'siPrefix': True})
self.minT1 = self.addChild({'name': 'T1 Min Value', 'type': 'float', 'value': 0., 'step': 1, 'limits': (0, 100), 'suffix': ' s'})
self.t1 = self.addChild({'name': 'T1 Default', 'type': 'float', 'value': 0.2, 'step': 1, 'limits': (0, 100), 'suffix': 's', 'siPrefix': True})
# T2 Limits and Default
self.maxT2 = self.addChild({'name': 'T2 Max Value', 'type': 'float', 'value': 5., 'step': 1, 'limits': (0, 100), 'suffix': ' s', 'siPrefix': True})
self.minT2 = self.addChild({'name': 'T2 Min Value', 'type': 'float', 'value': 0., 'step': 1, 'limits': (0, 100), 'suffix': ' s'})
self.t2 = self.addChild({'name': 'T2 Default', 'type': 'float', 'value': 0.3, 'step': 1, 'limits': (0, 100), 'suffix': 's', 'siPrefix': True})
# Density of spins Limts and Default
self.maxRho = self.addChild({'name': 'ρ Max Value', 'type': 'float', 'value': 1, 'step': 0.1, 'limits': (1, 100)})
self.minRho = self.addChild({'name': 'ρ Min Value', 'type': 'float', 'value': 0, 'step': 0.1, 'limits': (0, 100)})
self.rho = self.addChild({'name': 'ρ Default', 'type': 'float', 'value': 1, 'step': 0.01, 'limits': (0, 100)})
[docs]class SampleElement(pt.parameterTypes.GroupParameter):
"""Class that represents the parameters of each sample element.
Args:
sample_element_config (SampleElementConfig): An object that represents the limits to the sample elements.
Todo:
This class needs to be reviewed for its parameters.
"""
def __init__(self, sample_element_config, **opts):
opts['name'] = 'Sample Element'
opts['type'] = 'bool'
opts['value'] = True
pt.parameterTypes.GroupParameter.__init__(self, **opts)
# T1 and T2
self.t1 = self.addChild({'name': 'T1', 'type': 'float', 'value': 5., 'step': 1, 'limits': (0, 100), 'suffix': ' s', 'siPrefix': True})
self.t1.setValue(sample_element_config.t1.value())
self.t1.setLimits((sample_element_config.minT1.value(), sample_element_config.maxT1.value()))
self.t2 = self.addChild({'name': 'T2', 'type': 'float', 'value': 5., 'step': 1, 'limits': (0, 100), 'suffix': ' s', 'siPrefix': True})
self.t2.setValue(sample_element_config.t2.value())
self.t2.setLimits((sample_element_config.minT2.value(), sample_element_config.maxT2.value()))
# Density of spins
self.rho = self.addChild({'name': 'ρ', 'type': 'float', 'value': 1, 'step': 0.01, 'limits': (0, 100)})
self.rho.setValue(sample_element_config.rho.value())
self.rho.setLimits((sample_element_config.minRho.value(), sample_element_config.maxRho.value()))
[docs]class Nucleus(pt.parameterTypes.GroupParameter):
"""Class that represents the parameters in the nucleus."""
def __init__(self, **opts):
opts['name'] = 'Nucleus'
opts['type'] = 'bool'
opts['value'] = True
pt.parameterTypes.GroupParameter.__init__(self, **opts)
self.nucleus = self.addChild({'name': 'Nucleus', 'type': 'list', 'values': ['H', 'C', 'N', 'O'], 'value': 'H'})
self.gamma = self.addChild({'name': 'Gamma', 'type': 'float', 'value': 26752.219, 'suffix': 'rad/(G.s)', 'siPrefix': True, 'readonly': True})
self.updateGamma()
[docs] def updateGamma(self):
"""Update the value for gamma if the nucleus is changed"""
if self.nucleus.value() == 'H':
self.gamma.setValue(26752.219)
elif self.nucleus.value() == 'C':
self.gamma.setValue(6726.150)
elif self.nucleus.value() == 'N':
self.gamma.setValue(1933.336)
elif self.nucleus.value() == 'O':
self.gamma.setValue(-3626.655)