def generate_summary_plot():
#x = [x*0.005 for x in range(0, 200)]
    #y = x
    x = np.arange(0, 10)
    #x = [x*0.005 for x in range(0, 200)]
    y = [i*i for i in x]

    z = [i*3.0 for i in x]

    source = ColumnDataSource(data=dict(x=x, y=y))
    source2 = ColumnDataSource(data=dict(x=x, z=z))

    print(source)
    print(dict(source=source))



    summary_fig = figure(x_axis_location='above', plot_width=400, plot_height=400)
    line_one = summary_fig.line('x', 'y', source=source, line_width=3, line_alpha=0.6)#, xaxis.axis_label = 'initalized')#,axis.axis_label='title')

    line_two = summary_fig.line('x', 'z', source=source2, line_width=3, line_alpha=0.6)#, xaxis.axis_label = 'initalized')#,axis.axis_label='title')

    #selector_options=['alpha','beta','gamma']
    #selector1=Select(title='X-Axis',value=selector_options[0],options=selector_options, callback = callback)
    
    #summary_fig.xaxis.visible = None
    xaxis = LinearAxis(axis_label="Initial x-axis label")
    summary_fig.add_layout(xaxis, 'below')
    #summary_fig.xaxis.axis_label = 'Time (Years)'    
    #selector1.on_change('value',callback)  #plot.yaxis.axis_label = y_title
    #controls = widgetbox([selector1], width=200)

    code1 = '''\
    object.visible = toggle.active
    '''

    code2 = '''\
    object.visible = radio_button.active
    '''

	#var f = cb_obj.value
    callback2 = CustomJS(args=dict(source=source2), code="""
    var data = source.data;
    var f = cb_obj.value
    x = data['x']
    z = data['z']
    if (f == "alpha") {
    	for (i = 0; i < x.length; i++) {
        z[i] = Math.pow(x[i], 3.)}
    	}
    else if (f = "beta") {
   		for (i = 0; i < x.length; i++) {
        z[i] = 20}
     	}
    source.trigger('change');
    """)


    callback3 = CustomJS(args=dict(xaxis=xaxis), code="""
    var f = cb_obj.value
    xaxis.attributes.axis_label = f 
    xaxis.trigger('change');
    """)


    callback4 = CustomJS(args=dict(source=source2), code="""
    var data = source.data;
    var f = cb_obj.value
    x = data['x']
    z = data['z']
    if (f == "A alpha") {
    	for (i = 0; i < x.length; i++) {
        z[i] = Math.pow(x[i], 3.)}
    	}
    else if (f = "B alpha") {
   		for (i = 0; i < x.length; i++) {
        z[i] = 20}
     	}
    source.trigger('change');
    """)



    callback1 = CustomJS.from_coffeescript(code=code1, args={})
    toggle1 = Toggle(label="Green Box", button_type="success", callback=callback1)
    callback1.args = {'toggle': toggle1, 'object': line_one}


    #callback2 = CustomJS.from_coffeescript(code=code2, args={})
    radio_button_group = RadioButtonGroup(labels=['alpha','beta','gamma'], active=0)# callback=callback2)
    radio_button_group.js_on_change('value', callback2)
    #print([method for method in dir(radio_button_group)])
    #callback2.args = {'radio_button': radio_button_group, 'object': line_two}
    #output_file("styling_visible_annotation_with_interaction.html")

    selector_options = ['A alpha', 'B beta', 'G gamma']
    selector1 = Select(title='X-Axis', value=selector_options[0], options=selector_options)#, callback=callback4)
    selector1.js_on_change('value', callback4)


    selector2_options = ['Aa alpha', 'Ba beta', 'Ga gamma']
    selector2 = Select(title='X-Axis', value=selector_options[0], options=selector2_options)#, callback=callback4)
    selector2.js_on_change('value', callback3)

    #slider = Slider(start=0.1, end=4, value=1, step=.1, title="power")
    #slider.js_on_change('value', callback)



    controls = widgetbox([toggle1,radio_button_group, selector1, selector2], width=200)
    layout = row(controls, summary_fig)
    return layout
