def test_add_CrystalFieldSite(self):
        cfms = CrystalField.CrystalFieldMultiSite(Ions=['Pr'],
                                                  Symmetries=['C2v'],
                                                  Temperatures=[44, 50],
                                                  FWHM=[1.1, 0.9],
                                                  B20=0.37737,
                                                  B22=3.9770,
                                                  B40=-0.031787,
                                                  B42=-0.11611,
                                                  B44=-0.15)

        params = {
            'B20': 0.37737,
            'B22': 3.9770,
            'B40': -0.031787,
            'B42': -0.11611,
            'B44': -0.12544
        }
        cf = CrystalField.CrystalField('Ce', 'C2v', **params)
        cf = cf * 8
        cf2 = cfms + cf
        self.assertEqual(cf2['ion0.B20'], 0.37737)
        self.assertEqual(cf2['ion1.B20'], 0.37737)
        self.assertEqual(cf2['ion0.B44'], -0.15)
        self.assertEqual(cf2['ion1.B44'], -0.12544)
        self.assertEqual(len(cf2.Ions), 2)
        self.assertTrue('Ce' in cf2.Ions)
        self.assertTrue('Pr' in cf2.Ions)
        self.assertEqual(len(cf2.Symmetries), 2)
        s = str(cf2.function)
        ties = ','.join(re.findall(r'ties=\((.*?)\)', s))
        self.assertTrue(
            'ion0.IntensityScaling=0.125*ion1.IntensityScaling' in ties)
    def test_two_step_fit_multi_ion_and_spectra(self):
        params = {
            'B20': 0.37737,
            'B22': 3.9770,
            'B40': -0.031787,
            'B42': -0.11611,
            'B44': -0.12544,
            'Temperature': [44.0, 50.0],
            'FWHM': [1.1, 0.9]
        }
        cf1 = CrystalField.CrystalField('Ce', 'C2v', **params)
        cf2 = CrystalField.CrystalField('Pr', 'C2v', **params)
        cf = cf1 + cf2
        r = [0.0, 1.45, 2.4, 3.0, 3.85]
        ws1 = CrystalField.fitting.makeWorkspace(*cf.getSpectrum(0, r))
        ws2 = CrystalField.fitting.makeWorkspace(*cf.getSpectrum(1, r))

        params = {
            'ion0.B20': 0.37737,
            'ion0.B22': 3.9770,
            'ion0.B40': -0.031787,
            'ion0.B42': -0.11611,
            'ion0.B44': -0.12544,
            'ion1.B20': 0.37737,
            'ion1.B22': 3.9770,
            'ion1.B40': -0.031787,
            'ion1.B42': -0.11611,
            'ion1.B44': -0.12544
        }
        cf = CrystalField.CrystalFieldMultiSite(Ions=['Ce', 'Pr'],
                                                Symmetries=['C2v', 'C2v'],
                                                Temperatures=[44.0, 50.0],
                                                FWHM=[1.0, 1.0],
                                                ToleranceIntensity=6.0,
                                                ToleranceEnergy=1.0,
                                                FixAllPeaks=True,
                                                parameters=params)

        cf.fix('ion0.BmolX', 'ion0.BmolY', 'ion0.BmolZ', 'ion0.BextX',
               'ion0.BextY', 'ion0.BextZ', 'ion0.B40', 'ion0.B42', 'ion0.B44',
               'ion0.B60', 'ion0.B62', 'ion0.B64', 'ion0.B66',
               'ion0.IntensityScaling', 'ion1.BmolX', 'ion1.BmolY',
               'ion1.BmolZ', 'ion1.BextX', 'ion1.BextY', 'ion1.BextZ',
               'ion1.B40', 'ion1.B42', 'ion1.B44', 'ion1.B60', 'ion1.B62',
               'ion1.B64', 'ion1.B66', 'ion1.IntensityScaling',
               'sp0.IntensityScaling', 'sp1.IntensityScaling')

        chi2 = CalculateChiSquared(str(cf.function),
                                   InputWorkspace=ws1,
                                   InputWorkspace_1=ws2)[1]

        fit = CrystalField.CrystalFieldFit(Model=cf,
                                           InputWorkspace=[ws1, ws2],
                                           MaxIterations=10)
        fit.two_step_fit(OverwriteMaxIterations=[2, 2],
                         OverwriteMinimizers=['BFGS', 'BFGS'],
                         Iterations=2)

        self.assertGreater(cf.chi2, 0.0)
        self.assertLess(cf.chi2, chi2)
 def test_add_CrystalFieldMultiSite(self):
     cfms1 = CrystalField.CrystalFieldMultiSite(Ions=['Pm'],
                                                Symmetries=['D2'],
                                                Temperatures=[44, 50],
                                                FWHM=[1.1, 0.9],
                                                B20=0.37737,
                                                B40=-0.031787,
                                                B42=-0.11611,
                                                B44=-0.15)
     cfms2 = CrystalField.CrystalFieldMultiSite(Ions=['Ce', 'Pr'],
                                                Symmetries=['C2v', 'C2v'],
                                                Temperatures=[44, 50],
                                                FWHM=[1.1, 0.9],
                                                parameters={
                                                    'ion0.B20': 0.34,
                                                    'ion0.B22': 3.9770,
                                                    'ion1.B40': -0.03
                                                })
     cfms3 = cfms1 + cfms2
     self.assertEqual(len(cfms3.Ions), 3)
     self.assertEqual(len(cfms3.Symmetries), 3)
     self.assertEqual(cfms3['ion0.B20'], 0.37737)
     self.assertEqual(cfms3['ion1.B20'], 0.34)
     self.assertEqual(cfms3['ion1.B22'], 3.9770)
     self.assertEqual(cfms3['ion2.B40'], -0.03)
     s = str(cfms3.function)
     ties = ','.join(re.findall(r'ties=\((.*?)\)', s))
     self.assertTrue(
         'ion1.IntensityScaling=1.0*ion0.IntensityScaling' in ties
         or 'ion0.IntensityScaling=1.0*ion1.IntensityScaling' in ties)
     self.assertTrue(
         'ion0.IntensityScaling=1.0*ion2.IntensityScaling' in ties
         or 'ion2.IntensityScaling=1.0*ion0.IntensityScaling' in ties)
 def test_multi_ion_ties_and_fixes(self):
     params = {
         'B20': 0.37737,
         'B22': 3.9770,
         'B40': -0.031787,
         'B42': -0.11611,
         'B44': -0.12544,
         'Temperature': 44.0,
         'FWHM': 1.1
     }
     cf1 = CrystalField.CrystalField('Ce', 'C2v', **params)
     cf2 = CrystalField.CrystalField('Pr', 'C2v', **params)
     cf = cf1 + cf2
     self.assertTrue(
         cf.function.isFixed(cf.function.getParameterIndex("ion0.BmolX")))
     self.assertTrue(
         cf.function.isFixed(cf.function.getParameterIndex("ion0.B21")))
     self.assertTrue(
         cf.function.isFixed(cf.function.getParameterIndex("ion0.B43")))
     self.assertTrue(
         cf.function.isFixed(cf.function.getParameterIndex("ion0.IB65")))
     self.assertTrue(
         cf.function.isFixed(cf.function.getParameterIndex("ion1.BmolZ")))
     self.assertTrue(
         cf.function.isFixed(cf.function.getParameterIndex("ion1.B41")))
     self.assertTrue(
         cf.function.isFixed(cf.function.getParameterIndex("ion1.B66")))
     self.assertTrue(
         cf.function.isFixed(cf.function.getParameterIndex("ion1.IB62")))
