.. include:: references.txt

.. _getting_started:

***************
Getting started
***************

Contents
========

* :ref:`getting_started-example`
* :ref:`getting_started-customization`

.. _getting_started-example:

Using ``JazzHands``
-------------------

Let's go through a basic usage example with some synthetic data. First, we're
going to generate a sin wave with a frequency one 1 and amplitude of 1, 
randomly sampled over 10 periods, with some Gaussian noise added in:

.. code-block:: python

    >>> from jazzhands import *
        
    >>> import numpy as np
    
    >>> t_obs = np.random.uniform(low=0.0,high=10,size=1000) #Generate synthetic data
    
    >>> t_obs.sort() 
    
    >>> f_obs = np.sin(2*np.pi*1.0*t_obs) #Sin wave with frequency of 1
    
    >>> f_obs += 0.1*np.random.randn(len(f_obs)) #Add in some Gaussian noise
    
Let's plot to see how it looks:

.. code-block:: python

    >>> from matplotlib import pyplot as plt

    >>> plt.scatter(t_obs, f_obs) #doctest: +SKIP
  
    >>> plt.xlabel('Time') #doctest: +SKIP
 
    >>> plt.ylabel('Flux') #doctest: +SKIP
    
.. image:: images/synthetic_data_plot.png
   :scale: 65 %
    
Now let's initialize a `WaveletTransformer` object with our data:

.. code-block:: python

    >>> wt = WaveletTransformer(t_obs, f_obs)
    
We now have everything we need to compute a wavelet transform. If you know much
about wavelet transforms, you can specify the grid of frequencies/scales, but 
for now, we'll assume you just want a quick wavlet transform:

.. code-block:: python

    >>> nus, taus, wwz, wwa = wt.auto_compute(nu_min=0.5, nu_max=1.5)
    
    
Because real data may have signals at a variety of frequencies, we needed to 
specify the window in frequency we want to focus on to improve computational 
efficiency. `nu_min` is the minimum frequency, and `nu_max` is the max. The 
resulting quantities are the frequencies and centers of the wavelets that were 
automatically determined when we called `auto_compute`, the Weighted Wavelet
Z-transform (equivalent to the wavelet power), and the Weighted Wavelet 
Amplitude. The `WaveletTransformer` is now populated with some handy attributes
for visualization:
  
.. code-block:: python

    >>> import matplotlib.pyplot as plt
  
    >>> plt.contourf(wt.taus, wt.nus, wwz, levels=1000, vmin=0, vmax=1000) #doctest: +SKIP
  
    >>> plt.xlabel('Time') #doctest: +SKIP
 
    >>> plt.xlabel('Frequency') #doctest: +SKIP

.. image:: images/nu_tau_contour.png
   :scale: 65 %

.. _getting_started-customization:

Customizing the Transform
-------------------------

Now that you've run the wavelet transform, let's see what options are built in.
The conventions for the wavelet scale/frequency/dilation are many and varied. 
We use three: the frequency (nu), the angular frequency (omega, or 2 pi nu),
and the scale (1/nu). If you know which frequencies/scales are you want, you 
can specify either when initializing the `WaveletTransformer`

.. code-block:: python

    >>> taus = [0,0.5,1.0,2.3,4.7]
    
    >>> scales = [0.7,1.0,1.1,1.3]
    
    >>> wt = WaveletTransformer(t_obs, f_obs, scales=scales, taus=taus)
    
or later, by explicitly setting variables before running `compute_wavelet`:

.. code-block:: python

    >>> wt = WaveletTransformer(t_obs, f_obs)
    
    >>> wt.taus = taus
    
    >>> wt.scales = scales
    
    >>> wwz, wwa = wt.compute_wavelet()
    
You can also change the decay constant of the wavelet envelope using the `c` 
parameter when initializing the `WaveletTransformer`; `c` is set to 0.0125 
(approximately 1/8pi) by default, and as long as it's less than 0.02, you 
shouldn't run into too much trouble. `c` dictates the tradeoff between time
and frequency resolution as a function of frequency. The 
`WaveletTransformer.resolution` method lets us check these if we supply a 
frequency:

  
.. code-block:: python

    >>> wt = WaveletTransformer(t_obs, f_obs, c=0.0125)
 
    >>> print(wt.resolution(1.0)) #doctest: +SKIP
    
    >>> wt_2 = WaveletTransformer(t_obs, f_obs, c=0.00625) #setting c to 1/16pi
    
    >>> print(wt_2.resolution(1.0)) #doctest: +SKIP
    
