# `analysis.inclination` module

Plot a survey of the inclination angle

Source code

    """Plot a survey of the inclination angle"""

    import matplotlib.pyplot as plt
    import numpy as np

    from analysis import utils

    def plotEdgeView(data, ax, axisOn):
        """Plot the encounter as viewed from the edge of the galaxy

        Parameters:
            ax: the matplotlib axis where the data should be plotted
            data: a data dictionary in the format saved by the simulation
            axisOn (bool): whether to include the y axis in this subplot.
                It can be omitted when it is shared among subplots.
        """
        r_vec = data['r_vec']
        theta, phi = data['CONFIG']['galaxy1']['orientation']

        # Obtain the edge view, rotate 90º around y axis
        spin = np.array([np.sin(theta)*np.cos(phi),
                np.sin(theta)*np.sin(phi),
                np.cos(theta)])
        phi = np.pi/2
        M = np.array([[np.cos(-phi), 0,np.sin(-phi)],
            [0, 1, 0],
            [-np.sin(-phi), 0, np.cos(-phi)]])
        r_vec = np.einsum('ai,ij->aj', r_vec, M)
        spin = np.einsum('i,ij->j', spin, M)
        data['tracks'] = np.einsum('abi,ij->abj', data['tracks'], M)
        data['tracks'] -= r_vec[0,:] #Relative to center of galaxy
        r_vec[:,:] -= r_vec[0,:]

        # Flip y to be consistent with Toomre and Toomre
        r_vec[:,1] = -r_vec[:,1]
        data['tracks'][:,:,1] *= -1

        # Plotting
        utils.plotCenterMasses(ax, {'r_vec': r_vec, 'type':data['type']})
        ax.plot(data['tracks'][1,:,0], data['tracks'][1,:,1],
            c='black', alpha=1.0, linewidth=1)
        ax.scatter(r_vec[:,0], r_vec[:,1], s=0.01, marker='.',
            c='#c40f4c', alpha=.6)
        utils.setSize(ax, x=(-1.5, 1.5), y=(-1.5,3.5), mode='square')
        utils.stylizePlot([ax])
        utils.setAxes(ax, x=r'x / $r_{min}$', y=r'y / $r_{min}$',
            ycoords=(-0.2, .8), mode=('bottomleft' if axisOn else 'bottom'))

    def plotFrontalView(data, ax, axisOn):
        """Plot the encounter as viewed normal to the galactic plane

        Parameters:
            ax: the matplotlib axis where the data should be plotted
            data: a data dictionary in the format saved by the simulation
            axisOn (bool): whether to include the y axis in this subplot.
                It can be omitted when it is shared among subplots.
        """
        r_vec = data['r_vec']
        theta, phi = data['CONFIG']['galaxy1']['orientation']

        # Rotate the position vectors into the appropiate view
        M2 = np.array([[np.cos(-phi), np.sin(-phi), 0],
            [-np.sin(-phi), np.cos(-phi), 0],
            [0, 0, 1]])
        M1 = np.array([[1, 0, 0],
            [0, np.cos(-theta), np.sin(-theta)],
            [0, -np.sin(-theta), np.cos(-theta)]])
        r_vec = np.einsum('ai,ij->aj', np.einsum('ai,ij->aj', r_vec, M2), M1)
        data['tracks'] = np.einsum('abi,ij->abj', data['tracks'], M2)
        data['tracks'] = np.einsum('abi,ij->abj', data['tracks'], M1)
        data['tracks'] -= data['tracks'][0]
        r_vec[:,:] -= r_vec[0,:]

        #Plotting
        utils.plotCenterMasses(ax, {'r_vec': r_vec, 'type':data['type']})
        utils.plotTracks(ax, data['tracks'])
        ax.scatter(r_vec[:,0], r_vec[:,1], c='#c40f4c', s=0.01, marker='.')
        utils.setSize(ax, x=(-3, 2), y=(-1.5, 1.5), mode='square')
        utils.stylizePlot([ax])
        utils.setAxes(ax, x=r'x / $r_{min}$', y=r'y / $r_{min}$',
            ycoords=(-0.2, .8), mode=('bottomleft' if axisOn else 'bottom'))

    #########################################################

    # Select the inclinations
    inclinations = [15, 45, 60, 90, 135]
    f, axs = plt.subplots(2, len(inclinations),  figsize=(11, 6),
        sharey=False, sharex=False, gridspec_kw = {'height_ratios':[5/3, 1]})
    t = 5000 # time of plots

    # Plot both views for each encounter
    for i in range(len(inclinations)):
        data = utils.loadData('i{}'.format(inclinations[i]), t)
        plotEdgeView(data, ax=axs[0,i], axisOn=True if i==0 else False)
        data = utils.loadData('i{}'.format(inclinations[i]), t)
        plotFrontalView(data, ax=axs[1,i], axisOn=True if i==0 else False)

    f.subplots_adjust(hspace=0, wspace=0)
    plt.tight_layout()
    plt.show()

