# -*- coding: utf-8 -*-
"""Create random magnetic distributions."""

import random as rnd
import pdb, traceback, sys
import numpy as np
from numpy import pi

import pyramid.magcreator as mc
from pyramid.magdata import MagData
import pyramid.phasemapper as pm
import pyramid.projector as pj
import pyramid.holoimage as hi
from pyramid.phasemap import PhaseMap


def create_random_slabs():
    '''Calculate, display and save a random magnetic distribution to file.
    Arguments:
        None
    Returns:
        None
    
    '''
    # Input parameters:
    count = 10
    dim = (1, 128, 128)  
    res = 10 # in nm
    rnd.seed(42)
    w_max = 10
    # Create lists for magnetic objects:
    mag_shape_list = np.zeros((count,) + dim)
    beta_list      = np.zeros(count) 
    magnitude_list = np.zeros(count)
    for i in range(count):
        width  = (1, rnd.randint(1, w_max), rnd.randint(1, w_max))
        center = (rnd.randrange(int(width[0]/2), dim[0]-int(width[0]/2)),
                  rnd.randrange(int(width[1]/2), dim[1]-int(width[1]/2)),
                  rnd.randrange(int(width[2]/2), dim[2]-int(width[2]/2)))
        mag_shape_list[i,...] = mc.Shapes.slab(dim, center, width)
        beta_list[i] = 2*pi*rnd.random()
        magnitude_list[i] = 1#rnd.random()
    # Create magnetic distribution
    magnitude = mc.create_mag_dist_comb(mag_shape_list, beta_list, magnitude_list) 
    mag_data = MagData(res, magnitude)
    mag_data.quiver_plot()
    mag_data.save_to_llg('../output/mag_dist_random_slabs.txt')
    projection = pj.simple_axis_projection(mag_data)
    phase_map  = PhaseMap(res, pm.phase_mag_real(res, projection, 'slab'))    
    hi.display(hi.holo_image(phase_map, 10))
    
    
if __name__ == "__main__":
    try:
        create_random_slabs()
    except:
        type, value, tb = sys.exc_info()
        traceback.print_exc()
        pdb.post_mortem(tb)