2.5. Programmatically

Hazel v2.0 can be used programmatically, which can be used for simple calculations or if more advanced synthesis/inversion strategies are required.

2.5.1. Creating a model

The first step is to create a model. By default, the model is created in synthesis mode. The verbosity level can be selected with the verbose keyword.

import hazel
mod = hazel.Model(working_mode='synthesis', verbose=True)

The Model class defines the following two properties: atmospheres and spectrum. The first one contains all the atmospheric information, and one interacts with it when changing and/or accessing the properties of each atmosphere. The second one contains all the spectral information, including the synthesized Stokes parameters or the observations.

2.5.2. Adding a spectral region

The first step is to define a spectral region of interest. The model class has an add_spectral method that generates new spectral regions. A dictionary with the information needs to be passed to the function. Note that many of them are optional and many are only used in inversion mode.

dict = {'Name': 'spec1', 'Wavelength': [10826, 10833, 150], 'topology': 'ch1',
    'LOS': [0.0,0.0,90.0], 'Boundary condition': [1.0,0.0,0.0,0.0]}
mod.add_spectral(dict)

The explanation for all keys of the dictionary are the same as those explained in Examples:

  • Name

  • Wavelength (optional if a wavelength file is passed)

  • Topology

  • Stokes weights (optional)

  • LOS (mandatory for synthesis)

  • Boundary condition (mandatory for synthesis)

  • Wavelength file (optional if a wavelength axis is passed

  • Wavelength weight file (optional)

  • Observations file (optional)

  • Straylight file (optional)

  • Mask file (optional)

2.5.3. Working with chromospheres

2.5.3.1. Adding a chromosphere

A new Hazel chromosphere is added by calling the following method of Model:

mod.add_chromosphere({'Name': 'ch1', 'Spectral region': 'spec1', 'Height': 3.0,
    'Line': '10830', 'Wavelength': [10826, 10833]})
  • Name

  • Spectral region

  • Height

  • Line

  • Wavelength

  • Reference atmospheric model (optional)

  • Ranges (optional)

  • Nodes (optional)

In this case, the properties of the newly created atmosphere can be accessed in the dictionary element mod.atmospheres['ch1']. All atmospheres are indexed by the given name.

2.5.3.2. Changing the parameters of the chromosphere

Once defined, the model parameters can be changed by calling the set_parameters method of the atmosphere:

mod.atmospheres['ch1'].set_parameters([0.0,0.0,100.0,1.0,0.0,8.0,1.0,0.0],1.0)

where the parameters are, in order: Bx, By, Bz, \(\tau\), v, \(\Delta v\), \(\beta\), a. The filling factor is passed as the second parameter.

2.5.4. Working with photospheres

2.5.4.1. Adding a photosphere

A new SIR atmosphere can be added by calling the following method of Model:

mod.add_photosphere({'Name': 'ph1', 'Spectral region': 'spec1', 'Spectral lines': [300,],
    'Wavelength': [10826, 10833]})
  • Name

  • Spectral region

  • Spectral lines

  • Wavelength

  • Reference atmospheric model (optional)

  • Ranges (optional)

  • Nodes (optional)

2.5.4.2. Changing the parameters of the photosphere

Once defined, the model parameters can be changed by calling the set_parameters method of the atmosphere:

mod.atmospheres['ph1'].set_parameters(model, ff, vmac)

where model is an array of size (nz,8) with the model atmosphere, ff is the filling factor and vmac is the macroturbulent velocity. The columns are, in order: \(\log \tau\), T, Pe, vmic, v, Bx, By, Bz. If Pe is negative, the electron pressure will be calculated in synthesis mode assuming hydrostatic equilibrium. On the other hand, it is always calculated in hydrostatic equilibrium in inversion mode.

2.5.5. Working with parametric models

2.5.5.1. Adding a parametric model

mod.add_parametric({'Name': 'te1', 'Spectral region': 'spec1', 'Type': 'Voigt',
    'Wavelength': [10826, 10833]})
  • Name

  • Spectral region

  • Type

  • Wavelength

  • Reference atmospheric model (optional)

  • Ranges (optional)

  • Nodes (optional)

2.5.5.2. Changing the parameters of the parametric model

Once defined, the model parameters can be changed by calling the set_parameters method of the atmosphere:

mod.atmospheres['te1'].set_parameters([10833, 0.1, 0.5, 0.0], 1.0)

where the parameters are, in order: \(\lambda_0\), \(\sigma\), d, a, with the filling factor given at the end ff.

2.5.6. Working with straylight

2.5.6.1. Adding a straylight

mod.add_parametric({'Name': 'st1', 'Spectral region': 'spec1',
    'Wavelength': [10826, 10833]})
  • Name

  • Spectral region

  • Wavelength

  • Reference atmospheric model (optional)

  • Ranges (optional)

  • Nodes (optional)

2.5.6.2. Changing the parameters of the straylight

Once defined, the model parameters can be changed by calling the set_parameters method of the atmosphere:

mod.atmospheres['st1'].set_parameters([0.0, 1.0], 1.0)

where the parameters are, in order: stray light profile, v and the filling factor ff at the end.

2.5.7. Finalizing setup

Once all spectral regions and atmospheres are added, we need to finalize the setup by invoking:

mod.setup()

2.5.8. Synthesis

The model can be synthesized by calling the synthesize method of Model

mod.synthesize()

Finally, the emergent Stokes parameters can be accessed, for each spectral region, by examining mod.spectrum['spec1'].stokes.