def main(filename, src, dst, outputFileName):
    df = pd.read_csv(filename)
    df = df.replace(nan, 'unknown')
    valuetype = 'Flows'

    ###########################################################################################
    #####################################   CREATE DF   #######################################

    Csrcval = src
    Cdstval = dst

    dfcountry = df[(df['src_country'] == Csrcval)
                   & (df['dst_country'] == Cdstval)]

    c_ind = list(dfcountry['src_org'].unique())
    c_col = list(dfcountry['dst_org'].unique())
    c_dfFlows = pd.DataFrame(index=c_ind, columns=c_col, data=0)
    c_dfPkts = pd.DataFrame(index=c_ind, columns=c_col, data=0)
    c_dfOcts = pd.DataFrame(index=c_ind, columns=c_col, data=0)
    dftest = dfcountry.groupby(['src_org', 'dst_org']).size()
    for x in dftest.index.values.tolist():
        c_dftemp = dfcountry[(dfcountry['src_org'] == x[0])
                             & (dfcountry['dst_org'] == x[1])]
        print(f'Pkts from {x[0]} to {x[1]}')
        c_dfPkts.at[[x[0]], [x[1]]] = c_dftemp['dPkts'].sum()
        print(c_dftemp['dPkts'].sum())
        print(f'Bytes from {x[0]} to {x[1]}')
        c_dfOcts.at[[x[0]], [x[1]]] = c_dftemp['dOctets'].sum()
        print(c_dftemp['dOctets'].sum())
        print(f'Flows from {x[0]} to {x[1]}')
        c_dfFlows.at[[x[0]], [x[1]]] = len(c_dftemp)
        print(len(c_dftemp))

    #   rename column
    c_dfPkts.columns.name = Cdstval
    c_dfOcts.columns.name = Cdstval
    c_dfFlows.columns.name = Cdstval

    #   create df to be visualized
    dfViz = pd.DataFrame(c_dfFlows.stack(), columns=['value']).reset_index()
    dfViz.columns = ['src_org', 'dst_org', 'value']
    dfViz2 = pd.DataFrame(c_dfPkts.stack(), columns=['value']).reset_index()
    dfViz2.columns = ['src_org', 'dst_org', 'value']
    dfViz3 = pd.DataFrame(c_dfOcts.stack(), columns=['value']).reset_index()
    dfViz3.columns = ['src_org', 'dst_org', 'value']

    ###########################################################################################
    #####################################  COLOR MAP   ########################################

    colors = RdBu(500)
    c_mapper = LinearColorMapper(palette=colors,
                                 low=dfViz.value.min(),
                                 high=dfViz.value.max())
    c_mapper2 = LinearColorMapper(palette=colors,
                                  low=dfViz2.value.min(),
                                  high=dfViz2.value.max())
    c_mapper3 = LinearColorMapper(palette=colors,
                                  low=dfViz3.value.min(),
                                  high=dfViz3.value.max())

    ###########################################################################################
    #####################################  LIST CHECK   #######################################

    srclist = list(dfViz.src_org.unique())
    dstlist = list(dfViz.dst_org.unique())

    if len(srclist) == 1 and len(dstlist) == 1:
        return 1
    else:
        ###########################################################################################
        #######################################   PLOT 1   ########################################

        TOOLS = "hover,save,pan,box_zoom,reset,wheel_zoom,tap"

        c_p = figure(title="Interactive Visualization",
                     x_range=c_ind,
                     y_range=c_col,
                     x_axis_location="above",
                     plot_width=900,
                     plot_height=800,
                     tools=TOOLS,
                     toolbar_location='below',
                     tooltips=[('Source', '@src_org'),
                               ('Destination', '@dst_org'),
                               (valuetype, '@value')])

        c_p.title.align = 'center'
        c_p.grid.grid_line_color = None
        c_p.axis.axis_line_color = 'white'
        c_p.axis.major_tick_line_color = None
        c_p.axis.major_label_text_font_size = "10pt"
        c_p.axis.major_label_standoff = 0
        c_p.xaxis.axis_label = 'Source'
        c_p.yaxis.axis_label = 'Destination'
        c_p.xaxis.major_label_orientation = pi / 3

        c_heatmap = c_p.rect(x='src_org',
                             y='dst_org',
                             width=1,
                             height=1,
                             source=dfViz,
                             fill_color={
                                 'field': 'value',
                                 'transform': c_mapper
                             },
                             line_color='white')

        c_color_bar = ColorBar(color_mapper=c_mapper,
                               major_label_text_font_size="10pt",
                               ticker=BasicTicker(desired_num_ticks=10),
                               label_standoff=12,
                               border_line_color=None,
                               location=(0, 0))
        c_color_bar.formatter.use_scientific = False
        c_p.add_layout(c_color_bar, 'right')

        ###########################################################################################
        #######################################   PLOT 2   ########################################

        valuetype = 'dPkts'

        c_p2 = figure(title="Interactive Visualization",
                      x_range=c_ind,
                      y_range=c_col,
                      x_axis_location="above",
                      plot_width=900,
                      plot_height=800,
                      tools=TOOLS,
                      toolbar_location='below',
                      tooltips=[('Source', '@src_org'),
                                ('Destination', '@dst_org'),
                                (valuetype, '@value')])

        c_p2.title.align = 'center'
        c_p2.grid.grid_line_color = None
        c_p2.axis.axis_line_color = 'white'
        c_p2.axis.major_tick_line_color = None
        c_p2.axis.major_label_text_font_size = "10pt"
        c_p2.axis.major_label_standoff = 0
        c_p2.xaxis.axis_label = 'Source'
        c_p2.yaxis.axis_label = 'Destination'
        c_p2.xaxis.major_label_orientation = pi / 3

        c_heatmap2 = c_p2.rect(x='src_org',
                               y='dst_org',
                               width=1,
                               height=1,
                               source=dfViz2,
                               fill_color={
                                   'field': 'value',
                                   'transform': c_mapper2
                               },
                               line_color='white')

        c_color_bar2 = ColorBar(color_mapper=c_mapper2,
                                major_label_text_font_size="10pt",
                                ticker=BasicTicker(desired_num_ticks=10),
                                label_standoff=12,
                                border_line_color=None,
                                location=(0, 0))
        c_color_bar2.formatter.use_scientific = False
        c_p2.add_layout(c_color_bar2, 'right')

        ###########################################################################################
        #######################################   PLOT 3   ########################################

        valuetype = 'dOctets'

        c_p3 = figure(title="Interactive Visualization",
                      x_range=c_ind,
                      y_range=c_col,
                      x_axis_location="above",
                      plot_width=900,
                      plot_height=800,
                      tools=TOOLS,
                      toolbar_location='below',
                      tooltips=[('Source', '@src_org'),
                                ('Destination', '@dst_org'),
                                (valuetype, '@value')])

        c_p3.title.align = 'center'
        c_p3.grid.grid_line_color = None
        c_p3.axis.axis_line_color = 'white'
        c_p3.axis.major_tick_line_color = None
        c_p3.axis.major_label_text_font_size = "10pt"
        c_p3.axis.major_label_standoff = 0
        c_p3.xaxis.axis_label = 'Source'
        c_p3.yaxis.axis_label = 'Destination'
        c_p3.xaxis.major_label_orientation = pi / 3

        c_heatmap3 = c_p3.rect(x='src_org',
                               y='dst_org',
                               width=1,
                               height=1,
                               source=dfViz3,
                               fill_color={
                                   'field': 'value',
                                   'transform': c_mapper3
                               },
                               line_color='white')

        c_color_bar3 = ColorBar(color_mapper=c_mapper2,
                                major_label_text_font_size="10pt",
                                ticker=BasicTicker(desired_num_ticks=10),
                                label_standoff=12,
                                border_line_color=None,
                                location=(0, 0))
        c_color_bar3.formatter.use_scientific = False
        c_p3.add_layout(c_color_bar3, 'right')

        ###########################################################################################
        ######################################   BUTTONS   ########################################

        homeButton = Button(label="Back to Homepage")

        col = column(c_p, c_p2, c_p3)

        radioBtn = RadioButtonGroup(
            labels=["All", "Flows", "Packets", "Bytes"], active=0, width=300)

        radioCallback = CustomJS(args=dict(plots=[c_p, c_p2, c_p3],
                                           col=col,
                                           radioBtn=radioBtn),
                                 code="""
        const children = []
        if (radioBtn.active == 0) {
             children.push(plots[0])
             children.push(plots[1])
             children.push(plots[2])
        }
        if (radioBtn.active == 1) {
             children.push(plots[0])
        }
        if (radioBtn.active == 2) {
             children.push(plots[1])
        }
        if (radioBtn.active == 3) {
             children.push(plots[2])
        }
        col.children = children
        """)

        radioBtn.js_on_change('active', radioCallback)

        homeButtonCallback = CustomJS(code="""
            window.location.href = "http://engineering.utep.edu:62432";
        """)

        homeButton.js_on_event(events.ButtonClick, homeButtonCallback)
        jsonString = dfViz.to_json(orient='table', index=False)
        callback = CustomJS(args=dict(plots=[c_p, c_p2, c_p3],
                                      src=srclist,
                                      dst=dstlist,
                                      file=filename,
                                      dataframe=jsonString),
                            code="""
        // the event that triggered the callback is cb_obj:
        // The event type determines the relevant attributes
        // console.log('Tap event occurred at x-position: ' + cb_obj.x)
        // console.log('Tap event occurred at y-position: ' + cb_obj.y)
        // console.log('Tap event occurred at y-position: ' + parseInt(cb_obj.y))

        console.log('Tap event occurred at x-position: ' + src[parseInt(cb_obj.x)]);
        console.log('Tap event occurred at y-position: ' + dst[parseInt(cb_obj.y)]);
        console.log('Tap event occurred at value:');
        df = JSON.parse(dataframe);
        console.log(df);
        // console.log(df.data[4]);
        
        function findObjectByKey(array, key1, value1, key2, value2) {
            for (var i = 0; i < array.length; i++) {
                // console.log(i);
                // console.log(array[i][key1]+' : '+value1+' VS '+array[i][key2]+' : '+ value2);
                if (array[i][key1] === value1 && array[i][key2] === value2) {
                    return array[i];
                }
            }
            return null;
        }
        var obj = findObjectByKey(df.data, 'src_org', src[parseInt(cb_obj.x)], 'dst_org', dst[parseInt(cb_obj.y)]);
        
        console.log(obj.value);
        if (obj.value == 0)
        {
            alert('Selected pair has no communication');
            plots[0].reset.emit();
            plots[1].reset.emit();
            plots[2].reset.emit();
        }
        else
        {
            var form = document.createElement('form');
                form.setAttribute('method', 'post');
                form.setAttribute('action', '/asHist');
                form.style.display = 'none';
                var fileName = document.createElement("textarea");
                            fileName.type = "textarea";
                            fileName.name = "FileName";
                            fileName.id = "FileName";
                            fileName.value = file;
                            form.appendChild(fileName);
                var sourceVal = document.createElement("textarea");
                            sourceVal.type = "textarea";
                            sourceVal.name = "SrcVal";
                            sourceVal.id = "SrcVal";
                            sourceVal.value = src[parseInt(cb_obj.x)];
                            form.appendChild(sourceVal);
                var destVal = document.createElement("textarea");
                            destVal.type = "textarea";
                            destVal.name = "DestVal";
                            destVal.id = "DestVal";
                            destVal.value = dst[parseInt(cb_obj.y)];
                            form.appendChild(destVal);
                document.body.appendChild(form);
                console.log(fileName.value);
                console.log(sourceVal.value);
                console.log(destVal.value);
                form.submit();
                plots[0].reset.emit();
                plots[1].reset.emit();
                plots[2].reset.emit();
            }
        """)

        c_p.js_on_event('tap', callback)
        c_p2.js_on_event('tap', callback)
        c_p3.js_on_event('tap', callback)

        ###########################################################################################
        ######################################   OUTPUT   #########################################

        output_file("continent_test.ejs")

        layout = column(row(homeButton, radioBtn), col)

        save(layout, filename=outputFileName, title='Organization Level')
        return 0
                                  return response.json()
                                }).then((predict_data) => {
                                    new_val = predict_data['proba']
                                    console.log('Success:', predict_data)
                                    data['new_y'][0] = new_val.toFixed(1)
                                    data['y_perc'][0] = new_val.toFixed(1)+"%"
                                    source.change.emit()
                                })
                                .catch((err) => {
                                    console.log('Err', err)
                                });
                            
                         """)

# Initiate callback with any value changes
age_radio.js_on_change('active', callback)
sex_radio.js_on_change('active', callback)
country_dropdown.js_on_change('value', callback)
edu_dropdown.js_on_change('value', callback)
n_slider.js_on_change('value', callback)
e_slider.js_on_change('value', callback)
o_slider.js_on_change('value', callback)
c_slider.js_on_change('value', callback)
a_slider.js_on_change('value', callback)
s_slider.js_on_change('value', callback)
i_slider.js_on_change('value', callback)

# List of all sliders
sliders = [
    n_slider,
    e_slider,