#!/usr/bin/env python3
"""
GISAS of 10 boxes with custom morphology (IsGISAXS example 7).

Ten rectangular boxes with varying widths (2, 4, 6, 8, 10 nm repeat) and
heights (1 nm), all fixed length 2 nm, placed at specific (x,y) positions
with rotation angles 0, 10, 20, ..., 90 deg. All in vacuum (no substrate).
"""
import bornagain as ba
from bornagain import ba_plot as bp, deg, nm, R3


def get_sample():
    vacuum = ba.Vacuum()
    particle_color = (0.86, 0.24, 0.18)
    particle_mat = ba.RefractiveMaterial("Particle", particle_color, 6e-4, 2e-8)

    vacuum_layer = ba.Layer(vacuum)

    params = [
        # (width, pos_x, pos_y, rotation_deg)
        (2*nm,  0*nm,  0*nm,  0),
        (4*nm,  5*nm,  5*nm, 10),
        (6*nm, -5*nm, -5*nm, 20),
        (8*nm,  5*nm, -5*nm, 30),
        (10*nm,-5*nm,  5*nm, 40),
        (2*nm,  0*nm,  0*nm, 50),
        (4*nm,  5*nm,  5*nm, 60),
        (6*nm, -5*nm, -5*nm, 70),
        (8*nm,  5*nm, -5*nm, 80),
        (10*nm,-5*nm,  5*nm, 90),
    ]
    for width, px, py, rot in params:
        p = ba.Particle(particle_mat, ba.Box(2*nm, width, 1*nm))
        if rot != 0:
            p.rotate(ba.RotationZ(rot*deg))
        p.translate(R3(px, py, 0))
        vacuum_layer.deposit2D(ba.Dilute2D(0.001, p))

    vacuum_bottom = ba.Layer(vacuum)

    sample = ba.Sample()
    sample.addLayer(vacuum_layer)
    sample.addLayer(vacuum_bottom)
    return sample


def get_simulation(sample):
    beam = ba.Beam(1, 0.1*nm, 0.2*deg)
    n = 100
    detector = ba.SphericalDetector(n, -2*deg, 2*deg, n, 0, 2*deg)
    return ba.ScatteringSimulation(beam, sample, detector)


if __name__ == '__main__':
    sample = get_sample()
    simulation = get_simulation(sample)
    result = simulation.simulate()
    plotargs = bp.parse_commandline()
    bp.plot_datafield(result, unit_aspect=1, **plotargs)
    bp.export(**plotargs)
