class TestCyl(unittest.TestCase): """Unit tests for cylinder""" def setUp(self): from sas.models.CylinderModel import CylinderModel self.comp = CylinderModel() def test1D(self): """ Test 1D model of a cylinder """ self.assertAlmostEqual(self.comp.run(0.2), 0.041761386790780453, 4) def testTime(self): """ Time profiling """ self.comp.run(2.0) t0 = time.clock() self.assertTrue(time.clock()-t0<1e-5) def test2D(self): """ Test 2D model of a cylinder """ self.comp.setParam('cyl_theta', 10.0) self.comp.setParam('cyl_phi', 10.0) self.assertAlmostEqual(self.comp.run([0.2, 2.5]), 0.038176446608393366, 2) def test2DXY(self): """ Test 2D model of a cylinder """ self.comp.setParam('cyl_theta', 10.0) self.comp.setParam('cyl_phi', 10.0) self.assertAlmostEqual(self.comp.runXY([0.01, 0.02]), 14.89, 2)
class TestCyl(unittest.TestCase): """Unit tests for cylinder""" def setUp(self): from sas.models.CylinderModel import CylinderModel self.comp = CylinderModel() def test1D(self): """ Test 1D model of a cylinder """ self.assertAlmostEqual(self.comp.run(0.2), 0.041761386790780453, 4) def testTime(self): """ Time profiling """ self.comp.run(2.0) t0 = time.clock() self.assertTrue(time.clock() - t0 < 1e-5) def test2D(self): """ Test 2D model of a cylinder """ self.comp.setParam('cyl_theta', 10.0) self.comp.setParam('cyl_phi', 10.0) self.assertAlmostEqual(self.comp.run([0.2, 2.5]), 0.038176446608393366, 2) def test2DXY(self): """ Test 2D model of a cylinder """ self.comp.setParam('cyl_theta', 10.0) self.comp.setParam('cyl_phi', 10.0) self.assertAlmostEqual(self.comp.runXY([0.01, 0.02]), 14.89, 2)
class TestDisperser(unittest.TestCase): """ Unit tests for sphere model """ def setUp(self): self.model = CylinderModel() self.model.setParam("cyl_theta", 1.57) self.model.setParam("cyl_phi", 0.1) def testNoDisp(self): """ Test 1D model for a sphere """ q = 0.005 d = Disperser(self.model, [], []) value = d.run([q, 0]) self.assertEqual(value, self.model.run([q, 0])) def testComp(self): q = 0.005 phi = 0.10 sigma = 0.3 value_0 = self.model.run([q, phi]) app = Smear(self.model, ['cyl_phi'], [sigma]) val_py = app.run([q, phi]) # Check that the parameters were returned to original values self.assertEqual(value_0, self.model.run([q, phi])) d = Disperser(self.model, ["cyl_phi"], [sigma]) val_c = d.run([q, phi]) self.assertEqual(val_py, val_c) def test2Disp(self): q = 0.005 phi = 0.10 sigma = 0.3 value_0 = self.model.run([q, phi]) app = Smear(self.model, ['cyl_phi', 'cyl_theta'], [sigma, sigma]) val_py = app.run([q, phi]) # Check that the parameters were returned to original values self.assertEqual(value_0, self.model.run([q, phi])) d = Disperser(self.model, ["cyl_phi", "cyl_theta"], [sigma, sigma]) val_c = d.run([q, phi]) self.assertEqual(val_py, val_c) def test3Disp(self): q = 0.005 phi = 0.10 sigma = 0.3 value_0 = self.model.run([q, phi]) app = Smear(self.model, ['cyl_phi', 'cyl_theta', 'radius'], [sigma, sigma, 1.0]) val_py = app.run([q, phi]) # Check that the parameters were returned to original values self.assertEqual(value_0, self.model.run([q, phi])) d = Disperser(self.model, ["cyl_phi", "cyl_theta", 'radius'], [sigma, sigma, 1.0]) val_c = d.run([q, phi]) self.assertEqual(val_py, val_c)
class TestCylinder(unittest.TestCase): """ Unit tests for Cylinder model using evalDistribution function """ def setUp(self): from sas.models.CylinderModel import CylinderModel self.comp = CylinderModel() self.x = numpy.array([1.0,2.0,3.0, 4.0]) self.y = self.x +1 def test1D(self): """ Test 1D model for a cylinder with vector as input""" answer = numpy.array([1.98860592e-04,7.03686335e-05,2.89144683e-06,2.04282827e-06]) testvector= self.comp.evalDistribution(self.x) self.assertAlmostEqual(len(testvector),4) for i in xrange(len(answer)): self.assertAlmostEqual(testvector[i],answer[i]) def test1D_1(self): """ Test 2D model for a cylinder with scalar as input""" self.assertAlmostEqual(self.comp.run(0.2), 0.041761386790780453, 4) def test1D_2(self): """ Test 2D model of a cylinder """ self.comp.setParam('cyl_theta', 10.0) self.comp.setParam('cyl_phi', 10.0) self.assertAlmostEqual(self.comp.run([0.2, 2.5]), 0.038176446608393366, 2) def test1D_3(self): """ Test 2D model for a cylinder for 2 vectors as input """ vect = self.comp.evalDistribution([self.x,self.y]) self.assertAlmostEqual(vect[0],5.06121018e-08,4) self.assertAlmostEqual(vect[len(self.x)-1],2.5978e-11, 4)
class TestCylinder(unittest.TestCase): """ Unit tests for Cylinder model using evalDistribution function """ def setUp(self): from sas.models.CylinderModel import CylinderModel self.comp = CylinderModel() self.x = numpy.array([1.0, 2.0, 3.0, 4.0]) self.y = self.x + 1 def test1D(self): """ Test 1D model for a cylinder with vector as input""" answer = numpy.array( [1.98860592e-04, 7.03686335e-05, 2.89144683e-06, 2.04282827e-06]) testvector = self.comp.evalDistribution(self.x) self.assertAlmostEqual(len(testvector), 4) for i in xrange(len(answer)): self.assertAlmostEqual(testvector[i], answer[i]) def test1D_1(self): """ Test 2D model for a cylinder with scalar as input""" self.assertAlmostEqual(self.comp.run(0.2), 0.041761386790780453, 4) def test1D_2(self): """ Test 2D model of a cylinder """ self.comp.setParam('cyl_theta', 10.0) self.comp.setParam('cyl_phi', 10.0) self.assertAlmostEqual(self.comp.run([0.2, 2.5]), 0.038176446608393366, 2) def test1D_3(self): """ Test 2D model for a cylinder for 2 vectors as input """ vect = self.comp.evalDistribution([self.x, self.y]) self.assertAlmostEqual(vect[0], 5.06121018e-08, 4) self.assertAlmostEqual(vect[len(self.x) - 1], 2.5978e-11, 4)
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
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 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
class TestCylinder(unittest.TestCase): """ Testing C++ Cylinder model """ def setUp(self): from sas.models.CylinderModel import CylinderModel self.model= CylinderModel() self.model.setParam('scale', 1.0) self.model.setParam('radius', 20.0) self.model.setParam('length', 400.0) self.model.setParam('sldCyl', 4.e-6) self.model.setParam('sldSolv', 1.e-6) self.model.setParam('background', 0.0) self.model.setParam('cyl_theta', 0.0) self.model.setParam('cyl_phi', 90.0) def test_simple(self): self.assertAlmostEqual(self.model.run(0.001), 450.355, 3) self.assertAlmostEqual(self.model.runXY([0.001,0.001]), 452.299, 3) def test_constant(self): from sas.models.dispersion_models import DispersionModel disp = DispersionModel() self.model.setParam('scale', 10.0) self.model.set_dispersion('radius', disp) self.model.dispersion['radius']['width'] = 0.25 self.model.dispersion['radius']['npts'] = 100 self.model.dispersion['radius']['nsigmas'] = 2.5 self.assertAlmostEqual(self.model.run(0.001), 1.021051*4527.47250339, 3) self.assertAlmostEqual(self.model.runXY([0.001, 0.001]), 1.021048*4546.997777604715, 2) def test_gaussian(self): from sas.models.dispersion_models import GaussianDispersion disp = GaussianDispersion() self.model.set_dispersion('radius', disp) self.model.dispersion['radius']['width'] = 0.25 self.model.dispersion['radius']['npts'] = 100 self.model.dispersion['radius']['nsigmas'] = 2 self.model.setParam('scale', 10.0) self.assertAlmostEqual(self.model.run(0.001), 1.1804794*4723.32213339, 3) self.assertAlmostEqual(self.model.runXY([0.001,0.001]), 1.180454*4743.56, 2) def test_clone(self): from sas.models.dispersion_models import GaussianDispersion disp = GaussianDispersion() self.model.set_dispersion('radius', disp) self.model.dispersion['radius']['width'] = 0.25 self.model.dispersion['radius']['npts'] = 100 self.model.dispersion['radius']['nsigmas'] = 2 self.model.setParam('scale', 10.0) new_model = self.model.clone() self.assertAlmostEqual(new_model.run(0.001), 1.1804794*4723.32213339, 3) self.assertAlmostEqual(new_model.runXY([0.001,0.001]), 1.180454*4743.56, 2) def test_gaussian_zero(self): from sas.models.dispersion_models import GaussianDispersion disp = GaussianDispersion() self.model.set_dispersion('radius', disp) self.model.dispersion['radius']['width'] = 0.0 self.model.dispersion['radius']['npts'] = 100 self.model.dispersion['radius']['nsigmas'] = 2.5 self.model.setParam('scale', 1.0) self.assertAlmostEqual(self.model.run(0.001), 450.355, 3) self.assertAlmostEqual(self.model.runXY([0.001,0.001]), 452.299, 3) 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() values_ph = numpy.zeros(100) values_th = numpy.zeros(100) weights = numpy.zeros(100) for i in range(100): 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) self.model.set_dispersion('cyl_theta', disp_th) self.model.set_dispersion('cyl_phi', disp_ph) 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)
class TestcylinderHayterM(unittest.TestCase): """ Unit tests for CylinderModel(Q) * HayterMSAStructure(Q) """ def setUp(self): from sas.models.CylinderModel import CylinderModel from sas.models.HayterMSAStructure import HayterMSAStructure from sas.models.DiamCylFunc import DiamCylFunc from sas.models.MultiplicationModel import MultiplicationModel self.model = CylinderModel() self.model2 = HayterMSAStructure() self.model3 = MultiplicationModel(self.model, self.model2) self.modelD = DiamCylFunc() #Radius of model1.calculate_ER should be equal to the output/2 of DiamFunctions def test_multplication_radius(self): """ test multiplication model (check the effective radius & the output of the multiplication) """ self.model.setParam("radius", 60) self.modelD.setParam("radius", 60) modelDrun = self.modelD.run(0.1)/2 self.model2.setParam("volfraction", 0.2) self.model2.setParam("effect_radius", modelDrun ) #Compare new method with old method self.assertEqual(self.model3.run(0.1), self.model.run(0.1)*self.model2.run(0.1)) #Compare radius from two different calculations. Note: modelD.run(0.0) is DIAMETER self.assertEqual(self.model.calculate_ER(), modelDrun) def testMultiplicationParam(self): """ Test Multiplication (check the parameters)""" ## test details dictionary ## test parameters list list3= self.model3.getParamList() for item in self.model.getParamList(): if not 'scale' in item: self.assert_(item in list3) for item in self.model2.getParamList(): #model3 parameters should not include effect_radius* if not 'effect_radius' in item: self.assert_(item in list3) ## test set value for parameters and get paramaters #self.model3.setParam("scale", 15) #self.assertEqual(self.model3.getParam("scale"), 15) self.model3.setParam("scale_factor", 15) self.assertEqual(self.model3.getParam("scale_factor"), 15) self.model3.setParam("radius", 20) self.assertEqual(self.model3.getParam("radius"), 20) self.model3.setParam("radius.width", 15) self.assertEqual(self.model3.getParam("radius.width"), 15) self.model3.setParam("scale_factor", 15) self.assertEqual(self.model3.getParam("scale_factor"), 15) self.assertEqual(self.model3.getParam("volfraction"), self.model.getParam("scale")) ## Dispersity list3= self.model3.getDispParamList() self.assertEqual(list3, ['radius.npts', 'radius.nsigmas', 'radius.width', 'length.npts', \ 'length.nsigmas', 'length.width', 'cyl_theta.npts', 'cyl_theta.nsigmas', 'cyl_theta.width',\ 'cyl_phi.npts', 'cyl_phi.nsigmas', 'cyl_phi.width']) from sas.models.dispersion_models import ArrayDispersion disp_th = ArrayDispersion() values_th = numpy.zeros(100) weights = numpy.zeros(100) for i in range(100): values_th[i]=(math.pi/99.0*i) weights[i]=(1.0) disp_th.set_weights(values_th, weights) self.model3.set_dispersion('radius', disp_th) model4= self.model3.clone() self.assertEqual(model4.getParam("radius"), 20)