Skip to content

Structure Function

structure_function

StructureFunction

Source code in src/structure_function.py
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
class StructureFunction:

    def __init__(self, bins = np.geomspace(1,40,15)):
        """
        Initialize
        Parameters:
            bins (jn.array): Edges of the radial bins in which to compute the SF
        """

        self.bins = bins

    def __call__(self, v_bin_vec, xbary, ybary):
        """
        Computes the 2nd order structure function of an image with arbitrary binning.

        Parameters:
            v_bin_vec array (jn.array): Array of the count weighted velocity in each bin
            xbary (jn.array): Array of the bin barycenters X coordinate
            ybary (jn.array): Array of the bin barycenters Y coordinate
            bins (jn.array): Array of the binning chosen for the SF

        Returns:
            bin_dists (jn.array): Separations of the SF
            bin_means (jn.array): Values of the SF
        """

        #Indexes of all possible combinations
        idx = jnp.triu_indices(len(xbary), k = 1)

        #Vector of all possible separations
        sep_vec = jnp.hypot(xbary[idx[0]] - xbary[idx[1]],
                               ybary[idx[0]] - ybary[idx[1]])

        #Vector of (v_i - v_j)^2 
        v_vec = (v_bin_vec[idx[0]] - v_bin_vec[idx[1]])**2

        ### PREVIOUS VERSION
        #Now compute binned statistics
        #Average SF in each bin
        #bin_means, bin_edges, binnumber = stats.binned_statistic(sep_vec, v_vec, 'mean', bins = self.bins)
        #Average distance in each bin
        #bin_dists, bin_edges, binnumber = stats.binned_statistic(sep_vec, sep_vec, 'mean', bins = self.bins)

        ### JAX VERSION
        hist_weighted, bin_edges = jnp.histogram(sep_vec, bins = self.bins, weights = v_vec)
        hist_numbers, bin_edges = jnp.histogram(sep_vec, bins = self.bins)
        hist_dists, _ = jnp.histogram(sep_vec, bins = self.bins, weights = sep_vec)

        #Average SF in each bin
        bin_means = hist_weighted/hist_numbers

        #Average distance in each bin
        hist_dists = hist_dists/hist_numbers


        #Note : in principle, we shouldn't be taking the average distance in each bin, we should
        #take the bin center, but that's for comparison purposes with Edo's code

        return hist_dists, bin_means

__call__(v_bin_vec, xbary, ybary)

Computes the 2nd order structure function of an image with arbitrary binning.

Parameters:

Name Type Description Default
v_bin_vec array (jn.array

Array of the count weighted velocity in each bin

required
xbary array

Array of the bin barycenters X coordinate

required
ybary array

Array of the bin barycenters Y coordinate

required
bins array

Array of the binning chosen for the SF

required

Returns:

Name Type Description
bin_dists array

Separations of the SF

bin_means array

Values of the SF

Source code in src/structure_function.py
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
def __call__(self, v_bin_vec, xbary, ybary):
    """
    Computes the 2nd order structure function of an image with arbitrary binning.

    Parameters:
        v_bin_vec array (jn.array): Array of the count weighted velocity in each bin
        xbary (jn.array): Array of the bin barycenters X coordinate
        ybary (jn.array): Array of the bin barycenters Y coordinate
        bins (jn.array): Array of the binning chosen for the SF

    Returns:
        bin_dists (jn.array): Separations of the SF
        bin_means (jn.array): Values of the SF
    """

    #Indexes of all possible combinations
    idx = jnp.triu_indices(len(xbary), k = 1)

    #Vector of all possible separations
    sep_vec = jnp.hypot(xbary[idx[0]] - xbary[idx[1]],
                           ybary[idx[0]] - ybary[idx[1]])

    #Vector of (v_i - v_j)^2 
    v_vec = (v_bin_vec[idx[0]] - v_bin_vec[idx[1]])**2

    ### PREVIOUS VERSION
    #Now compute binned statistics
    #Average SF in each bin
    #bin_means, bin_edges, binnumber = stats.binned_statistic(sep_vec, v_vec, 'mean', bins = self.bins)
    #Average distance in each bin
    #bin_dists, bin_edges, binnumber = stats.binned_statistic(sep_vec, sep_vec, 'mean', bins = self.bins)

    ### JAX VERSION
    hist_weighted, bin_edges = jnp.histogram(sep_vec, bins = self.bins, weights = v_vec)
    hist_numbers, bin_edges = jnp.histogram(sep_vec, bins = self.bins)
    hist_dists, _ = jnp.histogram(sep_vec, bins = self.bins, weights = sep_vec)

    #Average SF in each bin
    bin_means = hist_weighted/hist_numbers

    #Average distance in each bin
    hist_dists = hist_dists/hist_numbers


    #Note : in principle, we shouldn't be taking the average distance in each bin, we should
    #take the bin center, but that's for comparison purposes with Edo's code

    return hist_dists, bin_means

__init__(bins=np.geomspace(1, 40, 15))

Initialize Parameters: bins (jn.array): Edges of the radial bins in which to compute the SF

Source code in src/structure_function.py
10
11
12
13
14
15
16
17
def __init__(self, bins = np.geomspace(1,40,15)):
    """
    Initialize
    Parameters:
        bins (jn.array): Edges of the radial bins in which to compute the SF
    """

    self.bins = bins