## Functions

`def plotEdgeView(data, ax, axisOn)`

  Plot the encounter as viewed from the edge of the galaxy

  ## Parameters

  `ax`
    the matplotlib axis where the data should be plotted
  `data`
    a data dictionary in the format saved by the simulation
  `axisOn` :`bool`
    whether to include the y axis in this subplot. It can be omitted when it is shared among subplots.
  Source code

      def plotEdgeView(data, ax, axisOn):
          """Plot the encounter as viewed from the edge of the galaxy

          Parameters:
              ax: the matplotlib axis where the data should be plotted
              data: a data dictionary in the format saved by the simulation
              axisOn (bool): whether to include the y axis in this subplot.
                  It can be omitted when it is shared among subplots.
          """
          r_vec = data['r_vec']
          theta, phi = data['CONFIG']['galaxy1']['orientation']

          # Obtain the edge view, rotate 90º around y axis
          spin = np.array([np.sin(theta)*np.cos(phi),
                  np.sin(theta)*np.sin(phi),
                  np.cos(theta)])
          phi = np.pi/2
          M = np.array([[np.cos(-phi), 0,np.sin(-phi)],
              [0, 1, 0],
              [-np.sin(-phi), 0, np.cos(-phi)]])
          r_vec = np.einsum('ai,ij->aj', r_vec, M)
          spin = np.einsum('i,ij->j', spin, M)
          data['tracks'] = np.einsum('abi,ij->abj', data['tracks'], M)
          data['tracks'] -= r_vec[0,:] #Relative to center of galaxy
          r_vec[:,:] -= r_vec[0,:]

          # Flip y to be consistent with Toomre and Toomre
          r_vec[:,1] = -r_vec[:,1]
          data['tracks'][:,:,1] *= -1

          # Plotting
          utils.plotCenterMasses(ax, {'r_vec': r_vec, 'type':data['type']})
          ax.plot(data['tracks'][1,:,0], data['tracks'][1,:,1],
              c='black', alpha=1.0, linewidth=1)
          ax.scatter(r_vec[:,0], r_vec[:,1], s=0.01, marker='.',
              c='#c40f4c', alpha=.6)
          utils.setSize(ax, x=(-1.5, 1.5), y=(-1.5,3.5), mode='square')
          utils.stylizePlot([ax])
          utils.setAxes(ax, x=r'x / $r_{min}$', y=r'y / $r_{min}$',
              ycoords=(-0.2, .8), mode=('bottomleft' if axisOn else 'bottom'))

`def plotFrontalView(data, ax, axisOn)`

  Plot the encounter as viewed normal to the galactic plane

  ## Parameters

  `ax`
    the matplotlib axis where the data should be plotted
  `data`
    a data dictionary in the format saved by the simulation
  `axisOn` :`bool`
    whether to include the y axis in this subplot. It can be omitted when it is shared among subplots.
  Source code

      def plotFrontalView(data, ax, axisOn):
          """Plot the encounter as viewed normal to the galactic plane

          Parameters:
              ax: the matplotlib axis where the data should be plotted
              data: a data dictionary in the format saved by the simulation
              axisOn (bool): whether to include the y axis in this subplot.
                  It can be omitted when it is shared among subplots.
          """
          r_vec = data['r_vec']
          theta, phi = data['CONFIG']['galaxy1']['orientation']

          # Rotate the position vectors into the appropiate view
          M2 = np.array([[np.cos(-phi), np.sin(-phi), 0],
              [-np.sin(-phi), np.cos(-phi), 0],
              [0, 0, 1]])
          M1 = np.array([[1, 0, 0],
              [0, np.cos(-theta), np.sin(-theta)],
              [0, -np.sin(-theta), np.cos(-theta)]])
          r_vec = np.einsum('ai,ij->aj', np.einsum('ai,ij->aj', r_vec, M2), M1)
          data['tracks'] = np.einsum('abi,ij->abj', data['tracks'], M2)
          data['tracks'] = np.einsum('abi,ij->abj', data['tracks'], M1)
          data['tracks'] -= data['tracks'][0]
          r_vec[:,:] -= r_vec[0,:]

          #Plotting
          utils.plotCenterMasses(ax, {'r_vec': r_vec, 'type':data['type']})
          utils.plotTracks(ax, data['tracks'])
          ax.scatter(r_vec[:,0], r_vec[:,1], c='#c40f4c', s=0.01, marker='.')
          utils.setSize(ax, x=(-3, 2), y=(-1.5, 1.5), mode='square')
          utils.stylizePlot([ax])
          utils.setAxes(ax, x=r'x / $r_{min}$', y=r'y / $r_{min}$',
              ycoords=(-0.2, .8), mode=('bottomleft' if axisOn else 'bottom'))