"),html.push(''),html.push(""),$(html.join("")).appendTo($el),(new morpheus.HelpMenu).$el.appendTo($el.find("[data-name=help]"));var formBuilder=new morpheus.FormBuilder;formBuilder.append({name:"file",showLabel:!1,value:"",type:"file",required:!0,help:morpheus.DatasetUtil.DATASET_FILE_FORMATS}),formBuilder.$form.appendTo($el.find("[data-name=formRow]")),this.formBuilder=formBuilder,this.$sampleDatasetsEl=$el.find("[data-name=exampleRow]")},morpheus.LandingPage.prototype={dispose:function(){this.formBuilder.setValue("file",""),this.$el.hide(),$(window).off("paste.morpheus drop.morpheus dragover.morpheus dragenter.morpheus beforeunload.morpheus"),$(window).on("beforeunload.morpheus",function(){return"Are you sure you want to close Morpheus?"}),this.formBuilder.off("change")},show:function(){var _this=this;this.sampleDatasets||(this.sampleDatasets=new morpheus.SampleDatasets({$el:this.$sampleDatasetsEl,callback:function(heatMapOptions){_this.open(heatMapOptions)}})),this.$el.show(),this.formBuilder.on("change",function(e){var value=e.value;""!==value&&null!=value&&_this.openFile(value)}),$(window).on("paste.morpheus",function(e){var tagName=e.target.tagName;if("INPUT"!=tagName&&"SELECT"!=tagName&&"TEXTAREA"!=tagName){var text=e.originalEvent.clipboardData.getData("text/plain");if(null!=text&&text.length>0){var blob=new Blob([text]),url=window.URL.createObjectURL(blob);e.preventDefault(),e.stopPropagation(),_this.openFile(url)}}}).on("dragover.morpheus dragenter.morpheus",function(e){e.preventDefault(),e.stopPropagation()}).on("drop.morpheus",function(e){if(e.originalEvent.dataTransfer&&e.originalEvent.dataTransfer.files.length){e.preventDefault(),e.stopPropagation();var files=e.originalEvent.dataTransfer.files;_this.openFile(files[0])}else if(e.originalEvent.dataTransfer){var url=e.originalEvent.dataTransfer.getData("URL");e.preventDefault(),e.stopPropagation(),_this.openFile(url)}})},open:function(openOptions){this.dispose();var heatmap,optionsArray=_.isArray(openOptions)?openOptions:[openOptions],_this=this;optionsArray.forEach(function(options){null==_this.heatmap?(options.landingPage=_this,options.el=_this.pageOptions.el):(options.focus=!1,options.inheritFromParent=!1,options.parent=_this.heatmap),heatmap=new morpheus.HeatMap(options),null==_this.heatmap&&(_this.heatmap=heatmap)})},openFile:function(value){var _this=this,options={dataset:value},fileName=morpheus.Util.getFileName(value);morpheus.OpenDatasetTool.fileExtensionPrompt(fileName,function(readOptions){if(readOptions){var dataset=options.dataset;options.dataset={file:dataset,options:{}};for(var key in readOptions)options.dataset.options[key]=readOptions[key]}_this.open(options)})}},morpheus.SampleDatasets=function(options){options.openText||(options.openText="Open");var _this=this,$el=options.$el;this.callback=options.callback;var exampleHtml=[];exampleHtml.push('
'),exampleHtml.push("
Cancer Cell Line Encyclopedia (CCLE), Project Achilles
"),exampleHtml.push('
Gene Expression
'),exampleHtml.push('
Copy Number By Gene
'),exampleHtml.push('
Mutations
'),exampleHtml.push('
Gene essentiality
'),exampleHtml.push('
"),exampleHtml.push("
"),exampleHtml.push('
TCGA data version 1/11/2015
Please adhere to the TCGA publication guidelines when using TCGA data in your publications.'),exampleHtml.push(''),$(exampleHtml.join("")).appendTo($el),$el.find("[name=ccle]").on("click",function(e){e.preventDefault();var $this=$(this),obj={};$this.parents("tr").find("input:checked").each(function(i,c){obj[$(c).data("type")]=!0}),_this.openCCLE(obj)}),$el.on("click","[name=tcgaLink]",function(e){e.preventDefault();var $this=$(this),type=$this.data("disease-type"),obj={};$this.parents("tr").find("input:checked").each(function(i,c){obj[$(c).data("type")]=!0});for(var options,i=0;i<_this.diseases.length;i++)if(_this.diseases[i].type===type){options=_this.diseases[i];break}obj.type=type,obj.name=options.name,_this.openTcga(obj)}),$el.on("click","[data-toggle=dataTypeToggle]",function(e){var $this=$(this),$button=$this.parents("tr").find("button"),isDisabled=0===$this.parents("tr").find("input:checked").length;$button.prop("disabled",isDisabled),isDisabled||$button.removeClass("animated flash").addClass("animated flash").one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){$(this).removeClass("animated flash")})}),$.ajax("https://s3.amazonaws.com/data.clue.io/morpheus/tcga/tcga_index.txt").done(function(text){for(var lines=text.split("\n"),diseases=[],i=0;ia?-1:1});var tcga=[];_this.diseases=diseases,tcga.push('
").appendTo(this.$chart);for(var rowIndexOne=0,nrows=dataset.getRowCount();nrows>rowIndexOne;rowIndexOne++)for(var rowIndexTwo=0;nrows>rowIndexTwo;rowIndexTwo++)if(!(rowIndexOne>rowIndexTwo)){var $chart=$(''),myPlot=$chart[0];if($chart.appendTo(this.$chart),rowIndexOne===rowIndexTwo){for(var array=[],j=0,ncols=dataset.getColumnCount();ncols>j;j++)array.push({row:rowIndexTwo,column:j});this._createBoxPlot({array:array,points:showPoints,colorByVector:colorByVector,colorModel:colorModel,colorByGetter:function(item){return colorByVector.getValue(item.column)},sizeByGetter:function(item){return sizeByVector.getValue(item.column)},sizeFunction:sizeByScale,myPlot:myPlot,dataset:dataset,config:config,transposed:isColumns,layout:$.extend(!0,{},layout,{width:chartWidth,height:chartHeight,margin:{b:80},xaxis:{title:null==axisLabelVector?"":axisLabelVector.getValue(rowIndexTwo),showticklabels:!1}})})}else this._createScatter({isColumnChart:transpose,rowIndexOne:rowIndexOne,rowIndexTwo:rowIndexTwo,colorByVector:colorByVector,colorModel:colorModel,colorByGetter:function(item){return colorByVector.getValue(item.column)},sizeByVector:sizeByVector,sizeFunction:sizeByScale,myPlot:myPlot,dataset:dataset,config:config,layout:$.extend(!0,{},layout,{width:chartWidth,height:chartHeight,margin:{b:80},yaxis:{title:null==axisLabelVector?"":axisLabelVector.getValue(rowIndexOne)},xaxis:{title:null==axisLabelVector?"":axisLabelVector.getValue(rowIndexTwo)}})})}}else if("boxplot"===chartType){for(var i=0,nrows=dataset.getRowCount();nrows>i;i++)for(var j=0,ncols=dataset.getColumnCount();ncols>j;j++)items.push({row:i,column:j});var colorByInfo=morpheus.ChartTool2.getVectorInfo(colorBy),colorByVector=colorByInfo.isColumns?dataset.getColumnMetadata().getByName(colorByInfo.field):dataset.getRowMetadata().getByName(colorByInfo.field),colorModel=colorByInfo.isColumns?this.project.getColumnColorModel():this.project.getRowColorModel(),colorByGetter=colorByInfo.isColumns?function(item){return colorByVector.getValue(item.column)}:function(item){return colorByVector.getValue(item.row)},sizeByVector=sizeByInfo.isColumns?dataset.getColumnMetadata().getByName(sizeByInfo.field):dataset.getRowMetadata().getByName(sizeByInfo.field),sizeByGetter=sizeByInfo.isColumns?function(item){return sizeByVector.getValue(item.column)}:function(item){return sizeByVector.getValue(item.row)},sizeByScale=null;if(sizeByVector){var minMax=morpheus.VectorUtil.getMinMax(sizeByVector);sizeByScale=d3.scale.linear().domain([minMax.min,minMax.max]).range([3,16]).clamp(!0)}if(groupColumnsBy||groupRowsBy){var rowIdToArray=new morpheus.Map;if(groupRowsBy)for(var groupRowsByInfo=morpheus.ChartTool2.getVectorInfo(groupRowsBy),vector=groupRowsByInfo.isColumns?dataset.getColumnMetadata().getByName(groupRowsByInfo.field):dataset.getRowMetadata().getByName(groupRowsByInfo.field),getter=groupRowsByInfo.isColumns?function(item){return vector.getValue(item.column)}:function(item){return vector.getValue(item.row)},i=0,nitems=items.length;nitems>i;i++){var item=items[i],value=getter(item),array=rowIdToArray.get(value);void 0==array&&(array=[],rowIdToArray.set(value,array)),array.push(item)}else rowIdToArray.set(void 0,items);if(groupColumnsBy){var name=groupColumnsBy.substring(0,groupColumnsBy.length-2),isColumns="_c"===groupColumnsBy.substring(groupColumnsBy.length-2),vector=isColumns?dataset.getColumnMetadata().getByName(name):dataset.getRowMetadata().getByName(name),getter=isColumns?function(item){return vector.getValue(item.column)}:function(item){return vector.getValue(item.row)},columnIdToIndex=new morpheus.Map,rowIndex=0;rowIdToArray.forEach(function(array,id){grid[rowIndex]=[];for(var i=0,nitems=array.length;nitems>i;i++){var item=array[i],value=getter(item),columnIndex=columnIdToIndex.get(value);void 0===columnIndex&&(columnIndex=columnIdToIndex.size(),columnIdToIndex.set(value,columnIndex)),void 0===grid[rowIndex][columnIndex]&&(grid[rowIndex][columnIndex]=[]),grid[rowIndex][columnIndex].push(item)}rowIds[rowIndex]=id,rowIndex++}),columnIdToIndex.forEach(function(index,id){columnIds[index]=id})}else{var rowIndex=0;rowIdToArray.forEach(function(array,id){grid[rowIndex]=[array],rowIds[rowIndex]=id,rowIndex++})}}else grid=[[items]];for(var gridRowCount=rowIds.length,gridColumnCount=columnIds.length,i=0;gridRowCount>i;i++){var rowId=rowIds[i],yrange=[Number.MAX_VALUE,-Number.MAX_VALUE];if("boxplot"===chartType){for(var j=0;gridColumnCount>j;j++){var array=grid[i][j];if(array)for(var k=0,nitems=array.length;nitems>k;k++){var item=array[k],value=dataset.getValue(item.row,item.column);isNaN(value)||(yrange[0]=Math.min(yrange[0],value),yrange[1]=Math.max(yrange[1],value))}}var span=yrange[1]-yrange[0],delta=.01*span;yrange[1]+=delta,yrange[0]-=delta}for(var j=0;gridColumnCount>j;j++){var array=grid[i][j],columnId=columnIds[j];if(array){var $chart=$('');$chart.appendTo(this.$chart);var myPlot=$chart[0];"boxplot"===chartType&&this._createBoxPlot({layout:$.extend(!0,{},layout,{width:chartWidth,height:chartHeight,yaxis:{range:yrange,title:rowId},xaxis:{title:columnId,showticklabels:!1}}),array:array,points:showPoints,sizeByGetter:sizeByGetter,sizeFunction:sizeByScale,colorModel:colorModel,colorByVector:colorByVector,colorByGetter:colorByGetter,myPlot:myPlot,dataset:dataset,config:config})}}}}}},morpheus.CollapseDatasetTool=function(){},morpheus.CollapseDatasetTool.Functions=[morpheus.Mean,morpheus.Median,new morpheus.MaxPercentiles([25,75]),morpheus.Min,morpheus.Max,morpheus.Sum],morpheus.CollapseDatasetTool.Functions.fromString=function(s){for(var i=0;i__index;__index++){__rowView.setIndex(__index);var __val=eval(__formula);"function"==typeof __val&&(__val=""),__vector.setValue(__index,__val)}__project.trigger("trackChanged",{vectors:[__vector],render:["text"],columns:isColumns})}},morpheus.DendrogramEnrichmentTool=function(isColumns){this.isColumns=isColumns},morpheus.DendrogramEnrichmentTool.prototype={toString:function(){return"Dendrogram Enrichment"},gui:function(project){var dataset=project.getSortedFilteredDataset(),fields=morpheus.MetadataUtil.getMetadataNames(this.isColumns?dataset.getColumnMetadata():dataset.getRowMetadata());return[{name:"field",options:fields,type:"bootstrap-select",multiple:!1},{name:"min_p-value_for_enrichment",type:"text",value:"0.05"},{name:"minimum_number_of_total_members_in_group",type:"text",value:"5"},{name:"minimum_number_of_members_in_group",type:"text",value:"3"}]},execute:function(options){var project=options.project,controller=options.controller,pValue=options.input["min_p-value_for_enrichment"],minTotalGroupSize=options.input.minimum_number_of_total_members_in_group,minGroupSize=options.input.minimum_number_of_members_in_group,dataset=project.getSortedFilteredDataset(),dendrogram=this.isColumns?controller.columnDendrogram:controller.rowDendrogram,vector=this.isColumns?dataset.getColumnMetadata().getByName(options.input.field):dataset.getRowMetadata().getByName(options.input.field),valueToIndices=morpheus.VectorUtil.createValueToIndicesMap(vector),valueToGlobalCount=new morpheus.Map,values=[];valueToIndices.forEach(function(indices,value){valueToGlobalCount.set(value,indices.length),values.push(value)});
var nvalues=values.length,N=vector.size();morpheus.AbstractDendrogram.dfs(dendrogram.tree.rootNode,function(node){delete node.info;for(var valueToCount=new morpheus.Map,i=0;nvalues>i;i++)valueToCount.set(values[i],0);var min=node.minIndex,max=node.maxIndex,n=max-min+1;if(n>1&&n>=minTotalGroupSize){for(var i=min;max>=i;i++){var value=vector.getValue(i);valueToCount.set(value,valueToCount.get(value)+1)}for(var i=0;nvalues>i;i++){var K=valueToGlobalCount.get(values[i]),k=valueToCount.get(values[i]);if(k>=minGroupSize){var a=k,b=K-k,c=n-k,d=N+k-n-K,p=morpheus.FisherExact.fisherTest(a,b,c,d);pValue>=p&&(node.info||(node.info={}),node.info[values[i]]=p)}}}return!0}),dendrogram.setInvalid(!0),dendrogram.repaint()}},morpheus.DevAPI=function(){},morpheus.DevAPI.prototype={toString:function(){return"API"},gui:function(){return[{name:"code",value:"",type:"textarea",required:!0,help:"Enter your code"}]},execute:function(options){var project=options.project,controller=options.controller,code=options.input.code,dataset=project.getSortedFilteredDataset();eval(code),project.setFullDataset(project.getFullDataset(),!0)}},morpheus.HClusterTool=function(){},morpheus.HClusterTool.PRECOMPUTED_DIST="Matrix values (for a precomputed distance matrix)",morpheus.HClusterTool.PRECOMPUTED_SIM="Matrix values (for a precomputed similarity matrix)",morpheus.HClusterTool.Functions=[morpheus.Euclidean,morpheus.Jaccard,new morpheus.OneMinusFunction(morpheus.Cosine),new morpheus.OneMinusFunction(morpheus.Pearson),new morpheus.OneMinusFunction(morpheus.Spearman),morpheus.HClusterTool.PRECOMPUTED_DIST,morpheus.HClusterTool.PRECOMPUTED_SIM],morpheus.HClusterTool.Functions.fromString=function(s){for(var i=0;i0?new morpheus.HClusterGroupBy(d,groupByFields,f,linkageMethod):new morpheus.HCluster(morpheus.HCluster.computeDistanceMatrix(d,f),linkageMethod)};return rows&&(rowsHcl=doCluster(input.selectedColumns?new morpheus.SlicedDatasetView(dataset,null,input.selectedColumns):dataset,input.group_rows_by)),columns&&(columnsHcl=doCluster(morpheus.DatasetUtil.transposedView(input.selectedRows?new morpheus.SlicedDatasetView(dataset,input.selectedRows,null):dataset),input.group_columns_by)),{rowsHcl:rowsHcl,columnsHcl:columnsHcl}},morpheus.HClusterTool.prototype={toString:function(){return"Hierarchical Clustering"},init:function(project,form){form.setOptions("group_rows_by",morpheus.MetadataUtil.getMetadataNames(project.getFullDataset().getRowMetadata())),form.setOptions("group_columns_by",morpheus.MetadataUtil.getMetadataNames(project.getFullDataset().getColumnMetadata())),form.setVisible("group_rows_by",!1),form.setVisible("cluster_rows_in_space_of_selected_columns_only",!1),form.$form.find("[name=cluster]").on("change",function(e){var val=$(this).val(),showGroupColumns=!1,showGroupRows=!1;"Columns"===val?showGroupColumns=!0:"Rows"===val?showGroupRows=!0:(showGroupColumns=!0,showGroupRows=!0),form.setVisible("group_columns_by",showGroupColumns),form.setVisible("group_rows_by",showGroupRows),form.setVisible("cluster_columns_in_space_of_selected_rows_only",showGroupColumns),form.setVisible("cluster_rows_in_space_of_selected_columns_only",showGroupRows)})},gui:function(){return[{name:"metric",options:morpheus.HClusterTool.Functions,value:morpheus.HClusterTool.Functions[3].toString(),type:"select"},{name:"cluster",options:["Columns","Rows","Rows and columns"],value:"Columns",type:"select"},{name:"linkage_method",options:["Average","Complete","Single"],value:"Average",type:"select"},{name:"group_columns_by",options:[],type:"bootstrap-select",multiple:!0},{name:"group_rows_by",options:[],type:"bootstrap-select",multiple:!0},{name:"cluster_columns_in_space_of_selected_rows_only",type:"checkbox"},{name:"cluster_rows_in_space_of_selected_columns_only",type:"checkbox"}]},execute:function(options){var project=options.project,controller=options.controller,selectedRows=options.input.cluster_columns_in_space_of_selected_rows_only?project.getRowSelectionModel().getViewIndices().values():null,selectedColumns=options.input.cluster_rows_in_space_of_selected_columns_only?project.getColumnSelectionModel().getViewIndices().values():null,rows="Rows"==options.input.cluster||"Rows and columns"==options.input.cluster,columns="Columns"==options.input.cluster||"Rows and columns"==options.input.cluster;options.input.selectedRows=selectedRows,options.input.selectedColumns=selectedColumns;var dataset=project.getSortedFilteredDataset();if(options.input.background!==!1){var subtitle=["clustering "];rows&&subtitle.push(dataset.getRowCount()+" row"+morpheus.Util.s(dataset.getRowCount())),columns&&(subtitle.push(rows?", ":""),subtitle.push(dataset.getColumnCount()+" column"+morpheus.Util.s(dataset.getColumnCount())));var blob=new Blob(["self.onmessage = function(e) {importScripts(e.data.scripts);self.postMessage(morpheus.HClusterTool.execute(morpheus.Dataset.fromJson(e.data.dataset), e.data.input));}"]),url=window.URL.createObjectURL(blob),worker=new Worker(url);return worker.postMessage({scripts:morpheus.Util.getScriptPath(),dataset:morpheus.Dataset.toJson(dataset,{columnFields:options.input.group_columns_by||[],rowFields:options.input.group_rows_by||[]}),input:options.input}),worker.onmessage=function(e){var result=e.data;result.rowsHcl&&controller.setDendrogram(result.rowsHcl.tree,!1,result.rowsHcl.reorderedIndices),result.columnsHcl&&controller.setDendrogram(result.columnsHcl.tree,!0,result.columnsHcl.reorderedIndices),worker.terminate(),window.URL.revokeObjectURL(url)},worker}var result=morpheus.HClusterTool.execute(dataset,options.input);result.rowsHcl&&controller.setDendrogram(result.rowsHcl.tree,!1,result.rowsHcl.reorderedIndices),result.columnsHcl&&controller.setDendrogram(result.columnsHcl.tree,!0,result.columnsHcl.reorderedIndices)}},morpheus.MarkerSelection=function(){},morpheus.MarkerSelection.Functions=[morpheus.FisherExact,morpheus.FoldChange,morpheus.SignalToNoise,morpheus.createSignalToNoiseAdjust(),morpheus.TTest],morpheus.MarkerSelection.Functions.fromString=function(s){for(var i=0;i0&&$field.val($field[0].options[0].value),updateAB($field.val());var $metric=form.$form.find("[name=metric]");$metric.on("change",function(e){var isFishy="Fisher Exact Test"===$(this).val();form.setVisible("grouping_value",isFishy),form.setVisible("permutations",!isFishy),form.setVisible("number_of_markers",!isFishy)}),form.setVisible("grouping_value",!1)},gui:function(project){var dataset=project.getSortedFilteredDataset(),fields=morpheus.MetadataUtil.getMetadataNames(dataset.getColumnMetadata());return[{name:"metric",options:morpheus.MarkerSelection.Functions,value:morpheus.SignalToNoise.toString(),type:"select",help:""},{name:"grouping_value",value:"1",help:"Class values are categorized into two groups based on whether dataset values are greater than or equal to this value"},{name:"field",options:fields,type:"select",multiple:!0},{name:"class_a",title:"Class A",options:[],value:"",type:"checkbox-list",multiple:!0},{name:"class_b",title:"Class B",options:[],value:"",type:"checkbox-list",multiple:!0},{name:"number_of_markers",value:"100",type:"text",help:'The initial number of markers to show in each direction. Click to change.'},{name:"permutations",value:"0",type:"text"}]},execute:function(options){function done(){project.getRowFilter().getFilters().length>0&&project.getRowFilter().setAnd(!0,!0);for(var rowFilters=project.getRowFilter().getFilters(),i=0;ii;i++){var abcd=morpheus.createContingencyTable(list1.setIndex(i),list2.setIndex(i),groupingValue);contingencyTableVector.setValue(i,"[["+abcd[0]+", "+abcd[1]+"], ["+abcd[2]+", "+abcd[3]+"]]");var ratio=abcd[0]*abcd[3]/(abcd[1]*abcd[2]);(isNaN(ratio)||ratio===Number.POSITIVE_INFINITY)&&(ratio=0),oddsRatioVector.setValue(i,ratio),v.setValue(i,morpheus.FisherExact.fisherTest(abcd[0],abcd[1],abcd[2],abcd[3])),pvalues.push(v.getValue(i))}for(var fdr=morpheus.FDR_BH(pvalues),i=0,size=dataset.getRowCount();size>i;i++)fdrVector.setValue(i,fdr[i]);vectors.push(oddsRatioVector),vectors.push(fdrVector),vectors.push(contingencyTableVector),done()}else{if(npermutations>0){options.input.numClassA=aIndices.length,options.input.npermutations=npermutations;var blob=new Blob(["self.onmessage = function(e) {importScripts(e.data.scripts);self.postMessage(morpheus.MarkerSelection.execute(morpheus.Dataset.fromJson(e.data.dataset), e.data.input));}"]),url=window.URL.createObjectURL(blob),worker=new Worker(url),subset=new morpheus.SlicedDatasetView(dataset,null,aIndices.concat(bIndices));return worker.postMessage({scripts:morpheus.Util.getScriptPath(),dataset:morpheus.Dataset.toJson(subset,{columnFields:[],rowFields:[]}),input:options.input}),worker.onmessage=function(e){for(var result=e.data,pvalueVector=dataset.getRowMetadata().add("p_value"),fdrVector=dataset.getRowMetadata().add("FDR(BH)"),kVector=dataset.getRowMetadata().add("k"),i=0,size=pvalueVector.size();size>i;i++)pvalueVector.setValue(i,result.rowSpecificPValues[i]),fdrVector.setValue(i,result.fdr[i]),kVector.setValue(i,result.k[i]),v.setValue(i,result.scores[i]);vectors.push(pvalueVector),vectors.push(fdrVector),vectors.push(kVector),done(),worker.terminate(),window.URL.revokeObjectURL(url)},worker}for(var i=0,size=dataset.getRowCount();size>i;i++)v.setValue(i,f(list1.setIndex(i),list2.setIndex(i)));done()}}},morpheus.NearestNeighbors=function(){},morpheus.NearestNeighbors.Functions=[morpheus.Cosine,morpheus.Euclidean,morpheus.Jaccard,morpheus.Pearson,morpheus.Spearman,morpheus.WeightedMean],morpheus.NearestNeighbors.Functions.fromString=function(s){for(var i=0;i1){for(var columnView=new morpheus.DatasetColumnView(d1),newDataset=new morpheus.Dataset({name:"",rows:1,columns:d1.getColumnCount()}),j=0,ncols=d1.getColumnCount();ncols>j;j++){var v=morpheus.Percentile(columnView.setIndex(j),50);newDataset.setValue(0,j,v)}d1=newDataset}list1=new morpheus.DatasetRowView(d1);var list2=new morpheus.DatasetRowView(dataset),v=dataset.getRowMetadata().getByName(f.toString());null==v&&(v=dataset.getRowMetadata().add(f.toString()));for(var i=0,size=dataset.getRowCount();size>i;i++)v.setValue(i,f(list1,list2.setIndex(i)));isColumns?project.setColumnSortKeys([new morpheus.SortKey(f.toString(),morpheus.SortKey.SortOrder.DESCENDING)],!0):project.setRowSortKeys([new morpheus.SortKey(f.toString(),morpheus.SortKey.SortOrder.DESCENDING)],!0),project.trigger("trackChanged",{vectors:[v],render:["text"],columns:isColumns})}},morpheus.NewHeatMapTool=function(){},morpheus.NewHeatMapTool.prototype={toString:function(){return"New Heat Map ("+morpheus.Util.COMMAND_KEY+"X)"},execute:function(options){var project=options.project,controller=options.controller,dataset=project.getSelectedDataset({selectedRows:!0,selectedColumns:!0});morpheus.DatasetUtil.shallowCopy(dataset);var name=options.input.name||controller.getName();new morpheus.HeatMap({name:name,dataset:dataset,parent:controller})}},morpheus.OpenDatasetTool=function(){this.customUrls=[]},morpheus.OpenDatasetTool.fileExtensionPrompt=function(file,callback){var ext=morpheus.Util.getExtension(morpheus.Util.getFileName(file));"maf"===ext?this._promptMaf(function(mafGeneFilter){callback(mafGeneFilter)}):"seg"===ext||"segtab"===ext?this._promptSegtab(function(regions){callback(regions)}):callback(null)},morpheus.OpenDatasetTool._promptMaf=function(promptCallback){var formBuilder=new morpheus.FormBuilder;formBuilder.append({name:"MAF_gene_symbols",value:"",type:"textarea",required:!0,help:"Enter one gene symbol per line to filter genes. Leave blank to show all genes."}),morpheus.FormBuilder.showInModal({title:"Gene Symbols",html:formBuilder.$form,close:"OK",callback:function(){for(var text=formBuilder.getValue("MAF_gene_symbols"),lines=morpheus.Util.splitOnNewLine(text),mafGeneFilter=new morpheus.Map,i=0,nlines=lines.length,counter=0;nlines>i;i++){var line=lines[i];""!==line&&mafGeneFilter.set(line,counter++)}var readOptions=mafGeneFilter.size()>0?{mafGeneFilter:mafGeneFilter}:null;promptCallback(readOptions)}})},morpheus.OpenDatasetTool._promptSegtab=function(promptCallback){var formBuilder=new morpheus.FormBuilder;formBuilder.append({name:"regions",value:"",type:"textarea",required:!0,help:"Define the regions over which you want to define the CNAs. Enter one region per line. Each line should contain region_id, chromosome, start, and end separated by a tab. Leave blank to use all unique segments in the segtab file as regions."}),morpheus.FormBuilder.showInModal({title:"Regions",html:formBuilder.$form,close:"OK",callback:function(){for(var text=formBuilder.getValue("regions"),lines=morpheus.Util.splitOnNewLine(text),regions=[],tab=/\t/,i=0,nlines=lines.length;nlines>i;i++){var line=lines[i];if(""!==line){var tokens=line.split(tab);tokens.length>=4&®ions.push({id:tokens[0],chromosome:tokens[1],start:parseInt(tokens[2]),end:parseInt(tokens[3])})}}var readOptions=regions.length>0?{regions:regions}:null;promptCallback(readOptions)}})},morpheus.OpenDatasetTool.prototype={toString:function(){return"Open Dataset"},_read:function(options,deferred){var _this=this,project=options.project,controller=options.controller,file=options.input.file,action=options.input.open_file_action,dataset=project.getSortedFilteredDataset();deferred.fail(function(err){var message=["Error opening "+morpheus.Util.getFileName(file)+"."];err.message&&(message.push(" Cause: "),message.push(err.message)),morpheus.FormBuilder.showInModal({title:"Error",html:message.join("")})}),deferred.done(function(newDataset){morpheus.Util.getExtension(morpheus.Util.getFileName(file)),morpheus.Util.getBaseFileName(morpheus.Util.getFileName(file));if("append"===action||"append columns"===action){var appendRows="append"===action;_.each(controller.options.rows,function(item){if(item.renameTo){var v=newDataset.getRowMetadata().getByName(item.field);v&&v.setName(item.renameTo)}}),_.each(controller.options.columns,function(item){if(item.renameTo){var v=newDataset.getColumnMetadata().getByName(item.field);v&&v.setName(item.renameTo)}}),controller.options.datasetReady&&controller.options.datasetReady(newDataset);var currentDatasetMetadataNames=morpheus.MetadataUtil.getMetadataNames(appendRows?dataset.getColumnMetadata():dataset.getRowMetadata()),newDatasetMetadataNames=morpheus.MetadataUtil.getMetadataNames(appendRows?newDataset.getColumnMetadata():newDataset.getRowMetadata());if(currentDatasetMetadataNames.length>1||newDatasetMetadataNames.length>1)_this._matchAppend(newDatasetMetadataNames,currentDatasetMetadataNames,controller,function(appendOptions){if(controller.getProject().setFullDataset(appendRows?new morpheus.JoinedDataset(dataset,newDataset,appendOptions.current_dataset_annotation_name,appendOptions.new_dataset_annotation_name):new morpheus.TransposedDatasetView(new morpheus.JoinedDataset(new morpheus.TransposedDatasetView(dataset),new morpheus.TransposedDatasetView(newDataset),appendOptions.current_dataset_annotation_name,appendOptions.new_dataset_annotation_name)),!0),controller.options.renderReady&&(controller.options.renderReady(controller),controller.updateDataset()),appendRows){controller.getHeatMapElementComponent().getColorScheme().setSeparateColorSchemeForRowMetadataField("Source");var sourcesSet=morpheus.VectorUtil.getSet(controller.getProject().getFullDataset().getRowMetadata().getByName("Source"));sourcesSet.forEach(function(source){controller.autoDisplay({extension:morpheus.Util.getExtension(source),filename:source})})}controller.tabManager.setTabTitle(controller.tabId,controller.getProject().getFullDataset().getRowCount()+" row"+morpheus.Util.s(controller.getProject().getFullDataset().getRowCount())+" x "+controller.getProject().getFullDataset().getColumnCount()+" column"+morpheus.Util.s(controller.getProject().getFullDataset().getColumnCount())),controller.revalidate()});else{if(controller.getProject().setFullDataset(appendRows?new morpheus.JoinedDataset(dataset,newDataset,currentDatasetMetadataNames[0],newDatasetMetadataNames[0]):new morpheus.TransposedDatasetView(new morpheus.JoinedDataset(new morpheus.TransposedDatasetView(dataset),new morpheus.TransposedDatasetView(newDataset),currentDatasetMetadataNames[0],newDatasetMetadataNames[0])),!0),controller.options.renderReady&&(controller.options.renderReady(controller),controller.updateDataset()),appendRows){controller.getHeatMapElementComponent().getColorScheme().setSeparateColorSchemeForRowMetadataField("Source");var sourcesSet=morpheus.VectorUtil.getSet(controller.getProject().getFullDataset().getRowMetadata().getByName("Source"));sourcesSet.forEach(function(source){controller.autoDisplay({extension:morpheus.Util.getExtension(source),filename:source})})}controller.tabManager.setTabTitle(controller.tabId,controller.getProject().getFullDataset().getRowCount()+" row"+morpheus.Util.s(controller.getProject().getFullDataset().getRowCount())+" x "+controller.getProject().getFullDataset().getColumnCount()+" column"+morpheus.Util.s(controller.getProject().getFullDataset().getColumnCount())),controller.revalidate()}}else"overlay"===action?_this._matchOverlay(morpheus.MetadataUtil.getMetadataNames(newDataset.getColumnMetadata()),morpheus.MetadataUtil.getMetadataNames(dataset.getColumnMetadata()),morpheus.MetadataUtil.getMetadataNames(newDataset.getRowMetadata()),morpheus.MetadataUtil.getMetadataNames(dataset.getRowMetadata()),controller,function(appendOptions){for(var rowValueToIndexMap=morpheus.VectorUtil.createValueToIndexMap(dataset.getRowMetadata().getByName(appendOptions.current_dataset_row_annotation_name)),columnValueToIndexMap=morpheus.VectorUtil.createValueToIndexMap(dataset.getColumnMetadata().getByName(appendOptions.current_dataset_column_annotation_name)),seriesIndex=dataset.addSeries({name:newDataset.getName(),dataType:"object"}),rowVector=newDataset.getRowMetadata().getByName(appendOptions.new_dataset_row_annotation_name),rowIndices=[],newDatasetRowIndicesSubset=[],i=0,size=rowVector.size();size>i;i++){var index=rowValueToIndexMap.get(rowVector.getValue(i));void 0!==index&&(rowIndices.push(index),newDatasetRowIndicesSubset.push(i))}for(var columnVector=newDataset.getColumnMetadata().getByName(appendOptions.new_dataset_column_annotation_name),columnIndices=[],newDatasetColumnIndicesSubset=[],i=0,size=columnVector.size();size>i;i++){var index=columnValueToIndexMap.get(columnVector.getValue(i));void 0!==index&&(columnIndices.push(index),newDatasetColumnIndicesSubset.push(i))}newDataset=new morpheus.SlicedDatasetView(newDataset,newDatasetRowIndicesSubset,newDatasetColumnIndicesSubset);for(var i=0,nrows=newDataset.getRowCount();nrows>i;i++)for(var j=0,ncols=newDataset.getColumnCount();ncols>j;j++)dataset.setValue(rowIndices[i],columnIndices[j],newDataset.getValue(i,j),seriesIndex)}):"open"===action?new morpheus.HeatMap({dataset:newDataset,parent:controller,inheritFromParent:!1}):console.log("Unknown action: "+action);controller.revalidate()})},execute:function(options){var file=options.input.file,_this=this;morpheus.OpenDatasetTool.fileExtensionPrompt(file,function(readOptions){var deferred=morpheus.DatasetUtil.read(file,readOptions);_this._read(options,deferred)})},_matchAppend:function(newDatasetMetadataNames,currentDatasetMetadataNames,controller,callback){var tool={};tool.execute=function(options){return options.input},tool.toString=function(){return"Select Fields"},tool.gui=function(){var items=[{name:"current_dataset_annotation_name",options:currentDatasetMetadataNames,type:"select",required:!0}];return items.push({name:"new_dataset_annotation_name",type:"select",options:newDatasetMetadataNames,required:!0}),items},morpheus.HeatMap.showTool(tool,controller,callback)},_matchOverlay:function(newDatasetColumnMetadataNames,currentDatasetColumnMetadataNames,newDatasetRowMetadataNames,currentDatasetRowMetadataNames,controller,callback){var tool={};tool.execute=function(options){return options.input},tool.toString=function(){return"Select Fields"},tool.gui=function(){var items=[];return items.push({name:"current_dataset_column_annotation_name",options:currentDatasetColumnMetadataNames,type:"select",required:!0}),items.push({name:"new_dataset_column_annotation_name",type:"select",options:newDatasetColumnMetadataNames,required:!0}),items.push({name:"current_dataset_row_annotation_name",options:currentDatasetRowMetadataNames,type:"select",required:!0}),items.push({name:"new_dataset_row_annotation_name",type:"select",options:newDatasetRowMetadataNames,required:!0}),items},morpheus.HeatMap.showTool(tool,controller,callback)}},morpheus.OpenDendrogramTool=function(file){this._file=file},morpheus.OpenDendrogramTool.prototype={toString:function(){return"Open Dendrogram"},init:function(project,form){var setValue=function(val){var isRows="Rows"===val,names=morpheus.MetadataUtil.getMetadataNames(isRows?project.getFullDataset().getRowMetadata():project.getFullDataset().getColumnMetadata());names.unshift("Newick file does not contain node ids"),form.setOptions("match_node_id_to",names)};form.$form.find("[name=orientation]").on("change",function(e){setValue($(this).val())}),setValue("Columns")},gui:function(){return[{name:"orientation",options:["Columns","Rows"],value:"Columns",type:"radio"},{name:"match_node_id_to",options:[],type:"select"}]},execute:function(options){var fileOrUrl=this._file,isColumns="Columns"===options.input.orientation,dendrogramField=options.input.match_node_id_to;"Newick file does not contain node ids"===dendrogramField&&(dendrogramField=null);var controller=options.controller,dendrogramDeferred=morpheus.Util.getText(fileOrUrl);dendrogramDeferred.done(function(text){var dataset=options.project.getSortedFilteredDataset();isColumns&&(dataset=morpheus.DatasetUtil.transposedView(dataset));var tree=morpheus.AbstractDendrogram.parseNewick(text);if(tree.leafNodes.length!==dataset.getRowCount())throw new Error("# leaf nodes in dendrogram "+tree.leafNodes.length+" != "+dataset.getRowCount());var indices=[];if(null!=dendrogramField)for(var vector=dataset.getRowMetadata().getByName(dendrogramField),valueToIndex=morpheus.VectorUtil.createValueToIndexMap(vector),i=0,length=tree.leafNodes.length;length>i;i++){var index=valueToIndex.get(tree.leafNodes[i].name);if(void 0===index)throw new Error("Unable to find dendrogram id "+tree.leafNodes[i].name+" in annotations");indices.push(index)}else for(var i=0,length=tree.leafNodes.length;length>i;i++)indices.push(i);controller.setDendrogram(tree,isColumns,indices)})}},morpheus.OpenFileTool=function(options){this.options=options||{}},morpheus.OpenFileTool.prototype={toString:function(){return"Open File"},gui:function(){var array=[{name:"open_file_action",value:"open",type:"bootstrap-select",options:[{name:"Annotate columns",value:"Annotate Columns"},{name:"Annotate rows",value:"Annotate Rows"},{divider:!0},{name:"Append rows to current dataset",value:"append"},{name:"Append columns to current dataset",value:"append columns"},{name:"Overlay onto current dataset",value:"overlay"},{name:"Open dataset in new tab",value:"open"},{divider:!0},{name:"Open dendrogram",value:"Open dendrogram"}]}];return null==this.options.file&&array.push({name:"file",showLabel:!1,placeholder:"Open your own file",value:"",type:"file",required:!0,help:morpheus.DatasetUtil.DATASET_FILE_FORMATS}),array.options={ok:null!=this.options.file,size:"modal-lg"},array},init:function(project,form,initOptions){if(form.$form.find("[name=open_file_action]").on("change",function(e){var action=$(this).val();"append columns"===action||"append"===action||"open"===action||"overlay"===action?form.setHelpText("file",morpheus.DatasetUtil.DATASET_FILE_FORMATS):"Open dendrogram"===action?form.setHelpText("file",morpheus.DatasetUtil.DENDROGRAM_FILE_FORMATS):form.setHelpText("file",morpheus.DatasetUtil.ANNOTATION_FILE_FORMATS)}),null==this.options.file){$("