Exemplo n.º 5
0
 def _setCompositeBackground(self, peak, background):
     self._background.peak = CrystalField.Function(self.function,
                                                   prefix='bg.f0.')
     self._background.background = CrystalField.Function(self.function,
                                                         prefix='bg.f1.')
     self.function.setAttributeValue('Background',
                                     '{0};{1}'.format(peak, background))
    def test_fit_multi_ion_single_spectrum(self):
        params = {
            'B20': 0.37737,
            'B22': 3.9770,
            'B40': -0.031787,
            'B42': -0.11611,
            'B44': -0.12544,
            'Temperature': 44.0,
            'FWHM': 1.1
        }
        cf1 = CrystalField.CrystalField('Ce', 'C2v', **params)
        cf2 = CrystalField.CrystalField('Pr', 'C2v', **params)
        cf = cf1 + cf2
        r = [0.0, 1.45, 2.4, 3.0, 3.85]
        x, y = cf.getSpectrum(r)
        ws = CrystalField.fitting.makeWorkspace(x, y)

        params = {
            'ion0.B20': 0.37737,
            'ion0.B22': 3.9770,
            'ion0.B40': -0.031787,
            'ion0.B42': -0.11611,
            'ion0.B44': -0.12544,
            'ion1.B20': 0.37737,
            'ion1.B22': 3.9770,
            'ion1.B40': -0.031787,
            'ion1.B42': -0.11611,
            'ion1.B44': -0.12544
        }
        cf = CrystalField.CrystalFieldMultiSite(Ions=['Ce', 'Pr'],
                                                Symmetries=['C2v', 'C2v'],
                                                Temperatures=[44.0],
                                                FWHM=[1.1],
                                                ToleranceIntensity=6.0,
                                                ToleranceEnergy=1.0,
                                                FixAllPeaks=True,
                                                parameters=params)

        cf.fix('ion0.BmolX', 'ion0.BmolY', 'ion0.BmolZ', 'ion0.BextX',
               'ion0.BextY', 'ion0.BextZ', 'ion0.B40', 'ion0.B42', 'ion0.B44',
               'ion0.B60', 'ion0.B62', 'ion0.B64', 'ion0.B66',
               'ion0.IntensityScaling', 'ion1.BmolX', 'ion1.BmolY',
               'ion1.BmolZ', 'ion1.BextX', 'ion1.BextY', 'ion1.BextZ',
               'ion1.B40', 'ion1.B42', 'ion1.B44', 'ion1.B60', 'ion1.B62',
               'ion1.B64', 'ion1.B66', 'ion1.IntensityScaling')

        chi2 = CalculateChiSquared(cf.makeSpectrumFunction(),
                                   InputWorkspace=ws)[1]

        fit = CrystalField.CrystalFieldFit(Model=cf,
                                           InputWorkspace=ws,
                                           MaxIterations=10)
        fit.fit()

        self.assertGreater(cf.chi2, 0.0)
        self.assertLess(cf.chi2, chi2)
    def test_get_spectrum_ws(self):
        cfms = CrystalField.CrystalFieldMultiSite(['Ce'], ['C2v'],
                                                  B20=0.035,
                                                  B40=-0.012,
                                                  B43=-0.027,
                                                  B60=-0.00012,
                                                  B63=0.0025,
                                                  B66=0.0068,
                                                  Temperatures=[4.0],
                                                  FWHM=[0.1],
                                                  ToleranceIntensity=0.001 *
                                                  c_mbsr)

        x = np.linspace(0.0, 2.0, 30)
        y = np.zeros_like(x)
        e = np.ones_like(x)
        ws = CreateWorkspace(x, y, e)
        x, y = cfms.getSpectrum(0, ws)
        y = y / c_mbsr
        self.assertAlmostEqual(y[0], 12.474955, 6)
        self.assertAlmostEqual(y[1], 4.300416, 6)
        self.assertAlmostEqual(y[2], 1.452309, 6)
        self.assertAlmostEqual(y[3], 0.692266, 6)
        self.assertAlmostEqual(y[4], 0.401079, 6)
        self.assertAlmostEqual(y[15], 0.050130, 6)
        self.assertAlmostEqual(y[16], 0.054428, 6)
        x, y = cfms.getSpectrum(ws)
        y = y / c_mbsr
        self.assertAlmostEqual(y[0], 12.474955, 6)
        self.assertAlmostEqual(y[1], 4.300416, 6)
        ws = CreateWorkspace(x, y, e, 2)
        x, y = cfms.getSpectrum(ws, 1)
        y = y / c_mbsr
        self.assertAlmostEqual(y[0], 0.050130, 6)
        self.assertAlmostEqual(y[1], 0.054428, 6)
    def test_get_spectrum_list_multi_ion_and_spectra(self):
        params = {
            'ion0.B20': 0.37737,
            'ion0.B22': 3.9770,
            'ion0.B40': -0.031787,
            'ion0.B42': -0.11611,
            'ion0.B44': -0.12544,
            'ion1.B20': 0.37737,
            'ion1.B22': 3.9770,
            'ion1.B40': -0.031787,
            'ion1.B42': -0.11611,
            'ion1.B44': -0.12544
        }
        cfms = CrystalField.CrystalFieldMultiSite(Ions=['Ce', 'Pr'],
                                                  Symmetries=['C2v', 'C2v'],
                                                  Temperatures=[44.0, 50.0],
                                                  FWHM=[1.1, 1.2],
                                                  parameters=params)
        r = [0.0, 1.45, 2.4, 3.0, 3.85]
        x, y = cfms.getSpectrum(0, r)
        y = y / c_mbsr
        expected_y = [3.904037, 0.744519, 0.274897, 0.175713, 0.106540]
        np.testing.assert_equal(x, r)
        testhelpers.assert_almost_equal(y, expected_y, 6)

        x, y = cfms.getSpectrum(1, r)
        y = y / c_mbsr
        expected_y = [3.704726, 0.785600, 0.296255, 0.190176, 0.115650]
        np.testing.assert_equal(x, r)
        testhelpers.assert_almost_equal(y, expected_y, 6)
