# -*- coding: utf-8 -*-
# models/cylinders.py
from __future__ import absolute_import
import numpy, scipy, scipy.special
from numpy import pi, zeros, sin, cos, sqrt, newaxis
from utils.parameter import FitParameter, Parameter
from bases.model import SASModel
from utils.units import Length, Angle
# parameters must not be inf
[docs]class CylindersIsotropic(SASModel):
r"""Form factor of cylinders
which are radially isotropic (so not spherically isotropic!)
!!!completed but not verified!!!
"""
shortName = "Cylinders defined by aspect ratio"
parameters = (
FitParameter("radius", Length("nm").toSi(1.), unit = Length("nm"),
displayName = "Cylinder radius",
valueRange = (0., numpy.inf),
activeRange = Length("nm").toSi((0.1, 1e3)),
suffix = "nm"),
FitParameter("aspect", 10.0,
displayName = "Aspect ratio L/(2R) of the cylinder",
valueRange = (0., numpy.inf),
activeRange = (1.0, 20),
suffix = "-"),
FitParameter("psiAngle", Angle(u"°").toSi(10.), unit = Angle(u"°"),
displayName = "in-plane cylinder rotation",
valueRange = (0., Angle(u"°").toSi(180.))),
FitParameter("psiAngleDivisions", 303.,
displayName = "in-plane angle divisions",
valueRange = (0, numpy.inf), suffix = "-"),
)
def __init__(self):
super(CylindersIsotropic, self).__init__()
# some presets of parameters to fit
self.radius.setActive(True)
self.aspect.setActive(False) # not expected to vary
self.psiAngle.setActive(True) # better when random
self.psiAngleDivisions.setActive(False) # not expected to vary
[docs] def volume(self):
v = pi * self.radius()**2 * (2. * self.radius() * self.aspect())
return v
CylindersIsotropic.factory()
#if __name__ == "__main__":
# from bases.datafile import PDHFile, AsciiFile
# # FIXME: use SASData.load() instead
# pf = PDHFile("sasfit_gauss2-1-100-1-1.dat")
# model = CylindersIsotropic()
# model.radius.setValue(1.)
# model.radius.setActive(False)
# model.aspect.setValue(100.)
# model.aspect.setActive(False)
# model.psiAngle.setValue(1.)
# model.psiAngle.setActive(False)
# model.psiAngleDivisions.setValue(303)
# model.psiAngleDivisions.setActive(False)
# intensity = model.formfactor(pf.data, None).reshape(-1)
# q = pf.data[:, 0]
# oldInt = pf.data[:, 1]
# delta = abs(oldInt - intensity)
# result = numpy.dstack((q, intensity, delta))[0]
# AsciiFile.writeFile("CylindersIsotropic.dat", result)
# # call it like this:
# # PYTHONPATH=..:../mcsas/ python brianpauwgui/gaussianchain.py && gnuplot -p -e 'set logscale xy; plot "gauss.dat" using 1:2:3 with errorbars'
# vim: set ts=4 sts=4 sw=4 tw=0: