def test_plot_subfaults(self):

        strike_numbers = numpy.array([
            1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8,
            8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11
        ])

        dip_numbers = numpy.array([
            1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1,
            2, 3, 4, 1, 2, 3, 1, 2, 3, 1, 2, 3
        ])

        # Let's try making the centroids everywhere
        pp = PdfPages('multipage.pdf')

        for i in range(len(strike_numbers)):
            centroid_index = i

            num_subfaults_length = 6
            num_subfaults_width = 2

            f, axarr = pyplot.subplots(2, 2)
            for j in [0, 1]:
                for k in [0, 1]:
                    subfaults = generate_event_deformation.find_subfaults_to_include(
                        strike_numbers,
                        dip_numbers,
                        centroid_index,
                        num_subfaults_length,
                        num_subfaults_width,
                        prefer_down_dip_expansion=j,
                        prefer_along_strike_expansion=k)
                    # pyplot.subplot(2,2,2*j+k)
                    axarr[j, k].plot(
                        strike_numbers, dip_numbers, 'p', color='black')
                    axarr[j, k].plot(
                        strike_numbers[subfaults],
                        dip_numbers[subfaults],
                        'p',
                        color='orange')
                    axarr[j, k].set_xlim((strike_numbers.min() - 1,
                                          strike_numbers.max() + 1))
                    axarr[j, k].set_ylim((dip_numbers.min() - 1,
                                          dip_numbers.max() + 1))
                    axarr[j, k].set_title('Up Dip: ' + str(j) +
                                          ' / Along Strk:' + str(k))
                    axarr[j, k].plot(
                        strike_numbers[centroid_index],
                        dip_numbers[centroid_index],
                        'p',
                        color='red')
            pp.savefig()

        pp.close()
    def test_find_subfaults_to_include(self):

        centroid_index = 8

        strike_numbers = numpy.array([
            1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8,
            8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11
        ])

        dip_numbers = numpy.array([
            1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1,
            2, 3, 4, 1, 2, 3, 1, 2, 3, 1, 2, 3
        ])

        centroid_strike_number = strike_numbers[centroid_index]
        centroid_dip_number = dip_numbers[centroid_index]

        # Case 1 -- include everything
        num_subfaults_length = 11
        num_subfaults_width = 4

        subfaults = generate_event_deformation.find_subfaults_to_include(
            strike_numbers, dip_numbers, centroid_index, num_subfaults_length,
            num_subfaults_width)

        assert all(strike_numbers[subfaults] == strike_numbers)
        assert all(dip_numbers[subfaults] == dip_numbers)

        # Case 2 -- include just the centroid
        num_subfaults_length = 1
        num_subfaults_width = 1

        subfaults = generate_event_deformation.find_subfaults_to_include(
            strike_numbers, dip_numbers, centroid_index, num_subfaults_length,
            num_subfaults_width)

        assert strike_numbers[subfaults] == centroid_strike_number
        assert dip_numbers[subfaults] == centroid_dip_number

        # Case 3 -- a case where we can't match all the constraints

        num_subfaults_length = 7
        num_subfaults_width = 2

        # Centroid neighbours include missing values
        centroid_index = (dip_numbers == 4).nonzero()[0]

        subfaults = generate_event_deformation.find_subfaults_to_include(
            strike_numbers, dip_numbers, centroid_index, num_subfaults_length,
            num_subfaults_width)

        assert (centroid_index in subfaults.tolist())

        empirical_length = strike_numbers[subfaults].max() -\
            strike_numbers[subfaults].min() + 1
        tol = 0.7 * num_subfaults_length
        assert (abs(empirical_length - num_subfaults_length) <= tol)

        empirical_width = dip_numbers[subfaults].max() -\
            dip_numbers[subfaults].min() + 1
        tol = 0.5 * num_subfaults_width
        assert (abs(empirical_width - num_subfaults_width) <= tol)

        empirical_area = len(subfaults)
        desired_area = num_subfaults_width * num_subfaults_length
        tol = desired_area * 0.2
        assert (abs(empirical_area - desired_area) <= tol)