Exemplo n.º 9
0
    def _setBackground(self, **kwargs):
        """
        Set background function(s).

        Can provide one argument or both. Each argument can be a string or FunctionWrapper object.
        Can also pass two functions as one argument by passing a single string or CompositeFunctionWrapper.

        Examples:
        setBackground(Gaussian())
        setBackground(background=LinearBackground())
        setBackground(peak='name=Gaussian,Height=1', background='name=LinearBackground')
        setBackground(Gaussian(), 'name=LinearBackground')
        setBackground(Gaussian() + LinearBackground())
        setBackground('name=Gaussian,Height=0,PeakCentre=1,Sigma=0;name=LinearBackground,A0=0,A1=0')

        @param peak: A function passed as the peak. Can be a string or FunctionWrapper e.g.
                'name=Gaussian,Height=0,PeakCentre=1,Sigma=0' or Gaussian(PeakCentre=1)
        @param background: A function passed as the background. Can be a string or FunctionWrapper e.g.
                'name=LinearBackground,A0=1' or LinearBackground(A0=1)
        """
        self._background = CrystalField.Function(self.function, prefix='bg.')
        if len(kwargs) == 2:
            self._setCompositeBackground(kwargs['peak'], kwargs['background'])
        elif len(kwargs) == 1:
            if 'peak' in kwargs.keys():
                self._setSingleBackground(kwargs['peak'], 'peak')
            elif 'background' in kwargs.keys():
                self._setSingleBackground(kwargs['background'], 'background')
            else:
                raise RuntimeError(
                    '_setBackground expects peak or background arguments only')
        else:
            raise RuntimeError(
                f'_setBackground takes 1 or 2 arguments, got {len(kwargs)}')
 def test_init_single_ion(self):
     cfms = CrystalField.CrystalFieldMultiSite(Ions='Pm',
                                               Symmetries='D2',
                                               Temperatures=[20, 52],
                                               FWHM=[1.0, 1.0])
     self.assertEqual(cfms.Ions, ['Pm'])
     self.assertEqual(cfms.Symmetries, ['D2'])
     self.assertEqual(cfms.Temperatures, [20, 52])
     self.assertEqual(cfms.FWHM, [1.0, 1.0])
 def test_init_multi_ions(self):
     cfms = CrystalField.CrystalFieldMultiSite(Ions=('Pm', 'Eu'),
                                               Symmetries=('D2', 'C3v'),
                                               Temperatures=[20, 52],
                                               FWHM=[1.0, 1.0])
     self.assertEqual(cfms.Ions, ['Pm', 'Eu'])
     self.assertEqual(cfms.Symmetries, ['D2', 'C3v'])
     self.assertEqual(cfms.Temperatures, [20, 52])
     self.assertEqual(cfms.FWHM, [1.0, 1.0])
 def test_init_parameters(self):
     cfms = CrystalField.CrystalFieldMultiSite(Ions='Ce',
                                               Symmetries='C2',
                                               Temperatures=[15],
                                               FWHM=[1.0],
                                               parameters={
                                                   'BmolX': 1.0,
                                                   'B40': -0.02
                                               })
     self.assertEqual(cfms.function.getParameterValue('BmolX'), 1.0)
     self.assertEqual(cfms.function.getParameterValue('B40'), -0.02)
 def test_peak_values(self):
     cfms = CrystalField.CrystalFieldMultiSite(Ions='Ce',
                                               Symmetries='C2',
                                               Temperatures=[25],
                                               FWHM=[1.5],
                                               BmolX=1.0,
                                               B40=-0.02)
     self.assertEqual(int(cfms.function.getParameterValue('pk0.Amplitude')),
                      48)
     self.assertEqual(cfms.function.getParameterValue('pk0.FWHM'), 1.5)
     self.assertEqual(cfms.function.getParameterValue('pk0.PeakCentre'), 0)
 def test_set_background_as_function(self):
     cf = CrystalField.CrystalFieldMultiSite(
         Ions='Ce',
         Symmetries='C2v',
         Temperatures=[20],
         FWHM=[1.0],
         Background=LinearBackground(A0=1))
     self.assertEqual('"name=LinearBackground,A0=1,A1=0"', cf['Background'])
     self.assertEqual(cf.background.param['A0'], 1)
     self.assertEqual(cf.background.background.param['A0'], 1)
     cf.background.param['A0'] = 0
     self.assertEqual(cf.background.background.param['A0'], 0)
