def __call__(self, npts = 101): """ Perform test and produce output file @param npts: number of points to average over @return: True if the test passed, otherwise False """ passed = True model = EllipticalCylinderModel() theta_label = 'cyl_theta' if not model.params.has_key(theta_label): theta_label = 'axis_theta' phi_label = 'cyl_phi' if not model.params.has_key(phi_label): phi_label = 'axis_phi' output_f = open("average_func.txt",'w') output_f.write("<q_average> <2d_average> <1d_average>\n") for i_q in range(1, 15): q = 0.3/15.0*i_q value = self.average_point_3D(model, q, npts) ana = model.run(q) if q<0.3 and (value-ana)/ana>0.05: passed = False output_f.write("%10g %10g %10g\n" % (q, value, ana)) if self.verbose: print "Q=%g: %10g %10g %10g %10g" % (q, value, ana, value-ana, value/ana) output_f.close() return passed
def setUp(self): from sas.models.EllipticalCylinderModel import EllipticalCylinderModel self.model= EllipticalCylinderModel() self.model.setParam('scale', 1.0) self.model.setParam('r_minor', 20.0) self.model.setParam('r_ratio', 1.5) self.model.setParam('length', 400.0) self.model.setParam('sldCyl', 4.0e-6) self.model.setParam('sldSolv', 1.0e-6) self.model.setParam('background', 0.0) self.model.setParam('cyl_theta', 90) self.model.setParam('cyl_phi', 0.0) self.model.setParam('cyl_psi', 0.0)
class TestEllipticalCylinder(unittest.TestCase): """ Unit tests for calculate_ER (EllipticalCylindermodel) """ def setUp(self): from sas.models.EllipticalCylinderModel import EllipticalCylinderModel from sas.models.DiamCylFunc import DiamCylFunc self.comp = EllipticalCylinderModel() self.diam = DiamCylFunc() def test(self): """ Test 1D model for a EllipticalCylinder """ self.comp.setParam("r_minor", 20) self.comp.setParam("r_ratio",1.5) self.comp.setParam("length",400) r_value = math.sqrt(20*20*1.5) self.diam.setParam("radius", r_value) self.diam.setParam("length",400) self.assertAlmostEqual(self.comp.calculate_ER(), self.diam.run(0.1)/2)
class TestEllipticalCylinder(unittest.TestCase): """ Unit tests for calculate_ER (EllipticalCylindermodel) """ def setUp(self): from sas.models.EllipticalCylinderModel import EllipticalCylinderModel from sas.models.DiamCylFunc import DiamCylFunc self.comp = EllipticalCylinderModel() self.diam = DiamCylFunc() def test(self): """ Test 1D model for a EllipticalCylinder """ self.comp.setParam("r_minor", 20) self.comp.setParam("r_ratio", 1.5) self.comp.setParam("length", 400) r_value = math.sqrt(20 * 20 * 1.5) self.diam.setParam("radius", r_value) self.diam.setParam("length", 400) self.assertAlmostEqual(self.comp.calculate_ER(), self.diam.run(0.1) / 2)
def setUp(self): from sas.models.EllipticalCylinderModel import EllipticalCylinderModel from sas.models.DiamCylFunc import DiamCylFunc self.comp = EllipticalCylinderModel() self.diam = DiamCylFunc()
class TestEllipticalCylinder(unittest.TestCase): """ Testing C++ Cylinder model """ def setUp(self): from sas.models.EllipticalCylinderModel import EllipticalCylinderModel self.model= EllipticalCylinderModel() self.model.setParam('scale', 1.0) self.model.setParam('r_minor', 20.0) self.model.setParam('r_ratio', 1.5) self.model.setParam('length', 400.0) self.model.setParam('sldCyl', 4.0e-6) self.model.setParam('sldSolv', 1.0e-6) self.model.setParam('background', 0.0) self.model.setParam('cyl_theta', 90) self.model.setParam('cyl_phi', 0.0) self.model.setParam('cyl_psi', 0.0) def test_simple(self): """ Test simple 1D and 2D values Numbers taken from model that passed validation, before the update to C++ underlying class. """ self.assertAlmostEqual(self.model.run(0.001), 675.50440232504991, 3) self.assertAlmostEqual(self.model.runXY([0.001,0.001]), 669.5173937622792, 0) def test_dispersion(self): """ Test with dispersion """ from sas.models.DisperseModel import DisperseModel disp = DisperseModel(self.model, ['r_minor', 'r_ratio', 'length'], [5, 0.25, 50]) disp.setParam('n_pts', 10) self.assertAlmostEqual(disp.run(0.001), 711.18048194151925, 3) self.assertAlmostEqual(disp.runXY([0.001,0.001]), 704.63525988095705, 0) def test_new_disp(self): from sas.models.dispersion_models import GaussianDispersion disp_rm = GaussianDispersion() self.model.set_dispersion('r_minor', disp_rm) self.model.dispersion['r_minor']['width'] = 0.25 self.model.dispersion['r_minor']['npts'] = 10 self.model.dispersion['r_minor']['nsigmas'] = 2 disp_rr = GaussianDispersion() self.model.set_dispersion('r_ratio', disp_rr) self.model.dispersion['r_ratio']['width'] = 0.25/1.5 self.model.dispersion['r_ratio']['npts'] = 10 self.model.dispersion['r_ratio']['nsigmas'] = 2 disp_len = GaussianDispersion() self.model.set_dispersion('length', disp_len) self.model.dispersion['length']['width'] = 50.0/400 self.model.dispersion['length']['npts'] = 10 self.model.dispersion['length']['nsigmas'] = 2 self.assertAlmostEqual(self.model.run(0.001), 1.23925910*711.18048194151925, 3) self.assertAlmostEqual(self.model.runXY([0.001,0.001]), 1.238955*704.63525988095705, 0) def test_array(self): """ Perform complete rotational average and compare to 1D """ from sas.models.dispersion_models import ArrayDispersion disp_ph = ArrayDispersion() disp_th = ArrayDispersion() disp_ps = ArrayDispersion() values_ph = numpy.zeros(100) values_th = numpy.zeros(100) values_ps = numpy.zeros(100) weights = numpy.zeros(100) for i in range(100): values_ps[i]=(360/99.0*i) values_ph[i]=(360/99.0*i) values_th[i]=(180/99.0*i) weights[i]=(1.0) disp_ph.set_weights(values_ph, weights) disp_th.set_weights(values_th, weights) disp_ps.set_weights(values_ps, weights) self.model.set_dispersion('cyl_theta', disp_th) self.model.set_dispersion('cyl_phi', disp_ph) self.model.set_dispersion('cyl_psi', disp_ps) val_1d = self.model.run(math.sqrt(0.0002)) val_2d = self.model.runXY([0.01,0.01]) self.assertTrue(math.fabs(val_1d-val_2d)/val_1d < 0.02)
def checkCylinder2D(self, phi): """ Check that the 2D scattering intensity reduces to a cylinder when r_ratio = 1.0 @param phi: angle of the vector q on the detector @return: True if the test passed, otherwise False """ from sas.models.CylinderModel import CylinderModel cyl = CylinderModel() cyl.setParam("cyl_theta", 90) cyl.setParam("cyl_phi", 0.0) cyl.setParam("radius", 20) cyl.setParam("length", 400) cyl.setParam("sldCyl", 2.0e-6) cyl.setParam("sldSolv", 1.0e-6) ell = EllipticalCylinderModel() ell.setParam("r_ratio", 1.0) ell.setParam("r_minor", 20) ell.setParam("cyl_theta", 90) ell.setParam("cyl_phi", 0.0) ell.setParam("length", 400) ell.setParam("sldCyl", 2.0e-6) ell.setParam("sldSolv", 1.0e-6) passed = True for i_q in range(1, 30): q = 0.025*i_q ell_val = ell.run([q, phi]) cyl_val = cyl.run([q, phi]) if self.verbose: print "Q=%g Ell=%g Cyl=%g R=%g" %(q, ell_val, cyl_val, ell_val/cyl_val) if math.fabs(ell_val-cyl_val)/cyl_val>0.05: passed= False return passed
def checkCylinder(self, points): """ Compare the average over all orientations of the main cylinder axis for a cylinder and the elliptical cylinder with r_ratio = 1 @param points: number of points to average over @return: True if the test passed, otherwise False """ from sas.models.CylinderModel import CylinderModel passed = True npts =points model = EllipticalCylinderModel() model.setParam('r_ratio', 1.0) model.setParam("r_minor", 20) model.setParam("cyl_theta", 90) model.setParam("cyl_phi", 0.0) model.setParam("length", 400) model.setParam("sldEll", 2.0e-6) model.setParam("sldSolv", 1.0e-6) cyl = CylinderModel() cyl.setParam("cyl_theta", 90) cyl.setParam("cyl_phi", 0.0) cyl.setParam("radius", 20) cyl.setParam("length", 400) cyl.setParam("sldCyl", 2.0e-6) cyl.setParam("sldSolv", 1.0e-6) output_f = open("average_func.txt",'w') output_f.write("<q_average> <2d_average> <1d_average>\n") for i_q in range(1, 15): q = 0.3/15.0*i_q value = self.average_point_2D(model, q, npts) ana = cyl.run(q) if q<0.3 and math.fabs(value-ana)/ana>0.05: passed = False output_f.write("%10g %10g %10g\n" % (q, value, ana)) if self.verbose: print "Q=%g: %10g %10g %10g %10g" % (q, value, ana, value-ana, value/ana) output_f.close() return passed