File size: 7,767 Bytes
50bf100
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
446b05f
50bf100
 
 
446b05f
50bf100
 
 
 
 
 
 
 
 
 
 
446b05f
50bf100
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
526192e
50bf100
526192e
 
50bf100
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
446b05f
50bf100
 
 
 
 
 
 
 
 
 
 
446b05f
50bf100
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
446b05f
 
50bf100
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
import numpy as np
import pandas as pd
import streamlit as st
import matplotlib.pyplot as plt
import warnings
from matplotlib.patches import Ellipse
warnings.simplefilter("ignore")
import matplotlib as mpl

color_seq = np.array(['grey', 'blue', 'green', 'yellow', 'orange', 'red', 'purple', 'purple'])
cog = np.array([-99, 0., 1.0, 1.5, 2.0, 2.5, 3.0, 3.0001])
cmap = mpl.colors.ListedColormap(color_seq)
norm = mpl.colors.BoundaryNorm(cog, cmap.N)

#@st.cache

def get_text_block(fname):
  # this is how to read a block of text:
  path = ""
  f = open(fname, "r")
  # and then write it to the app
  return f.read();


def rotate(pts, rot):
    c = np.cos(np.radians(rot))
    s = np.sin(np.radians(rot))
    rotmat = np.array([[c, -s], [s, c]])
    pts = np.dot(pts, rotmat)
    return pts;

def plot_samps(df, plot_contour=True):
    aniso = (300.) / (750.)
    fig, ax = plt.subplots(figsize=(15, 15 * aniso * 0.8))
    if plot_contour:
        xx, yy = dgrid(1.)
        rbfi = Rbf(df.YPT, df.ZPT,  df.AU_G_T, function='cubic')
        zz = rbfi(xx, yy)
        ax.contour(xx, yy, zz, cog, colors=color_seq, alpha=0.5)
        ax.imshow(zz, origin='lower', extent=(0., 750, 0., 300.), alpha=0.2, cmap=cmap, norm=norm)
    scat = ax.scatter(df.YPT, df.ZPT, c=df.AU_G_T, cmap=cmap, norm=norm, edgecolor="black", s=40)
    cbar = fig.colorbar(scat, ticks=cog)
    cbar.set_label('Au g/t', rotation=0)
    plt.xlim((0,750))
    plt.ylim((0, 300))
    plt.xlabel('X')
    plt.ylabel('Y')
    return fig, ax;

def block_modelling():

    st.title("Block Modelling Exercise")

    st.markdown("## **Visual Trend Analysis**")
    st.markdown("The figure below is an orthogonal projection of full width intercepts within a narrow vein.")
    st.markdown("Prior to any statistical analysis, it is useful just to look at your data." +
                " Take it for a spin, look to see where high grades are located and what trends you can observe." +
                " When selecting a colour profile, try use a scheme that highlights trends but considers some economic" +
                " criteria too. It is always useful to have one or two colour bins below your cut-off grade." +
                " The last tip is, be consistent with your legend,  make sure the samples and contours/blocks use the" +
                " same colour scheme.")

    df = pd.read_csv("data//sim_pts.csv")
    df = df[df.use==1].copy().reset_index(drop=True)
    # fig, ax = plot_samps(df)
    # st.pyplot(fig)
    st.image("images//contour.jpg", use_column_width=True)
    
    #-----------------------------------------------------------------------------------------------------------------#
    # Variogram
    # ----------------------------------------------------------------------------------------------------------------#

    st.markdown("## **Variogram Activity**")
    st.markdown("The omni-directional variogram is given in the chart that follows." +
                " Keep in mind that no direction has been chosen and that the range shown will be shorter than" +
                " the longest direction and longer than the shortest direction. Your job is to estimate the range" +
                " in the longest direction given your observations from the plot above.")

    st.image("images//interp_var.jpg")

    var_options = ["Select and Answer",
                   "Major = 75m, Semi-Major = 75m",
                   "Major = 125m, Semi-Major = 60m",
                   "Major = 75m, Semi-Major = 100m",
                   "Major = 150m, Semi-Major = 75m"]

    st.radio("What is you estimate of the major and semi major direction ranges?", options=var_options, key='vv1')

    #-----------------------------------------------------------------------------------------------------------------#
    # Set up search ellipse
    # ----------------------------------------------------------------------------------------------------------------#
    st.markdown("## **Search Ellipse Activity**")

    # scol1, scol2 = st.beta_columns((1, 1))
    # with scol1:
    st.markdown('#### Ellipse Shape')
    rot = st.number_input('Pick a Rotation (-360 to 360)', min_value=-360., max_value=360., value=0., step=5., key=1)
    rot = (360. - rot)
    srange_major = st.number_input('Major Axis Range', min_value=10., max_value=500., value=100., step=5., key=2)
    srange_minor = st.number_input('Semi-Major Axis Range', min_value=10., max_value=500., value=100., step=5., key=3)
    # with scol2:
    #     st.markdown('#### Sample Selection')
    #     min_samps = st.number_input("Minimum Samples", min_value=1, max_value=40, value=2, step=1)
    #     max_samps = st.number_input("Maximum Samples", min_value=1, max_value=40, value=10, step=1)
    fig, ax = plot_samps(df, plot_contour=False)
    e = Ellipse(xy=[350, 150], width=srange_minor * 2, height=srange_major * 2, angle=rot, linewidth=2)
    ax.add_artist(e)
    e.set_facecolor('None')
    e.set_edgecolor('black')
    st.pyplot(fig)
    src_options = ["Select an Answer",
                   "Major = 75m, Semi-Major = 75m, Rotated by 90, Min 2 Max 40",
                   "Major = 125m, Semi-Major = 60m, Rotated -60 towards South East, Min 3 Max 12",
                   "Major = 125m, Semi-Major = 60m, Rotated 20 towards South West, Min 2 Max 12",
                   "Major = 150m, Semi-Major = 75m, Min 2 Max 10, No Rotation"]

    st.radio("Select the appropriate search parameters?", options=src_options, key='ss1')

    st.markdown("## **Guess the Model: Question 1**")
    st.markdown("The interpolations given below are Nearest Neighbour (NN), Inverse Distance (ID) and Ordinary Kriging (OK) respectively")
    st.markdown("The curves increasing to the right on the grade tonnage curves are the grades foe each technique at different cut-offs.")
    scol1, scol2 = st.beta_columns((1, 1))
    with scol1:
        st.image("images//interp_ests_q1.jpg", use_column_width=True)
    with scol2:
        st.write("")
        st.write("")
        st.write("")
        st.write("")
        st.write("")
        st.write("")
        st.write("")
        st.write("")
        st.write("")
        st.write("")
        st.image("images//interp_gt_q1.jpg", use_column_width=True)

    gt_options = ["Select an Answer",
                   "Light blue is NN, purple is OK and red is ID",
                   "Light blue is NN, purple is ID and red is OK",
                   "Light blue is OK, purple is NN and red is ID",
                   "Light blue is OK, purple is ID and red is NN"]

    st.radio("Which lines on the gt_curve belong to which estimate?", options=gt_options, key='gg1')
    st.text("Any additional comments?")

    st.markdown("## **Guess the Model: Question 2**")
    st.markdown("Use your knowledge gained to decipher the mystery of the images below.")
    st.markdown("What we know:")
    st.markdown("* ID squared was used for one estimate and OK for another")
    st.markdown("* Identical search parameters were used")
    st.markdown("* The variogram has nugget of around 0.3 and most of the variability is accounted for within about 20-30m.")

    st.image("images//interp_OK_q2.jpg")
    st.image("images//interp_ID_q2.jpg")

    est_options = ["Select an Answer",
                   "Estimate A is more variable than estimate B. Estimate A is OK and Estimate B is ID",
                   "Estimate B is more variable than estimate B. Estimate A is OK and Estimate B is ID",
                   "Both estimates have equal variances as they use the same sample data. Estimate A is OK and Estimate B is ID",
                   "Estimate B is more variable than estimate A. Estimate A is ID and Estimate B is OK",]

    st.radio("Select the correct statement", options=est_options, key='est1')