Skip to content

Instantly share code, notes, and snippets.

@cornhundred
Last active August 29, 2015 14:24
Show Gist options
  • Save cornhundred/1b9404efc32d6b135fab to your computer and use it in GitHub Desktop.
Save cornhundred/1b9404efc32d6b135fab to your computer and use it in GitHub Desktop.
d3 clustergram with zooming and searching
/* prevents horizontal scrolling */
html {
/*min-width: 1040px;*/
max-width: 100%;
overflow-x: hidden;
}
h1 {
font-size: 45px;
font-weight: 300;
margin-top: 10px;
margin-bottom: 20px;
}
h2 {
margin-top: 2em;
}
/*grey background*/
.background {
fill: #eee;
}
line {
stroke: white;
}
text.active {
font-weight: bold;
}
/*position the title of the columns and rows*/
#col_title{
font-size: 20px;
display: block;
margin-left:140px;
margin-top:2px;
font-weight: 300;
}
#row_title{
font-size:20px;
display: block;
transform:rotate(-90deg );
float:left;
/*this is sensitive to the length of the
row title*/
margin-left: -13px;
margin-top: 300px;
font-weight: 300;
}
#svg_div{
/*margin-top: 0px;*/
/*margin-left: 50px;*/
position:absolute;
top:0px;
left:25px;
/*position:fixed;*/
/*float:left;*/
}
#main_svg{
/*position:fixed;*/
/*top:100px;
left:280px;*/
/*need to reduce this from -47px
not sure why*/
margin-left: 0px;
font-size:8.0px;
display:inline-block;
}
/*try to get auto height*/
#wrapper{
height:100vh;
}
#main_container{
position: relative;
margin-left: 30px;
/*!! need to improve this*/
/*width:100%;*/
/*height:1000px;*/
}
#initial_container{
position:relative;
}
#clust_and_row_container{
/*so that the child div can be positioned absolutely*/
position: relative;
}
/*the viz container is wider
than the initial container
because the sidebar will be closed*/
#viz_container{
position: relative;
/*!! this constraints the width of svg*/
/*width: 80%;*/
/*background-color: blue;*/
}
#clustergram_container{
display: block;
border-style: solid;
border-width: 3px;
border-color: #f5f5f5;
margin-top: 10px;
/*set height here so that it will
look normal with out clustergram*/
/*height: 950px;*/
margin-left: 260px;
}
#clust_instruct_container{
display: block;
padding-left: 10px;
border-left: 0px;
/*border-style: solid;*/
/*border-width: 5px;*/
/*border-color: #f5f5f5;*/
/*set up fixed positions*/
position:absolute;
width:245px;
}
#website_title{
margin-top: 20px;
display: none;
}
#gene_input_box{
height:200px;
width: 75%;
margin: 0 auto;
position:relative;
display:block;
resize:none;
font-size: 15px;
font-weight: 300;
padding-left: 6px;
}
#title_input_gene_list{
width:99%;
margin: 0 auto;
color:white;
text-align: center;
margin-top: 32px;
margin-bottom: 10px;
font-size: 22px;
font-weight: 300;
}
/*title for instructions*/
#title_viz_instruct_text{
width:99%;
margin: 0 auto;
color:#333;
text-align: left;
margin-top: 5px;
padding-top:5px;
margin-bottom: 5px;
font-size: 22px;
font-weight: 300;
/*clear float left*/
clear:both;
}
/* the instructions for the visualization should
look like the input gene list text title*/
.viz_instruct_text{
width:99%;
margin: 0 auto;
color:#333;
text-align: left;
margin-top:10px;
margin-bottom: 10px;
font-size: 14px;
font-weight: 300;
}
.initial_paragraph{
font-size: 20px;
width:590px;
font-weight: 300;
display: none;
}
#title_gmt_menu{
display: none;
color:white;
padding-top:12px;
padding-bottom:12px;
padding-left:20px;
width:410px;
text-align: left;
background: #333333;
font-size: 22px;
font-weight: 300;
}
.h_top{
padding-left:20px;
width:410px;
text-align: left;
background: #8C8C8C;
font-size: 17px;
font-weight: 300;
border-radius: 0;
opacity: 0;
}
.h_medium{
padding-left:30px;
width:410px;
text-align: left;
background: #D0D0D0;
border-radius: 0;
font-size: 15px;
font-weight: 300;
padding-top: 0px;
padding-bottom: 0px;
}
#gmt_menu{
display: none;
margin-top: 20px;
margin-left: 0px;
font-size: 15px;
font-weight: 300;
}
.buttons{
font-size: 15px;
font-weight: 300;
}
.glyph_squares{
float: left;
margin-right: 10px;
margin-top: 0px;
}
#submit_genes_button{
width:141px;
margin-bottom: 10px;
}
/*clear button*/
#clear_input_button{
opacity: 0.90;
}
/*return to previous enrichrgram button*/
#return_prev_button{
width: 140px;
margin-top: 40px;
opacity: 0.9;
}
/*modify enrichrgram*/
#modify_enrichrgram_button{
opacity: 1.0;
}
.form-group{
margin-bottom: 10px;
}
/*footer - shift it with the sidebar*/
#footer_div{
margin-left: 0px;
}
/*title for the visualization*/
#viz_website_title{
font-size: 33px;
}
/*container for gene search box*/
#gene_search_container{
margin-top: 10px;
/*needed for some reason*/
margin-left: 0px;
display: none:;
}
/*gene search box */
#gene_search_box{
width:120px;
/*float:left;*/
/*display: none;*/
}
/*gene search button*/
#gene_search_button{
/*width:50px;*/
/*float:left;*/
margin-top:-2px;
/*display: none;*/
}
/*clear float left*/
#clear{
clear:both;
}
/*fizing jquery autocomplete*/
.ui-menu-item{
float:left;
clear: left;
}
/*move down submit button*/
#gene_search_submit{
margin-top:5px;
}
#toggle_order{
margin-top: 10px;
}
d3.json('example_network.json', function(network_data){
// make global copy of network_data
global_network_data = network_data;
// pass the network data to d3_clustergram
make_d3_clustergram(network_data);
// generate a list of genes for auto complete
////////////////////////////////////////////////
// get all genes
all_genes = [];
// loop through row_nodes
for (i=0; i<row_nodes.length; i++){
all_genes.push( row_nodes[i]['name'] );
};
// use Jquery autocomplete
////////////////////////////////
$( "#gene_search_box" ).autocomplete({
source: all_genes
});
// submit genes button
$("#gene_search_box").keyup(function (e) {
if (e.keyCode == 13) {
// Do something
// console.log('pressed enter');
find_gene_in_clust();
}
});
});
// find gene in clustergram
function find_gene_in_clust(){
// get the searched gene
search_gene = $('#gene_search_box').val();
if (all_genes.indexOf(search_gene) != -1){
// zoom and highlight found gene
/////////////////////////////////
zoom_and_highlight_found_gene(search_gene);
}
};
// make the svg exp map (one value per tile)
function make_d3_clustergram(network_data) {
// remove old visualization
////////////////////////////////
d3.select("#main_svg").remove();
// initialize clustergram variables
initialize_clustergram(network_data)
// display col and row title
d3.select('#row_title').style('display','block');
d3.select('#col_title').style('display','block');
// toggle sidebar to make more space for visualization
d3.select('#wrapper').attr('class','toggled');
// display clustergram_container and clust_instruct_container
d3.select('#clustergram_container').style('display','block');
d3.select('#clust_instruct_container').style('display','block');
// shift the footer left
d3.select('#footer_div')
.style('margin-left','0px');
// // highlight resource types - set up type/color association
// highlight_resource_types();
// define the variable zoom, a d3 method
zoom = d3.behavior.zoom().scaleExtent([1,real_zoom*zoom_switch]).on('zoom',zoomed);
// initialize matrix
/////////////////////////
matrix = [] ;
// initialize matrix
row_nodes.forEach( function(tmp,i) {
matrix[i] = d3.range(col_nodes.length).map(function(j) { return {pos_x: j, pos_y: i, value:0, group:0}; });
});
// Add information to the matrix
network_data.links.forEach( function(link) {
// transfer link information to the new adj matrix
matrix[link.source][link.target].value = link.value;
// transfer group information to the adj matrix
matrix[link.source][link.target].group = 1;
// transfer color
matrix[link.source][link.target].color = link.color;
});
// make clustergram visualization
///////////////////////////////////////
// initailize clust_group with id clust_group
clust_group = d3.select("#svg_div")
.append("svg")
.attr('id', 'main_svg')
// the svg can be larger than the visualization - use svg_height and svg_width
.attr("width", svg_width + margin.left + margin.right + spillover_x_offset)
.attr("height", svg_height + margin.top + margin.bottom)
.attr('border',1)
.call( zoom )
.append("g")
.attr('id', 'clust_group')
.attr("transform", "translate(" + (margin.left) + "," + (margin.top) + ")");
// grey background rect for clustergram
d3.select('#clust_group')
.append("rect")
.attr("class", "background")
.attr('id','grey_background')
.attr("width", svg_width)
.attr("height", viz_height);
// make rows
// use matrix for the data join, which contains a two dimensional
// array of objects, each row of this matrix will be passed into the row function
var row_obj = clust_group.selectAll(".row")
.data(matrix)
.enter()
.append("g")
.attr("class", "row")
.attr("transform", function(d, i) { return "translate(0," + y_scale(i) + ")"; })
.each( row_function );
// white lines in clustergram
/////////////////////////////////
// horizontal lines
row_obj.append('line')
.attr('x2', 20*svg_width)
.style('stroke-width', border_width/zoom_switch+'px')
// append vertical line groups
vert_lines = clust_group
.selectAll('.vert_lines')
.data(col_nodes)
.enter()
.append('g')
.attr('class','vert_lines')
.attr('transform', function(d,i){ return 'translate(' + x_scale(i) + ') rotate(-90)'; })
// add vertical lines
vert_lines
.append('line')
.attr('x1',0)
.attr('x2',-20*viz_height)
.style('stroke-width', border_width+'px')
// row labels
//////////////////////////////////
// white background rect for row labels
d3.select('#main_svg')
.append('rect')
.attr('fill', 'white')
.attr('width', row_label_width+'px')
.attr('height', '3000px')
.attr('class','white_bars');
// append group for row labels
d3.select('#main_svg')
.append("g")
.attr('id', 'row_labels')
.attr("transform", "translate(" + row_margin.left + "," + row_margin.top + ")")
// generate and position the row labels
var row_label_obj = d3.select('#row_labels')
.selectAll('.row_label_text')
.data(row_nodes)
.enter()
.append('g')
.attr('class','row_label_text')
.attr('transform', function(d, i) { return "translate(0," + y_scale(i) + ")"; })
.on('click', reorder_click_row )
.on('mouseover', function(){
// highlight text
d3.select(this).select('text')
.style('font-weight','bold');
})
.on("mouseout", function mouseout() {
d3.select(this).select('text')
.style('font-weight','normal');
// reset highlighted col
d3.select('#clicked_row')
.style('font-weight','bold');
});
// append row label text
row_label_obj
.append('text')
// !! this will be fixed once I have separate x and y scales
// !! can be improved
.attr('y', y_scale.rangeBand()/2 )
.attr('dy', y_scale.rangeBand()/4)
.attr('text-anchor','end')
.style('font-size',default_fs_row+'px')
.text(function(d, i) { return d.name; } )
// append rectangle behind text
row_label_obj
.insert('rect','text')
.attr('x',-10)
.attr('y',0)
.attr('width',10)
.attr('height',10)
.style('opacity',0);
// change the size of the highlighting rects
row_label_obj
.each(function(){
// get the bounding box of the row label text
var bbox = d3.select(this)
.select('text')[0][0]
.getBBox();
// use the bounding box to set the size of the rect
d3.select(this)
.select('rect')
.attr('x', bbox.x*0.5)
.attr('y', 0)
.attr('width', bbox.width*0.5)
.attr('height', y_scale.rangeBand())
.style('fill','yellow')
.style('opacity',0);
});
// col labels
//////////////////////////////////
// white background rect for col labels
d3.select('#main_svg')
.append('rect')
.attr('fill', 'white')
.attr('height', col_label_width+'px')
.attr('width', '3000px')
.attr('class','white_bars');
// append group for column labels
d3.select('#main_svg')
.append("g")
.attr('id', 'col_labels')
.attr("transform", "translate(" + col_margin.left + "," + col_margin.top + ")");
// offset click group column label
x_offset_click = x_scale.rangeBand()/2 + border_width
// reduce width of rotated rects
reduce_rect_width = x_scale.rangeBand()* 0.36
// add main column label group
col_label_obj = d3.select('#col_labels')
.selectAll(".col_label_text")
.data(col_nodes)
.enter()
.append("g")
.attr("class", "col_label_text")
.attr("transform", function(d, i) { return "translate(" + x_scale(i) + ") rotate(-90)"; })
// append group for individual column label
col_label_click = col_label_obj
// append new group for rect and label (not white lines)
.append('g')
.attr('class','col_label_click')
// rotate column labels
.attr('transform', 'translate('+x_scale.rangeBand()/2+','+ x_offset_click +') rotate(45)')
.on('click', reorder_click_col )
.on('mouseover', function(){
// highlight text
d3.select(this).select('text')
.style('font-weight','bold');
})
.on("mouseout", function mouseout() {
// d3.selectAll("text").classed("active", false);
d3.select(this).select('text')
.style('font-weight','normal');
// reset highlighted col
d3.select('#clicked_col')
.style('font-weight','bold');
});
// add column label
col_label_click
.append("text")
.attr("x", 0)
.attr("y", x_scale.rangeBand() / 2)
.attr('dx',2*border_width)
// .attr("dy", ".32em")
.attr("text-anchor", "start")
.attr('full_name',function(d) { return d.name } )
.style('font-size',default_fs_col+'px')
// remove underscores from name
.text(function(d, i) { return d.name.replace(/_/g, ' ') ; });
// append rectangle behind text
col_label_click
.insert('rect','text')
.attr('x',10)
.attr('y',0)
.attr('width',10)
.attr('height',10)
.style('opacity',0);
// change the size of the highlighting rects
col_label_click
.each(function(){
// get the bounding box of the row label text
var bbox = d3.select(this)
.select('text')[0][0]
.getBBox();
// use the bounding box to set the size of the rect
d3.select(this)
.select('rect')
.attr('x', bbox.x*1.25)
.attr('y', 0)
.attr('width', bbox.width*1.25)
// used teh reduced rect width for the columsn
// reduced because thee rects are slanted
.attr('height', x_scale.rangeBand()*0.6)
// .attr('height', reduce_rect_width)
.style('fill','yellow')
.style('opacity',0);
});
// add triangle under rotated labels
col_label_click
.append('path')
.style('stroke-width',0)
.attr('d', function(d) {
// x and y are flipped since its rotated
origin_y = - border_width
start_x = 0;
final_x = x_scale.rangeBand() - reduce_rect_width ;
start_y = -(x_scale.rangeBand() - reduce_rect_width + border_width) ;
final_y = -border_width;
output_string = 'M '+origin_y+',0 L ' + start_y + ',' + start_x + ', L ' + final_y + ','+final_x+' Z';
return output_string;
})
.attr('fill','#eee')
// change the colors of the triangles
// .attr('fill', function(d) {
// // look up color using data_group
// inst_color = res_color_dict[d.name];
// return inst_color;
// });
// Rects to hide spillover
///////////////////////////////
// white rect to cover excess labels
d3.select('#main_svg')
.append('rect')
.attr('fill', 'white')
.attr('width', row_label_width+'px')
.attr('height', col_label_width+'px')
.attr('id','top_left_white');
// hide spillover from right
d3.select('#main_svg')
.append('rect')
.attr('fill', 'white')
.attr('width', '200px')
.attr('height', '3000px')
.attr('transform', function() {
tmp_left = margin.left + svg_width;
// compensate for margin
tmp_top = margin.top - 5;
return 'translate('+tmp_left+','+tmp_top+')'
})
.attr('class','white_bars');
// hide spillover from slanged column labels
d3.select('#main_svg')
.append('path')
.style('stroke-width','0')
// mini-language for drawing path in d3, used to draw triangle
.attr('d', 'M 0,0 L 500,-500, L 500,0 Z')
.attr('fill','white')
.attr('id','slant_traingle')
.attr('transform', function(){
tmp_left = (margin.left + svg_width );
tmp_top = col_label_width ;
return 'translate('+tmp_left+','+tmp_top+')'
})
// initialize zoom and translate
///////////////////////////////////
// initialize translate vector to compensate for label margins
zoom.translate([ margin.left, margin.top]);
// resize window
d3.select(window).on('resize', timeout_resize);
// disable double-click zoom: double click should reset zoom level
// do this for all svg elements
d3.selectAll("svg").on("dblclick.zoom", null);
// double click to reset zoom - add transition
d3.select('#main_svg')
// for some reason, do not put brackets in these functions
.on('dblclick', function(){
// apply the following two translate zoom to reset zoom
// programatically
two_translate_zoom(0,0,1)
} );
};
// row function
function row_function(row_data) {
// generate tiles in the current row
cell = d3.select(this)
// data join
.selectAll(".cell")
.data( row_data )
.enter()
.append("rect")
.attr('class', 'cell')
.attr("x", function(d) { return x_scale(d.pos_x); })
.attr("width", x_scale.rangeBand())
.attr("height", y_scale.rangeBand())
.style("fill-opacity", function(d) {
// calculate output opacity using the opacity scale
output_opacity = opacity_scale( Math.abs(d.value) );
return output_opacity ;
})
// switch the color based on up/dn enrichment
.style('fill', function(d) {
// console.log(d)
return d.value > 0 ? '#FF0000' : '#1C86EE' ;
// if (d.value != 0){
// inst_color = d.color;
// }
// else{
// inst_color = null;
// }
// return inst_color ;
} )
.on("mouseover", function(p) {
d3.selectAll(".row_label_text text").classed("active", function(d, i) { return i == p.pos_y; });
d3.selectAll(".col_label_text text").classed("active", function(d, i) { return i == p.pos_x; });
})
.on("mouseout", function mouseout() {
d3.selectAll("text").classed("active", false);
})
};
function reorder_clust_rank(order_type) {
// load orders
if ( order_type == 'clust' ){
// order by enrichment
x_scale.domain(orders.clust_row);
y_scale.domain(orders.clust_col);
}
else if (order_type == 'rank'){
// order by enrichment
x_scale.domain(orders.rank_row);
y_scale.domain(orders.rank_col);
};
// define the t variable as the transition function
var t = clust_group.transition().duration(2500);
// reorder matrix
t.selectAll(".row")
.attr("transform", function(d, i) { return "translate(0," + y_scale(i) + ")"; })
.selectAll(".cell")
.attr('x', function(d){
return x_scale(d.pos_x);
})
// Move Row Labels
d3.select('#row_labels').selectAll('.row_label_text')
.transition().duration(2500)
.attr('transform', function(d, i) { return 'translate(0,' + y_scale(i) + ')'; });
// t.selectAll(".column")
d3.select('#col_labels').selectAll(".col_label_text")
.transition().duration(2500)
.attr("transform", function(d, i) {
return "translate(" + x_scale(i) + ")rotate(-90)";
});
};
// initialize clustergram: size, scales, etc.
function initialize_clustergram(network_data){
// move network_data information into global variables
col_nodes = network_data.col_nodes ;
row_nodes = network_data.row_nodes ;
inst_links = network_data.links;
// define screen limits
min_screen_width = 800;
max_screen_width = 2500;
// define screen limits
min_viz_width = 400;
max_viz_width = 2000;
min_viz_height = 600;
max_viz_height = 1500;
// initialize visualization size
set_visualization_size();
// font size controls
// scale default font size: input domain is the number of nodes
min_node_num = 10;
max_node_num = 2000;
// // scale col and row font size
// ///////////////////////////////
// // max and min font sizes
// min_fs = 0.01 * scale_fs_screen(screen_width);
// max_fs = 15 * scale_fs_screen(screen_width);
// scale only col font size
///////////////////////////////
// max and min font sizes
min_fs = 0.05;
max_fs = 15;
// output range is the font size
scale_font_size = d3.scale.log().domain([min_node_num,max_node_num]).range([max_fs,min_fs]).clamp('true');
// controls how much the font size is increased by zooming when the number of nodes is at its max
// and zooming is required
// 1: do not increase font size while zooming
// 0: increase font size while zooming
// allow some increase in font size when zooming
min_fs_zoom = 0.95;
// allow full increase in font size when zooming
max_fs_zoom = 0.0;
// define the scaling for the reduce font size factor
scale_reduce_font_size_factor = d3.scale.log().domain([min_node_num,max_node_num]).range([min_fs_zoom,max_fs_zoom]).clamp('true');
// // define the scaling for the zoomability of the adjacency matrix
// scale_zoom = d3.scale.log().domain([min_node_num,max_node_num]).range([2,17]).clamp('true');
// define screen width font size scale
// having a small screen width should reduce the font size of the columns
// this will be compensated by increasing the available real zoom
scale_fs_screen_width = d3.scale.linear().domain( [min_viz_width,max_viz_width]).range([0.75,1.15]).clamp('true');
scale_fs_screen_height = d3.scale.linear().domain([min_viz_width,max_viz_width]).range([0.75,1.15]).clamp('true');
// the default font sizes are set here
default_fs_row = scale_font_size(row_nodes.length)* scale_fs_screen_height(viz_height);
// the colum font size is scaled by the width
default_fs_col = scale_font_size(col_nodes.length)* scale_fs_screen_width(viz_width);
// correct for forcing the tiles to be squares - if they are forced, then use the col font size scaling on the rows
if (force_square == 1){
// scale the row font size by the col scaling
default_fs_row = default_fs_col;
};
// calculate the reduce font-size factor: 0 for no reduction in font size and 1 for full reduction of font size
reduce_font_size_factor_row = scale_reduce_font_size_factor(row_nodes.length);
reduce_font_size_factor_col = scale_reduce_font_size_factor(col_nodes.length);
// set up the real zoom (2d zoom) as a function of the number of col_nodes
// since these are the nodes that are zoomed into in 2d zooming
real_zoom_scale_col = d3.scale.linear().domain([min_node_num,max_node_num]).range([2,5]).clamp('true');
// scale the zoom based on the screen size
// smaller screens can zoom in more, compensates for reduced font size with small screen
real_zoom_scale_screen = d3.scale.linear().domain([min_screen_width,max_screen_width]).range([2,1]).clamp('true');
// calculate the zoom factor - the more nodes the more zooming allowed
real_zoom = real_zoom_scale_col(col_nodes.length)*real_zoom_scale_screen(screen_width);
// set opacity scale
max_link = _.max( inst_links, function(d){ return Math.abs(d.value) } )
opacity_scale = d3.scale.linear().domain([0, Math.abs(max_link.value) ]).clamp(true).range([0.0,1.0]) ;
};
function set_visualization_size(){
// find the label with the most characters and use it to adjust the row and col margins
row_max_char = _.max(row_nodes, function(inst) {return inst.name.length;}).name.length;
col_max_char = _.max(col_nodes, function(inst) {return inst.name.length;}).name.length;
// define label scale parameters: the more characters in the longest name, the larger the margin
min_num_char = 5;
max_num_char = 40;
min_label_width = 60;
max_label_width = 200;
label_scale = d3.scale.linear().domain([min_num_char,max_num_char]).range([min_label_width,max_label_width]).clamp('true');
// set col_label_width and row_label_width
row_label_width = label_scale(row_max_char) ;
triangle_space = 30;
col_label_width = label_scale(col_max_char) + triangle_space ;
// distance between labels and clustergram
label_margin = 5;
// Margins
col_margin = { top:col_label_width - label_margin, right:0, bottom:0, left:row_label_width };
row_margin = { top:col_label_width, right:0, bottom:0, left:row_label_width-label_margin };
margin = { top:col_label_width, right:0, bottom:0, left:row_label_width };
// from http://stackoverflow.com/questions/16265123/resize-svg-when-window-is-resized-in-d3-js
x_window = window.innerWidth ;
y_window = window.innerHeight ;
// set wrapper width and height
d3.select('#wrapper').style('width', x_window);
d3.select('#wrapper').style('height',y_window);
// initalize clutergram container
//
// get screen width
screen_width = Number(d3.select('#wrapper').style('width').replace('px',''));
// get screen height
screen_height = Number(d3.select('#wrapper').style('height').replace('px',''));
// define offsets for permanent row and col margins
// takes into consideration sidebar
// reducing sidebar width, row_offset used to be 280 when left margin was 260
// now, rowoffset is 240 when left margin is reduced to 220 (-40px)
// further reducing width of from 220 to 210px - left margin will be 230px
container_row_offset = 230;
// takes into consideration footer and header margin
container_col_offset = 50;
// adjust container with border
// define width and height of clustergram container
width_clust_container = screen_width - container_row_offset;
height_clust_container = screen_height - container_col_offset;
// Clustergram Container
///////////////////////////////
// set clustergram_container and clust_and_row_container dimensions
// clustergram_container
d3.select('#clustergram_container').style('width', width_clust_container+'px')
d3.select('#clustergram_container').style('height', height_clust_container+'px')
// clust_and_row_container
d3.select('#clust_and_row_container').style('width',width_clust_container+'px')
d3.select('#clust_and_row_container').style('height',height_clust_container+'px')
// SVG
////////////////
// define offset for svg
// compenstates for permanent row and column labels as well
// as x spillover
spillover_x_offset = label_scale(col_max_char)* 0.8 ;
svg_x_offset = 50 + spillover_x_offset;
svg_y_offset = 50;
// svg size: less than container size
// subtract fixed length for permanent col and row labels and variable length for specific col and row labels
svg_width = width_clust_container - svg_x_offset - row_label_width ;
svg_height = height_clust_container - svg_y_offset - col_label_width ;
// define a visualization size, which may be smaller than the svg size if
// there are a small number of rows
// or if there are more columns than rows
//////////////////////////////////////////////////
// viz_width
////////////////////////
// set up a scale that will prevent the visualization
// from stretching a few rows across the entire width
prevent_col_stetch = d3.scale.linear().domain([1,20]).range([0.05,1]).clamp('true');
viz_width = svg_width * prevent_col_stetch(col_nodes.length) ;
// viz_height
////////////////
// ensure that width of rects is not less than height
if (col_nodes.length > row_nodes.length){
// scale the height
viz_height = svg_width*(row_nodes.length/col_nodes.length);
// keep track of whether or not a force square has occurred
// so that I can adjust the font accordingly
// here it has
force_square = 1;
// make sure that this scaling does not cause the viz to be taller
// than the svg
if (viz_height > svg_height){
// make the height equal to the width, to force square tiles - rather than thin tiles that
// are taller than they are wide
viz_height = svg_height;
// keep track of whether or not a force square has occurred
// here it has not
force_square = 0;
};
}
// use the unaltered height
else{
// the height will be calculated normally - leading to wide tiles
viz_height = svg_height;
// keep track of whether or not a force square has occurred
// here it has not
force_square = 0;
};
// scaling functions used to position tiles
x_scale = d3.scale.ordinal().rangeBands([0, viz_width]) ;
y_scale = d3.scale.ordinal().rangeBands([0, viz_height]);
// Sort rows and columns
orders = {
name: d3.range(col_nodes.length).sort(function(a, b) { return d3.ascending( col_nodes[a].name, col_nodes[b].name); }),
// rank
rank_row: d3.range(col_nodes.length).sort(function(a, b) { return col_nodes[b].rank - col_nodes[a].rank; }),
rank_col: d3.range(row_nodes.length).sort(function(a, b) { return row_nodes[b].rank - row_nodes[a].rank; }),
// clustered
// the clust order is stored under sort !!
clust_row: d3.range(col_nodes.length).sort(function(a, b) { return col_nodes[b].sort - col_nodes[a].sort; }),
clust_col: d3.range(row_nodes.length).sort(function(a, b) { return row_nodes[b].sort - row_nodes[a].sort; })
};
// Assign the default sort order for the columns
x_scale.domain(orders.clust_row);
y_scale.domain(orders.clust_col);
// define border width
border_width = x_scale.rangeBand()/16.66;
// define the zoom switch value - use viz_width and viz_height
// switch from 1 to 2d zoom
zoom_switch = (viz_width/col_nodes.length)/(viz_height/row_nodes.length);
};
// recalculate the size of the visualization
// and remake the clustergram
function reset_visualization_size(){
// recalculate the size
set_visualization_size();
// reset zoom and translate
zoom.scale(1).translate([margin.left, margin.top]);
// pass the network data to d3_clustergram
make_d3_clustergram(global_network_data);
// // turn off the wait sign
// $.unblockUI();
};
// define zoomed function
function zoomed() {
// gather transformation components
/////////////////////////////////////
// gather zoom components
zoom_x = d3.event.scale;
zoom_y = d3.event.scale;
// gather translate vector components
trans_x = d3.event.translate[0] - margin.left;
trans_y = d3.event.translate[1] - margin.top;
// apply transformation: no transition duration when zooming with mouse
apply_transformation(trans_x, trans_y, zoom_x, zoom_y, 0);
// reset highlighted col
d3.select('#clicked_col')
// .style('font-size',default_fs_col*1.25)
.style('font-weight','bold');
};
// apply transformation
function apply_transformation(trans_x, trans_y, zoom_x, zoom_y, duration){
// define d3 scale
d3_scale = zoom_x ;
// y - rules
///////////////////////////////////////////////////
// available panning room in the y direction
// multiple extra room (zoom - 1) by the width
// always defined in the same way
pan_room_y = (d3_scale - 1) * svg_height ;
// if the transformation is from a gene search, the remove pan_room_y restriction
if (duration > 0){
// set pan_room_y to svg_height - removing restriction
pan_room_y = svg_height;
};
// do not translate if translate in y direction is positive
if (trans_y >= 0 ) {
console.log('\nrestrict panning in the positive y direction')
console.log(trans_y)
// restrict transformation parameters
// no panning in either direction
trans_y = 0;
}
// restrict y pan to pan_room_y if necessary
else if (trans_y <= -pan_room_y) {
trans_y = -pan_room_y;
console.log('\nrestrict y panning based on y panning ')
};
// x - rules
///////////////////////////////////////////////////
// zoom in y direction only - translate in y only
if (d3_scale < zoom_switch) {
// no x translate or zoom
trans_x = 0;
zoom_x = 1;
}
// zoom in both directions
// scale is greater than zoom_switch
else{
// available panning room in the x direction
// multiple extra room (zoom - 1) by the width
pan_room_x = (d3_scale/zoom_switch - 1) * svg_width ;
// no panning in the positive direction
if (trans_x > 0){
// restrict transformation parameters
// no panning in the x direction
trans_x = 0;
// set zoom_x
zoom_x = d3_scale/zoom_switch;
}
// restrict panning to pan_room_x
else if (trans_x <= -pan_room_x){
// restrict transformation parameters
// no panning in the x direction
trans_x = -pan_room_x;
// set zoom_x
zoom_x = d3_scale/zoom_switch;
}
// allow two dimensional panning
else{
// restrict transformation parameters
// set zoom_x
zoom_x = d3_scale/zoom_switch;
};
};
// apply transformation and reset translate vector
// the zoom vector (zoom.scale) never gets reset
///////////////////////////////////////////////////
// translate clustergram
clust_group
.attr('transform','translate(' + [ margin.left + trans_x, margin.top + trans_y ] + ') scale('+ zoom_x +',' + zoom_y + ')');
// transform row labels
d3.select('#row_labels')
.attr('transform','translate(' + [row_margin.left , margin.top + trans_y] + ') scale(' + zoom_y + ')');
// transform col labels
// move down col labels as zooming occurs, subtract trans_x - 20 almost works
d3.select('#col_labels')
.attr('transform','translate(' + [col_margin.left + trans_x , col_margin.top] + ') scale(' + zoom_x + ')');
// reset translate vector - add back margins to trans_x and trans_y
zoom
.translate([ trans_x + margin.left, trans_y + margin.top]);
// Font Sizes
//////////////////
// reduce the font size by dividing by some part of the zoom
// if reduce_font_size_factor_ is 1, then the font will be divided by the whole zoom - and the labels will not increase in size
// if reduce_font_size_factor_ is 0, then the font will be divided 1 - and the labels will increase cuction of the font size
reduce_font_size = d3.scale.linear().domain([0,1]).range([1,zoom_y]).clamp('true');
// scale down the font to compensate for zooming
fin_font = default_fs_row/(reduce_font_size(reduce_font_size_factor_row));
// add back the 'px' to the font size
fin_font = fin_font + 'px';
// change the font size of the labels
d3.selectAll('.row_label_text')
.select('text')
.style('font-size', fin_font);
// re-size of the highlighting rects
d3.select('#row_labels')
.each(function(){
// get the bounding box of the row label text
var bbox = d3.select(this)
.select('text')[0][0]
.getBBox();
// use the bounding box to set the size of the rect
d3.select(this)
.select('rect')
.attr('x', bbox.x*0.5)
.attr('y', 0)
.attr('width', bbox.width*0.5)
.attr('height', y_scale.rangeBand())
.style('fill','yellow');
});
// reduce font-size to compensate for zoom
// calculate the recuction of the font size
reduce_font_size = d3.scale.linear().domain([0,1]).range([1,zoom_x]).clamp('true');
// scale down the font to compensate for zooming
fin_font = default_fs_col/(reduce_font_size(reduce_font_size_factor_col));
// add back the 'px' to the font size
fin_font = fin_font + 'px';
// change the font size of the labels
d3.selectAll('.col_label_text')
.select('text')
.style('font-size', fin_font);
// change the size of the highlighting rects
// col_label_click
d3.select('#col_labels')
.each(function(){
// get the bounding box of the row label text
var bbox = d3.select(this)
.select('text')[0][0]
.getBBox();
// use the bounding box to set the size of the rect
d3.select(this)
.select('rect')
.attr('x', bbox.x*1.25)
.attr('y', 0)
.attr('width', bbox.width * 1.25)
// used teh reduced rect width for the columsn
// reduced because thee rects are slanted
.attr('height', x_scale.rangeBand()*0.6)
.style('fill','yellow')
.style('opacity',0);
});
};
// reorder columns with row click
function reorder_click_row(d,i){
// get inst row (gene)
inst_gene = d3.select(this).select('text').text();
// highlight clicked column
// first un-highlight all others
d3.selectAll('.rol_label_text').select('text')
.style('font-weight','normal');
// remove previous id
d3.select('#clicked_row')
.attr('id','');
// highlight current
d3.select(this).select('text')
.style('font-weight','bold')
.attr('id','clicked_row');
// find the row number of this term from row_nodes
// gather row node names
tmp_arr = []
for (i=0; i<row_nodes.length; i++){
tmp_arr.push(row_nodes[i].name);
}
// find index
inst_row = _.indexOf( tmp_arr, inst_gene );
// gather the values of the input genes
tmp_arr = [];
for (j=0; j<col_nodes.length; j++) {
tmp_arr.push(matrix[inst_row][j].value);
}
// sort the rows
tmp_sort = d3.range( tmp_arr.length ).sort(function(a, b) { return tmp_arr[b] - tmp_arr[a]; })
// resort the columns (resort x)
x_scale.domain(tmp_sort);
// reorder
////////////////////
// define the t variable as the transition function
var t = clust_group.transition().duration(2500);
// reorder matrix
t.selectAll(".cell")
.attr('x', function(d){
return x_scale(d.pos_x);
});
// Move Row Labels
d3.select('#col_labels').selectAll(".col_label_text")
.transition().duration(2500)
.attr("transform", function(d, i) {
return "translate(" + x_scale(i) + ")rotate(-90)";
});
// // zoom into and highlight selected row
// zoom_and_highlight_found_gene(inst_gene);
};
// reorder rows with column click
function reorder_click_col(d,i){
// get inst col (term)
inst_term = d3.select(this).select('text').attr('full_name')
// highlight clicked column
// first un-highlight all others
d3.selectAll('.col_label_text').select('text')
.style('font-weight','normal');
// remove previous id
d3.select('#clicked_col')
.attr('id','');
// highlight current
d3.select(this).select('text')
.style('font-weight','bold')
.attr('id','clicked_col');
// find the column number of this term from col_nodes
// gather column node names
tmp_arr = []
for (i=0; i<col_nodes.length; i++){
tmp_arr.push(col_nodes[i].name);
};
// find index
inst_col = _.indexOf( tmp_arr, inst_term );
// gather the values of the input genes
tmp_arr = [];
for (i=0; i<row_nodes.length; i++) {
tmp_arr.push(matrix[i][inst_col].value);
};
// sort the rows
tmp_sort = d3.range( tmp_arr.length).sort(function(a, b) { return tmp_arr[b] - tmp_arr[a]; })
// resort rows - y axis
y_scale.domain(tmp_sort);
// reorder
// define the t variable as the transition function
var t = clust_group.transition().duration(2500);
// reorder matrix
t.selectAll(".row")
.attr("transform", function(d, i) { return "translate(0," + y_scale(i) + ")"; })
.selectAll(".cell")
.attr('x', function(d){
return x_scale(d.pos_x);
})
// Move Row Labels
//
d3.select('#row_labels').selectAll('.row_label_text')
.transition().duration(2500)
.attr('transform', function(d, i) { return 'translate(0,' + y_scale(i) + ')'; });
// t.selectAll(".column")
d3.select('#col_labels').selectAll(".col_label_text")
.transition().duration(2500)
.attr("transform", function(d, i) {
return "translate(" + x_scale(i) + ")rotate(-90)";
});
// highlight selected column
///////////////////////////////
// unhilight and unbold all columns (already unbolded earlier)
d3.selectAll('.col_label_text')
.select('rect')
.style('opacity',0);
// highlight column name
d3.select(this)
.select('rect')
.style('opacity',1);
};
// resize clustergram with screensize change
var doit;
function timeout_resize(){
// clear timeout
clearTimeout(doit);
// // set up wait message before request is made
// $.blockUI({ css: {
// border: 'none',
// padding: '15px',
// backgroundColor: '#000',
// '-webkit-border-radius': '10px',
// '-moz-border-radius': '10px',
// opacity: .8,
// color: '#fff'
// } });
doit = setTimeout( reset_visualization_size, 500) ;
};
// interpolate pan and zoom
function interpolate_pan_zoom(pan_dx, pan_dy, fin_zoom){
};
function two_translate_zoom(pan_dx, pan_dy, fin_zoom){
console.log('two_translate_zoom')
console.log('pan_dx: '+String(pan_dx))
console.log('pan_dy: '+String(pan_dy))
console.log('fin_zoom: '+String(fin_zoom))
// define the commonly used variable half_height
var half_height = viz_height/2 ;
// y pan room, the pan room has to be less than half_height since
// zooming in on a gene that is near the top of the clustergram also causes
// panning out of the visible region
var y_pan_room = ((half_height)/zoom_switch);
// prevent visualization from panning down too much
// when zooming into genes near the top of the clustergram
if (pan_dy >= half_height - y_pan_room){
console.log('restricting pan down')
// prevent the clustergram from panning down too much
// if the amount of panning is equal to the half_height then it needs to be reduced
// effectively, the the visualization needs to be moved up (negative) by some factor
// of the half width of the visualization. If there was no zooming involved, then the
// visualization would be centered first, then panned to center the top term, then
// the correction would re-center it. However, because of the zooming the offset is
// reduced by the zoom factor (this is because the panning is occurring on something
// that will be zoomed into - this is why the pan_dy value is not scaled in the two
// translate transformations, but it has to be scaled afterwards to set the translate
// vector)
// pan_dy = half_height - (half_height)/zoom_switch
// if pan_dy is greater than the pan room, then panning has to be restricted
// start by shifting back up (negative) by half_height/zoom_switch then shift bak down
// by the difference between half_height and pan_dy (so that the top of the clustergram is
// visible)
var shift_top_viz = half_height - pan_dy ;
var shift_up_viz = - half_height/zoom_switch + shift_top_viz ;
// reduce pan_dy so that the visualization does not get panned to far down
pan_dy = pan_dy + shift_up_viz ;
};
// prevent visualization from panning up too much
// when zooming into genes at the bottom of the clustergram
if (pan_dy < -(half_height - y_pan_room) ){
console.log('restricting pan up')
var shift_top_viz = half_height + pan_dy ;
// does not seem to be needed
/////////
// move up by one row height
// var move_up_one_row = y_scale.rangeBand();
// // do not move up one row if the clustergram is square
// if (zoom_switch == 1){
// move_up_one_row = 0;
// };
var shift_up_viz = half_height/zoom_switch - shift_top_viz; //- move_up_one_row;
// reduce pan_dy so that the visualization does not get panned to far down
pan_dy = pan_dy + shift_up_viz ;
};
// will improve this !!
zoom_y = fin_zoom;
zoom_x = 1;
// search duration - the duration of zooming and panning
search_duration =700;
// center_y
center_y = -(zoom_y -1)*half_height;
// console.log('\ncenter_y\t'+center_y+'\n')
// console.log('\npan_dy\t'+pan_dy+'\n')
// transform clsut group
clust_group
.transition()
.duration(search_duration)
// first apply the margin transformation
// then zoom, then apply the final transformation
.attr('transform', 'translate(' + [ margin.left, margin.top + center_y ] + ')'+' scale('+ 1 +',' + zoom_y + ')'+'translate(' + [ pan_dx, pan_dy ] + ')');
// transform row labels
d3.select('#row_labels')
.transition()
.duration(search_duration)
.attr('transform', 'translate(' + [ row_margin.left, margin.top + center_y ] + ')'+' scale('+ zoom_y +',' + zoom_y + ')'+'translate(' + [ 0, pan_dy ] + ')');
// transform col labels
// move down col labels as zooming occurs, subtract trans_x - 20 almost works
d3.select('#col_labels')
.transition()
.duration(search_duration)
// .attr('transform','translate(' + [col_margin.left + pan_dx , col_margin.top] + ') scale(' + 1 + ')');
.attr('transform', 'translate(' + [ col_margin.left, col_margin.top ] + ')'+' scale('+ 1 +',' + 1 + ')'+'translate(' + [ pan_dx, 0 ] + ')');
// Font Sizes
//////////////////
// reduce font-size to compensate for zoom
// calculate the recuction of the font size
reduce_font_size = d3.scale.linear().domain([0,1]).range([1,zoom_y]).clamp('true');
// scale down the font to compensate for zooming
fin_font = default_fs_row/(reduce_font_size(reduce_font_size_factor_row));
// add back the 'px' to the font size
fin_font = fin_font + 'px';
// change the font size of the labels
d3.selectAll('.row_label_text')
.transition()
.duration(search_duration)
.select('text')
.style('font-size', fin_font);
// resize the highlighting bar when performing two transition zoom
// re-size of the highlighting rects
d3.select('#row_labels')
.each(function(){
// get the bounding box of the row label text
var bbox = d3.select(this)
.select('text')[0][0]
.getBBox();
// use the bounding box to set the size of the rect
d3.select(this)
.select('rect')
.attr('x', bbox.x*0.5)
.attr('y', 0)
.attr('width', bbox.width*0.5)
.attr('height', y_scale.rangeBand())
.style('fill','yellow');
});
// reduce font-size to compensate for zoom
// calculate the recuction of the font size
reduce_font_size = d3.scale.linear().domain([0,1]).range([1,zoom_x]).clamp('true');
// scale down the font to compensate for zooming
fin_font = default_fs_col/(reduce_font_size(reduce_font_size_factor_col));
// add back the 'px' to the font size
fin_font = fin_font + 'px';
// change the font size of the labels
d3.selectAll('.col_label_text')
.transition()
.duration(search_duration)
.select('text')
.style('font-size', fin_font);
// set y translate: center_y is positive, positive moves the visualization down
// the translate vector has the initial margin, the first y centering, and pan_dy
// times the scaling zoom_y
var net_y_offset = margin.top + center_y + pan_dy * zoom_y ;
// reset the zoom translate and zoom
zoom.scale(zoom_y);
zoom.translate([ pan_dx, net_y_offset])
};
// zoom into and highlight the found the gene
function zoom_and_highlight_found_gene(search_gene){
// unhighlight and unbold all genes
d3.selectAll('.row_label_text')
.select('text')
.style('font-weight','normal');
d3.selectAll('.row_label_text')
.select('rect')
.style('opacity',0);
// find the index of the gene
inst_gene_index = _.indexOf( all_genes, search_gene );
// get y position
inst_y_pos = y_scale(inst_gene_index) ;
// make row name bold
d3.selectAll('.row_label_text')
.filter(function(d){ return d.name == search_gene})
.select('text')
.style('font-weight','bold');
// highlight row name
d3.selectAll('.row_label_text')
.filter(function(d){ return d.name == search_gene})
.select('rect')
.style('opacity',1);
// calculate the y panning required to center the found gene
pan_dy = viz_height/2 - inst_y_pos;
// use two translate method to control zooming
// pan_x, pan_y, zoom
two_translate_zoom(0, pan_dy, zoom_switch );
};
{
"row_nodes": [
{
"sort": 25,
"name": "CDK4"
},
{
"sort": 29,
"name": "LMTK3"
},
{
"sort": 31,
"name": "LRRK2"
},
{
"sort": 6,
"name": "UHMK1"
},
{
"sort": 23,
"name": "EGFR"
},
{
"sort": 19,
"name": "STK32A"
},
{
"sort": 26,
"name": "NRK"
},
{
"sort": 16,
"name": "ERBB2"
},
{
"sort": 7,
"name": "ERBB4"
},
{
"sort": 18,
"name": "AAK1"
},
{
"sort": 3,
"name": "SRPK3"
},
{
"sort": 5,
"name": "STK39"
},
{
"sort": 2,
"name": "GRK4"
},
{
"sort": 24,
"name": "TBK1"
},
{
"sort": 33,
"name": "INSRR"
},
{
"sort": 15,
"name": "IRAK1"
},
{
"sort": 20,
"name": "KDR"
},
{
"sort": 35,
"name": "NPR1"
},
{
"sort": 27,
"name": "PAK3"
},
{
"sort": 11,
"name": "PDGFRA"
},
{
"sort": 34,
"name": "PDK4"
},
{
"sort": 8,
"name": "ULK4"
},
{
"sort": 30,
"name": "PRKCE"
},
{
"sort": 0,
"name": "PRKG2"
},
{
"sort": 36,
"name": "MAPK4"
},
{
"sort": 12,
"name": "MAPK11"
},
{
"sort": 21,
"name": "STK31"
},
{
"sort": 37,
"name": "GRK1"
},
{
"sort": 17,
"name": "ROS1"
},
{
"sort": 22,
"name": "MAP2K4"
},
{
"sort": 28,
"name": "SRC"
},
{
"sort": 13,
"name": "TGFBR1"
},
{
"sort": 4,
"name": "CAMK2B"
},
{
"sort": 14,
"name": "STK24"
},
{
"sort": 1,
"name": "DCLK3"
},
{
"sort": 32,
"name": "LATS1"
},
{
"sort": 10,
"name": "NEK9"
},
{
"sort": 9,
"name": "MYLK3"
}
],
"col_nodes": [
{
"sort": 2,
"name": "Cell-A"
},
{
"sort": 13,
"name": "Cell-B"
},
{
"sort": 15,
"name": "Cell-C"
},
{
"sort": 24,
"name": "Cell-D"
},
{
"sort": 21,
"name": "Cell-E"
},
{
"sort": 12,
"name": "Cell-F"
},
{
"sort": 16,
"name": "Cell-G"
},
{
"sort": 22,
"name": "Cell-H"
},
{
"sort": 1,
"name": "Cell-I"
},
{
"sort": 25,
"name": "Cell-J"
},
{
"sort": 9,
"name": "Cell-K"
},
{
"sort": 6,
"name": "Cell-L"
},
{
"sort": 7,
"name": "Cell-LM"
},
{
"sort": 4,
"name": "Cell-N"
},
{
"sort": 20,
"name": "Cell-O"
},
{
"sort": 8,
"name": "Cell-P"
},
{
"sort": 26,
"name": "Cell-Q"
},
{
"sort": 5,
"name": "Cell-R"
},
{
"sort": 18,
"name": "Cell-S"
},
{
"sort": 19,
"name": "Cell-T"
},
{
"sort": 0,
"name": "Cell-U"
},
{
"sort": 27,
"name": "Cell-V"
},
{
"sort": 10,
"name": "Cell-W"
},
{
"sort": 17,
"name": "Cell-X"
},
{
"sort": 23,
"name": "Cell-Y"
},
{
"sort": 3,
"name": "Cell-Z"
},
{
"sort": 14,
"name": "Cell-Alpha"
},
{
"sort": 11,
"name": "Cell-Beta"
},
{
"sort": 28,
"name": "Cell-Gamma"
}
],
"links": [
{
"source": 0,
"target": 0,
"value": -0.79280357071994445
},
{
"source": 0,
"target": 1,
"value": 0.5276871273173751
},
{
"source": 0,
"target": 2,
"value": 0.00062253607658903766
},
{
"source": 0,
"target": 3,
"value": 0.35672259362868541
},
{
"source": 0,
"target": 4,
"value": 0.93328608848913241
},
{
"source": 0,
"target": 5,
"value": -0.13172853843578483
},
{
"source": 0,
"target": 6,
"value": 0.80845194436217926
},
{
"source": 0,
"target": 7,
"value": 4.2408848010614593
},
{
"source": 0,
"target": 8,
"value": -0.54023139103679019
},
{
"source": 0,
"target": 9,
"value": -0.98145695162906854
},
{
"source": 0,
"target": 10,
"value": -0.84689891963046593
},
{
"source": 0,
"target": 11,
"value": -0.25279592053737437
},
{
"source": 0,
"target": 12,
"value": 0.11418958145806719
},
{
"source": 0,
"target": 13,
"value": -0.06649884010226613
},
{
"source": 0,
"target": 14,
"value": 0.14921880892742811
},
{
"source": 0,
"target": 15,
"value": 1.3512639239821354
},
{
"source": 0,
"target": 16,
"value": 0.64586721165502892
},
{
"source": 0,
"target": 17,
"value": 0.60561097961302579
},
{
"source": 0,
"target": 18,
"value": 3.2324545728435634
},
{
"source": 0,
"target": 19,
"value": 0.3426345717805151
},
{
"source": 0,
"target": 20,
"value": -0.43091232397466439
},
{
"source": 0,
"target": 21,
"value": -0.40590567035253017
},
{
"source": 0,
"target": 22,
"value": 0.1995639894778983
},
{
"source": 0,
"target": 23,
"value": -1.1225362940944899
},
{
"source": 0,
"target": 24,
"value": 2.2103345707449331
},
{
"source": 0,
"target": 25,
"value": 0.40512631533788812
},
{
"source": 0,
"target": 26,
"value": -0.089763158866853945
},
{
"source": 0,
"target": 27,
"value": 0.40512631533788812
},
{
"source": 0,
"target": 28,
"value": 0.34001277266154079
},
{
"source": 1,
"target": 0,
"value": 0.17762053959848464
},
{
"source": 1,
"target": 1,
"value": -0.016061489396007614
},
{
"source": 1,
"target": 2,
"value": 5.4221138328336593
},
{
"source": 1,
"target": 3,
"value": 1.3070396753123885
},
{
"source": 1,
"target": 4,
"value": 0.35581498543613976
},
{
"source": 1,
"target": 5,
"value": 0.2769049941535629
},
{
"source": 1,
"target": 6,
"value": 0.48315391467861052
},
{
"source": 1,
"target": 7,
"value": -0.24049582068449935
},
{
"source": 1,
"target": 8,
"value": 1.3364459962243971
},
{
"source": 1,
"target": 9,
"value": 1.1496185020456025
},
{
"source": 1,
"target": 10,
"value": 0.36141297771984754
},
{
"source": 1,
"target": 11,
"value": -0.38051893830998673
},
{
"source": 1,
"target": 12,
"value": -0.21354100398892945
},
{
"source": 1,
"target": 13,
"value": -0.47193863890754462
},
{
"source": 1,
"target": 14,
"value": -0.6208587227922101
},
{
"source": 1,
"target": 15,
"value": -0.16363705810933626
},
{
"source": 1,
"target": 16,
"value": -0.48725614162831404
},
{
"source": 1,
"target": 17,
"value": -0.029569688167563682
},
{
"source": 1,
"target": 18,
"value": -0.23205777836057637
},
{
"source": 1,
"target": 19,
"value": -0.66903693872996783
},
{
"source": 1,
"target": 20,
"value": -0.44924169795631413
},
{
"source": 1,
"target": 21,
"value": 1.1589304059203607
},
{
"source": 1,
"target": 22,
"value": 0.51196202164306703
},
{
"source": 1,
"target": 23,
"value": 2.3708341544955944
},
{
"source": 1,
"target": 24,
"value": 0.2628938851270784
},
{
"source": 1,
"target": 25,
"value": -0.51312889485993041
},
{
"source": 1,
"target": 26,
"value": -0.50121006843922289
},
{
"source": 1,
"target": 27,
"value": 0.43927756080486419
},
{
"source": 1,
"target": 28,
"value": -0.34246050831831365
},
{
"source": 2,
"target": 0,
"value": -0.69787615079462439
},
{
"source": 2,
"target": 1,
"value": -0.55561026516364687
},
{
"source": 2,
"target": 2,
"value": -0.36049755900448188
},
{
"source": 2,
"target": 3,
"value": -0.46023673138460119
},
{
"source": 2,
"target": 4,
"value": -0.68076069745606693
},
{
"source": 2,
"target": 5,
"value": -0.16946351812432453
},
{
"source": 2,
"target": 6,
"value": 1.7157088748188867
},
{
"source": 2,
"target": 7,
"value": -0.51710482252738332
},
{
"source": 2,
"target": 8,
"value": 0.18498770876267084
},
{
"source": 2,
"target": 9,
"value": 0.81065969989987596
},
{
"source": 2,
"target": 10,
"value": -0.4403344482295401
},
{
"source": 2,
"target": 11,
"value": -0.62105202593804487
},
{
"source": 2,
"target": 12,
"value": -0.08680335802599258
},
{
"source": 2,
"target": 13,
"value": -0.75396622537536251
},
{
"source": 2,
"target": 14,
"value": -0.40197203674109983
},
{
"source": 2,
"target": 15,
"value": -0.56208675197813585
},
{
"source": 2,
"target": 16,
"value": -0.56064459715645421
},
{
"source": 2,
"target": 17,
"value": 0.54230138065896738
},
{
"source": 2,
"target": 18,
"value": -0.38263914509807345
},
{
"source": 2,
"target": 19,
"value": -0.37785352331772326
},
{
"source": 2,
"target": 20,
"value": -0.71347292309228294
},
{
"source": 2,
"target": 21,
"value": -0.37760936823736257
},
{
"source": 2,
"target": 22,
"value": 4.3089045810415065
},
{
"source": 2,
"target": 23,
"value": -0.63813194924625205
},
{
"source": 2,
"target": 24,
"value": -0.55611406277349529
},
{
"source": 2,
"target": 25,
"value": -0.31814576282612061
},
{
"source": 2,
"target": 26,
"value": -0.48958271440166728
},
{
"source": 2,
"target": 27,
"value": 1.677376527202282
},
{
"source": 2,
"target": 28,
"value": -0.68279046431816848
},
{
"source": 3,
"target": 0,
"value": 0.85054651798655911
},
{
"source": 3,
"target": 1,
"value": -0.26327990722265576
},
{
"source": 3,
"target": 2,
"value": 0.17925303114512892
},
{
"source": 3,
"target": 3,
"value": 0.3986467213210621
},
{
"source": 3,
"target": 4,
"value": 1.5376638021420654
},
{
"source": 3,
"target": 5,
"value": 0.50529141074732487
},
{
"source": 3,
"target": 6,
"value": 0.90236649093222976
},
{
"source": 3,
"target": 7,
"value": -0.16628803048376897
},
{
"source": 3,
"target": 8,
"value": 0.6307305635564584
},
{
"source": 3,
"target": 9,
"value": 0.39944828258949999
},
{
"source": 3,
"target": 10,
"value": 0.84717136721114061
},
{
"source": 3,
"target": 11,
"value": -0.44226809397610295
},
{
"source": 3,
"target": 12,
"value": 0.44368676013665698
},
{
"source": 3,
"target": 13,
"value": 1.5529690293194427
},
{
"source": 3,
"target": 14,
"value": 1.1102834831685739
},
{
"source": 3,
"target": 15,
"value": -0.32669807168280007
},
{
"source": 3,
"target": 16,
"value": -0.40526737390827677
},
{
"source": 3,
"target": 17,
"value": 0.66374718334548766
},
{
"source": 3,
"target": 18,
"value": 0.42447003249962129
},
{
"source": 3,
"target": 19,
"value": 0.28322189866603376
},
{
"source": 3,
"target": 20,
"value": -4.2439739210356375
},
{
"source": 3,
"target": 21,
"value": 0.71831557801565482
},
{
"source": 3,
"target": 22,
"value": 1.747343932843179
},
{
"source": 3,
"target": 23,
"value": -1.0209271748558673
},
{
"source": 3,
"target": 24,
"value": 0.30502851372863299
},
{
"source": 3,
"target": 25,
"value": 1.4717461296230399
},
{
"source": 3,
"target": 26,
"value": 0.048902278326993481
},
{
"source": 3,
"target": 27,
"value": -0.25528355571478428
},
{
"source": 3,
"target": 28,
"value": 0.54822457317897
},
{
"source": 4,
"target": 0,
"value": 1.4124162155297895
},
{
"source": 4,
"target": 1,
"value": 0.018987506305098458
},
{
"source": 4,
"target": 2,
"value": 0.90225162234111
},
{
"source": 4,
"target": 3,
"value": -0.17813746973864777
},
{
"source": 4,
"target": 4,
"value": 0.78181902226709887
},
{
"source": 4,
"target": 5,
"value": 0.21181589529950623
},
{
"source": 4,
"target": 6,
"value": -0.023427174986084043
},
{
"source": 4,
"target": 7,
"value": 3.5572959521156271
},
{
"source": 4,
"target": 8,
"value": 1.1737835557113261
},
{
"source": 4,
"target": 9,
"value": -0.012362163782260113
},
{
"source": 4,
"target": 10,
"value": 0.76978248407923711
},
{
"source": 4,
"target": 11,
"value": -0.68103174291392954
},
{
"source": 4,
"target": 12,
"value": -1.0473753890032489
},
{
"source": 4,
"target": 13,
"value": 0.65206549909898781
},
{
"source": 4,
"target": 14,
"value": 0.17231669120304641
},
{
"source": 4,
"target": 15,
"value": 2.0724334685508401
},
{
"source": 4,
"target": 16,
"value": 1.1357093773571376
},
{
"source": 4,
"target": 17,
"value": -0.1699771808182842
},
{
"source": 4,
"target": 18,
"value": 0.88106713588195174
},
{
"source": 4,
"target": 19,
"value": -0.48615902453705612
},
{
"source": 4,
"target": 20,
"value": -1.4518380255770171
},
{
"source": 4,
"target": 21,
"value": 0.37123773742761684
},
{
"source": 4,
"target": 22,
"value": -0.58166532527519088
},
{
"source": 4,
"target": 23,
"value": -0.12635615698050082
},
{
"source": 4,
"target": 24,
"value": 0.24100472446572258
},
{
"source": 4,
"target": 25,
"value": 1.0652691898012903
},
{
"source": 4,
"target": 26,
"value": 0.97453179596543615
},
{
"source": 4,
"target": 27,
"value": 0.66864509105261871
},
{
"source": 4,
"target": 28,
"value": 0.056964890457925216
},
{
"source": 5,
"target": 0,
"value": -0.3880396649753497
},
{
"source": 5,
"target": 1,
"value": -0.59262661359990065
},
{
"source": 5,
"target": 2,
"value": -0.24413650957478913
},
{
"source": 5,
"target": 3,
"value": 0.74036473404965863
},
{
"source": 5,
"target": 4,
"value": 3.0233484146463874
},
{
"source": 5,
"target": 5,
"value": -0.43398541211522546
},
{
"source": 5,
"target": 6,
"value": -0.63012445731287781
},
{
"source": 5,
"target": 7,
"value": 1.1565319832601335
},
{
"source": 5,
"target": 8,
"value": 0.43369621308178047
},
{
"source": 5,
"target": 9,
"value": 3.8495078196785815
},
{
"source": 5,
"target": 10,
"value": -0.22542574181243294
},
{
"source": 5,
"target": 11,
"value": -0.65610680843073921
},
{
"source": 5,
"target": 12,
"value": -0.31195335744328251
},
{
"source": 5,
"target": 13,
"value": -0.39745022554650355
},
{
"source": 5,
"target": 14,
"value": 1.0440255384278041
},
{
"source": 5,
"target": 15,
"value": -0.24781691219337323
},
{
"source": 5,
"target": 16,
"value": 3.6405243454378913
},
{
"source": 5,
"target": 17,
"value": -0.59251039035931363
},
{
"source": 5,
"target": 18,
"value": 0.51466624466275002
},
{
"source": 5,
"target": 19,
"value": -0.45396993963552879
},
{
"source": 5,
"target": 20,
"value": 1.6497376313977865
},
{
"source": 5,
"target": 21,
"value": 3.3660203128093942
},
{
"source": 5,
"target": 22,
"value": -0.43050223681400129
},
{
"source": 5,
"target": 23,
"value": -0.29531230254107399
},
{
"source": 5,
"target": 24,
"value": 2.8245514965528908
},
{
"source": 5,
"target": 25,
"value": -0.014275115025042197
},
{
"source": 5,
"target": 26,
"value": -0.41047779424137543
},
{
"source": 5,
"target": 27,
"value": -0.22971778390925643
},
{
"source": 5,
"target": 28,
"value": 3.7098286159914711
},
{
"source": 6,
"target": 0,
"value": 1.408537134779609
},
{
"source": 6,
"target": 1,
"value": -0.017369324963208418
},
{
"source": 6,
"target": 2,
"value": -0.36712796192035696
},
{
"source": 6,
"target": 3,
"value": 0.31325354787933052
},
{
"source": 6,
"target": 4,
"value": -0.1628868600688981
},
{
"source": 6,
"target": 5,
"value": 0.027411933034294081
},
{
"source": 6,
"target": 6,
"value": -0.28135155624385844
},
{
"source": 6,
"target": 7,
"value": 5.813846488901298
},
{
"source": 6,
"target": 8,
"value": -0.16170658449815131
},
{
"source": 6,
"target": 9,
"value": 0.47238675168335809
},
{
"source": 6,
"target": 10,
"value": -0.33979583967556176
},
{
"source": 6,
"target": 11,
"value": 0.6699566251544844
},
{
"source": 6,
"target": 12,
"value": -0.25963909998817508
},
{
"source": 6,
"target": 13,
"value": -0.386601294562401
},
{
"source": 6,
"target": 14,
"value": -0.29365459336608785
},
{
"source": 6,
"target": 15,
"value": 4.3904997214456545
},
{
"source": 6,
"target": 16,
"value": -0.42094221371496376
},
{
"source": 6,
"target": 17,
"value": -0.40295515401386028
},
{
"source": 6,
"target": 18,
"value": -0.34680949368444419
},
{
"source": 6,
"target": 19,
"value": -0.22272513152037254
},
{
"source": 6,
"target": 20,
"value": 0.36849943022734383
},
{
"source": 6,
"target": 21,
"value": 1.4930324800372412
},
{
"source": 6,
"target": 22,
"value": -0.34174718004818583
},
{
"source": 6,
"target": 23,
"value": -0.34342045138202221
},
{
"source": 6,
"target": 24,
"value": 5.2848086069937636
},
{
"source": 6,
"target": 25,
"value": -0.35815689616245794
},
{
"source": 6,
"target": 26,
"value": -0.22293155831772568
},
{
"source": 6,
"target": 27,
"value": -0.40139116745509268
},
{
"source": 6,
"target": 28,
"value": -0.41247871502349737
},
{
"source": 7,
"target": 0,
"value": 0.90664240557096754
},
{
"source": 7,
"target": 1,
"value": -0.68477142281137282
},
{
"source": 7,
"target": 2,
"value": 0.015261254354935985
},
{
"source": 7,
"target": 3,
"value": 0.16056791974743514
},
{
"source": 7,
"target": 4,
"value": 0.36500211308857428
},
{
"source": 7,
"target": 5,
"value": -0.56439269872432241
},
{
"source": 7,
"target": 6,
"value": 0.16907282705200347
},
{
"source": 7,
"target": 7,
"value": -0.035192496288503301
},
{
"source": 7,
"target": 8,
"value": -0.031210405212988842
},
{
"source": 7,
"target": 9,
"value": 0.44774244324683049
},
{
"source": 7,
"target": 10,
"value": 0.54407510269840009
},
{
"source": 7,
"target": 11,
"value": 0.28000847716430555
},
{
"source": 7,
"target": 12,
"value": -0.066278222465491324
},
{
"source": 7,
"target": 13,
"value": -0.22581431760823351
},
{
"source": 7,
"target": 14,
"value": 4.1034965069336167
},
{
"source": 7,
"target": 15,
"value": 1.2196915658339027
},
{
"source": 7,
"target": 16,
"value": -0.2450220008619636
},
{
"source": 7,
"target": 17,
"value": -0.68155265825386679
},
{
"source": 7,
"target": 18,
"value": -0.30481733290401303
},
{
"source": 7,
"target": 19,
"value": -0.51121229458582629
},
{
"source": 7,
"target": 20,
"value": -1.1000560166388849
},
{
"source": 7,
"target": 21,
"value": 1.3359832947541366
},
{
"source": 7,
"target": 22,
"value": -0.5005615442429211
},
{
"source": 7,
"target": 23,
"value": 0.7212598186647925
},
{
"source": 7,
"target": 24,
"value": 0.28474707172750124
},
{
"source": 7,
"target": 25,
"value": 0.232812723502761
},
{
"source": 7,
"target": 26,
"value": -0.79693010111007168
},
{
"source": 7,
"target": 27,
"value": -0.15638145522707156
},
{
"source": 7,
"target": 28,
"value": 1.503853721443233
},
{
"source": 8,
"target": 0,
"value": -0.45290705201636311
},
{
"source": 8,
"target": 1,
"value": -0.39279053607524916
},
{
"source": 8,
"target": 2,
"value": -0.37417351450518671
},
{
"source": 8,
"target": 3,
"value": -0.52741849315666112
},
{
"source": 8,
"target": 4,
"value": -0.32010333404622343
},
{
"source": 8,
"target": 5,
"value": -0.56065721919385381
},
{
"source": 8,
"target": 6,
"value": -0.31284750913502735
},
{
"source": 8,
"target": 7,
"value": -0.46390362318559114
},
{
"source": 8,
"target": 8,
"value": -0.30465232892278021
},
{
"source": 8,
"target": 9,
"value": -0.30897113998145936
},
{
"source": 8,
"target": 10,
"value": -0.33193587585023238
},
{
"source": 8,
"target": 11,
"value": 4.09893082110771
},
{
"source": 8,
"target": 12,
"value": -0.41394214946353214
},
{
"source": 8,
"target": 13,
"value": -0.50141891708449216
},
{
"source": 8,
"target": 14,
"value": 1.2561648760206277
},
{
"source": 8,
"target": 15,
"value": -0.12356019016322325
},
{
"source": 8,
"target": 16,
"value": -0.42557792690270618
},
{
"source": 8,
"target": 17,
"value": -0.36998587968973184
},
{
"source": 8,
"target": 18,
"value": -0.054684880829232223
},
{
"source": 8,
"target": 19,
"value": -0.48473063095504942
},
{
"source": 8,
"target": 20,
"value": -0.41973947241617315
},
{
"source": 8,
"target": 21,
"value": -0.43241243150727682
},
{
"source": 8,
"target": 22,
"value": 0.14324561857532075
},
{
"source": 8,
"target": 23,
"value": -0.26693248901749655
},
{
"source": 8,
"target": 24,
"value": -0.34086030704175729
},
{
"source": 8,
"target": 25,
"value": -0.23184729060746861
},
{
"source": 8,
"target": 26,
"value": -0.44829253857889223
},
{
"source": 8,
"target": 27,
"value": -0.4286816902169483
},
{
"source": 8,
"target": 28,
"value": -0.61593688908186295
},
{
"source": 9,
"target": 0,
"value": 3.5790517345608572
},
{
"source": 9,
"target": 1,
"value": 0.92330807013167659
},
{
"source": 9,
"target": 2,
"value": -0.65109436700709888
},
{
"source": 9,
"target": 3,
"value": 0.95274383271612328
},
{
"source": 9,
"target": 4,
"value": -0.21273339730559646
},
{
"source": 9,
"target": 5,
"value": 0.0060745270298313021
},
{
"source": 9,
"target": 6,
"value": -0.1210382461746107
},
{
"source": 9,
"target": 7,
"value": 0.083769062907440017
},
{
"source": 9,
"target": 8,
"value": -0.72267821405862454
},
{
"source": 9,
"target": 9,
"value": 1.6694109892374405
},
{
"source": 9,
"target": 10,
"value": -0.24760088329100385
},
{
"source": 9,
"target": 11,
"value": -0.28462364926692257
},
{
"source": 9,
"target": 12,
"value": -0.68771671747589203
},
{
"source": 9,
"target": 13,
"value": -0.32088388484232011
},
{
"source": 9,
"target": 14,
"value": -0.9337041500599822
},
{
"source": 9,
"target": 15,
"value": -0.30923005264807696
},
{
"source": 9,
"target": 16,
"value": 0.5448701515395088
},
{
"source": 9,
"target": 17,
"value": 0.82402939748319426
},
{
"source": 9,
"target": 18,
"value": -0.087291923609144492
},
{
"source": 9,
"target": 19,
"value": -0.97390586697505277
},
{
"source": 9,
"target": 20,
"value": -0.30828298292688106
},
{
"source": 9,
"target": 21,
"value": 0.82214570366273187
},
{
"source": 9,
"target": 22,
"value": -0.72904307968488236
},
{
"source": 9,
"target": 23,
"value": -0.088865730645833974
},
{
"source": 9,
"target": 24,
"value": -0.29848498956129965
},
{
"source": 9,
"target": 25,
"value": -0.45136711205453667
},
{
"source": 9,
"target": 26,
"value": -1.1340407329581639
},
{
"source": 9,
"target": 27,
"value": 0.37923044280196166
},
{
"source": 9,
"target": 28,
"value": 1.491612576579276
},
{
"source": 10,
"target": 0,
"value": -0.58276133512873174
},
{
"source": 10,
"target": 1,
"value": -0.70637942520754704
},
{
"source": 10,
"target": 2,
"value": 0.36431330089970965
},
{
"source": 10,
"target": 3,
"value": -0.48301141378761581
},
{
"source": 10,
"target": 4,
"value": -0.71307718989753432
},
{
"source": 10,
"target": 5,
"value": -0.048548064408619487
},
{
"source": 10,
"target": 6,
"value": -0.52794454854771578
},
{
"source": 10,
"target": 7,
"value": 0.33750176931094372
},
{
"source": 10,
"target": 8,
"value": -0.65678163514254795
},
{
"source": 10,
"target": 9,
"value": -0.32331862449564885
},
{
"source": 10,
"target": 10,
"value": -0.43295062282469576
},
{
"source": 10,
"target": 11,
"value": -0.41479909782662672
},
{
"source": 10,
"target": 12,
"value": -1.0257051601380083
},
{
"source": 10,
"target": 13,
"value": -0.86141543335954385
},
{
"source": 10,
"target": 14,
"value": 0.11344713070906139
},
{
"source": 10,
"target": 15,
"value": -0.11011773483413635
},
{
"source": 10,
"target": 16,
"value": -0.49351082530610707
},
{
"source": 10,
"target": 17,
"value": 0.14884150207220595
},
{
"source": 10,
"target": 18,
"value": -0.3410969140760074
},
{
"source": 10,
"target": 19,
"value": -0.37376052504121249
},
{
"source": 10,
"target": 20,
"value": 5.1601380200472873
},
{
"source": 10,
"target": 21,
"value": -0.20490693226896101
},
{
"source": 10,
"target": 22,
"value": -0.46557486296524786
},
{
"source": 10,
"target": 23,
"value": -0.17040549120894785
},
{
"source": 10,
"target": 24,
"value": 0.046286803182802157
},
{
"source": 10,
"target": 25,
"value": -0.10088763870246106
},
{
"source": 10,
"target": 26,
"value": 0.93615090649131827
},
{
"source": 10,
"target": 27,
"value": -0.15980844004531719
},
{
"source": 10,
"target": 28,
"value": -0.84685767723581074
},
{
"source": 11,
"target": 0,
"value": -0.58688791020078224
},
{
"source": 11,
"target": 1,
"value": -0.18668590196373558
},
{
"source": 11,
"target": 2,
"value": -3.5185292102726273
},
{
"source": 11,
"target": 3,
"value": 0.25062883383535473
},
{
"source": 11,
"target": 4,
"value": -0.47777353725471639
},
{
"source": 11,
"target": 5,
"value": -0.62381106959258392
},
{
"source": 11,
"target": 6,
"value": -0.92202387960361953
},
{
"source": 11,
"target": 7,
"value": -0.55383452996295279
},
{
"source": 11,
"target": 8,
"value": 0.018847867065814792
},
{
"source": 11,
"target": 9,
"value": 1.2676445568698784
},
{
"source": 11,
"target": 10,
"value": 0.24373205450113566
},
{
"source": 11,
"target": 11,
"value": -0.23352827296228729
},
{
"source": 11,
"target": 12,
"value": 0.070726356321995948
},
{
"source": 11,
"target": 13,
"value": -0.25636019836611407
},
{
"source": 11,
"target": 14,
"value": 1.7410016071894063
},
{
"source": 11,
"target": 15,
"value": 0.1682473794831513
},
{
"source": 11,
"target": 16,
"value": -0.24597429885430988
},
{
"source": 11,
"target": 17,
"value": 0.014972758686173138
},
{
"source": 11,
"target": 18,
"value": -0.53762378679444123
},
{
"source": 11,
"target": 19,
"value": 0.25936495734348802
},
{
"source": 11,
"target": 20,
"value": 1.3031904920851041
},
{
"source": 11,
"target": 21,
"value": 1.0432080243907915
},
{
"source": 11,
"target": 22,
"value": -1.0210949461166314
},
{
"source": 11,
"target": 23,
"value": -0.097444211539046158
},
{
"source": 11,
"target": 24,
"value": -0.67929059276540882
},
{
"source": 11,
"target": 25,
"value": 0.13259257580067865
},
{
"source": 11,
"target": 26,
"value": -0.44060751743597892
},
{
"source": 11,
"target": 27,
"value": -0.21005684047812778
},
{
"source": 11,
"target": 28,
"value": 0.65131199501855841
},
{
"source": 12,
"target": 0,
"value": -0.69363978498339784
},
{
"source": 12,
"target": 1,
"value": -0.35755929883279947
},
{
"source": 12,
"target": 2,
"value": -0.90386126235556297
},
{
"source": 12,
"target": 3,
"value": -0.81045027927781921
},
{
"source": 12,
"target": 4,
"value": 0.29377546096397888
},
{
"source": 12,
"target": 5,
"value": 1.0124692523834711
},
{
"source": 12,
"target": 6,
"value": -0.10446230013935286
},
{
"source": 12,
"target": 7,
"value": -0.57375716053948855
},
{
"source": 12,
"target": 8,
"value": -0.62946799845722889
},
{
"source": 12,
"target": 9,
"value": -1.1311389377161463
},
{
"source": 12,
"target": 10,
"value": -0.40198407548317455
},
{
"source": 12,
"target": 11,
"value": -0.67255456384810808
},
{
"source": 12,
"target": 12,
"value": -1.1827919737502532
},
{
"source": 12,
"target": 13,
"value": -1.0013804101062767
},
{
"source": 12,
"target": 14,
"value": -1.0202160933178968
},
{
"source": 12,
"target": 15,
"value": -0.43779921338517847
},
{
"source": 12,
"target": 16,
"value": -0.10378360159735017
},
{
"source": 12,
"target": 17,
"value": -0.38756592836473014
},
{
"source": 12,
"target": 18,
"value": 0.38647177207876815
},
{
"source": 12,
"target": 19,
"value": -0.52474217537535683
},
{
"source": 12,
"target": 20,
"value": 3.6270702483522612
},
{
"source": 12,
"target": 21,
"value": -0.8465508063193925
},
{
"source": 12,
"target": 22,
"value": -0.47373666091842564
},
{
"source": 12,
"target": 23,
"value": 0.44338891871250635
},
{
"source": 12,
"target": 24,
"value": 0.76613525682941286
},
{
"source": 12,
"target": 25,
"value": 0.19368301450100922
},
{
"source": 12,
"target": 26,
"value": -0.61475726751502424
},
{
"source": 12,
"target": 27,
"value": -0.38290617123712967
},
{
"source": 12,
"target": 28,
"value": -0.86441041070912195
},
{
"source": 13,
"target": 0,
"value": 0.3272035942051979
},
{
"source": 13,
"target": 1,
"value": 0.85731930113337007
},
{
"source": 13,
"target": 2,
"value": -1.3973565958795904
},
{
"source": 13,
"target": 3,
"value": -0.22668358484814219
},
{
"source": 13,
"target": 4,
"value": -0.98605145534078475
},
{
"source": 13,
"target": 5,
"value": 0.43834350537065203
},
{
"source": 13,
"target": 6,
"value": 0.095527129236080352
},
{
"source": 13,
"target": 7,
"value": 5.5987723078132667
},
{
"source": 13,
"target": 8,
"value": 0.53502579724616883
},
{
"source": 13,
"target": 9,
"value": -0.057479225340613407
},
{
"source": 13,
"target": 10,
"value": -0.089086932295654231
},
{
"source": 13,
"target": 11,
"value": -0.47329101080684005
},
{
"source": 13,
"target": 12,
"value": 2.0702529070293738
},
{
"source": 13,
"target": 13,
"value": 0.20140988791231373
},
{
"source": 13,
"target": 14,
"value": 1.1347281333572206
},
{
"source": 13,
"target": 15,
"value": 0.095734103743528504
},
{
"source": 13,
"target": 16,
"value": 0.22916066991548917
},
{
"source": 13,
"target": 17,
"value": 0.56664970220614119
},
{
"source": 13,
"target": 18,
"value": 1.011889663075052
},
{
"source": 13,
"target": 19,
"value": 0.90234255572779742
},
{
"source": 13,
"target": 20,
"value": 0.73551030405347262
},
{
"source": 13,
"target": 21,
"value": -0.49353851697038781
},
{
"source": 13,
"target": 22,
"value": 3.1769186016874564
},
{
"source": 13,
"target": 23,
"value": 0.49004573733155987
},
{
"source": 13,
"target": 24,
"value": -0.69349568872827472
},
{
"source": 13,
"target": 25,
"value": -0.18370487843165287
},
{
"source": 13,
"target": 26,
"value": -0.18235684446574066
},
{
"source": 13,
"target": 27,
"value": 0.74472876863744497
},
{
"source": 13,
"target": 28,
"value": -0.31106439186785284
},
{
"source": 14,
"target": 0,
"value": 0.33110819103133493
},
{
"source": 14,
"target": 1,
"value": -0.46797839733994068
},
{
"source": 14,
"target": 2,
"value": 0.6811123288085712
},
{
"source": 14,
"target": 3,
"value": -1.1959141208968969
},
{
"source": 14,
"target": 4,
"value": -0.53846195658429641
},
{
"source": 14,
"target": 5,
"value": 3.6165422044382618
},
{
"source": 14,
"target": 6,
"value": 0.094919880573477985
},
{
"source": 14,
"target": 7,
"value": 0.52735755322738209
},
{
"source": 14,
"target": 8,
"value": -0.16047831150479536
},
{
"source": 14,
"target": 9,
"value": -0.94044493886437286
},
{
"source": 14,
"target": 10,
"value": -1.0256896759293941
},
{
"source": 14,
"target": 11,
"value": 0.053722043789611616
},
{
"source": 14,
"target": 12,
"value": 0.081275611366369793
},
{
"source": 14,
"target": 13,
"value": -0.61633793639802747
},
{
"source": 14,
"target": 14,
"value": -0.48042056998839278
},
{
"source": 14,
"target": 15,
"value": 0.62090338227619257
},
{
"source": 14,
"target": 16,
"value": -0.72379306381648789
},
{
"source": 14,
"target": 17,
"value": -0.7596429907134179
},
{
"source": 14,
"target": 18,
"value": -0.74490074354722213
},
{
"source": 14,
"target": 19,
"value": -0.43363819013675481
},
{
"source": 14,
"target": 20,
"value": -0.8049298488621619
},
{
"source": 14,
"target": 21,
"value": 0.42902226859841286
},
{
"source": 14,
"target": 22,
"value": 0.7650129894064327
},
{
"source": 14,
"target": 23,
"value": 0.40035652507171693
},
{
"source": 14,
"target": 24,
"value": 0.20774184853333821
},
{
"source": 14,
"target": 25,
"value": 1.4743730082676205
},
{
"source": 14,
"target": 26,
"value": 0.88873428167568536
},
{
"source": 14,
"target": 27,
"value": 0.38771558055136268
},
{
"source": 14,
"target": 28,
"value": -0.6236782976676174
},
{
"source": 15,
"target": 0,
"value": 0.14118383662089301
},
{
"source": 15,
"target": 1,
"value": 0.78860835242956528
},
{
"source": 15,
"target": 2,
"value": 0.51421387995873169
},
{
"source": 15,
"target": 3,
"value": 0.5282555974342652
},
{
"source": 15,
"target": 4,
"value": 0.90623459674237061
},
{
"source": 15,
"target": 5,
"value": 0.050158064842975685
},
{
"source": 15,
"target": 6,
"value": -0.84334138176803974
},
{
"source": 15,
"target": 7,
"value": 1.4438429601044711
},
{
"source": 15,
"target": 8,
"value": -0.25369934250094689
},
{
"source": 15,
"target": 9,
"value": 0.56253749693881538
},
{
"source": 15,
"target": 10,
"value": -0.50592365949416174
},
{
"source": 15,
"target": 11,
"value": -6.621630155635482
},
{
"source": 15,
"target": 12,
"value": -1.2539070874072826
},
{
"source": 15,
"target": 13,
"value": 0.9478835564074265
},
{
"source": 15,
"target": 14,
"value": 0.39465766219732445
},
{
"source": 15,
"target": 15,
"value": 0.61312269792567931
},
{
"source": 15,
"target": 16,
"value": -0.22320576201303588
},
{
"source": 15,
"target": 17,
"value": 0.90537373573333879
},
{
"source": 15,
"target": 18,
"value": 0.67930155380035717
},
{
"source": 15,
"target": 19,
"value": 0.85978922196381402
},
{
"source": 15,
"target": 20,
"value": -0.022354552692917772
},
{
"source": 15,
"target": 21,
"value": 1.0467260522627384
},
{
"source": 15,
"target": 22,
"value": 0.19447100043579929
},
{
"source": 15,
"target": 23,
"value": 0.35991283435355875
},
{
"source": 15,
"target": 24,
"value": -0.80634823433981806
},
{
"source": 15,
"target": 25,
"value": 1.5866198755918093
},
{
"source": 15,
"target": 26,
"value": 0.31198582360105731
},
{
"source": 15,
"target": 27,
"value": 0.5444700272869899
},
{
"source": 15,
"target": 28,
"value": 1.4795985369295688
},
{
"source": 16,
"target": 0,
"value": -0.52430994851271928
},
{
"source": 16,
"target": 1,
"value": -0.28599474906073613
},
{
"source": 16,
"target": 2,
"value": -0.48487168131654285
},
{
"source": 16,
"target": 3,
"value": 0.17665518856664628
},
{
"source": 16,
"target": 4,
"value": -0.13971162654475303
},
{
"source": 16,
"target": 5,
"value": -0.35297839678765897
},
{
"source": 16,
"target": 6,
"value": -0.19252985363793168
},
{
"source": 16,
"target": 7,
"value": -0.601257973341077
},
{
"source": 16,
"target": 8,
"value": -0.42732342692957598
},
{
"source": 16,
"target": 9,
"value": 0.45940379092052369
},
{
"source": 16,
"target": 10,
"value": -0.3830009996419772
},
{
"source": 16,
"target": 11,
"value": -0.57131675260390991
},
{
"source": 16,
"target": 12,
"value": -0.38798257166150402
},
{
"source": 16,
"target": 13,
"value": -0.35394511769441905
},
{
"source": 16,
"target": 14,
"value": -0.24031472009157787
},
{
"source": 16,
"target": 15,
"value": -0.30568552222405992
},
{
"source": 16,
"target": 16,
"value": 0.45686491547789837
},
{
"source": 16,
"target": 17,
"value": -0.13488665344762221
},
{
"source": 16,
"target": 18,
"value": 2.1365831820314591
},
{
"source": 16,
"target": 19,
"value": -0.46312785928873629
},
{
"source": 16,
"target": 20,
"value": -0.6004083933605191
},
{
"source": 16,
"target": 21,
"value": 4.4309559181765534
},
{
"source": 16,
"target": 22,
"value": -0.37477277437308992
},
{
"source": 16,
"target": 23,
"value": -0.20685310625645309
},
{
"source": 16,
"target": 24,
"value": 1.7561045214786508
},
{
"source": 16,
"target": 25,
"value": 0.83288728858551597
},
{
"source": 16,
"target": 26,
"value": -0.31439217569680283
},
{
"source": 16,
"target": 27,
"value": -0.3137374195724546
},
{
"source": 16,
"target": 28,
"value": 0.4934202828271313
},
{
"source": 17,
"target": 0,
"value": 0.50959217359000375
},
{
"source": 17,
"target": 1,
"value": 0.4647743150595835
},
{
"source": 17,
"target": 2,
"value": 0.27549570359458653
},
{
"source": 17,
"target": 3,
"value": -0.01882253005614044
},
{
"source": 17,
"target": 4,
"value": -0.005537791898071907
},
{
"source": 17,
"target": 5,
"value": -0.45719786579062272
},
{
"source": 17,
"target": 6,
"value": 3.4082530826604285
},
{
"source": 17,
"target": 7,
"value": -0.43040764291543909
},
{
"source": 17,
"target": 8,
"value": -0.75418608163168788
},
{
"source": 17,
"target": 9,
"value": -0.83653085519954185
},
{
"source": 17,
"target": 10,
"value": -0.27705395717367293
},
{
"source": 17,
"target": 11,
"value": -0.54257843013237184
},
{
"source": 17,
"target": 12,
"value": 0.85043957719078545
},
{
"source": 17,
"target": 13,
"value": -0.2989814487053486
},
{
"source": 17,
"target": 14,
"value": -0.16939480915395713
},
{
"source": 17,
"target": 15,
"value": 0.25478336931174012
},
{
"source": 17,
"target": 16,
"value": -0.42782175465235622
},
{
"source": 17,
"target": 17,
"value": -0.13894650044319207
},
{
"source": 17,
"target": 18,
"value": 0.61806913505227246
},
{
"source": 17,
"target": 19,
"value": 1.9263498965771797
},
{
"source": 17,
"target": 20,
"value": -0.30539991770306846
},
{
"source": 17,
"target": 21,
"value": -0.53593921457560911
},
{
"source": 17,
"target": 22,
"value": -0.078661666342441761
},
{
"source": 17,
"target": 23,
"value": 6.2678544648692025
},
{
"source": 17,
"target": 24,
"value": -0.57293844021952012
},
{
"source": 17,
"target": 25,
"value": -0.3021686085483048
},
{
"source": 17,
"target": 26,
"value": 0.72307511966709959
},
{
"source": 17,
"target": 27,
"value": 0.61186300322087062
},
{
"source": 17,
"target": 28,
"value": -0.21459949974974921
},
{
"source": 18,
"target": 0,
"value": -0.55444711103253519
},
{
"source": 18,
"target": 1,
"value": -0.14575348464982335
},
{
"source": 18,
"target": 2,
"value": 0.019807701456044689
},
{
"source": 18,
"target": 3,
"value": -0.63491572735125112
},
{
"source": 18,
"target": 4,
"value": -0.49376688688448889
},
{
"source": 18,
"target": 5,
"value": -0.58764496826166635
},
{
"source": 18,
"target": 6,
"value": -0.22371499576314782
},
{
"source": 18,
"target": 7,
"value": 1.3850494758585525
},
{
"source": 18,
"target": 8,
"value": -0.34610075548050268
},
{
"source": 18,
"target": 9,
"value": 0.25453660890764573
},
{
"source": 18,
"target": 10,
"value": 0.05788731825491944
},
{
"source": 18,
"target": 11,
"value": -0.59308136572826298
},
{
"source": 18,
"target": 12,
"value": -0.47065184992949449
},
{
"source": 18,
"target": 13,
"value": -0.75394409476761115
},
{
"source": 18,
"target": 14,
"value": -0.044570502869954683
},
{
"source": 18,
"target": 15,
"value": -0.3345976364555745
},
{
"source": 18,
"target": 16,
"value": 0.33958778780697146
},
{
"source": 18,
"target": 17,
"value": -0.13520117344807261
},
{
"source": 18,
"target": 18,
"value": -0.11189692100587975
},
{
"source": 18,
"target": 19,
"value": 4.9138485389160884
},
{
"source": 18,
"target": 20,
"value": -0.54275004613322786
},
{
"source": 18,
"target": 21,
"value": -0.27783299029576036
},
{
"source": 18,
"target": 22,
"value": -0.68909758211079342
},
{
"source": 18,
"target": 23,
"value": -0.21668800560728069
},
{
"source": 18,
"target": 24,
"value": 1.1276998569122652
},
{
"source": 18,
"target": 25,
"value": 0.035887470077606849
},
{
"source": 18,
"target": 26,
"value": -0.070416155824595497
},
{
"source": 18,
"target": 27,
"value": -0.55326806202792311
},
{
"source": 18,
"target": 28,
"value": -0.97742768929559398
},
{
"source": 19,
"target": 0,
"value": -0.53083174349039264
},
{
"source": 19,
"target": 1,
"value": -0.26087360657306552
},
{
"source": 19,
"target": 2,
"value": -0.46113461693338675
},
{
"source": 19,
"target": 3,
"value": -0.38905618803110115
},
{
"source": 19,
"target": 4,
"value": -0.51255542412219945
},
{
"source": 19,
"target": 5,
"value": -0.51320226826887405
},
{
"source": 19,
"target": 6,
"value": -0.33755039723418218
},
{
"source": 19,
"target": 7,
"value": -0.44995376834770867
},
{
"source": 19,
"target": 8,
"value": -0.18484542137692572
},
{
"source": 19,
"target": 9,
"value": -0.56588065672583021
},
{
"source": 19,
"target": 10,
"value": -0.37635620240932532
},
{
"source": 19,
"target": 11,
"value": -0.28526610374746003
},
{
"source": 19,
"target": 12,
"value": -0.57050587858877777
},
{
"source": 19,
"target": 13,
"value": 3.5989506554028283
},
{
"source": 19,
"target": 14,
"value": -0.47705297142381115
},
{
"source": 19,
"target": 15,
"value": -0.36444969068292571
},
{
"source": 19,
"target": 16,
"value": -0.64891712744849983
},
{
"source": 19,
"target": 17,
"value": -0.39036308621172078
},
{
"source": 19,
"target": 18,
"value": 1.1178779945356507
},
{
"source": 19,
"target": 19,
"value": -0.46408658640874856
},
{
"source": 19,
"target": 20,
"value": -0.45643101640596823
},
{
"source": 19,
"target": 21,
"value": -0.57101005595293175
},
{
"source": 19,
"target": 22,
"value": -0.45666879437683566
},
{
"source": 19,
"target": 23,
"value": -0.5823049498987114
},
{
"source": 19,
"target": 24,
"value": -0.42619270378483959
},
{
"source": 19,
"target": 25,
"value": -0.4111616133894116
},
{
"source": 19,
"target": 26,
"value": -0.45561860833883766
},
{
"source": 19,
"target": 27,
"value": -0.29749801903028761
},
{
"source": 19,
"target": 28,
"value": -0.47141323021849574
},
{
"source": 20,
"target": 0,
"value": -0.64324633061184255
},
{
"source": 20,
"target": 1,
"value": 0.052021432649119653
},
{
"source": 20,
"target": 2,
"value": -0.73500662633876568
},
{
"source": 20,
"target": 3,
"value": 0.041068843345307388
},
{
"source": 20,
"target": 4,
"value": -0.062094124916513296
},
{
"source": 20,
"target": 5,
"value": 5.4777147158813602
},
{
"source": 20,
"target": 6,
"value": 1.2566869670917764
},
{
"source": 20,
"target": 7,
"value": -0.13640185114333314
},
{
"source": 20,
"target": 8,
"value": 0.57726687128323273
},
{
"source": 20,
"target": 9,
"value": -0.60002565011100484
},
{
"source": 20,
"target": 10,
"value": 0.087671916248171819
},
{
"source": 20,
"target": 11,
"value": -0.56095977928659413
},
{
"source": 20,
"target": 12,
"value": -0.56490392970636649
},
{
"source": 20,
"target": 13,
"value": -0.62926160164598322
},
{
"source": 20,
"target": 14,
"value": -0.21422648712883893
},
{
"source": 20,
"target": 15,
"value": 0.099299630398611449
},
{
"source": 20,
"target": 16,
"value": -0.095715003870127463
},
{
"source": 20,
"target": 17,
"value": -0.63285634534688684
},
{
"source": 20,
"target": 18,
"value": 1.0932035396323281
},
{
"source": 20,
"target": 19,
"value": 0.38697641889866607
},
{
"source": 20,
"target": 20,
"value": -0.37472007598179313
},
{
"source": 20,
"target": 21,
"value": -0.56495722903636336
},
{
"source": 20,
"target": 22,
"value": 1.6808954885161687
},
{
"source": 20,
"target": 23,
"value": 0.50849889129164816
},
{
"source": 20,
"target": 24,
"value": 0.91660424688808184
},
{
"source": 20,
"target": 25,
"value": -0.60749770856390661
},
{
"source": 20,
"target": 26,
"value": 0.58989289034472558
},
{
"source": 20,
"target": 27,
"value": -0.12276483685412082
},
{
"source": 20,
"target": 28,
"value": -0.53365106384261551
},
{
"source": 21,
"target": 0,
"value": -0.69386802696386529
},
{
"source": 21,
"target": 1,
"value": 0.57619652982024361
},
{
"source": 21,
"target": 2,
"value": -0.48854103706839602
},
{
"source": 21,
"target": 3,
"value": -0.60094858011174646
},
{
"source": 21,
"target": 4,
"value": 1.1395984968588524
},
{
"source": 21,
"target": 5,
"value": -0.024286992975044358
},
{
"source": 21,
"target": 6,
"value": -0.28819455902153795
},
{
"source": 21,
"target": 7,
"value": -0.49925083931233311
},
{
"source": 21,
"target": 8,
"value": 0.10369741286589412
},
{
"source": 21,
"target": 9,
"value": -1.0447161566182468
},
{
"source": 21,
"target": 10,
"value": -1.024275069549377
},
{
"source": 21,
"target": 11,
"value": 3.0230034444392473
},
{
"source": 21,
"target": 12,
"value": 3.859028873259414
},
{
"source": 21,
"target": 13,
"value": 0.74297844225408838
},
{
"source": 21,
"target": 14,
"value": -0.35272281931067817
},
{
"source": 21,
"target": 15,
"value": 0.069205382916606537
},
{
"source": 21,
"target": 16,
"value": -1.117741918899664
},
{
"source": 21,
"target": 17,
"value": 0.65155371621302727
},
{
"source": 21,
"target": 18,
"value": -0.36476851055273368
},
{
"source": 21,
"target": 19,
"value": -0.54726909990286488
},
{
"source": 21,
"target": 20,
"value": -0.73572871852060917
},
{
"source": 21,
"target": 21,
"value": -0.62379767091607652
},
{
"source": 21,
"target": 22,
"value": -0.1053706334807796
},
{
"source": 21,
"target": 23,
"value": -0.13943154850923098
},
{
"source": 21,
"target": 24,
"value": -0.05537264779324938
},
{
"source": 21,
"target": 25,
"value": 0.77444983147514812
},
{
"source": 21,
"target": 26,
"value": 0.53898734135673765
},
{
"source": 21,
"target": 27,
"value": 0.35514519044373932
},
{
"source": 21,
"target": 28,
"value": -1.4538640704686328
},
{
"source": 22,
"target": 0,
"value": 0.0065318863109769245
},
{
"source": 22,
"target": 1,
"value": 0.56482673167768027
},
{
"source": 22,
"target": 2,
"value": 3.6953185238812383
},
{
"source": 22,
"target": 3,
"value": 0.3162550326813538
},
{
"source": 22,
"target": 4,
"value": -0.26873777386505238
},
{
"source": 22,
"target": 5,
"value": 0.93646150508802828
},
{
"source": 22,
"target": 6,
"value": 0.22915170027467113
},
{
"source": 22,
"target": 7,
"value": 0.64957900749236341
},
{
"source": 22,
"target": 8,
"value": -0.33010359472559703
},
{
"source": 22,
"target": 9,
"value": -0.50453450548865053
},
{
"source": 22,
"target": 10,
"value": 0.26472923692122213
},
{
"source": 22,
"target": 11,
"value": -0.9772280432060062
},
{
"source": 22,
"target": 12,
"value": 0.49363216853180397
},
{
"source": 22,
"target": 13,
"value": -0.40182139842074321
},
{
"source": 22,
"target": 14,
"value": -0.28623177864439991
},
{
"source": 22,
"target": 15,
"value": 0.1433712779359522
},
{
"source": 22,
"target": 16,
"value": -0.36023153168919092
},
{
"source": 22,
"target": 17,
"value": 0.3407627173839281
},
{
"source": 22,
"target": 18,
"value": 0.63316251155302106
},
{
"source": 22,
"target": 19,
"value": -0.71053050178593202
},
{
"source": 22,
"target": 20,
"value": -1.3346901905257662
},
{
"source": 22,
"target": 21,
"value": 0.15810804478047075
},
{
"source": 22,
"target": 22,
"value": -0.34782043510274652
},
{
"source": 22,
"target": 23,
"value": -0.074497060527772274
},
{
"source": 22,
"target": 24,
"value": -0.97050771647482359
},
{
"source": 22,
"target": 25,
"value": -0.26479442999508657
},
{
"source": 22,
"target": 26,
"value": -0.29864851663838438
},
{
"source": 22,
"target": 27,
"value": -0.1009087202748573
},
{
"source": 22,
"target": 28,
"value": -0.11742112014236722
},
{
"source": 23,
"target": 0,
"value": -0.18569540529749498
},
{
"source": 23,
"target": 1,
"value": -0.1737587987377241
},
{
"source": 23,
"target": 2,
"value": 0.084357104735369046
},
{
"source": 23,
"target": 3,
"value": 1.8265026558123709
},
{
"source": 23,
"target": 4,
"value": 0.0081671897274401307
},
{
"source": 23,
"target": 5,
"value": -1.1021486344430331
},
{
"source": 23,
"target": 6,
"value": 0.29900253601222898
},
{
"source": 23,
"target": 7,
"value": 0.45884818593229038
},
{
"source": 23,
"target": 8,
"value": 0.29250880648422645
},
{
"source": 23,
"target": 9,
"value": 0.11050820127377002
},
{
"source": 23,
"target": 10,
"value": 0.083592283096098924
},
{
"source": 23,
"target": 11,
"value": -0.49433306339716315
},
{
"source": 23,
"target": 12,
"value": -0.11794754594470613
},
{
"source": 23,
"target": 13,
"value": -0.53971248066051547
},
{
"source": 23,
"target": 14,
"value": -0.10633427861454452
},
{
"source": 23,
"target": 15,
"value": -0.40308300196393304
},
{
"source": 23,
"target": 16,
"value": -0.78947338134797829
},
{
"source": 23,
"target": 17,
"value": 1.0417873631718775
},
{
"source": 23,
"target": 18,
"value": 1.7004107197012863
},
{
"source": 23,
"target": 19,
"value": -0.29395186659579231
},
{
"source": 23,
"target": 20,
"value": 4.8395247581223106
},
{
"source": 23,
"target": 21,
"value": 1.0154808150807797
},
{
"source": 23,
"target": 22,
"value": 0.84118853419673145
},
{
"source": 23,
"target": 23,
"value": -0.62038976382297017
},
{
"source": 23,
"target": 24,
"value": -0.56558376440406111
},
{
"source": 23,
"target": 25,
"value": -0.26236618377510135
},
{
"source": 23,
"target": 26,
"value": 0.22642531508898248
},
{
"source": 23,
"target": 27,
"value": -0.048000565293094932
},
{
"source": 23,
"target": 28,
"value": 1.1262493734706644
},
{
"source": 24,
"target": 0,
"value": 0.18446234894516472
},
{
"source": 24,
"target": 1,
"value": -0.5260378710594833
},
{
"source": 24,
"target": 2,
"value": 0.43208727184125584
},
{
"source": 24,
"target": 3,
"value": -0.88231191253213082
},
{
"source": 24,
"target": 4,
"value": 0.24635609270003733
},
{
"source": 24,
"target": 5,
"value": 0.85875452073706382
},
{
"source": 24,
"target": 6,
"value": 0.052858018747347919
},
{
"source": 24,
"target": 7,
"value": -1.1183406034106613
},
{
"source": 24,
"target": 8,
"value": -0.84694881589854665
},
{
"source": 24,
"target": 9,
"value": -0.77882407453768565
},
{
"source": 24,
"target": 10,
"value": 3.525192776825818
},
{
"source": 24,
"target": 11,
"value": -1.8727450069476843
},
{
"source": 24,
"target": 12,
"value": -0.77975643490090718
},
{
"source": 24,
"target": 13,
"value": -1.0396393991795181
},
{
"source": 24,
"target": 14,
"value": -0.59333431013337479
},
{
"source": 24,
"target": 15,
"value": 0.40215600678803981
},
{
"source": 24,
"target": 16,
"value": -1.387426463953026
},
{
"source": 24,
"target": 17,
"value": -0.14543505135904516
},
{
"source": 24,
"target": 18,
"value": -0.46497242959157836
},
{
"source": 24,
"target": 19,
"value": -0.22106446117922349
},
{
"source": 24,
"target": 20,
"value": -0.86148364798946908
},
{
"source": 24,
"target": 21,
"value": 0.12541563415655763
},
{
"source": 24,
"target": 22,
"value": -0.1918491156906236
},
{
"source": 24,
"target": 23,
"value": 2.3744602971051081
},
{
"source": 24,
"target": 24,
"value": -0.74142143960955775
},
{
"source": 24,
"target": 25,
"value": 0.7654394002770446
},
{
"source": 24,
"target": 26,
"value": 1.0297968618345053
},
{
"source": 24,
"target": 27,
"value": 0.033078659613310045
},
{
"source": 24,
"target": 28,
"value": 0.44066581964749357
},
{
"source": 25,
"target": 0,
"value": 1.7603014477829886
},
{
"source": 25,
"target": 1,
"value": -0.91225965212287985
},
{
"source": 25,
"target": 2,
"value": -1.1633458885156993
},
{
"source": 25,
"target": 3,
"value": -0.96589166440897922
},
{
"source": 25,
"target": 4,
"value": -0.79515341403225381
},
{
"source": 25,
"target": 5,
"value": -0.6163003391234757
},
{
"source": 25,
"target": 6,
"value": -1.3607439968785124
},
{
"source": 25,
"target": 7,
"value": -1.4482918768194677
},
{
"source": 25,
"target": 8,
"value": -0.024088935330368499
},
{
"source": 25,
"target": 9,
"value": -1.1888687927339183
},
{
"source": 25,
"target": 10,
"value": -0.22990684509429757
},
{
"source": 25,
"target": 11,
"value": 2.1814891428499279
},
{
"source": 25,
"target": 12,
"value": -1.1544356843091295
},
{
"source": 25,
"target": 13,
"value": 6.2829278696939079
},
{
"source": 25,
"target": 14,
"value": -0.30378200204138084
},
{
"source": 25,
"target": 15,
"value": -0.16556892479658053
},
{
"source": 25,
"target": 16,
"value": -1.1261533493796203
},
{
"source": 25,
"target": 17,
"value": 1.6787213552158755
},
{
"source": 25,
"target": 18,
"value": -1.6835607928751593
},
{
"source": 25,
"target": 19,
"value": -0.86406354755097647
},
{
"source": 25,
"target": 20,
"value": -0.025445472443965743
},
{
"source": 25,
"target": 21,
"value": 1.8909462190450992
},
{
"source": 25,
"target": 22,
"value": 0.66780598797748347
},
{
"source": 25,
"target": 23,
"value": -0.62576438132426715
},
{
"source": 25,
"target": 24,
"value": -1.0633403134272235
},
{
"source": 25,
"target": 25,
"value": 3.2228168034713698
},
{
"source": 25,
"target": 26,
"value": -0.0013596192327750784
},
{
"source": 25,
"target": 27,
"value": -0.20366175565013617
},
{
"source": 25,
"target": 28,
"value": 0.1876699238429255
},
{
"source": 26,
"target": 0,
"value": -0.07364355044911465
},
{
"source": 26,
"target": 1,
"value": -0.10378927874211957
},
{
"source": 26,
"target": 2,
"value": -0.17130483618318754
},
{
"source": 26,
"target": 3,
"value": 0.35191006516947243
},
{
"source": 26,
"target": 4,
"value": 0.63677968981230637
},
{
"source": 26,
"target": 5,
"value": -0.13673298442104678
},
{
"source": 26,
"target": 6,
"value": 0.35683081529680027
},
{
"source": 26,
"target": 7,
"value": 3.8891158243775603
},
{
"source": 26,
"target": 8,
"value": 0.64544252614535835
},
{
"source": 26,
"target": 9,
"value": 1.3663589176555611
},
{
"source": 26,
"target": 10,
"value": 0.99531924446271547
},
{
"source": 26,
"target": 11,
"value": 5.6086854015810026
},
{
"source": 26,
"target": 12,
"value": 1.1019191405198236
},
{
"source": 26,
"target": 13,
"value": -0.5549005678381449
},
{
"source": 26,
"target": 14,
"value": 0.087820648583287669
},
{
"source": 26,
"target": 15,
"value": 0.06130512665665408
},
{
"source": 26,
"target": 16,
"value": 1.9312755570238593
},
{
"source": 26,
"target": 17,
"value": -0.69241757423853267
},
{
"source": 26,
"target": 18,
"value": -0.4818077022651262
},
{
"source": 26,
"target": 19,
"value": -0.16288735037503166
},
{
"source": 26,
"target": 20,
"value": -0.53829818851943623
},
{
"source": 26,
"target": 21,
"value": 2.4404122452579484
},
{
"source": 26,
"target": 22,
"value": 0.8042746047466699
},
{
"source": 26,
"target": 23,
"value": -0.6055261951453248
},
{
"source": 26,
"target": 24,
"value": 1.7884570164815041
},
{
"source": 26,
"target": 25,
"value": -0.37652092221726519
},
{
"source": 26,
"target": 26,
"value": 0.35819202000892725
},
{
"source": 26,
"target": 27,
"value": 0.16448778060300126
},
{
"source": 26,
"target": 28,
"value": 3.719306763292372
},
{
"source": 27,
"target": 0,
"value": -0.75152674075585335
},
{
"source": 27,
"target": 1,
"value": 0.49762291990959634
},
{
"source": 27,
"target": 2,
"value": -0.14253465837106349
},
{
"source": 27,
"target": 3,
"value": -0.88212408259610653
},
{
"source": 27,
"target": 4,
"value": -1.151282849445755
},
{
"source": 27,
"target": 5,
"value": 2.307907188228699
},
{
"source": 27,
"target": 6,
"value": -0.12032085033788652
},
{
"source": 27,
"target": 7,
"value": -0.35126953214755025
},
{
"source": 27,
"target": 8,
"value": -1.5261785641256858
},
{
"source": 27,
"target": 9,
"value": -0.75326842785087611
},
{
"source": 27,
"target": 10,
"value": 3.6008617388483128
},
{
"source": 27,
"target": 11,
"value": -1.2239958531391104
},
{
"source": 27,
"target": 12,
"value": -0.60722942444748174
},
{
"source": 27,
"target": 13,
"value": -0.027417898475962241
},
{
"source": 27,
"target": 14,
"value": 0.19016163211268552
},
{
"source": 27,
"target": 15,
"value": 0.61055040831653817
},
{
"source": 27,
"target": 16,
"value": 0.14979633091879996
},
{
"source": 27,
"target": 17,
"value": -0.12287986545515471
},
{
"source": 27,
"target": 18,
"value": 0.24786596349277773
},
{
"source": 27,
"target": 19,
"value": -0.40483370789115053
},
{
"source": 27,
"target": 20,
"value": 0.73692975375627379
},
{
"source": 27,
"target": 21,
"value": -0.94427506762103663
},
{
"source": 27,
"target": 22,
"value": -0.078919293972941576
},
{
"source": 27,
"target": 23,
"value": 0.66164800485014585
},
{
"source": 27,
"target": 24,
"value": -0.24494877858709505
},
{
"source": 27,
"target": 25,
"value": 3.0515346020874561
},
{
"source": 27,
"target": 26,
"value": -0.10736522817574214
},
{
"source": 27,
"target": 27,
"value": 0.36753640808324678
},
{
"source": 27,
"target": 28,
"value": -1.5179858237122232
},
{
"source": 28,
"target": 0,
"value": -0.31236414023074582
},
{
"source": 28,
"target": 1,
"value": 0.70125708858922209
},
{
"source": 28,
"target": 2,
"value": 0.4752081198963562
},
{
"source": 28,
"target": 3,
"value": -0.58529705388205111
},
{
"source": 28,
"target": 4,
"value": -0.12269428250766388
},
{
"source": 28,
"target": 5,
"value": -0.86687513747393552
},
{
"source": 28,
"target": 6,
"value": 0.36793952256702478
},
{
"source": 28,
"target": 7,
"value": -0.48110370588100493
},
{
"source": 28,
"target": 8,
"value": 2.0722377109602608
},
{
"source": 28,
"target": 9,
"value": 10.291864356029606
},
{
"source": 28,
"target": 10,
"value": 1.29880570124751
},
{
"source": 28,
"target": 11,
"value": -0.62817591748816715
},
{
"source": 28,
"target": 12,
"value": -0.17308437456162803
},
{
"source": 28,
"target": 13,
"value": -0.027107550436442682
},
{
"source": 28,
"target": 14,
"value": 0.35516907347589211
},
{
"source": 28,
"target": 15,
"value": 0.47045690504181548
},
{
"source": 28,
"target": 16,
"value": 0.12140023110051668
},
{
"source": 28,
"target": 17,
"value": 0.37492460216224488
},
{
"source": 28,
"target": 18,
"value": -0.27830734143807351
},
{
"source": 28,
"target": 19,
"value": -0.55374626578831432
},
{
"source": 28,
"target": 20,
"value": -0.93515655840020262
},
{
"source": 28,
"target": 21,
"value": -0.042420296354277291
},
{
"source": 28,
"target": 22,
"value": -0.47947990166341431
},
{
"source": 28,
"target": 23,
"value": -0.33240088640729587
},
{
"source": 28,
"target": 24,
"value": -0.71001701078450796
},
{
"source": 28,
"target": 25,
"value": 1.8739317548285428
},
{
"source": 28,
"target": 26,
"value": 0.20455442864543982
},
{
"source": 28,
"target": 27,
"value": -0.32315245959258426
},
{
"source": 28,
"target": 28,
"value": 0.18757252085030507
},
{
"source": 29,
"target": 0,
"value": 0.11931136037107981
},
{
"source": 29,
"target": 1,
"value": 0.59367068358216535
},
{
"source": 29,
"target": 2,
"value": 0.4891527705433053
},
{
"source": 29,
"target": 3,
"value": 0.8416833449544312
},
{
"source": 29,
"target": 4,
"value": 1.0646737475959809
},
{
"source": 29,
"target": 5,
"value": 0.095113498789668932
},
{
"source": 29,
"target": 6,
"value": 1.0501520218984144
},
{
"source": 29,
"target": 7,
"value": 1.8914884265001899
},
{
"source": 29,
"target": 8,
"value": -5.5283552002787326
},
{
"source": 29,
"target": 9,
"value": 0.64306832006878167
},
{
"source": 29,
"target": 10,
"value": -1.1000261809318339
},
{
"source": 29,
"target": 11,
"value": 0.76571093539752877
},
{
"source": 29,
"target": 12,
"value": 1.1654066547449542
},
{
"source": 29,
"target": 13,
"value": 0.30638632954078521
},
{
"source": 29,
"target": 14,
"value": -1.3658942615835377
},
{
"source": 29,
"target": 15,
"value": 0.63549229079156722
},
{
"source": 29,
"target": 16,
"value": -0.3777986162870462
},
{
"source": 29,
"target": 17,
"value": 0.5216653092127157
},
{
"source": 29,
"target": 18,
"value": -0.60849743314949201
},
{
"source": 29,
"target": 19,
"value": 0.39848412786307019
},
{
"source": 29,
"target": 20,
"value": -0.98835496781093402
},
{
"source": 29,
"target": 21,
"value": 1.3634921398558668
},
{
"source": 29,
"target": 22,
"value": 1.3626978301937613
},
{
"source": 29,
"target": 23,
"value": -0.11229158548175565
},
{
"source": 29,
"target": 24,
"value": -0.26271999524063422
},
{
"source": 29,
"target": 25,
"value": 0.50352405880486717
},
{
"source": 29,
"target": 26,
"value": 0.49800601365220332
},
{
"source": 29,
"target": 27,
"value": 1.5259420051259061
},
{
"source": 29,
"target": 28,
"value": 0.33918921246168449
},
{
"source": 30,
"target": 0,
"value": -0.29426382410739321
},
{
"source": 30,
"target": 1,
"value": -0.61807164909973367
},
{
"source": 30,
"target": 2,
"value": -0.25253411392536301
},
{
"source": 30,
"target": 3,
"value": -0.7866067603412964
},
{
"source": 30,
"target": 4,
"value": -0.22802666399203181
},
{
"source": 30,
"target": 5,
"value": 0.97786079370694079
},
{
"source": 30,
"target": 6,
"value": -1.2004498322125412
},
{
"source": 30,
"target": 7,
"value": -0.22037930998865377
},
{
"source": 30,
"target": 8,
"value": -0.24048990550673521
},
{
"source": 30,
"target": 9,
"value": -0.2016754684359712
},
{
"source": 30,
"target": 10,
"value": 1.475989379760227
},
{
"source": 30,
"target": 11,
"value": -0.55700056844027346
},
{
"source": 30,
"target": 12,
"value": -0.50255320379235024
},
{
"source": 30,
"target": 13,
"value": -0.43750130872017196
},
{
"source": 30,
"target": 14,
"value": 0.966927022992914
},
{
"source": 30,
"target": 15,
"value": 0.37967009740436636
},
{
"source": 30,
"target": 16,
"value": 0.048795578556070827
},
{
"source": 30,
"target": 17,
"value": 0.25062286928083294
},
{
"source": 30,
"target": 18,
"value": 2.9610247136905192
},
{
"source": 30,
"target": 19,
"value": 2.299033235416911
},
{
"source": 30,
"target": 20,
"value": -1.2106592742890685
},
{
"source": 30,
"target": 21,
"value": 0.41865514080710392
},
{
"source": 30,
"target": 22,
"value": 1.161954005187078
},
{
"source": 30,
"target": 23,
"value": -0.15700654039432166
},
{
"source": 30,
"target": 24,
"value": -1.2541429372875295
},
{
"source": 30,
"target": 25,
"value": -0.57455805516583713
},
{
"source": 30,
"target": 26,
"value": -0.66243827469349781
},
{
"source": 30,
"target": 27,
"value": 3.7026175147507585
},
{
"source": 30,
"target": 28,
"value": -0.35302722964489658
},
{
"source": 31,
"target": 0,
"value": -0.00086380190223735588
},
{
"source": 31,
"target": 1,
"value": 0.73563838304559537
},
{
"source": 31,
"target": 2,
"value": -0.68028974738450165
},
{
"source": 31,
"target": 3,
"value": 0.040925842625816389
},
{
"source": 31,
"target": 4,
"value": 0.35933022848435214
},
{
"source": 31,
"target": 5,
"value": -1.5874002947748991
},
{
"source": 31,
"target": 6,
"value": -1.0416860811493811
},
{
"source": 31,
"target": 7,
"value": 0.071551407769019026
},
{
"source": 31,
"target": 8,
"value": -0.16832266488531428
},
{
"source": 31,
"target": 9,
"value": -1.3773033079193602
},
{
"source": 31,
"target": 10,
"value": 3.6045390891373414
},
{
"source": 31,
"target": 11,
"value": -0.004601068260114932
},
{
"source": 31,
"target": 12,
"value": 1.5275687323538101
},
{
"source": 31,
"target": 13,
"value": -0.30015470656206306
},
{
"source": 31,
"target": 14,
"value": -0.78613550878335348
},
{
"source": 31,
"target": 15,
"value": -0.13805092377599437
},
{
"source": 31,
"target": 16,
"value": -0.36648041838703632
},
{
"source": 31,
"target": 17,
"value": -0.79697020592613732
},
{
"source": 31,
"target": 18,
"value": -0.030155543549293885
},
{
"source": 31,
"target": 19,
"value": 0.8031000562425058
},
{
"source": 31,
"target": 20,
"value": 0.68314556149261385
},
{
"source": 31,
"target": 21,
"value": -0.90070815375472579
},
{
"source": 31,
"target": 22,
"value": 0.15251076952161385
},
{
"source": 31,
"target": 23,
"value": 0.1400920114902994
},
{
"source": 31,
"target": 24,
"value": 0.37681542079029745
},
{
"source": 31,
"target": 25,
"value": -1.21431962062798
},
{
"source": 31,
"target": 26,
"value": 1.3261974651759432
},
{
"source": 31,
"target": 27,
"value": 1.5230702787651471
},
{
"source": 31,
"target": 28,
"value": -1.3120018235608866
},
{
"source": 32,
"target": 0,
"value": -0.27673681858229771
},
{
"source": 32,
"target": 1,
"value": -0.42608088729543225
},
{
"source": 32,
"target": 2,
"value": -0.16016046106902285
},
{
"source": 32,
"target": 3,
"value": -0.8900327708934801
},
{
"source": 32,
"target": 4,
"value": -0.43740543441070218
},
{
"source": 32,
"target": 5,
"value": 0.14389721445392059
},
{
"source": 32,
"target": 6,
"value": -0.5734259576815256
},
{
"source": 32,
"target": 7,
"value": -0.48641938055553524
},
{
"source": 32,
"target": 8,
"value": -0.53696348177917763
},
{
"source": 32,
"target": 9,
"value": -0.65704100205661775
},
{
"source": 32,
"target": 10,
"value": -0.47334541833491972
},
{
"source": 32,
"target": 11,
"value": -0.2374752785113973
},
{
"source": 32,
"target": 12,
"value": -0.66939653780730579
},
{
"source": 32,
"target": 13,
"value": -0.55943530194570934
},
{
"source": 32,
"target": 14,
"value": 0.038953301114453984
},
{
"source": 32,
"target": 15,
"value": 0.033709720905365538
},
{
"source": 32,
"target": 16,
"value": -0.34358780114123438
},
{
"source": 32,
"target": 17,
"value": -0.51321808741595465
},
{
"source": 32,
"target": 18,
"value": -0.59230331294493965
},
{
"source": 32,
"target": 19,
"value": -0.43122183515167389
},
{
"source": 32,
"target": 20,
"value": 5.3392028968491774
},
{
"source": 32,
"target": 21,
"value": -0.49377858676535641
},
{
"source": 32,
"target": 22,
"value": -0.64500036102489444
},
{
"source": 32,
"target": 23,
"value": -0.47798486719429606
},
{
"source": 32,
"target": 24,
"value": -0.40157974560669996
},
{
"source": 32,
"target": 25,
"value": -0.62178212374674802
},
{
"source": 32,
"target": 26,
"value": -0.249394626762485
},
{
"source": 32,
"target": 27,
"value": -0.30336524903913115
},
{
"source": 32,
"target": 28,
"value": -0.92234330161247435
},
{
"source": 33,
"target": 0,
"value": -0.31807578971496148
},
{
"source": 33,
"target": 1,
"value": -0.81411080890463727
},
{
"source": 33,
"target": 2,
"value": 0.64654518833047936
},
{
"source": 33,
"target": 3,
"value": 0.26837168993257876
},
{
"source": 33,
"target": 4,
"value": -9.4251209607720785
},
{
"source": 33,
"target": 5,
"value": -1.0738534726667999
},
{
"source": 33,
"target": 6,
"value": -2.0495896257610342
},
{
"source": 33,
"target": 7,
"value": -0.34692102447573298
},
{
"source": 33,
"target": 8,
"value": 0.99728318148599393
},
{
"source": 33,
"target": 9,
"value": 0.30061925266560158
},
{
"source": 33,
"target": 10,
"value": -0.54310386408692968
},
{
"source": 33,
"target": 11,
"value": -1.1507921721508831
},
{
"source": 33,
"target": 12,
"value": -2.2830611666426277
},
{
"source": 33,
"target": 13,
"value": -0.162802216319932
},
{
"source": 33,
"target": 14,
"value": -1.0538597126704938
},
{
"source": 33,
"target": 15,
"value": -1.3775417431462642
},
{
"source": 33,
"target": 16,
"value": -0.28834947400520233
},
{
"source": 33,
"target": 17,
"value": -0.92226688416600189
},
{
"source": 33,
"target": 18,
"value": -1.1239530909355047
},
{
"source": 33,
"target": 19,
"value": -0.76295389349714404
},
{
"source": 33,
"target": 20,
"value": -0.68735714807382708
},
{
"source": 33,
"target": 21,
"value": 0.28991073036249693
},
{
"source": 33,
"target": 22,
"value": 0.3175766721607734
},
{
"source": 33,
"target": 23,
"value": -0.34556551532343949
},
{
"source": 33,
"target": 24,
"value": 0.54168300030918193
},
{
"source": 33,
"target": 25,
"value": 0.0097540987668190676
},
{
"source": 33,
"target": 26,
"value": 0.73792006028647306
},
{
"source": 33,
"target": 27,
"value": -0.62427175212616459
},
{
"source": 33,
"target": 28,
"value": 0.10053254669580289
},
{
"source": 34,
"target": 0,
"value": -0.6701777139843802
},
{
"source": 34,
"target": 1,
"value": 3.2245335012066292
},
{
"source": 34,
"target": 2,
"value": 0.14550955170191307
},
{
"source": 34,
"target": 3,
"value": 0.10743231870165398
},
{
"source": 34,
"target": 4,
"value": -1.1204927385109473
},
{
"source": 34,
"target": 5,
"value": 0.28889053886445004
},
{
"source": 34,
"target": 6,
"value": 1.5495459182310709
},
{
"source": 34,
"target": 7,
"value": -0.34266505123593288
},
{
"source": 34,
"target": 8,
"value": -0.017402854803722605
},
{
"source": 34,
"target": 9,
"value": -0.42000224405958181
},
{
"source": 34,
"target": 10,
"value": -0.36138745257848864
},
{
"source": 34,
"target": 11,
"value": -1.2642720746382186
},
{
"source": 34,
"target": 12,
"value": -0.79450776457571159
},
{
"source": 34,
"target": 13,
"value": -0.61994467752416005
},
{
"source": 34,
"target": 14,
"value": -0.33876780208610108
},
{
"source": 34,
"target": 15,
"value": -0.14852947793770135
},
{
"source": 34,
"target": 16,
"value": -1.0788796451123701
},
{
"source": 34,
"target": 17,
"value": 0.13093901431139371
},
{
"source": 34,
"target": 18,
"value": -1.3078153125051004
},
{
"source": 34,
"target": 19,
"value": -1.818798473691809
},
{
"source": 34,
"target": 20,
"value": 3.6836943367645332
},
{
"source": 34,
"target": 21,
"value": 0.92064735679237486
},
{
"source": 34,
"target": 22,
"value": -0.8470569743978984
},
{
"source": 34,
"target": 23,
"value": -0.3437984977747669
},
{
"source": 34,
"target": 24,
"value": -1.2155256600876287
},
{
"source": 34,
"target": 25,
"value": -0.85384533355982839
},
{
"source": 34,
"target": 26,
"value": -0.35721505517466434
},
{
"source": 34,
"target": 27,
"value": -0.043911541065226406
},
{
"source": 34,
"target": 28,
"value": -0.95584730867419765
},
{
"source": 35,
"target": 0,
"value": -0.69525288811523556
},
{
"source": 35,
"target": 1,
"value": 4.2998771337499422
},
{
"source": 35,
"target": 2,
"value": -0.1755871259674277
},
{
"source": 35,
"target": 3,
"value": -0.061022136688930834
},
{
"source": 35,
"target": 4,
"value": -0.39164601759494466
},
{
"source": 35,
"target": 5,
"value": 3.3854510378268792
},
{
"source": 35,
"target": 6,
"value": 0.34511428824516799
},
{
"source": 35,
"target": 7,
"value": -0.5057349928809276
},
{
"source": 35,
"target": 8,
"value": -0.48295386376639787
},
{
"source": 35,
"target": 9,
"value": -0.081815585753656078
},
{
"source": 35,
"target": 10,
"value": -0.92848687920224715
},
{
"source": 35,
"target": 11,
"value": 0.97620913668027165
},
{
"source": 35,
"target": 12,
"value": 0.099021486738859826
},
{
"source": 35,
"target": 13,
"value": 2.4946905564773996
},
{
"source": 35,
"target": 14,
"value": -1.0887427791402096
},
{
"source": 35,
"target": 15,
"value": 0.4371747511345086
},
{
"source": 35,
"target": 16,
"value": -0.50716946747997949
},
{
"source": 35,
"target": 17,
"value": 2.0287243187819697
},
{
"source": 35,
"target": 18,
"value": -0.50795424730547056
},
{
"source": 35,
"target": 19,
"value": 0.1435062808632514
},
{
"source": 35,
"target": 20,
"value": -1.1970295298147862
},
{
"source": 35,
"target": 21,
"value": 0.61037951819305725
},
{
"source": 35,
"target": 22,
"value": 0.095879151126137582
},
{
"source": 35,
"target": 23,
"value": -0.66311872731002841
},
{
"source": 35,
"target": 24,
"value": 0.50821983951667304
},
{
"source": 35,
"target": 25,
"value": -0.74181541899072123
},
{
"source": 35,
"target": 26,
"value": 2.385310260144355
},
{
"source": 35,
"target": 27,
"value": 0.35475035528274296
},
{
"source": 35,
"target": 28,
"value": 0.65843763357203866
},
{
"source": 36,
"target": 0,
"value": -0.33784902495147412
},
{
"source": 36,
"target": 1,
"value": -0.53526591762053999
},
{
"source": 36,
"target": 2,
"value": 0.80316045916521683
},
{
"source": 36,
"target": 3,
"value": 0.27591146457079874
},
{
"source": 36,
"target": 4,
"value": 0.98134304899948199
},
{
"source": 36,
"target": 5,
"value": -0.74845114375717081
},
{
"source": 36,
"target": 6,
"value": -0.092431408101617388
},
{
"source": 36,
"target": 7,
"value": -0.32647710356043419
},
{
"source": 36,
"target": 8,
"value": -0.38124391717101991
},
{
"source": 36,
"target": 9,
"value": -0.57534382374654269
},
{
"source": 36,
"target": 10,
"value": -0.63351617011333805
},
{
"source": 36,
"target": 11,
"value": -0.38096141115203647
},
{
"source": 36,
"target": 12,
"value": -1.7206161971944691
},
{
"source": 36,
"target": 13,
"value": -0.85605361043066086
},
{
"source": 36,
"target": 14,
"value": -0.58095037354617984
},
{
"source": 36,
"target": 15,
"value": 0.3732931164679133
},
{
"source": 36,
"target": 16,
"value": 0.90549088565358726
},
{
"source": 36,
"target": 17,
"value": 0.13570555450243288
},
{
"source": 36,
"target": 18,
"value": 1.1077806557744825
},
{
"source": 36,
"target": 19,
"value": -0.54518314383919886
},
{
"source": 36,
"target": 20,
"value": 0.47556170084267668
},
{
"source": 36,
"target": 21,
"value": 0.016687595857860758
},
{
"source": 36,
"target": 22,
"value": -0.17217821910225822
},
{
"source": 36,
"target": 23,
"value": 0.58518668573167787
},
{
"source": 36,
"target": 24,
"value": -0.40480014044550006
},
{
"source": 36,
"target": 25,
"value": -3.9973181491601069
},
{
"source": 36,
"target": 26,
"value": 0.71102976491448877
},
{
"source": 36,
"target": 27,
"value": -0.4708840608464272
},
{
"source": 36,
"target": 28,
"value": 0.35438629573472163
},
{
"source": 37,
"target": 0,
"value": -0.36817321671083819
},
{
"source": 37,
"target": 1,
"value": 0.2091924463186885
},
{
"source": 37,
"target": 2,
"value": 0.26631755508103999
},
{
"source": 37,
"target": 3,
"value": -0.10065679908106455
},
{
"source": 37,
"target": 4,
"value": -0.33679171828024607
},
{
"source": 37,
"target": 5,
"value": -0.060827203609948526
},
{
"source": 37,
"target": 6,
"value": -0.19902159927550792
},
{
"source": 37,
"target": 7,
"value": -0.76588267133204579
},
{
"source": 37,
"target": 8,
"value": -0.071476547796629347
},
{
"source": 37,
"target": 9,
"value": -0.44027030011015128
},
{
"source": 37,
"target": 10,
"value": -0.35486839977641099
},
{
"source": 37,
"target": 11,
"value": 3.4681213759892016
},
{
"source": 37,
"target": 12,
"value": 5.8537267142548268
},
{
"source": 37,
"target": 13,
"value": -0.4651354081795
},
{
"source": 37,
"target": 14,
"value": 0.074434691605800463
},
{
"source": 37,
"target": 15,
"value": 7.0851997052766817
},
{
"source": 37,
"target": 16,
"value": -0.39905057463856936
},
{
"source": 37,
"target": 17,
"value": -0.33499977332453068
},
{
"source": 37,
"target": 18,
"value": -0.62307114729869462
},
{
"source": 37,
"target": 19,
"value": -0.40623083318674874
},
{
"source": 37,
"target": 20,
"value": 0.93905811571873388
},
{
"source": 37,
"target": 21,
"value": -0.26953388455939037
},
{
"source": 37,
"target": 22,
"value": 0.11795050253595875
},
{
"source": 37,
"target": 23,
"value": 0.19754729985160138
},
{
"source": 37,
"target": 24,
"value": -0.36540793118029047
},
{
"source": 37,
"target": 25,
"value": -0.056856473213647958
},
{
"source": 37,
"target": 26,
"value": 0.0019832124074476314
},
{
"source": 37,
"target": 27,
"value": 0.081609958663854065
},
{
"source": 37,
"target": 28,
"value": -0.60329985490429783
}
]
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="author" content="">
<title>D3 Clustergram</title>
<!-- Bootstrap Core CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<link rel="stylesheet" href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
<link rel="stylesheet" href="custom.css">
</head>
<body>
<div id="wrapper" class='toggled'>
<!-- Page Content -->
<div id="page-content-wrapper">
<!-- Initial Content -->
<div id='main_container'>
<!-- this row is required, -fluid causes problems -->
<div class="row" >
<div class="col-lg-12">
<!-- visualization -->
<div id='viz_container'>
<div class='row'>
<div id='clust_instruct_container' >
<h1 id='viz_website_title'>D3 Clustergram</h1>
<div id='viz_gmt_labels'></div>
<div id='title_viz_instruct_text'>About:</div>
<div class='viz_instruct_text'> This clustergram visualizes the example network located in static/networks/example_network.json. Zoom into the clustergram by scrolling. Double-click to reset zoom. Click on rows and columns to reorder. Search for a gene to zoom into the matrix. </div>
<!-- input box for gene search -->
<div id='gene_search_container' class='row'>
<input id='gene_search_box' type="text" class="form-control" placeholder="Input Gene" aria-describedby="sizing-addon2">
<div id='gene_search_button' class="btn-group" data-toggle="buttons" >
<label id='gene_search_submit' class="btn btn-primary active " onclick="find_gene_in_clust();">
<input type="radio" name="options" id="" autocomplete="off" checked > Search
</label>
</div>
</div>
<div id='toggle_order' class="btn-group" data-toggle="buttons" >
<label class="btn btn-primary active prot_class" onclick="reorder_clust_rank('clust');">
<input type="radio" name="options" id="clust_button" autocomplete="off" checked > Cluster
</label>
<label class="btn btn-primary prot_class" onclick="reorder_clust_rank('rank');">
<input type="radio" name="options" id="rank_button" autocomplete="off" > Rank
</label>
</div>
</div>
</div>
<div id='clustergram_container' >
<div id='col_title'>Columns</div>
<div id='clust_and_row_container'>
<div id='row_title'>Rows</div>
<div id='svg_div'></div>
</div>
</div>
</div>
</div>
<!-- end visualization -->
</div>
</div> <!-- end row -->
</div>
</div>
<!-- /#page-content-wrapper -->
</div>
<!-- /#wrapper -->
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
<script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js" charset="utf-8"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src='d3_clustergram.js'></script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment