Commit f48a510e authored by Heller, William T.'s avatar Heller, William T.
Browse files

Replace test_custom_lorentz3.yaml

parent 88d9e213
Loading
Loading
Loading
Loading
+40 −93
Original line number Diff line number Diff line
import numpy as np
from numpy import inf, power
file: 
    name: 29983_merged.txt
    qmin: 0.01
    qmax: 0.30
    
output_files: test_custom

sa_parameters: 
    temperatures: 100
    temperature_rate: 0.90
    parameter_rate: 0.95
    iterations: 1000
    models_to_generate: 3

model:
    name: custom_lorentz3.py
    category: shape-independent
    scale:
        fixed: [1.00]
    background: 
        linear: [0.000, 0.10]
    scale_1: 
        linear: [10.0, 100.0]
    length_1: 
        linear: [500.0, 1500.0]
    exponent_1: 
        linear: [2.5, 3.5] 
    scale_2: 
        linear: [1.0, 10.0]
    length_2: 
        linear: [50.0, 150.0]
    exponent_2: 
        linear: [1.5, 2.5] 
    scale_3: 
        linear: [0.1, 1.0]
    length_3: 
        linear: [5.0, 15.0]
    exponent_3: 
        linear: [0.5, 1.5] 
    
name = "lorentzian3"
title = "This model calculates an empirical functional form for SAS data \
characterized by three Lorentzian-type functions."
description = """I(q) = scale_1/(1.0 + pow((q*length_1),exponent_1))
             + scale_2/(1.0 + pow((q*length_2),exponent_2) )
             + scale_3/(1.0 + pow((q*length_3),exponent_3) )+ background
             scale_1    = Lorentzian term scaling #1
             length_1   = Lorentzian screening length #1 [A]
             exponent_1 = Lorentzian exponent #1
             scale_2    = Lorentzian term scaling #2
             length_2   = Lorentzian screening length #2 [A]
             exponent_2 = Lorentzian exponent #2
             scale_3    = Lorentzian term scaling #3
             length_3   = Lorentzian screening length #3 [A]
             exponent_3 = Lorentzian exponent #3
             background = Incoherent background
        """
category = "shape-independent"

# pylint: disable=bad-whitespace, line-too-long
#            ["name", "units", default, [lower, upper], "type", "description"],
parameters = [["lorentz_scale_1",  "",     100.0, [-inf, inf], "", "First power law scale factor"],
              ["lorentz_length_1", "Ang", 1000.0, [-inf, inf], "", "First Lorentzian screening length"],
              ["lorentz_exp_1",    "",      3.0, [-inf, inf], "", "First exponent of power law"],
              ["lorentz_scale_2",  "",      10.0, [-inf, inf], "", "Second scale factor for broad Lorentzian peak"],
              ["lorentz_length_2", "Ang",  100.0, [-inf, inf], "", "Second Lorentzian screening length"],
              ["lorentz_exp_2",    "",      2.0, [-inf, inf], "", "Second exponent of power law"],
              ["lorentz_scale_3",  "",      1.0, [-inf, inf], "", "Third scale factor for broad Lorentzian peak"],
              ["lorentz_length_3", "Ang",  10.0, [-inf, inf], "", "Third Lorentzian screening length"],
              ["lorentz_exp_3",    "",      1.0, [-inf, inf], "", "Third exponent of power law"],
             ]
# pylint: enable=bad-whitespace, line-too-long


def Iq(q,
       lorentz_scale_1=100.0,
       lorentz_length_1=1000.0,
       lorentz_exp_1=3.0,
       lorentz_scale_2=10.0,
       lorentz_length_2=100.0,
       lorentz_exp_2=2.0)
       lorentz_scale_2=1.0,
       lorentz_length_2=10.0,
       lorentz_exp_2=1.0):

    """
    :param q:                   Input q-value (float or [float, float])
    :param lorentz_scale_1:     Second scale factor for broad Lorentzian peak
    :param lorentz_length_1:    First Lorentzian screening length
    :param lorentz_exp_1:       Exponent of the first Lorentz function
    :param lorentz_scale_2:     Second scale factor for broad Lorentzian peak
    :param lorentz_length_2:    Second Lorentzian screening length
    :param lorentz_exp_2:       Exponent of the second Lorentz function
    :param lorentz_scale_3:     Third scale factor for broad Lorentzian peak
    :param lorentz_length_3:    Third Lorentzian screening length
    :param lorentz_exp_3:       Exponent of the Third Lorentz function
    :return:                    Calculated intensity
    """
# pylint: disable=bad-whitespace
    intensity  = lorentz_scale_1/(1.0 +
                                  power(q*lorentz_length_1, lorentz_exp_1))
    intensity += lorentz_scale_2/(1.0 +
                                  power(q*lorentz_length_2, lorentz_exp_2))
    intensity += lorentz_scale_3/(1.0 +
                                  power(q*lorentz_length_3, lorentz_exp_3))
# pylint: enable=bad-whitespace
    return intensity

Iq.vectorized = True  # Iq accepts an array of q values

def random():
    """Return a random parameter set for the model."""
    scale = 10**np.random.uniform(0, 4, 3)
    length = 10**np.random.uniform(1, 4, 3)
    expon = np.random.uniform(1, 6, 3)

    pars = dict(
        #background=0,
        scale=1, # scale provided in model
        lorentz_scale_1=scale[0],
        lorentz_length_1=length[0],
        lorentz_exp_1=expon[0],
        lorentz_scale_2=scale[1],
        lorentz_length_2=length[1],
        lorentz_exp_2=expon[1],
        lorentz_scale_3=scale[2],
        lorentz_length_3=length[2],
        lorentz_exp_3=expon[2],
    )
    return pars