From c8bae63e0083624bc944c1acb121e7cd22da4831 Mon Sep 17 00:00:00 2001 From: Joshua Gould Date: Tue, 7 Jun 2016 21:22:05 -0400 Subject: [PATCH] paste --- js/morpheus-latest.min.js | 8 ++-- src/landing_page.js | 91 +++++++++++++++++++++------------------ 2 files changed, 52 insertions(+), 47 deletions(-) diff --git a/js/morpheus-latest.min.js b/js/morpheus-latest.min.js index 6a65798..a5da3f5 100644 --- a/js/morpheus-latest.min.js +++ b/js/morpheus-latest.min.js @@ -3,10 +3,10 @@ var assignment=$.trim(assignments[i]),index=parseInt(assignment),tmp=classNames[ err?console.log("Error reading file:"+err):(datasets.push(dataset),setIdAndSampleType(dataset)),seg.resolve()})}if(options.rppa){var rppa=$.Deferred();promises.push(rppa),(new morpheus.TxtReader).read(options.rppa,function(err,dataset){err?console.log("Error reading file:"+err):(datasets.push(dataset),setIdAndSampleType(dataset)),rppa.resolve()})}if(options.methylation){var methylation=$.Deferred();promises.push(methylation),new morpheus.TxtReader({}).read(options.methylation,function(err,dataset){err?console.log("Error reading file:"+err):(datasets.push(dataset),setIdAndSampleType(dataset)),methylation.resolve()})}var mrnaClustPromise=morpheus.Util.readLines(options.mrnaClust);promises.push(mrnaClustPromise);var sampleIdToClusterId;mrnaClustPromise.done(function(lines){sampleIdToClusterId=new morpheus.Map;for(var lineNumber=0;-1!==lines[lineNumber].indexOf("SampleName");)lineNumber++;for(var tab=/\t/;lineNumbermaxColumns&&(maxColumns=datasets[i].getColumnCount(),maxIndex=i),"mutations_merged.maf"===datasets[i].getName()&&(maxColumns=Number.MAX_VALUE,maxIndex=i);var datasetIndices=[];datasetIndices.push(maxIndex);for(var i=0;ij;j++)clusterIdVector.setValue(j,sampleIdToClusterId.get(idVector.getValue(j)));if(options.mutation){var sourceToIndices=morpheus.VectorUtil.createValueToIndicesMap(datasetToReturn.getRowMetadata().getByName("Source")),mutationDataset=new morpheus.SlicedDatasetView(datasetToReturn,sourceToIndices.get("mutations_merged.maf"));(new morpheus.OpenFileTool).annotate(sigGenesLines,mutationDataset,!1,null,"id","gene",["q"]);var qVector=mutationDataset.getRowMetadata().getByName("q"),qValueVector=mutationDataset.getRowMetadata().getByName("q_value");null==qValueVector&&(qValueVector=mutationDataset.getRowMetadata().add("q_value"));for(var i=0,size=qValueVector.size();size>i;i++)qValueVector.setValue(i,qVector.getValue(i));mutationDataset.getRowMetadata().remove(morpheus.MetadataUtil.indexOf(mutationDataset.getRowMetadata(),"q"))}annotationDef&&annotationCallbacks.forEach(function(f){f(datasetToReturn)}),returnDeferred.resolve(datasetToReturn)}),returnDeferred},morpheus.TxtReader=function(options){this.options=$.extend({},{dataRowStart:1,dataColumnStart:1},options)},morpheus.TxtReader.prototype={read:function(fileOrUrl,callback){var _this=this,name=morpheus.Util.getBaseFileName(morpheus.Util.getFileName(fileOrUrl));morpheus.BufferedReader.getArrayBuffer(fileOrUrl,function(err,arrayBuffer){if(err)callback(err);else try{callback(null,_this._read(name,new morpheus.BufferedReader(new Uint8Array(arrayBuffer))))}catch(x){callback(x)}})},_read:function(datasetName,reader){var tab=/\t/,header=morpheus.Util.trim(reader.readLine()).split(tab);if(this.options.dataRowStart>1)for(var i=1;ii;i++)arrayOfRowArrays.push([]);for(;null!==(s=reader.readLine());)if(s=morpheus.Util.trim(s),""!==s){var array=new Float32Array(ncols);matrix.push(array);for(var tokens=s.split(tab),j=0;dataColumnStart>j;j++)arrayOfRowArrays[j].push(String(tokens[j]));for(var j=dataColumnStart;ncols>=j;j++){var token=tokens[j];array[j-dataColumnStart]=parseFloat(token)}}for(var dataset=new morpheus.Dataset({name:datasetName,rows:matrix.length,columns:ncols,array:matrix,dataType:"Float32"}),columnIds=dataset.getColumnMetadata().add("id"),i=0,j=dataColumnStart;ncols>i;i++,j++)columnIds.setValue(i,String(header[j]));var rowIdVector=dataset.getRowMetadata().add("id");rowIdVector.array=arrayOfRowArrays[0];for(var i=1;dataColumnStart>i;i++){var v=dataset.getRowMetadata().add(header[i]);v.array=arrayOfRowArrays[i]}return dataset}},morpheus.XlsxDatasetReader=function(){},morpheus.XlsxDatasetReader.prototype={read:function(fileOrUrl,callback){var _this=this,name=morpheus.Util.getBaseFileName(morpheus.Util.getFileName(fileOrUrl));morpheus.BufferedReader.getArrayBuffer(fileOrUrl,function(err,arrayBuffer){if(err)callback(err);else try{for(var data=new Uint8Array(arrayBuffer),arr=[],i=0;i!=data.length;++i)arr[i]=String.fromCharCode(data[i]);var bstr=arr.join("");callback(null,_this._read(name,bstr))}catch(x){callback(x)}})},_read:function(datasetName,bstr){for(var lines=morpheus.Util.xlsxTo2dArray(bstr),nrows=lines.length-1,header=lines[0],ncols=header.length-1,dataset=new morpheus.Dataset({name:datasetName,rows:nrows,columns:ncols}),columnIds=dataset.getColumnMetadata().add("id"),j=1;ncols>=j;j++)columnIds.setValue(j-1,header[j]);for(var rowIds=dataset.getRowMetadata().add("id"),i=1;i=j;j++){var token=tokens[j],value=parseFloat(token);dataset.setValue(i-1,j-1,value)}}return dataset}},morpheus.VectorAdapter=function(v){if(null==v)throw"vector is null";this.v=v},morpheus.VectorAdapter.prototype={setValue:function(i,value){this.v.setValue(i,value)},getValue:function(i){return this.v.getValue(i)},getProperties:function(){return this.v.getProperties()},size:function(){return this.v.size()},getName:function(){return this.v.getName()},setName:function(name){this.v.setName(name)}},morpheus.AbstractDataset=function(name,rows,columns){this.seriesNames=[name],this.seriesArrays=[],this.seriesDataTypes=[],this.rows=rows,this.columns=columns,this.rowMetadataModel=new morpheus.MetadataModel(rows),this.columnMetadataModel=new morpheus.MetadataModel(columns)},morpheus.AbstractDataset.prototype={setRowMetadata:function(metadata){this.rowMetadataModel=metadata},setColumnMetadata:function(metadata){this.columnMetadataModel=metadata},getName:function(seriesIndex){return this.seriesNames[seriesIndex||0]},setName:function(seriesIndex,name){this.seriesNames[seriesIndex||0]=name},getRowMetadata:function(){return this.rowMetadataModel},getColumnMetadata:function(){return this.columnMetadataModel},getRowCount:function(){return this.rows},getColumnCount:function(){return this.columns},getValue:function(rowIndex,columnIndex,seriesIndex){},setValue:function(rowIndex,columnIndex,value,seriesIndex){},addSeries:function(options){},getSeriesCount:function(){return this.seriesArrays.length},getDataType:function(rowIndex,seriesIndex){return this.seriesDataTypes[seriesIndex]},toString:function(){return this.getName()}},morpheus.SignalToNoise=function(list1,list2){var m1=morpheus.Mean(list1),m2=morpheus.Mean(list2),s1=Math.sqrt(morpheus.Variance(list1,m1)),s2=Math.sqrt(morpheus.Variance(list2,m2));return(m1-m2)/(s1+s2)},morpheus.SignalToNoise.toString=function(){return"Signal to noise"},morpheus.createSignalToNoiseAdjust=function(percent){percent=percent||.2;var f=function(list1,list2){var m1=morpheus.Mean(list1),m2=morpheus.Mean(list2),s1=Math.sqrt(morpheus.Variance(list1,m1)),s2=Math.sqrt(morpheus.Variance(list2,m2));return s1=morpheus.SignalToNoise.thresholdStandardDeviation(m1,s1,percent),s2=morpheus.SignalToNoise.thresholdStandardDeviation(m2,s2,percent),(m1-m2)/(s1+s2)};return f.toString=function(){return"Signal to noise (adjust standard deviation)"},f},morpheus.SignalToNoise.thresholdStandardDeviation=function(mean,standardDeviation,percent){var returnValue=standardDeviation,absMean=Math.abs(mean),minStdev=percent*absMean;return minStdev>standardDeviation&&(returnValue=minStdev),percent>returnValue&&(returnValue=percent),returnValue},morpheus.createContingencyTable=function(listOne,listTwo,groupingValue){(null==groupingValue||isNaN(groupingValue))&&(groupingValue=1);for(var aHit=0,aMiss=0,j=0,size=listOne.size();size>j;j++){var val=listOne.getValue(j);isNaN(val)||(val>=groupingValue?aHit++:aMiss++)}for(var bHit=0,bMiss=0,j=0,size=listTwo.size();size>j;j++){var val=listTwo.getValue(j);isNaN(val)||(val>=groupingValue?bHit++:bMiss++)}var N=aHit+aMiss+bHit+bMiss,K=aHit+bHit,n=aHit+aMiss,k=aHit,a=k,b=K-k,c=n-k,d=N+k-n-K;return[a,b,c,d]},morpheus.FisherExact=function(listOne,listTwo){var abcd=morpheus.createContingencyTable(listOne,listTwo,1);return morpheus.FisherExact.fisherTest(abcd[0],abcd[1],abcd[2],abcd[3])},morpheus.createFisherExact=function(groupingValue){var f=function(listOne,listTwo){var abcd=morpheus.createContingencyTable(listOne,listTwo,groupingValue);return morpheus.FisherExact.fisherTest(abcd[0],abcd[1],abcd[2],abcd[3])};return f},morpheus.FisherExact.phyper=function(a,b,c,d){return Math.exp(morpheus.FisherExact.logFactorial(a+b)+morpheus.FisherExact.logFactorial(c+d)+morpheus.FisherExact.logFactorial(a+c)+morpheus.FisherExact.logFactorial(b+d)-(morpheus.FisherExact.logFactorial(a)+morpheus.FisherExact.logFactorial(b)+morpheus.FisherExact.logFactorial(c)+morpheus.FisherExact.logFactorial(d)+morpheus.FisherExact.logFactorial(a+b+c+d)))},morpheus.FisherExact.logFactorials=[0,0,.6931471805599453,1.791759469228055,3.1780538303479458,4.787491742782046,6.579251212010101,8.525161361065415,10.60460290274525,12.801827480081469,15.104412573075516,17.502307845873887,19.987214495661885,22.552163853123425,25.19122118273868,27.89927138384089,30.671860106080672,33.50507345013689,36.39544520803305,39.339884187199495,42.335616460753485,45.38013889847691,48.47118135183523,51.60667556776438,54.78472939811232,58.00360522298052,61.261701761002,64.55753862700634,67.88974313718154,71.25703896716801],morpheus.FisherExact.logFactorial=function(k){if(k>=30){var C0=.9189385332046728,C1=.08333333333333333,C3=-.002777777777777778,C5=.0007936507936507937,C7=-.0005952380952380953,r=1/k,rr=r*r;return(k+.5)*Math.log(k)-k+C0+r*(C1+rr*(C3+rr*(C5+rr*C7)))}return morpheus.FisherExact.logFactorials[k]},morpheus.FisherExact.fisherTest=function(a,b,c,d){for(var p=morpheus.FisherExact.phyper(a,b,c,d),sum=p,_a=0,n=a+b+c+d;n>=_a;_a++){var _b=a+b-_a,_c=a+c-_a,_d=b+d-_b;if(_a!==a&&_b>=0&&_c>=0&&_d>=0){var _p=morpheus.FisherExact.phyper(_a,_b,_c,_d);p>=_p&&(sum+=_p)}}return Math.min(1,sum)},morpheus.FisherExact.toString=function(){return"Fisher Exact Test"},morpheus.FoldChange=function(list1,list2){var m1=morpheus.Mean(list1),m2=morpheus.Mean(list2);return m1/m2},morpheus.FoldChange.toString=function(){return"Fold Change"},morpheus.TTest=function(list1,list2){var m1=morpheus.Mean(list1),m2=morpheus.Mean(list2),s1=Math.sqrt(morpheus.Variance(list1,m1)),s2=Math.sqrt(morpheus.Variance(list2,m2)),n1=morpheus.CountNonNaN(list1),n2=morpheus.CountNonNaN(list2);return(m1-m2)/Math.sqrt(s1*s1/n1+s2*s2/n2)},morpheus.TTest.toString=function(){return"T-Test"},morpheus.Spearman=function(list1,list2){for(var flist1=[],flist2=[],i=0,n=list1.size();n>i;i++){var v1=list1.getValue(i),v2=list2.getValue(i);isNaN(v1)||isNaN(v2)||(flist1.push(v1),flist2.push(v2))}var rank1=morpheus.Ranking(flist1),rank2=morpheus.Ranking(flist2);return morpheus.Pearson(new morpheus.Vector("",rank1.length).setArray(rank1),new morpheus.Vector("",rank2.length).setArray(rank2))},morpheus.Spearman.toString=function(){return"Spearman rank correlation"},morpheus.WeightedMean=function(weights,values){for(var numerator=0,denom=0,i=0,size=values.size();size>i;i++){var value=values.getValue(i);if(!isNaN(value)){var weight=weights.getValue(i);isNaN(weight)||(numerator+=weight*value,denom+=weight)}}return 0==denom?NaN:numerator/denom},morpheus.WeightedMean.toString=function(){return"Weighted average"},morpheus.createOneMinusMatrixValues=function(dataset){var f=function(listOne,listTwo){return 1-dataset.getValue(listOne.getIndex(),listTwo.getIndex())};return f.toString=function(){return"One minus matrix values (for a precomputed similarity matrix)"},f},morpheus.Pearson=function(listOne,listTwo){for(var sumx=0,sumxx=0,sumy=0,sumyy=0,sumxy=0,N=0,i=0,size=listOne.size();size>i;i++){var x=listOne.getValue(i),y=listTwo.getValue(i);isNaN(x)||isNaN(y)||(sumx+=x,sumxx+=x*x,sumy+=y,sumyy+=y*y,sumxy+=x*y,N++)}var numr=sumxy-sumx*sumy/N,denr=Math.sqrt((sumxx-sumx*sumx/N)*(sumyy-sumy*sumy/N));return 0==denr?1:numr/denr},morpheus.Pearson.toString=function(){return"Pearson correlation"},morpheus.Jaccard=function(listOne,listTwo){for(var orCount=0,andCount=0,i=0,size=listOne.size();size>i;i++){var xval=listOne.getValue(i),yval=listTwo.getValue(i);if(!isNaN(xval)&&!isNaN(yval)){var x=xval>0,y=yval>0;x&&y?andCount++:(x||y)&&orCount++}}return 0===orCount?1:1-andCount/orCount},morpheus.Jaccard.toString=function(){return"Jaccard distance"},morpheus.Cosine=function(listOne,listTwo){for(var sumX2=0,sumY2=0,sumXY=0,i=0,size=listOne.size();size>i;i++){var x=listOne.getValue(i),y=listTwo.getValue(i);isNaN(x)||isNaN(y)||(sumX2+=x*x,sumY2+=y*y,sumXY+=x*y)}return sumXY/Math.sqrt(sumX2*sumY2)},morpheus.Cosine.toString=function(){return"Cosine similarity"},morpheus.Euclidean=function(x,y){for(var dist=0,i=0,size=x.size();size>i;++i){var x_i=x.getValue(i),y_i=y.getValue(i);isNaN(x_i)||isNaN(y_i)||(dist+=(x_i-y_i)*(x_i-y_i))}return Math.sqrt(dist)},morpheus.Euclidean.toString=function(){return"Euclidean distance"},morpheus.OneMinusFunction=function(f){var dist=function(x,y){return 1-f(x,y)};return dist.toString=function(){var s=f.toString();return"One minus "+s[0].toLowerCase()+s.substring(1)},dist},morpheus.Dataset=function(options){morpheus.AbstractDataset.call(this,options.name,options.rows,options.columns),null==options.dataType&&(options.dataType="Float32"),this.seriesArrays.push(options.array?options.array:morpheus.Dataset.createArray(options)),this.seriesDataTypes.push(options.dataType)},morpheus.Dataset.toJson=function(dataset,options){options=options||{};for(var data=[],i=0,nrows=dataset.getRowCount();nrows>i;i++){var row=[];data.push(row);for(var j=0,ncols=dataset.getColumnCount();ncols>j;j++)row[j]=dataset.getValue(i,j)}var vectorToJson=function(vector){for(var array=[],i=0,size=vector.size();size>i;i++)array[i]=vector.getValue(i);return{name:vector.getName(),array:array}},metadataToJson=function(metadata,fields){var filter,vectors=[];fields&&(filter=new morpheus.Set,fields.forEach(function(field){filter.add(field)}));for(var i=0,count=metadata.getMetadataCount();count>i;i++){var v=metadata.get(i);filter?filter.has(v.getName())&&vectors.push(vectorToJson(v)):vectors.push(vectorToJson(v))}return vectors};return{rows:dataset.getRowCount(),columns:dataset.getColumnCount(),seriesArrays:[data],seriesNames:[dataset.getName()],rowMetadataModel:{vectors:metadataToJson(dataset.getRowMetadata(),options.rowFields)},columnMetadataModel:{vectors:metadataToJson(dataset.getColumnMetadata(),options.columnFields)}}},morpheus.Dataset.fromJson=function(options){options.array=options.seriesArrays[0];var dataset=new morpheus.Dataset(options);return dataset.seriesNames=options.seriesNames,options.rowMetadataModel&&options.rowMetadataModel.vectors.forEach(function(v){var vector=new morpheus.Vector(v.name,dataset.getRowCount());vector.array=v.array,dataset.rowMetadataModel.vectors.push(vector)}),options.columnMetadataModel&&options.columnMetadataModel.vectors.forEach(function(v){var vector=new morpheus.Vector(v.name,dataset.getColumnCount());vector.array=v.array,dataset.columnMetadataModel.vectors.push(vector)}),dataset},morpheus.Dataset.createArray=function(options){var array=[];if(null==options.dataType||"Float32"===options.dataType)for(var i=0;ii;i++)for(var j=0,columns=dataset.getColumnCount();columns>j;j++){var d=dataset.getValue(i,j,seriesIndex);isNaN(d)||(min=Math.min(min,d))}return min},morpheus.DatasetUtil.slicedView=function(dataset,rows,columns){return new morpheus.SlicedDatasetView(dataset,rows,columns)},morpheus.DatasetUtil.transposedView=function(dataset){return dataset instanceof morpheus.TransposedDatasetView?dataset.getDataset():new morpheus.TransposedDatasetView(dataset)},morpheus.DatasetUtil.max=function(dataset,seriesIndex){seriesIndex=seriesIndex||0;for(var max=-Number.MAX_VALUE,i=0,rows=dataset.getRowCount();rows>i;i++)for(var j=0,columns=dataset.getColumnCount();columns>j;j++){var d=dataset.getValue(i,j,seriesIndex);isNaN(d)||(max=Math.max(max,d))}return max},morpheus.DatasetUtil.getDatasetReader=function(ext,options){var datasetReader;return"maf"===ext?(datasetReader=new morpheus.MafFileReader,options&&options.mafGeneFilter&&datasetReader.setGeneFilter(options.mafGeneFilter)):"gct"===ext?datasetReader=new morpheus.GctReader:"gmt"===ext?datasetReader=new morpheus.GmtDatasetReader:"xlsx"===ext?datasetReader=new morpheus.XlsxDatasetReader:"segtab"===ext||"seg"===ext?(datasetReader=new morpheus.SegTabReader,options&&options.regions&&datasetReader.setRegions(options.regions)):datasetReader="txt"===ext||"tsv"===ext||"csv"===ext?new morpheus.TxtReader:new morpheus.GctReader,datasetReader},morpheus.DatasetUtil.readDatasetArray=function(options){var retDef=$.Deferred(),loadedDatasets=[],promises=[];return _.each(options.dataset,function(option,i){var p=option.dataset.file?morpheus.DatasetUtil.read(option.dataset.file,option.dataset.options):morpheus.DatasetUtil.read(option.dataset);p.index=i,p.done(function(dataset){loadedDatasets[this.index]=dataset}),p.fail(function(err){var message=["Error opening "+(option.dataset.file?morpheus.Util.getFileName(option.dataset.file):morpheus.Util.getFileName(option.dataset))+"."];err.message&&(message.push("
Cause: "),message.push(err.message)),retDef.reject(message.join(""))}),promises.push(p)}),0===promises.length&&retDef.reject("No datasets specified."),$.when.apply($,promises).then(function(){var joined;if(loadedDatasets.length>1){joined=new morpheus.JoinedDataset(loadedDatasets[0],loadedDatasets[1],"id","id");for(var i=2;ii;i++)sourceVector.setValue(i,name)}retDef.resolve(joined)}),retDef},morpheus.DatasetUtil.annotate=function(options){var retDef=$.Deferred(),promises=[],functions=[],isColumns=options.isColumns;return _.each(options.annotations,function(ann){if(morpheus.Util.isArray(ann.file))functions.push(function(dataset){(new morpheus.OpenFileTool).annotate(ann.file,dataset,isColumns,null,ann.datasetField,ann.fileField,ann.include)});else{var result=morpheus.Util.readLines(ann.file),fileName=morpheus.Util.getFileName(ann.file),deferred=$.Deferred();promises.push(deferred),result.fail(function(message){deferred.reject(message)}),result.done(function(lines){if(morpheus.Util.endsWith(fileName,".gmt")){var sets=(new morpheus.GmtReader).parseLines(lines);functions.push(function(dataset){(new morpheus.OpenFileTool).annotate(null,dataset,isColumns,sets,ann.datasetField,ann.fileField)}),deferred.resolve()}else morpheus.Util.endsWith(fileName,".cls")?(functions.push(function(dataset){(new morpheus.OpenFileTool).annotateCls(null,dataset,fileName,isColumns,lines)}),deferred.resolve()):(functions.push(function(dataset){(new morpheus.OpenFileTool).annotate(lines,dataset,isColumns,null,ann.datasetField,ann.fileField,ann.include)}),deferred.resolve())})}}),$.when.apply($,promises).then(function(){retDef.resolve(functions)}),retDef},morpheus.DatasetUtil.read=function(fileOrUrl,options){var isFile=fileOrUrl instanceof File,isString=_.isString(fileOrUrl),ext=morpheus.Util.getExtension(morpheus.Util.getFileName(fileOrUrl)),datasetReader=morpheus.DatasetUtil.getDatasetReader(ext,options);if(isString||isFile){var deferred=$.Deferred();if(options&&options.background){var path=morpheus.Util.getScriptPath(),blob=new Blob(["self.onmessage = function(e) {importScripts(e.data.path);var ext = morpheus.Util.getExtension(morpheus.Util.getFileName(e.data.fileOrUrl));var datasetReader = morpheus.DatasetUtil.getDatasetReader(ext, e.data.options);datasetReader.read(e.data.fileOrUrl, function(err,dataset) { self.postMessage(dataset); });}"]),blobURL=window.URL.createObjectURL(blob),worker=new Worker(blobURL);worker.addEventListener("message",function(e){deferred.resolve(morpheus.Dataset.fromJson(e.data)),window.URL.revokeObjectURL(blobURL)},!1),worker.postMessage({path:path,fileOrUrl:fileOrUrl,options:options})}else datasetReader.read(fileOrUrl,function(err,dataset){err?deferred.reject(err):deferred.resolve(dataset)});var pr=deferred.promise();return pr.toString=function(){return""+fileOrUrl},pr}if("function"==typeof fileOrUrl.done)return fileOrUrl;var deferred=$.Deferred();return deferred.resolve(fileOrUrl),deferred.promise()},morpheus.DatasetUtil.toObjectArray=function(dataset,options){var columns=options.columns||[0],columnFields=options.columnFields||["value"];if(columnFields.length!==columns.length)throw"columns.length !== columnFields.length";var metadataFields=options.metadataFields,rowMetadata=dataset.getRowMetadata();metadataFields||(metadataFields=morpheus.MetadataUtil.getMetadataNames(rowMetadata));for(var vectors=morpheus.MetadataUtil.getVectors(rowMetadata,metadataFields),array=[],i=0;ii;i++){var v=metadata.get(i),name=v.getName(),mapped=names[name];mapped&&v.setName(mapped)}};fixNames(dataset.getRowMetadata()),fixNames(dataset.getColumnMetadata());var fix666=function(metadata){for(var i=0,count=metadata.getMetadataCount();count>i;i++){var v=metadata.get(i);if("Dose (µM)"==v.getName())for(var j=0,size=v.size();size>j;j++){var value=v.getValue(j);null!=value&&v.setValue(j,parseFloat(value))}for(var isNumber=!1,j=0,size=v.size();size>j;j++){var value=v.getValue(j);if(null!=value){isNumber=_.isNumber(value);break}}for(var newValue=isNumber||"Dose (µM)"==v.getName()?0:"",j=0,size=v.size();size>j;j++){var value=v.getValue(j);null!=value&&"-666"==value&&v.setValue(j,newValue)}}};fix666(dataset.getRowMetadata()),fix666(dataset.getColumnMetadata());var fixCommas=function(metadata){var regex=/(,)([^ ])/g;_.each(["Lineage","Histology"],function(name){var v=metadata.getByName(name);if(null!=v)for(var i=0,size=v.size();size>i;i++){var val=v.getValue(i);val&&v.setValue(i,val.replace(regex,", $2"))}})};fixCommas(dataset.getRowMetadata()),fixCommas(dataset.getColumnMetadata())},morpheus.DatasetUtil.geneSetsToDataset=function(name,sets){for(var uniqueIds=new morpheus.Map,i=0,length=sets.length;length>i;i++)for(var ids=sets[i].ids,j=0,nIds=ids.length;nIds>j;j++)uniqueIds.set(ids[j],1);for(var uniqueIdsArray=uniqueIds.keys(),dataset=new morpheus.Dataset({name:name,rows:uniqueIdsArray.length,columns:sets.length}),columnIds=dataset.getColumnMetadata().add("id"),i=0,length=sets.length;length>i;i++)columnIds.setValue(i,sets[i].name);for(var rowIds=dataset.getRowMetadata().add("id"),i=0,size=uniqueIdsArray.length;size>i;i++)rowIds.setValue(i,uniqueIdsArray[i]);for(var rowIdToIndex=morpheus.VectorUtil.createValueToIndexMap(rowIds),i=0,length=sets.length;length>i;i++)for(var ids=sets[i].ids,j=0,nIds=ids.length;nIds>j;j++)dataset.setValue(rowIdToIndex.get(ids[j]),i,1);return dataset},morpheus.DatasetUtil.DATASET_FILE_FORMATS='GCT 1.3, GCT 1.2, MAF, GMT, or a tab-delimited text file',morpheus.DatasetUtil.BASIC_DATASET_FILE_FORMATS='GCT 1.3, GCT 1.2, or a tab-delimited text file',morpheus.DatasetUtil.GCT_FILE_FORMAT='GCT 1.3',morpheus.DatasetUtil.ANNOTATION_FILE_FORMATS='an xlsx file, tab-delimited text file, or a GMT file',morpheus.DatasetUtil.DENDROGRAM_FILE_FORMATS='a Newick file',morpheus.DatasetUtil.OPEN_FILE_FORMATS='GCT 1.3, GCT 1.2, MAF, GMT, a tab-delimited text file, or a Newick file',morpheus.DatasetUtil.getRootDataset=function(dataset){for(;dataset.getDataset;)dataset=dataset.getDataset();return dataset},morpheus.DatasetUtil.getSeriesIndex=function(dataset,name){for(var i=0,nseries=dataset.getSeriesCount();nseries>i;i++)if(name===dataset.getName(i))return i;return-1},morpheus.DatasetUtil.getSeriesNames=function(dataset){for(var names=[],i=0,nseries=dataset.getSeriesCount();nseries>i;i++)names.push(dataset.getName(i));return names.sort(function(a,b){return a=a.toLowerCase(),b=b.toLowerCase(),b>a?-1:a===b?0:1}),names},morpheus.DatasetUtil.searchValues=function(dataset,text,cb){if(""!==text){var tokens=morpheus.Util.getAutocompleteTokens(text);if(0!=tokens.length){for(var seriesIndices=[],i=0,nrows=dataset.getRowCount();nrows>i;i++)for(var k=0,nseries=dataset.getSeriesCount();nseries>k;k++)"object"===dataset.getDataType(i,k)&&seriesIndices.push([i,k]);if(0!==seriesIndices.length){var _val;elementSearch:for(var k=0,nseries=seriesIndices.length;nseries>k;k++)for(var pair=seriesIndices[k],j=0,ncols=dataset.getColumnCount();ncols>j;j++){var element=dataset.getValue(pair[0],j,pair[1]);if(null!=element&&element.toObject){_val=element.toObject();break elementSearch}}for(var fields=null==_val?[]:_.keys(_val),predicates=morpheus.Util.createSearchPredicates({tokens:tokens,fields:fields}),npredicates=predicates.length,k=0,nseries=seriesIndices.length;nseries>k;k++)for(var pair=seriesIndices[k],j=0,ncols=dataset.getColumnCount();ncols>j;j++){var matches=!1,element=dataset.getValue(pair[0],j,pair[1]);if(element&&element.toObject)for(var object=element.toObject(),p=0;npredicates>p&&!matches;p++){var predicate=predicates[p],filterColumnName=predicate.getField(); if(null!=filterColumnName){var value=object[filterColumnName];if(null!=value&&predicate.accept(value)){if(cb(value,pair[0],j)===!1)return;matches=!0;break}}else for(var name in object){var value=object[name];if(null!=value&&predicate.accept(value)){if(cb(value,pair[0],j)===!1)return;matches=!0;break}}}}}}}},morpheus.DatasetUtil.autocompleteValues=function(dataset){return function(tokens,cb){var token=null!=tokens&&tokens.length>0?tokens[tokens.selectionStartIndex]:"";token=$.trim(token);for(var seriesIndices=[],i=0,nrows=dataset.getRowCount();nrows>i;i++)for(var k=0,nseries=dataset.getSeriesCount();nseries>k;k++)"object"===dataset.getDataType(i,k)&&seriesIndices.push([i,k]);if(0===seriesIndices.length)return cb();var _val;elementSearch:for(var k=0,nseries=seriesIndices.length;nseries>k;k++)for(var pair=seriesIndices[k],j=0,ncols=dataset.getColumnCount();ncols>j;j++){var element=dataset.getValue(pair[0],j,pair[1]);if(null!=element&&element.toObject){_val=element.toObject();break elementSearch}}var matches=[],fields=null==_val?[]:_.keys(_val);if(""===token)return fields.sort(function(a,b){return a===b?0:b>a?-1:1}),fields.forEach(function(field){matches.push({value:field+":",label:''+field+":",show:!0})}),cb(matches);var field=null,semi=token.indexOf(":");if(semi>0&&92!==token.charCodeAt(semi-1)){var possibleField=$.trim(token.substring(0,semi));possibleField.length>0&&'"'===possibleField[0]&&'"'===possibleField[token.length-1]&&(possibleField=possibleField.substring(1,possibleField.length-1));var index=fields.indexOf(possibleField);-1!==index&&(token=$.trim(token.substring(semi+1)),field=possibleField)}var set=new morpheus.Set,regex=new RegExp("^"+morpheus.Util.escapeRegex(token),"i"),max=10;loop:for(var k=0,nseries=seriesIndices.length;nseries>k;k++)for(var pair=seriesIndices[k],j=0,ncols=dataset.getColumnCount();ncols>j;j++){var element=dataset.getValue(pair[0],j,pair[1]);if(element&&element.toObject){var object=element.toObject();if(null!==field){var val=object[field];if(null!=val){var id=new morpheus.Identifier([val,field]);if(!set.has(id)&®ex.test(val)&&(set.add(id),set.size()===max))break loop}}else for(var name in object){var val=object[name],id=new morpheus.Identifier([val,name]);if(!set.has(id)&®ex.test(val)&&(set.add(id),set.size()===max))break loop}}}set.forEach(function(id){var array=id.getArray(),field=array[1],val=array[0];matches.push({value:field+":"+val,label:''+field+':'+val+""})}),null==field&&fields.forEach(function(field){regex.test(field)&&matches.push({value:field+":",label:''+field+":",show:!0})}),cb(matches)}},morpheus.DatasetUtil.fill=function(dataset,value,seriesIndex){seriesIndex=seriesIndex||0;for(var i=0,nrows=dataset.getRowCount(),ncols=dataset.getColumnCount();nrows>i;i++)for(var j=0;ncols>j;j++)dataset.setValue(i,j,value,seriesIndex)},morpheus.DatasetUtil.shallowCopy=function(dataset){var rowMetadataModel=morpheus.MetadataUtil.shallowCopy(dataset.getRowMetadata()),columnMetadataModel=morpheus.MetadataUtil.shallowCopy(dataset.getColumnMetadata());return dataset.getRowMetadata=function(){return rowMetadataModel},dataset.getColumnMetadata=function(){return columnMetadataModel},dataset},morpheus.DatasetUtil.copy=function(dataset){for(var newDataset=new morpheus.Dataset({name:dataset.getName(),rows:dataset.getRowCount(),columns:dataset.getColumnCount(),dataType:"object"}),seriesIndex=0,nseries=dataset.getSeriesCount();nseries>seriesIndex;seriesIndex++){seriesIndex>0&&newDataset.addSeries({name:dataset.getName(seriesIndex),rows:dataset.getRowCount(),columns:dataset.getColumnCount(),dataType:"object"});for(var i=0,nrows=dataset.getRowCount(),ncols=dataset.getColumnCount();nrows>i;i++)for(var j=0;ncols>j;j++)newDataset.setValue(i,j,dataset.getValue(i,j,seriesIndex),seriesIndex)}var rowMetadataModel=morpheus.MetadataUtil.shallowCopy(dataset.getRowMetadata()),columnMetadataModel=morpheus.MetadataUtil.shallowCopy(dataset.getColumnMetadata());return newDataset.getRowMetadata=function(){return rowMetadataModel},newDataset.getColumnMetadata=function(){return columnMetadataModel},newDataset},morpheus.DatasetUtil.toString=function(dataset,value,seriesIndex){seriesIndex=seriesIndex||0;for(var s=[],i=0,nrows=dataset.getRowCount(),ncols=dataset.getColumnCount();nrows>i;i++){for(var j=0;ncols>j;j++)j>0&&s.push(", "),s.push(morpheus.Util.nf(dataset.getValue(i,j,seriesIndex)));s.push("\n")}return s.join("")},morpheus.DatasetUtil.getNonEmptyRows=function(dataset){for(var rowsToKeep=[],i=0,nrows=dataset.getRowCount();nrows>i;i++){for(var keep=!1,j=0,ncols=dataset.getColumnCount();ncols>j;j++){var value=dataset.getValue(i,j);if(!isNaN(value)){keep=!0;break}}keep&&rowsToKeep.push(i)}return rowsToKeep},morpheus.ElementSelectionModel=function(project){this.viewIndices=new morpheus.Set,this.project=project},morpheus.ElementSelectionModel.prototype={click:function(rowIndex,columnIndex,add){var id=new morpheus.Identifier([rowIndex,columnIndex]),isSelected=this.viewIndices.has(id);add?isSelected?this.viewIndices.remove(id):this.viewIndices.add(id):(this.viewIndices.clear(),isSelected||this.viewIndices.add(id)),this.trigger("selectionChanged")},setViewIndices:function(indices){this.viewIndices=indices,this.trigger("selectionChanged")},clear:function(){this.viewIndices=new morpheus.Set},getViewIndices:function(){return this.viewIndices},count:function(){return this.viewIndices.size()},toModelIndices:function(){var project=this.project,modelIndices=[];return this.viewIndices.forEach(function(id){modelIndices.push(project.convertViewRowIndexToModel(id.getArray()[0]),project.convertViewColumnIndexToModel(id.getArray()[1]))}),modelIndices},save:function(){this.modelIndices=this.toModelIndices()},restore:function(){var project=this.project;this.viewIndices=new morpheus.Set;for(var i=0,length=this.modelIndices.length;length>i;i++){var rowIndex=project.convertModelRowIndexToView(this.modelIndices[i][0]),columnIndex=project.convertModelColumnIndexToView(this.modelIndices[i][1]);-1!==rowIndex&&-1!==columnIndex&&this.viewIndices.add(new morpheus.Identifier([rowIndex,columnIndex]))}}},morpheus.Util.extend(morpheus.ElementSelectionModel,morpheus.Events),morpheus.CombinedFilter=function(isAndFilter){this.filters=[],this.isAndFilter=isAndFilter,this.enabledFilters=[],this.name="combined filter"},morpheus.CombinedFilter.prototype={shallowClone:function(){var f=new morpheus.CombinedFilter(this.isAndFilter);return f.filters=this.filters.slice(0),f},toString:function(){return this.name},setAnd:function(isAndFilter,notify){this.isAndFilter=isAndFilter,notify&&this.trigger("and",{})},isAnd:function(){return this.isAndFilter},equals:function(f){if(!(f instanceof morpheus.CombinedFilter))return!1;if(this.isAndFilter!==f.isAndFilter)return!1;if(this.filters.length!==f.filters.length)return!1;for(var i=0,length=this.filters.length;length>i;i++)if(!this.filters[i].equals(f.filters[i]))return!1;return!0},add:function(filter,notify){this.filters.push(filter),notify&&this.trigger("add",{filter:filter})},getFilters:function(){return this.filters},get:function(index){return this.filters[index]},indexOf:function(name,type){for(var i=0,length=this.filters.length;length>i;i++)if(this.filters[i].toString()===name&&(null==type?!0:this.filters[i]instanceof type))return i;return-1},remove:function(index,notify){this.filters.splice(index,1),notify&&this.trigger("remove",{index:index})},set:function(index,filter){this.filters[index]=filter},insert:function(index,filter){this.filters.splice(index,0,filter)},clear:function(){this.filters=[]},init:function(dataset){for(var i=0,nfilters=this.filters.length;nfilters>i;i++)this.filters[i].init&&this.filters[i].init(dataset);this.enabledFilters=this.filters.filter(function(filter){return filter.isEnabled()})},accept:function(index){var filters=this.enabledFilters;if(this.isAndFilter){for(var i=0,nfilters=filters.length;nfilters>i;i++)if(filters[i].accept(index)===!1)return!1;return!0}for(var i=0,nfilters=filters.length;nfilters>i;i++)if(filters[i].accept(index))return!0;return!1},isEnabled:function(){return this.enabledFilters.length>0}},morpheus.Util.extend(morpheus.CombinedFilter,morpheus.Events),morpheus.IndexFilter=function(acceptIndicesSet,name){this.acceptIndicesSet=acceptIndicesSet,this.name=name},morpheus.IndexFilter.prototype={enabled:!0,isEnabled:function(){return this.enabled},setAcceptIndicesSet:function(acceptIndicesSet){this.acceptIndicesSet=acceptIndicesSet},setEnabled:function(enabled){this.enabled=enabled},equals:function(filter){return filter instanceof morpheus.IndexFilter&&this.acceptIndicesSet.equals(filter.acceptIndicesSet)},init:function(dataset){},toString:function(){return this.name},accept:function(index){return this.acceptIndicesSet.has(index)}},morpheus.VectorFilter=function(set,maxSetSize,name){this.set=set,this.name=name,this.maxSetSize=maxSetSize},morpheus.VectorFilter.prototype={enabled:!0,isEnabled:function(){return this.enabled&&this.set.size()>0&&this.set.size()!==this.maxSetSize&&null!=this.vector},setEnabled:function(enabled){this.enabled=enabled},equals:function(filter){return filter instanceof morpheus.VectorFilter&&this.name===filter.name},init:function(dataset){this.vector=dataset.getRowMetadata().getByName(this.name)},toString:function(){return this.name},accept:function(index){return this.set.has(this.vector.getValue(index))}},morpheus.NotNullFilter=function(name){this.name=name},morpheus.NotNullFilter.prototype={enabled:!0,isEnabled:function(){return this.enabled&&null!=this.vector},setEnabled:function(enabled){this.enabled=enabled},equals:function(filter){return filter instanceof morpheus.NotNullFilter&&this.name===filter.name},init:function(dataset){this.vector=dataset.getRowMetadata().getByName(this.name)},toString:function(){return this.name},accept:function(index){return null!=this.vector.getValue(index)}},morpheus.RangeFilter=function(min,max,name){this.min=min,this.max=max,this.name=name},morpheus.RangeFilter.prototype={enabled:!0,isEnabled:function(){return this.enabled&&(!isNaN(this.min)||!isNaN(this.max))&&this.vector},setEnabled:function(enabled){this.enabled=enabled},setMin:function(value){this.min=isNaN(value)?-Number.MAX_VALUE:value},setMax:function(value){this.max=isNaN(value)?Number.MAX_VALUE:value},equals:function(filter){return filter instanceof morpheus.RangeFilter&&this.name===filter.name},init:function(dataset){this.vector=dataset.getRowMetadata().getByName(this.name)},toString:function(){return this.name},accept:function(index){var value=this.vector.getValue(index);return value>=this.min&&value<=this.max}},morpheus.TopNFilter=function(n,direction,name){this.n=n,this.direction=direction,this.name=name},morpheus.TopNFilter.TOP=0,morpheus.TopNFilter.BOTTOM=1,morpheus.TopNFilter.TOP_BOTTOM=2,morpheus.TopNFilter.prototype={enabled:!0,isEnabled:function(){return this.enabled&&this.n>0&&this.vector},setEnabled:function(enabled){this.enabled=enabled},setN:function(value){this.n=value},setDirection:function(direction){this.direction=direction},equals:function(filter){return filter instanceof morpheus.TopNFilter&&this.name===filter.name&&this.n===filter.n&&this.direction===filter.direction},init:function(dataset){if(!this.vector){var vector=dataset.getRowMetadata().getByName(this.name);this.vector=vector;for(var set=new morpheus.Set,i=0,size=vector.size();size>i;i++){var value=vector.getValue(i);isNaN(value)||set.add(value)}var values=set.values();values.sort(function(a,b){return a===b?0:b>a?-1:1}),this.sortedValues=values}for(var topAndBottomIndices=[this.sortedValues.length-this.n,this.n-1],i=0;i=topAndBottomValues[0]}:this.direction===morpheus.TopNFilter.BOTTOM?this.f=function(val){return isNaN(val)?!1:val<=topAndBottomValues[1]}:this.f=function(val){return isNaN(val)?!1:val>=topAndBottomValues[0]||val<=topAndBottomValues[1]}},accept:function(index){return this.f(this.vector.getValue(index))},toString:function(){return this.name}},morpheus.AlwaysTrueFilter=function(){},morpheus.AlwaysTrueFilter.prototype={isEnabled:function(){return!1},setEnabled:function(enabled){},equals:function(filter){return filter instanceof morpheus.AlwaysTrueFilter},init:function(dataset){},toString:function(){return"AlwaysTrue"},accept:function(index){return!0}},morpheus.IndexMapper=function(project,isRows){this.project=project,this.isRows=isRows,this.sortKeys=[],this.modelToView=null,this.filteredModelIndices=null,this.filteredSortedModelIndices=null,this.filter=new morpheus.CombinedFilter(!0),this._filter(),this._sort()},morpheus.IndexMapper.prototype={convertModelIndexToView:function(modelIndex){var index=this.modelToView.get(modelIndex);return void 0!==index?index:-1},convertViewIndexToModel:function(viewIndex){return viewIndex=0?this.filteredSortedModelIndices[viewIndex]:-1},convertToView:function(){return this.filteredSortedModelIndices},setFilter:function(filter){this.filter=filter,this._filter(),this._sort()},_filter:function(){var filteredModelIndices,filter=this.filter,dataset=this.getFullDataset();if(null!=filter&&(filter.init(dataset),filter.isEnabled())){filteredModelIndices=[];for(var i=0,nrows=dataset.getRowCount();nrows>i;i++)filter.accept(i)&&filteredModelIndices.push(i)}this.filteredModelIndices=null!=filteredModelIndices?filteredModelIndices:morpheus.Util.seq(dataset.getRowCount())},_sort:function(){var sortKeys=this.sortKeys;if(sortKeys.length>0){for(var dataset=this.getFullDataset(),nkeys=sortKeys.length,i=0;nkeys>i;i++)sortKeys[i].init(dataset,this.filteredSortedModelIndices);this.filteredSortedModelIndices=this.filteredModelIndices.slice(0),this.filteredSortedModelIndices.sort(function(a,b){for(var i=0;nkeys>i;i++){var key=sortKeys[i],comparator=key.getComparator(),val1=key.getValue(a),val2=key.getValue(b),c=comparator(val1,val2);if(0!==c)return c}return 0})}else this.filteredSortedModelIndices=this.filteredModelIndices;for(var modelToView=new morpheus.Map,i=0,length=this.filteredSortedModelIndices.length;length>i;i++)modelToView.set(this.filteredSortedModelIndices[i],i);this.modelToView=modelToView},getFilter:function(){return this.filter},getViewCount:function(){return null==this.getFullDataset()?0:this.filteredSortedModelIndices.length},setSelectedModelIndices:function(selectedModelIndices){this.selectionModel.setSelectedModelIndices(selectedModelIndices)},setSortKeys:function(sortKeys){null==sortKeys&&(sortKeys=[]),this.sortKeys=sortKeys,this._sort()},getFullDataset:function(){var originalDataset=this.project.getFullDataset();return this.isRows?originalDataset:morpheus.DatasetUtil.transposedView(originalDataset)}},morpheus.JoinedDataset=function(dataset1,dataset2,dataset1Field,dataset2Field,sourceFieldName){if(sourceFieldName=sourceFieldName||"Source",this.dataset1Field=dataset1Field,this.dataset2Field=dataset2Field,null==dataset1)throw"dataset1 is null";if(null==dataset2)throw"dataset2 is null";if(dataset1Field){for(var v1=dataset1.getColumnMetadata().getByName(dataset1Field),dataset2ValueToIndex=morpheus.VectorUtil.createValueToIndexMap(dataset2.getColumnMetadata().getByName(dataset2Field)),dataset2ColumnIndices=[],i=0;ii;i++)sourceVector.setValue(i,name);if(!dataset2.getRowMetadata().getByName(sourceFieldName))for(var sourceVector=dataset2.getRowMetadata().add(sourceFieldName),name=dataset2.getName(),i=0,nrows=sourceVector.size();nrows>i;i++)sourceVector.setValue(i,name);for(var i=0,count=dataset1.getRowMetadata().getMetadataCount();count>i;i++){var name=dataset1.getRowMetadata().get(i).getName();null==dataset2.getRowMetadata().getByName(name)&&dataset2.getRowMetadata().add(name)}for(var i=0,count=dataset2.getRowMetadata().getMetadataCount();count>i;i++){var name=dataset2.getRowMetadata().get(i).getName();null==dataset1.getRowMetadata().getByName(name)&&dataset1.getRowMetadata().add(name)}for(var dataset2RowMetadataOrder=[],metadataInDifferentOrder=!1,i=0,count=dataset1.getRowMetadata().getMetadataCount();count>i;i++){var name=dataset1.getRowMetadata().get(i).getName(),index=morpheus.MetadataUtil.indexOf(dataset2.getRowMetadata(),name);dataset2RowMetadataOrder.push(index),index!==i&&(metadataInDifferentOrder=!0)}this.dataset1=dataset1,this.dataset2=dataset2;for(var maxSeriesCount=Math.max(this.dataset1.getSeriesCount(),this.dataset2.getSeriesCount()),i=this.dataset1.getSeriesCount();maxSeriesCount>i;i++)this.dataset1.addSeries({name:this.dataset2.getName(i)});for(var i=this.dataset2.getSeriesCount();maxSeriesCount>i;i++)this.dataset2.addSeries({name:this.dataset1.getName(i)});this.rowMetadata=new morpheus.JoinedMetadataModel(this.dataset1.getRowMetadata(),metadataInDifferentOrder?new morpheus.MetadataModelColumnView(this.dataset2.getRowMetadata(),dataset2RowMetadataOrder):this.dataset2.getRowMetadata())},morpheus.JoinedDataset.prototype={getName:function(seriesIndex){return this.dataset1.getName(seriesIndex)},setName:function(seriesIndex,name){this.dataset1.setName(seriesIndex,name)},getDatasets:function(){return[this.dataset1,this.dataset2]},getDataset1:function(){return this.dataset1},getRowMetadata:function(){return this.rowMetadata},getColumnMetadata:function(){return this.dataset1.getColumnMetadata()},getRowCount:function(){return this.dataset1.getRowCount()+this.dataset2.getRowCount()},getColumnCount:function(){return this.dataset1.getColumnCount()},getValue:function(i,j,seriesIndex){return ii;i++){var v1=this.m1.get(i),v2=this.m2.get(i),v=new morpheus.JoinedVector(v1,v2);v1.getProperties().forEach(function(val,key){morpheus.VectorKeys.COPY_IGNORE.has(key)||v.properties.set(key,val)}),v2.getProperties().forEach(function(val,key){morpheus.VectorKeys.COPY_IGNORE.has(key)||v.properties.set(key,val)}),this.vectors.push(v)}},morpheus.JoinedMetadataModel.prototype={add:function(name){var oldVector,index=morpheus.MetadataUtil.indexOf(this,name);-1!==index&&(oldVector=this.remove(index));var v=new morpheus.Vector(name,this.getItemCount());if(null!=oldVector){oldVector.getProperties().forEach(function(val,key){v.getProperties().set(key,val)});for(var i=0,size=oldVector.size();size>i;i++)v.setValue(i,oldVector.getValue(i))}return this.vectors.push(v),v},getItemCount:function(){return this.m1.getItemCount()+this.m2.getItemCount()},get:function(index){return this.vectors[index]},remove:function(index){return this.vectors.splice(index,1)[0]},getByName:function(name){for(var i=0,length=this.vectors.length;length>i;i++)if(name===this.vectors[i].getName())return this.vectors[i]},getMetadataCount:function(){return this.vectors.length}},morpheus.MetadataModel=function(itemCount){this.itemCount=itemCount,this.vectors=[]},morpheus.MetadataModel.prototype={add:function(name){var oldVector,index=morpheus.MetadataUtil.indexOf(this,name);-1!==index&&(oldVector=this.remove(index));var v=new morpheus.Vector(name,this.getItemCount());if(null!=oldVector)for(var i=0,size=oldVector.size();size>i;i++){var val=oldVector.getValue(i);v.setValue(i,val)}return this.vectors.push(v),v},getItemCount:function(){return this.itemCount},get:function(index){if(0>index||index>=this.vectors.length)throw"index "+index+" out of range";return this.vectors[index]},remove:function(index){if(0>index||index>=this.vectors.length)throw"index "+index+" out of range";return this.vectors.splice(index,1)[0]},getByName:function(name){var index=morpheus.MetadataUtil.indexOf(this,name);return-1!==index?this.get(index):void 0},getMetadataCount:function(){return this.vectors.length}},morpheus.MetadataModelAdapter=function(model){this.model=model},morpheus.MetadataModelAdapter.prototype={add:function(name){return this.model.add(name)},getItemCount:function(){return this.model.getItemCount()},get:function(index){return this.model.get(index)},remove:function(index){return this.model.remove(index)},getByName:function(name){return this.model.getByName(name)},getMetadataCount:function(){return this.model.getMetadataCount()}},morpheus.MetadataModelColumnView=function(model,indices){this.model=model,this.indices=indices},morpheus.MetadataModelColumnView.prototype={add:function(name){var vector=this.model.add(name),index=morpheus.MetadataUtil.indexOf(this.model,name);return this.indices.push(index),vector},getMetadataCount:function(){return this.indices.length},get:function(index){if(0>index||index>=this.indices.length)throw"index out of bounds";return this.model.get(this.indices[index])},remove:function(index){if(0>index||index>=this.indices.length)throw"index out of bounds";var v=this.model.remove(this.indices[index]);return this.indices.splice(index,1),v},getByName:function(name){var index=morpheus.MetadataUtil.indexOf(this,name);return-1!==index?this.get(index):void 0}},morpheus.Util.extend(morpheus.MetadataModelColumnView,morpheus.MetadataModelAdapter),morpheus.MetadataModelItemView=function(model,indices){this.model=model,this.indices=indices},morpheus.MetadataModelItemView.prototype={add:function(name){var v=this.model.add(name);return new morpheus.SlicedVector(v,this.indices)},getItemCount:function(){return this.indices.length},get:function(index){var v=this.model.get(index);if(void 0!==v)return new morpheus.SlicedVector(v,this.indices)},getByName:function(name){var v=this.model.getByName(name);if(void 0!==v)return new morpheus.SlicedVector(v,this.indices)},getMetadataCount:function(){return this.model.getMetadataCount()}},morpheus.Util.extend(morpheus.MetadataModelItemView,morpheus.MetadataModelAdapter),morpheus.MetadataUtil=function(){},morpheus.MetadataUtil.renameFields=function(dataset,options){_.each(options.rows,function(item){if(item.renameTo){var v=dataset.getRowMetadata().getByName(item.field);v&&v.setName(item.renameTo)}}),_.each(options.columns,function(item){if(item.renameTo){var v=dataset.getColumnMetadata().getByName(item.field);v&&v.setName(item.renameTo)}})},morpheus.MetadataUtil.search=function(options){var model=options.model,text=options.text,isColumns=options.isColumns;if(text=$.trim(text),""===text)return null;var tokens=morpheus.Util.getAutocompleteTokens(text);if(0==tokens.length)return null;var indexField=isColumns?"COLUMN":"ROW",fieldNames=morpheus.MetadataUtil.getMetadataNames(model);fieldNames.push(indexField);for(var predicates=morpheus.Util.createSearchPredicates({tokens:tokens,fields:fieldNames,defaultMatchMode:options.defaultMatchMode}),vectors=[],nameToVector=new morpheus.Map,j=0;ji;i++){for(var matches=!1,p=0;npredicates>p&&!matches;p++){var predicate=predicates[p],filterColumnName=predicate.getField();if(null!=filterColumnName){var value=null;if(filterColumnName===indexField){if(value=i+1,predicate.accept(value)){matches=!0;break}}else{var wrapper=nameToVector.get(filterColumnName);if(wrapper&&(value=wrapper.vector.getValue(i),null!=value))if(wrapper.isArray){for(var k=0;kj;j++){var wrapper=vectors[j],value=wrapper.vector.getValue(i);if(null!=value)if(wrapper.isArray){for(var k=0;k0?tokens[tokens.selectionStartIndex]:"";token=$.trim(token);try{if(""!==token){var field=null,semi=token.indexOf(":");if(semi>0&&92!==token.charCodeAt(semi-1)){var possibleField=$.trim(token.substring(0,semi));possibleField.length>0&&'"'===possibleField[0]&&'"'===possibleField[token.length-1]&&(possibleField=possibleField.substring(1,possibleField.length-1));var index=morpheus.MetadataUtil.indexOf(searchModel,possibleField);-1!==index&&(token=$.trim(token.substring(semi+1)),searchModel=new morpheus.MetadataModelColumnView(model,[index]))}var set=new morpheus.Set;regex=new RegExp("^"+morpheus.Util.escapeRegex(token),"i");for(var max=10,vectors=[],isArray=[],j=0;ji;i++)for(var j=0;nfields>j;j++){var v=vectors[j],val=v.getValue(i);if(null!=val)if(isArray[j])for(var k=0;k'+field+':'+val+""})})}}catch(x){}null==regex&&(regex=new RegExp(".*","i"));for(var j=0;j'+field+":",show:!0})}}cb(matches)}},morpheus.MetadataUtil.getMetadataNames=function(metadataModel){for(var names=[],i=0,count=metadataModel.getMetadataCount();count>i;i++)names.push(metadataModel.get(i).getName(i));return names.sort(function(a,b){return a=a.toLowerCase(),b=b.toLowerCase(),b>a?-1:a===b?0:1}),names},morpheus.MetadataUtil.getVectors=function(metadataModel,names){var vectors=[];return names.forEach(function(name){var v=metadataModel.getByName(name);if(!v)throw name+" not found. Available fields are "+morpheus.MetadataUtil.getMetadataNames(metadataModel);vectors.push(v)}),vectors},morpheus.MetadataUtil.indexOf=function(metadataModel,name){for(var i=0,length=metadataModel.getMetadataCount();length>i;i++)if(name===metadataModel.get(i).getName())return i;return-1},morpheus.MetadataUtil.DEFAULT_STRING_ARRAY_FIELDS=["target","moa"],morpheus.MetadataUtil.DEFAULT_HIDDEN_FIELDS=new morpheus.Set,["pr_analyte_id","pr_gene_title","pr_gene_id","pr_analyte_num","pr_bset_id","pr_lua_id","pr_pool_id","pr_is_bing","pr_is_inf","pr_is_lmark","qc_slope","qc_f_logp","qc_iqr","bead_batch","bead_revision","bead_set","det_mode","det_plate","det_well","mfc_plate_dim","mfc_plate_id","mfc_plate_name","mfc_plate_quad","mfc_plate_well","pert_dose_unit","pert_id_vendor","pert_mfc_desc","pert_mfc_id","pert_time","pert_time_unit","pert_univ_id","pert_vehicle","pool_id","rna_plate","rna_well","count_mean","count_cv","provenance_code"].forEach(function(name){morpheus.MetadataUtil.DEFAULT_HIDDEN_FIELDS.add(name)}),morpheus.MetadataUtil.maybeConvertStrings=function(metadata,metadataStartIndex){for(var i=metadataStartIndex,count=metadata.getMetadataCount();count>i;i++)morpheus.VectorUtil.maybeConvertStringToNumber(metadata.get(i));morpheus.MetadataUtil.DEFAULT_STRING_ARRAY_FIELDS.forEach(function(field){metadata.getByName(field)&&morpheus.VectorUtil.maybeConvertToStringArray(metadata.getByName(field),",")})},morpheus.MetadataUtil.copy=function(src,dest){if(src.getItemCount()!=dest.getItemCount())throw"Item count not equal in source and destination. "+src.getItemCount()+" != "+dest.getItemCount();for(var itemCount=src.getItemCount(),metadataColumns=src.getMetadataCount(),j=0;metadataColumns>j;j++){var srcVector=src.get(j),destVector=dest.getByName(srcVector.getName());null==destVector&&(destVector=dest.add(srcVector.getName()));for(var i=0;itemCount>i;i++)destVector.setValue(i,srcVector.getValue(i))}},morpheus.MetadataUtil.addVectorIfNotExists=function(metadataModel,name){var v=metadataModel.getByName(name);return v||(v=metadataModel.add(name)),v},morpheus.MetadataUtil.getMatchingIndices=function(metadataModel,tokens){for(var indices={},itemIndex=0,nitems=metadataModel.getItemCount();nitems>itemIndex;itemIndex++){for(var matches=!1,metadataIndex=0,metadataCount=metadataModel.getMetadataCount();metadataCount>metadataIndex&&!matches;metadataIndex++)for(var vector=metadataModel.get(metadataModel.getColumnName(metadataIndex)),value=vector.getValue(itemIndex),i=0,length=tokens.length;length>i;i++)if(tokens[i]==value){ matches=!0;break}matches&&(indices[itemIndex]=1)}return indices},morpheus.Positions=function(){this.spaces=void 0,this.defaultPositionFunction=function(index){return this.size*index},this.squishedPositionFunction=function(index){return this.positions[index]},this.positionFunction=this.defaultPositionFunction,this.squishedIndices={},this.isSquished=!1},morpheus.Positions.getBottom=function(rect,rowPositions){var bottom=rowPositions.getLength();return null!=rect&&(bottom=1+rowPositions.getIndex(rect.y+rect.height,!1),bottom=Math.max(0,bottom),bottom=Math.min(rowPositions.getLength(),bottom)),bottom},morpheus.Positions.getTop=function(rect,rowPositions){var top=0;return null!=rect&&(top=rowPositions.getIndex(rect.y,!1)-1,top=Math.max(0,top),top=Math.min(rowPositions.getLength(),top)),top},morpheus.Positions.getLeft=function(rect,columnPositions){var left=0;return null!=rect&&(left=columnPositions.getIndex(rect.x,!1)-1,left=Math.max(0,left),left=Math.min(columnPositions.getLength(),left)),left},morpheus.Positions.getRight=function(rect,columnPositions){var right=columnPositions.getLength();return null!=rect&&(right=1+columnPositions.getIndex(rect.x+rect.width,!1),right=Math.min(columnPositions.getLength(),right)),right},morpheus.Positions.prototype={length:0,size:13,squishFactor:.1,compress:!0,copy:function(){var copy=new morpheus.Positions;return this.spaces&&(copy.spaces=this.spaces.slice()),copy.compress=this.compress,copy.squishFactor=this.squishFactor,copy.size=this.size,copy.length=this.length,this.isSquished&&(copy.positionFunction=copy.squishedPositionFunction,copy.squishedIndices=_.clone(this.squishedIndices),copy.isSquished=!0),copy},getIndex:function(position,exact){return exact?this.binaryExactSearch(position):this.binaryInExactSearch(position)},getLength:function(){return this.length},getPosition:function(index){return this.positionFunction(index)+(void 0!==this.spaces?this.spaces[index]:0)},getItemSize:function(index){return this.squishedIndices[index]===!0?this.size*this.squishFactor:this.size},getSize:function(){return this.size},setSpaces:function(spaces){this.spaces=spaces},setLength:function(length){this.length=length},setSize:function(size){this.size=size,this.isSquished&&this.setSquishedIndices(this.squishedIndices)},setSquishedIndices:function(squishedIndices){if(null!=squishedIndices){var compress=this.compress;this.squishedIndices=squishedIndices;for(var positions=[],squishFactor=this.squishFactor,size=this.size,position=0,i=0,length=this.getLength();length>i;i++){var itemSize;squishedIndices[i]===!0?(positions.push(position),itemSize=size*squishFactor,position+=itemSize):(compress||(position=size*i),positions.push(position),position+=size)}this.isSquished=!0,this.positions=positions,this.positionFunction=this.squishedPositionFunction}else this.squishedIndices={},this.isSquished=!1,this.positionFunction=this.defaultPositionFunction},setSquishFactor:function(f){this.squishFactor!==f&&(this.squishFactor=f,this.isSquished&&this.setSquishedIndices(this.squishedIndices))},getSquishFactor:function(){return this.squishFactor},binaryExactSearch:function(position){for(var low=0,high=this.length-1;high>=low;){var mid=low+high>>1,midVal=this.getPosition(mid),size=this.getItemSize(mid);if(position>=midVal&&midVal+size>position)return mid;if(position>midVal)low=mid+1;else{if(!(midVal>position))return mid;high=mid-1}}return-1},binaryInExactSearch:function(position){var low=0,high=this.getLength()-1,maxIndex=this.getLength()-1;if(position<=this.getPosition(0))return 0;for(;high>=low;){var mid=low+high>>1,midVal=this.getPosition(mid),size=this.getItemSize(mid),nextStart=maxIndex===mid?midVal+size:this.getPosition(mid+1);if(position>=midVal&&nextStart>position)return mid;if(position>midVal)low=mid+1;else{if(!(midVal>position))return mid;high=mid-1}}return low-1}},morpheus.Project=function(dataset){this.originalDataset=dataset,this.rowIndexMapper=new morpheus.IndexMapper(this,!0),this.columnIndexMapper=new morpheus.IndexMapper(this,!1),this.groupRows=[],this.groupColumns=[],this.rowColorModel=new morpheus.VectorColorModel,this.columnColorModel=new morpheus.VectorColorModel,this.rowShapeModel=new morpheus.VectorShapeModel,this.columnShapeModel=new morpheus.VectorShapeModel,this.hoverColumnIndex=-1,this.hoverRowIndex=-1,this.columnSelectionModel=new morpheus.SelectionModel(this,!0),this.rowSelectionModel=new morpheus.SelectionModel(this,!1),this.elementSelectionModel=new morpheus.ElementSelectionModel(this),morpheus.Project._recomputeCalculatedFields(this.originalDataset),morpheus.Project._recomputeCalculatedFields(new morpheus.TransposedDatasetView(this.originalDataset))},morpheus.Project.Events={DATASET_CHANGED:"datasetChanged",ROW_GROUP_BY_CHANGED:"rowGroupByChanged",COLUMN_GROUP_BY_CHANGED:"columnGroupByChanged",ROW_FILTER_CHANGED:"rowFilterChanged",COLUMN_FILTER_CHANGED:"columnFilterChanged",ROW_SORT_ORDER_CHANGED:"rowSortOrderChanged",COLUMN_SORT_ORDER_CHANGED:"columnSortOrderChanged",ROW_TRACK_REMOVED:"rowTrackRemoved",COLUMN_TRACK_REMOVED:"columnTrackRemoved"},morpheus.Project._recomputeCalculatedFields=function(dataset){for(var metadata=dataset.getRowMetadata(),view=new morpheus.DatasetRowView(dataset),metadataIndex=0,count=metadata.getMetadataCount();count>metadataIndex;metadataIndex++){var v=metadata.get(metadataIndex),f=v.getProperties().get(morpheus.VectorKeys.FUNCTION);if(null!=f&&v.getProperties().get(morpheus.VectorKeys.RECOMPUTE_FUNCTION))for(var i=0,nrows=dataset.getRowCount();nrows>i;i++)v.setValue(i,f(view.setIndex(i)))}},morpheus.Project.prototype={getHoverColumnIndex:function(){return this.hoverColumnIndex},setHoverColumnIndex:function(index){this.hoverColumnIndex=index},getHoverRowIndex:function(){return this.hoverRowIndex},setHoverRowIndex:function(index){this.hoverRowIndex=index},getRowColorModel:function(){return this.rowColorModel},getRowShapeModel:function(){return this.rowShapeModel},getColumnShapeModel:function(){return this.columnShapeModel},getGroupRows:function(){return this.groupRows},getGroupColumns:function(){return this.groupColumns},getFullDataset:function(){return this.originalDataset},getColumnSelectionModel:function(){return this.columnSelectionModel},getRowSelectionModel:function(){return this.rowSelectionModel},getFilteredSortedRowIndices:function(){return this.rowIndexMapper.convertToView()},getFilteredSortedColumnIndices:function(){return this.columnIndexMapper.convertToView()},getElementSelectionModel:function(){return this.elementSelectionModel},setFullDataset:function(dataset,notify){this.originalDataset=dataset,this.rowIndexMapper.setFilter(this.rowIndexMapper.getFilter()),this.columnIndexMapper.setFilter(this.columnIndexMapper.getFilter()),this.columnSelectionModel.clear(),this.rowSelectionModel.clear(),this.elementSelectionModel.clear(),notify&&this.trigger(morpheus.Project.Events.DATASET_CHANGED)},setGroupRows:function(keys,notify){this.groupRows=keys,notify&&this.trigger(morpheus.Project.Events.ROW_GROUP_BY_CHANGED)},setGroupColumns:function(keys,notify){this.groupColumns=keys,notify&&this.trigger(morpheus.Project.Events.COLUMN_GROUP_BY_CHANGED)},setRowFilter:function(filter,notify){this._saveSelection(!1),this.rowIndexMapper.setFilter(filter),this._restoreSelection(!1),notify&&this.trigger(morpheus.Project.Events.ROW_FILTER_CHANGED)},getRowFilter:function(){return this.rowIndexMapper.getFilter()},getColumnFilter:function(){return this.columnIndexMapper.getFilter()},setColumnFilter:function(filter,notify){this._saveSelection(!0),this.columnIndexMapper.setFilter(filter),this._restoreSelection(!0),notify&&this.trigger(morpheus.Project.Events.COLUMN_FILTER_CHANGED)},getColumnColorModel:function(){return this.columnColorModel},getSortedFilteredDataset:function(){return morpheus.DatasetUtil.slicedView(this.getFullDataset(),this.rowIndexMapper.convertToView(),this.columnIndexMapper.convertToView())},getSelectedDataset:function(options){options=$.extend({},{selectedRows:!0,selectedColumns:!0,emptyToAll:!0},options);var dataset=this.getSortedFilteredDataset(),rows=null;options.selectedRows&&(rows=this.rowSelectionModel.getViewIndices().values().sort(function(a,b){return a===b?0:b>a?-1:1}),0===rows.length&&options.emptyToAll&&(rows=null));var columns=null;return options.selectedColumns&&(columns=this.columnSelectionModel.getViewIndices().values().sort(function(a,b){return a===b?0:b>a?-1:1}),0===columns.length&&options.emptyToAll&&(columns=null)),morpheus.DatasetUtil.slicedView(dataset,rows,columns)},_saveSelection:function(isColumns){this.elementSelectionModel.save(),isColumns?this.columnSelectionModel.save():this.rowSelectionModel.save()},_restoreSelection:function(isColumns){isColumns?this.columnSelectionModel.restore():this.rowSelectionModel.restore(),this.elementSelectionModel.restore()},setRowSortKeys:function(keys,notify){this._saveSelection(!1),this.rowIndexMapper.setSortKeys(keys),this._restoreSelection(!1),notify&&this.trigger(morpheus.Project.Events.ROW_SORT_ORDER_CHANGED)},setColumnSortKeys:function(keys,notify){this._saveSelection(!0),this.columnIndexMapper.setSortKeys(keys),this._restoreSelection(!0),notify&&this.trigger(morpheus.Project.Events.COLUMN_SORT_ORDER_CHANGED)},getRowSortKeys:function(){return this.rowIndexMapper.sortKeys},getColumnSortKeys:function(){return this.columnIndexMapper.sortKeys},convertViewColumnIndexToModel:function(viewIndex){return this.columnIndexMapper.convertViewIndexToModel(viewIndex)},convertViewRowIndexToModel:function(viewIndex){return this.rowIndexMapper.convertViewIndexToModel(viewIndex)},convertModelRowIndexToView:function(modelIndex){return this.rowIndexMapper.convertModelIndexToView(modelIndex)},convertModelColumnIndexToView:function(modelIndex){return this.columnIndexMapper.convertModelIndexToView(modelIndex)},isColumnViewIndexSelected:function(index){return this.columnSelectionModel.isViewIndexSelected(index)},isRowViewIndexSelected:function(index){return this.rowSelectionModel.isViewIndexSelected(index)}},morpheus.Util.extend(morpheus.Project,morpheus.Events),morpheus.SelectionModel=function(project,isColumns){this.viewIndices=new morpheus.Set,this.project=project,this.isColumns=isColumns},morpheus.SelectionModel.prototype={setViewIndices:function(indices,notify){this.viewIndices=indices,notify&&this.trigger("selectionChanged")},isViewIndexSelected:function(index){return this.viewIndices.has(index)},clear:function(){this.viewIndices=new morpheus.Set},getViewIndices:function(){return this.viewIndices},count:function(){return this.viewIndices.size()},toModelIndices:function(){var project=this.project,f=this.isColumns?project.convertViewColumnIndexToModel:project.convertViewRowIndexToModel;f=_.bind(f,project);var modelIndices=[];return this.viewIndices.forEach(function(index){var m=f(index);modelIndices.push(m)}),modelIndices},save:function(){this.modelIndices=this.toModelIndices()},restore:function(){var project=this.project;this.viewIndices=new morpheus.Set;var f=this.isColumns?project.convertModelColumnIndexToView:project.convertModelRowIndexToView;f=_.bind(f,project);for(var i=0,length=this.modelIndices.length;length>i;i++){var index=f(this.modelIndices[i]);-1!==index&&this.viewIndices.add(index)}}},morpheus.Util.extend(morpheus.SelectionModel,morpheus.Events),morpheus.SlicedDatasetView=function(dataset,rowIndices,columnIndices){morpheus.DatasetAdapter.call(this,dataset),null==rowIndices&&(rowIndices=null),null==columnIndices&&(columnIndices=null),this.rowIndices=rowIndices,this.columnIndices=columnIndices},morpheus.SlicedDatasetView.prototype={getRowCount:function(){return null!==this.rowIndices?this.rowIndices.length:this.dataset.getRowCount()},getColumnCount:function(){return null!==this.columnIndices?this.columnIndices.length:this.dataset.getColumnCount()},getValue:function(i,j,seriesIndex){return this.dataset.getValue(null!==this.rowIndices?this.rowIndices[i]:i,null!==this.columnIndices?this.columnIndices[j]:j,seriesIndex)},setValue:function(i,j,value,seriesIndex){this.dataset.setValue(null!==this.rowIndices?this.rowIndices[i]:i,null!==this.columnIndices?this.columnIndices[j]:j,value,seriesIndex)},getRowMetadata:function(){return null!==this.rowIndices?new morpheus.MetadataModelItemView(this.dataset.getRowMetadata(),this.rowIndices):this.dataset.getRowMetadata()},getColumnMetadata:function(){return null!==this.columnIndices?new morpheus.MetadataModelItemView(this.dataset.getColumnMetadata(),this.columnIndices):this.dataset.getColumnMetadata()},toString:function(){return this.getName()}},morpheus.Util.extend(morpheus.SlicedDatasetView,morpheus.DatasetAdapter),morpheus.SlicedVector=function(v,indices){morpheus.VectorAdapter.call(this,v),this.indices=indices},morpheus.SlicedVector.prototype={setValue:function(i,value){this.v.setValue(this.indices[i],value)},getValue:function(i){return this.v.getValue(this.indices[i])},size:function(){return this.indices.length}},morpheus.Util.extend(morpheus.SlicedVector,morpheus.VectorAdapter),morpheus.MatchesOnTopSortKey=function(project,modelIndices,name){for(var modelHighlight={},viewIndices=[],i=0,length=modelIndices.length;length>i;i++)modelHighlight[modelIndices[i]]=!0,viewIndices.push(i);this.comparator=function(i1,i2){var a=void 0===modelHighlight[i1]?0:1,b=void 0==modelHighlight[i2]?0:1;return a>b?-1:a===b?0:1},this.indices=viewIndices,this.name=name},morpheus.MatchesOnTopSortKey.prototype={init:function(){},getSortOrder:function(){return 2},getComparator:function(){return this.comparator},getValue:function(i){return i},toString:function(i){return this.name}},morpheus.SortKey=function(field,sortOrder){"string"==typeof sortOrder&&(sortOrder=morpheus.SortKey.SortOrder[sortOrder.toUpperCase()]),this.field=field,this.sortOrder=sortOrder,this.v=null,this.c=null,this.setSortOrder(sortOrder)},morpheus.SortKey.SortOrder={ASCENDING:0,DESCENDING:1,UNSORTED:2,CUSTOM:3,TOP_N:4},morpheus.SortKey.ASCENDING_COMPARATOR=function(a,b){var aNaN=null==a||_.isNumber(a)&&isNaN(a)||0===a.length,bNaN=null==b||_.isNumber(b)&&isNaN(b)||0===b.length;return aNaN&&bNaN?0:aNaN?1:bNaN?-1:(a.toLowerCase&&(a=a.toLowerCase()),b.toLowerCase&&(b=b.toLowerCase()),a===b?0:b>a?-1:1)},morpheus.SortKey.DESCENDING_COMPARATOR=function(a,b){var aNaN=null==a||_.isNumber(a)&&isNaN(a)||0===a.length,bNaN=null==b||_.isNumber(b)&&isNaN(b)||0===b.length;return aNaN&&bNaN?0:aNaN?1:bNaN?-1:a===b?0:b>a?1:-1},morpheus.SortKey.NUMBER_ASCENDING_COMPARATOR=function(a,b){var aNaN=null==a||isNaN(a),bNaN=null==b||isNaN(b);return aNaN&&bNaN?0:aNaN?1:bNaN?-1:a===b?0:b>a?-1:1},morpheus.SortKey.NUMBER_DESCENDING_COMPARATOR=function(a,b){var aNaN=null==a||isNaN(a),bNaN=null==b||isNaN(b);return aNaN&&bNaN?0:aNaN?1:bNaN?-1:a===b?0:b>a?1:-1},morpheus.SortKey.STRING_ASCENDING_COMPARATOR=function(a,b){return a=null==a||void 0===a.toLowerCase?null:a.toLowerCase(),b=null==b||void 0===b.toLowerCase?null:b.toLowerCase(),a===b?0:b>a?-1:1},morpheus.SortKey.STRING_DESCENDING_COMPARATOR=function(a,b){return a=null==a||void 0===a.toLowerCase?null:a.toLowerCase(),b=null==b||void 0===b.toLowerCase?null:b.toLowerCase(),a===b?0:b>a?1:-1},morpheus.SortKey.ELEMENT_ASCENDING_COMPARATOR=function(obj1,obj2){var a=+obj1,b=+obj2,aNaN=isNaN(a),bNaN=isNaN(b);if(aNaN&&bNaN)return 0;if(aNaN)return 1;if(bNaN)return-1;if(a===b&&obj1.toObject&&obj2.toObject){var a1=obj1.toObject(),b1=obj2.toObject();for(var name in a1){a=a1[name],b=b1[name];var c=a===b?0:b>a?-1:1;if(0!==c)return c}}return a===b?0:b>a?-1:1},morpheus.SortKey.ELEMENT_DESCENDING_COMPARATOR=function(obj1,obj2){var a=+obj1,b=+obj2,aNaN=isNaN(a),bNaN=isNaN(b);if(aNaN&&bNaN)return 0;if(aNaN)return 1;if(bNaN)return-1;if(a===b&&obj1.toObject&&obj2.toObject){var a1=obj1.toObject(),b1=obj2.toObject();for(var name in a1){a=a1[name],b=b1[name];var c=a===b?0:b>a?1:-1;if(0!==c)return c}}return a===b?0:b>a?1:-1},morpheus.SortKey.BOX_PLOT_SUMMARY_FUNCTION=function(array){var box=array.box;if(null==box){var v=morpheus.VectorUtil.arrayAsVector(array);box=morpheus.BoxPlotItem(null!=this.indices?new morpheus.SlicedVector(v,this.indices):v),array.box=box}return box.q3},morpheus.SortKey.ARRAY_MAX_SUMMARY_FUNCTION=function(array){var a=0;if(null!=array){for(var aPosMax=-Number.MAX_VALUE,aNegMax=Number.MAX_VALUE,i=0,length=array.length;length>i;i++){var value=array[i];isNaN(value)||(value>=0?aPosMax=value>aPosMax?value:aPosMax:aNegMax=aNegMax>value?value:aNegMax)}aPosMax!==-Number.MAX_VALUE&&(a=aPosMax),aNegMax!==Number.MAX_VALUE&&(a=Math.abs(aNegMax)>a?aNegMax:a)}return a},morpheus.SortKey.ARRAY_ASCENDING_COMPARATOR=function(summary){return function(a,b){var aNaN=null==a,bNaN=null==b;return aNaN&&bNaN?0:aNaN?1:bNaN?-1:(a=summary(a),b=summary(b),aNaN=isNaN(a),bNaN=isNaN(b),aNaN&&bNaN?0:aNaN?1:bNaN?-1:a===b?0:b>a?-1:1)}},morpheus.SortKey.ARRAY_DESCENDING_COMPARATOR=function(summary){return function(a,b){var aNaN=null==a,bNaN=null==b;return aNaN&&bNaN?0:aNaN?1:bNaN?-1:(a=summary(a),b=summary(b),aNaN=isNaN(a),bNaN=isNaN(b),aNaN&&bNaN?0:aNaN?1:bNaN?-1:a===b?0:b>a?1:-1)}},morpheus.SortKey.reverseComparator=function(c){return function(a,b){return c(b,a)}},morpheus.SortKey.prototype={init:function(dataset){if(this.v=dataset.getRowMetadata().getByName(this.field),this.v){var dataType=morpheus.VectorUtil.getDataType(this.v);if("number"===dataType)this.c=this.sortOrder===morpheus.SortKey.SortOrder.ASCENDING?morpheus.SortKey.NUMBER_ASCENDING_COMPARATOR:morpheus.SortKey.NUMBER_DESCENDING_COMPARATOR;else if("[number]"===dataType){var summary=this.v.getProperties().get(morpheus.VectorKeys.ARRAY_SUMMARY_FUNCTION)||morpheus.SortKey.ARRAY_MAX_SUMMARY_FUNCTION;this.c=this.sortOrder===morpheus.SortKey.SortOrder.ASCENDING?morpheus.SortKey.ARRAY_ASCENDING_COMPARATOR(summary):morpheus.SortKey.ARRAY_DESCENDING_COMPARATOR(summary)}else this.c=this.sortOrder===morpheus.SortKey.SortOrder.ASCENDING?morpheus.SortKey.ASCENDING_COMPARATOR:morpheus.SortKey.DESCENDING_COMPARATOR}else this.v={},this.v.getValue=function(){return 0},this.c=this.sortOrder===morpheus.SortKey.SortOrder.ASCENDING?morpheus.SortKey.ASCENDING_COMPARATOR:morpheus.SortKey.DESCENDING_COMPARATOR},getComparator:function(){return this.c},getValue:function(i){return this.v.getValue(i)},setSortOrder:function(sortOrder){this.sortOrder=sortOrder},getSortOrder:function(){return this.sortOrder},toString:function(){return this.field}},morpheus.SortByValuesKey=function(modelIndices,sortOrder,isColumnSort){this.field="selection",this.bothCount=10,this.modelIndices=modelIndices,this.sortOrder=sortOrder,this.isColumnSort=isColumnSort,this.setSortOrder(sortOrder)},morpheus.SortByValuesKey.prototype={init:function(dataset,visibleModelIndices){if(this.dataset=morpheus.DatasetUtil.slicedView(dataset,null,this.modelIndices),this.rowView=new morpheus.DatasetRowView(this.dataset),this.summaryFunction=this.modelIndices.length>1?morpheus.Median:function(row){return row.getValue(0)},this.sortOrder===morpheus.SortKey.SortOrder.TOP_N){for(var pairs=[],missingIndices=[],i=0,nrows=visibleModelIndices.length;nrows>i;i++){var index=visibleModelIndices[i],value=this.summaryFunction(this.rowView.setIndex(index));isNaN(value)?missingIndices.push(index):pairs.push({index:index,value:value})}pairs.sort(function(a,b){return a.valuecounter;){for(var i=0;nInGroup>i&&ntop>topIndex;i++,topIndex++,counter++)modelIndexToValue[topPairs[topIndex].index]=counter;for(var indexCounterPairs=[],i=0;nInGroup>i&&bottomIndex>=0;i++,bottomIndex--,counter++)indexCounterPairs.push([bottomPairs[bottomIndex].index,counter]);for(var i=indexCounterPairs.length-1,j=0;i>=0;i--,j++){var item_i=indexCounterPairs[i],item_j=indexCounterPairs[j];modelIndexToValue[item_i[0]]=item_j[1]}}for(var i=0,length=missingIndices.length;length>i;i++,counter++)modelIndexToValue[missingIndices[i]]=counter;this.modelIndexToValue=modelIndexToValue}else delete this.modelIndexToValue},getComparator:function(){return this.c},getValue:function(i){return this.modelIndexToValue?this.modelIndexToValue[i]:this.summaryFunction(this.rowView.setIndex(i))},setSortOrder:function(sortOrder){"string"==typeof sortOrder&&(sortOrder=morpheus.SortKey.SortOrder[sortOrder.toUpperCase()]),this.sortOrder=sortOrder,this.sortOrder===morpheus.SortKey.SortOrder.ASCENDING?this.c=morpheus.SortKey.ELEMENT_ASCENDING_COMPARATOR:this.sortOrder===morpheus.SortKey.SortOrder.DESCENDING?this.c=morpheus.SortKey.ELEMENT_DESCENDING_COMPARATOR:this.c=morpheus.SortKey.NUMBER_ASCENDING_COMPARATOR},getSortOrder:function(){return this.sortOrder},toString:function(){return"values"}},morpheus.SpecifiedModelSortOrder=function(modelIndices,nvisible,name){this.nvisible=nvisible;for(var modelIndexToValue=[],i=0,length=modelIndices.length;length>i;i++)modelIndexToValue[modelIndices[i]]=i;this.modelIndexToValue=modelIndexToValue,this.name=name,this.c=morpheus.SortKey.ASCENDING_COMPARATOR},morpheus.SpecifiedModelSortOrder.prototype={init:function(dataset){},getComparator:function(a,b){return this.c},getValue:function(i){return this.modelIndexToValue[i]},setSortOrder:function(sortOrder){this.sortOrder=sortOrder,this.c=this.sortOrder===morpheus.SortKey.SortOrder.ASCENDING?morpheus.SortKey.NUMBER_ASCENDING_COMPARATOR:morpheus.SortKey.NUMBER_DESCENDING_COMPARATOR},getSortOrder:function(){return this.sortOrder},getName:function(){return this.name}},morpheus.SortKey.keepExistingSortKeys=function(newSortKeys,existingSortKeys){for(var existingSpecifiedSortKey=null,i=0,length=existingSortKeys.length;length>i;i++){var key=existingSortKeys[i];key instanceof morpheus.SpecifiedModelSortOrder&&"dendrogram"===key.name&&(existingSpecifiedSortKey=key)}if(existingSpecifiedSortKey){for(var newSortKeysHasSpecifiedSortKey=!1,i=0,length=newSortKeys.length;length>i;i++){var key=newSortKeys[i];key instanceof morpheus.SpecifiedModelSortOrder&&"dendrogram"===key.name&&(newSortKeysHasSpecifiedSortKey=!0)}existingSpecifiedSortKey&&!newSortKeysHasSpecifiedSortKey&&newSortKeys.splice(newSortKeys.length,0,existingSpecifiedSortKey)}return newSortKeys},morpheus.SpecifiedGroupByKey=function(clusterIds){this.clusterIds=clusterIds,this.c=function(a,b){return a===b?0:b>a?-1:1}},morpheus.SpecifiedGroupByKey.prototype={init:function(dataset){},getComparator:function(a,b){return this.c},getValue:function(i){return this.clusterIds[i]},setSortOrder:function(sortOrder){},getSortOrder:function(){},getName:function(){return"Dendrogram Cut"}},morpheus.SymmetricProject=function(dataset){this.originalDataset=dataset,this.indexMapper=new morpheus.IndexMapper(this,!0),this.groups=[],this.colorModel=new morpheus.VectorColorModel,this.shapeModel=new morpheus.VectorShapeModel,this.hoverRowIndex=-1,this.hoverColumnIndex=-1,this.selectionModel=new morpheus.SelectionModel(this,!1),this.elementSelectionModel=new morpheus.ElementSelectionModel(this)},morpheus.SymmetricProject.prototype={getHoverColumnIndex:function(){return this.hoverColumnIndex},setHoverColumnIndex:function(index){this.hoverColumnIndex=index},getHoverRowIndex:function(){return this.hoverRowIndex},setHoverRowIndex:function(index){this.hoverRowIndex=index},getRowColorModel:function(){return this.colorModel},getRowShapeModel:function(){return this.shapeModel},getColumnShapeModel:function(){return this.shapeModel},getGroupRows:function(){return this.groups},getGroupColumns:function(){return this.groups},getFullDataset:function(){return this.originalDataset},getColumnSelectionModel:function(){return this.selectionModel},getRowSelectionModel:function(){return this.selectionModel},getElementSelectionModel:function(){return this.elementSelectionModel},getFilteredSortedRowIndices:function(){return this.indexMapper.convertToView()},getFilteredSortedColumnIndices:function(){return this.indexMapper.convertToView()},setFullDataset:function(dataset,notify){this.originalDataset=dataset,this.indexMapper.setFilter(this.indexMapper.getFilter()),this.selectionModel.clear(),this.elementSelectionModel.clear(),notify&&this.trigger(morpheus.Project.Events.DATASET_CHANGED)},setGroupRows:function(keys,notify){this.groups=keys,notify&&(this.trigger(morpheus.Project.Events.ROW_GROUP_BY_CHANGED),this.trigger(morpheus.Project.Events.COLUMN_GROUP_BY_CHANGED))},setGroupColumns:function(keys,notify){this.groups=keys,notify&&(this.trigger(morpheus.Project.Events.ROW_GROUP_BY_CHANGED),this.trigger(morpheus.Project.Events.COLUMN_GROUP_BY_CHANGED))},setRowFilter:function(filter,notify){this._saveSelection(!1),this.indexMapper.setFilter(filter),this._restoreSelection(!1),notify&&this.trigger(morpheus.Project.Events.ROW_FILTER_CHANGED)},getRowFilter:function(){return this.indexMapper.getFilter()},getColumnFilter:function(){return this.indexMapper.getFilter()},setColumnFilter:function(filter,notify){this._saveSelection(!0),this.indexMapper.setFilter(filter),this._restoreSelection(!0),notify&&this.trigger(morpheus.Project.Events.COLUMN_FILTER_CHANGED)},getColumnColorModel:function(){return this.colorModel},getSortedFilteredDataset:function(){return morpheus.DatasetUtil.slicedView(this.getFullDataset(),this.indexMapper.convertToView(),this.indexMapper.convertToView())},getSelectedDataset:function(options){options=$.extend({},{selectedRows:!0,selectedColumns:!0,emptyToAll:!0},options);var dataset=this.getSortedFilteredDataset(),rows=null;options.selectedRows&&(rows=this.selectionModel.getViewIndices().values().sort(function(a,b){return a===b?0:b>a?-1:1}),0===rows.length&&options.emptyToAll&&(rows=null));var columns=null;return options.selectedColumns&&(columns=this.selectionModel.getViewIndices().values().sort(function(a,b){return a===b?0:b>a?-1:1}),0===columns.length&&options.emptyToAll&&(columns=null)),morpheus.DatasetUtil.slicedView(dataset,rows,columns)},_saveSelection:function(isColumns){this.elementSelectionModel.save(),isColumns?this.selectionModel.save():this.selectionModel.save()},_restoreSelection:function(isColumns){isColumns?this.selectionModel.restore():this.selectionModel.restore(),this.elementSelectionModel.restore()},setRowSortKeys:function(keys,notify){this._saveSelection(!1),this.indexMapper.setSortKeys(keys),this._restoreSelection(!1),notify&&this.trigger(morpheus.Project.Events.ROW_SORT_ORDER_CHANGED)},setColumnSortKeys:function(keys,notify){this._saveSelection(!0),this.indexMapper.setSortKeys(keys),this._restoreSelection(!0),notify&&this.trigger(morpheus.Project.Events.COLUMN_SORT_ORDER_CHANGED)},getRowSortKeys:function(){return this.indexMapper.sortKeys},getColumnSortKeys:function(){return this.indexMapper.sortKeys},convertViewColumnIndexToModel:function(viewIndex){return this.indexMapper.convertViewIndexToModel(viewIndex)},convertViewRowIndexToModel:function(viewIndex){return this.indexMapper.convertViewIndexToModel(viewIndex)},convertModelRowIndexToView:function(modelIndex){return this.indexMapper.convertModelIndexToView(modelIndex)},convertModelColumnIndexToView:function(modelIndex){return this.indexMapper.convertModelIndexToView(modelIndex)},isColumnViewIndexSelected:function(index){return this.selectionModel.isViewIndexSelected(index)},isRowViewIndexSelected:function(index){return this.selectionModel.isViewIndexSelected(index)}},morpheus.Util.extend(morpheus.SymmetricProject,morpheus.Events),morpheus.TransposedDatasetView=function(dataset){morpheus.DatasetAdapter.call(this,dataset)},morpheus.TransposedDatasetView.prototype={getRowCount:function(){return this.dataset.getColumnCount()},getColumnCount:function(){return this.dataset.getRowCount()},getValue:function(i,j,seriesIndex){return this.dataset.getValue(j,i,seriesIndex)},setValue:function(i,j,value,seriesIndex){this.dataset.setValue(j,i,value,seriesIndex)},getRowMetadata:function(){return this.dataset.getColumnMetadata()},getColumnMetadata:function(){return this.dataset.getRowMetadata()}},morpheus.Util.extend(morpheus.TransposedDatasetView,morpheus.DatasetAdapter),morpheus.Percentile=function(vector,p,isSorted){return morpheus.ArrayPercentile(morpheus.RemoveNaN(vector),p,isSorted)},morpheus.RemoveNaN=function(values){for(var array=[],i=0,size=values.size();size>i;i++){var value=values.getValue(i);isNaN(value)||array.push(value)}return array},morpheus.Median=function(vector){return morpheus.ArrayPercentile(morpheus.RemoveNaN(vector),50,!1)},morpheus.Median.toString=function(){return"Median"},morpheus.ArrayPercentile=function(values,p,isSorted){return isSorted||values.sort(function(a,b){return b>a?-1:a===b?0:1}),d3.quantile(values,p/100)},morpheus.MaxPercentiles=function(percentiles){var f=function(vector){for(var values=[],i=0,size=vector.size();size>i;i++){var value=vector.getValue(i);isNaN(value)||values.push(value)}if(0===values.length)return NaN;values.sort(function(a,b){return b>a?-1:a===b?0:1});for(var max=0,i=0;iMath.abs(max)&&(max=p)}return max};return f.toString=function(){for(var s=["Maximum of "],i=0,length=percentiles.length;length>i;i++)i>0&&length>2&&s.push(", "),i===length-1&&s.push(2==length?" and ":"and "),s.push(percentiles[i]);return s.push(" percentiles"),s.join("")},f},morpheus.Mean=function(vector){for(var sum=0,count=0,i=0,length=vector.size();length>i;i++){var val=vector.getValue(i);isNaN(val)||(sum+=val,count++)}return 0===count?NaN:sum/count},morpheus.Mean.toString=function(){return"Mean"},morpheus.Sum=function(vector){for(var sum=0,found=!1,i=0,length=vector.size();length>i;i++){var val=vector.getValue(i);isNaN(val)||(found=!0,sum+=val)}return found?sum:NaN},morpheus.Sum.toString=function(){return"Sum"},morpheus.CountNonNaN=function(vector){for(var count=0,i=0,length=vector.size();length>i;i++){var val=vector.getValue(i);isNaN(val)||count++}return count},morpheus.CountNonNaN.toString=function(){return"Count non-NaN"},morpheus.Max=function(vector){for(var max=-Number.MAX_VALUE,found=!1,i=0,length=vector.size();length>i;i++){var val=vector.getValue(i);isNaN(val)||(found=!0,max=Math.max(max,val))}return found?max:NaN},morpheus.Max.toString=function(){return"Max"},morpheus.Min=function(vector){for(var min=Number.MAX_VALUE,found=!1,i=0,length=vector.size();length>i;i++){var val=vector.getValue(i);isNaN(val)||(found=!0,min=Math.min(min,val))}return found?min:NaN},morpheus.Min.toString=function(){return"Min"},morpheus.Variance=function(list,mean){void 0==mean&&(mean=morpheus.Mean(list));for(var sum=0,n=0,j=0,size=list.size();size>j;j++){var x=list.getValue(j);if(!isNaN(x)){var diff=x-mean;diff*=diff,sum+=diff,n++}}if(1>=n)return NaN;n-=1,1>n&&(n=1);var variance=sum/n;return variance};var LOG_10=Math.log(10);morpheus.Log10=function(x){return 0>=x?0:Math.log(x)/LOG_10};var LOG_2=Math.log(2);morpheus.Log2=function(x){return 0>=x?0:Math.log(x)/LOG_2},morpheus.FDR_BH=function(nominalPValues){for(var size=nominalPValues.length,fdr=[],pValueIndices=morpheus.Util.indexSort(nominalPValues,!0),ranks=morpheus.Util.rankIndexArray(pValueIndices),i=pValueIndices.length-1;i>0;i--){var bigPValue=nominalPValues[pValueIndices[i]],smallPValue=nominalPValues[pValueIndices[i-1]];bigPValue==smallPValue&&(ranks[pValueIndices[i-1]]=ranks[pValueIndices[i]])}for(var i=0;size>i;i++){var rank=ranks[i],p=nominalPValues[i];fdr[i]=p*size/rank}for(var pIndices=morpheus.Util.indexSort(nominalPValues,!1),i=0;ii;i++)fdr[i]=Math.min(fdr[i],1);return fdr},morpheus.FDR_BH.tString=function(){return"FDR(BH)"},morpheus.Variance.toString=function(){return"Variance"},morpheus.MAD=function(list,median){null==median&&(median=morpheus.Percentile(list,50));for(var temp=[],j=0,size=list.size();size>j;j++){var value=list.getValue(j);isNaN(value)||temp.push(Math.abs(value-median))}var r=morpheus.Percentile(new morpheus.Vector("",temp.length).setArray(temp),50); -return 1.4826*r},morpheus.MAD.toString=function(){return"Median absolute deviation"},morpheus.CV=function(list){var mean=morpheus.Mean(list),stdev=Math.sqrt(morpheus.Variance(list,mean));return stdev/mean},morpheus.CV.toString=function(){return"Coefficient of variation"},morpheus.BoxPlotItem=function(list){var values=morpheus.RemoveNaN(list);if(values.sort(function(a,b){return a===b?0:b>a?-1:1}),0===values.length)return{median:NaN,q1:NaN,q3:NaN,lowerAdjacentValue:NaN,upperAdjacentValue:NaN};for(var median=morpheus.ArrayPercentile(values,50,!0),q1=morpheus.ArrayPercentile(values,25,!0),q3=morpheus.ArrayPercentile(values,75,!0),w=1.5,upperAdjacentValue=-Number.MAX_VALUE,lowerAdjacentValue=Number.MAX_VALUE,upperOutlier=q3+w*(q3-q1),lowerOutlier=q1-w*(q3-q1),i=0,length=values.length;length>i;i++){var value=values[i];upperOutlier>=value&&(upperAdjacentValue=Math.max(upperAdjacentValue,value)),value>=lowerOutlier&&(lowerAdjacentValue=Math.min(lowerAdjacentValue,value))}return lowerAdjacentValue>q1&&(lowerAdjacentValue=q1),q3>upperAdjacentValue&&(upperAdjacentValue=q3),{median:median,q1:q1,q3:q3,lowerAdjacentValue:lowerAdjacentValue,upperAdjacentValue:upperAdjacentValue}},morpheus.Vector=function(name,size){this.name=name,this.array=[],this.n=size,this.properties=new morpheus.Map},morpheus.Vector.fromArray=function(name,array){var v=new morpheus.Vector(name,array.length);return v.array=array,v},morpheus.Vector.prototype={push:function(value){this.array.push(value)},getProperties:function(){return this.properties},setValue:function(index,value){this.array[index]=value},getValue:function(index){return this.array[index]},size:function(){return this.n},getName:function(){return this.name},setName:function(name){this.name=name},setArray:function(array){return this.array=array,this}},morpheus.VectorColorModel=function(){this.vectorNameToColorMap=new morpheus.Map,this.vectorNameToColorScheme=new morpheus.Map,this.colors=morpheus.VectorColorModel.TWENTY_COLORS},morpheus.VectorColorModel.YES_COLOR="#d8b365",morpheus.VectorColorModel.FEMALE="#ff99ff",morpheus.VectorColorModel.MALE="#66ccff",morpheus.VectorColorModel.TWENTY_COLORS=["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b","#c49c94","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"],morpheus.VectorColorModel.CATEGORY_20A=morpheus.VectorColorModel.TWENTY_COLORS,morpheus.VectorColorModel.CATEGORY_20B=["#393b79","#5254a3","#6b6ecf","#9c9ede","#637939","#8ca252","#b5cf6b","#cedb9c","#8c6d31","#bd9e39","#e7ba52","#e7cb94","#843c39","#ad494a","#d6616b","#e7969c","#7b4173","#a55194","#ce6dbd","#de9ed6"],morpheus.VectorColorModel.CATEGORY_20C=["#3182bd","#6baed6","#9ecae1","#c6dbef","#e6550d","#fd8d3c","#fdae6b","#fdd0a2","#31a354","#74c476","#a1d99b","#c7e9c0","#756bb1","#9e9ac8","#bcbddc","#dadaeb","#636363","#969696","#bdbdbd","#d9d9d9"],morpheus.VectorColorModel.CATEGORY_ALL=[].concat(morpheus.VectorColorModel.CATEGORY_20A,morpheus.VectorColorModel.CATEGORY_20B,morpheus.VectorColorModel.CATEGORY_20C),morpheus.VectorColorModel.TABLEAU10=["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],morpheus.VectorColorModel.STANDARD_COLORS={na:"#c0c0c0",nan:"#c0c0c0","":"#ffffff",wt:"#ffffff",n:"#ffffff",0:"#ffffff",y:morpheus.VectorColorModel.YES_COLOR,1:morpheus.VectorColorModel.YES_COLOR,male:morpheus.VectorColorModel.MALE,m:morpheus.VectorColorModel.MALE,female:morpheus.VectorColorModel.FEMALE,f:morpheus.VectorColorModel.FEMALE,kd:"#C675A8",oe:"#56b4e9",cp:"#FF9933","trt_sh.cgs":"#C675A8",trt_oe:"#56b4e9",trt_cp:"#FF9933",a375:"#1490C1",a549:"#AAC8E9",hcc515:"#1C9C2A",hepg2:"#94DC89",ht29:"#946DBE",mcf7:"#C5B2D5",pc3:"#38C697",asc:"#FF8000",cd34:"#FFBB75",ha1e:"#FB4124",neu:"#FF9A94",npc:"#E57AC6",cancer:"#1490C1","immortalized normal":"#FF8000"},morpheus.VectorColorModel.getStandardColor=function(value){if(null==value)return"#ffffff";var stringValue=value.toString().toLowerCase();return morpheus.VectorColorModel.STANDARD_COLORS[stringValue]},morpheus.VectorColorModel.getColorMapForNumber=function(length){var colors;return colors=3>length?colorbrewer.Set1[3]:colorbrewer.Paired[length],colors?colors:morpheus.VectorColorModel.TWENTY_COLORS},morpheus.VectorColorModel.prototype={clear:function(vector){this.vectorNameToColorMap.remove(vector.getName()),this.vectorNameToColorScheme.remove(vector.getName())},copy:function(){var c=new morpheus.VectorColorModel;return c.colors=this.colors.slice(0),this.vectorNameToColorMap.forEach(function(colorMap,name){var newColorMap=new morpheus.Map;newColorMap.setAll(colorMap),c.vectorNameToColorMap.set(name,newColorMap)}),this.vectorNameToColorScheme.forEach(function(colorScheme,name){c.vectorNameToColorScheme.set(name,colorScheme.copy(new morpheus.Project(new morpheus.Dataset("",1,1))))}),c},clearAll:function(){this.vectorNameToColorMap=new morpheus.Map,this.vectorNameToColorScheme=new morpheus.Map},containsDiscreteColor:function(vector,value){var metadataValueToColorMap=this.vectorNameToColorMap.get(vector.getName());if(void 0===metadataValueToColorMap)return!1;var c=metadataValueToColorMap.get(value);return null!=c},setDiscreteColorMap:function(colors){this.colors=colors},getContinuousColorScheme:function(vector){return this.vectorNameToColorScheme.get(vector.getName())},getDiscreteColorScheme:function(vector){return this.vectorNameToColorMap.get(vector.getName())},createContinuousColorMap:function(vector){var minMax=morpheus.VectorUtil.getMinMax(vector),min=minMax.min,max=minMax.max,cs=new morpheus.HeatMapColorScheme(new morpheus.Project(new morpheus.Dataset("",1,1)),{type:"fixed",map:[{value:min,color:colorbrewer.Greens[3][0]},{value:max,color:colorbrewer.Greens[3][2]}]});return this.vectorNameToColorScheme.set(vector.getName(),cs),cs},getContinuousMappedValue:function(vector,value){var cs=this.vectorNameToColorScheme.get(vector.getName());return void 0===cs&&(cs=this.createContinuousColorMap(vector)),cs.getColor(0,0,value)},_getColorForValue:function(value){var color=morpheus.VectorColorModel.getStandardColor(value);if(null==color)for(var existingMetadataValueToColorMap=this.vectorNameToColorMap.values(),i=0,length=existingMetadataValueToColorMap.length;length>i;i++)if(color=existingMetadataValueToColorMap[i].get(value),void 0!==color)return color;return color},getMappedValue:function(vector,value){var metadataValueToColorMap=this.vectorNameToColorMap.get(vector.getName());if(void 0===metadataValueToColorMap){metadataValueToColorMap=new morpheus.Map,this.vectorNameToColorMap.set(vector.getName(),metadataValueToColorMap);var values=morpheus.VectorUtil.getValues(vector),ncolors=0,colors=null;if(colors=values.length<3?colorbrewer.Dark2[3]:colorbrewer.Paired[values.length],colors||(colors=values.length<=20?d3.scale.category20().range():morpheus.VectorColorModel.CATEGORY_ALL),colors)for(var ncolors=colors.length,i=0,nvalues=values.length;nvalues>i;i++){var color=this._getColorForValue(values[i]);null==color&&(color=colors[i%ncolors]),metadataValueToColorMap.set(values[i],color)}else{var _this=this;_.each(values,function(val){_this.getMappedValue(vector,val)})}}var color=metadataValueToColorMap.get(value);if(null==color){if(color=this._getColorForValue(value),null==color){var index=metadataValueToColorMap.size();color=this.colors[index%this.colors.length]}metadataValueToColorMap.set(value,color)}return color},setMappedValue:function(vector,value,color){var metadataValueToColorMap=this.vectorNameToColorMap.get(vector.getName());void 0===metadataValueToColorMap&&(metadataValueToColorMap=new morpheus.Map,this.vectorNameToColorMap.set(vector.getName(),metadataValueToColorMap)),metadataValueToColorMap.set(value,color)}},morpheus.VectorKeys={},morpheus.VectorKeys.FIELDS="morpheus.fields",morpheus.VectorKeys.VALUE_TO_INDICES="morpheus.valueToIndices",morpheus.VectorKeys.VISIBLE_FIELDS="morpheus.visibleFields",morpheus.VectorKeys.DATA_TYPE="morpheus.dataType",morpheus.VectorKeys.ARRAY_SUMMARY_FUNCTION="morpheus.arraySummaryFunction",morpheus.VectorKeys.HEADER_SUMMARY="morpheus.headerSummary",morpheus.VectorKeys.SHOW_HEADER_SUMMARY="morpheus.showHeaderSummary",morpheus.VectorKeys.TITLE="morpheus.title",morpheus.VectorKeys.FUNCTION="morpheus.function",morpheus.VectorKeys.RECOMPUTE_FUNCTION="morpheus.recompute.function",morpheus.VectorKeys.COPY_IGNORE=new morpheus.Set,morpheus.VectorKeys.COPY_IGNORE.add(morpheus.VectorKeys.HEADER_SUMMARY),morpheus.VectorKeys.COPY_IGNORE.add(morpheus.VectorKeys.DATA_TYPE),morpheus.VectorKeys.COPY_IGNORE.add(morpheus.VectorKeys.VALUE_TO_INDICES),morpheus.VectorShapeModel=function(){this.shapes=morpheus.VectorShapeModel.SHAPES,this.vectorNameToShapeMap=new morpheus.Map},morpheus.VectorShapeModel.SHAPES=["circle","square","plus","x","asterisk","diamond","triangle-up","triangle-down","triangle-left","triangle-right","minus"],morpheus.VectorShapeModel.STANDARD_SHAPES={cp:"diamond",oe:"plus",pcl:"asterisk",kd:"minus",ctrl:"circle"},morpheus.VectorShapeModel.prototype={clear:function(vector){this.vectorNameToShapeMap.remove(vector.getName())},copy:function(){var c=new morpheus.VectorShapeModel;return c.shapes=this.shapes.slice(0),this.vectorNameToShapeMap.forEach(function(shapeMap,name){var newShapeMap=new morpheus.Map;newShapeMap.setAll(shapeMap),c.vectorNameToShapeMap.set(name,newShapeMap)}),c},clearAll:function(){this.vectorNameToShapeMap=new morpheus.Map},_getShapeForValue:function(value){if(null==value)return"none";var str=value.toString().toLowerCase(),mapped=morpheus.VectorShapeModel.STANDARD_SHAPES[str];if(void 0!==mapped)return mapped;for(var existingMetadataValueToShapeMap=this.vectorNameToShapeMap.values(),i=0,length=existingMetadataValueToShapeMap.length;length>i;i++){var shape=existingMetadataValueToShapeMap[i].get(value);if(void 0!==shape)return shape}},getMap:function(name){return this.vectorNameToShapeMap.get(name)},getMappedValue:function(vector,value){var metadataValueToShapeMap=this.vectorNameToShapeMap.get(vector.getName());if(void 0===metadataValueToShapeMap){metadataValueToShapeMap=new morpheus.Map,this.vectorNameToShapeMap.set(vector.getName(),metadataValueToShapeMap);for(var values=morpheus.VectorUtil.getValues(vector),i=0,nvalues=values.length;nvalues>i;i++){var shape=this._getShapeForValue(values[i]);null==shape&&(shape=this.shapes[i%this.shapes.length]),metadataValueToShapeMap.set(values[i],shape)}}var shape=metadataValueToShapeMap.get(value);if(null==shape){if(shape=this._getShapeForValue(value),null==shape){var index=metadataValueToShapeMap.size();shape=this.shapes[index%this.shapes.length]}metadataValueToShapeMap.set(value,shape)}return shape},setMappedValue:function(vector,value,shape){var metadataValueToShapeMap=this.vectorNameToShapeMap.get(vector.getName());void 0===metadataValueToShapeMap&&(metadataValueToShapeMap=new morpheus.Map,this.vectorNameToShapeMap.set(vector.getName(),metadataValueToShapeMap)),metadataValueToShapeMap.set(value,shape)}},morpheus.VectorUtil=function(){},morpheus.VectorUtil.createValueToIndicesMap=function(vector){if(!vector)throw"vector is null";for(var map=new morpheus.Map,j=0,size=vector.size();size>j;j++){var val=vector.getValue(j),list=map.get(val);void 0===list&&(list=[],map.set(val,list)),list.push(j)}return map},morpheus.VectorUtil.createValueToCountMap=function(vector){if(!vector)throw"vector is null";for(var map=new morpheus.Map,dataType=morpheus.VectorUtil.getDataType(vector),isArray="["===dataType[0],j=0,size=vector.size();size>j;j++){var val=vector.getValue(j);if(null!=val)if(isArray)for(var k=0;ki;i++){var s=vector.getValue(i);if(null!=s){var tokens=s.split(regex);newValues.push(tokens),!found&&tokens.length>1&&(found=!0)}}if(found)for(var i=0,nrows=newValues.length;nrows>i;i++)vector.setValue(i,newValues[i]);return vector.getProperties().set(morpheus.VectorKeys.DATA_TYPE,"[string]"),found},morpheus.VectorUtil.maybeConvertStringToNumber=function(vector){for(var newValues=[],i=0,nrows=vector.size();nrows>i;i++){var s=vector.getValue(i);if(null!=s&&""!==s&&"NA"!==s&&"NaN"!==s&&!$.isNumeric(s))return!1;newValues.push(parseFloat(s))}for(var i=0,nrows=newValues.length;nrows>i;i++)vector.setValue(i,newValues[i]);return vector.getProperties().set(morpheus.VectorKeys.DATA_TYPE,"number"),!0},morpheus.VectorUtil.createValuesToIndicesMap=function(vectors){var map=new morpheus.Map,nvectors=vectors.length;if(null==vectors[0])throw"no vectors found";for(var i=0,nitems=vectors[0].size();nitems>i;i++){for(var array=[],j=0;nvectors>j;j++){var vector=vectors[j],val=vector.getValue(i);array.push(val)}var key=new morpheus.Identifier(array),list=map.get(key);void 0===list&&(list=[],map.set(key,list)),list.push(i)}return map},morpheus.VectorUtil.createValuesToIndexMap=function(vectors){var map=new morpheus.Map,nvectors=vectors.length;if(null==vectors[0])throw"no vectors found";for(var i=0,nitems=vectors[0].size();nitems>i;i++){for(var array=[],j=0;nvectors>j;j++){var vector=vectors[j],val=vector.getValue(i);array.push(val)}var key=new morpheus.Identifier(array);map.set(key,i)}return map},morpheus.VectorUtil.containsMoreThanOneValue=function(vector){return morpheus.VectorUtil.containsMoreThanNValues(vector,1)},morpheus.VectorUtil.containsMoreThanNValues=function(vector,n){for(var s=new morpheus.Set,j=0,size=vector.size();size>j;j++){var val=vector.getValue(j);if(s.add(val),s.size()>n)return!0}return!1},morpheus.VectorUtil.createValueToIndexMap=function(vector){for(var map=new morpheus.Map,j=0,size=vector.size();size>j;j++){var val=vector.getValue(j);map.set(val,j)}return map},morpheus.VectorUtil.getValues=function(vector,excludeNull){for(var set=new morpheus.Set,j=0,size=vector.size();size>j;j++){var val=vector.getValue(j);excludeNull&&null==val||set.add(val)}var array=set.values();return array.sort(morpheus.SortKey.ASCENDING_COMPARATOR),array},morpheus.VectorUtil.getSet=function(vector){for(var set=new morpheus.Set,j=0,size=vector.size();size>j;j++)set.add(vector.getValue(j));return set},morpheus.VectorUtil.createSpanMap=function(vector){for(var previous=vector.getValue(0),startIndexToEndIndex=new morpheus.Map,start=0,i=1,nrows=vector.size();nrows>i;i++){var val=vector.getValue(i);previous!==val&&(previous=val,startIndexToEndIndex.set(start,i),start=i)}return startIndexToEndIndex.set(start,vector.size()),startIndexToEndIndex},morpheus.VectorUtil.toArray=function(vector){for(var array=[],i=0,length=vector.size();length>i;i++){var val=vector.getValue(i);array.push(val)}return array},morpheus.VectorUtil.arrayAsVector=function(array,name){var v=new morpheus.Vector(name,array.length);return v.array=array,v},morpheus.VectorUtil.toString=function(vector){for(var array=[],i=0,length=vector.size();length>i;i++){var val=vector.getValue(i);array.push(val)}return array.join(", ")},morpheus.VectorUtil.getDataType=function(vector){var dataType=vector.getProperties().get(morpheus.VectorKeys.DATA_TYPE);if(void 0===dataType){var firstNonNull=morpheus.VectorUtil.getFirstNonNull(vector);dataType=morpheus.Util.getDataType(firstNonNull),vector.getProperties().set(morpheus.VectorKeys.DATA_TYPE,dataType)}return dataType},morpheus.VectorUtil.getMinMax=function(vector){var min=Number.MAX_VALUE,max=-Number.MAX_VALUE,fields=vector.getProperties().get(morpheus.VectorKeys.FIELDS);if(null!=fields)for(var nvalues=fields.length,i=0,size=vector.size();size>i;i++){var array=vector.getValue(i);if(array)for(var j=0;nvalues>j;j++){var value=array[j];isNaN(value)||(min=min>value?value:min,max=value>max?value:max)}}else for(var i=0,size=vector.size();size>i;i++){var value=vector.getValue(i);isNaN(value)||(min=min>value?value:min,max=value>max?value:max)}return{min:min,max:max}},morpheus.VectorUtil.getFirstNonNull=function(vector){for(var i=0,length=vector.size();length>i;i++){var val=vector.getValue(i);if(null!=val)return val}return null},morpheus.VectorUtil.isNumber=function(vector){return"number"===morpheus.VectorUtil.getDataType(vector)},morpheus.LandingPage=function(pageOptions){pageOptions=$.extend({},{el:$("#vis")},pageOptions),this.pageOptions=pageOptions;var $el=$('');this.$el=$el;var html=[];html.push('
'),html.push('
logo Morpheus
'),html.push("

Open your own file

"),html.push('
'),html.push("

Or select a preloaded dataset

"),html.push('
'),html.push(""),$(html.join("")).appendTo($el),(new morpheus.HelpMenu).$el.appendTo($el.find("[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("[name=formRow]")),this.formBuilder=formBuilder,this.$sampleDatasetsEl=$el.find("[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 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(options){this.dispose(),null==this.heatmap?(options.landingPage=this,options.el=this.pageOptions.el,this.heatmap=new morpheus.HeatMap(options)):(options.inheritFromParent=!1,options.parent=this.heatmap,new morpheus.HeatMap(options))},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(""),exampleHtml.push(''),exampleHtml.push(''),exampleHtml.push(''),exampleHtml.push(''),exampleHtml.push('"),exampleHtml.push("
Cancer Cell Line Encyclopedia (CCLE), Project Achilles Gene Expression Copy Number By Gene Mutations Gene essentiality
"),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("//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('');for(var i=0;i"),tcga.push(""),tcga.push(""),tcga.push(""),tcga.push(""),tcga.push(""),tcga.push(""),tcga.push(""),tcga.push(""),tcga.push(""),tcga.push("")}tcga.push("
"+disease.name+""),disease.mrna&&tcga.push(' Gene Expression'),tcga.push(""),disease.gistic&&tcga.push(' GISTIC Copy Number'),tcga.push(""),disease.gistic&&tcga.push(' Copy Number By Gene'),tcga.push(""),disease.sig_genes&&tcga.push(' Mutations'),tcga.push(""),disease.rppa&&tcga.push(' Proteomics'),tcga.push(""),disease.methylation&&tcga.push(' Methylation'),tcga.push(""),tcga.push('
"),$(tcga.join("")).appendTo($el.find("[name=tcga]"))})},morpheus.SampleDatasets.getTcgaDataset=function(options){var baseUrl="//s3.amazonaws.com/data.clue.io/morpheus/tcga/"+options.type+"/",datasetOptions={};return options.mrna&&(datasetOptions.mrna=baseUrl+"mRNAseq_RSEM_normalized_log2.txt"),options.methylation&&(datasetOptions.methylation=baseUrl+"meth.by_mean.data.txt"),options.sig_genes&&(datasetOptions.mutation=baseUrl+"mutations_merged.maf.txt",datasetOptions.sigGenes=baseUrl+"sig_genes.txt"),options.rppa&&(datasetOptions.rppa=baseUrl+"rppa.txt"),options.gistic&&(datasetOptions.gistic=baseUrl+"all_lesions.conf_99.txt"),options.gisticGene&&(datasetOptions.gisticGene=baseUrl+"all_data_by_genes.txt"),datasetOptions.mrnaClust=baseUrl+"bestclus.txt",datasetOptions.columnAnnotations=[{file:baseUrl+"All_CDEs.txt",datasetField:"participant_id",fileField:"patient_id"}],morpheus.TcgaUtil.getDataset(datasetOptions)},morpheus.SampleDatasets.getCCLEDataset=function(options){var datasets=[];options.sig_genes&&datasets.push({dataset:"//s3.amazonaws.com/data.clue.io/morpheus/CCLE_hybrid_capture1650_hg19_NoCommonSNPs_NoNeutralVariants_CDS_2012.05.07.maf.txt"}),options.cn&&datasets.push({dataset:"//s3.amazonaws.com/data.clue.io/morpheus/CCLE_copynumber_byGene_2013-12-03.gct"}),options.mrna&&datasets.push({dataset:"//s3.amazonaws.com/data.clue.io/morpheus/CCLE_Expression_Entrez_2012-09-29.txt"}),options.ach&&datasets.push({dataset:"//s3.amazonaws.com/data.clue.io/morpheus/Achilles_QC_v2.4.3.rnai.Gs.gct"});var columnAnnotations=[{file:"//s3.amazonaws.com/data.clue.io/morpheus/CCLE_Sample_Info.txt",datasetField:"id",fileField:"id"}];options.ach&&columnAnnotations.push({file:"//s3.amazonaws.com/data.clue.io/morpheus/Achilles_v2.4_SampleInfo_small.txt",datasetField:"id",fileField:"id"});var datasetToReturn,returnDeferred=$.Deferred(),datasetDef=morpheus.DatasetUtil.readDatasetArray({dataset:datasets}),annotationDef=morpheus.DatasetUtil.annotate({annotations:columnAnnotations,isColumns:!0});datasetDef.done(function(d){datasetToReturn=d}),datasetDef.fail(function(message){returnDeferred.reject(message)});var annotationCallbacks;return annotationDef.done(function(callbacks){annotationCallbacks=callbacks}),annotationDef.fail(function(message){returnDeferred.reject(message)}),$.when.apply($,[datasetDef,annotationDef]).then(function(){annotationCallbacks.forEach(function(f){f(datasetToReturn)}),returnDeferred.resolve(datasetToReturn)}),returnDeferred},morpheus.SampleDatasets.prototype={openTcga:function(options){this.callback({name:options.name,renderReady:function(heatMap){for(var whitelist=["age_at_initial_pathologic_diagnosis","breast_carcinoma_estrogen_receptor_status","breast_carcinoma_progesterone_receptor_status","lab_proc_her2_neu_immunohistochemistry_receptor_status","days_to_death","ethnicity","gender","histological_type","pathologic_stage"],columnMetadata=heatMap.getProject().getFullDataset().getColumnMetadata(),i=0;ii;i++)for(var j=0,ncols=dataset.getColumnCount();ncols>j;j++)dataset.setValue(i,j,morpheus.Log2(dataset.getValue(i,j)));if(options.input.inverse_log_2)for(var i=0,nrows=dataset.getRowCount();nrows>i;i++)for(var j=0,ncols=dataset.getColumnCount();ncols>j;j++){var value=dataset.getValue(i,j);value>=0&&dataset.setValue(i,j,Math.pow(2,value))}if(options.input["z-score"])for(var i=0,nrows=dataset.getRowCount();nrows>i;i++){rowView.setIndex(i);for(var mean=morpheus.Mean(rowView),stdev=Math.sqrt(morpheus.Variance(rowView)),j=0,ncols=dataset.getColumnCount();ncols>j;j++)dataset.setValue(i,j,(dataset.getValue(i,j)-mean)/stdev)}if(options.input["robust_z-score"])for(var i=0,nrows=dataset.getRowCount();nrows>i;i++){rowView.setIndex(i);for(var median=morpheus.Median(rowView),mad=morpheus.MAD(rowView,median),j=0,ncols=dataset.getColumnCount();ncols>j;j++)dataset.setValue(i,j,(dataset.getValue(i,j)-median)/mad)}project.trigger("datasetChanged"),project.getColumnSelectionModel().setViewIndices(selectedColumnIndices,!0),project.getRowSelectionModel().setViewIndices(selectedRowIndices,!0)}}},morpheus.AnnotateDendrogramTool=function(isColumns){this._isColumns=isColumns},morpheus.AnnotateDendrogramTool.prototype={toString:function(){return"Annotate Dendrogram"},gui:function(){return[{name:"file",value:"",type:"file",required:!0,help:"an xlsx file or a tab-delimitted text file"}]},execute:function(options){var fileOrUrl=options.input.file,isColumns=this._isColumns,controller=options.controller,result=morpheus.Util.readLines(fileOrUrl),dendrogram=(morpheus.Util.getFileName(fileOrUrl),isColumns?controller.columnDendrogram:controller.rowDendrogram),nameToNode=new morpheus.Map;morpheus.AbstractDendrogram.dfs(dendrogram.tree.rootNode,function(node){return nameToNode.set(node.name,node),!0});var tab=new RegExp(" ");result.done(function(lines){var header=lines[0].split(tab),promptTool={};promptTool.execute=function(options){for(var nodeIdField=options.input.node_id_field,nodeIdIndex=_.indexOf(header,nodeIdField),numberOfMatchingNodes=0,i=1;i
');var formBuilder=new morpheus.FormBuilder({vertical:!0});this.formBuilder=formBuilder,formBuilder.append({name:"chart_type",type:"select",options:["boxplot","row scatter","column scatter","row profile","column profile"]});var rowOptions=[],columnOptions=[],numericRowOptions=[],numericColumnOptions=[],options=[],numericOptions=[],updateOptions=function(){var dataset=project.getFullDataset();rowOptions=[{name:"(None)",value:""}],columnOptions=[{name:"(None)",value:""}],numericRowOptions=[{name:"(None)",value:""}],numericColumnOptions=[{name:"(None)",value:""}],options=[{name:"(None)",value:""}],numericOptions=[{name:"(None)",value:""}],morpheus.MetadataUtil.getMetadataNames(dataset.getRowMetadata()).forEach(function(name){var dataType=morpheus.VectorUtil.getDataType(dataset.getRowMetadata().getByName(name));"number"!==dataType&&"[number]"!==dataType||numericRowOptions.push({name:name+" (row)",value:name+"_r"}),rowOptions.push({name:name+" (row)",value:name+"_r"})}),morpheus.MetadataUtil.getMetadataNames(dataset.getColumnMetadata()).forEach(function(name){var dataType=morpheus.VectorUtil.getDataType(dataset.getColumnMetadata().getByName(name));"number"!==dataType&&"[number]"!==dataType||numericColumnOptions.push({name:name+" (column)",value:name+"_c"}),columnOptions.push({name:name+" (column)",value:name+"_c"})}),options=options.concat(rowOptions.slice(1)),options=options.concat(columnOptions.slice(1)),numericOptions=numericOptions.concat(numericRowOptions.slice(1)),numericOptions=numericOptions.concat(numericColumnOptions.slice(1))};updateOptions(),formBuilder.append({name:"group_columns_by",type:"select",options:options}),formBuilder.append({name:"group_rows_by",type:"select",options:options}),formBuilder.append({name:"axis_label",type:"select",options:rowOptions}),formBuilder.append({name:"show_points",type:"checkbox",value:!0}),formBuilder.append({name:"color",type:"select",options:options}),formBuilder.append({name:"size",type:"select",options:numericOptions}),formBuilder.$form.find("select").on("change",function(){setVisibility(),_this.draw()}),formBuilder.$form.find("input").on("click",function(){_this.draw()}),setVisibility();var draw=function(){_.debounce(_this.draw(),100)},trackChanged=function(){updateOptions(),setVisibility(),formBuilder.setOptions("group_columns_by",options,!0),formBuilder.setOptions("group_rows_by",options,!0)};project.getColumnSelectionModel().on("selectionChanged.chart",draw),project.getRowSelectionModel().on("selectionChanged.chart",draw),project.on("trackChanged.chart",trackChanged),this.$chart=this.$el.find("[name=chartDiv]");var $dialog=$('
'),$configPane=this.$el.find("[name=configPane]");formBuilder.$form.appendTo($configPane),this.$el.appendTo($dialog),$dialog.dialog({close:function(event,ui){project.off("trackChanged.chart",trackChanged),project.getRowSelectionModel().off("selectionChanged.chart",draw),project.getColumnSelectionModel().off("selectionChanged.chart",draw),_this.$el.empty()},resizable:!0,height:600,width:900}),this.$dialog=$dialog,this.draw()},morpheus.ChartTool2.getPlotlyDefaults=function(){var layout={autosize:!1,paper_bgcolor:"rgb(255,255,255)",plot_bgcolor:"rgb(229,229,229)",showlegend:!1,margin:{l:80,r:0,t:10,b:14,autoexpand:!0},xaxis:{zeroline:!1,titlefont:{size:12},gridcolor:"rgb(255,255,255)",showgrid:!0,showline:!1,showticklabels:!0,tickcolor:"rgb(127,127,127)",ticks:"outside",type:"linear"},yaxis:{zeroline:!1,titlefont:{size:12},gridcolor:"rgb(255,255,255)",showgrid:!0,showline:!1,showticklabels:!0,tickcolor:"rgb(127,127,127)",ticks:"outside",type:"linear"}},config={showLink:!1,displaylogo:!1,staticPlot:!1,showHints:!0,modeBarButtonsToRemove:["sendDataToCloud"]};return{layout:layout,config:config}},morpheus.ChartTool2.getVectorInfo=function(value){var field=value.substring(0,value.length-2),isColumns="_c"===value.substring(value.length-2);return{field:field,isColumns:isColumns}},morpheus.ChartTool2.prototype={annotate:function(options){var _this=this,formBuilder=new morpheus.FormBuilder;formBuilder.append({name:"annotation_name",type:"text",required:!0}),formBuilder.append({name:"annotation_value",type:"text",required:!0}),morpheus.FormBuilder.showOkCancel({title:"Annotate Selection",content:formBuilder.$form,okCallback:function(){var dataset=options.dataset,eventData=options.eventData,array=options.array,value=formBuilder.getValue("annotation_value"),annotationName=formBuilder.getValue("annotation_name"),isRows=!0,isColumns=!0,existingRowVector=null,rowVector=null;isRows&&(existingRowVector=dataset.getRowMetadata().getByName(annotationName),rowVector=dataset.getRowMetadata().add(annotationName));var existingColumnVector=null,columnVector=null;isColumns&&(existingColumnVector=dataset.getColumnMetadata().getByName(annotationName),columnVector=dataset.getColumnMetadata().add(annotationName));for(var p=0,nselected=eventData.points.length;nselected>p;p++){var item=array[eventData.points[p].pointNumber];isRows&&(_.isArray(item.row)?item.row.forEach(function(r){rowVector.setValue(r,value)}):rowVector.setValue(item.row,value)),isColumns&&columnVector.setValue(item.column,value)}isRows&&(morpheus.VectorUtil.maybeConvertStringToNumber(rowVector),_this.project.trigger("trackChanged",{vectors:[rowVector],render:null!=existingRowVector?[]:[morpheus.VectorTrack.RENDER.TEXT],columns:!1})),isColumns&&(morpheus.VectorUtil.maybeConvertStringToNumber(columnVector),_this.project.trigger("trackChanged",{vectors:[columnVector],render:null!=existingColumnVector?[]:[morpheus.VectorTrack.RENDER.TEXT],columns:!0}))}})},_createScatter:function(options){for(var dataset=options.dataset,colorByVector=options.colorByVector,colorModel=options.colorModel,sizeByVector=options.sizeByVector,sizeFunction=options.sizeFunction,myPlot=(this.heatmap,options.myPlot),isColumnChart=options.isColumnChart,x=[],y=[],text=[],color=colorByVector?[]:"#1f78b4",size=sizeByVector?[]:6,array=[],j=0,ncols=dataset.getColumnCount();ncols>j;j++){if(y.push(dataset.getValue(options.rowIndexOne,j)),x.push(dataset.getValue(options.rowIndexTwo,j)),array.push({row:[options.rowIndexOne,options.rowIndexTwo],column:j}),colorByVector){var colorByValue=colorByVector.getValue(j);color.push(colorModel.getMappedValue(colorByVector,colorByValue))}if(sizeByVector){var sizeByValue=sizeByVector.getValue(j);size.push(sizeFunction(sizeByValue))}var obj={j:j};obj.toString=function(){for(var trackNames=_this.getVisibleTrackNames(!isColumnChart),s=[],i=0;i")}return s.join("")},text.push(obj)}var trace={x:x,y:y,marker:{color:color,size:size,symbol:"circle-open"},text:text,mode:"markers",type:"scatter"},selection=null,_this=this,config=$.extend(!0,{},options.config,{modeBarButtonsToAdd:[[{name:"annotate",title:"Annotate Selection",attr:"dragmode",val:"annotate",icon:{width:1792,path:"M491 1536l91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192l416 416-832 832h-416v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z",ascent:1792,descent:0},click:function(){selection?_this.annotate({array:array,eventData:selection,dataset:dataset}):morpheus.FormBuilder.showInModal({title:"Annotate Selection",html:"Please select points in the chart",close:"Close"})}}]]});Plotly.newPlot(myPlot,[trace],options.layout,config),myPlot.on("plotly_selected",function(eventData){selection=eventData})},_createProfile:function(options){function resize(){var width=$parent.width(),height=_this.$dialog.height()-30;Plotly.relayout(myPlot,{width:width,height:height})}var dataset=options.dataset,colorByVector=options.colorByVector,colorModel=options.colorModel,sizeByVector=options.sizeByVector,sizeFunction=options.sizeFunction,axisLabelVector=options.axisLabelVector,isColumnChart=options.isColumnChart,myPlot=(this.heatmap,options.myPlot),traces=[],ticktext=[],tickvals=[];console.log(dataset.getRowCount(),dataset.getColumnCount());for(var j=0,ncols=dataset.getColumnCount();ncols>j;j++)ticktext.push(null!=axisLabelVector?axisLabelVector.getValue(j):""+j),tickvals.push(j);for(var i=0,nrows=dataset.getRowCount();nrows>i;i++){for(var x=[],y=[],text=[],size=sizeByVector?[]:6,j=(colorByVector?colorModel.getMappedValue(colorByVector,colorByVector.getValue(i)):void 0,0),ncols=dataset.getColumnCount();ncols>j;j++){if(x.push(j),y.push(dataset.getValue(i,j)),sizeByVector){var sizeByValue=sizeByVector.getValue(j);size.push(sizeFunction(sizeByValue))}var obj={i:i,j:j};obj.toString=function(){for(var trackNames=_this.getVisibleTrackNames(!isColumnChart),s=[],i=0;i")}return s.join("")},text.push(obj)}var trace={x:x,y:y,name:colorByVector?colorByVector.getValue(i):"",tickmode:"array",marker:{size:size,symbol:"circle"},text:text,mode:"markers+lines",type:"scatter"};traces.push(trace)}var selection=null,_this=this;options.layout.xaxis.tickvals=tickvals,options.layout.xaxis.ticktext=ticktext,options.layout.xaxis.tickmode="array";var config=$.extend(!0,{},options.config,{modeBarButtonsToAdd:[[{name:"annotate",title:"Annotate Selection",attr:"dragmode",val:"annotate",icon:{width:1792,path:"M491 1536l91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192l416 416-832 832h-416v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z",ascent:1792,descent:0},click:function(){selection?_this.annotate({eventData:selection,dataset:dataset}):morpheus.FormBuilder.showInModal({title:"Annotate Selection",html:"Please select points in the chart",close:"Close"})}}]]}),$parent=$(myPlot).parent();options.layout.width=$parent.width(),options.layout.height=this.$dialog.height()-30,Plotly.newPlot(myPlot,traces,options.layout,config),myPlot.on("plotly_selected",function(eventData){selection=eventData}),this.$dialog.on("dialogresize",resize),$(myPlot).on("remove",function(){_this.$dialog.off("dialogresize")})},_createBoxPlot:function(options){for(var array=options.array,points=options.points,colorByVector=options.colorByVector,colorByGetter=options.colorByGetter,colorModel=options.colorModel,myPlot=options.myPlot,dataset=options.dataset,y=[],color=points&&colorByVector?[]:"#1f78b4",text=[],x=[],sizeFunction=(this.heatmap,options.sizeFunction),sizeByGetter=options.sizeByGetter,size=sizeFunction?[]:6,scale=d3.scale.linear().domain([0,1]).range([-.3,-1]),k=0,nitems=array.length;nitems>k;k++){var item=array[k];if(y.push(dataset.getValue(item.row,item.column)),points){if(x.push(scale(Math.random())),colorByVector){var colorByValue=colorByGetter(item);color.push(colorModel.getMappedValue(colorByVector,colorByValue))}if(sizeFunction){var sizeByValue=sizeByGetter(item);size.push(sizeFunction(sizeByValue))}var obj={row:item.row,column:item.column};obj.toString=function(){for(var s=[],trackNames=_this.getVisibleTrackNames(!0),trackIndex=0;trackIndex")}trackNames=_this.getVisibleTrackNames(!1);for(var trackIndex=0;trackIndex")}return s.join("")},text.push(obj)}}var traces=[{name:"",y:y,type:"box",boxpoints:!1}];points&&traces.push({name:"",x:x,y:y,hoverinfo:"y+text",mode:"markers",type:"scatter",text:text,marker:{symbol:"circle-open",size:size,color:color}});var selection=null,_this=this,config=$.extend(!0,{},options.config,{modeBarButtonsToAdd:[[{name:"annotate",title:"Annotate Selection",attr:"dragmode",val:"annotate",icon:{width:1792,path:"M491 1536l91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192l416 416-832 832h-416v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z",ascent:1792,descent:0},click:function(){selection?_this.annotate({array:array,eventData:selection,dataset:dataset}):morpheus.FormBuilder.showInModal({title:"Annotate Selection",html:"Please select points in the chart",close:"Close"})}}]]});Plotly.newPlot(myPlot,traces,options.layout,config),myPlot.on("plotly_selected",function(eventData){selection=eventData})},draw:function(){this.$chart.empty();var plotlyDefaults=morpheus.ChartTool2.getPlotlyDefaults(),layout=plotlyDefaults.layout,config=plotlyDefaults.config,chartWidth=400,chartHeight=400,points=this.formBuilder.getValue("show_points"),groupColumnsBy=this.formBuilder.getValue("group_columns_by"),axisLabel=this.formBuilder.getValue("axis_label"),colorBy=this.formBuilder.getValue("color"),sizeBy=this.formBuilder.getValue("size"),groupRowsBy=this.formBuilder.getValue("group_rows_by"),chartType=this.formBuilder.getValue("chart_type"),dataset=this.project.getSelectedDataset({emptyToAll:!1});if(this.dataset=dataset,dataset.getRowCount()*dataset.getColumnCount()===0)return void $("

Please select rows and columns in the heat map.

").appendTo(this.$chart);dataset.getRowCount()*dataset.getColumnCount()>1e5&&(points=!1);var grid=[],rowIds=[void 0],columnIds=[void 0],items=[],colorByInfo=(this.heatmap,morpheus.ChartTool2.getVectorInfo(colorBy)),sizeByInfo=morpheus.ChartTool2.getVectorInfo(sizeBy),colorModel=colorByInfo.isColumns?this.project.getColumnColorModel():this.project.getRowColorModel(),axisLabelInfo=morpheus.ChartTool2.getVectorInfo(axisLabel),axisLabelVector=axisLabelInfo.isColumns?dataset.getColumnMetadata().getByName(axisLabelInfo.field):dataset.getRowMetadata().getByName(axisLabelInfo.field),sizeByVector=sizeByInfo.isColumns?dataset.getColumnMetadata().getByName(sizeByInfo.field):dataset.getRowMetadata().getByName(sizeByInfo.field),colorByVector=colorByInfo.isColumns?dataset.getColumnMetadata().getByName(colorByInfo.field):dataset.getRowMetadata().getByName(colorByInfo.field),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("row profile"===chartType||"column profile"===chartType){var $chart=$("
"),myPlot=$chart[0];$chart.appendTo(this.$chart),"column profile"===chartType&&(dataset=new morpheus.TransposedDatasetView(dataset)),this._createProfile({isColumnChart:"column profile"===chartType,axisLabelVector:axisLabelVector,colorByVector:colorByVector,colorModel:colorModel,sizeByVector:sizeByVector,sizeFunction:sizeByScale,myPlot:myPlot,dataset:dataset,config:config,layout:$.extend(!0,{},layout,{showlegend:!0,width:chartWidth,height:chartHeight,margin:{b:80},yaxis:{},xaxis:{}})})}if("row scatter"===chartType||"column scatter"===chartType){var transpose="column scatter"===chartType;if(transpose&&(dataset=new morpheus.TransposedDatasetView(dataset)),dataset.getRowCount()>20)return void $("

Maximum chart size exceeded.

").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:points,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:points,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){$("

Use your own file

").insertAfter(form.$form.find(".form-group:first"));var _this=this,id=_.uniqueId("morpheus");form.$form.append('

');var $sampleDatasets=$('
');form.$form.append($sampleDatasets);new morpheus.SampleDatasets({$el:$sampleDatasets,callback:function(heatMapOptions){form.setValue("file",heatMapOptions.dataset),_this.ok()}})}form.on("change",function(e){var value=e.value;""!==value&&null!=value&&(form.setValue("file",value),_this.ok())})},execute:function(options){var that=this;this.options.file&&(options.input.file=this.options.file);var project=options.project;if("append columns"===options.input.open_file_action||"append"===options.input.open_file_action||"open"===options.input.open_file_action||"overlay"===options.input.open_file_action)(new morpheus.OpenDatasetTool).execute(options);else if("Open dendrogram"===options.input.open_file_action)morpheus.HeatMap.showTool(new morpheus.OpenDendrogramTool(options.input.file),options.controller);else{var controller=options.controller,isAnnotateColumns="Annotate Columns"==options.input.open_file_action,fileOrUrl=options.input.file,dataset=project.getFullDataset(),fileName=morpheus.Util.getFileName(fileOrUrl);if(morpheus.Util.endsWith(fileName,".cls")){var result=morpheus.Util.readLines(fileOrUrl);result.done(function(lines){that.annotateCls(controller,dataset,fileName,isAnnotateColumns,lines)})}else if(morpheus.Util.endsWith(fileName,".gmt"))morpheus.BufferedReader.getArrayBuffer(fileOrUrl,function(err,buf){if(err)throw new Error("Unable to read "+fileOrUrl);var sets=(new morpheus.GmtReader).read(new morpheus.BufferedReader(new Uint8Array(buf)));that.prompt(null,dataset,controller,isAnnotateColumns,sets)});else{var result=morpheus.Util.readLines(fileOrUrl);result.done(function(lines){that.prompt(lines,dataset,controller,isAnnotateColumns,null)})}}},annotateCls:function(controller,dataset,fileName,isColumns,lines){isColumns&&(dataset=morpheus.DatasetUtil.transposedView(dataset));var assignments=(new morpheus.ClsReader).read(lines);if(assignments.length!==dataset.getRowCount())throw new Error("Number of samples in cls file does not match dataset.");for(var vector=dataset.getRowMetadata().add(morpheus.Util.getBaseFileName(fileName)),i=0;ii;i++){var line=lines[i].split(tab),id=line[fileMatchOnColumnIndex],indices=idToIndices.get(id);if(void 0!==indices)for(var nIndices=indices.length,j=0;nheaders>j;j++)for(var token=line[columnIndices[j]],v=vectors[j],r=0;nIndices>r;r++)v.setValue(indices[r],token)}}else _.each(sets,function(set){var name=set.name,members=set.ids,v=dataset.getRowMetadata().add(name);vectors.push(v),_.each(members,function(id){var indices=idToIndices.get(id);if(void 0!==indices)for(var i=0,nIndices=indices.length;nIndices>i;i++)v.setValue(indices[i],name)})});for(var i=0;iGCT 1.3 or GCT 1.2 file name',required:!0},{name:"file_format",type:"radio",options:[{name:"GCT version 1.2",value:"1.2"},{name:"GCT version 1.3",value:"1.3"}],value:"1.3",required:!0}]},execute:function(options){var project=options.project,format=options.input.file_format,fileName=options.input.file_name,dataset=(options.controller,project.getSortedFilteredDataset()),text="1.2"===format?(new morpheus.GctWriter12).write(dataset):(new morpheus.GctWriter).write(dataset),blob=new Blob([text],{type:"text/plain;charset=charset=utf-8"});morpheus.Util.endsWith(fileName.toLowerCase(),".gct")||(fileName+=".gct"),saveAs(blob,fileName,!0)}},morpheus.SaveImageTool=function(){},morpheus.SaveImageTool.prototype={toString:function(){return"Save Image"},gui:function(){return[{name:"file_name",type:"text",required:!0},{name:"format",type:"select",options:["png","svg"],value:"svg",required:!0}]},execute:function(options){var fileName=options.input.file_name,format=options.input.format;morpheus.Util.endsWith(fileName.toLowerCase(),"."+format)||(fileName+="."+format);var controller=options.controller;controller.saveImage(fileName,format)}},morpheus.SimilarityMatrixTool=function(){},morpheus.SimilarityMatrixTool.Functions=[morpheus.Euclidean,morpheus.Jaccard,morpheus.Cosine,morpheus.Pearson,morpheus.Spearman],morpheus.SimilarityMatrixTool.Functions.fromString=function(s){for(var i=0;ii;i++)for(var j=0;i>j;j++){var value=matrix[i][j];d.setValue(i,j,value),d.setValue(j,i,value)}if(!isDistance)for(var i=0;n>i;i++)d.setValue(i,i,1);var metadata=isColumnMatrix?dataset.getColumnMetadata():dataset.getRowMetadata();d.rowMetadataModel=morpheus.MetadataUtil.shallowCopy(metadata),d.columnMetadataModel=morpheus.MetadataUtil.shallowCopy(metadata);var colorScheme;colorScheme=isDistance?{type:"fixed",map:[{value:0,color:"white"},{value:morpheus.DatasetUtil.max(d),color:"red"}]}:{type:"fixed",map:[{value:-1,color:"blue"},{value:0,color:"white"},{value:1,color:"red"}]},new morpheus.HeatMap({colorScheme:colorScheme,name:name,dataset:d,parent:controller,inheritFromParentOptions:{rows:!isColumnMatrix,columns:isColumnMatrix}}),worker.terminate(),window.URL.revokeObjectURL(url)},worker}},morpheus.TransposeTool=function(){},morpheus.TransposeTool.prototype={toString:function(){return"Transpose"},execute:function(options){var project=options.project,controller=options.controller,dataset=new morpheus.TransposedDatasetView(project.getSortedFilteredDataset()),rowMetadataModel=morpheus.MetadataUtil.shallowCopy(dataset.getRowMetadata()),columnMetadataModel=morpheus.MetadataUtil.shallowCopy(dataset.getColumnMetadata());dataset.getRowMetadata=function(){return rowMetadataModel},dataset.getColumnMetadata=function(){return columnMetadataModel};var name=options.input.name||controller.getName();new morpheus.HeatMap({name:name,dataset:dataset,inheritFromParentOptions:{transpose:!0},parent:controller})}},morpheus.WordCloudTool=function(){},morpheus.WordCloudTool.draw=function(options){function draw(words){g.selectAll("text").data(words).enter().append("text").style("font-family","Impact").on("mouseover",function(d){d3.select(this).transition().style("font-size",2*fontSizeScale(d.size)+"px")}).on("mouseout",function(d){d3.select(this).transition().style("font-size",fontSizeScale(d.size)+"px")}).on("click",function(d){options.heatMap.getToolbar().setSearchText({isColumns:options.isColumns,text:d.text.indexOf(" ")?'"'+d.text+'"':d.text})}).style("fill",function(d,i){return fill(i)}).attr("text-anchor","middle").attr("transform",function(d){return"translate("+[d.x,d.y]+")rotate("+d.rotate+")"}).text(function(d){return d.text}).style("font-size",function(d){return"1px"}).transition().duration(1e3).style("font-size",function(d){return fontSizeScale(d.size)+"px"})}var width=options.width,height=options.height,words=options.words,maxSize=options.maxSize,minSize=options.minSize,fill=options.fill||d3.scale.category20b(),fontSizeScale=d3.scale.linear().range([12,24]).domain([minSize,maxSize]).clamp(!0),g=d3.select(options.el).append("svg").attr("width",width).attr("height",height).append("g");g.attr("transform","translate("+[width/2,height/2]+")"),g.style("font-weight","900");var angle=d3.scale.linear().domain([0,0]).range([0,0]).clamp(!0);d3.layout.cloud().spiral("archimedean").size([width,height]).words(words).rotate(function(){return angle(~~(5*Math.random()))}).fontSize(function(d){return d.size}).on("end",draw).start()},morpheus.WordCloudTool.drawTable=function(options){var width=options.width,maxSize=options.maxSize,minSize=options.minSize,words=options.words;words.sort(function(a,b){return a.size===b.size?0:a.sizei;i++)minSize=Math.min(minSize,words[i].size),maxSize=Math.max(maxSize,words[i].size);var fill=function(value){return colorModel.getMappedValue(vector,words[value].text)},$dialog=$('
'),width=960,height=600;$dialog.dialog({resizable:!0,height:height+30,width:width+30}),morpheus.WordCloudTool.draw({minSize:minSize,maxSize:maxSize,isColumns:isColumns,heatMap:controller,el:$dialog[0],width:width,height:height,words:words,fill:fill}),morpheus.WordCloudTool.drawTable({minSize:minSize,maxSize:maxSize,isColumns:isColumns,heatMap:controller,el:$dialog[0],width:width,words:words})}},morpheus.AbstractCanvas=function(offscreen){this.canvas=morpheus.CanvasUtil.createCanvas(),this.lastClip=null,offscreen&&(this.offscreenCanvas=morpheus.CanvasUtil.createCanvas()),this.offset={x:0,y:0}},morpheus.AbstractCanvas.prototype={visible:!0,invalid:!0,scrollX:0,scrollY:0,prefWidth:void 0,prefHeight:void 0,getCanvas:function(){return this.canvas},scrollTop:function(pos){return void 0===pos?this.offset.y:void(this.offset.y=pos)},appendTo:function($el){$(this.canvas).appendTo($el)},scrollLeft:function(pos){return void 0===pos?this.offset.x:void(this.offset.x=pos)},dispose:function(){$(this.canvas).remove(),this.offscreenCanvas=void 0},getPrefWidth:function(){return this.prefWidth},setInvalid:function(invalid){this.invalid=invalid},setBounds:function(bounds){var backingScale=morpheus.CanvasUtil.BACKING_SCALE,canvases=[this.canvas];this.offscreenCanvas&&canvases.push(this.offscreenCanvas),null!=bounds.height&&_.each(canvases,function(canvas){canvas.height=bounds.height*backingScale,canvas.style.height=bounds.height+"px"}),null!=bounds.width&&_.each(canvases,function(canvas){canvas.width=bounds.width*backingScale,canvas.style.width=bounds.width+"px"}),null!=bounds.left&&_.each(canvases,function(canvas){canvas.style.left=bounds.left+"px"}),null!=bounds.top&&_.each(canvases,function(canvas){canvas.style.top=bounds.top+"px"})},paint:function(clip){var canvas=this.canvas,context=canvas.getContext("2d");morpheus.CanvasUtil.resetTransform(context);var width=this.getUnscaledWidth(),height=this.getUnscaledHeight();if(context.clearRect(0,0,width,height),this.prePaint&&(morpheus.CanvasUtil.resetTransform(context),context.translate(this.offset.x,this.offset.y),this.prePaint(clip,context)),morpheus.CanvasUtil.resetTransform(context),this.offscreenCanvas){if(this.invalid){var oc=this.offscreenCanvas.getContext("2d");morpheus.CanvasUtil.resetTransform(oc),context.translate(this.offset.x,this.offset.y),oc.clearRect(0,0,width,height),this.draw(clip,oc)}context.drawImage(this.offscreenCanvas,0,0,width,height)}else this.draw(clip,context);this.postPaint&&(morpheus.CanvasUtil.resetTransform(context),context.translate(this.offset.x,this.offset.y),this.postPaint(clip,context)),this.lastClip=clip,this.invalid=!1},repaint:function(){this.lastClip||(this.lastClip={x:0,y:0,width:this.getUnscaledWidth(),height:this.getUnscaledHeight()}),this.paint(this.lastClip)},draw:function(clip,context){console.log("Not implemented")},getPrefHeight:function(){return this.prefHeight},setPrefWidth:function(prefWidth){this.prefWidth=prefWidth},setPrefHeight:function(prefHeight){this.prefHeight=prefHeight},isVisible:function(){return this.visible},setVisible:function(visible){this.visible!==visible&&(this.visible=visible,this.canvas.style.display=visible?"":"none")},getUnscaledWidth:function(){return this.canvas.width/morpheus.CanvasUtil.BACKING_SCALE},getUnscaledHeight:function(){return this.canvas.height/morpheus.CanvasUtil.BACKING_SCALE},getWidth:function(){return this.canvas.width},getHeight:function(){return this.canvas.height}},morpheus.AbstractColorSupplier=function(){this.fractions=[0,.5,1],this.colors=["blue","white","red"],this.names=null,this.min=0,this.max=1,this.missingColor="#c0c0c0",this.scalingMode=morpheus.HeatMapColorScheme.ScalingMode.RELATIVE,this.stepped=!1,this.sizer=new morpheus.HeatMapSizer,this.conditions=new morpheus.HeatMapConditions},morpheus.AbstractColorSupplier.fromJson=function(json){var cs=json.stepped?new morpheus.SteppedColorSupplier:new morpheus.GradientColorSupplier;return cs.setDiscrete(json.discrete),cs.setScalingMode(json.scalingMode),cs.setMin(json.min),cs.setMax(json.max),cs.setMissingColor(json.missingColor),cs.setFractions({colors:json.colors,fractions:json.fractions,names:json.names}),cs},morpheus.AbstractColorSupplier.prototype={discrete:!1,getSizer:function(){return this.sizer},getConditions:function(){return this.conditions},isDiscrete:function(){return this.discrete},setDiscrete:function(discrete){this.discrete=discrete},createInstance:function(){throw"not implemented"},copy:function(){var c=this.createInstance();return c.discrete=this.discrete,c.setFractions({fractions:this.fractions.slice(0),colors:this.colors.slice(0)}),null!=this.names&&(c.names=this.names.slice(0)),this.sizer&&(c.sizer=this.sizer.copy()),this.conditions&&(c.conditions=this.conditions.copy()),c.scalingMode=this.scalingMode,c.min=this.min,c.max=this.max,c.missingColor=this.missingColor,c},setMissingColor:function(missingColor){this.missingColor=missingColor},getMissingColor:function(){return this.missingColor},getScalingMode:function(){return this.scalingMode},setScalingMode:function(scalingMode){scalingMode!==this.scalingMode&&(scalingMode===morpheus.HeatMapColorScheme.ScalingMode.RELATIVE&&(this.min=0,this.max=1),this.scalingMode=scalingMode)},isStepped:function(){return!1},getColor:function(row,column,value){throw"not implemented"},getColors:function(){return this.colors},getNames:function(){return this.names},getFractions:function(){return this.fractions},getMin:function(){return this.min},getMax:function(){return this.max},setMin:function(min){this.min=min},setMax:function(max){this.max=max},setFractions:function(options){var index=morpheus.Util.indexSort(options.fractions,!0);this.fractions=morpheus.Util.reorderArray(options.fractions,index),this.colors=morpheus.Util.reorderArray(options.colors,index),this.names=options.names?morpheus.Util.reorderArray(options.names,index):null}},morpheus.AbstractComponent=function(){this.lastClip=null;var c=document.createElement("div");c.setAttribute("tabindex","0"),c.style.outline=0,c.style.overflow="hidden",c.style.position="absolute",this.el=c,this.$el=$(c)},morpheus.AbstractComponent.prototype={visible:!0,invalid:!0,prefWidth:void 0,prefHeight:void 0,appendTo:function($el){$(this.el).appendTo($el)},dispose:function(){$(this.el).remove()},getPrefWidth:function(){return this.prefWidth},setInvalid:function(invalid){this.invalid=invalid},setBounds:function(bounds){null!=bounds.left&&this.$el.css("left",bounds.left+"px"),null!=bounds.top&&this.$el.css("top",bounds.top+"px")},paint:function(clip){this.getUnscaledWidth(),this.getUnscaledHeight();this.draw(clip),this.lastClip=clip,this.invalid=!1},repaint:function(){this.lastClip||(this.lastClip={x:0,y:0,width:this.getUnscaledWidth(),height:this.getUnscaledHeight()}),this.paint(this.lastClip)},draw:function(clip){},getPrefHeight:function(){return this.prefHeight},setPrefWidth:function(prefWidth){this.prefWidth=prefWidth},setPrefHeight:function(prefHeight){this.prefHeight=prefHeight},isVisible:function(){return this.visible},setVisible:function(visible){this.visible!==visible&&(this.visible=visible,this.el.style.display=visible?"":"none")},getUnscaledWidth:function(){return this.$el.width()},getUnscaledHeight:function(){return this.$el.height()},getWidth:function(){return this.$el.width()},getHeight:function(){return this.$el.height()}},morpheus.AbstractDendrogram=function(controller,tree,positions,project,type){morpheus.AbstractCanvas.call(this,!0),this._overviewHighlightColor="#d8b365",this._searchHighlightColor="#e41a1c",this._selectedNodeColor=type===morpheus.AbstractDendrogram.Type.COLUMN?"#377eb8":"#984ea3",this.tree=tree,this.type=type,this.squishEnabled=!1,this.controller=controller,this.positions=positions,this.project=project;var $label=$("");$label.addClass("label label-info"),$label.css("position","absolute"),this.$label=$label;var $squishedLabel=$("");$squishedLabel.addClass("label label-default"),$squishedLabel.css("position","absolute").css("top",18),this.$squishedLabel=$squishedLabel,this.$label=$label,this.cutHeight=this.tree.maxHeight,this.drawLeafNodes=!0,this.lineWidth=.7,this.selectedNodeIds={},this.selectedRootNodeIdToNode={},this.nodeIdToHighlightedPathsToRoot={};var _this=this;this.defaultStroke="rgb(0,0,0)";var mouseMove=function(event){if(!morpheus.CanvasUtil.dragging){var position=morpheus.CanvasUtil.getMousePosWithScroll(event.target,event,_this.lastClip.x,_this.lastClip.y);if(_this.isDragHotSpot(position))_this.canvas.style.cursor=_this.getResizeCursor();else{var nodes;if(_this.getNodes)nodes=_this.getNodes(position);else{var node=_this.getNode(position);node&&(nodes=[node])}if(null!=nodes){nodes.sort(function(a,b){return a.name=radius?_this.tree.maxHeight:Math.max(0,Math.min(_this.tree.maxHeight,_this.scale.invert(radius)))}cutHeight>=_this.tree.maxHeight?_this.resetCutHeight():_this.setCutHeight(cutHeight),event.preventDefault()}}))},morpheus.AbstractDendrogram.Type={COLUMN:0,ROW:1,RADIAL:2},morpheus.AbstractDendrogram.prototype={setSelectedNode:function(node,add){var viewIndices,_this=this,selectionModel=this.type===morpheus.AbstractDendrogram.Type.COLUMN?this.project.getColumnSelectionModel():this.project.getRowSelectionModel();if(null==node)_this.selectedNodeIds={},_this.selectedRootNodeIdToNode={},viewIndices=new morpheus.Set;else if(add?viewIndices=selectionModel.getViewIndices():(viewIndices=new morpheus.Set,_this.selectedNodeIds={},_this.selectedRootNodeIdToNode={}),null!=node){if(void 0===node.children){var contains=_this.nodeIdToHighlightedPathsToRoot[node.id];add||(_this.nodeIdToHighlightedPathsToRoot={}),contains?delete _this.nodeIdToHighlightedPathsToRoot[node.id]:_this.nodeIdToHighlightedPathsToRoot[node.id]=node}else _this.selectedRootNodeIdToNode[node.id]=node,morpheus.AbstractDendrogram.dfs(node,function(d){return _this.selectedNodeIds[d.id]=!0,!0});for(var i=node.minIndex;i<=node.maxIndex;i++)viewIndices.add(i)}_this.trigger("nodeSelectionChanged",_this.selectedRootNodeIdToNode),selectionModel.setViewIndices(viewIndices,!0),_this.repaint()},getPathStroke:function(node){return this.selectedNodeIds[node.id]?this._selectedNodeColor:this.defaultStroke},getNodeFill:function(node){return this.selectedRootNodeIdToNode[node.id]?this._selectedNodeColor:node.search?this._searchHighlightColor:void 0!==node.info?this._overviewHighlightColor:void 0},resetCutHeight:function(){this.positions.setSquishedIndices(null),this.type===morpheus.AbstractDendrogram.Type.COLUMN?this.project.setGroupColumns([],!0):this.project.setGroupRows([],!0),this.$label.text(""),this.$squishedLabel.text("");var dataset=this.project.getSortedFilteredDataset(),clusterIdVector=this.type===morpheus.AbstractDendrogram.Type.COLUMN?dataset.getColumnMetadata().getByName("dendrogram_cut"):dataset.getRowMetadata().getByName("dendrogram_cut");if(clusterIdVector)for(var i=0,size=clusterIdVector.size();size>i;i++)clusterIdVector.setValue(i,NaN)},setCutHeight:function(height){this.cutHeight=height;for(var squishedIndices={},clusterNumber=0,nsquished=0,squishEnabled=this.squishEnabled,roots=morpheus.AbstractDendrogram.cutAtHeight(this.tree.rootNode,this.cutHeight),dataset=this.project.getSortedFilteredDataset(),clusterIdVector=this.type===morpheus.AbstractDendrogram.Type.COLUMN?dataset.getColumnMetadata().add("dendrogram_cut"):dataset.getRowMetadata().add("dendrogram_cut"),i=0,nroots=roots.length;nroots>i;i++){var clusterId,root=roots[i],minChild=morpheus.AbstractDendrogram.getDeepestChild(root,!0),maxChild=morpheus.AbstractDendrogram.getDeepestChild(root,!1);squishEnabled&&minChild.index===maxChild.index?(squishedIndices[minChild.index]=!0,clusterId=-2,nsquished++):(clusterNumber++,clusterId=clusterNumber);for(var j=minChild.index;j<=maxChild.index;j++)clusterIdVector.setValue(j,clusterId)}if(this.$label.text(clusterNumber+" cluster"+morpheus.Util.s(clusterNumber)),nsquished>0?this.$squishedLabel.text(nsquished+" squished"):this.$squishedLabel.text(""),squishEnabled&&this.positions.setSquishedIndices(squishedIndices),-1===this.controller.getTrackIndex(clusterIdVector.getName(),this.type===morpheus.AbstractDendrogram.Type.COLUMN)){var settings={discrete:!0,discreteAutoDetermined:!0,renderMethod:{}};settings.renderMethod[morpheus.VectorTrack.RENDER.COLOR]=!0,this.controller.addTrack(clusterIdVector.getName(),this.type===morpheus.AbstractDendrogram.Type.COLUMN,settings)}this.type===morpheus.AbstractDendrogram.Type.COLUMN?this.project.setGroupColumns([new morpheus.SortKey(clusterIdVector.getName(),morpheus.SortKey.SortOrder.UNSORTED)],!0):this.project.setGroupRows([new morpheus.SortKey(clusterIdVector.getName(),morpheus.SortKey.SortOrder.UNSORTED)],!0)},dispose:function(){var $c=$(this.canvas);$c.off("mousemove.morpheus mouseout.morpheus mouseenter.morpheus contextmenu.morpheus"),$c.remove(),this.$label.remove(),this.$squishedLabel.remove(),this.hammer.destroy(),this.canvas=null,this.$label=null,this.$squishedLabel=null,this.hammer=null},isCut:function(){return this.cutHeightmaxIndex)){var nodeFill=this.getNodeFill(node);void 0!==nodeFill&&(context.fillStyle=nodeFill,this.drawNode(context,node)),context.strokeStyle=this.getPathStroke(node);var children=node.children;if(void 0!==children){this.drawNodePath(context,node,minIndex,maxIndex);for(var i=0,nchildren=children.length;nchildren>i;i++)this.drawDFS(context,children[i],minIndex,maxIndex)}}}},morpheus.AbstractDendrogram.setIndices=function(root){var setIndex=function(node){for(var children=node.children,maxIndex=children[0].maxIndex,minIndex=children[0].minIndex,i=1,length=children.length;length>i;i++){var child=children[i];minIndex=Math.min(minIndex,child.minIndex),maxIndex=Math.max(maxIndex,child.maxIndex)}node.maxIndex=maxIndex,node.minIndex=minIndex},counter=0,visit=function(node,callback){var n,children=node.children;if(children&&(n=children.length))for(var i=-1;++inode.children[node.children.length-1].index?0:node.children.length-1,node=node.children[index]}},morpheus.AbstractDendrogram.dfs=function(node,callback,childrenAccessor){if(void 0===childrenAccessor&&(childrenAccessor=function(n){return n.children}),callback(node)){var n,children=childrenAccessor(node);if(children&&(n=children.length))for(var i=-1;++ia?-1:1}),0===values.length)return{median:NaN,q1:NaN,q3:NaN,lowerAdjacentValue:NaN,upperAdjacentValue:NaN};for(var median=morpheus.ArrayPercentile(values,50,!0),q1=morpheus.ArrayPercentile(values,25,!0),q3=morpheus.ArrayPercentile(values,75,!0),w=1.5,upperAdjacentValue=-Number.MAX_VALUE,lowerAdjacentValue=Number.MAX_VALUE,upperOutlier=q3+w*(q3-q1),lowerOutlier=q1-w*(q3-q1),i=0,length=values.length;length>i;i++){var value=values[i];upperOutlier>=value&&(upperAdjacentValue=Math.max(upperAdjacentValue,value)),value>=lowerOutlier&&(lowerAdjacentValue=Math.min(lowerAdjacentValue,value))}return lowerAdjacentValue>q1&&(lowerAdjacentValue=q1),q3>upperAdjacentValue&&(upperAdjacentValue=q3),{median:median,q1:q1,q3:q3,lowerAdjacentValue:lowerAdjacentValue,upperAdjacentValue:upperAdjacentValue}},morpheus.Vector=function(name,size){this.name=name,this.array=[],this.n=size,this.properties=new morpheus.Map},morpheus.Vector.fromArray=function(name,array){var v=new morpheus.Vector(name,array.length);return v.array=array,v},morpheus.Vector.prototype={push:function(value){this.array.push(value)},getProperties:function(){return this.properties},setValue:function(index,value){this.array[index]=value},getValue:function(index){return this.array[index]},size:function(){return this.n},getName:function(){return this.name},setName:function(name){this.name=name},setArray:function(array){return this.array=array,this}},morpheus.VectorColorModel=function(){this.vectorNameToColorMap=new morpheus.Map,this.vectorNameToColorScheme=new morpheus.Map,this.colors=morpheus.VectorColorModel.TWENTY_COLORS},morpheus.VectorColorModel.YES_COLOR="#d8b365",morpheus.VectorColorModel.FEMALE="#ff99ff",morpheus.VectorColorModel.MALE="#66ccff",morpheus.VectorColorModel.TWENTY_COLORS=["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b","#c49c94","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"],morpheus.VectorColorModel.CATEGORY_20A=morpheus.VectorColorModel.TWENTY_COLORS,morpheus.VectorColorModel.CATEGORY_20B=["#393b79","#5254a3","#6b6ecf","#9c9ede","#637939","#8ca252","#b5cf6b","#cedb9c","#8c6d31","#bd9e39","#e7ba52","#e7cb94","#843c39","#ad494a","#d6616b","#e7969c","#7b4173","#a55194","#ce6dbd","#de9ed6"],morpheus.VectorColorModel.CATEGORY_20C=["#3182bd","#6baed6","#9ecae1","#c6dbef","#e6550d","#fd8d3c","#fdae6b","#fdd0a2","#31a354","#74c476","#a1d99b","#c7e9c0","#756bb1","#9e9ac8","#bcbddc","#dadaeb","#636363","#969696","#bdbdbd","#d9d9d9"],morpheus.VectorColorModel.CATEGORY_ALL=[].concat(morpheus.VectorColorModel.CATEGORY_20A,morpheus.VectorColorModel.CATEGORY_20B,morpheus.VectorColorModel.CATEGORY_20C),morpheus.VectorColorModel.TABLEAU10=["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],morpheus.VectorColorModel.STANDARD_COLORS={na:"#c0c0c0",nan:"#c0c0c0","":"#ffffff",wt:"#ffffff",n:"#ffffff",0:"#ffffff",y:morpheus.VectorColorModel.YES_COLOR,1:morpheus.VectorColorModel.YES_COLOR,male:morpheus.VectorColorModel.MALE,m:morpheus.VectorColorModel.MALE,female:morpheus.VectorColorModel.FEMALE,f:morpheus.VectorColorModel.FEMALE,kd:"#C675A8",oe:"#56b4e9",cp:"#FF9933","trt_sh.cgs":"#C675A8",trt_oe:"#56b4e9",trt_cp:"#FF9933",a375:"#1490C1",a549:"#AAC8E9",hcc515:"#1C9C2A",hepg2:"#94DC89",ht29:"#946DBE",mcf7:"#C5B2D5",pc3:"#38C697",asc:"#FF8000",cd34:"#FFBB75",ha1e:"#FB4124",neu:"#FF9A94",npc:"#E57AC6",cancer:"#1490C1","immortalized normal":"#FF8000"},morpheus.VectorColorModel.getStandardColor=function(value){if(null==value)return"#ffffff";var stringValue=value.toString().toLowerCase();return morpheus.VectorColorModel.STANDARD_COLORS[stringValue]},morpheus.VectorColorModel.getColorMapForNumber=function(length){var colors;return colors=3>length?colorbrewer.Set1[3]:colorbrewer.Paired[length],colors?colors:morpheus.VectorColorModel.TWENTY_COLORS},morpheus.VectorColorModel.prototype={clear:function(vector){this.vectorNameToColorMap.remove(vector.getName()),this.vectorNameToColorScheme.remove(vector.getName())},copy:function(){var c=new morpheus.VectorColorModel;return c.colors=this.colors.slice(0),this.vectorNameToColorMap.forEach(function(colorMap,name){var newColorMap=new morpheus.Map;newColorMap.setAll(colorMap),c.vectorNameToColorMap.set(name,newColorMap)}),this.vectorNameToColorScheme.forEach(function(colorScheme,name){c.vectorNameToColorScheme.set(name,colorScheme.copy(new morpheus.Project(new morpheus.Dataset("",1,1))))}),c},clearAll:function(){this.vectorNameToColorMap=new morpheus.Map,this.vectorNameToColorScheme=new morpheus.Map},containsDiscreteColor:function(vector,value){var metadataValueToColorMap=this.vectorNameToColorMap.get(vector.getName());if(void 0===metadataValueToColorMap)return!1;var c=metadataValueToColorMap.get(value);return null!=c},setDiscreteColorMap:function(colors){this.colors=colors},getContinuousColorScheme:function(vector){return this.vectorNameToColorScheme.get(vector.getName())},getDiscreteColorScheme:function(vector){return this.vectorNameToColorMap.get(vector.getName())},createContinuousColorMap:function(vector){var minMax=morpheus.VectorUtil.getMinMax(vector),min=minMax.min,max=minMax.max,cs=new morpheus.HeatMapColorScheme(new morpheus.Project(new morpheus.Dataset("",1,1)),{type:"fixed",map:[{value:min,color:colorbrewer.Greens[3][0]},{value:max,color:colorbrewer.Greens[3][2]}]});return this.vectorNameToColorScheme.set(vector.getName(),cs),cs},getContinuousMappedValue:function(vector,value){var cs=this.vectorNameToColorScheme.get(vector.getName());return void 0===cs&&(cs=this.createContinuousColorMap(vector)),cs.getColor(0,0,value)},_getColorForValue:function(value){var color=morpheus.VectorColorModel.getStandardColor(value);if(null==color)for(var existingMetadataValueToColorMap=this.vectorNameToColorMap.values(),i=0,length=existingMetadataValueToColorMap.length;length>i;i++)if(color=existingMetadataValueToColorMap[i].get(value),void 0!==color)return color;return color},getMappedValue:function(vector,value){var metadataValueToColorMap=this.vectorNameToColorMap.get(vector.getName());if(void 0===metadataValueToColorMap){metadataValueToColorMap=new morpheus.Map,this.vectorNameToColorMap.set(vector.getName(),metadataValueToColorMap);var values=morpheus.VectorUtil.getValues(vector),ncolors=0,colors=null;if(colors=values.length<3?colorbrewer.Dark2[3]:colorbrewer.Paired[values.length],colors||(colors=values.length<=20?d3.scale.category20().range():morpheus.VectorColorModel.CATEGORY_ALL),colors)for(var ncolors=colors.length,i=0,nvalues=values.length;nvalues>i;i++){var color=this._getColorForValue(values[i]);null==color&&(color=colors[i%ncolors]),metadataValueToColorMap.set(values[i],color)}else{var _this=this;_.each(values,function(val){_this.getMappedValue(vector,val)})}}var color=metadataValueToColorMap.get(value);if(null==color){if(color=this._getColorForValue(value),null==color){var index=metadataValueToColorMap.size();color=this.colors[index%this.colors.length]}metadataValueToColorMap.set(value,color)}return color},setMappedValue:function(vector,value,color){var metadataValueToColorMap=this.vectorNameToColorMap.get(vector.getName());void 0===metadataValueToColorMap&&(metadataValueToColorMap=new morpheus.Map,this.vectorNameToColorMap.set(vector.getName(),metadataValueToColorMap)),metadataValueToColorMap.set(value,color)}},morpheus.VectorKeys={},morpheus.VectorKeys.FIELDS="morpheus.fields",morpheus.VectorKeys.VALUE_TO_INDICES="morpheus.valueToIndices",morpheus.VectorKeys.VISIBLE_FIELDS="morpheus.visibleFields",morpheus.VectorKeys.DATA_TYPE="morpheus.dataType",morpheus.VectorKeys.ARRAY_SUMMARY_FUNCTION="morpheus.arraySummaryFunction",morpheus.VectorKeys.HEADER_SUMMARY="morpheus.headerSummary",morpheus.VectorKeys.SHOW_HEADER_SUMMARY="morpheus.showHeaderSummary",morpheus.VectorKeys.TITLE="morpheus.title",morpheus.VectorKeys.FUNCTION="morpheus.function",morpheus.VectorKeys.RECOMPUTE_FUNCTION="morpheus.recompute.function",morpheus.VectorKeys.COPY_IGNORE=new morpheus.Set,morpheus.VectorKeys.COPY_IGNORE.add(morpheus.VectorKeys.HEADER_SUMMARY),morpheus.VectorKeys.COPY_IGNORE.add(morpheus.VectorKeys.DATA_TYPE),morpheus.VectorKeys.COPY_IGNORE.add(morpheus.VectorKeys.VALUE_TO_INDICES),morpheus.VectorShapeModel=function(){this.shapes=morpheus.VectorShapeModel.SHAPES,this.vectorNameToShapeMap=new morpheus.Map},morpheus.VectorShapeModel.SHAPES=["circle","square","plus","x","asterisk","diamond","triangle-up","triangle-down","triangle-left","triangle-right","minus"],morpheus.VectorShapeModel.STANDARD_SHAPES={cp:"diamond",oe:"plus",pcl:"asterisk",kd:"minus",ctrl:"circle"},morpheus.VectorShapeModel.prototype={clear:function(vector){this.vectorNameToShapeMap.remove(vector.getName())},copy:function(){var c=new morpheus.VectorShapeModel;return c.shapes=this.shapes.slice(0),this.vectorNameToShapeMap.forEach(function(shapeMap,name){var newShapeMap=new morpheus.Map;newShapeMap.setAll(shapeMap),c.vectorNameToShapeMap.set(name,newShapeMap)}),c},clearAll:function(){this.vectorNameToShapeMap=new morpheus.Map},_getShapeForValue:function(value){if(null==value)return"none";var str=value.toString().toLowerCase(),mapped=morpheus.VectorShapeModel.STANDARD_SHAPES[str];if(void 0!==mapped)return mapped;for(var existingMetadataValueToShapeMap=this.vectorNameToShapeMap.values(),i=0,length=existingMetadataValueToShapeMap.length;length>i;i++){var shape=existingMetadataValueToShapeMap[i].get(value);if(void 0!==shape)return shape}},getMap:function(name){return this.vectorNameToShapeMap.get(name)},getMappedValue:function(vector,value){var metadataValueToShapeMap=this.vectorNameToShapeMap.get(vector.getName());if(void 0===metadataValueToShapeMap){metadataValueToShapeMap=new morpheus.Map,this.vectorNameToShapeMap.set(vector.getName(),metadataValueToShapeMap);for(var values=morpheus.VectorUtil.getValues(vector),i=0,nvalues=values.length;nvalues>i;i++){var shape=this._getShapeForValue(values[i]);null==shape&&(shape=this.shapes[i%this.shapes.length]),metadataValueToShapeMap.set(values[i],shape)}}var shape=metadataValueToShapeMap.get(value);if(null==shape){if(shape=this._getShapeForValue(value),null==shape){var index=metadataValueToShapeMap.size();shape=this.shapes[index%this.shapes.length]}metadataValueToShapeMap.set(value,shape)}return shape},setMappedValue:function(vector,value,shape){var metadataValueToShapeMap=this.vectorNameToShapeMap.get(vector.getName());void 0===metadataValueToShapeMap&&(metadataValueToShapeMap=new morpheus.Map,this.vectorNameToShapeMap.set(vector.getName(),metadataValueToShapeMap)),metadataValueToShapeMap.set(value,shape)}},morpheus.VectorUtil=function(){},morpheus.VectorUtil.createValueToIndicesMap=function(vector){if(!vector)throw"vector is null";for(var map=new morpheus.Map,j=0,size=vector.size();size>j;j++){var val=vector.getValue(j),list=map.get(val);void 0===list&&(list=[],map.set(val,list)),list.push(j)}return map},morpheus.VectorUtil.createValueToCountMap=function(vector){if(!vector)throw"vector is null";for(var map=new morpheus.Map,dataType=morpheus.VectorUtil.getDataType(vector),isArray="["===dataType[0],j=0,size=vector.size();size>j;j++){var val=vector.getValue(j);if(null!=val)if(isArray)for(var k=0;ki;i++){var s=vector.getValue(i);if(null!=s){var tokens=s.split(regex);newValues.push(tokens),!found&&tokens.length>1&&(found=!0)}}if(found)for(var i=0,nrows=newValues.length;nrows>i;i++)vector.setValue(i,newValues[i]);return vector.getProperties().set(morpheus.VectorKeys.DATA_TYPE,"[string]"),found},morpheus.VectorUtil.maybeConvertStringToNumber=function(vector){for(var newValues=[],i=0,nrows=vector.size();nrows>i;i++){var s=vector.getValue(i);if(null!=s&&""!==s&&"NA"!==s&&"NaN"!==s&&!$.isNumeric(s))return!1;newValues.push(parseFloat(s))}for(var i=0,nrows=newValues.length;nrows>i;i++)vector.setValue(i,newValues[i]);return vector.getProperties().set(morpheus.VectorKeys.DATA_TYPE,"number"),!0},morpheus.VectorUtil.createValuesToIndicesMap=function(vectors){var map=new morpheus.Map,nvectors=vectors.length;if(null==vectors[0])throw"no vectors found";for(var i=0,nitems=vectors[0].size();nitems>i;i++){for(var array=[],j=0;nvectors>j;j++){var vector=vectors[j],val=vector.getValue(i);array.push(val)}var key=new morpheus.Identifier(array),list=map.get(key);void 0===list&&(list=[],map.set(key,list)),list.push(i)}return map},morpheus.VectorUtil.createValuesToIndexMap=function(vectors){var map=new morpheus.Map,nvectors=vectors.length;if(null==vectors[0])throw"no vectors found";for(var i=0,nitems=vectors[0].size();nitems>i;i++){for(var array=[],j=0;nvectors>j;j++){var vector=vectors[j],val=vector.getValue(i);array.push(val)}var key=new morpheus.Identifier(array);map.set(key,i)}return map},morpheus.VectorUtil.containsMoreThanOneValue=function(vector){return morpheus.VectorUtil.containsMoreThanNValues(vector,1)},morpheus.VectorUtil.containsMoreThanNValues=function(vector,n){for(var s=new morpheus.Set,j=0,size=vector.size();size>j;j++){var val=vector.getValue(j);if(s.add(val),s.size()>n)return!0}return!1},morpheus.VectorUtil.createValueToIndexMap=function(vector){for(var map=new morpheus.Map,j=0,size=vector.size();size>j;j++){var val=vector.getValue(j);map.set(val,j)}return map},morpheus.VectorUtil.getValues=function(vector,excludeNull){for(var set=new morpheus.Set,j=0,size=vector.size();size>j;j++){var val=vector.getValue(j);excludeNull&&null==val||set.add(val)}var array=set.values();return array.sort(morpheus.SortKey.ASCENDING_COMPARATOR),array},morpheus.VectorUtil.getSet=function(vector){for(var set=new morpheus.Set,j=0,size=vector.size();size>j;j++)set.add(vector.getValue(j));return set},morpheus.VectorUtil.createSpanMap=function(vector){for(var previous=vector.getValue(0),startIndexToEndIndex=new morpheus.Map,start=0,i=1,nrows=vector.size();nrows>i;i++){var val=vector.getValue(i);previous!==val&&(previous=val,startIndexToEndIndex.set(start,i),start=i)}return startIndexToEndIndex.set(start,vector.size()),startIndexToEndIndex},morpheus.VectorUtil.toArray=function(vector){for(var array=[],i=0,length=vector.size();length>i;i++){var val=vector.getValue(i);array.push(val)}return array},morpheus.VectorUtil.arrayAsVector=function(array,name){var v=new morpheus.Vector(name,array.length);return v.array=array,v},morpheus.VectorUtil.toString=function(vector){for(var array=[],i=0,length=vector.size();length>i;i++){var val=vector.getValue(i);array.push(val)}return array.join(", ")},morpheus.VectorUtil.getDataType=function(vector){var dataType=vector.getProperties().get(morpheus.VectorKeys.DATA_TYPE);if(void 0===dataType){var firstNonNull=morpheus.VectorUtil.getFirstNonNull(vector);dataType=morpheus.Util.getDataType(firstNonNull),vector.getProperties().set(morpheus.VectorKeys.DATA_TYPE,dataType)}return dataType},morpheus.VectorUtil.getMinMax=function(vector){var min=Number.MAX_VALUE,max=-Number.MAX_VALUE,fields=vector.getProperties().get(morpheus.VectorKeys.FIELDS);if(null!=fields)for(var nvalues=fields.length,i=0,size=vector.size();size>i;i++){var array=vector.getValue(i);if(array)for(var j=0;nvalues>j;j++){var value=array[j];isNaN(value)||(min=min>value?value:min,max=value>max?value:max)}}else for(var i=0,size=vector.size();size>i;i++){var value=vector.getValue(i);isNaN(value)||(min=min>value?value:min,max=value>max?value:max)}return{min:min,max:max}},morpheus.VectorUtil.getFirstNonNull=function(vector){for(var i=0,length=vector.size();length>i;i++){var val=vector.getValue(i);if(null!=val)return val}return null},morpheus.VectorUtil.isNumber=function(vector){return"number"===morpheus.VectorUtil.getDataType(vector)},morpheus.LandingPage=function(pageOptions){pageOptions=$.extend({},{el:$("#vis")},pageOptions),this.pageOptions=pageOptions;var $el=$('');this.$el=$el;var html=[];html.push('
'),html.push('
logo Morpheus
'),html.push("

Open your own file

"),html.push('
'),html.push("

Or select a preloaded dataset

"),html.push('
'),html.push(""),$(html.join("")).appendTo($el),(new morpheus.HelpMenu).$el.appendTo($el.find("[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("[name=formRow]")),this.formBuilder=formBuilder,this.$sampleDatasetsEl=$el.find("[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(options){this.dispose(),null==this.heatmap?(options.landingPage=this,options.el=this.pageOptions.el,this.heatmap=new morpheus.HeatMap(options)):(options.inheritFromParent=!1,options.parent=this.heatmap,new morpheus.HeatMap(options))},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(""),exampleHtml.push(''),exampleHtml.push(''),exampleHtml.push(''),exampleHtml.push(''),exampleHtml.push('"),exampleHtml.push("
Cancer Cell Line Encyclopedia (CCLE), Project Achilles Gene Expression Copy Number By Gene Mutations Gene essentiality
"),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("//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('');for(var i=0;i"),tcga.push(""),tcga.push(""),tcga.push(""),tcga.push(""),tcga.push(""),tcga.push(""),tcga.push(""),tcga.push(""),tcga.push(""),tcga.push("")}tcga.push("
"+disease.name+""),disease.mrna&&tcga.push(' Gene Expression'),tcga.push(""),disease.gistic&&tcga.push(' GISTIC Copy Number'),tcga.push(""),disease.gistic&&tcga.push(' Copy Number By Gene'),tcga.push(""),disease.sig_genes&&tcga.push(' Mutations'),tcga.push(""),disease.rppa&&tcga.push(' Proteomics'),tcga.push(""),disease.methylation&&tcga.push(' Methylation'),tcga.push(""),tcga.push('
"),$(tcga.join("")).appendTo($el.find("[name=tcga]"))})},morpheus.SampleDatasets.getTcgaDataset=function(options){var baseUrl="//s3.amazonaws.com/data.clue.io/morpheus/tcga/"+options.type+"/",datasetOptions={};return options.mrna&&(datasetOptions.mrna=baseUrl+"mRNAseq_RSEM_normalized_log2.txt"),options.methylation&&(datasetOptions.methylation=baseUrl+"meth.by_mean.data.txt"),options.sig_genes&&(datasetOptions.mutation=baseUrl+"mutations_merged.maf.txt",datasetOptions.sigGenes=baseUrl+"sig_genes.txt"),options.rppa&&(datasetOptions.rppa=baseUrl+"rppa.txt"),options.gistic&&(datasetOptions.gistic=baseUrl+"all_lesions.conf_99.txt"),options.gisticGene&&(datasetOptions.gisticGene=baseUrl+"all_data_by_genes.txt"),datasetOptions.mrnaClust=baseUrl+"bestclus.txt",datasetOptions.columnAnnotations=[{file:baseUrl+"All_CDEs.txt",datasetField:"participant_id",fileField:"patient_id"}],morpheus.TcgaUtil.getDataset(datasetOptions)},morpheus.SampleDatasets.getCCLEDataset=function(options){var datasets=[];options.sig_genes&&datasets.push({dataset:"//s3.amazonaws.com/data.clue.io/morpheus/CCLE_hybrid_capture1650_hg19_NoCommonSNPs_NoNeutralVariants_CDS_2012.05.07.maf.txt"}),options.cn&&datasets.push({dataset:"//s3.amazonaws.com/data.clue.io/morpheus/CCLE_copynumber_byGene_2013-12-03.gct"}),options.mrna&&datasets.push({dataset:"//s3.amazonaws.com/data.clue.io/morpheus/CCLE_Expression_Entrez_2012-09-29.txt"}),options.ach&&datasets.push({dataset:"//s3.amazonaws.com/data.clue.io/morpheus/Achilles_QC_v2.4.3.rnai.Gs.gct"});var columnAnnotations=[{file:"//s3.amazonaws.com/data.clue.io/morpheus/CCLE_Sample_Info.txt",datasetField:"id",fileField:"id"}];options.ach&&columnAnnotations.push({file:"//s3.amazonaws.com/data.clue.io/morpheus/Achilles_v2.4_SampleInfo_small.txt",datasetField:"id",fileField:"id"});var datasetToReturn,returnDeferred=$.Deferred(),datasetDef=morpheus.DatasetUtil.readDatasetArray({dataset:datasets}),annotationDef=morpheus.DatasetUtil.annotate({annotations:columnAnnotations,isColumns:!0});datasetDef.done(function(d){datasetToReturn=d}),datasetDef.fail(function(message){returnDeferred.reject(message)});var annotationCallbacks;return annotationDef.done(function(callbacks){annotationCallbacks=callbacks}),annotationDef.fail(function(message){returnDeferred.reject(message)}),$.when.apply($,[datasetDef,annotationDef]).then(function(){annotationCallbacks.forEach(function(f){f(datasetToReturn)}),returnDeferred.resolve(datasetToReturn)}),returnDeferred},morpheus.SampleDatasets.prototype={openTcga:function(options){this.callback({name:options.name,renderReady:function(heatMap){for(var whitelist=["age_at_initial_pathologic_diagnosis","breast_carcinoma_estrogen_receptor_status","breast_carcinoma_progesterone_receptor_status","lab_proc_her2_neu_immunohistochemistry_receptor_status","days_to_death","ethnicity","gender","histological_type","pathologic_stage"],columnMetadata=heatMap.getProject().getFullDataset().getColumnMetadata(),i=0;ii;i++)for(var j=0,ncols=dataset.getColumnCount();ncols>j;j++)dataset.setValue(i,j,morpheus.Log2(dataset.getValue(i,j)));if(options.input.inverse_log_2)for(var i=0,nrows=dataset.getRowCount();nrows>i;i++)for(var j=0,ncols=dataset.getColumnCount();ncols>j;j++){var value=dataset.getValue(i,j);value>=0&&dataset.setValue(i,j,Math.pow(2,value))}if(options.input["z-score"])for(var i=0,nrows=dataset.getRowCount();nrows>i;i++){rowView.setIndex(i);for(var mean=morpheus.Mean(rowView),stdev=Math.sqrt(morpheus.Variance(rowView)),j=0,ncols=dataset.getColumnCount();ncols>j;j++)dataset.setValue(i,j,(dataset.getValue(i,j)-mean)/stdev)}if(options.input["robust_z-score"])for(var i=0,nrows=dataset.getRowCount();nrows>i;i++){rowView.setIndex(i);for(var median=morpheus.Median(rowView),mad=morpheus.MAD(rowView,median),j=0,ncols=dataset.getColumnCount();ncols>j;j++)dataset.setValue(i,j,(dataset.getValue(i,j)-median)/mad)}project.trigger("datasetChanged"),project.getColumnSelectionModel().setViewIndices(selectedColumnIndices,!0),project.getRowSelectionModel().setViewIndices(selectedRowIndices,!0)}}},morpheus.AnnotateDendrogramTool=function(isColumns){this._isColumns=isColumns},morpheus.AnnotateDendrogramTool.prototype={toString:function(){return"Annotate Dendrogram"},gui:function(){return[{name:"file",value:"",type:"file",required:!0,help:"an xlsx file or a tab-delimitted text file"}]},execute:function(options){var fileOrUrl=options.input.file,isColumns=this._isColumns,controller=options.controller,result=morpheus.Util.readLines(fileOrUrl),dendrogram=(morpheus.Util.getFileName(fileOrUrl),isColumns?controller.columnDendrogram:controller.rowDendrogram),nameToNode=new morpheus.Map;morpheus.AbstractDendrogram.dfs(dendrogram.tree.rootNode,function(node){return nameToNode.set(node.name,node),!0});var tab=new RegExp(" ");result.done(function(lines){var header=lines[0].split(tab),promptTool={};promptTool.execute=function(options){for(var nodeIdField=options.input.node_id_field,nodeIdIndex=_.indexOf(header,nodeIdField),numberOfMatchingNodes=0,i=1;i
');var formBuilder=new morpheus.FormBuilder({vertical:!0});this.formBuilder=formBuilder,formBuilder.append({name:"chart_type",type:"select",options:["boxplot","row scatter","column scatter","row profile","column profile"]});var rowOptions=[],columnOptions=[],numericRowOptions=[],numericColumnOptions=[],options=[],numericOptions=[],updateOptions=function(){var dataset=project.getFullDataset();rowOptions=[{name:"(None)",value:""}],columnOptions=[{name:"(None)",value:""}],numericRowOptions=[{name:"(None)",value:""}],numericColumnOptions=[{name:"(None)",value:""}],options=[{name:"(None)",value:""}],numericOptions=[{name:"(None)",value:""}],morpheus.MetadataUtil.getMetadataNames(dataset.getRowMetadata()).forEach(function(name){var dataType=morpheus.VectorUtil.getDataType(dataset.getRowMetadata().getByName(name));"number"!==dataType&&"[number]"!==dataType||numericRowOptions.push({name:name+" (row)",value:name+"_r"}),rowOptions.push({name:name+" (row)",value:name+"_r"})}),morpheus.MetadataUtil.getMetadataNames(dataset.getColumnMetadata()).forEach(function(name){var dataType=morpheus.VectorUtil.getDataType(dataset.getColumnMetadata().getByName(name));"number"!==dataType&&"[number]"!==dataType||numericColumnOptions.push({name:name+" (column)",value:name+"_c"}),columnOptions.push({name:name+" (column)",value:name+"_c"})}),options=options.concat(rowOptions.slice(1)),options=options.concat(columnOptions.slice(1)),numericOptions=numericOptions.concat(numericRowOptions.slice(1)),numericOptions=numericOptions.concat(numericColumnOptions.slice(1))};updateOptions(),formBuilder.append({name:"group_columns_by",type:"select",options:options}),formBuilder.append({name:"group_rows_by",type:"select",options:options}),formBuilder.append({name:"axis_label",type:"select",options:rowOptions}),formBuilder.append({name:"show_points",type:"checkbox",value:!0}),formBuilder.append({name:"color",type:"select",options:options}),formBuilder.append({name:"size",type:"select",options:numericOptions}),formBuilder.$form.find("select").on("change",function(){setVisibility(),_this.draw()}),formBuilder.$form.find("input").on("click",function(){_this.draw()}),setVisibility();var draw=function(){_.debounce(_this.draw(),100)},trackChanged=function(){updateOptions(),setVisibility(),formBuilder.setOptions("group_columns_by",options,!0),formBuilder.setOptions("group_rows_by",options,!0)};project.getColumnSelectionModel().on("selectionChanged.chart",draw),project.getRowSelectionModel().on("selectionChanged.chart",draw),project.on("trackChanged.chart",trackChanged),this.$chart=this.$el.find("[name=chartDiv]");var $dialog=$('
'),$configPane=this.$el.find("[name=configPane]");formBuilder.$form.appendTo($configPane),this.$el.appendTo($dialog),$dialog.dialog({close:function(event,ui){project.off("trackChanged.chart",trackChanged),project.getRowSelectionModel().off("selectionChanged.chart",draw),project.getColumnSelectionModel().off("selectionChanged.chart",draw),_this.$el.empty()},resizable:!0,height:600,width:900}),this.$dialog=$dialog,this.draw()},morpheus.ChartTool2.getPlotlyDefaults=function(){var layout={autosize:!1,paper_bgcolor:"rgb(255,255,255)",plot_bgcolor:"rgb(229,229,229)",showlegend:!1,margin:{l:80,r:0,t:10,b:14,autoexpand:!0},xaxis:{zeroline:!1,titlefont:{size:12},gridcolor:"rgb(255,255,255)",showgrid:!0,showline:!1,showticklabels:!0,tickcolor:"rgb(127,127,127)",ticks:"outside",type:"linear"},yaxis:{zeroline:!1,titlefont:{size:12},gridcolor:"rgb(255,255,255)",showgrid:!0,showline:!1,showticklabels:!0,tickcolor:"rgb(127,127,127)",ticks:"outside",type:"linear"}},config={showLink:!1,displaylogo:!1,staticPlot:!1,showHints:!0,modeBarButtonsToRemove:["sendDataToCloud"]};return{layout:layout,config:config}},morpheus.ChartTool2.getVectorInfo=function(value){var field=value.substring(0,value.length-2),isColumns="_c"===value.substring(value.length-2);return{field:field,isColumns:isColumns}},morpheus.ChartTool2.prototype={annotate:function(options){var _this=this,formBuilder=new morpheus.FormBuilder;formBuilder.append({name:"annotation_name",type:"text",required:!0}),formBuilder.append({name:"annotation_value",type:"text",required:!0}),morpheus.FormBuilder.showOkCancel({title:"Annotate Selection",content:formBuilder.$form,okCallback:function(){var dataset=options.dataset,eventData=options.eventData,array=options.array,value=formBuilder.getValue("annotation_value"),annotationName=formBuilder.getValue("annotation_name"),isRows=!0,isColumns=!0,existingRowVector=null,rowVector=null;isRows&&(existingRowVector=dataset.getRowMetadata().getByName(annotationName),rowVector=dataset.getRowMetadata().add(annotationName));var existingColumnVector=null,columnVector=null;isColumns&&(existingColumnVector=dataset.getColumnMetadata().getByName(annotationName),columnVector=dataset.getColumnMetadata().add(annotationName));for(var p=0,nselected=eventData.points.length;nselected>p;p++){var item=array[eventData.points[p].pointNumber];isRows&&(_.isArray(item.row)?item.row.forEach(function(r){rowVector.setValue(r,value)}):rowVector.setValue(item.row,value)),isColumns&&columnVector.setValue(item.column,value)}isRows&&(morpheus.VectorUtil.maybeConvertStringToNumber(rowVector),_this.project.trigger("trackChanged",{vectors:[rowVector],render:null!=existingRowVector?[]:[morpheus.VectorTrack.RENDER.TEXT],columns:!1})),isColumns&&(morpheus.VectorUtil.maybeConvertStringToNumber(columnVector),_this.project.trigger("trackChanged",{vectors:[columnVector],render:null!=existingColumnVector?[]:[morpheus.VectorTrack.RENDER.TEXT],columns:!0}))}})},_createScatter:function(options){for(var dataset=options.dataset,colorByVector=options.colorByVector,colorModel=options.colorModel,sizeByVector=options.sizeByVector,sizeFunction=options.sizeFunction,myPlot=(this.heatmap,options.myPlot),isColumnChart=options.isColumnChart,x=[],y=[],text=[],color=colorByVector?[]:"#1f78b4",size=sizeByVector?[]:6,array=[],j=0,ncols=dataset.getColumnCount();ncols>j;j++){if(y.push(dataset.getValue(options.rowIndexOne,j)),x.push(dataset.getValue(options.rowIndexTwo,j)),array.push({row:[options.rowIndexOne,options.rowIndexTwo],column:j}),colorByVector){var colorByValue=colorByVector.getValue(j);color.push(colorModel.getMappedValue(colorByVector,colorByValue))}if(sizeByVector){var sizeByValue=sizeByVector.getValue(j);size.push(sizeFunction(sizeByValue))}var obj={j:j};obj.toString=function(){for(var trackNames=_this.getVisibleTrackNames(!isColumnChart),s=[],i=0;i")}return s.join("")},text.push(obj)}var trace={x:x,y:y,marker:{color:color,size:size,symbol:"circle-open"},text:text,mode:"markers",type:"scatter"},selection=null,_this=this,config=$.extend(!0,{},options.config,{modeBarButtonsToAdd:[[{name:"annotate",title:"Annotate Selection",attr:"dragmode",val:"annotate",icon:{width:1792,path:"M491 1536l91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192l416 416-832 832h-416v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z",ascent:1792,descent:0},click:function(){selection?_this.annotate({array:array,eventData:selection,dataset:dataset}):morpheus.FormBuilder.showInModal({title:"Annotate Selection",html:"Please select points in the chart",close:"Close"})}}]]});Plotly.newPlot(myPlot,[trace],options.layout,config),myPlot.on("plotly_selected",function(eventData){selection=eventData})},_createProfile:function(options){function resize(){var width=$parent.width(),height=_this.$dialog.height()-30;Plotly.relayout(myPlot,{width:width,height:height})}var dataset=options.dataset,colorByVector=options.colorByVector,colorModel=options.colorModel,sizeByVector=options.sizeByVector,sizeFunction=options.sizeFunction,axisLabelVector=options.axisLabelVector,isColumnChart=options.isColumnChart,myPlot=(this.heatmap,options.myPlot),traces=[],ticktext=[],tickvals=[];console.log(dataset.getRowCount(),dataset.getColumnCount());for(var j=0,ncols=dataset.getColumnCount();ncols>j;j++)ticktext.push(null!=axisLabelVector?axisLabelVector.getValue(j):""+j),tickvals.push(j);for(var i=0,nrows=dataset.getRowCount();nrows>i;i++){for(var x=[],y=[],text=[],size=sizeByVector?[]:6,j=(colorByVector?colorModel.getMappedValue(colorByVector,colorByVector.getValue(i)):void 0,0),ncols=dataset.getColumnCount();ncols>j;j++){if(x.push(j),y.push(dataset.getValue(i,j)),sizeByVector){var sizeByValue=sizeByVector.getValue(j);size.push(sizeFunction(sizeByValue))}var obj={i:i,j:j};obj.toString=function(){for(var trackNames=_this.getVisibleTrackNames(!isColumnChart),s=[],i=0;i")}return s.join("")},text.push(obj)}var trace={x:x,y:y,name:colorByVector?colorByVector.getValue(i):"",tickmode:"array",marker:{size:size,symbol:"circle"},text:text,mode:"markers+lines",type:"scatter"};traces.push(trace)}var selection=null,_this=this;options.layout.xaxis.tickvals=tickvals,options.layout.xaxis.ticktext=ticktext,options.layout.xaxis.tickmode="array";var config=$.extend(!0,{},options.config,{modeBarButtonsToAdd:[[{name:"annotate",title:"Annotate Selection",attr:"dragmode",val:"annotate",icon:{width:1792,path:"M491 1536l91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192l416 416-832 832h-416v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z",ascent:1792,descent:0},click:function(){selection?_this.annotate({eventData:selection,dataset:dataset}):morpheus.FormBuilder.showInModal({title:"Annotate Selection",html:"Please select points in the chart",close:"Close"})}}]]}),$parent=$(myPlot).parent();options.layout.width=$parent.width(),options.layout.height=this.$dialog.height()-30,Plotly.newPlot(myPlot,traces,options.layout,config),myPlot.on("plotly_selected",function(eventData){selection=eventData}),this.$dialog.on("dialogresize",resize),$(myPlot).on("remove",function(){_this.$dialog.off("dialogresize")})},_createBoxPlot:function(options){for(var array=options.array,points=options.points,colorByVector=options.colorByVector,colorByGetter=options.colorByGetter,colorModel=options.colorModel,myPlot=options.myPlot,dataset=options.dataset,y=[],color=points&&colorByVector?[]:"#1f78b4",text=[],x=[],sizeFunction=(this.heatmap,options.sizeFunction),sizeByGetter=options.sizeByGetter,size=sizeFunction?[]:6,scale=d3.scale.linear().domain([0,1]).range([-.3,-1]),k=0,nitems=array.length;nitems>k;k++){var item=array[k];if(y.push(dataset.getValue(item.row,item.column)),points){if(x.push(scale(Math.random())),colorByVector){var colorByValue=colorByGetter(item);color.push(colorModel.getMappedValue(colorByVector,colorByValue))}if(sizeFunction){var sizeByValue=sizeByGetter(item);size.push(sizeFunction(sizeByValue))}var obj={row:item.row,column:item.column};obj.toString=function(){for(var s=[],trackNames=_this.getVisibleTrackNames(!0),trackIndex=0;trackIndex")}trackNames=_this.getVisibleTrackNames(!1);for(var trackIndex=0;trackIndex")}return s.join("")},text.push(obj)}}var traces=[{name:"",y:y,type:"box",boxpoints:!1}];points&&traces.push({name:"",x:x,y:y,hoverinfo:"y+text",mode:"markers",type:"scatter",text:text,marker:{symbol:"circle-open",size:size,color:color}});var selection=null,_this=this,config=$.extend(!0,{},options.config,{modeBarButtonsToAdd:[[{name:"annotate",title:"Annotate Selection",attr:"dragmode",val:"annotate",icon:{width:1792,path:"M491 1536l91-91-235-235-91 91v107h128v128h107zm523-928q0-22-22-22-10 0-17 7l-542 542q-7 7-7 17 0 22 22 22 10 0 17-7l542-542q7-7 7-17zm-54-192l416 416-832 832h-416v-416zm683 96q0 53-37 90l-166 166-416-416 166-165q36-38 90-38 53 0 91 38l235 234q37 39 37 91z",ascent:1792,descent:0},click:function(){selection?_this.annotate({array:array,eventData:selection,dataset:dataset}):morpheus.FormBuilder.showInModal({title:"Annotate Selection",html:"Please select points in the chart",close:"Close"})}}]]});Plotly.newPlot(myPlot,traces,options.layout,config),myPlot.on("plotly_selected",function(eventData){selection=eventData})},draw:function(){this.$chart.empty();var plotlyDefaults=morpheus.ChartTool2.getPlotlyDefaults(),layout=plotlyDefaults.layout,config=plotlyDefaults.config,chartWidth=400,chartHeight=400,points=this.formBuilder.getValue("show_points"),groupColumnsBy=this.formBuilder.getValue("group_columns_by"),axisLabel=this.formBuilder.getValue("axis_label"),colorBy=this.formBuilder.getValue("color"),sizeBy=this.formBuilder.getValue("size"),groupRowsBy=this.formBuilder.getValue("group_rows_by"),chartType=this.formBuilder.getValue("chart_type"),dataset=this.project.getSelectedDataset({emptyToAll:!1});if(this.dataset=dataset,dataset.getRowCount()*dataset.getColumnCount()===0)return void $("

Please select rows and columns in the heat map.

").appendTo(this.$chart);dataset.getRowCount()*dataset.getColumnCount()>1e5&&(points=!1);var grid=[],rowIds=[void 0],columnIds=[void 0],items=[],colorByInfo=(this.heatmap,morpheus.ChartTool2.getVectorInfo(colorBy)),sizeByInfo=morpheus.ChartTool2.getVectorInfo(sizeBy),colorModel=colorByInfo.isColumns?this.project.getColumnColorModel():this.project.getRowColorModel(),axisLabelInfo=morpheus.ChartTool2.getVectorInfo(axisLabel),axisLabelVector=axisLabelInfo.isColumns?dataset.getColumnMetadata().getByName(axisLabelInfo.field):dataset.getRowMetadata().getByName(axisLabelInfo.field),sizeByVector=sizeByInfo.isColumns?dataset.getColumnMetadata().getByName(sizeByInfo.field):dataset.getRowMetadata().getByName(sizeByInfo.field),colorByVector=colorByInfo.isColumns?dataset.getColumnMetadata().getByName(colorByInfo.field):dataset.getRowMetadata().getByName(colorByInfo.field),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("row profile"===chartType||"column profile"===chartType){var $chart=$("
"),myPlot=$chart[0];$chart.appendTo(this.$chart),"column profile"===chartType&&(dataset=new morpheus.TransposedDatasetView(dataset)),this._createProfile({isColumnChart:"column profile"===chartType,axisLabelVector:axisLabelVector,colorByVector:colorByVector,colorModel:colorModel,sizeByVector:sizeByVector,sizeFunction:sizeByScale,myPlot:myPlot,dataset:dataset,config:config,layout:$.extend(!0,{},layout,{showlegend:!0,width:chartWidth,height:chartHeight,margin:{b:80},yaxis:{},xaxis:{}})})}if("row scatter"===chartType||"column scatter"===chartType){var transpose="column scatter"===chartType;if(transpose&&(dataset=new morpheus.TransposedDatasetView(dataset)),dataset.getRowCount()>20)return void $("

Maximum chart size exceeded.

").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:points,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:points,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){$("

Use your own file

").insertAfter(form.$form.find(".form-group:first"));var _this=this,id=_.uniqueId("morpheus");form.$form.append('

');var $sampleDatasets=$('
');form.$form.append($sampleDatasets);new morpheus.SampleDatasets({$el:$sampleDatasets,callback:function(heatMapOptions){form.setValue("file",heatMapOptions.dataset),_this.ok()}})}form.on("change",function(e){var value=e.value;""!==value&&null!=value&&(form.setValue("file",value),_this.ok())})},execute:function(options){var that=this;this.options.file&&(options.input.file=this.options.file);var project=options.project;if("append columns"===options.input.open_file_action||"append"===options.input.open_file_action||"open"===options.input.open_file_action||"overlay"===options.input.open_file_action)(new morpheus.OpenDatasetTool).execute(options);else if("Open dendrogram"===options.input.open_file_action)morpheus.HeatMap.showTool(new morpheus.OpenDendrogramTool(options.input.file),options.controller);else{var controller=options.controller,isAnnotateColumns="Annotate Columns"==options.input.open_file_action,fileOrUrl=options.input.file,dataset=project.getFullDataset(),fileName=morpheus.Util.getFileName(fileOrUrl);if(morpheus.Util.endsWith(fileName,".cls")){var result=morpheus.Util.readLines(fileOrUrl);result.done(function(lines){that.annotateCls(controller,dataset,fileName,isAnnotateColumns,lines)})}else if(morpheus.Util.endsWith(fileName,".gmt"))morpheus.BufferedReader.getArrayBuffer(fileOrUrl,function(err,buf){if(err)throw new Error("Unable to read "+fileOrUrl);var sets=(new morpheus.GmtReader).read(new morpheus.BufferedReader(new Uint8Array(buf)));that.prompt(null,dataset,controller,isAnnotateColumns,sets)});else{var result=morpheus.Util.readLines(fileOrUrl);result.done(function(lines){that.prompt(lines,dataset,controller,isAnnotateColumns,null)})}}},annotateCls:function(controller,dataset,fileName,isColumns,lines){isColumns&&(dataset=morpheus.DatasetUtil.transposedView(dataset));var assignments=(new morpheus.ClsReader).read(lines);if(assignments.length!==dataset.getRowCount())throw new Error("Number of samples in cls file does not match dataset.");for(var vector=dataset.getRowMetadata().add(morpheus.Util.getBaseFileName(fileName)),i=0;ii;i++){var line=lines[i].split(tab),id=line[fileMatchOnColumnIndex],indices=idToIndices.get(id);if(void 0!==indices)for(var nIndices=indices.length,j=0;nheaders>j;j++)for(var token=line[columnIndices[j]],v=vectors[j],r=0;nIndices>r;r++)v.setValue(indices[r],token)}}else _.each(sets,function(set){var name=set.name,members=set.ids,v=dataset.getRowMetadata().add(name);vectors.push(v),_.each(members,function(id){var indices=idToIndices.get(id);if(void 0!==indices)for(var i=0,nIndices=indices.length;nIndices>i;i++)v.setValue(indices[i],name)})});for(var i=0;iGCT 1.3 or GCT 1.2 file name',required:!0},{name:"file_format",type:"radio",options:[{name:"GCT version 1.2",value:"1.2"},{name:"GCT version 1.3",value:"1.3"}],value:"1.3",required:!0}]},execute:function(options){var project=options.project,format=options.input.file_format,fileName=options.input.file_name,dataset=(options.controller,project.getSortedFilteredDataset()),text="1.2"===format?(new morpheus.GctWriter12).write(dataset):(new morpheus.GctWriter).write(dataset),blob=new Blob([text],{type:"text/plain;charset=charset=utf-8"});morpheus.Util.endsWith(fileName.toLowerCase(),".gct")||(fileName+=".gct"),saveAs(blob,fileName,!0)}},morpheus.SaveImageTool=function(){},morpheus.SaveImageTool.prototype={toString:function(){return"Save Image"},gui:function(){return[{name:"file_name",type:"text",required:!0},{name:"format",type:"select",options:["png","svg"],value:"svg",required:!0}]},execute:function(options){var fileName=options.input.file_name,format=options.input.format;morpheus.Util.endsWith(fileName.toLowerCase(),"."+format)||(fileName+="."+format);var controller=options.controller;controller.saveImage(fileName,format)}},morpheus.SimilarityMatrixTool=function(){},morpheus.SimilarityMatrixTool.Functions=[morpheus.Euclidean,morpheus.Jaccard,morpheus.Cosine,morpheus.Pearson,morpheus.Spearman],morpheus.SimilarityMatrixTool.Functions.fromString=function(s){for(var i=0;ii;i++)for(var j=0;i>j;j++){var value=matrix[i][j];d.setValue(i,j,value),d.setValue(j,i,value)}if(!isDistance)for(var i=0;n>i;i++)d.setValue(i,i,1);var metadata=isColumnMatrix?dataset.getColumnMetadata():dataset.getRowMetadata();d.rowMetadataModel=morpheus.MetadataUtil.shallowCopy(metadata),d.columnMetadataModel=morpheus.MetadataUtil.shallowCopy(metadata);var colorScheme;colorScheme=isDistance?{type:"fixed",map:[{value:0,color:"white"},{value:morpheus.DatasetUtil.max(d),color:"red"}]}:{type:"fixed",map:[{value:-1,color:"blue"},{value:0,color:"white"},{value:1,color:"red"}]},new morpheus.HeatMap({colorScheme:colorScheme,name:name,dataset:d,parent:controller,inheritFromParentOptions:{rows:!isColumnMatrix,columns:isColumnMatrix}}),worker.terminate(),window.URL.revokeObjectURL(url)},worker}},morpheus.TransposeTool=function(){},morpheus.TransposeTool.prototype={toString:function(){return"Transpose"},execute:function(options){var project=options.project,controller=options.controller,dataset=new morpheus.TransposedDatasetView(project.getSortedFilteredDataset()),rowMetadataModel=morpheus.MetadataUtil.shallowCopy(dataset.getRowMetadata()),columnMetadataModel=morpheus.MetadataUtil.shallowCopy(dataset.getColumnMetadata());dataset.getRowMetadata=function(){return rowMetadataModel},dataset.getColumnMetadata=function(){return columnMetadataModel};var name=options.input.name||controller.getName();new morpheus.HeatMap({name:name,dataset:dataset,inheritFromParentOptions:{transpose:!0},parent:controller})}},morpheus.WordCloudTool=function(){},morpheus.WordCloudTool.draw=function(options){function draw(words){g.selectAll("text").data(words).enter().append("text").style("font-family","Impact").on("mouseover",function(d){d3.select(this).transition().style("font-size",2*fontSizeScale(d.size)+"px")}).on("mouseout",function(d){d3.select(this).transition().style("font-size",fontSizeScale(d.size)+"px")}).on("click",function(d){options.heatMap.getToolbar().setSearchText({isColumns:options.isColumns,text:d.text.indexOf(" ")?'"'+d.text+'"':d.text})}).style("fill",function(d,i){return fill(i)}).attr("text-anchor","middle").attr("transform",function(d){return"translate("+[d.x,d.y]+")rotate("+d.rotate+")"}).text(function(d){return d.text}).style("font-size",function(d){return"1px"}).transition().duration(1e3).style("font-size",function(d){return fontSizeScale(d.size)+"px"})}var width=options.width,height=options.height,words=options.words,maxSize=options.maxSize,minSize=options.minSize,fill=options.fill||d3.scale.category20b(),fontSizeScale=d3.scale.linear().range([12,24]).domain([minSize,maxSize]).clamp(!0),g=d3.select(options.el).append("svg").attr("width",width).attr("height",height).append("g");g.attr("transform","translate("+[width/2,height/2]+")"),g.style("font-weight","900");var angle=d3.scale.linear().domain([0,0]).range([0,0]).clamp(!0);d3.layout.cloud().spiral("archimedean").size([width,height]).words(words).rotate(function(){return angle(~~(5*Math.random()))}).fontSize(function(d){return d.size}).on("end",draw).start()},morpheus.WordCloudTool.drawTable=function(options){var width=options.width,maxSize=options.maxSize,minSize=options.minSize,words=options.words;words.sort(function(a,b){return a.size===b.size?0:a.sizei;i++)minSize=Math.min(minSize,words[i].size),maxSize=Math.max(maxSize,words[i].size);var fill=function(value){return colorModel.getMappedValue(vector,words[value].text)},$dialog=$('
'),width=960,height=600;$dialog.dialog({resizable:!0,height:height+30,width:width+30}),morpheus.WordCloudTool.draw({minSize:minSize,maxSize:maxSize,isColumns:isColumns,heatMap:controller,el:$dialog[0],width:width,height:height,words:words,fill:fill}),morpheus.WordCloudTool.drawTable({minSize:minSize,maxSize:maxSize,isColumns:isColumns,heatMap:controller,el:$dialog[0],width:width,words:words})}},morpheus.AbstractCanvas=function(offscreen){this.canvas=morpheus.CanvasUtil.createCanvas(),this.lastClip=null,offscreen&&(this.offscreenCanvas=morpheus.CanvasUtil.createCanvas()),this.offset={x:0,y:0}},morpheus.AbstractCanvas.prototype={visible:!0,invalid:!0,scrollX:0,scrollY:0,prefWidth:void 0,prefHeight:void 0,getCanvas:function(){return this.canvas},scrollTop:function(pos){return void 0===pos?this.offset.y:void(this.offset.y=pos)},appendTo:function($el){$(this.canvas).appendTo($el)},scrollLeft:function(pos){return void 0===pos?this.offset.x:void(this.offset.x=pos)},dispose:function(){$(this.canvas).remove(),this.offscreenCanvas=void 0},getPrefWidth:function(){return this.prefWidth},setInvalid:function(invalid){this.invalid=invalid},setBounds:function(bounds){var backingScale=morpheus.CanvasUtil.BACKING_SCALE,canvases=[this.canvas];this.offscreenCanvas&&canvases.push(this.offscreenCanvas),null!=bounds.height&&_.each(canvases,function(canvas){canvas.height=bounds.height*backingScale,canvas.style.height=bounds.height+"px"}),null!=bounds.width&&_.each(canvases,function(canvas){canvas.width=bounds.width*backingScale,canvas.style.width=bounds.width+"px"}),null!=bounds.left&&_.each(canvases,function(canvas){canvas.style.left=bounds.left+"px"}),null!=bounds.top&&_.each(canvases,function(canvas){canvas.style.top=bounds.top+"px"})},paint:function(clip){var canvas=this.canvas,context=canvas.getContext("2d");morpheus.CanvasUtil.resetTransform(context);var width=this.getUnscaledWidth(),height=this.getUnscaledHeight();if(context.clearRect(0,0,width,height),this.prePaint&&(morpheus.CanvasUtil.resetTransform(context),context.translate(this.offset.x,this.offset.y),this.prePaint(clip,context)),morpheus.CanvasUtil.resetTransform(context),this.offscreenCanvas){if(this.invalid){var oc=this.offscreenCanvas.getContext("2d");morpheus.CanvasUtil.resetTransform(oc),context.translate(this.offset.x,this.offset.y),oc.clearRect(0,0,width,height),this.draw(clip,oc)}context.drawImage(this.offscreenCanvas,0,0,width,height)}else this.draw(clip,context);this.postPaint&&(morpheus.CanvasUtil.resetTransform(context),context.translate(this.offset.x,this.offset.y),this.postPaint(clip,context)),this.lastClip=clip,this.invalid=!1},repaint:function(){this.lastClip||(this.lastClip={x:0,y:0,width:this.getUnscaledWidth(),height:this.getUnscaledHeight()}),this.paint(this.lastClip)},draw:function(clip,context){console.log("Not implemented")},getPrefHeight:function(){return this.prefHeight},setPrefWidth:function(prefWidth){this.prefWidth=prefWidth},setPrefHeight:function(prefHeight){this.prefHeight=prefHeight},isVisible:function(){return this.visible},setVisible:function(visible){this.visible!==visible&&(this.visible=visible,this.canvas.style.display=visible?"":"none")},getUnscaledWidth:function(){return this.canvas.width/morpheus.CanvasUtil.BACKING_SCALE},getUnscaledHeight:function(){return this.canvas.height/morpheus.CanvasUtil.BACKING_SCALE},getWidth:function(){return this.canvas.width},getHeight:function(){return this.canvas.height}},morpheus.AbstractColorSupplier=function(){this.fractions=[0,.5,1],this.colors=["blue","white","red"],this.names=null,this.min=0,this.max=1,this.missingColor="#c0c0c0",this.scalingMode=morpheus.HeatMapColorScheme.ScalingMode.RELATIVE,this.stepped=!1,this.sizer=new morpheus.HeatMapSizer,this.conditions=new morpheus.HeatMapConditions},morpheus.AbstractColorSupplier.fromJson=function(json){var cs=json.stepped?new morpheus.SteppedColorSupplier:new morpheus.GradientColorSupplier;return cs.setDiscrete(json.discrete),cs.setScalingMode(json.scalingMode),cs.setMin(json.min),cs.setMax(json.max),cs.setMissingColor(json.missingColor),cs.setFractions({colors:json.colors,fractions:json.fractions,names:json.names}),cs},morpheus.AbstractColorSupplier.prototype={discrete:!1,getSizer:function(){return this.sizer},getConditions:function(){return this.conditions},isDiscrete:function(){return this.discrete},setDiscrete:function(discrete){this.discrete=discrete},createInstance:function(){throw"not implemented"},copy:function(){var c=this.createInstance();return c.discrete=this.discrete,c.setFractions({fractions:this.fractions.slice(0),colors:this.colors.slice(0)}),null!=this.names&&(c.names=this.names.slice(0)),this.sizer&&(c.sizer=this.sizer.copy()),this.conditions&&(c.conditions=this.conditions.copy()),c.scalingMode=this.scalingMode,c.min=this.min,c.max=this.max,c.missingColor=this.missingColor,c},setMissingColor:function(missingColor){this.missingColor=missingColor},getMissingColor:function(){return this.missingColor},getScalingMode:function(){return this.scalingMode},setScalingMode:function(scalingMode){scalingMode!==this.scalingMode&&(scalingMode===morpheus.HeatMapColorScheme.ScalingMode.RELATIVE&&(this.min=0,this.max=1),this.scalingMode=scalingMode)},isStepped:function(){return!1},getColor:function(row,column,value){throw"not implemented"},getColors:function(){return this.colors},getNames:function(){return this.names},getFractions:function(){return this.fractions},getMin:function(){return this.min},getMax:function(){return this.max},setMin:function(min){this.min=min},setMax:function(max){this.max=max},setFractions:function(options){var index=morpheus.Util.indexSort(options.fractions,!0);this.fractions=morpheus.Util.reorderArray(options.fractions,index),this.colors=morpheus.Util.reorderArray(options.colors,index),this.names=options.names?morpheus.Util.reorderArray(options.names,index):null}},morpheus.AbstractComponent=function(){this.lastClip=null;var c=document.createElement("div");c.setAttribute("tabindex","0"),c.style.outline=0,c.style.overflow="hidden",c.style.position="absolute",this.el=c,this.$el=$(c)},morpheus.AbstractComponent.prototype={visible:!0,invalid:!0,prefWidth:void 0,prefHeight:void 0,appendTo:function($el){$(this.el).appendTo($el)},dispose:function(){$(this.el).remove()},getPrefWidth:function(){return this.prefWidth},setInvalid:function(invalid){this.invalid=invalid},setBounds:function(bounds){null!=bounds.left&&this.$el.css("left",bounds.left+"px"),null!=bounds.top&&this.$el.css("top",bounds.top+"px")},paint:function(clip){this.getUnscaledWidth(),this.getUnscaledHeight();this.draw(clip),this.lastClip=clip,this.invalid=!1},repaint:function(){this.lastClip||(this.lastClip={x:0,y:0,width:this.getUnscaledWidth(),height:this.getUnscaledHeight()}),this.paint(this.lastClip)},draw:function(clip){},getPrefHeight:function(){return this.prefHeight},setPrefWidth:function(prefWidth){this.prefWidth=prefWidth},setPrefHeight:function(prefHeight){this.prefHeight=prefHeight},isVisible:function(){return this.visible},setVisible:function(visible){this.visible!==visible&&(this.visible=visible,this.el.style.display=visible?"":"none")},getUnscaledWidth:function(){return this.$el.width()},getUnscaledHeight:function(){return this.$el.height()},getWidth:function(){return this.$el.width()},getHeight:function(){return this.$el.height()}},morpheus.AbstractDendrogram=function(controller,tree,positions,project,type){morpheus.AbstractCanvas.call(this,!0),this._overviewHighlightColor="#d8b365",this._searchHighlightColor="#e41a1c",this._selectedNodeColor=type===morpheus.AbstractDendrogram.Type.COLUMN?"#377eb8":"#984ea3",this.tree=tree,this.type=type,this.squishEnabled=!1,this.controller=controller,this.positions=positions,this.project=project;var $label=$("");$label.addClass("label label-info"),$label.css("position","absolute"),this.$label=$label;var $squishedLabel=$("");$squishedLabel.addClass("label label-default"),$squishedLabel.css("position","absolute").css("top",18),this.$squishedLabel=$squishedLabel,this.$label=$label,this.cutHeight=this.tree.maxHeight,this.drawLeafNodes=!0,this.lineWidth=.7,this.selectedNodeIds={},this.selectedRootNodeIdToNode={},this.nodeIdToHighlightedPathsToRoot={};var _this=this;this.defaultStroke="rgb(0,0,0)";var mouseMove=function(event){if(!morpheus.CanvasUtil.dragging){var position=morpheus.CanvasUtil.getMousePosWithScroll(event.target,event,_this.lastClip.x,_this.lastClip.y);if(_this.isDragHotSpot(position))_this.canvas.style.cursor=_this.getResizeCursor();else{var nodes;if(_this.getNodes)nodes=_this.getNodes(position);else{var node=_this.getNode(position);node&&(nodes=[node])}if(null!=nodes){nodes.sort(function(a,b){return a.name=radius?_this.tree.maxHeight:Math.max(0,Math.min(_this.tree.maxHeight,_this.scale.invert(radius)))}cutHeight>=_this.tree.maxHeight?_this.resetCutHeight():_this.setCutHeight(cutHeight),event.preventDefault()}}))},morpheus.AbstractDendrogram.Type={COLUMN:0,ROW:1,RADIAL:2},morpheus.AbstractDendrogram.prototype={setSelectedNode:function(node,add){var viewIndices,_this=this,selectionModel=this.type===morpheus.AbstractDendrogram.Type.COLUMN?this.project.getColumnSelectionModel():this.project.getRowSelectionModel();if(null==node)_this.selectedNodeIds={},_this.selectedRootNodeIdToNode={},viewIndices=new morpheus.Set;else if(add?viewIndices=selectionModel.getViewIndices():(viewIndices=new morpheus.Set,_this.selectedNodeIds={},_this.selectedRootNodeIdToNode={}),null!=node){if(void 0===node.children){var contains=_this.nodeIdToHighlightedPathsToRoot[node.id];add||(_this.nodeIdToHighlightedPathsToRoot={}),contains?delete _this.nodeIdToHighlightedPathsToRoot[node.id]:_this.nodeIdToHighlightedPathsToRoot[node.id]=node}else _this.selectedRootNodeIdToNode[node.id]=node,morpheus.AbstractDendrogram.dfs(node,function(d){return _this.selectedNodeIds[d.id]=!0,!0});for(var i=node.minIndex;i<=node.maxIndex;i++)viewIndices.add(i)}_this.trigger("nodeSelectionChanged",_this.selectedRootNodeIdToNode),selectionModel.setViewIndices(viewIndices,!0),_this.repaint()},getPathStroke:function(node){return this.selectedNodeIds[node.id]?this._selectedNodeColor:this.defaultStroke},getNodeFill:function(node){return this.selectedRootNodeIdToNode[node.id]?this._selectedNodeColor:node.search?this._searchHighlightColor:void 0!==node.info?this._overviewHighlightColor:void 0},resetCutHeight:function(){this.positions.setSquishedIndices(null),this.type===morpheus.AbstractDendrogram.Type.COLUMN?this.project.setGroupColumns([],!0):this.project.setGroupRows([],!0),this.$label.text(""),this.$squishedLabel.text("");var dataset=this.project.getSortedFilteredDataset(),clusterIdVector=this.type===morpheus.AbstractDendrogram.Type.COLUMN?dataset.getColumnMetadata().getByName("dendrogram_cut"):dataset.getRowMetadata().getByName("dendrogram_cut");if(clusterIdVector)for(var i=0,size=clusterIdVector.size();size>i;i++)clusterIdVector.setValue(i,NaN)},setCutHeight:function(height){this.cutHeight=height;for(var squishedIndices={},clusterNumber=0,nsquished=0,squishEnabled=this.squishEnabled,roots=morpheus.AbstractDendrogram.cutAtHeight(this.tree.rootNode,this.cutHeight),dataset=this.project.getSortedFilteredDataset(),clusterIdVector=this.type===morpheus.AbstractDendrogram.Type.COLUMN?dataset.getColumnMetadata().add("dendrogram_cut"):dataset.getRowMetadata().add("dendrogram_cut"),i=0,nroots=roots.length;nroots>i;i++){var clusterId,root=roots[i],minChild=morpheus.AbstractDendrogram.getDeepestChild(root,!0),maxChild=morpheus.AbstractDendrogram.getDeepestChild(root,!1);squishEnabled&&minChild.index===maxChild.index?(squishedIndices[minChild.index]=!0,clusterId=-2,nsquished++):(clusterNumber++,clusterId=clusterNumber);for(var j=minChild.index;j<=maxChild.index;j++)clusterIdVector.setValue(j,clusterId)}if(this.$label.text(clusterNumber+" cluster"+morpheus.Util.s(clusterNumber)),nsquished>0?this.$squishedLabel.text(nsquished+" squished"):this.$squishedLabel.text(""),squishEnabled&&this.positions.setSquishedIndices(squishedIndices),-1===this.controller.getTrackIndex(clusterIdVector.getName(),this.type===morpheus.AbstractDendrogram.Type.COLUMN)){var settings={discrete:!0,discreteAutoDetermined:!0,renderMethod:{}};settings.renderMethod[morpheus.VectorTrack.RENDER.COLOR]=!0,this.controller.addTrack(clusterIdVector.getName(),this.type===morpheus.AbstractDendrogram.Type.COLUMN,settings)}this.type===morpheus.AbstractDendrogram.Type.COLUMN?this.project.setGroupColumns([new morpheus.SortKey(clusterIdVector.getName(),morpheus.SortKey.SortOrder.UNSORTED)],!0):this.project.setGroupRows([new morpheus.SortKey(clusterIdVector.getName(),morpheus.SortKey.SortOrder.UNSORTED)],!0)},dispose:function(){var $c=$(this.canvas);$c.off("mousemove.morpheus mouseout.morpheus mouseenter.morpheus contextmenu.morpheus"),$c.remove(),this.$label.remove(),this.$squishedLabel.remove(),this.hammer.destroy(),this.canvas=null,this.$label=null,this.$squishedLabel=null,this.hammer=null},isCut:function(){return this.cutHeightmaxIndex)){var nodeFill=this.getNodeFill(node);void 0!==nodeFill&&(context.fillStyle=nodeFill,this.drawNode(context,node)),context.strokeStyle=this.getPathStroke(node);var children=node.children;if(void 0!==children){this.drawNodePath(context,node,minIndex,maxIndex);for(var i=0,nchildren=children.length;nchildren>i;i++)this.drawDFS(context,children[i],minIndex,maxIndex)}}}},morpheus.AbstractDendrogram.setIndices=function(root){var setIndex=function(node){for(var children=node.children,maxIndex=children[0].maxIndex,minIndex=children[0].minIndex,i=1,length=children.length;length>i;i++){var child=children[i];minIndex=Math.min(minIndex,child.minIndex),maxIndex=Math.max(maxIndex,child.maxIndex)}node.maxIndex=maxIndex,node.minIndex=minIndex},counter=0,visit=function(node,callback){var n,children=node.children;if(children&&(n=children.length))for(var i=-1;++inode.children[node.children.length-1].index?0:node.children.length-1,node=node.children[index]}},morpheus.AbstractDendrogram.dfs=function(node,callback,childrenAccessor){if(void 0===childrenAccessor&&(childrenAccessor=function(n){return n.children}),callback(node)){var n,children=childrenAccessor(node);if(children&&(n=children.length))for(var i=-1;++ii;i++){var copy=$.extend({},children[i]);copy.parent=node,newChildren.push(copy)}node.children=newChildren;for(var i=0,n=newChildren.length;n>i;i++)recurse(newChildren[i])}else node.index=counter,node.minIndex=counter,node.maxIndex=counter,counter++}var counter=0,rootNode=$.extend({},tree.rootNode);return rootNode.parent=void 0,recurse(rootNode),{nLeafNodes:tree.nLeafNodes,maxDepth:tree.maxDepth,rootNode:rootNode}},morpheus.AbstractDendrogram.collapseAtDepth=function(rootNode,maxDepth){morpheus.AbstractDendrogram.dfs(rootNode,function(d){return d.collapsedChildren&&(d.children=d.collapsedChildren,d.collapsedChildren=void 0),!0}),morpheus.AbstractDendrogram.dfs(rootNode,function(d){var depth=d.depth;return depth>maxDepth?(d.collapsedChildren=d.children,d.children=void 0,!1):!0})},morpheus.AbstractDendrogram.setNodeDepths=function(rootNode){function recurse(node,depth){var children=node.children;if(node.depth=depth,max=Math.max(depth,max),void 0!==children)for(var i=-1,j=depth+1,n=children.length;++imax&&(max=n.depth,maxNode=n)}),maxNode},morpheus.AbstractDendrogram.search=function(rootNode,searchText){var predicates,tokens=morpheus.Util.getAutocompleteTokens(searchText),clearSearch=!1,nmatches=0;if(null==tokens||0==tokens.length)clearSearch=!0,morpheus.AbstractDendrogram.dfs(rootNode,function(node){return node.search=!1,!0}),nmatches=-1;else{predicates=morpheus.Util.createSearchPredicates({tokens:tokens});var npredicates=predicates.length;morpheus.AbstractDendrogram.dfs(rootNode,function(node){var matches=!1;if(node.info)searchLabel:for(var name in node.info){var vals=node.info[name];if(node.info)for(var p=0;npredicates>p;p++)for(var predicate=predicates[p],i=0,nvals=vals.length;nvals>i;i++)if(predicate.accept(vals[i])){matches=!0;break searchLabel}}return node.search=matches,matches&&nmatches++,!0})}return nmatches},morpheus.AbstractDendrogram.squishNonSearchedNodes=function(heatMap,isColumns){isColumns?heatMap.getHeatMapElementComponent().getColumnPositions().setSize(13):heatMap.getHeatMapElementComponent().getRowPositions().setSize(13);var expandedLeafNodes={},dendrogram=isColumns?heatMap.columnDendrogram:heatMap.rowDendrogram;morpheus.AbstractDendrogram.dfs(dendrogram.tree.rootNode,function(node){for(var i=node.minIndex;i<=node.maxIndex;i++)node.search&&(expandedLeafNodes[i]=!0);return!0});var clusterIds=[],previous=expandedLeafNodes[0],squishedIndices={};previous||(squishedIndices[0]=!0);var clusterNumber=0;clusterIds.push(clusterNumber);for(var i=1,nleaves=dendrogram.tree.leafNodes.length;nleaves>i;i++){var expanded=expandedLeafNodes[i];expanded!==previous&&(clusterNumber++,previous=expanded),expanded||(squishedIndices[i]=!0),clusterIds.push(clusterNumber)}isColumns?(heatMap.getHeatMapElementComponent().getColumnPositions().setSquishedIndices(squishedIndices),heatMap.getProject().setGroupColumns([new morpheus.SpecifiedGroupByKey(clusterIds)],!1)):(heatMap.getHeatMapElementComponent().getRowPositions().setSquishedIndices(squishedIndices),heatMap.getProject().setGroupRows([new morpheus.SpecifiedGroupByKey(clusterIds)],!1))},morpheus.AbstractDendrogram.getLeafNodes=function(rootNode){var leafNodes=[];return morpheus.AbstractDendrogram.dfs(rootNode,function(node){return void 0===node.children&&leafNodes.push(node),!0}),leafNodes},morpheus.Util.extend(morpheus.AbstractDendrogram,morpheus.AbstractCanvas),morpheus.Util.extend(morpheus.AbstractDendrogram,morpheus.Events),morpheus.CanvasUtil=function(){},morpheus.CanvasUtil.dragging=!1,morpheus.CanvasUtil.measureScrollbar=function(){var $c=$("
").appendTo("body"),dim={width:$c.width()-$c[0].clientWidth,height:$c.height()-$c[0].clientHeight};return $c.remove(),dim},morpheus.CanvasUtil.FONT_NAME='"Helvetica Neue",Helvetica,Arial,sans-serif',morpheus.CanvasUtil.FONT_COLOR="rgb(34, 34, 34)",morpheus.CanvasUtil.getPreferredSize=function(c){var size=c.getPreferredSize(),prefWidth=c.getPrefWidth(),prefHeight=c.getPrefHeight();return void 0!==prefWidth&&(size.width=prefWidth),void 0!==prefHeight&&(size.height=prefHeight),size},morpheus.CanvasUtil.BACKING_SCALE=1,"undefined"!=typeof window&&"devicePixelRatio"in window&&window.devicePixelRatio>1&&(morpheus.CanvasUtil.BACKING_SCALE=window.devicePixelRatio),morpheus.CanvasUtil.setBounds=function(canvas,bounds){var backingScale=morpheus.CanvasUtil.BACKING_SCALE;null!=bounds.height&&(canvas.height=bounds.height*backingScale,canvas.style.height=bounds.height+"px"),null!=bounds.width&&(canvas.width=bounds.width*backingScale,canvas.style.width=bounds.width+"px"),null!=bounds.left&&(canvas.style.left=bounds.left+"px"),null!=bounds.top&&(canvas.style.top=bounds.top+"px")},morpheus.CanvasUtil.drawShape=function(context,shape,x,y,size2){0>size2||(context.beginPath(),"minus"===shape?(context.arc(x,y,size2,0,2*Math.PI,!1),context.moveTo(x-size2,y),context.lineTo(x+size2,y)):"circle"===shape?context.arc(x,y,size2,0,2*Math.PI,!1):"square"===shape?context.rect(x-size2,y-size2,2*size2,2*size2):"plus"===shape?(context.moveTo(x,y-size2),context.lineTo(x,y+size2),context.moveTo(x-size2,y),context.lineTo(x+size2,y)):"x"===shape?(context.moveTo(x-size2,y-size2),context.lineTo(x+size2,y+size2),context.moveTo(x+size2,y-size2),context.lineTo(x-size2,y+size2)):"asterisk"===shape?(context.moveTo(x-size2,y-size2),context.lineTo(x+size2,y+size2),context.moveTo(x+size2,y-size2),context.lineTo(x-size2,y+size2),context.moveTo(x,y-size2),context.lineTo(x,y+size2)):"diamond"===shape?(context.moveTo(x,y-size2),context.lineTo(x+size2,y),context.lineTo(x,y+size2),context.lineTo(x-size2,y),context.lineTo(x,y-size2)):"triangle-up"===shape?(context.moveTo(x,y-size2),context.lineTo(x+size2,y+size2),context.lineTo(x-size2,y+size2),context.lineTo(x,y-size2)):"triangle-down"===shape?(context.moveTo(x,y+size2),context.lineTo(x-size2,y-size2),context.lineTo(x+size2,y-size2),context.lineTo(x,y+size2)):"triangle-left"===shape?(context.moveTo(x-size2,y),context.lineTo(x+size2,y-size2),context.lineTo(x+size2,y+size2),context.lineTo(x-size2,y)):"triangle-right"===shape&&(context.moveTo(x+size2,y),context.lineTo(x-size2,y+size2),context.lineTo(x-size2,y-size2),context.lineTo(x+size2,y)),context.stroke())},morpheus.CanvasUtil.drawLine=function(context,x1,y1,x2,y2){context.beginPath(),context.moveTo(x1,y1),context.lineTo(x2,y2),context.stroke()},morpheus.CanvasUtil.resetTransform=function(context){context.setTransform(1,0,0,1,0,0),1!==morpheus.CanvasUtil.BACKING_SCALE&&context.scale(morpheus.CanvasUtil.BACKING_SCALE,morpheus.CanvasUtil.BACKING_SCALE)},morpheus.CanvasUtil.bezierCurveTo=function(context,start,end){var m1=(start[1]+end[1])/2;context.beginPath(),context.moveTo(start[0],start[1]),context.bezierCurveTo(start[0],m1,end[0],m1,end[0],end[1]),context.stroke()},morpheus.CanvasUtil.createCanvas=function(){var $c=$("");return $c.attr("tabindex","0"),$c.css({cursor:"default",outline:0,overflow:"hidden",position:"absolute","z-index":1}),$c[0]},morpheus.CanvasUtil.getHeaderStringWidth=function(context,s){return context.font="14px "+morpheus.CanvasUtil.FONT_NAME,context.measureText(s).width+18},morpheus.CanvasUtil.getVectorStringWidth=function(context,vector,positions,end){if(positions.getSize()<6)return 0;var fontSize=Math.min(24,positions.getSize()-2);if(0>=fontSize)return 0;context.font=fontSize+"px "+morpheus.CanvasUtil.FONT_NAME;for(var toString=morpheus.VectorTrack.vectorToString(vector),maxWidth=0,i=0,n=0>=end?vector.size():Math.min(end,vector.size());n>i;i++){var value=vector.getValue(i);if(null!=value&&""!=value){value=toString(value);var width=context.measureText(value).width;width>maxWidth&&(maxWidth=width)}}return maxWidth>0?maxWidth+2:maxWidth},morpheus.CanvasUtil.clipString=function(context,string,availTextWidth){var textWidth=context.measureText(string).width;if(availTextWidth>=textWidth)return string;var clipString="...";if(availTextWidth-=context.measureText(clipString).width,0>=availTextWidth)return clipString;for(var width=0,nChars=0,stringLength=string.length;stringLength>nChars;nChars++)if(width+=context.measureText(string[nChars]).width,width>availTextWidth){string=string.substring(0,nChars);break}return string+clipString},morpheus.CanvasUtil.toSVG=function(drawable,file){var totalSize={width:drawable.getWidth(),height:drawable.getHeight()},context=new C2S(totalSize.width,totalSize.height);context.save(),drawable.draw({x:0,y:0,width:totalSize.width,height:totalSize.height},context),context.restore();var svg=context.getSerializedSvg(),blob=new Blob([svg],{type:"text/plain;charset=utf-8"});saveAs(blob,file)},morpheus.CanvasUtil.getMousePos=function(element,event,useDelta){return morpheus.CanvasUtil.getMousePosWithScroll(element,event,0,0,useDelta)},morpheus.CanvasUtil.getClientXY=function(event,useDelta){var clientX,clientY;return event.pointers?event.pointers.length>0?(clientX=event.pointers[0].clientX-(useDelta?event.deltaX:0),clientY=event.pointers[0].clientY-(useDelta?event.deltaY:0)):(clientX=event.srcEvent.clientX-(useDelta?event.deltaX:0),clientY=event.srcEvent.clientY-(useDelta?event.deltaY:0)):(clientX=event.clientX,clientY=event.clientY),{x:clientX,y:clientY}},morpheus.CanvasUtil.getMousePosWithScroll=function(element,event,scrollX,scrollY,useDelta){return morpheus.CanvasUtil._getMousePosWithScroll(element,scrollX,scrollY,morpheus.CanvasUtil.getClientXY(event,useDelta))},morpheus.CanvasUtil._getMousePosWithScroll=function(element,scrollX,scrollY,clientXY){var rect=element.getBoundingClientRect();return{x:clientXY.x-rect.left+scrollX,y:clientXY.y-rect.top+scrollY}},morpheus.CheckBoxList=function(options){var _this=this,set=options.set||new morpheus.Set;options=$.extend(!0,{},{height:"150px",showHeader:!1,select:!1,search:!0,checkBoxSelectionOnTop:!1,rowHeader:function(item){var header=[];return header.push(' "),header.push(""),header.join("")}},options),options=morpheus.Table.createOptions(options),1===options.columns.length&&(options.maxWidth=583);for(var idColumn=options.columns[0],i=0;i'),html.push('"),html.push(''),html.push("");var $checkBoxEl=$(html.join(""));table.$header.find("[name=left]").html($checkBoxEl);var $checkBoxResults=$checkBoxEl.find("[name=checkBoxResults]"),$selectAll=$checkBoxEl.find("[name=selectAll]"),$selectNone=$checkBoxEl.find("[name=selectNone]");$selectAll.on("click",function(e){for(var items=table.getItems(),i=0,nitems=items.length;nitems>i;i++)set.add(_this.getter(items[i]));_this.table.trigger("checkBoxSelectionChanged",{source:_this,set:set}),e.preventDefault(),_this.table.redraw()}),$checkBoxEl.find("[name=invertSel]").on("click",function(e){for(var items=table.getItems(),i=0,nitems=items.length;nitems>i;i++){var val=_this.getter(items[i]);set.has(val)?set.remove(val):set.add(val)}_this.table.trigger("checkBoxSelectionChanged",{source:_this,set:set}),e.preventDefault(),_this.table.redraw()}),$selectNone.on("click",function(e){for(var items=table.getItems(),i=0,nitems=items.length;nitems>i;i++)set.remove(_this.getter(items[i]));_this.table.trigger("checkBoxSelectionChanged",{source:_this,set:set}),e.preventDefault(),_this.table.redraw()}),this.set=set,this.table=table,$checkBoxResults.html("selected "+morpheus.Util.intFormat(set.size())+" of "+morpheus.Util.intFormat(table.getAllItemCount()));this.table.on("checkBoxSelectionChanged",function(){$checkBoxResults.html("selected "+morpheus.Util.intFormat(set.size())+" of "+morpheus.Util.intFormat(table.getAllItemCount())),_this.table.redraw()}),table.on("click",function(e){var $target=$(e.target),item=table.getItems()[e.row],value=_this.getter(item);$target.is(".morpheus-hover-show")?(set.clear(),set.add(value),_this.table.trigger("checkBoxSelectionChanged",{source:_this,set:set})):(!options.select||$target.is("[type=checkbox]")&&"toggle"===$target.attr("name"))&&(set.has(value)?set.remove(value):set.add(value),_this.table.trigger("checkBoxSelectionChanged",{source:_this,set:set}))})},morpheus.CheckBoxList.prototype={searchWithPredicates:function(predicates){this.table.searchWithPredicates(predicates)},autocomplete:function(tokens,cb){this.table.autocomplete(tokens,cb)},setHeight:function(height){this.table.setHeight(height)},resize:function(){this.table.resize()},setSearchVisible:function(visible){this.table.setSearchVisible(visible)},getSelectedRows:function(){return this.table.getSelectedRows()},getSelectedItems:function(){return this.table.getSelectedItems()},setSelectedRows:function(rows){this.table.setSelectedRows(rows)},getItems:function(items){return this.table.getItems()},getAllItemCount:function(){return this.table.getAllItemCount()},getFilteredItemCount:function(){return this.table.getFilteredItemCount()},setFilter:function(f){this.table.setFilter(f)},redraw:function(){this.table.redraw()},getSelection:function(){return this.set},clearSelection:function(values){this.set.clear(),this.table.redraw()},setValue:function(values){this.setSelectedValues(values)},setSelectedValues:function(values){if(this.set.clear(),morpheus.Util.isArray(values))for(var i=0;ii;i++)context.lineTo(x[i],y[i]);context.stroke()}},morpheus.Util.extend(morpheus.ColumnDendrogram,morpheus.AbstractDendrogram),morpheus.ConditionalRenderingUI=function(heatmap){var _this=this;this.heatmap=heatmap;var $div=$('
');$div.on("click","[name=add]",function(e){var $this=$(this),$row=$this.closest(".morpheus-entry"),index=$row.index(),condition={series:null,color:"rgb(0,0,0)",shape:null,accept:function(val){return!1}};heatmap.heatmap.getColorScheme().getConditions().insert(index,condition),$row.after(_this.add(condition)),e.preventDefault()}),$div.on("click","[name=delete]",function(e){var $this=$(this),$row=$this.closest(".morpheus-entry"),index=$row.index()-1;heatmap.heatmap.getColorScheme().getConditions().remove(index),heatmap.revalidate(),$row.remove(),e.preventDefault()});var html=[];html.push('
'),html.push('
'),html.push(''),html.push("
"),html.push("
"),$div.append(html.join("")),this.$div=$div,heatmap.heatmap.getColorScheme().getConditions().getConditions().forEach(function(c){_this.add(c).appendTo($div)})},morpheus.ConditionalRenderingUI.prototype={add:function(condition){function updateAccept(){var v1=parseFloat($($v1).val());isNaN(v1)&&(v1=-Number.MAX_VALUE);var v2=parseFloat($($v2).val());isNaN(v2)&&(v2=Number.MAX_VALUE);var v1Op=$v1Op.val(),v2Op=$v2Op.val(),gtf="gt"===v1Op?function(val){return val>v1}:function(val){return val>=v1},ltf="lt"===v2Op?function(val){return v2>val}:function(val){return v2>=val};condition.v1=v1,condition.v2=v2,condition.v1Op=v1Op,condition.v2Op=v2Op,condition.accept=function(val){return gtf(val)&<f(val)},_this.heatmap.revalidate()}var _this=this,html=[];html.push('
'),html.push('
'),html.push("
"),html.push('
'),html.push(''),html.push('"),html.push("
"),html.push('
'),html.push(''),html.push(''),html.push(''),html.push('and'),html.push(''),html.push(''),html.push("
"),html.push('
'),html.push('');var shapeField=new morpheus.ShapeField(["circle","square","diamond","triangle-up","triangle-down","triangle-left","triangle-right"]);html.push('
'),html.push("
"),html.push('
'),html.push(''),html.push(''),html.push("
"),html.push("
"),html.push('
'),html.push('
'),html.push('Remove'),html.push("
"),html.push("
"),html.push("
");var $el=$(html.join(""));shapeField.$el.appendTo($el.find("[name=shapeHolder]"));var $color=$el.find("[name=color]"),$series=$el.find("[id=cond_series]"),$v1=$el.find("[name=v1]"),$v2=$el.find("[name=v2]"),$v1Op=$el.find("[name=lower]"),$v2Op=$el.find("[name=upper]");return $color.val(condition.color),$series.val(condition.series),shapeField.setShapeValue(condition.shape),$v1.val(condition.v1),$v2.val(condition.v2),$v1Op.val(condition.v1Op),$v2Op.val(condition.v2Op),$v1Op.on("change",function(e){updateAccept()}),$v2Op.on("change",function(e){updateAccept()}),$v1.on("keyup",_.debounce(function(e){updateAccept()},100)),$v2.on("keyup",_.debounce(function(e){updateAccept()},100)),$color.on("change",function(e){condition.color=$(this).val(),_this.heatmap.revalidate()}),shapeField.on("change",function(e){condition.shape=e.shape,_this.heatmap.revalidate()}),$series.on("change",function(e){condition.series=$(this).val(),_this.heatmap.revalidate()}),condition.series=$series.val(),$el}},morpheus.DiscreteColorSchemeChooser=function(options){var formBuilder=new morpheus.FormBuilder,map=options.colorScheme.scale,html=['"),formBuilder.append({name:"selected_value",type:"custom",value:html.join("")});var $select=formBuilder.$form.find("[name=colorPicker]");formBuilder.append({col:"col-xs-2",name:"selected_color",type:"color"});var selectedVal=$select.val(),_this=this,$color=formBuilder.$form.find("[name=selected_color]");$color.val(map.get(selectedVal)),$color.on("change",function(e){var color=$(this).val();map.set(selectedVal,color),_this.trigger("change",{value:selectedVal,color:color})}),$select.selectpicker().change(function(){selectedVal=$select.val();var c=map.get(selectedVal);$color.val(c)}),this.$div=formBuilder.$form},morpheus.DiscreteColorSchemeChooser.prototype={dispose:function(){}},morpheus.Util.extend(morpheus.DiscreteColorSchemeChooser,morpheus.Events),morpheus.DiscreteColorSupplier=function(){this.colorMap=new morpheus.Map,this.hiddenValue=0,this.hiddenValues=new morpheus.Set,morpheus.AbstractColorSupplier.call(this),this.scalingMode=morpheus.HeatMapColorScheme.ScalingMode.FIXED},morpheus.DiscreteColorSupplier.prototype={createInstance:function(){return new morpheus.DiscreteColorSupplier},setColorMap:function(array){this.colorMap=new morpheus.Map,this.colors=[],this.fractions=[],this.names=[],this.min=Number.MAX_VALUE,this.max=-Number.MAX_VALUE;for(var i=0;i'),html.push('
'),html.push('
'),html.push('
'),html.push('
'),html.push("
"),html.push('
'),html.push('
'),html.push('
'),html.push('
'),html.push("
"),html.push("
"),this.$el=$(html.join(""));var _this=this;this.$el.find("[name=add]").on("click",function(){_this.addSelected()}),this.$el.find("[name=remove]").on("click",function(){_this.removeSelected()}),this.$el.find("[name=up]").on("click",function(){_this.moveUp()}),this.$el.find("[name=down]").on("click",function(){_this.moveDown()}),this.left=this.$el.find("[name=left]")[0],this.right=this.$el.find("[name=right]")[0];for(var i=0;i'); this.$div=$div,$div.append(this.addBase());var $filterMode=$div.find("[name=filterMode]");$filterMode.on("change",function(e){var isAndFilter=$filterMode.prop("checked");(isColumns?project.getColumnFilter():project.getRowFilter()).setAnd(isAndFilter),isColumns?_this.project.setColumnFilter(_this.project.getColumnFilter(),!0):_this.project.setRowFilter(_this.project.getRowFilter(),!0),e.preventDefault()}),$div.on("click","[name=add]",function(e){var $this=$(this),$row=$this.closest(".morpheus-entry"),index=$row.index(),newFilter=new morpheus.AlwaysTrueFilter;(isColumns?project.getColumnFilter():project.getRowFilter()).insert(index,newFilter),$row.after(_this.add(newFilter)),e.preventDefault()}),$div.on("click","[name=delete]",function(e){var $this=$(this),$row=$this.closest(".morpheus-entry"),index=$row.index()-1;(isColumns?project.getColumnFilter():project.getRowFilter()).remove(index),$row.remove(),isColumns?_this.project.setColumnFilter(_this.project.getColumnFilter(),!0):_this.project.setRowFilter(_this.project.getRowFilter(),!0),e.preventDefault()}),$div.on("submit","form",function(e){$(this);e.preventDefault()}),$div.on("change","[name=by]",function(e){var $this=$(this),fieldName=$this.val(),$row=$this.closest(".morpheus-entry");$row.index()-1;_this.createFilter({fieldName:fieldName,$div:$this}),isColumns?_this.project.setColumnFilter(_this.project.getColumnFilter(),!0):_this.project.setRowFilter(_this.project.getRowFilter(),!0)});for(var combinedFilter=isColumns?project.getColumnFilter():project.getRowFilter(),filters=combinedFilter.getFilters?combinedFilter.getFilters():[],i=0;iRange of values
"),html.push(' '),html.push(' '),html.push('
Switch to top filter');var $form=$(html.join(""));$form.appendTo($ui),$ui.find("[name=switch]").on("click",function(e){e.preventDefault();for(var newFilter=morpheus.FilterUI.topFilter(project,name,isColumns,$ui),index=-1,filters=isColumns?project.getColumnFilter().getFilters():project.getRowFilter().getFilters(),i=0;iTop
"),html.push(''),html.push(' '),html.push('
Switch to range filter');var $form=$(html.join(""));$form.appendTo($ui);var $n=$ui.find("[name=n]"),$direction=$ui.find("[name=direction]");if($ui.find("[name=switch]").on("click",function(e){e.preventDefault();for(var newFilter=morpheus.FilterUI.rangeFilter(project,name,isColumns,$ui),index=-1,filters=isColumns?project.getColumnFilter().getFilters():project.getRowFilter().getFilters(),i=0;i'),html.push('
'),html.push('
'),html.push("
"),html.push('
'),html.push(''),html.push("
"),html.push(""),html.join("")},add:function(filter){var project=this.project,isColumns=this.isColumns,fields=morpheus.MetadataUtil.getMetadataNames(isColumns?project.getFullDataset().getColumnMetadata():project.getFullDataset().getRowMetadata()),html=[];html.push('
'),html.push('
'),html.push(""),html.push('"),html.push("
"),html.push('
'),html.push('
'),html.push("
"),html.push('
'),html.push('
'),html.push('Remove'),html.push("
"),html.push("
"),html.push("
"),html.join("")}},morpheus.FormBuilder=function(options){var that=this;this.prefix=_.uniqueId("form"),this.$form=$(""),this.$form.attr("role","form").attr("id",this.prefix),this.vertical=options&&options.vertical,this.vertical?(this.labelClass="control-label",this.titleClass="control-label"):(this.titleClass="col-xs-12 control-label",this.labelClass="col-xs-4 control-label",this.$form.addClass("form-horizontal")),this.$form.on("submit",function(e){e.preventDefault()}),this.$form.on("dragover",function(e){var node=$(e.originalEvent.srcElement).parent().parent().prev();node.is("select")&&node.hasClass("file-input")&&($(e.originalEvent.srcElement).parent().css("border","1px solid black"),e.preventDefault(),e.stopPropagation())}).on("dragenter",function(e){var node=$(e.originalEvent.srcElement).parent().parent().prev();node.is("select")&&node.hasClass("file-input")&&($(e.originalEvent.srcElement).parent().css("border","1px solid black"),e.preventDefault(),e.stopPropagation())}).on("dragleave",function(e){var node=$(e.originalEvent.srcElement).parent().parent().prev();node.is("select")&&node.hasClass("file-input")&&($(e.originalEvent.srcElement).parent().css("border",""),e.preventDefault(),e.stopPropagation())}).on("drop",function(e){var node=$(e.originalEvent.srcElement).parent().parent().prev();if(node.is("select")&&node.hasClass("file-input")){var isMultiple=node.data("multiple");$(e.originalEvent.srcElement).parent().css("border","");var name=node.attr("name");if(name=name.substring(0,name.length-"_picker".length),e.originalEvent.dataTransfer)if(e.originalEvent.dataTransfer.files.length){e.preventDefault(),e.stopPropagation();var files=e.originalEvent.dataTransfer.files;that.setValue(name,isMultiple?files:files[0]),that.trigger("change",{name:name,value:files[0]})}else{var url=e.originalEvent.dataTransfer.getData("URL");e.preventDefault(),e.stopPropagation(),that.setValue(name,isMultiple?[url]:url),that.trigger("change",{name:name,value:url})}}})},morpheus.FormBuilder.showProgressBar=function(options){var content=[];content.push('
'),content.push('
'),content.push('
'),content.push('
'),content.push("
"),content.push('
'),content.push(''),content.push("
"),content.push("
"),options.subtitle&&(content.push('
'),content.push('

'),content.push(options.subtitle),content.push("

"),content.push("
")),content.push("
");var $content=$(content.join(""));return $content.find("[name=stop]").on("click",function(e){options.stop(),e.preventDefault()}),morpheus.FormBuilder.showInDraggableDiv({title:options.title,$content:$content})},morpheus.FormBuilder.showInDraggableDiv=function(options){var width=options.width||"300px",html=[];html.push('
'),html.push('

'+options.title+"

"),html.push('
'),html.push("
");var $div=$(html.join("")),$content=$div.find("[name=content]");return $div.find("[name=header]").on("dblclick",function(){"none"===$content.css("display")?$content.css("display",""):$content.css("display","none")}),options.$content.appendTo($content),$div.css("left",$(window).width()/2-$content.outerWidth()/2),$div.draggable({handle:"[name=header]",containment:"document"}),$div.appendTo($(document.body)),$div},morpheus.FormBuilder.promptForDataset=function(cb){var formBuilder=new morpheus.FormBuilder;formBuilder.append({name:"file",value:"",type:"file",required:!0,help:morpheus.DatasetUtil.DATASET_FILE_FORMATS});var $modal;formBuilder.on("change",function(e){var value=e.value;""!==value&&null!=value&&($modal.modal("hide"),$modal.remove(),cb(value))}),$modal=morpheus.FormBuilder.showInModal({title:"Dataset",html:formBuilder.$form,close:!1})},morpheus.FormBuilder.showInModal=function(options){var $div=morpheus.FormBuilder._showInModal({z:options.z,title:options.title,html:options.html,footer:options.close?'":null,onClose:options.callback,backdrop:options.backdrop,size:options.size});return $div},morpheus.FormBuilder.showOkCancel=function(options){options=$.extend({},{ok:!0},options);var footer=[];options.ok&&footer.push(''),options.apply&&footer.push(''),footer.push('');var $div=morpheus.FormBuilder._showInModal({title:options.title,html:options.content,footer:footer.join(""),onClose:options.hiddenCallback,size:options.size}),$ok=$div.find("[name=ok]");return $ok.on("click",function(e){options.okCallback(),$div.modal("hide")}),options.focus&&$ok.focus(),options.draggable&&$div.draggable({handle:".modal-header",containment:"document"}),$div},morpheus.FormBuilder.hasChanged=function(object,keyToUIElement){for(var keys=_.keys(keyToUIElement),i=0;i"),html.push('"),html.push("");var $div=$(html.join(""));return $div.on("mousewheel",function(e){e.stopPropagation()}),$div.find(".modal-body").html(options.html),$div.prependTo($(document.body)),$div.modal({backdrop:options.backdrop===!0}).on("hidden.bs.modal",function(e){$div.remove(),options.onClose&&options.onClose()}),$div},morpheus.FormBuilder.prototype={appendContent:function($content){this.$form.append($content)},addSeparator:function(){var html=[];html.push('
'),this.vertical||html.push('
'),html.push("
"),this.vertical||html.push("
"),html.push("
"),this.$form.append(html.join(""))},_append:function(html,field,isFieldStart){var that=this,required=field.required,name=field.name,type=field.type;if("separator"==type)return html.push(this.vertical?'
':'
'),html.push("
"),void html.push("
");var title=field.title,disabled=field.disabled,help=field.help,value=field.value,showLabel=field.showLabel,col="";this.vertical||(col=field.col||"col-xs-8"),void 0===showLabel&&(showLabel="checkbox"!==type&&"button"!==type&&"radio"!==type,showLabel=showLabel||void 0!==field.options);var id=that.prefix+"_"+name;if(void 0===title&&(title=name.replace(/_/g," "),title=title[0].toUpperCase()+title.substring(1)),showLabel?(html.push('"),isFieldStart&&html.push('
')):isFieldStart&&!this.vertical&&html.push('
'),"radio"===type)field.options?_.each(field.options,function(choice){var isChoiceObject=_.isObject(choice)&&void 0!==choice.value,optionValue=isChoiceObject?choice.value:choice,optionText=isChoiceObject?choice.name:choice,selected=value===optionValue;html.push('
")}):(html.push('
"));else if("checkbox"===type)html.push('
");else if("checkbox-list"===type)html.push('
');else if("select"==type||"bootstrap-select"==type)"bootstrap-select"==type?html.push('"),"bootstrap-select"==field.type&&field.toggle&&(html.push('

All | None

'),that.$form.on("click","[name="+name+"_all]",function(evt){evt.preventDefault();var $select=that.$form.find("[name="+name+"]");$select.selectpicker("val",$.map($select.find("option"),function(o){return $(o).val()})),$select.trigger("change")}),that.$form.on("click","[name="+name+"_none]",function(evt){evt.preventDefault();var $select=that.$form.find("[name="+name+"]");$select.selectpicker("val",[]),$select.trigger("change")}));else if("textarea"==type)html.push('");else if("button"==type)html.push('");else if("custom"===type)html.push(value);else if("file"===type){var isMultiple=field.multiple;html.push('"),field.url!==!1&&(html.push("
"),html.push(''),html.push("
")),html.push('"),that.$form.on("change","[name="+name+"_picker]",function(evt){var $this=$(this),val=$this.val(),showTextInput="URL"===val;if("Dropbox"===val){var options={success:function(results){var val=isMultiple?results.map(function(result){return result.link}):results[0].link;that.setValue(name,val),that.trigger("change",{name:name,value:val})},linkType:"direct",multiselect:isMultiple};Dropbox.choose(options)}else"My Computer"===val&&that.$form.find("[name="+name+"_file]").click();that.$form.find("[name="+name+"_text]").css("display",showTextInput?"":"none")}),that.$form.on("keyup","[name="+name+"_text]",function(evt){var text=$.trim($(this).val());isMultiple&&(text=text.split(",").filter(function(t){return t=$.trim(t),""!==t})),that.setValue(name,text),13===evt.which&&that.trigger("change",{name:name,value:text})}),that.$form.on("change","[name="+name+"_file]",function(evt){var files=evt.target.files;that.setValue(name,isMultiple?files:files[0]),that.trigger("change",{name:name,value:files[0]})})}else type=null==type?"text":type,"div"===type?html.push('
"),"div"===type&&html.push("
");void 0!==help&&(html.push(''),html.push(help),html.push(""))},append:function(fields){var html=[],that=this,isArray=morpheus.Util.isArray(fields);isArray||(fields=[fields]),html.push('
'),_.each(fields,function(field,index){that._append(html,field,0===index)}),html.push("
"),html.push("
");var $div=$(html.join(""));this.$form.append($div);var checkBoxLists=$div.find(".checkbox-list");if(checkBoxLists.length>0){var checkBoxIndex=0;_.each(fields,function(field){if("checkbox-list"===field.type){var list=new morpheus.CheckBoxList({responsive:!1,$el:$(checkBoxLists[checkBoxIndex]),items:field.options});$(checkBoxLists[checkBoxIndex]).data("morpheus.checkbox-list",list),checkBoxIndex++}})}$div.find(".selectpicker").selectpicker({iconBase:"fa",tickIcon:"fa-check",style:"btn-default btn-sm"})},clear:function(){this.$form.empty()},getValue:function(name){var $v=this.$form.find("[name="+name+"]");return 0===$v.length&&($v=this.$form.find("[name="+name+"_picker]")),morpheus.FormBuilder.getValue($v)},setOptions:function(name,options,selectFirst){var $select=this.$form.find("[name="+name+"]"),checkBoxList=$select.data("morpheus.checkbox-list");if(checkBoxList)checkBoxList.setItems(options);else{var html=[],selection=$select.val();_.each(options,function(choice){html.push('")}),$select.html(html.join("")),$select.val(selection),selectFirst&&null==$select.val()&&$select[0].options.length>0&&$select.val($select[0].options[0].value),$select.hasClass("selectpicker")&&($select.selectpicker("refresh"),$select.selectpicker("render"))}},find:function(name){return this.$form.find("[name="+name+"]")},setHelpText:function(name,value){var v=this.$form.find("[name="+name+"_help]");v.html(value)},setValue:function(name,value){var v=this.$form.find("[name="+name+"]");if(0===v.length&&(v=this.$form.find("[name="+name+"_picker]"),"file"===v.attr("type")))return v.val(value),v.selectpicker("render"),v.data("files",value);var type=v.attr("type"),list=v.data("morpheus.checkbox-list");list?list.setValue(value):("radio"===type?v.filter("[value="+value+"]").prop("checked",!0):"checkbox"===type?v.prop("checked",value):v.val(value),v.hasClass("selectpicker")&&v.selectpicker("render"))},setVisible:function(name,visible){var $div=this.$form.find("[name="+name+"]").parents(".form-group");visible?$div.show():$div.hide()},remove:function(name){var $div=this.$form.find("[name="+name+"]").parents(".form-group");$div.remove()},setEnabled:function(name,enabled){var $div=this.$form.find("[name="+name+"]");$div.attr("disabled",!enabled),enabled?$div.parents(".form-group").find("label").removeClass("text-muted"):$div.parents(".form-group").find("label").addClass("text-muted")}},morpheus.Util.extend(morpheus.FormBuilder,morpheus.Events),morpheus.GradientColorSupplier=function(){morpheus.AbstractColorSupplier.call(this),this._updateScale()},morpheus.GradientColorSupplier.prototype={createInstance:function(){return new morpheus.GradientColorSupplier},getColor:function(row,column,value){if(isNaN(value))return this.missingColor;var min=this.min,max=this.max,colors=this.colors;if(min>=value)return colors[0];if(value>=max)return colors[colors.length-1];var fraction=morpheus.SteppedColorSupplier.linearScale(value,min,max,0,100)/100;return this.colorScale(fraction)},setFractions:function(options){morpheus.AbstractColorSupplier.prototype.setFractions.call(this,options),this._updateScale()},_updateScale:function(){this.colorScale=d3.scale.linear().domain(this.fractions).range(this.colors).clamp(!0)}},morpheus.Util.extend(morpheus.GradientColorSupplier,morpheus.AbstractColorSupplier),morpheus.Grid=function(options){function getItemColumnValue(item,column){return column.getter(item)}this.options=options;var grid,_this=this;this.items=options.items,this.modelToView=null,this.viewOrder=null,this.filter=new morpheus.CombinedGridFilter;var model={getLength:function(){return null!=_this.viewOrder?_this.viewOrder.length:_this.items.length},getItem:function(index){return _this.items[null!=_this.viewOrder?_this.viewOrder[index]:index]}};this.$el=options.$el;var gridOptions=$.extend({},{select:!0,headerRowHeight:0,showHeaderRow:!1,multiColumnSort:!0,multiSelect:!1,topPanelHeight:0,enableTextSelectionOnCells:!0,forceFitColumns:!0,dataItemColumnValueExtractor:getItemColumnValue,defaultFormatter:function(row,cell,value,columnDef,dataContext){if(_.isNumber(value))return morpheus.Util.nf(value);if(morpheus.Util.isArray(value)){for(var s=[],i=0,length=value.length;length>i;i++){i>0&&s.push(", ");value[i];s.push(value[i])}return s.join("")}return value}},options.gridOptions||{});if(grid=new Slick.Grid(options.$el,model,options.columns,gridOptions),this.grid=grid,grid.registerPlugin(new morpheus.AutoTooltips2),grid.onCellChange.subscribe(function(e,args){_this.trigger("edit",args)}),gridOptions.select&&(grid.setSelectionModel(new Slick.RowSelectionModel({selectActiveRow:!0,multiSelect:gridOptions.multiSelect})),grid.getSelectionModel().onSelectedRangesChanged.subscribe(function(e){var nitems=grid.getDataLength();_this.trigger("selectionChanged",{selectedRows:grid.getSelectedRows().filter(function(row){return row>=0&&nitems>=row})})})),grid.onSort.subscribe(function(e,args){_this.sortCols=args.sortCols,_this._updateMappings(),grid.invalidate()}),options.$el.on("click",function(e){var cell=grid.getCellFromEvent(e);cell&&_this.trigger("click",{row:cell.row,target:e.target})}),options.$el.on("dblclick",function(e){var cell=grid.getCellFromEvent(e);cell&&_this.trigger("dblclick",{row:cell.row,target:e.target})}),options.sort){var gridSortColumns=[],gridColumns=grid.getColumns();options.sort.forEach(function(c){for(var column=null,i=0;i=0&&nitems>=row})},getSelectedItems:function(){for(var rows=this.grid.getSelectedRows(),selection=[],i=0,nrows=rows.length;nrows>i;i++)selection.push(this.items[this.convertViewIndexToModel(rows[i])]);return selection},getSelectedItem:function(){var rows=this.grid.getSelectedRows();return 1===rows.length?this.items[this.convertViewIndexToModel(rows[0])]:null},getItems:function(){for(var items=[],i=0,length=this.getFilteredItemCount();length>i;i++)items.push(this.items[this.convertViewIndexToModel(i)]);return items},getAllItemCount:function(){return this.items.length},getAllItems:function(){return this.items},getFilteredItemCount:function(){return this.viewOrder?this.viewOrder.length:this.items.length},redraw:function(){this.grid.invalidate()},redrawRows:function(rows){this.grid.invalidateRows(rows),this.grid.render()},setItems:function(items){this.items=items,this.grid.getSelectionModel()&&this.grid.setSelectedRows([]),this.setFilter(this.filter),this.maybeAutoResizeColumns()},maybeAutoResizeColumns:function(){this.columnsAutosized||this.autosizeColumns()},convertModelIndexToView:function(modelIndex){if(null!==this.modelToView){var index=this.modelToView.get(modelIndex);return void 0!==index?index:-1}return modelIndex},convertViewIndexToModel:function(viewIndex){return null!=this.viewOrder?viewIndex=0?this.viewOrder[viewIndex]:-1:viewIndex; },_updateMappings:function(){var selectedViewIndices=null!=this.grid.getSelectionModel()?this.grid.getSelectedRows():null,selectedModelIndices=[];if(selectedViewIndices)for(var i=0,length=selectedViewIndices.length;length>i;i++)selectedModelIndices.push(this.convertViewIndexToModel(selectedViewIndices[i]));if(this.viewOrder=null,null!=this.filter&&(this.filter.init(),!this.filter.isEmpty())){this.viewOrder=[];for(var i=0,length=this.items.length;length>i;i++)this.filter.accept(this.items[i])&&this.viewOrder.push(i)}var cols=this.sortCols;if(cols&&cols.length>0){if(null==this.viewOrder){this.viewOrder=[];for(var i=0,length=this.items.length;length>i;i++)this.viewOrder.push(i)}var ncols=cols.length,items=this.items;this.viewOrder.sort(function(index1,index2){for(var i=0;ncols>i;i++){var getter=cols[i].sortCol.getter,comparator=cols[i].sortAsc?morpheus.SortKey.ASCENDING_COMPARATOR:morpheus.SortKey.DESCENDING_COMPARATOR,value1=getter(items[index1]),value2=getter(items[index2]),result=comparator(value1,value2);if(0!==result)return result}return 0})}if(null!=this.viewOrder){this.modelToView=new morpheus.Map;for(var i=0,length=this.viewOrder.length;length>i;i++)this.modelToView.set(this.viewOrder[i],i)}else this.modelToView=null;if(null!=this.grid.getSelectionModel()){for(var newSelectedViewIndices=[],i=0,length=selectedModelIndices.length;length>i;i++){var index=this.convertModelIndexToView(selectedModelIndices[i]);void 0!==index&&newSelectedViewIndices.push(index)}this.grid.setSelectedRows(newSelectedViewIndices)}},setSelectedRows:function(rows){this.grid.setSelectedRows(rows)},setFilter:function(filter){this.filter=filter,this._updateMappings(),this.grid.invalidate(),this.trigger("filter")},getFilter:function(){return this.filter},autosizeColumns:function(){var columns=this.grid.getColumns(),items=this.getItems();if(items&&0!==items.length&&columns&&0!==columns.length){var gridWidth=this.options.$el.width()-30;if(!(0>=gridWidth)&&(this.columnsAutosized=!0,columns.length>-1)){var div=document.createElement("div");document.body.appendChild(div);var $d=$(div);$d.css({position:"absolute",left:-1e3,top:-1e3});var $row=$('
'),$cell=$row.find(".slick-cell"),$header=$row.find(".slick-header-column");$row.appendTo($d);for(var maxWidth=Math.min(parseInt(gridWidth/2),400),getColumnWidth=function(column){var w=$header.html(column.name).outerWidth()+13;if(column.prototypeValue)$cell.html(column.prototypeValue),w=Math.max($cell.outerWidth(),w);else for(var i=0,nrows=Math.min(items.length,10);nrows>i;i++){var html=column.formatter(i,null,column.getter(items[i]),column,items[i]),$html=$(html);$html.find(".slick-cell-wrapper").attr("class",""),$cell.html($html),w=Math.max($cell.outerWidth(),w)}column.width=parseInt(Math.min(maxWidth,w))},totalWidth=0,i=0;i$checkNode[0].offsetWidth){var item=_grid.getDataItem(cell.row);text=c.tooltip(item,c.getter(item)),show=!0}$node.attr("data-original-title",text);var hasTip=$node.data("bs.tooltip");hasTip||$node.tooltip({placement:"auto",html:!0,container:"body",trigger:"manual"}),show?$node.tooltip("show"):hasTip&&$node.tooltip("hide")}}var _grid;$.extend(this,{init:init,destroy:destroy})},morpheus.CombinedGridFilter=function(){this.filters=[]},morpheus.CombinedGridFilter.prototype={add:function(filter){this.filters.push(filter)},getFilters:function(){return this.filters},get:function(index){return this.filters[index]},set:function(index,f){this.filters[index]=f},init:function(){for(var i=0;iLoading...
'),closeable:!0,toolbar:{zoom:!0,tools:!0,searchRows:!0,searchColumns:!0,sort:!0,options:!0,saveImage:!0,saveDataset:!0,openFile:!0,filter:!0,colorKey:!0,searchValues:!1}},options),this.options=options,this.tooltipProvider=morpheus.HeatMapTooltipProvider,options.el?this.$el=$(options.el):this.$el=$("
"),options.landingPage||(options.landingPage=new morpheus.LandingPage,options.landingPage.$el.prependTo(this.$el)),this.options.name||(this.options.name=morpheus.Util.getBaseFileName(morpheus.Util.getFileName(this.options.dataset.file?this.options.dataset.file:this.options.dataset)));null==this.options.parent;if(null==this.options.parent){if(this.tabManager=this.options.tabManager?this.options.tabManager:new morpheus.TabManager({landingPage:this.options.landingPage}),!morpheus.HelpMenu.ADDED){morpheus.HelpMenu.ADDED=!0;var $a=$('');$a.tooltip({placement:"auto"});var $right=$('
');$a.appendTo($right),(new morpheus.HelpMenu).$el.appendTo($right),$right.appendTo(this.tabManager.$nav)}this.options.tabManager||(this.tabManager.$nav.appendTo(this.$el),this.tabManager.$tabContent.appendTo(this.$el))}else this.options.inheritFromParent&&(this.popupItems=this.options.parent.popupItems,this.options.tabOpened||(this.options.tabOpened=this.options.parent.options.tabOpened),this.options.drawCallback=this.options.parent.options.drawCallback),this.tabManager=this.options.parent.tabManager;this.$content=$("
"),this.$content.css({width:"100%","user-select":"none","-webkit-user-select":"none","-webkit-user-drag":"none","-webkit-tap-highlight-color":"rgba(0, 0, 0, 0)","-moz-user-select":"none","-moz-user-drag":"none","-moz-tap-highlight-color":"rgba(0, 0, 0, 0)","-ms-user-select":"none","-ms-user-drag":"none","-ms-tap-highlight-color":"rgba(0, 0, 0, 0)","-o-user-select":"none","-o-user-drag":"none","-o-tap-highlight-color":"rgba(0, 0, 0, 0)","overflow-x":"visible","overflow-y":"visible"});var tab=this.tabManager.add({$el:this.$content,closeable:this.options.closeable,rename:!0,title:this.options.name,object:this,focus:!0});options.$loadingImage&&options.$loadingImage.appendTo(this.$content),this.tabId=tab.id,this.$tabPanel=tab.$panel,this.options.dataSource=options.dataset?options.dataset.file?options.dataset.file:options.dataset:"",this._togglingInfoWindow=!1,this.tooltipMode=0;var promises=[];if(options.promises)for(var i=0;iCause: "),message.push(err.message)),morpheus.FormBuilder.showInModal({title:"Error",html:message.join("")})}),promises.push(deferred),$.when.apply($,promises).then(function(){_this.options.$loadingImage&&_this.options.$loadingImage.remove(),_this._init(),heatMapLoaded()})}},morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS=6,morpheus.HeatMap.showTool=function(tool,controller,callback){if(tool.gui){var gui=tool.gui(controller.getProject()),formBuilder=new morpheus.FormBuilder;_.each(gui,function(item){formBuilder.append(item)});var tabId=controller.getTabManager().getActiveTabId();tool.init&&tool.init(controller.getProject(),formBuilder,{controller:controller});var $formDiv,okCallback=function(){var task={name:tool.toString(),tabId:tabId};controller.getTabManager().addTask(task);var input={};_.each(gui,function(item){input[item.name]=formBuilder.getValue(item.name)}),setTimeout(function(){try{var value=tool.execute({controller:controller,project:controller.getProject(),input:input});if(value instanceof Worker){value.onerror=function(e){task.worker.terminate(),morpheus.FormBuilder.showInModal({title:"Error",html:e,close:"Close"}),e.stack&&console.log(e.stack)};var terminate=_.bind(value.terminate,value);task.worker=value,value.terminate=function(){terminate();try{controller.getTabManager().removeTask(task)}catch(x){console.log("Error removing task")}callback&&callback(input)}}else callback&&callback(input)}catch(e){morpheus.FormBuilder.showInModal({title:"Error",html:e,close:"Close"}),e.stack&&console.log(e.stack)}finally{if(void 0===task.worker)try{controller.getTabManager().removeTask(task)}catch(x){console.log("Error removing task")}tool.dispose&&tool.dispose()}},0)};tool.ok=function(){okCallback(),$formDiv.modal("hide")};var guiOptions=$.extend({},{ok:!0},gui.options);$formDiv=morpheus.FormBuilder.showOkCancel({title:tool.toString(),apply:tool.apply,ok:guiOptions.ok,size:guiOptions.size,draggable:!0,content:formBuilder.$form,align:"right",okCallback:okCallback})}else try{tool.execute({controller:controller,project:controller.getProject(),input:{}});callback&&callback({})}catch(e){morpheus.FormBuilder.showInModal({title:"Error",html:e,close:"Close"}),e.stack&&console.log(e.stack)}finally{tool.dispose&&tool.dispose()}morpheus.Util.trackEvent({eventCategory:"Tool",eventAction:tool.toString()})},morpheus.HeatMap.getSpaces=function(groupByKeys,length,gapSize){for(var previousArray=[],nkeys=groupByKeys.length,keyIndex=0;nkeys>keyIndex;keyIndex++){var key=groupByKeys[keyIndex];previousArray.push(key.getValue(0))}var spaces=[],sum=0;spaces.push(sum);for(var i=1;length>i;i++){for(var isEqual=!0,keyIndex=0;nkeys>keyIndex;keyIndex++){var key=groupByKeys[keyIndex],comparator=key.getComparator(),val=key.getValue(i),c=comparator(val,previousArray[keyIndex]);if(0!==c){isEqual=!1;for(var keyIndex2=0;nkeys>keyIndex2;keyIndex2++)previousArray[keyIndex2]=groupByKeys[keyIndex2].getValue(i);break}}isEqual||(sum+=gapSize),spaces.push(sum)}return spaces},morpheus.HeatMap.createGroupBySpaces=function(dataset,groupByKeys,gapSize){if(groupByKeys.length>0){for(var nkeys=groupByKeys.length,keyIndex=0;nkeys>keyIndex;keyIndex++)groupByKeys[keyIndex].init(dataset);return morpheus.HeatMap.getSpaces(groupByKeys,dataset.getRowCount(),gapSize)}},morpheus.HeatMap.isDendrogramVisible=function(project,isColumns){var sortKeys=isColumns?project.getColumnSortKeys():project.getRowSortKeys(),size=isColumns?project.getSortedFilteredDataset().getColumnCount():project.getSortedFilteredDataset().getRowCount();return 1===sortKeys.length?sortKeys[0]instanceof morpheus.SpecifiedModelSortOrder&&"dendrogram"===sortKeys[0].name&&sortKeys[0].nvisible===size:void 0},morpheus.HeatMap.prototype={gapSize:10,updatingScroll:!1,autoDisplay:function(options){null==options.filename&&(options.filename="");var colorScheme;if("segtab"===options.extension||"seg"===options.extension)colorScheme={type:"fixed",map:morpheus.HeatMapColorScheme.Predefined.CN().map.map(function(item){return{value:Math.pow(2,1+item.value),color:item.color}})};else if("maf"===options.extension){colorScheme=morpheus.HeatMapColorScheme.Predefined.MAF();var colorMap=morpheus.HeatMapColorScheme.Predefined.MAF().map,rowMutProfile=this.project.getFullDataset().getRowMetadata().getByName("mutation_summary"),columnMutProfile=this.project.getFullDataset().getColumnMetadata().getByName("mutation_summary"),track=this.getTrack("mutation_summary",!1);track&&track.settingFromConfig("stacked_bar"),track=this.getTrack("mutation_summary",!0),track&&track.settingFromConfig("stacked_bar");for(var i=1;ii;i++){var key=existingSortKeys[i];if(key instanceof morpheus.SortByValuesKey&&morpheus.Util.arrayEquals(key.modelIndices,modelIndices)){priorSortKeyIndex=i,key.getSortOrder()===morpheus.SortKey.SortOrder.UNSORTED?sortOrder=morpheus.SortKey.SortOrder.DESCENDING:key.getSortOrder()===morpheus.SortKey.SortOrder.DESCENDING?sortOrder=morpheus.SortKey.SortOrder.ASCENDING:key.getSortOrder()===morpheus.SortKey.SortOrder.ASCENDING?sortOrder=morpheus.SortKey.SortOrder.TOP_N:key.getSortOrder()===morpheus.SortKey.SortOrder.TOP_N&&(sortOrder=morpheus.SortKey.SortOrder.UNSORTED);break}}null==sortOrder&&(sortOrder=morpheus.SortKey.SortOrder.DESCENDING);var sortKeys;if(append)sortKeys=isColumns?project.getRowSortKeys():project.getColumnSortKeys(),-1!==priorSortKeyIndex?sortOrder===morpheus.SortKey.SortOrder.UNSORTED?sortKeys.splice(priorSortKeyIndex,1):sortKeys[priorSortKeyIndex].setSortOrder(sortOrder):sortOrder!==morpheus.SortKey.SortOrder.UNSORTED&&sortKeys.push(new morpheus.SortByValuesKey(modelIndices,sortOrder,!isColumns)),sortKeys=morpheus.SortKey.keepExistingSortKeys(sortKeys,isColumns?project.getRowSortKeys():project.getColumnSortKeys());else{var newSortKeys=sortOrder===morpheus.SortKey.SortOrder.UNSORTED?[]:[new morpheus.SortByValuesKey(modelIndices,sortOrder,!isColumns)];sortKeys=morpheus.SortKey.keepExistingSortKeys(newSortKeys,isColumns?project.getRowSortKeys():project.getColumnSortKeys())}isColumns?(project.setRowSortKeys(sortKeys,!0),this.scrollTop(0)):(project.setColumnSortKeys(sortKeys,!0),this.scrollLeft(0))}},getToolbarElement:function(){return this.toolbar.$el},getToolbar:function(){return this.toolbar},setName:function(name){this.options.name=name},getName:function(){return this.options.name},showOptions:function(){new morpheus.HeatMapOptions(this)},getProject:function(){return this.project},setDendrogram:function(tree,isColumns,viewIndices){var dendrogram=isColumns?this.columnDendrogram:this.rowDendrogram;if(dendrogram&&(dendrogram.dispose(),dendrogram=null),null!=tree){for(var modelIndices=[],modelIndexSet=new morpheus.Set,size=isColumns?this.project.getFullDataset().getColumnCount():this.project.getFullDataset().getRowCount(),i=0;size>i;i++)modelIndexSet.add(i);for(var i=0,length=viewIndices.length;length>i;i++){var modelIndex=isColumns?this.project.convertViewColumnIndexToModel(viewIndices[i]):this.project.convertViewRowIndexToModel(viewIndices[i]);modelIndices.push(modelIndex),modelIndexSet.remove(modelIndex)}var nvisible=modelIndices.length;if(modelIndexSet.size()>0)for(var indices=modelIndexSet.values(),i=0,length=indices.length;length>i;i++)modelIndices.push(indices[i]);isColumns?(dendrogram=new morpheus.ColumnDendrogram(this,tree,this.heatmap.getColumnPositions(),this.project),dendrogram.filter=this.project.getColumnFilter().shallowClone(),this.columnDendrogram=dendrogram,this.project.setColumnSortKeys([new morpheus.SpecifiedModelSortOrder(modelIndices,nvisible,"dendrogram")],!0)):(dendrogram=new morpheus.RowDendrogram(this,tree,this.heatmap.getRowPositions(),this.project),dendrogram.filter=this.project.getRowFilter().shallowClone(),this.rowDendrogram=dendrogram,this.project.setRowSortKeys([new morpheus.SpecifiedModelSortOrder(modelIndices,nvisible,"dendrogram")],!0)),dendrogram.appendTo(this.$parent),dendrogram.$label.appendTo(this.$parent),dendrogram.$squishedLabel.appendTo(this.$parent)}else{for(var sortKeys=isColumns?this.project.getColumnSortKeys():this.project.getRowSortKeys(),i=0;i0){var tipText=[],dataset=project.getSortedFilteredDataset(),rowTracks=_this.rowTracks.filter(function(t){return t.settings.inlineTooltip}),columnTracks=_this.columnTracks.filter(function(t){return t.settings.inlineTooltip});return selectedViewIndices.forEach(function(id){var rowIndex=id.getArray()[0],columnIndex=id.getArray()[1];tipText.push(morpheus.Util.nf(dataset.getValue(rowIndex,columnIndex))),rowTracks.forEach(function(track){tipText.push(" "),tipText.push(morpheus.Util.formatObject(dataset.getRowMetadata().getByName(track.name).getValue(rowIndex)))}),columnTracks.forEach(function(track){tipText.push(" "),tipText.push(morpheus.Util.formatObject(dataset.getColumnMetadata().getByName(track.name).getValue(columnIndex)))}),tipText.push("\n")}),tipText.join("")}},_init:function(){function reorderTracks(array,isColumns){var nameOrderPairs=[],found=!1;if(_.each(array,function(item){var name=item.renameTo||item.field,order=999;null!=item.order&&(order=item.order,found=!0),nameOrderPairs.push({name:name,order:order})}),found){nameOrderPairs.sort(function(a,b){return a.order===b.order?0:a.order
").css("position","relative"),this.$parent.appendTo(this.$content),this.toolbar=new morpheus.HeatMapToolBar(this),this.options.customUrls&&this.setCustomUrls(this.options.customUrls),this.vscroll=new morpheus.ScrollBar(!0),this.vscroll.appendTo(this.$parent),this.vscroll.on("scroll",function(){_this.updatingScroll||_this.paintAll({paintRows:!0,paintColumns:!1,invalidateRows:!0,invalidateColumns:!1})}),this.beforeColumnTrackDivider=new morpheus.Divider(!1),this.beforeColumnTrackDivider.appendTo(this.$parent);var dragStartHeight=0;this.beforeColumnTrackDivider.on("resizeStart",function(e){dragStartHeight=_this.columnDendrogram.getUnscaledHeight()}).on("resize",function(e){var newHeight=Math.max(8,dragStartHeight+e.delta);_this.columnDendrogram.setPrefHeight(newHeight),_this.revalidate()}).on("resizeEnd",function(){dragStartHeight=0}),this.afterRowDendrogramDivider=new morpheus.Divider(!0),this.afterRowDendrogramDivider.appendTo(this.$parent);var rowDendrogramStartWidth=0;this.afterRowDendrogramDivider.on("resizeStart",function(e){rowDendrogramStartWidth=_this.rowDendrogram.getUnscaledWidth()}).on("resize",function(e){var newWidth=Math.max(8,rowDendrogramStartWidth+e.delta);_this.rowDendrogram.setPrefWidth(newWidth),_this.revalidate()}).on("resizeEnd",function(){rowDendrogramStartWidth=0}),this.afterVerticalScrollBarDivider=new morpheus.Divider(!0),this.afterVerticalScrollBarDivider.appendTo(this.$parent);var resizeStartHeatMapWidth=0;this.afterVerticalScrollBarDivider.on("resizeStart",function(e){resizeStartHeatMapWidth=_this.heatmap.getUnscaledWidth()}).on("resize",function(e){_this.heatmap.prefWidth=resizeStartHeatMapWidth+e.delta,_this.revalidate()}),this.hscroll=new morpheus.ScrollBar(!1),this.hscroll.appendTo(this.$parent),this.hscroll.on("scroll",function(){_this.updatingScroll||_this.paintAll({paintRows:!1,paintColumns:!0,invalidateRows:!1,invalidateColumns:!0})});var heatmap=new morpheus.HeatMapElementCanvas(this.project);this.options.drawCallback&&heatmap.setDrawCallback(this.options.drawCallback),$(heatmap.canvas).on("contextmenu",function(e){morpheus.Popup.showPopup([{name:"Copy",disabled:0===_this.project.getElementSelectionModel().count()},{name:"Save Image (Ctrl-S)"},{separator:!0},{name:"Show Inline Tooltip",checked:_this.options.inlineTooltip}],{x:e.pageX,y:e.pageY},e.target,function(event,item){if("Show Inline Tooltip"===item)_this.options.inlineTooltip=!_this.options.inlineTooltip;else if("Save Image (Ctrl-S)"===item)morpheus.HeatMap.showTool(new morpheus.SaveImageTool,_this);else{var text=_this.getSelectedElementsText();""!==text&&event.clipboardData.setData("text/plain",text)}}),e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation()}),heatmap.appendTo(this.$parent),this.heatmap=heatmap;var rowDendrogramSortKey=null;if(void 0!=rowDendrogram){var tree=rowDendrogram;if(tree.leafNodes.length!==this.project.getFullDataset().getRowCount())throw"# leaf nodes in row dendrogram "+tree.leafNodes.length+" != "+this.project.getFullDataset().getRowCount();if(null!=this.options.rowDendrogramField){for(var vector=dataset.getRowMetadata().getByName(this.options.rowDendrogramField),rowIndices=[],map=new morpheus.Map,re=/[,:]/g,j=0,size=vector.size();size>j;j++){var key=vector.getValue(j);map.set(key.replace(re,""),j)}for(var i=0,length=tree.leafNodes.length;length>i;i++){var index=map.get(tree.leafNodes[i].name);if(void 0===index)throw"Unable to find row dendrogram id "+tree.leafNodes[i].name+" in row annotations";rowIndices.push(index)}}else for(var i=0,length=tree.leafNodes.length;length>i;i++)rowIndices.push(i);this.rowDendrogram=new morpheus.RowDendrogram(this,tree,heatmap.getRowPositions(),this.project,!0),rowDendrogramSortKey=new morpheus.SpecifiedModelSortOrder(rowIndices,rowIndices.length,"dendrogram"),this.rowDendrogram.appendTo(this.$parent),this.rowDendrogram.$label.appendTo(this.$parent),this.rowDendrogram.$squishedLabel.appendTo(this.$parent)}var columnDendrogramSortKey=null;if(void 0!==columnDendrogram){var tree=columnDendrogram;if(tree.leafNodes.length!==this.project.getFullDataset().getColumnCount())throw"# leaf nodes "+tree.leafNodes.length+" != "+this.project.getFullDataset().getColumnCount();var columnIndices=[];if(null!=this.options.columnDendrogramField){for(var vector=dataset.getColumnMetadata().getByName(this.options.columnDendrogramField),map=new morpheus.Map,re=/[,:]/g,j=0,size=vector.size();size>j;j++){var key=vector.getValue(j);map.set(key.replace(re,""),j)}for(var i=0,length=tree.leafNodes.length;length>i;i++){var index=map.get(tree.leafNodes[i].name);if(void 0===index)throw"Unable to find column dendrogram id "+tree.leafNodes[i].name+" in column annotations";columnIndices.push(index)}}else for(var i=0,length=tree.leafNodes.length;length>i;i++)columnIndices.push(i);this.columnDendrogram=new morpheus.ColumnDendrogram(this,tree,heatmap.getColumnPositions(),this.project,!0),columnDendrogramSortKey=new morpheus.SpecifiedModelSortOrder(columnIndices,columnIndices.length,"dendrogram"),this.columnDendrogram.appendTo(this.$parent),this.columnDendrogram.$label.appendTo(this.$parent),this.columnDendrogram.$squishedLabel.appendTo(this.$parent)}if(null!==rowDendrogramSortKey&&this.project.setRowSortKeys([rowDendrogramSortKey]),null!==columnDendrogramSortKey&&this.project.setColumnSortKeys([columnDendrogramSortKey]),null!=this.options.rowGroupBy)for(var i=0;i
'); html - .push('
logo Morpheus
'); + .push('
logo Morpheus
'); html.push('

Open your own file

'); html.push('
'); @@ -23,12 +23,12 @@ morpheus.LandingPage = function(pageOptions) { new morpheus.HelpMenu().$el.appendTo($el.find('[name=help]')); var formBuilder = new morpheus.FormBuilder(); formBuilder.append({ - name : 'file', - showLabel : false, - value : '', - type : 'file', - required : true, - help : morpheus.DatasetUtil.DATASET_FILE_FORMATS + name: 'file', + showLabel: false, + value: '', + type: 'file', + required: true, + help: morpheus.DatasetUtil.DATASET_FILE_FORMATS }); formBuilder.$form.appendTo($el.find('[name=formRow]')); this.formBuilder = formBuilder; @@ -37,23 +37,23 @@ morpheus.LandingPage = function(pageOptions) { }; morpheus.LandingPage.prototype = { - dispose : function() { + 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() { + .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() { + show: function () { var _this = this; if (!this.sampleDatasets) { this.sampleDatasets = new morpheus.SampleDatasets({ - $el : this.$sampleDatasetsEl, - callback : function(heatMapOptions) { + $el: this.$sampleDatasetsEl, + callback: function (heatMapOptions) { _this.open(heatMapOptions); } }); @@ -61,42 +61,48 @@ morpheus.LandingPage.prototype = { this.$el.show(); - this.formBuilder.on('change', function(e) { + this.formBuilder.on('change', function (e) { var value = e.value; if (value !== '' && value != null) { _this.openFile(value); } }); - $(window).on('paste.morpheus', function(e) { + $(window).on('paste.morpheus', function (e) { + var tagName = e.target.tagName; + if (tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA') { + return; + } + var text = e.originalEvent.clipboardData.getData('text/plain'); if (text != null && text.length > 0) { - var blob = new Blob([ text ]); + var blob = new Blob([text]); var url = window.URL.createObjectURL(blob); e.preventDefault(); e.stopPropagation(); _this.openFile(url); } - }).on('dragover.morpheus dragenter.morpheus', function(e) { + + }).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); - } - }); + '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(options) { + open: function (options) { this.dispose(); if (this.heatmap == null) { options.landingPage = this; @@ -108,21 +114,20 @@ morpheus.LandingPage.prototype = { new morpheus.HeatMap(options); } }, - openFile : function(value) { + openFile: function (value) { var _this = this; var options = { - dataset : value + dataset: value }; var fileName = morpheus.Util.getFileName(value); - morpheus.OpenDatasetTool.fileExtensionPrompt(fileName, function( - readOptions) { + morpheus.OpenDatasetTool.fileExtensionPrompt(fileName, function (readOptions) { if (readOptions) { var dataset = options.dataset; options.dataset = { - file : dataset, - options : {} + file: dataset, + options: {} }; - for ( var key in readOptions) { + for (var key in readOptions) { options.dataset.options[key] = readOptions[key]; } } -- GitLab