From 6a08fdeffff3819c91799d56602691b47300faa5 Mon Sep 17 00:00:00 2001 From: Daria Zenkova Date: Fri, 2 Sep 2016 19:23:17 +0300 Subject: [PATCH] everything had seemed to work, but again some fucking crap occurred with "missing value where TRUE/FALSE expected", but R function works properly when I check it in R console. so the problem is somewhere with input to ocpu.call, but I can't still understand where it is --- js/morpheus-latest.min.js | 36 ++++++++++++++++++------------------ src/matrix/dataset_util.js | 24 +++++++++++++++++------- src/tools/pcaplot_tool.js | 19 +++++++------------ src/ui/heat_map_toolbar.js | 8 ++++++++ 4 files changed, 50 insertions(+), 37 deletions(-) diff --git a/js/morpheus-latest.min.js b/js/morpheus-latest.min.js index e3222cb..e6c7eb0 100644 --- a/js/morpheus-latest.min.js +++ b/js/morpheus-latest.min.js @@ -1,22 +1,22 @@ "undefined"==typeof morpheus&&(morpheus={}),morpheus.Util=function(){},morpheus.Util.URL="https://www.broadinstitute.org/cancer/software/morpheus/",morpheus.Util.RIGHT_ARROW=String.fromCharCode(8594),morpheus.Util.extend=function(c1,c2){for(var key in c2.prototype)key in c1.prototype||(c1.prototype[key]=c2.prototype[key])},morpheus.Util.viewPortSize=function(){return window.getComputedStyle(document.body,":before").content.replace(/"/g,"")},morpheus.Util.TRACKING_CODE_LOADED=!1,morpheus.Util.loadTrackingCode=function(){if("undefined"!=typeof window){if(morpheus.Util.TRACKING_CODE_LOADED)return;"undefined"==typeof ga&&(morpheus.Util.TRACKING_CODE_LOADED=!0,function(i,s,o,g,r,a,m){i.GoogleAnalyticsObject=r,i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date,a=s.createElement(o),m=s.getElementsByTagName(o)[0],a.async=1,a.src=g,m.parentNode.insertBefore(a,m)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga")),ga("create","UA-53973555-1","auto","morpheus"),ga("morpheus.send","pageview"),morpheus.Util.TRACKING_CODE_LOADED=!0}},morpheus.Util.measureScrollbar=function(){var $c=$("
").appendTo("body"),dim={width:Math.max(0,$c.width()-$c[0].clientWidth),height:$c.height()-$c[0].clientHeight};return $c.remove(),dim},morpheus.Util.trackEvent=function(options){"undefined"!=typeof window&&(morpheus.Util.TRACKING_CODE_LOADED||morpheus.Util.loadTrackingCode(),morpheus.Util.TRACKING_CODE_LOADED&&ga("morpheus.send",{hitType:"event",eventCategory:options.eventCategory,eventAction:options.eventAction,eventLabel:options.eventLabel}))},morpheus.Util.getDataType=function(firstNonNull){var dataType,isArray=morpheus.Util.isArray(firstNonNull);return isArray&&firstNonNull.length>0&&(firstNonNull=firstNonNull[0]),dataType=_.isString(firstNonNull)?"string":_.isNumber(firstNonNull)?"number":"object",isArray&&(dataType="["+dataType+"]"),dataType},morpheus.Util.trim=function(val){for(var len=val.length,st=0;st0||len0&&(searchObject=morpheus.Util.getQueryParams(window.location.search.substring(1))),window.location.hash.length>0&&(hashObject=morpheus.Util.getQueryParams(window.location.hash.substring(1))),_.extend(hashObject,searchObject)},morpheus.Util.copyString=function(s){for(var copy=[],i=0,end=s.length;i=0;i--){var src=scripts[i].src,index=src.lastIndexOf("/");if(index!==-1&&(src=src.substring(index)),src.indexOf("morpheus")!==-1&&src.indexOf("external")===-1)return scripts[i].src}return scripts.length>0?scripts[0].src:""},morpheus.Util.forceDelete=function(obj){try{var _garbageCollector=function(){var ef=URL.createObjectURL(new Blob([""],{type:"text/javascript"})),w=new Worker(ef);return URL.revokeObjectURL(ef),w}();_garbageCollector.postMessage(obj,[obj])}catch(x){console.log("Unable to delete")}},morpheus.Util.getFileName=function(fileOrUrl){if(fileOrUrl instanceof File)return fileOrUrl.name;var name=""+fileOrUrl,question=name.indexOf("?");if(question!==-1)for(var params=name.substring(question+1),keyValuePairs=decodeURIComponent(params).split("&"),i=0;i0){var suffix=name.substring(dotIndex+1).toLowerCase();if("txt"===suffix||"gz"===suffix){var newPath=name.substring(0,dotIndex),secondDotIndex=newPath.lastIndexOf(".");if(secondDotIndex>0){var secondSuffix=newPath.substring(secondDotIndex+1,newPath.length).toLowerCase();if("segtab"===secondSuffix||"seg"===secondSuffix||"maf"===secondSuffix||"gct"===secondSuffix||"txt"===secondSuffix||"gmt"===secondSuffix)return secondSuffix}}return suffix}return""},morpheus.Util.getBaseFileName=function(name){var dotIndex=name.lastIndexOf(".");if(dotIndex>0){var suffix=name.substring(dotIndex+1,name.length);return"gz"===suffix||"zip"===suffix||"bz2"===suffix?morpheus.Util.getBaseFileName(name.substring(0,dotIndex)):name.substring(0,dotIndex)}return name},morpheus.Util.seq=function(length){for(var array=[],i=0;i=suffix.length&&string.substr(string.length-suffix.length)===suffix},morpheus.Util.measureSvgText=function(text,classname){if(!text||0===text.length)return{height:0,width:0};var container=d3.select("body").append("svg");classname&&container.attr("class",classname),container.append("text").attr({x:-1e3,y:-1e3}).text(text);var bbox=container.node().getBBox();return container.remove(),{height:bbox.height,width:bbox.width}},morpheus.Util.IS_MAC=!1,"undefined"!=typeof navigator&&(morpheus.Util.IS_MAC=!!navigator.platform.match(/(Mac|iPhone|iPod|iPad)/i)),morpheus.Util.COMMAND_KEY=morpheus.Util.IS_MAC?"⌘":"Ctrl+",morpheus.Util.hammer=function(el,recognizers){var hammer=new Hammer(el,{recognizers:[]});return _.indexOf(recognizers,"pan")!==-1?hammer.add(new Hammer.Pan({threshold:1,direction:Hammer.DIRECTION_ALL})):_.indexOf(recognizers,"panh")!==-1?hammer.add(new Hammer.Pan({threshold:1,direction:Hammer.DIRECTION_HORIZONTAL})):_.indexOf(recognizers,"panv")!==-1&&hammer.add(new Hammer.Pan({threshold:1,direction:Hammer.DIRECTION_VERTICAL})),_.indexOf(recognizers,"tap")!==-1&&hammer.add(new Hammer.Tap),_.indexOf(recognizers,"pinch")!==-1&&hammer.add(new Hammer.Pinch),_.indexOf(recognizers,"longpress")!==-1&&hammer.add(new Hammer.Press({event:"longpress",time:1e3})),_.indexOf(recognizers,"press")!==-1&&hammer.add(new Hammer.Press),hammer},morpheus.Util.autocompleteArrayMatcher=function(q,cb,array,fields,max){var filteredSet=new morpheus.Set,substrRegex=new RegExp("^"+q,"i");if(fields)for(var nfields=fields.length,i=0,n=array.length;i0)&&options.filter(terms,response)},focus:function(){return!1},select:function(event,ui){if(ui.item.skip)return!1;if(options.multi){var terms=morpheus.Util.getAutocompleteTokens(this.value,{trim:!1,selectionStart:options.$el[0].selectionStart}),field=event.toElement&&event.toElement.dataset?event.toElement.dataset.autocomplete:null,value=field?ui.item[field]:ui.item.value,show=ui.item.show;return 0===terms.length?terms.push(value):terms[terms.selectionStartIndex===-1||void 0===terms.selectionStartIndex?terms.length-1:terms.selectionStartIndex]=value,this.value=terms.join(" "),show&&setTimeout(function(){options.$el.autocomplete("search",options.$el.val())},20),options.select&&options.select(),!1}options.select&&options.select(),13===event.which&&event.stopImmediatePropagation()}});var instance=options.$el.autocomplete("instance");instance._renderItem=function(ul,item){return $('
  • ').html(item.label).appendTo(ul)},instance._normalize=function(items){return items},instance._resizeMenu=function(){var ul=this.menu.element;ul.outerWidth(instance.element.outerWidth())};var menu=options.$el.autocomplete("widget");menu&&menu.addClass("search-menu"),options.suggestWhenEmpty&&options.$el.on("focus",function(){options.$el.autocomplete("search",options.$el.val())}),options.$el.on("keyup",function(e){13===e.which?options.$el.autocomplete("close"):options.suggestWhenEmpty&&""===options.$el.val()&&options.$el.autocomplete("search","")})},morpheus.Util.getAutocompleteTokens=function(text,options){if(options=$.extend({},{trim:!0},options),options.trim&&(text=$.trim(text)),""===text)return[];for(var inQuote=!1,tokens=[],currentToken=[],i=0,n=text.length;i0&&filterFunction(terms.pop(),response)},focus:function(){return!1},select:function(event,ui){if(!singleTerm){var terms=morpheus.Util.getAutocompleteTokens(this.value);terms.pop();var val=ui.item.value;return val.indexOf(" ")>0&&'"'!==val[0]&&(val='"'+val+'"'),terms.push(val),this.value=terms.join(" "),selectCb&&selectCb(),$(this).autocomplete("close"),!1}selectCb&&(selectCb(),$(this).autocomplete("close"))}}),$el.autocomplete("instance")._renderItem=function(ul,item){return $("
  • ").html(item.label).appendTo(ul)},autoclose&&$el.on("keyup",function(e){13===e.which&&$el.autocomplete("close")})},morpheus.Util.showDialog=function($el,title,options){var $dialog=$("
    ");$el.appendTo($dialog),$dialog.appendTo($(document.body)),options||(options={}),$dialog.dialog({width:670,height:590,title:title,close:function(event,ui){$dialog.remove(),options.close&&options.close()}})},morpheus.Util.sheetToArray=function(sheet,delim){for(var r=XLSX.utils.decode_range(sheet["!ref"]),rows=[],R=r.s.r;R<=r.e.r;++R){for(var row=[],C=r.s.c;C<=r.e.c;++C){var val=sheet[XLSX.utils.encode_cell({c:C,r:R})];if(val){var txt=String(XLSX.utils.format_cell(val));row.push(txt)}else row.push("")}rows.push(delim?row.join(delim):row)}return rows},morpheus.Util.linesToObjects=function(lines){for(var header=lines[0],array=[],nfields=header.length,i=1,length=lines.length;i0)for(var i=0;i(None)'),_.each(values,function(val){html.push('")}),html.join("")},morpheus.Util.rankIndexArray=function(index){for(var rank=[],n=index.length,j=0;j-1&&void 0!==n.toPrecision?n.toPrecision(4):morpheus.Util._nf(n);return morpheus.Util.removeTrailingZerosInFraction(str)},morpheus.Util.createNumberFormat=function(nfractionDigits){var d3Formatter=d3.format("."+nfractionDigits+"f"),f=function(value){var str=d3Formatter(value);return morpheus.Util.removeTrailingZerosInFraction(str)};return f},morpheus.Util.wrapNumber=function(value,object){var n=new Number(value);return n.toObject=function(){return object},n},morpheus.Util.toString=function(value){return null==value?"":_.isNumber(value)?morpheus.Util.nf(value):morpheus.Util.isArray(value)?morpheus.Util.arrayToString(value,", "):""+value},morpheus.Util.arrayToString=function(value,sep){for(var s=[],i=0,length=value.length;iindex&&"0"==str[i];i--,zeros--);if(zeros===index+1)return str.substring(0,index);if(zeros0,fieldRegExp=/\\:/g,predicates=[],defaultIsExactMatch="exact"===options.defaultMatchMode;return tokens.forEach(function(token){var isNot=!1;"-"===token[0]&&(token=token.substring(1),isNot=!0);var field=null,semi=token.indexOf(":");if(semi>0)if(fieldSearchEnabled&&92!==token.charCodeAt(semi-1)){var possibleToken=$.trim(token.substring(semi+1)),possibleField=$.trim(token.substring(0,semi));possibleField.length>0&&'"'===possibleField[0]&&'"'===possibleField[possibleField.length-1]?possibleField=possibleField.substring(1,possibleField.length-1):possibleField.length>0&&'"'===possibleField[0]&&'"'===possibleToken[possibleToken.length-1]&&'"'!==possibleToken[0]&&(possibleField=possibleField.substring(1,possibleField.length),possibleToken='"'+possibleToken),validateFieldNames&&availableFields.indexOf(options.caseSensitive?possibleField:possibleField.toLowerCase())===-1||(token=possibleToken,field=possibleField)}else token=token.replace(fieldRegExp,":");for(var predicate,rangeIndex=-1,rangeToken=null,rangeIndicators=["..",">=",">","<=","<","="],i=0;i"===rangeToken){var val=parseFloat(token.substring(rangeIndex+1));isNaN(val)||(predicate=new morpheus.Util.GreaterThanPredicate(field,val))}else if(">="===rangeToken){var val=parseFloat(token.substring(rangeIndex+2));isNaN(val)||(predicate=new morpheus.Util.GreaterThanOrEqualPredicate(field,val))}else if("<"===rangeToken){var val=parseFloat(token.substring(rangeIndex+1));isNaN(val)||(predicate=new morpheus.Util.LessThanPredicate(field,val))}else if("<="===rangeToken){var val=parseFloat(token.substring(rangeIndex+2));isNaN(val)||(predicate=new morpheus.Util.LessThanOrEqualPredicate(field,val))}else if("="===rangeToken){var val=parseFloat(token.substring(rangeIndex+1));isNaN(val)||(predicate=new morpheus.Util.EqualsPredicate(field,val))}else predicate=defaultIsExactMatch?new morpheus.Util.ExactTermPredicate(field,token):new morpheus.Util.RegexPredicate(field,token);else'"'===token[0]&&'"'===token[token.length-1]?(token=token.substring(1,token.length-1),predicate=new morpheus.Util.ExactTermPredicate(field,token)):predicate=token.indexOf("*")!==-1?new morpheus.Util.RegexPredicate(field,token):defaultIsExactMatch?new morpheus.Util.ExactTermPredicate(field,token):new morpheus.Util.RegexPredicate(field,token);null!=predicate&&predicates.push(isNot?new morpheus.Util.NotPredicate(predicate):predicate)}),predicates},morpheus.Util.createRegExpStringToMatchText=function(text){var tokens=morpheus.Util.getAutocompleteTokens(text);if(0===tokens.length)return null;var regex=[];return _.each(tokens,function(token){'"'===token[0]&&'"'===token[token.length-1]?(token=token.substring(1,token.length-1),regex.push("^"+morpheus.Util.escapeRegex(token)+"$")):regex.push(morpheus.Util.escapeRegex(token))}),"("+regex.join("|")+")"},morpheus.Util.createRegExpToMatchText=function(text){var s=morpheus.Util.createRegExpStringToMatchText(text);return null==s?null:new RegExp(s,"i")},morpheus.Util.reorderArray=function(array,index){for(var newArray=[],i=0;i1?s.substring(1):""},morpheus.Util.splitLines=function(lines){for(var tab=new RegExp("\t"),tokens=[],i=0,nlines=lines.length;iLoading...')},morpheus.Util.splitOnNewLine=function(text,commentChar){var commentCharCode=void 0!==commentChar?commentChar.charCodeAt(0):void 0,lines=text.split(/\n/);if(1===lines.length){var tmp=text.split(/\r/);tmp.length>1&&(lines=tmp)}for(var rows=[],i=0,nlines=lines.length;i=this.min&&value<=this.max},getField:function(){return this.field},isNumber:function(){return!0},toString:function(){return"NumberRangePredicate "+this.field+":"+this.min+"..."+this.max}},morpheus.Util.GreaterThanPredicate=function(field,val){this.field=field,this.val=val},morpheus.Util.GreaterThanPredicate.prototype={accept:function(value){return value>this.val},getField:function(){return this.field},isNumber:function(){return!0}},morpheus.Util.GreaterThanOrEqualPredicate=function(field,val){this.field=field,this.val=val},morpheus.Util.GreaterThanOrEqualPredicate.prototype={accept:function(value){return value>=this.val},getField:function(){return this.field},isNumber:function(){return!0}},morpheus.Util.LessThanPredicate=function(field,val){this.field=field,this.val=val},morpheus.Util.LessThanPredicate.prototype={accept:function(value){return value0&&s.push(", "),s.push(key),s.push("="),s.push(value)}),s.join("")},keys:function(){var keys=[];for(var key in this.map){var pair=this.map[key];keys.push(pair.key)}return keys},size:function(){return this.n},equals:function(m){if(m.size()!==this.size())return!1;var ret=!0;try{this.forEach(function(value,key){if(value!==m.get(key))throw ret=!1,"break"})}catch(e){}return ret},setAll:function(map){var _this=this;map.forEach(function(value,key){_this.set(key,value)})},set:function(key,value){var skey="\0"+key,previous=this.map[skey];void 0===previous&&this.n++,this.map[skey]={key:key,value:value}},forEach:function(callback){for(var key in this.map){var pair=this.map[key];callback(pair.value,pair.key)}},values:function(){var values=[];for(var key in this.map){var pair=this.map[key];values.push(pair.value)}return values},get:function(key){var skey="\0"+key,pair=this.map[skey];return void 0!==pair?pair.value:void 0},clear:function(){this.map={},this.n=0},remove:function(key){var skey="\0"+key,pair=this.map[skey];if(void 0!==pair)return delete this.map[skey],this.n--,pair.value},has:function(key){var skey="\0"+key;return void 0!==this.map[skey]}},morpheus.ocpu=function(){},morpheus.ocpu.call=function(obj,settings){if(settings.host=settings.host||"localhost:8004",null==settings.library)return alert("Library is not specified. Call terminated"),-1;if(null==settings.fun)return alert("Function is not specified. Call terminated"),-1;if(null==obj)return alert("No arguments for function presented. Call terminated"),-1;var http=new XMLHttpRequest,url="http://"+settings.host+"/ocpu/library/"+settings.library+"/R/"+settings.fun;http.open("POST",url,!1),settings.contentType=settings.contentType||"application/x-protobuf",http.setRequestHeader("Content-Type",settings.contentType);var params=new Uint8Array(obj.toArrayBuffer());http.send(params);var loc;if(201!=http.status)return alert("Some problems occurred during POST request. Call terminated"),-1;loc=http.getResponseHeader("Location");var url2=loc+"R/.val/print",http2=new XMLHttpRequest;return http2.open("GET",url2,!1),http2.send(null),200==http2.status?http2.responseText:(alert("Some problems occurred during GET request. Call terminated"),-1)},morpheus.Set=function(){this._map=new morpheus.Map},morpheus.Set.prototype={toString:function(){var s=[];return this.forEach(function(key){s.length>0&&s.push(", "),s.push(key)}),s.join("")},size:function(){return this._map.size()},equals:function(m){return this._map.equals(m)},forEach:function(callback){this._map.forEach(function(value,key){callback(key)})},add:function(value){this._map.set(value,!0)},values:function(){var values=[];return this._map.forEach(function(value,key){values.push(key)}),values},clear:function(){this._map.clear()},remove:function(key){this._map.remove(key)},has:function(key){return this._map.has(key)}},morpheus.BufferedReader=function(buffer){if(this.buffer=buffer,this.bufferLength=buffer.length,this.index=0,"undefined"!=typeof TextDecoder){var textDecoder=new TextDecoder;this.decoder=function(buf,start,end){return textDecoder.decode(buf.subarray(start,end))}}else this.decoder=function(buf,start,end){for(var s=[],i=start;i=bufferLength)return null;for(var buffer=this.buffer,start=index,end=start;index0&&pw.push(" "),pw.push(valueToIndex.get(vector.getValue(i)));return pw.push("\n"),pw.join("")}},morpheus.GctReader=function(){},morpheus.GctReader.prototype={getFormatName:function(){return"gct"},read:function(fileOrUrl,callback){fileOrUrl instanceof File?this._readChunking(fileOrUrl,callback,!1):this._readNoChunking(fileOrUrl,callback)},_readChunking:function(fileOrUrl,callback,tryNoChunkIfError){var version,dataColumnStart,dataMatrixLineNumberStart,columnNamesArray,_this=this,lineNumber=0,numRowAnnotations=1,numColumnAnnotations=0,nrows=-1,ncols=-1,version=2,rowMetadataNames=[],columnMetadataNames=[],rowMetadata=[[]],columnMetadata=[[]],matrix=[],columnIdFieldName="id",rowIdFieldName="id";Papa.parse(fileOrUrl,{delimiter:"\t",newline:"",header:!1,dynamicTyping:!1,preview:0,encoding:"",worker:!1,comments:!1,step:function(result){if(0===lineNumber){var text=result.data[0][0].trim();"#1.2"===text?version=2:"#1.3"===text?version=3:console.log("Unknown version: assuming version 2")}else if(1===lineNumber){var dimensions=result.data[0];3===version?dimensions.length>=4?(nrows=parseInt(dimensions[0]),ncols=parseInt(dimensions[1]),numRowAnnotations=parseInt(dimensions[2]),numColumnAnnotations=parseInt(dimensions[3])):(numRowAnnotations=parseInt(dimensions[0]),numColumnAnnotations=parseInt(dimensions[1])):(nrows=parseInt(dimensions[0]),ncols=parseInt(dimensions[1]),(nrows<=0||ncols<=0)&&callback("Number of rows and columns must be greater than 0.")),dataColumnStart=numRowAnnotations+1}else if(2===lineNumber){columnNamesArray=result.data[0];for(var i=0;i=4?(nrows=parseInt(dimensions[0]),ncols=parseInt(dimensions[1]),numRowAnnotations=parseInt(dimensions[2]),numColumnAnnotations=parseInt(dimensions[3])):(numRowAnnotations=parseInt(dimensions[0]),numColumnAnnotations=parseInt(dimensions[1]));else if(nrows=parseInt(dimensions[0]),ncols=parseInt(dimensions[1]),nrows<=0||ncols<=0)throw new Error("Number of rows and columns must be greater than 0.");var columnNamesLine=reader.readLine();if(null==columnNamesLine)throw new Error("No column annotations");var columnNamesArray=columnNamesLine.split(tab);if(ncols===-1&&(ncols=columnNamesArray.length-numRowAnnotations-1),2==version){var expectedColumns=ncols+2;if(columnNamesArray.length!==expectedColumns)throw new Error("Expected "+(expectedColumns-2)+" column names, but read "+(columnNamesArray.length-2)+" column names.")}var name=columnNamesArray[0],slashIndex=name.lastIndexOf("/"),columnIdFieldName="id",rowIdFieldName="id";if(slashIndex!=-1&&slashIndex0)for(var columnAnnotationIndex=0;columnAnnotationIndex0)for(var columnAnnotationIndex=0;columnAnnotationIndex0&&pw.push("\t");var value=rowMetadata.get(rowMetadataIndex).getValue(i);null!==value&&pw.push(this.toString(value))}for(var j=0;j0&&pw.push("\t");var name=rowMetadata.get(i).getName();0===i&&name!==columnMetadata.get(0).getName()&&(name=name+"/"+columnMetadata.get(0).getName()),pw.push(name)}for(var j=0;j1&&(rowDescriptions=rowMetadata.get(1));for(var i=0;i1?tokens[1].trim():"";"BLANK"===description&&(description="");for(var ids=[],i=2;i0&&bins[value-1]++}vector.setValue(i,bins)}},morpheus.MafFileReader.getField=function(fieldNames,fieldNameToIndex,options){options=$.extend({},{remove:!0,lc:!1},options);for(var name,index,i=0;i "+String(tokens[tumorAllelColumn]);var wrappedVariant=morpheus.Util.wrapNumber(variantCode,variantObject),variantRow=variantMatrix[rowIndex];void 0===variantRow&&(variantRow=[],variantMatrix[rowIndex]=variantRow);var ccf=-1,priorCcf=-1;if(void 0!==ccfColumnIndex){var ccfRow=ccfMatrix[rowIndex];void 0===ccfRow&&(ccfRow=[],ccfMatrix[rowIndex]=ccfRow),ccf=parseFloat(tokens[ccfColumnIndex]),priorCcf=ccfRow[columnIndex]||-1}var priorValue=variantRow[columnIndex]||-1;variantCode>priorValue?(variantRow[columnIndex]=wrappedVariant,void 0!==ccfColumnIndex&&(ccfRow[columnIndex]=ccf)):variantCode===priorValue&&ccf>priorCcf&&(variantRow[columnIndex]=wrappedVariant,ccfRow[columnIndex]=ccf)}}var dataset=new morpheus.Dataset({name:datasetName,array:variantMatrix,dataType:"object",rows:geneSymbolToIndex.size(),columns:sampleIdToIndex.size()}),columnIds=dataset.getColumnMetadata().add("id");sampleIdToIndex.forEach(function(index,id){columnIds.setValue(index,id)});var rowIds=dataset.getRowMetadata().add("id");geneSymbolToIndex.forEach(function(index,id){rowIds.setValue(index,id)});for(var i=0,nrows=dataset.getRowCount(),ncols=dataset.getColumnCount();i=region.start&&end<=region.end&&rowIndices.push(i)}if(rowIndices.length>0)for(var slice=morpheus.DatasetUtil.slicedView(dataset,rowIndices,null),columnView=new morpheus.DatasetColumnView(slice),j=0;j0&&(dataset=morpheus.SegTabReader.binByRegion(dataset,this.regions)),dataset},read:function(fileOrUrl,callback){var _this=this,name=morpheus.Util.getBaseFileName(morpheus.Util.getFileName(fileOrUrl));morpheus.BufferedReader.getArrayBuffer(fileOrUrl,function(err,arrayBuffer){err?callback(err):callback(null,_this._read(name,new morpheus.BufferedReader(new Uint8Array(arrayBuffer))))})}},morpheus.TcgaUtil=function(){},morpheus.TcgaUtil.DISEASE_STUDIES={ACC:"Adrenocortical carcinoma",BLCA:"Bladder Urothelial Carcinoma",BRCA:"Breast invasive carcinoma",CESC:"Cervical squamous cell carcinoma and endocervical adenocarcinoma",CHOL:"Cholangiocarcinoma",COAD:"Colon adenocarcinoma",COADREAD:"Colonrectal adenocarcinoma",DLBC:"Lymphoid Neoplasm Diffuse Large B-cell Lymphoma",ESCA:"Esophageal carcinoma ",GBM:"Glioblastoma multiforme",GBMLGG:"Glioma",HNSC:"Head and Neck squamous cell carcinoma",KICH:"Kidney Chromophobe",KIPAN:"Pan-Kidney Cohort",KIRC:"Kidney renal clear cell carcinoma",KIRP:"Kidney renal papillary cell carcinoma",LAML:"Acute Myeloid Leukemia",LCML:"Chronic Myelogenous Leukemia",LGG:"Brain Lower Grade Glioma",LIHC:"Liver hepatocellular carcinoma",LUAD:"Lung adenocarcinoma",LUSC:"Lung squamous cell carcinoma",MESO:"Mesothelioma",OV:"Ovarian serous cystadenocarcinoma",PAAD:"Pancreatic adenocarcinoma",PCPG:"Pheochromocytoma and Paraganglioma",PRAD:"Prostate adenocarcinoma",READ:"Rectum adenocarcinoma",SARC:"Sarcoma",SKCM:"Skin Cutaneous Melanoma",STAD:"Stomach adenocarcinoma",STES:"Stomach and Esophageal Carcinoma",TGCT:"Testicular Germ Cell Tumors",THCA:"Thyroid carcinoma",THYM:"Thymoma",UCEC:"Uterine Corpus Endometrial Carcinoma",UCS:"Uterine Carcinosarcoma",UVM:"Uveal Melanoma"},morpheus.TcgaUtil.SAMPLE_TYPES={"01":"Primary solid Tumor","02":"Recurrent Solid Tumor","03":"Primary Blood Derived Cancer - Peripheral Blood","04":"Recurrent Blood Derived Cancer - Bone Marrow","05":"Additional - New Primary","06":"Metastatic","07":"Additional Metastatic","08":"Human Tumor Original Cells","09":"Primary Blood Derived Cancer - Bone Marrow",10:"Blood Derived Normal",11:"Solid Tissue Normal",12:"Buccal Cell Normal",13:"EBV Immortalized Normal",14:"Bone Marrow Normal",20:"Control Analyte",40:"Recurrent Blood Derived Cancer - Peripheral Blood",50:"Cell Lines",60:"Primary Xenograft Tissue",61:"Cell Line Derived Xenograft Tissue"},morpheus.TcgaUtil.barcode=function(s){var sampleType,tokens=s.split("-"),id=tokens[2];return tokens.length>3?(sampleType=tokens[3],sampleType.length>2&&(sampleType=sampleType.substring(0,2)),sampleType=morpheus.TcgaUtil.SAMPLE_TYPES[sampleType]):sampleType=morpheus.TcgaUtil.SAMPLE_TYPES["01"],{id:id.toLowerCase(),sampleType:sampleType}},morpheus.TcgaUtil.setIdAndSampleType=function(dataset){for(var idVector=dataset.getColumnMetadata().get(0),participantId=dataset.getColumnMetadata().add("participant_id"),sampleType=dataset.getColumnMetadata().add("sample_type"),i=0,size=idVector.size();imaxColumns&&(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;i1)for(var i=1;istandardDeviation&&(returnValue=minStdev),returnValue=groupingValue?aHit++:aMiss++)}for(var bHit=0,bMiss=0,j=0,size=listTwo.size();j=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;_a<=n;_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();i0,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();iCause: "),message.push(err.message)),retDef.reject(message.join(""))}),promises.push(p)}),0===promises.length&&retDef.reject("No datasets specified."),$.when.apply($,promises).then(function(){retDef.resolve(morpheus.DatasetUtil.join(loadedDatasets,"id"))}),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=options&&options.extension?options.extension: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,\te.data.options);datasetReader.read(e.data.fileOrUrl, function(err,dataset) {\tself.postMessage(dataset);\t});}"]),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;i0?tokens[tokens.selectionStartIndex]:"";token=$.trim(token);for(var seriesIndices=[],i=0,nrows=dataset.getRowCount();i'+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);index!==-1&&(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;k'+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();i0&&newDataset.addSeries({name:dataset.getName(seriesIndex),rows:dataset.getRowCount(),columns:dataset.getColumnCount(),dataType:"object"});for(var i=0,nrows=dataset.getRowCount(),ncols=dataset.getColumnCount();i0&&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();i0}},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();i=topAndBottomValues[0]}:this.direction===morpheus.TopNFilter.BOTTOM?this.f=function(val){return!isNaN(val)&&val<=topAndBottomValues[1]}:this.f=function(val){return!isNaN(val)&&(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();i0){for(var dataset=this.getFullDataset(),nkeys=sortKeys.length,i=0;i=this.vectors.length)throw"index "+index+" out of range";return this.vectors[index]},remove:function(index){if(index<0||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 index!==-1?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(index<0||index>=this.indices.length)throw"index out of bounds";return this.model.get(this.indices[index])},remove:function(index){if(index<0||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 index!==-1?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;j0?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);index!==-1&&(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"),regexMatch=new RegExp("("+morpheus.Util.escapeRegex(token)+")","i");for(var max=10,vectors=[],isArray=[],j=0;j'+field+":"+val.replace(regexMatch,"$1")+""})})}}catch(x){}null==regex&&(regex=new RegExp(".*","i"));for(var j=0;j'+(null==regexMatch?field:field.replace(regexMatch,"$1"))+":"+("number"===dataType?'min..max':""),show:!0})}}cb(matches)}},morpheus.MetadataUtil.getMetadataNames=function(metadataModel){for(var names=[],i=0,count=metadataModel.getMetadataCount();ib?-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:a=0?aPosMax=value>aPosMax?value:aPosMax:aNegMax=valuea?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:a1?morpheus.Median:function(row){return row.getValue(0)},this.sortOrder===morpheus.SortKey.SortOrder.TOP_N){for(var pairs=[],missingIndices=[],i=0,nrows=visibleModelIndices.length;i=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;iMath.abs(max)&&(max=p)}return max};return f.toString=function(){for(var s=["Maximum of "],i=0,length=percentiles.length;i0&&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();i0;i--){var bigPValue=nominalPValues[pValueIndices[i]],smallPValue=nominalPValues[pValueIndices[i-1]];bigPValue==smallPValue&&(ranks[pValueIndices[i-1]]=ranks[pValueIndices[i]])}for(var i=0;i=lowerOutlier&&(lowerAdjacentValue=Math.min(lowerAdjacentValue,value)),sum+=value}var mean=sum/values.length;return lowerAdjacentValue>q1&&(lowerAdjacentValue=q1),upperAdjacentValue1&&(found=!0)}}if(found)for(var i=0,nrows=newValues.length;in)return!0}return!1},morpheus.VectorUtil.createSpanMap=function(vector){for(var previous=vector.getValue(0),startIndexToEndIndex=new morpheus.Map,start=0,i=1,nrows=vector.size();imax?value:max)}}else for(var i=0,size=vector.size();imax?value:max)}return{min:min,max:max}},morpheus.VectorUtil.getFirstNonNull=function(vector){for(var i=0,length=vector.size();i
  • ');$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:this.options.focus});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()}var toolName=tool.toString(),parenIndex=toolName.indexOf("(");parenIndex!==-1&&(toolName=toolName.substring(0,parenIndex).trim()),morpheus.Util.trackEvent({eventCategory:"Tool",eventAction:toolName})},morpheus.HeatMap.getSpaces=function(groupByKeys,length,gapSize){for(var previousArray=[],nkeys=groupByKeys.length,keyIndex=0;keyIndex0){for(var nkeys=groupByKeys.length,keyIndex=0;keyIndex0)for(var indices=modelIndexSet.values(),i=0,length=indices.length;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("\t"),tipText.push(morpheus.Util.toString(dataset.getRowMetadata().getByName(track.name).getValue(rowIndex)))}),columnTracks.forEach(function(track){tipText.push("\t"),tipText.push(morpheus.Util.toString(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();j1)||morpheus.VectorUtil.containsMoreThanOneValue(v)){null==option&&(option={}),option.title&&v.getProperties().set(morpheus.VectorKeys.TITLE,option.title),option.display&&(display="function"==typeof option.display?option.display(name):option.display);var add="None"!==display;if(add){null==display&&(display="pert_iname"===name||"id"===name||isFirst?"text,tooltip":isColumns?"color,highlight":"text"),isFirst=!1;var track=isColumns?_this.addColumnTrack(name,display):_this.addRowTrack(name,display);if(track.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)&&option.color){var m=isColumns?_this.project.getColumnColorModel():_this.project.getRowColorModel();if(track.isDiscrete())_.each(options.color,function(p){m.setMappedValue(v,p.value,p.color)});else{var cs=m.createContinuousColorMap(v),min=Number.MAX_VALUE,max=-Number.MAX_VALUE;_.each(options.color,function(p){min=Math.min(min,p.value),max=Math.max(max,p.value)}),cs.setMin(min),cs.setMax(max);var valueToFraction=d3.scale.linear().domain([cs.getMin(),cs.getMax()]).range([0,1]).clamp(!0),fractions=[],colors=[];_.each(options.color,function(p){fractions.push(valueToFraction(p.value)),colors.push(p.color)}),cs.setFractions({fractions:fractions,colors:colors})}}if(track.isRenderAs(morpheus.VectorTrack.RENDER.SHAPE)&&option.shape){var m=isColumns?_this.project.getColumnShapeModel():_this.project.getRowShapeModel();_.each(options.shape,function(p){m.setMappedValue(v,p.value,p.shape)})}}}}}};setInitialDisplay(!1,this.options.rows),setInitialDisplay(!0,this.options.columns),reorderTracks(this.options.rows,!1),reorderTracks(this.options.columns,!0);var colorSchemeSpecified=null!=this.options.colorScheme;if(null==this.options.colorScheme){var ext="";if(this.options.dataSource)try{ext=morpheus.Util.getExtension(morpheus.Util.getFileName(this.options.dataSource))}catch(x){}var colorScheme=this.autoDisplay({filename:morpheus.Util.getBaseFileName(morpheus.Util.getFileName(this.options.dataset)),extension:ext});null==colorScheme&&(colorScheme={type:"relative"}),this.options.colorScheme=colorScheme;var name=this.project.getFullDataset().getName();if("maf"===ext&&!this.options.rowSortBy){var sortKeys=[];this.project.getFullDataset().getRowMetadata().getByName("order")&&sortKeys.push(new morpheus.SortKey("order",morpheus.SortKey.SortOrder.ASCENDING)),sortKeys.push(new morpheus.SortKey("id",morpheus.SortKey.SortOrder.ASCENDING)),this.project.setRowSortKeys(sortKeys,!1)}morpheus.DatasetUtil.getSeriesIndex(this.project.getFullDataset(),"allelic_fraction")!==-1&&(this.options.sizeBy="allelic_fraction")}if(this.options.parent&&this.options.inheritFromParent&&!colorSchemeSpecified)heatmap.setColorScheme(this.options.parent.heatmap.getColorScheme().copy(this.project));else if(heatmap.setColorScheme(new morpheus.HeatMapColorScheme(this.project,this.options.colorScheme)),null!=this.options.dataset.getRowMetadata().getByName("Source")){var sourcesSet=morpheus.VectorUtil.getSet(this.options.dataset.getRowMetadata().getByName("Source"));this.heatmap.getColorScheme().setSeparateColorSchemeForRowMetadataField("Source"),sourcesSet.forEach(function(source){_this.autoDisplay({extension:morpheus.Util.getExtension(source),filename:""+source})})}if(this.options.sizeBy&&heatmap.getColorScheme().getSizer().setSeriesName(this.options.sizeBy),this.updateDataset(),this.options.uiReady&&this.options.uiReady(this),this.options.tabOpened){try{this.options.tabOpened(this)}catch(x){console.log("Error in tabOpened"),x.stack&&console.log(x.stack)}this.updateDataset()}if(this.options.renderReady){try{this.options.renderReady(this)}catch(x){console.log("Error in renderReady"),x.stack&&console.log(x.stack)}this.updateDataset()}null!=this.options.rowSize&&("fit"===this.options.rowSize?this.heatmap.getRowPositions().setSize(this.getFitRowSize()):this.heatmap.getRowPositions().setSize(this.options.rowSize),this.revalidate({paint:!1})),null!=this.options.columnSize&&("fit"===this.options.columnSize?this.heatmap.getColumnPositions().setSize(this.getFitColumnSize()):this.heatmap.getColumnPositions().setSize(this.options.columnSize),this.revalidate({paint:!1})),null!=this.options.rowSize&&null!=this.options.columnSize&&("fit"===this.options.columnSize&&(this.heatmap.getColumnPositions().setSize(this.getFitColumnSize()),this.revalidate({paint:!1})),"fit"===this.options.rowSize&&(this.heatmap.getRowPositions().setSize(this.getFitRowSize()),this.revalidate({paint:!1})),this.paintAll({paintRows:!0,paintColumns:!0,invalidateRows:!0,invalidateColumns:!0})),this.options.parent=null,this.$tipFollow=$('
    '),this.$tipFollow.appendTo(this.$parent),this.$tipInfoWindow=$('
    '),this.$tipInfoWindow.appendTo(this.$parent),this.$tipInfoWindow.dialog({close:function(event,ui){_this._togglingInfoWindow||_this.toggleInfoWindow()},autoOpen:!1,width:220,height:280,minHeight:38,minWidth:10,collision:"fit",position:{my:"right-30 bottom",at:"right top",of:this.$parent},title:"Info"}),this.getProject().on("rowFilterChanged columnFilterChanged rowGroupByChanged columnGroupByChanged rowSortOrderChanged columnSortOrderChanged datasetChanged",function(e){if("datasetChanged"===e.type){for(var dataset=_this.getProject().getFullDataset(),i=0;i<_this.rowTracks.length;i++){var track=_this.rowTracks[i];dataset.getRowMetadata().getByName(track.getName())||(_this.removeTrack(track.getName(),!1),i--)}for(var i=0;i<_this.columnTracks.length;i++){var track=_this.columnTracks[i];dataset.getColumnMetadata().getByName(track.getName())||(_this.removeTrack(track.getName(),!0),i--)}}_this.updateDataset(),_this.revalidate()}),this.getProject().on("trackChanged",function(e){var columns=e.columns;_.each(e.vectors,function(v,i){var index=_this.getTrackIndex(v.getName(),columns);if(index===-1)columns?_this.addColumnTrack(v.getName(),e.render[i]):_this.addRowTrack(v.getName(),e.render[i]);else{var track=_this.getTrackByIndex(index,columns),render=e.render[i];render&&track.settingFromConfig(render),track.setInvalid(!0)}}),_this.revalidate()}),this.getProject().on("rowTrackRemoved",function(e){_this.removeTrack(e.vector.getName(),!1),_this.revalidate()}),this.getProject().on("columnTrackRemoved",function(e){_this.removeTrack(e.vector.getName(),!0),_this.revalidate()}),this.getProject().getRowSelectionModel().on("selectionChanged",function(){for(var i=0;i<_this.columnTracks.length;i++){var track=_this.columnTracks[i];track.settings.stackedBar&&track.isRenderAs(morpheus.VectorTrack.RENDER.BAR)&&(track.setInvalid(!0),track.repaint())}_this.verticalSearchBar.update(),_this.paintAll({paintRows:!0,paintColumns:!1,invalidateRows:!1,invalidateColumns:!1})}),this.getProject().getColumnSelectionModel().on("selectionChanged",function(){_this.horizontalSearchBar.update(),_this.paintAll({paintRows:!1,paintColumns:!0,invalidateRows:!1,invalidateColumns:!1})}),$(window).on("paste.morpheus",function(e){if(_this.isActiveComponent()){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(),morpheus.HeatMap.showTool(new morpheus.OpenFileTool({file:url}),_this)}}}).on("beforecopy.morpheus",function(e){_this.isActiveComponent()&&e.preventDefault()}).on("copy.morpheus",function(ev){if(_this.isActiveComponent()){var activeComponent=_this.getActiveComponent(),project=_this.project;if(2===activeComponent){var text=_this.getSelectedElementsText();if(""!==text)return ev.originalEvent.clipboardData.setData("text/plain",text),ev.preventDefault(),void ev.stopImmediatePropagation()}var dataset=project.getSelectedDataset({emptyToAll:!1}),columnMetadata=dataset.getColumnMetadata(),rowMetadata=dataset.getRowMetadata(),visibleColumnFields=_this.getVisibleTrackNames(!0),columnFieldIndices=[];_.each(visibleColumnFields,function(name){var index=morpheus.MetadataUtil.indexOf(columnMetadata,name);index!==-1&&columnFieldIndices.push(index)}),columnMetadata=new morpheus.MetadataModelColumnView(columnMetadata,columnFieldIndices);var rowMetadata=dataset.getRowMetadata(),visibleRowFields=_this.getVisibleTrackNames(!1),rowFieldIndices=[];_.each(visibleRowFields,function(name){var index=morpheus.MetadataUtil.indexOf(rowMetadata,name);index!==-1&&rowFieldIndices.push(index)}),rowMetadata=new morpheus.MetadataModelColumnView(rowMetadata,rowFieldIndices);var text=[],rowsSelected=dataset.getRowCount()>0,columnsSelected=dataset.getColumnCount()>0;if(rowsSelected&&columnsSelected)text=(new morpheus.GctWriter).write(dataset);else{for(var text=[],model=rowsSelected?rowMetadata:columnMetadata,i=0,count=model.getItemCount();i0&&text.push("\t"),text.push(morpheus.Util.toString(v.getValue(i)))}text.push("\n")}text=text.join("")}ev.originalEvent.clipboardData.setData("text/plain",text),ev.preventDefault(),ev.stopImmediatePropagation()}}),this.options.keyboard&&new morpheus.HeatMapKeyListener(this);var dragStartScrollTop,dragStartScrollLeft;this.hammer=morpheus.Util.hammer(_this.heatmap.canvas,["pan","pinch","tap"]).on("panmove",function(event){_this.updatingScroll=!0;var rows=!1,columns=!1;if(0!==event.deltaY){var pos=dragStartScrollTop+event.deltaY;_this.scrollTop(pos),rows=!0}if(0!==event.deltaX){var pos=dragStartScrollLeft+event.deltaX;_this.scrollLeft(pos),columns=!0}_this.updatingScroll=!1,_this.paintAll({paintRows:rows,paintColumns:rows,invalidateRows:rows,invalidateColumns:columns}),event.preventDefault()}).on("panstart",function(event){dragStartScrollTop=_this.scrollTop(),dragStartScrollLeft=_this.scrollLeft()}).on("tap",function(event){var commandKey=morpheus.Util.IS_MAC?event.srcEvent.metaKey:event.srcEvent.ctrlKey;if(!morpheus.Util.IS_MAC||!event.srcEvent.ctrlKey){var position=morpheus.CanvasUtil.getMousePosWithScroll(event.target,event,_this.scrollLeft(),_this.scrollTop()),rowIndex=_this.heatmap.getRowPositions().getIndex(position.y,!1),columnIndex=_this.heatmap.getColumnPositions().getIndex(position.x,!1);_this.project.getElementSelectionModel().click(rowIndex,columnIndex,event.srcEvent.shiftKey||commandKey)}}).on("pinch",function(event){var scale=event.scale;_this.heatmap.getRowPositions().setSize(13*scale),_this.heatmap.getColumnPositions().setSize(13*scale);var reval={};_this.project.getHoverRowIndex()!==-1&&(reval.scrollTop=this.heatmap.getRowPositions().getPosition(this.project.getHoverRowIndex())),_this.project.getHoverColumnIndex()!==-1&&(reval.scrollLeft=this.heatmap.getColumnPositions().getPosition(this.project.getHoverColumnIndex())),_this.revalidate(reval),event.preventDefault()});var heatMapMouseMoved=function(event){var mouseI,mouseJ;if("mouseout"===event.type)mouseI=-1,mouseJ=-1;else{var position=morpheus.CanvasUtil.getMousePosWithScroll(event.target,event,_this.scrollLeft(),_this.scrollTop());mouseI=_this.heatmap.getRowPositions().getIndex(position.y,!1),mouseJ=_this.heatmap.getColumnPositions().getIndex(position.x,!1)}_this.setMousePosition(mouseI,mouseJ,{event:event})};$(_this.heatmap.canvas).on("mouseout",heatMapMouseMoved).on("mousemove",heatMapMouseMoved),_.each(this.options.tools,function(item){var tool=_this.toolbar.getToolByName(item.name);if(null==tool)console.log(item.name+" not found.");else try{var gui=tool.gui(_this.getProject()),formBuilder=new morpheus.FormBuilder;_.each(gui,function(item){formBuilder.append(item)});var input={};if(_.each(gui,function(item){input[item.name]=formBuilder.getValue(item.name)}),item.params)for(var key in item.params)input[key]=item.params[key];tool.execute({controller:_this,project:_this.getProject(),input:input})}catch(x){x.stack&&console.log(x.stack),console.log("Error running "+item.name)}finally{tool.dispose&&tool.dispose()}})},setMousePosition:function(i,j,options){this.mousePositionOptions=options;var updateColumns=this.project.getHoverColumnIndex()!==j,updateRows=this.project.getHoverRowIndex()!==i;updateColumns||updateRows?(this.project.setHoverRowIndex(i),this.project.setHoverColumnIndex(j),this.setToolTip(i,j,options),this.paintAll({paintRows:updateRows, -paintColumns:updateColumns,invalidateRows:!1,invalidateColumns:!1})):this._updateTipFollowPosition(options),this.trigger("change",{name:"setMousePosition",source:this,arguments:arguments})},setTooltipMode:function(mode){this._togglingInfoWindow=!0,this.tooltipMode=mode,this.$tipInfoWindow.html(""),this.toolbar.$tip.html(""),this.$tipFollow.html("").css({left:-1e3,top:-1e3}),this.setToolTip(-1,-1),1===this.tooltipMode?this.$tipInfoWindow.dialog("open"):this.$tipInfoWindow.dialog("close"),this._togglingInfoWindow=!1},toggleInfoWindow:function(){this.setTooltipMode(1==this.tooltipMode?0:1)},_setTipText:function(tipText,tipFollowText,options){0===this.tooltipMode?this.toolbar.$tip.html(tipText.join("")):1===this.tooltipMode&&this.$tipInfoWindow.html(tipText.join("")),tipFollowText.length>0?(this.tipFollowHidden=!1,this.$tipFollow.html(''+tipFollowText.join("")+""),this._updateTipFollowPosition(options)):(this.tipFollowHidden=!0,this.$tipFollow.html("").css({left:-1e3,top:-1e3})),this.trigger("change",{name:"setToolTip",source:this,arguments:arguments})},setToolTip:function(rowIndex,columnIndex,options){if(options=options||{},this.options.showSeriesNameInTooltip&&(options.showSeriesNameInTooltip=!0),options.heatMapLens){var $wrapper=$("
    "),wrapperHeight=0,wrapperWidth=0,found=!1,inline=[];if(null!=rowIndex&&rowIndex.length>0){for(var hoverIndex=0;hoverIndex=0&&(row>=this.heatmap.lastPosition.bottom||row",!1,tipText),this.options.inlineTooltip&&this.tooltipProvider(this,inline[hoverIndex],-1,options,"
    ",!0,tipFollowText);this._setTipText(tipText,tipFollowText,options)}if(null!=columnIndex&&columnIndex.length>0){for(var hoverIndex=0;hoverIndex=0&&(column>=this.heatmap.lastPosition.right||column",!1,tipText),this.options.inlineTooltip&&this.tooltipProvider(this,-1,inline[hoverIndex],options,"
    ",!0,tipFollowText);this._setTipText(tipText,tipFollowText,options)}}var tipText=[];this.tooltipProvider(this,rowIndex,columnIndex,options,0===this.tooltipMode?"   ":"
    ",!1,tipText);var tipFollowText=[];this.options.inlineTooltip&&(this.tooltipProvider(this,rowIndex,columnIndex,options,"
    ",!0,tipFollowText),this.options.tooltip&&rowIndex!==-1&&columnIndex!==-1&&tipFollowText.push('
    ')),this._setTipText(tipText,tipFollowText,options),this.options.tooltip&&rowIndex!==-1&&columnIndex!==-1&&this.options.tooltip(this,rowIndex,columnIndex,this.$tipFollow.find("[data-name=tip]"))},_updateTipFollowPosition:function(options){if(!this.tipFollowHidden){var rect=this.$parent[0].getBoundingClientRect(),tipWidth=this.$tipFollow.width(),tipHeight=this.$tipFollow.height(),left=options.event.clientX-rect.left+16;left+tipWidth>=rect.right&&(left=options.event.clientX-rect.left-16-tipWidth);var top=options.event.clientY-rect.top+16;top+tipHeight>=rect.bottom-rect.top&&(top=options.event.clientY-rect.top-16-tipHeight),this.$tipFollow.css({left:left,top:top})}},setTrackVisibility:function(tracks){var _this=this;_.each(tracks,function(track){var existingTrack=_this.getTrack(track.name,track.isColumns);track.visible&&null!=existingTrack&&0===_.keys(existingTrack.settings).length&&existingTrack.settingFromConfig("Text"),_this.setTrackVisible(track.name,track.visible,track.isColumns)}),this.revalidate(),this.trigger("change",{name:"setTrackVisibility",source:this,arguments:arguments})},setTrackVisible:function(name,visible,isColumns){var trackIndex=this.getTrackIndex(name,isColumns);if(trackIndex===-1){if(!visible)return;isColumns?this.addColumnTrack(name):this.addRowTrack(name)}else{var track=isColumns?this.columnTracks[trackIndex]:this.rowTracks[trackIndex],header=isColumns?this.columnTrackHeaders[trackIndex]:this.rowTrackHeaders[trackIndex];if(track.isVisible()===visible)return;track.setVisible(visible),header.setVisible(visible)}this.trigger("change",{name:"setTrackVisible",source:this,arguments:arguments})},addRowTrack:function(name,renderSettings){if(void 0===name)throw"Name not specified";if("None"!==renderSettings){null==renderSettings&&(renderSettings="[number]"===morpheus.VectorUtil.getDataType(this.project.getFullDataset().getRowMetadata().getByName(name))?"bar":morpheus.VectorTrack.RENDER.TEXT);var track=new morpheus.VectorTrack(this.project,name,this.heatmap.getRowPositions(),(!1),this);track.settingFromConfig(renderSettings),this.rowTracks.push(track),track.appendTo(this.$parent),$(track.canvas).css("z-index","0");var header=new morpheus.VectorTrackHeader(this.project,name,(!1),this);return this.rowTrackHeaders.push(header),header.appendTo(this.$parent),$(header.canvas).css("z-index","0"),track._selection=new morpheus.TrackSelection(track,this.heatmap.getRowPositions(),this.project.getRowSelectionModel(),(!1),this),track}},addTrack:function(name,isColumns,renderSettings){isColumns?this.addColumnTrack(name,renderSettings):this.addRowTrack(name,renderSettings)},addColumnTrack:function(name,renderSettings){if(void 0===name)throw"Name not specified";if("None"!==renderSettings){null==renderSettings&&(renderSettings="[number]"===morpheus.VectorUtil.getDataType(this.project.getFullDataset().getColumnMetadata().getByName(name))?"bar":morpheus.VectorTrack.RENDER.TEXT);var track=new morpheus.VectorTrack(this.project,name,this.heatmap.getColumnPositions(),(!0),this);track.settingFromConfig(renderSettings),this.columnTracks.push(track),track.appendTo(this.$parent);var header=new morpheus.VectorTrackHeader(this.project,name,(!0),this);return this.columnTrackHeaders.push(header),header.appendTo(this.$parent),track._selection=new morpheus.TrackSelection(track,this.heatmap.getColumnPositions(),this.project.getColumnSelectionModel(),(!0),this),track}},addPopup:function(item){this.popupItems||(this.popupItems=[]),this.popupItems.push(item)},getPopupItems:function(){return this.popupItems||[]},removeTrack:function(name,isColumns){var index=this.getTrackIndex(name,isColumns),tracks=isColumns?this.columnTracks:this.rowTracks;if(isNaN(index)||index<0||index>=tracks.length)return void console.log("removeTrack: "+name+" not found.");var headers=isColumns?this.columnTrackHeaders:this.rowTrackHeaders,track=tracks[index],header=headers[index];track.dispose(),track._selection.dispose(),header.dispose(),tracks.splice(index,1),headers.splice(index,1),this.trigger("change",{name:"removeTrack",source:this,arguments:arguments})},updateDataset:function(){var dataset=this.project.getSortedFilteredDataset();this.verticalSearchBar.update(),this.horizontalSearchBar.update(),this.heatmap.setDataset(dataset),this.heatmap.getRowPositions().spaces=morpheus.HeatMap.createGroupBySpaces(dataset,this.project.getGroupRows(),this.gapSize),this.heatmap.getColumnPositions().spaces=morpheus.HeatMap.createGroupBySpaces(new morpheus.TransposedDatasetView(dataset),this.project.getGroupColumns(),this.gapSize),this.trigger("change",{name:"updateDataset",source:this,arguments:arguments})},zoom:function(isZoomIn,options){options=$.extend({},{rows:!0,columns:!0},options),isZoomIn?(options.rows&&this.heatmap.getRowPositions().setSize(1.5*this.heatmap.getRowPositions().getSize()),options.columns&&this.heatmap.getColumnPositions().setSize(1.5*this.heatmap.getColumnPositions().getSize())):(options.rows&&this.heatmap.getRowPositions().setSize(this.heatmap.getRowPositions().getSize()/1.5),options.columns&&this.heatmap.getColumnPositions().setSize(this.heatmap.getColumnPositions().getSize()/1.5));var reval={};options.rows&&this.project.getHoverRowIndex()!==-1&&(reval.scrollTop=this.heatmap.getRowPositions().getPosition(this.project.getHoverRowIndex())),options.columns&&this.project.getHoverColumnIndex()!==-1&&(reval.scrollLeft=this.heatmap.getColumnPositions().getPosition(this.project.getHoverColumnIndex())),this.revalidate(reval),this.trigger("change",{name:"zoom",source:this,arguments:arguments})},getTrackIndex:function(name,isColumns){for(var tracks=isColumns?this.columnTracks:this.rowTracks,i=0,length=tracks.length;i")[0],height=bounds.height,width=bounds.width;canvas.height=height,canvas.width=width;var context=canvas.getContext("2d");this.snapshot(context),canvas.toBlob(function(blob){return null==blob||0===blob.size?void morpheus.FormBuilder.showInModal({title:"Save Image",html:"Image is too large to save."}):void saveAs(blob,file,!0)})}},getTotalSize:function(options){options=$.extend({},{legend:!0},options);var heatmapPrefSize=this.heatmap.getPreferredSize(),totalSize={width:heatmapPrefSize.width,height:heatmapPrefSize.height};this.isDendrogramVisible(!1)&&(totalSize.width+=this.rowDendrogram.getUnscaledWidth()+morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS),this.isDendrogramVisible(!0)&&(totalSize.height+=this.columnDendrogram.getUnscaledHeight()+morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS);for(var maxRowHeaderHeight=0,i=0,length=this.rowTracks.length;i0&&heatMapWidth>maxHeatMapWidth&&(heatMapWidth=maxHeatMapWidth,heatMapWidth=Math.min(heatMapWidth,heatmapPrefSize.width)),void 0!==this.heatmap.prefWidth&&(heatMapWidth=Math.min(heatmapPrefSize.width,this.heatmap.prefWidth)),void 0!==this.columnDendrogram?(this.columnDendrogram.setBounds({width:heatMapWidth,height:columnDendrogramHeight,left:xpos,top:0}),this.columnDendrogram.$label.css("left",xpos+this.columnDendrogram.getUnscaledWidth()+10).css("top",2),this.columnDendrogram.$squishedLabel.css("left",xpos+this.columnDendrogram.getUnscaledWidth()+10).css("top",18),this.beforeColumnTrackDivider.setVisible(!0),this.beforeColumnTrackDivider.setBounds({left:xpos-maxHeaderWidth,top:ypos,width:maxHeaderWidth}),ypos++):this.beforeColumnTrackDivider.setVisible(!1);for(var i=0,length=this.columnTracks.length;iavailableHeight-ypos&&(heatMapHeight=Math.max(100,Math.min(heatmapPrefSize.height,availableHeight-ypos))),ypos<0&&(ypos=0),this.rowDendrogram?(this.rowDendrogram.setBounds({width:Math.max(rowDendrogramWidth,maxHeaderWidth),height:heatMapHeight,left:0,top:ypos}),this.rowDendrogram.$label.css("left",0).css("top",2), -this.afterRowDendrogramDivider.setVisible(!0),this.afterRowDendrogramDivider.setBounds({height:heatMapHeight,left:this.rowDendrogram.getUnscaledWidth(),top:ypos}),xpos++):this.afterRowDendrogramDivider.setVisible(!1),this.heatmap.setBounds({width:heatMapWidth,height:heatMapHeight,left:xpos,top:ypos}),this.hSortByValuesIndicator.setBounds({height:4,width:heatMapWidth,left:xpos,top:ypos-4}),this.hscroll.setVisible(heatMapWidth0&&(xpos+=morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS);for(var rowAnnotationXStart=xpos,i=0,length=this.rowTracks.length;i0),this.afterVerticalScrollBarDivider.setBounds({left:rowAnnotationXStart-2,top:ypos-18}),this.vscroll.setVisible(heatMapHeightthis.rowCachedMax?d:this.rowCachedMax,this.rowCachedMin=d"),this.currentValue=null,this.legend=new morpheus.LegendWithStops,this.legend.on("added",function(e){var fractions=that.colorScheme.getFractions();fractions.push(e.fraction);var colors=that.colorScheme.getColors();colors.push("black"),that.colorScheme.setFractions({fractions:fractions,colors:colors}),that.setSelectedIndex(_.indexOf(fractions,e.fraction)),that.fireChanged()}).on("selectedIndex",function(e){that.setSelectedIndex(e.selectedIndex)}).on("delete",function(index){that.deleteSelectedStop()}).on("moved",function(e){var fraction=e.fraction,fractions=that.colorScheme.getFractions();fractions[that.legend.selectedIndex]=fraction,that.colorScheme.setFractions({fractions:fractions,colors:that.colorScheme.getColors()});var newIndex=that.colorScheme.getFractions().indexOf(fraction);newIndex!==-1&&(that.legend.selectedIndex=newIndex);var fractionToValue=d3.scale.linear().domain([0,1]).range([that.colorScheme.getMin(),that.colorScheme.getMax()]).clamp(!0);that.formBuilder.setValue("selected_value",fractionToValue(fractions[that.legend.selectedIndex])),that.fireChanged()});var $row=$("
    ");$row.css("height","50px").css("width","300px").css("margin-left","auto").css("margin-right","auto"),$row.appendTo(this.$div),this.colorScheme=null,$(this.legend.canvas).appendTo($row);var formBuilder=new morpheus.FormBuilder,items=[];items=items.concat({name:"selected_color",type:"color",col:"col-xs-2"},{name:"selected_value",type:"text",col:"col-xs-4"},[{name:"delete",type:"button",value:"Delete Selected Color Stop"},{name:"add",type:"button",value:"Add Color Stop"}],{name:"minimum",type:"text",col:"col-xs-4"},{name:"maximum",type:"text",col:"col-xs-4"}),options.showRelative&&(items=items.concat({name:"color_scheme",type:"radio",options:["fixed","relative"]})),items=items.concat({name:"missing_color",type:"color",col:"col-xs-2"}),items.push({name:"stepped_colors",type:"checkbox",value:!1,help:"Intervals include left end point and exclude right end point, except for the highest interval"}),_.each(items,function(item){formBuilder.append(item)}),this.$div.append(formBuilder.$form),formBuilder.$form.find("[name^=selected],[name=delete]").prop("disabled",!0),formBuilder.$form.find("[name=add]").on("click",function(e){for(var fractions=that.colorScheme.getFractions(),val=.5;val>=0&&_.indexOf(fractions,val)!==-1;)val-=.1;val=Math.max(0,val),fractions.push(val);var colors=that.colorScheme.getColors();colors.push("black"),that.colorScheme.setFractions({fractions:fractions,colors:colors}),that.setSelectedIndex(_.indexOf(fractions,val)),that.fireChanged()}),formBuilder.$form.find("[name=delete]").on("click",function(e){that.deleteSelectedStop()}),formBuilder.$form.on("keyup","[name=selected_value]",_.debounce(function(e){var val=parseFloat($(this).val());isNaN(val)||(that.setSelectedValue(val),that.fireChanged())},100)),formBuilder.$form.on("change","[name=selected_color]",function(e){var colors=that.colorScheme.getColors();colors[that.legend.selectedIndex]=$(this).val(),that.colorScheme.setFractions({fractions:that.colorScheme.getFractions(),colors:colors}),that.fireChanged()}),formBuilder.$form.on("change","[name=missing_color]",function(e){var color=$(this).val();that.colorScheme.setMissingColor(color),that.fireChanged(!1)}),formBuilder.$form.on("change","[name=stepped_colors]",function(e){that.colorScheme.setStepped($(this).prop("checked")),that.fireChanged()}),formBuilder.$form.on("keyup","[name=minimum]",_.debounce(function(e){var val=parseFloat($(this).val());isNaN(val)||(that.colorScheme.setMin(val),that.setSelectedIndex(that.legend.selectedIndex),that.fireChanged(!1))},100)),formBuilder.$form.on("keyup","[name=maximum]",_.debounce(function(e){var val=parseFloat($(this).val());isNaN(val)||(that.colorScheme.setMax(val),that.setSelectedIndex(that.legend.selectedIndex),that.fireChanged(!1))},100)),formBuilder.$form.on("change","[name=color_scheme]",_.throttle(function(e){that.legend.selectedIndex=-1;var val=$(this).val(),scalingMode="relative"===val?morpheus.HeatMapColorScheme.ScalingMode.RELATIVE:morpheus.HeatMapColorScheme.ScalingMode.FIXED;that.colorScheme.setScalingMode(scalingMode),that.setColorScheme(that.colorScheme),that.fireChanged()},100)),this.formBuilder=formBuilder},morpheus.HeatMapColorSchemeChooser.prototype={deleteSelectedStop:function(){var fractions=this.colorScheme.getFractions();fractions.splice(this.legend.selectedIndex,1);var colors=this.colorScheme.getColors();colors.splice(this.legend.selectedIndex,1),this.colorScheme.setFractions({fractions:fractions,colors:colors}),this.formBuilder.$form.find("[name^=selected],[name=delete]").prop("disabled",!0),this.legend.setSelectedIndex(-1),this.fireChanged()},setSelectedValue:function(val){var valueToFraction=d3.scale.linear().domain([this.colorScheme.getMin(),this.colorScheme.getMax()]).range([0,1]).clamp(!0),fractions=this.colorScheme.getFractions();fractions[this.legend.selectedIndex]=valueToFraction(val),this.colorScheme.setFractions({fractions:fractions,colors:this.colorScheme.getColors()})},setSelectedIndex:function(index){var fractions=this.colorScheme.getFractions();index>=fractions.length&&(index=-1),this.legend.setSelectedIndex(index);var formBuilder=this.formBuilder;if(formBuilder.$form.find("[name^=selected],[name=delete]").prop("disabled",this.legend.selectedIndex===-1),this.legend.selectedIndex!==-1){var fractionToValue=d3.scale.linear().domain([0,1]).range([this.colorScheme.getMin(),this.colorScheme.getMax()]).clamp(!0);formBuilder.setValue("selected_value",fractionToValue(fractions[this.legend.selectedIndex]));var context=this.legend.canvas.getContext("2d"),colors=this.colorScheme.getColors();context.fillStyle=colors[this.legend.selectedIndex],formBuilder.setValue("selected_color",context.fillStyle)}else formBuilder.setValue("selected_value","");this.draw()},setMinMax:function(){this.colorScheme.getScalingMode()===morpheus.HeatMapColorScheme.ScalingMode.RELATIVE&&(this.colorScheme.setMin(0),this.colorScheme.setMax(1))},dispose:function(){this.off("change"),this.legend.destroy(),this.formBuilder.$form.off("keyup","input"),this.formBuilder.$form.off("change","[name=color_scheme]")},restoreCurrentValue:function(){this.colorScheme.setCurrentValue&&this.colorScheme.setCurrentValue(this.currentValue)},setCurrentValue:function(value){this.currentValue=value,this.colorScheme.setCurrentValue&&this.colorScheme.setCurrentValue(this.currentValue),this.setColorScheme(this.colorScheme)},setColorScheme:function(colorScheme){this.colorScheme=colorScheme,this.setMinMax(),colorScheme.setCurrentValue&&colorScheme.setCurrentValue(this.currentValue),this.formBuilder.setValue("color_scheme",colorScheme.getScalingMode()===morpheus.HeatMapColorScheme.ScalingMode.RELATIVE?"relative":"fixed"),this.formBuilder.$form.find("[name=minimum],[name=maximum]").prop("disabled",colorScheme.getScalingMode()===morpheus.HeatMapColorScheme.ScalingMode.RELATIVE),this.formBuilder.setValue("minimum",this.colorScheme.getMin()),this.formBuilder.setValue("maximum",this.colorScheme.getMax()),this.formBuilder.setValue("stepped_colors",this.colorScheme.isStepped()),this.formBuilder.setValue("missing_color",this.colorScheme.getMissingColor()),this.draw()},getFractionToStopPix:function(){return d3.scale.linear().clamp(!0).domain([0,1]).range([this.legend.border,this.legend.getUnscaledWidth()-this.legend.border])},fireChanged:function(noreset){this.trigger("change"),noreset!==!1&&this.setColorScheme(this.colorScheme)},draw:function(){var colorScheme=this.colorScheme;colorScheme.getScalingMode()===morpheus.HeatMapColorScheme.ScalingMode.RELATIVE&&(colorScheme.setMin(0),colorScheme.setMax(1));var fractions=colorScheme.getFractions(),colors=colorScheme.getColors(),fractionToStopPix=this.getFractionToStopPix();this.legend.draw(fractions,colors,colorScheme.isStepped(),fractionToStopPix)}},morpheus.Util.extend(morpheus.HeatMapColorSchemeChooser,morpheus.Events),morpheus.HeatMapColorSchemeLegend=function(controller,$keyContent){var totalHeight,colorScheme=controller.heatmap.getColorScheme(),tracks=colorScheme.getColorByValues();$keyContent.empty();var ntracks=tracks.length;tracks.forEach(function(value){if(null!=value||1===ntracks){if("null"!=value){var $label=$(''+value+"");$keyContent.append($label),totalHeight+=$label.height()}var trackLegend=new morpheus.HeatMapColorSchemeLegendTrack(colorScheme,value);$(trackLegend.canvas).css("position",""),trackLegend.repaint(),trackLegend.on("selectionChanged",function(){controller.heatmap.setInvalid(!0),controller.heatmap.repaint()}),$keyContent.append($(trackLegend.canvas)),totalHeight+=trackLegend.getUnscaledHeight()}}),controller.options.$key&&($keyContent.append(controller.options.$key),totalHeight+=controller.options.$key.height());var $edit=$('');$edit.find("[data-name=options]").on("click",function(e){e.preventDefault(),controller.showOptions(),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"options"})}),totalHeight+=$edit.height(),$keyContent.append($edit),$keyContent.css({"text-overflow":"ellipsis",overflow:"hidden",width:"250px",height:totalHeight+"px"})},morpheus.HeatMapColorSchemeLegendTrack=function(colorScheme,value){morpheus.AbstractCanvas.call(this,!1);var _this=this;this.value=value,this.colorScheme=colorScheme,colorScheme.setCurrentValue(value);var hiddenValues=colorScheme.getHiddenValues(),names=colorScheme.getNames(),hasNames=null!=names,legendHeight=hasNames?14*names.length:30,bounds={width:250,height:legendHeight};this.hasNames=hasNames,this.setBounds(bounds),hasNames&&hiddenValues&&$(this.canvas).on("click",function(e){e.preventDefault(),e.stopPropagation();var clickedRow=Math.floor((e.clientY-_this.canvas.getBoundingClientRect().top)/14),fractionToValue=d3.scale.linear().domain([0,1]).range([colorScheme.getMin(),colorScheme.getMax()]).clamp(!0),fractions=colorScheme.getFractions(),value=fractionToValue(fractions[clickedRow]);hiddenValues.has(value)?hiddenValues.remove(value):hiddenValues.add(value),_this.trigger("selectionChanged"),_this.repaint()})},morpheus.HeatMapColorSchemeLegendTrack.prototype={draw:function(clip,context){var colorScheme=this.colorScheme;colorScheme.setCurrentValue(this.value),context.fillStyle="white",context.fillRect(0,0,this.getUnscaledWidth(),this.getUnscaledHeight()),context.translate(this.hasNames?14:(this.getUnscaledWidth()-200)/2,0),morpheus.HeatMapColorSchemeLegend.drawColorScheme(context,colorScheme,200)}},morpheus.Util.extend(morpheus.HeatMapColorSchemeLegendTrack,morpheus.AbstractCanvas),morpheus.Util.extend(morpheus.HeatMapColorSchemeLegendTrack,morpheus.Events),morpheus.HeatMapColorSchemeLegend.drawColorScheme=function(context,colorScheme,width,printing,hideText){var names=colorScheme.getNames(),hasNames=null!=names;if(hasNames)morpheus.HeatMapColorSchemeLegend.drawColorSchemeVertically(context,colorScheme,colorScheme.getHiddenValues(),printing);else{if(morpheus.HeatMapColorSchemeLegend.draw(context,colorScheme.getFractions(),colorScheme.getColors(),width,12,colorScheme.isStepped()),context.strokeStyle="LightGrey",context.strokeRect(0,0,width,12),hideText)return;var map=d3.scale.linear().domain([0,1]).range([0,width]).clamp(!0),fractionToValue=d3.scale.linear().domain([0,1]).range([colorScheme.getMin(),colorScheme.getMax()]).clamp(!0);if(context.textAlign="center",context.textBaseline="top",context.fillStyle="black",context.font="12px "+morpheus.CanvasUtil.FONT_NAME,colorScheme.getScalingMode()===morpheus.HeatMapColorScheme.ScalingMode.RELATIVE)context.fillText("row min",0,14),context.fillText("row max",width,14);else{for(var fractions=colorScheme.getFractions(),lastTextPixEnd=-1,halfway=parseInt(fractions.length/2),i=0;ilastTextPixEnd&&context.fillText(text,pix,14),lastTextPixEnd=pix+textWidth/2}for(var lastTextPixStart=1e4,i=fractions.length-1;i>=halfway;i--){var pix=map(fractions[i]),text="";text=hasNames?""!=names[i]?names[i]+" ("+fractionToValue(fractions[i])+")":names[i]:morpheus.Util.nf(fractionToValue(fractions[i]));var textWidth=context.measureText(text).width;pix0?tokens[tokens.selectionStartIndex]:"";token=$.trim(token);for(var seriesIndices=[],i=0,nrows=dataset.getRowCount();i'+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);index!==-1&&(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;k'+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();i0&&newDataset.addSeries({name:dataset.getName(seriesIndex),rows:dataset.getRowCount(),columns:dataset.getColumnCount(),dataType:"object"});for(var i=0,nrows=dataset.getRowCount(),ncols=dataset.getColumnCount();i0&&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();i0}},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();i=topAndBottomValues[0]}:this.direction===morpheus.TopNFilter.BOTTOM?this.f=function(val){return!isNaN(val)&&val<=topAndBottomValues[1]}:this.f=function(val){return!isNaN(val)&&(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();i0){for(var dataset=this.getFullDataset(),nkeys=sortKeys.length,i=0;i=this.vectors.length)throw"index "+index+" out of range";return this.vectors[index]},remove:function(index){if(index<0||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 index!==-1?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(index<0||index>=this.indices.length)throw"index out of bounds";return this.model.get(this.indices[index])},remove:function(index){if(index<0||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 index!==-1?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;j0?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);index!==-1&&(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"),regexMatch=new RegExp("("+morpheus.Util.escapeRegex(token)+")","i");for(var max=10,vectors=[],isArray=[],j=0;j'+field+":"+val.replace(regexMatch,"$1")+""})})}}catch(x){}null==regex&&(regex=new RegExp(".*","i"));for(var j=0;j'+(null==regexMatch?field:field.replace(regexMatch,"$1"))+":"+("number"===dataType?'min..max':""),show:!0})}}cb(matches)}},morpheus.MetadataUtil.getMetadataNames=function(metadataModel){for(var names=[],i=0,count=metadataModel.getMetadataCount();ib?-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:a=0?aPosMax=value>aPosMax?value:aPosMax:aNegMax=valuea?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:a1?morpheus.Median:function(row){return row.getValue(0)},this.sortOrder===morpheus.SortKey.SortOrder.TOP_N){for(var pairs=[],missingIndices=[],i=0,nrows=visibleModelIndices.length;i=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;iMath.abs(max)&&(max=p)}return max};return f.toString=function(){for(var s=["Maximum of "],i=0,length=percentiles.length;i0&&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();i0;i--){var bigPValue=nominalPValues[pValueIndices[i]],smallPValue=nominalPValues[pValueIndices[i-1]];bigPValue==smallPValue&&(ranks[pValueIndices[i-1]]=ranks[pValueIndices[i]])}for(var i=0;i=lowerOutlier&&(lowerAdjacentValue=Math.min(lowerAdjacentValue,value)),sum+=value}var mean=sum/values.length;return lowerAdjacentValue>q1&&(lowerAdjacentValue=q1),upperAdjacentValue1&&(found=!0)}}if(found)for(var i=0,nrows=newValues.length;in)return!0}return!1},morpheus.VectorUtil.createSpanMap=function(vector){for(var previous=vector.getValue(0),startIndexToEndIndex=new morpheus.Map,start=0,i=1,nrows=vector.size();imax?value:max)}}else for(var i=0,size=vector.size();imax?value:max)}return{min:min,max:max}},morpheus.VectorUtil.getFirstNonNull=function(vector){for(var i=0,length=vector.size();i