Exemplo n.º 15
0
 def calc_xmin_xmax(self, i=0):
     peaks = np.array([])
     for idx in range(len(self.Ions)):
         blm = {}
         for bparam in CrystalField.CrystalField.field_parameter_names:
             blm[bparam] = self.function.getParameterValue(f'ion{idx}.' +
                                                           bparam)
         _cft = CrystalField.CrystalField(self.Ions[idx],
                                          'C1',
                                          Temperature=self.Temperatures[i],
                                          **blm)
         peaks = np.append(peaks, _cft.getPeakList()[0])
     return np.min(peaks), np.max(peaks)
 def test_set_background_peak_only(self):
     cf = CrystalField.CrystalFieldMultiSite(
         Ions='Ce',
         Symmetries='C2v',
         Temperatures=[20],
         FWHM=[1.0],
         BackgroundPeak=Gaussian(Sigma=1))
     self.assertEqual('"name=Gaussian,Height=0,PeakCentre=0,Sigma=1"',
                      cf['Background'])
     self.assertEqual(cf.background.peak.param['Sigma'], 1)
     self.assertEqual(cf.background.param['Sigma'], 1)
     cf.background.peak.param['Sigma'] = 0
     self.assertEqual(cf.background.param['Sigma'], 0)
 def test_init_parameters_multi_ions(self):
     cfms = CrystalField.CrystalFieldMultiSite(Ions=('Pm', 'Eu'),
                                               Symmetries=('D2', 'C3v'),
                                               Temperatures=[20, 52],
                                               FWHM=[1.0, 1.0],
                                               parameters={
                                                   'ion0.B40': -0.02,
                                                   'ion0.B42': -0.11,
                                                   'ion1.B42': -0.12
                                               })
     self.assertEqual(cfms.function.getParameterValue('ion0.B42'), -0.11)
     self.assertEqual(cfms.function.getParameterValue('ion0.B40'), -0.02)
     self.assertEqual(cfms.function.getParameterValue('ion1.B42'), -0.12)
 def test_peak_values_gaussian(self):
     cfms = CrystalField.CrystalFieldMultiSite(Ions='Ce',
                                               Symmetries='C2',
                                               Temperatures=[25],
                                               FWHM=[1.0],
                                               PeakShape='Gaussian',
                                               BmolX=1.0,
                                               B40=-0.02)
     self.assertEqual(int(cfms.function.getParameterValue('pk0.Height')),
                      45)
     self.assertAlmostEqual(cfms.function.getParameterValue('pk0.Sigma'),
                            0.42, 2)
     self.assertEqual(cfms.function.getParameterValue('pk0.PeakCentre'), 0)
