## Expanded simulation script

As a first step towards writing sample and simulation specifications of your own, let us expand the simulation script AlternatingLayers.py from the preceding pages. Instead of the shorthand calls to modules std_samples and std_simulations, we provide explicit code for the functions get_sample and get_simulation:

  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  #!/usr/bin/env python3 """ Basic example of specular reflectometry simulation with BornAgain. The sample consists of 20 alternating Ti and Ni layers. Explicit variant without using std_samples and std_simulation. """ import bornagain as ba from bornagain import ba_plot as bp, deg, angstrom def get_sample(): """ Sample consisting of 20 alternating Ti and Ni layers. """ # Define materials m_ambient = ba.MaterialBySLD("Vacuum", 0, 0) m_ti = ba.MaterialBySLD("Ti", -1.9493e-06, 0) m_ni = ba.MaterialBySLD("Ni", 9.4245e-06, 0) m_substrate = ba.MaterialBySLD("SiSubstrate", 2.0704e-06, 0) # Define layers ambient_layer = ba.Layer(m_ambient) ti_layer = ba.Layer(m_ti, 30*angstrom) ni_layer = ba.Layer(m_ni, 70*angstrom) substrate_layer = ba.Layer(m_substrate) # Define sample sample = ba.MultiLayer() sample.addLayer(ambient_layer) for _ in range(10): sample.addLayer(ti_layer) sample.addLayer(ni_layer) sample.addLayer(substrate_layer) return sample def get_simulation(sample): """ A standard specular simulation setup. """ n = bp.simargs['n'] scan = ba.AlphaScan(1.54*angstrom, n, 0, 2*deg) return ba.SpecularSimulation(scan, sample) if __name__ == '__main__': bp.parse_args(sim_n=500) sample = get_sample() simulation = get_simulation(sample) result = simulation.simulate() bp.plot_simulation_result(result) 
Examples/specular/AlternatingLayers1.py

### Sample

get_sample is a function without arguments. It returns an object of type MultiLayer.

The return statement is preceded by three stances. Each stance starts with a comment line,

    # comment extends from hash character to end of line

BornAgain functions that start with a capital letter, like MaterialBySLD or Layer are constructors or constructor-like global functions. They return new objects. An object is an instance of a class. The function MaterialBySLD instantiates an object of type Material the function Layer an object of type Layer.

Function like addLayer is a member function of class MultiLayer. This can be seen from the two lines

    sample = ba.MultiLayer()
sample.addLayer(ambient_layer)
where sample is created as a new instance of class MultiLayer.

### Simulation

get_simulation(sample, scan_size=500) is a function with one required argument (sample) and one optional keyword argument (scan_size). If the function is called with only one argument, then scan_size is assigned the default value 500.

angstrom and deg are numeric constants. They are used to convert physical quantities to internal units nanometer and radian.

The function returns an object of type SpecularSimulation.