File: auto_slicing.py

package info (click to toggle)
bornagain 23.0-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 103,948 kB
  • sloc: cpp: 423,131; python: 40,997; javascript: 11,167; awk: 630; sh: 318; ruby: 173; xml: 130; makefile: 51; ansic: 24
file content (72 lines) | stat: -rw-r--r-- 2,524 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
"""
Check automatic slicing by comparing scattering from particle in decorated_layer
- (A) without slicing
- (B) with slicing provoked by dividing decorated_layer into sublayers
"""

import unittest
import PyFuTestInfrastructure as infrastruct
import bornagain as ba

matVacuum = ba.RefractiveMaterial("Vacuum", 0, 0)
matSubstrate = ba.RefractiveMaterial("Substrate", 3.2e-6, 3.2e-8)
matParticle = ba.RefractiveMaterial("Ag", 1.2e-5, 5.4e-7)

R = 10.0
dz = 4.0  # shift beneath interface


def get_sample(particle, sliced):
    """
    Returns a sample, with given particles attached to substrate or vacuum layer.
    """

    layout = ba.ParticleLayout()
    layout.addParticle(particle)

    sample = ba.Sample()
    sample.addLayer(ba.Layer(matVacuum))
    if sliced:
        sample.addLayer(ba.Layer(matSubstrate, 5))
        sample.addLayer(ba.Layer(matSubstrate, 3))
        sample.addLayer(ba.Layer(matSubstrate, 2))
    else:
        sample.addLayer(ba.Layer(matSubstrate, 10))
    substrate = ba.Layer(matSubstrate)
    substrate.addLayout(layout)
    sample.addLayer(substrate)

    return sample


class SlicedSpheresTest(unittest.TestCase):

    def runPlainFF(self, ff, eps = 1e-14):
        particle = ba.Particle(matParticle, ff)
        d1 = infrastruct.run_simulation_MiniGISAS(get_sample(particle, False))
        d2 = infrastruct.run_simulation_MiniGISAS(get_sample(particle, False))
        self.assertTrue(ba.checkRelativeDifference(d1, d2, eps))

    def testSlicingPlainFF(self):
        self.runPlainFF(ba.Cone(8., 9., 80*ba.deg))
        self.runPlainFF(ba.Cylinder(3., 9.))
        self.runPlainFF(ba.EllipsoidalCylinder(3., 4., 9.))
        # self.runPlainFF(ba.HemiEllipsoid(7., 8., 9.)) # yet unsupported
        self.runPlainFF(ba.HorizontalCylinder(5., 19.), 5e-12)
        self.runPlainFF(ba.HorizontalCylinder(5., 19., -4., 4.), 5e-12)
        self.runPlainFF(ba.HorizontalCylinder(6., 19., -3., 3.), 5e-12)
        self.runPlainFF(ba.Sphere(5.))
        self.runPlainFF(ba.Spheroid(4., 4.))
        self.runPlainFF(ba.SphericalSegment(7., 9., 1.))
        self.runPlainFF(ba.SpheroidalSegment(7., 9., .9, 1.))

        # self.runPlainFF(ba.PlatonicTetrahedron(12.)) # yet unsupported
        self.runPlainFF(ba.Prism3(8., 10.))
        self.runPlainFF(ba.Prism6(4., 9.))
        self.runPlainFF(ba.Pyramid3(8., 10., 80*ba.deg))
        self.runPlainFF(ba.Pyramid4(8., 9., 80*ba.deg))
        self.runPlainFF(ba.Pyramid6(18., 8., 40*ba.deg))


if __name__ == '__main__':
    unittest.main()