Exemplo n.º 19
0
 def _setBackgroundUsingString(self, background, property_name):
     number_of_functions = background.count(';') + 1
     if number_of_functions == 2:
         peak, background = background.split(';')
         self._setCompositeBackground(peak, background)
     elif number_of_functions == 1:
         setattr(self._background, property_name,
                 CrystalField.Function(self.function, prefix='bg.'))
         self.function.setAttributeValue('Background', background)
     else:
         raise ValueError(
             f"string passed to background must have exactly 1 or 2 functions, got "
             f"{number_of_functions}")
 def test_set_background_composite(self):
     cf = CrystalField.CrystalFieldMultiSite(
         Ions='Ce',
         Symmetries='C2v',
         Temperatures=[20],
         FWHM=[1.0],
         Background=Gaussian(PeakCentre=1) + LinearBackground())
     self.assertEqual(
         '"name=Gaussian,Height=0,PeakCentre=1,Sigma=0;name=LinearBackground,A0=0,A1=0"',
         cf['Background'])
     cf.background.param['f1.A0'] = 1
     cf.background.param['f0.PeakCentre'] = 0.5
     self.assertEqual(cf.background.param['f1.A0'], 1)
     self.assertEqual(cf.background.param['f0.PeakCentre'], 0.5)
    def test_constraints_multi_spectrum_and_ion(self):
        cf = CrystalField.CrystalFieldMultiSite(Ions=['Ce', 'Pr'],
                                                Symmetries=['C2v', 'C2v'],
                                                Temperatures=[44, 50],
                                                FWHM=[1.1, 0.9],
                                                Background=FlatBackground(),
                                                BackgroundPeak=Gaussian(
                                                    Height=10, Sigma=0.3),
                                                parameters={
                                                    'ion0.B20': 0.37737,
                                                    'ion0.B22': 3.9770,
                                                    'ion1.B40': -0.031787,
                                                    'ion1.B42': -0.11611,
                                                    'ion1.B44': -0.12544
                                                })

        cf.constraints('sp0.IntensityScaling > 0',
                       '0 < sp1.IntensityScaling < 2', 'ion0.B22 < 4')

        cf.ties({'sp0.bg.f0.Height': 10.1})
        cf.constraints('sp0.bg.f0.Sigma > 0.1')
        cf.ties({'sp1.bg.f0.Height': 20.2})
        cf.constraints('sp1.bg.f0.Sigma > 0.2')

        cf.ties({
            'ion0.sp1.pk2.FWHM': '2*ion0.sp1.pk1.FWHM',
            'ion1.sp1.pk3.FWHM': '2*ion1.sp1.pk2.FWHM'
        })
        cf.constraints('ion0.sp0.pk1.FWHM < 2.2')
        cf.constraints('ion0.sp1.pk1.FWHM > 1.1',
                       '1 < ion0.sp1.pk4.FWHM < 2.2')

        s = str(cf.function)
        ties = ','.join(re.findall(r'ties=\((.*?)\)', s))
        constraints = ','.join(re.findall(r'constraints=\((.*?)\)', s))
        self.assertTrue('0<sp0.IntensityScaling' in constraints)
        self.assertTrue('sp1.IntensityScaling<2' in constraints)
        self.assertTrue('sp0.bg.f0.Height=10.1' in ties)
        self.assertTrue('sp1.bg.f0.Height=20.2' in ties)
        self.assertTrue('0.1<sp0.bg.f0.Sigma' in constraints)
        self.assertTrue('0.2<sp1.bg.f0.Sigma' in constraints)
        self.assertTrue('ion0.sp0.pk1.FWHM<2.2' in constraints)
        self.assertTrue('1.1<ion0.sp1.pk1.FWHM' in constraints)
        self.assertTrue('1<ion0.sp1.pk4.FWHM<2.2' in constraints)
        self.assertTrue('ion0.sp1.pk2.FWHM=2*ion0.sp1.pk1.FWHM' in ties)
        self.assertTrue('ion1.sp1.pk3.FWHM=2*ion1.sp1.pk2.FWHM' in ties)
Exemplo n.º 22
0
 def _setSingleBackground(self, background, property_name):
     if isinstance(background, str):
         self._setBackgroundUsingString(background, property_name)
     elif isinstance(background, CompositeFunctionWrapper):
         if len(background) == 2:
             peak, background = str(background).split(';')
             self._setCompositeBackground(peak, background)
         else:
             raise ValueError(
                 f"composite function passed to background must have "
                 f"exactly 2 functions, got {len(background)}")
     elif isinstance(background, FunctionWrapper):
         setattr(self._background, property_name,
                 CrystalField.Function(self.function, prefix='bg.'))
         self.function.setAttributeValue('Background', str(background))
     else:
         raise TypeError(
             "background argument(s) must be string or function object(s)")
 def test_set_background_with_peak(self):
     cf = CrystalField.CrystalFieldMultiSite(
         Ions='Ce',
         Symmetries='C2v',
         Temperatures=[20],
         FWHM=[1.0],
         Background='name=LinearBackground',
         BackgroundPeak=Gaussian(Height=1))
     self.assertEqual(
         '"name=Gaussian,Height=1,PeakCentre=0,Sigma=0;name=LinearBackground"',
         cf['Background'])
     self.assertEqual(cf.background.peak.param['Height'], 1)
     self.assertEqual(cf.background.param['f0.Height'], 1)
     self.assertEqual(cf.background.background.param['A0'], 0)
     cf.background.peak.param['Height'] = 0
     cf.background.background.param['A0'] = 1
     self.assertEqual(cf.background.peak.param['Height'], 0)
     self.assertEqual(cf.background.background.param['A0'], 1)
 def test_get_spectrum_from_list(self):
     cfms = CrystalField.CrystalFieldMultiSite(Ions=['Ce'],
                                               Symmetries=['C2v'],
                                               Temperatures=[4.0],
                                               FWHM=[0.1],
                                               B20=0.035,
                                               B40=-0.012,
                                               B43=-0.027,
                                               B60=-0.00012,
                                               B63=0.0025,
                                               B66=0.0068,
                                               ToleranceIntensity=0.001 *
                                               c_mbsr)
     r = [0.0, 1.45, 2.4, 3.0, 3.85]
     x, y = cfms.getSpectrum(r)
     y = y / c_mbsr
     expected_y = [12.474955, 1.190169, 0.122781, 0.042940, 10.837438]
     np.testing.assert_equal(x, r)
     testhelpers.assert_almost_equal(y, expected_y, 6)
