# Source code for threeML.utils.step_parameter_generator

```__author__ = "grburgess <J. Michael Burgess>"

from astromodels import DiracDelta, StepFunctionUpper
import numpy as np

[docs]def step_generator(intervals, parameter):
"""

Generates sum of step or dirac delta functions for the given intervals
and parameter. This can be used to link time-independent parameters
of a model to time.

If the intervals provided are 1-D, i.e, they are the means of time bins or
the TOA of photons, then a sum of dirac deltas is returned with their centers
at the times provided

If the intervals are 2-D (start, stop), sum of step functions is created with
the bounds at the start and stop times of the interval.

The parameter is used to set the bounds and initial value, min, max of the
non-zero points of the functions

:param intervals: an array of the 1- or 2-D intervals to be used
:param parameter: astromodels parameter
"""

intervals = np.atleast_2d(intervals)

# need to make sure the shape is right
# assert self._intervals.shape

# Check if the interval is 2D or 1D
if intervals.shape[0] > 1 and intervals.shape[1] == 2:

n_intervals = intervals.shape[0]

is_2d = True

elif intervals.shape[0] == 1:

n_intervals = intervals.shape[1]
intervals = intervals[0]

is_2d = False

else:

raise RuntimeError("These intervals are not yet supported")

# Copy the parameter values
parameter_min = parameter.min_value
parameter_max = parameter.max_value
initial_value = parameter.value

if is_2d:

# For 2D intervals, we grab a step function

func = StepFunctionUpper()

# Sum up the functions

for i in range(n_intervals - 1):

func += StepFunctionUpper()

# Go through and iterate over intervals to set the parameter values

for i, interval in enumerate(intervals):

i = i + 1

func.free_parameters["value_%d" % i].value = initial_value
func.free_parameters["value_%d" % i].min_value = parameter_min
func.free_parameters["value_%d" % i].max_value = parameter_max

func.parameters["upper_bound_%d" % i].value = interval[1]

func.parameters["lower_bound_%d" % i].value = interval[0]

else:

# For 1-D intervals, just create a sum of delta functions

func = DiracDelta()

for i in range(n_intervals - 1):

func += DiracDelta()

# Set up the values

for i, interval in enumerate(intervals):

i = i + 1

func.free_parameters["value_%d" % i].value = initial_value
func.free_parameters["value_%d" % i].min_value = parameter_min
func.free_parameters["value_%d" % i].max_value = parameter_max

func.parameters["zero_point_%d" % i].value = interval

return func
```