Exemplo n.º 25
0
 def ResolutionModel(self, value):
     if hasattr(value, 'model'):
         self._resolutionModel = value
     else:
         self._resolutionModel = CrystalField.ResolutionModel(value)
     nSpec = len(self.Temperatures)
     if nSpec > 1:
         if not self._resolutionModel.multi or self._resolutionModel.NumberOfSpectra != nSpec:
             raise RuntimeError(
                 'Resolution model is expected to have %s functions, found %s'
                 % (nSpec, self._resolutionModel.NumberOfSpectra))
         for i in range(nSpec):
             model = self._resolutionModel.model[i]
             self.function.setAttributeValue('sp%i.FWHMX' % i, model[0])
             self.function.setAttributeValue('sp%i.FWHMY' % i, model[1])
     else:
         model = self._resolutionModel.model
         self.function.setAttributeValue('FWHMX', model[0])
         self.function.setAttributeValue('FWHMY', model[1])
 def test_peak_values_multi_ions(self):
     cfms = CrystalField.CrystalFieldMultiSite(Ions=('Pr', 'Nd'),
                                               Symmetries=('D2', 'C3v'),
                                               Temperatures=[20],
                                               FWHM=[1.5],
                                               parameters={
                                                   'ion0.B60': -0.02,
                                                   'ion1.B62': -0.12
                                               })
     self.assertEqual(
         int(cfms.function.getParameterValue('ion0.pk0.Amplitude')), 278)
     self.assertEqual(cfms.function.getParameterValue('ion0.pk0.FWHM'), 1.5)
     self.assertEqual(
         cfms.function.getParameterValue('ion0.pk1.PeakCentre'), 982.8)
     self.assertEqual(
         int(cfms.function.getParameterValue('ion1.pk0.Amplitude')), 234)
     self.assertEqual(cfms.function.getParameterValue('ion1.pk0.FWHM'), 1.5)
     self.assertAlmostEqual(
         cfms.function.getParameterValue('ion1.pk1.PeakCentre'),
         1749.981919, 6)
    def test_constraints_single_spectrum(self):
        cf = CrystalField.CrystalFieldMultiSite(
            Ions=['Ce'],
            Symmetries=['C2v'],
            Temperatures=[50],
            FWHM=[0.9],
            B20=0.37737,
            B22=3.9770,
            B40=-0.031787,
            B42=-0.11611,
            B44=-0.12544,
            Background=LinearBackground(A0=1.0),
            BackgroundPeak=Gaussian(Height=10, Sigma=0.3))

        cf.ties(B40='B20/2')
        cf.constraints('IntensityScaling > 0', 'B22 < 4')
        cf.constraints('pk0.FWHM < 2.2', 'pk1.FWHM >= 0.1')
        cf.ties({'pk2.FWHM': '2*pk1.FWHM', 'pk3.FWHM': '2*pk2.FWHM'})
        cf.background.peak.ties(Height=10.1)
        cf.background.peak.constraints('Sigma > 0')
        cf.background.background.ties(A0=0.1)
        cf.background.background.constraints('A1 > 0')

        s = cf.makeSpectrumFunction()
        ties = ','.join(re.findall(r'ties=\((.*?)\)', s))
        constraints = ','.join(re.findall(r'constraints=\((.*?)\)', s))
        self.assertTrue('0<IntensityScaling' in constraints)
        self.assertTrue('B22<4' in constraints)
        self.assertTrue('0<bg.f0.Sigma' in constraints)
        self.assertTrue('0<bg.f1.A1' in constraints)
        self.assertTrue('Height=10.1' in ties)
        self.assertTrue('A0=0.1' in ties)
        self.assertTrue('pk0.FWHM<2.2' in constraints)
        self.assertTrue('0.1<pk1.FWHM' in constraints)
        self.assertTrue('pk2.FWHM=2*pk1.FWHM' in ties)
        self.assertTrue('pk3.FWHM=2*pk2.FWHM' in ties)

        # Test that ties and constraints are correctly defined
        fun = FunctionFactory.createInitialized(s)
        self.assertNotEqual(fun, None)
    def test_get_spectrum_ws_multi_spectra(self):
        cfms = CrystalField.CrystalFieldMultiSite(['Ce'], ['C2v'],
                                                  B20=0.035,
                                                  B40=-0.012,
                                                  B43=-0.027,
                                                  B60=-0.00012,
                                                  B63=0.0025,
                                                  B66=0.0068,
                                                  Temperatures=[4.0, 50.0],
                                                  FWHM=[0.1, 0.2])

        x = np.linspace(0.0, 2.0, 30)
        y = np.zeros_like(x)
        e = np.ones_like(x)
        ws = CreateWorkspace(x, y, e)
        x, y = cfms.getSpectrum(0, ws)
        y = y / c_mbsr
        self.assertAlmostEqual(y[0], 12.474945990071641, 6)
        self.assertAlmostEqual(y[1], 4.3004130214544389, 6)
        self.assertAlmostEqual(y[2], 1.4523079303712476, 6)
        self.assertAlmostEqual(y[3], 0.6922657279528992, 6)
        self.assertAlmostEqual(y[4], 0.40107924259746491, 6)
        self.assertAlmostEqual(y[15], 0.050129858433581413, 6)
        self.assertAlmostEqual(y[16], 0.054427788297191478, 6)
        x, y = cfms.getSpectrum(1, ws)
        y = y / c_mbsr
        self.assertAlmostEqual(y[0], 6.3046623789675627, 6)
        self.assertAlmostEqual(y[1], 4.2753024205094912, 6)
        self.assertAlmostEqual(y[2], 2.1778204115683644, 6)
        self.assertAlmostEqual(y[3], 1.2011173460849718, 6)
        self.assertAlmostEqual(y[4], 0.74036730921135963, 6)
        x, y = cfms.getSpectrum(ws)
        y = y / c_mbsr
        self.assertAlmostEqual(y[0], 12.474945990071641, 6)
        self.assertAlmostEqual(y[1], 4.3004130214544389, 6)
        ws = CreateWorkspace(x, y, e, 2)
        x, y = cfms.getSpectrum(ws, 1)
        y = y / c_mbsr
        self.assertAlmostEqual(y[0], 0.050129858433581413, 6)
        self.assertAlmostEqual(y[1], 0.054427788297191478, 6)
    def test_get_spectrum_from_list_multi_spectra(self):
        cfms = CrystalField.CrystalFieldMultiSite(Ions=['Ce'],
                                                  Symmetries=['C2v'],
                                                  Temperatures=[4.0, 50.0],
                                                  FWHM=[0.1, 0.2],
                                                  B20=0.035,
                                                  B40=-0.012,
                                                  B43=-0.027,
                                                  B60=-0.00012,
                                                  B63=0.0025,
                                                  B66=0.0068)
        r = [0.0, 1.45, 2.4, 3.0, 3.85]
        x, y = cfms.getSpectrum(0, r)
        y = y / c_mbsr
        expected_y = [12.474946, 1.190160, 0.122785, 0.042940, 10.837170]
        np.testing.assert_equal(x, r)
        testhelpers.assert_almost_equal(y, expected_y, 6)

        x, y = cfms.getSpectrum(1, r)
        y = y / c_mbsr
        expected_y = [6.304662, 0.331218, 1.224681, 0.078540, 2.638049]
        np.testing.assert_equal(x, r)
        testhelpers.assert_almost_equal(y, expected_y, 6)
 def test_peak_values_multi_gaussian(self):
     cfms = CrystalField.CrystalFieldMultiSite(Ions=('Pm', 'Dy'),
                                               Symmetries=('D2', 'C3v'),
                                               Temperatures=[20, 52],
                                               FWHM=[1.0, 1.5],
                                               parameters={
                                                   'ion0.B40': -0.02,
                                                   'ion1.B42': -0.12
                                               },
                                               PeakShape='Gaussian')
     self.assertEqual(
         int(cfms.function.getParameterValue('ion0.sp0.pk0.Height')), 289)
     self.assertAlmostEqual(
         cfms.function.getParameterValue('ion0.sp1.pk0.Sigma'), 0.64, 2)
     self.assertEqual(
         cfms.function.getParameterValue('ion0.sp0.pk1.PeakCentre'), 0)
     self.assertEqual(
         int(cfms.function.getParameterValue('ion1.sp1.pk0.Height')), 1642)
     self.assertAlmostEqual(
         cfms.function.getParameterValue('ion1.sp1.pk0.Sigma'), 0.64, 2)
     self.assertAlmostEqual(
         cfms.function.getParameterValue('ion1.sp0.pk1.PeakCentre'),
         40.957515, 6)