"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;pix=0||project.getHoverRowIndex()>=0){var height=rowPositions.getItemSize(project.getHoverColumnIndex()),width=columnPositions.getItemSize(project.getHoverColumnIndex()),y=project.getHoverRowIndex()===-1?rowPositions.getPosition(rowPositions.getLength()-1):rowPositions.getPosition(project.getHoverRowIndex()),x=project.getHoverColumnIndex()===-1?columnPositions.getPosition(0):columnPositions.getPosition(project.getHoverColumnIndex());project.getHoverColumnIndex()!==-1&&context.strokeRect(x-clip.x,0,width,this.getUnscaledHeight()),project.getHoverRowIndex()!==-1&&context.strokeRect(0,y-clip.y,this.getUnscaledWidth(),height),project.getHoverColumnIndex()!==-1&&project.getHoverRowIndex()!==-1&&(context.strokeStyle="black",context.lineWidth=3,context.strokeRect(x-clip.x+1.5,y-clip.y+1.5,width-1.5,height-1.5))}var left=morpheus.Positions.getLeft(clip,columnPositions),right=morpheus.Positions.getRight(clip,columnPositions),top=morpheus.Positions.getTop(clip,rowPositions),bottom=morpheus.Positions.getBottom(clip,rowPositions);context.strokeStyle="rgb(182,213,253)",context.lineWidth=3,context.translate(-clip.x,-clip.y);var selectedElements=project.getElementSelectionModel().getViewIndices();null!=selectedElements&&selectedElements.forEach(function(id){var rowIndex=id.getArray()[0],columnIndex=id.getArray()[1];if(rowIndex>=top&&rowIndex=left&&columnIndex0){for(var condition=null,ci=0,nconditions=conditions.length;ci10&&rowSize>10;grid&&context.strokeRect(px,py,columnSize,rowSize)}}context.lineWidth=1}},morpheus.Util.extend(morpheus.HeatMapElementCanvas,morpheus.AbstractCanvas),morpheus.HeatMapKeyListener=function(controller){var keydown=function(e){var tagName=e.target.tagName,found=!1,commandKey=morpheus.Util.IS_MAC?e.metaKey:e.ctrlKey,shiftKey=(e.altKey,e.shiftKey);if(commandKey&&shiftKey&&70===e.which&&(controller.getToolbar().toggleMenu(),found=!0),"INPUT"==tagName||"SELECT"==tagName||"TEXTAREA"==tagName);else if(commandKey&&65===e.which){var active=controller.getActiveComponent();if(active!==-1){found=!0;for(var selectionModel=0===active?controller.getProject().getRowSelectionModel():controller.getProject().getColumnSelectionModel(),count=0===active?controller.getProject().getSortedFilteredDataset().getRowCount():controller.getProject().getSortedFilteredDataset().getColumnCount(),indices=new morpheus.Set,i=0;i0){e.preventDefault(),e.stopPropagation();var blob=new Blob([text]),url=window.URL.createObjectURL(blob);morpheus.HeatMap.showTool(new morpheus.OpenFileTool({file:url}),controller)}}}),$keyelement.on("mousewheel",function(e){var scrolly=e.deltaY*e.deltaFactor,scrollx=e.deltaX*e.deltaFactor;e.altKey?controller.zoom(scrolly>0,{rows:!0,columns:!0}):(0!==scrolly&&controller.scrollTop(controller.scrollTop()-scrolly),0!==scrollx&&controller.scrollLeft(controller.scrollLeft()-scrollx)),e.preventDefault(),e.stopPropagation()})},morpheus.HeatMapOptions=function(controller){function createMetadataField(isColumns){var options=[],value={};_.each(controller.getVisibleTrackNames(isColumns),function(name){value[name]=!0}),_.each(morpheus.MetadataUtil.getMetadataNames(isColumns?controller.getProject().getFullDataset().getColumnMetadata():controller.getProject().getFullDataset().getRowMetadata()),function(name){options.push(name)});var field={type:"bootstrap-select",search:options.length>10,name:isColumns?"column_annotations":"row_annotations",multiple:!0,value:value,options:options,toggle:!0};return field}function annotationsListener($select,isColumns){var names=[];_.each(controller.getVisibleTrackNames(isColumns),function(name){names.push(name)});var values=$select.val(),selectedNow=_.difference(values,names),unselectedNow=_.difference(names,values),tracks=[];_.each(selectedNow,function(name){tracks.push({name:name,isColumns:isColumns,visible:!0})}),_.each(unselectedNow,function(name){tracks.push({name:name,isColumns:isColumns,visible:!1})}),controller.setTrackVisibility(tracks),colorSchemeChooser.restoreCurrentValue()}var items=[{name:"color_by",required:!0,type:"select",options:["(None)"].concat(morpheus.MetadataUtil.getMetadataNames(controller.getProject().getFullDataset().getRowMetadata())),value:controller.heatmap.getColorScheme().getSeparateColorSchemeForRowMetadataField()},{name:"color_by_value",required:!0,type:"select",options:[]},{name:"load_predefined_scheme",required:!0,type:"select",options:[{name:"",value:""},{name:"relative",value:"gene"},{name:"binary",value:"binary"},{name:"MAF",value:"MAF"},{name:"fixed (-1, -0.5, 0.5, 1)",value:"wtcs"},{name:"fixed (-1.5, -0.1, 0.1, 1.5)",value:"cn"},{name:"fixed (-100, -98, -95, 95, 98, 100)",value:"100scale2"},{name:"fixed (-100, -98, 98, 100)",value:"100scale1"}]},{name:"save_color_scheme",type:"button"},{name:"load_color_scheme",type:"file"}];controller.getProject().getFullDataset().getSeriesCount()>1&&(items.push({name:"size_by",required:!0,type:"select",options:["(None)"].concat(morpheus.DatasetUtil.getSeriesNames(controller.getProject().getFullDataset()))}),items.push({name:"size_by_minimum",title:"Size by minimum",required:!0,type:"text",col:"col-xs-4"}),items.push({name:"size_by_maximum",title:"Size by maximum",required:!0,type:"text",col:"col-xs-4"}),items.push({name:"conditional_rendering",required:!0,type:"button",col:"col-xs-4"}));var displayItems=[{name:"show_grid",required:!0,type:"checkbox",value:controller.heatmap.isDrawGrid()},{name:"row_size",required:!0,type:"text",col:"col-xs-4",value:morpheus.Util.nf(controller.heatmap.getRowPositions().getSize())},{name:"column_size",required:!0,type:"text",col:"col-xs-4",value:morpheus.Util.nf(controller.heatmap.getColumnPositions().getSize())}];controller.rowDendrogram&&displayItems.push({name:"row_dendrogram_line_thickness",required:!0,type:"text",col:"col-xs-4",value:morpheus.Util.nf(controller.rowDendrogram?controller.rowDendrogram.lineWidth:1)}),controller.columnDendrogram&&displayItems.push({name:"column_dendrogram_line_thickness",required:!0,type:"text",col:"col-xs-4",value:morpheus.Util.nf(controller.columnDendrogram?controller.columnDendrogram.lineWidth:1)}),displayItems.push({name:"info_window",required:!0,type:"select",col:"col-xs-4",options:[{name:"Fixed To Top",value:0},{name:"New Window",value:1}],value:controller.tooltipMode}),displayItems.push({name:"inline_tooltip",required:!0,type:"checkbox",value:controller.options.inlineTooltip});var colorSchemeFormBuilder=new morpheus.FormBuilder;_.each(items,function(item){colorSchemeFormBuilder.append(item)});var displayFormBuilder=new morpheus.FormBuilder;_.each(displayItems,function(item){displayFormBuilder.append(item)});var colorSchemeChooser=new morpheus.HeatMapColorSchemeChooser({showRelative:!0}),updatingSizer=!1;colorSchemeChooser.on("change",function(){controller.heatmap.getColorScheme().getSizer&&null!=controller.heatmap.getColorScheme().getSizer()&&(colorSchemeFormBuilder.setValue("size_by",controller.heatmap.getColorScheme().getSizer().getSeriesName()),colorSchemeFormBuilder.setEnabled("size_by_minimum",null!=controller.heatmap.getColorScheme().getSizer().getSeriesName()),colorSchemeFormBuilder.setEnabled("size_by_maximum",null!=controller.heatmap.getColorScheme().getSizer().getSeriesName()),updatingSizer||(colorSchemeFormBuilder.setValue("size_by_minimum",controller.heatmap.getColorScheme().getSizer().getMin()),colorSchemeFormBuilder.setValue("size_by_maximum",controller.heatmap.getColorScheme().getSizer().getMax()))),controller.heatmap.setInvalid(!0),controller.heatmap.repaint(),colorSchemeChooser.restoreCurrentValue()});var annotationsBuilder=new morpheus.FormBuilder;annotationsBuilder.append(createMetadataField(!1)),annotationsBuilder.append(createMetadataField(!0));var $ca=annotationsBuilder.$form.find("[name=column_annotations]");$ca.on("change",function(e){annotationsListener($(this),!0)});var $ra=annotationsBuilder.$form.find("[name=row_annotations]");$ra.on("change",function(e){annotationsListener($(this),!1)});var annotationOptionsTabId=_.uniqueId("morpheus"),heatMapOptionsTabId=_.uniqueId("morpheus"),displayOptionsTabId=_.uniqueId("morpheus"),$metadataDiv=$('
    ');$metadataDiv.append($(annotationsBuilder.$form));var $heatMapDiv=$('
    ');$heatMapDiv.append(colorSchemeChooser.$div),$heatMapDiv.append($(colorSchemeFormBuilder.$form));var $displayDiv=$('
    ');$displayDiv.append($(displayFormBuilder.$form)),displayFormBuilder.$form.find("[name=show_grid]").on("click",function(e){var grid=$(this).prop("checked");controller.heatmap.setDrawGrid(grid),controller.revalidate(),colorSchemeChooser.restoreCurrentValue()}),displayFormBuilder.$form.find("[name=inline_tooltip]").on("click",function(e){controller.options.inlineTooltip=$(this).prop("checked")}),displayFormBuilder.$form.find("[name=row_size]").on("keyup",_.debounce(function(e){controller.heatmap.getRowPositions().setSize(parseFloat($(this).val())),controller.revalidate(),colorSchemeChooser.restoreCurrentValue()},100)),displayFormBuilder.$form.find("[name=info_window]").on("change",function(e){controller.setTooltipMode(parseInt($(this).val()))});var $colorByValue=colorSchemeFormBuilder.$form.find("[name=color_by_value]"),separateSchemesField=controller.heatmap.getColorScheme().getSeparateColorSchemeForRowMetadataField();null!=separateSchemesField&&$colorByValue.html(morpheus.Util.createOptions(morpheus.VectorUtil.createValueToIndexMap(controller.project.getFullDataset().getRowMetadata().getByName(separateSchemesField)).keys())),colorSchemeChooser.setColorScheme(controller.heatmap.getColorScheme()),null!=separateSchemesField&&colorSchemeChooser.setCurrentValue($colorByValue.val()),controller.heatmap.getColorScheme().getSizer&&null!=controller.heatmap.getColorScheme().getSizer()&&controller.heatmap.getColorScheme().getSizer().getSeriesName()&&colorSchemeFormBuilder.setValue("size_by",controller.heatmap.getColorScheme().getSizer().getSeriesName()),colorSchemeFormBuilder.$form.find("[name=size_by]").on("change",function(e){var series=$(this).val();"(None)"==series&&(series=null),colorSchemeChooser.colorScheme.getSizer().setSeriesName(series),colorSchemeChooser.fireChanged()}),colorSchemeFormBuilder.$form.find("[name=size_by_minimum]").on("keyup",_.debounce(function(e){updatingSizer=!0,colorSchemeChooser.colorScheme.getSizer().setMax(parseFloat($(this).val())),colorSchemeChooser.fireChanged(!0),updatingSizer=!1},100)),colorSchemeFormBuilder.$form.find("[name=size_by_maximum]").on("keyup",_.debounce(function(e){updatingSizer=!0,colorSchemeChooser.colorScheme.getSizer().setMax(parseFloat($(this).val())),colorSchemeChooser.fireChanged(!0),updatingSizer=!1},100)),colorSchemeFormBuilder.$form.find("[name=conditional_rendering]").on("click",function(e){e.preventDefault();var conditionalRenderingUI=new morpheus.ConditionalRenderingUI(controller);morpheus.FormBuilder.showInModal({title:"Conditional Rendering",html:conditionalRenderingUI.$div,close:"Close",z:1051,callback:function(){}})}),colorSchemeFormBuilder.find("save_color_scheme").on("click",function(e){e.preventDefault();var blob=new Blob([controller.heatmap.getColorScheme().toJson()],{type:"application/json"});saveAs(blob,"color_scheme.json")}),colorSchemeFormBuilder.on("change",function(e){"load_color_scheme"===e.name&&""!==e.value&&null!=e.value&&morpheus.Util.getText(e.value).done(function(text){var json=JSON.parse($.trim(text));controller.heatmap.getColorScheme().fromJson(json),colorSchemeChooser.setColorScheme(controller.heatmap.getColorScheme()),controller.heatmap.setInvalid(!0),controller.heatmap.repaint()}).fail(function(){morpheus.FormBuilder.showInModal({title:"Error",html:"Unable to read saved color scheme."})})}),colorSchemeFormBuilder.$form.on("change","[name=load_predefined_scheme]",function(e){var val=$(this).val();""!==val?("gene"===val?controller.heatmap.getColorScheme().setColorSupplierForCurrentValue(morpheus.HeatMapColorScheme.createColorSupplier(morpheus.HeatMapColorScheme.Predefined.RELATIVE())):"cn"===val?controller.heatmap.getColorScheme().setColorSupplierForCurrentValue(morpheus.HeatMapColorScheme.createColorSupplier(morpheus.HeatMapColorScheme.Predefined.CN())):"wtcs"===val?controller.heatmap.getColorScheme().setColorSupplierForCurrentValue(morpheus.HeatMapColorScheme.createColorSupplier({type:"fixed",map:[{value:-1,color:"blue"},{value:-.5,color:"white"},{value:.5,color:"white"},{value:1,color:"red"}]})):"MAF"===val?controller.heatmap.getColorScheme().setColorSupplierForCurrentValue(morpheus.HeatMapColorScheme.createColorSupplier(morpheus.HeatMapColorScheme.Predefined.MAF())):"binary"===val?controller.heatmap.getColorScheme().setColorSupplierForCurrentValue(morpheus.HeatMapColorScheme.createColorSupplier(morpheus.HeatMapColorScheme.Predefined.BINARY())):"100scale1"===val?controller.heatmap.getColorScheme().setColorSupplierForCurrentValue(morpheus.HeatMapColorScheme.createColorSupplier(morpheus.HeatMapColorScheme.Predefined.SUMMLY())):"100scale2"===val?controller.heatmap.getColorScheme().setColorSupplierForCurrentValue(morpheus.HeatMapColorScheme.createColorSupplier(morpheus.HeatMapColorScheme.Predefined.SUMMLY2())):console.log("not found"),colorSchemeChooser.setColorScheme(controller.heatmap.getColorScheme()),controller.heatmap.setInvalid(!0),controller.heatmap.repaint(),$(this).val("")):console.log("empty option selected"),colorSchemeChooser.restoreCurrentValue()}),colorSchemeFormBuilder.$form.find("[name=color_by]").on("change",function(e){var colorByField=$(this).val();"(None)"==colorByField&&(colorByField=null),controller.heatmap.getColorScheme().setSeparateColorSchemeForRowMetadataField(colorByField),null!=colorByField&&$colorByValue.html(morpheus.Util.createOptions(morpheus.VectorUtil.createValueToIndexMap(controller.project.getFullDataset().getRowMetadata().getByName(colorByField)).keys()));var colorByValue=$colorByValue.val();controller.heatmap.getColorScheme().setCurrentValue(colorByValue),colorSchemeChooser.setCurrentValue(colorByValue),controller.heatmap.setInvalid(!0),controller.heatmap.repaint(),colorSchemeChooser.setColorScheme(controller.heatmap.getColorScheme())}),$colorByValue.on("change",function(e){null==controller.heatmap.getColorScheme().getSeparateColorSchemeForRowMetadataField()?(colorSchemeChooser.setCurrentValue(null),controller.heatmap.getColorScheme().setCurrentValue(null),colorSchemeChooser.setColorScheme(controller.heatmap.getColorScheme())):(colorSchemeChooser.setCurrentValue($colorByValue.val()),colorSchemeChooser.setColorScheme(controller.heatmap.getColorScheme()))}),displayFormBuilder.$form.find("[name=column_size]").on("keyup",_.debounce(function(e){controller.heatmap.getColumnPositions().setSize(parseFloat($(this).val())),controller.revalidate(),colorSchemeChooser.restoreCurrentValue()},100)),displayFormBuilder.$form.find("[name=gap_size]").on("keyup",_.debounce(function(e){controller.gapSize=parseFloat($(this).val()),controller.revalidate(),colorSchemeChooser.restoreCurrentValue()},100)),displayFormBuilder.$form.find("[name=squish_factor]").on("keyup",_.debounce(function(e){var f=parseFloat($(this).val());controller.heatmap.getColumnPositions().setSquishFactor(f),controller.heatmap.getRowPositions().setSquishFactor(f),controller.revalidate(),colorSchemeChooser.restoreCurrentValue()},100)),displayFormBuilder.$form.find("[name=row_dendrogram_line_thickness]").on("keyup",_.debounce(function(e){controller.rowDendrogram.lineWidth=parseFloat($(this).val()),controller.revalidate(),colorSchemeChooser.restoreCurrentValue()},100)),displayFormBuilder.$form.find("[name=column_dendrogram_line_thickness]").on("keyup",_.debounce(function(e){controller.columnDendrogram.lineWidth=parseFloat($(this).val()),controller.revalidate(),colorSchemeChooser.restoreCurrentValue()},100));var $tab=$('
    ');$metadataDiv.appendTo($tab),$heatMapDiv.appendTo($tab),$displayDiv.appendTo($tab);var $div=$("
    "),$ul=$('');$ul.appendTo($div),$tab.appendTo($div),$ul.find("[role=tab]:eq(1)").tab("show"),morpheus.FormBuilder.showInModal({title:"Options",html:$div,close:"Close",callback:function(){$div.find("input").off("keyup"),$ca.off("change"),$ra.off("change"),$div.remove(),colorSchemeChooser.dispose()}})},morpheus.HeatMapToolBar=function(controller){function searchValues(){var $searchResultsLabel=_this.$el.find("[data-name=searchResultsValues]"),text=$.trim(_this.$valueTextField.val());if(""===text)$searchResultsLabel.html(""),project.getElementSelectionModel().setViewIndices(null);else{var viewIndices=new morpheus.Set;morpheus.DatasetUtil.searchValues(project.getSortedFilteredDataset(),text,function(value,i,j){viewIndices.add(new morpheus.Identifier([i,j]))}),project.getElementSelectionModel().setViewIndices(viewIndices),$searchResultsLabel.html(viewIndices.size()+" match"+(1===viewIndices.size()?"":"es"))}}this.controller=controller,this.rowSearchResultModelIndices=[],this.columnSearchResultModelIndices=[];var _this=this,$el=$('
    '),searchHtml=[],$search=$('');$search.on("submit",function(e){e.preventDefault()}),controller.options.toolbar.searchRows&&(searchHtml.push('
    '),searchHtml.push('
    '),searchHtml.push('
    '),searchHtml.push(''),searchHtml.push('"),searchHtml.push("
    "),searchHtml.push(''),searchHtml.push("
    "),searchHtml.push("
    "),searchHtml.push('
    '),searchHtml.push(''),searchHtml.push(''),searchHtml.push(''),searchHtml.push(''),searchHtml.push(''),searchHtml.push(""),searchHtml.push("
    ")),controller.options.toolbar.searchColumns&&(searchHtml.push('
    '),searchHtml.push('
    '),searchHtml.push('
    '),searchHtml.push('
    '),searchHtml.push(''),searchHtml.push('"),searchHtml.push("
    "),searchHtml.push('
    '),searchHtml.push("
    "),searchHtml.push(""),searchHtml.push('
    '),searchHtml.push(''),searchHtml.push(''),searchHtml.push(''),searchHtml.push(''),searchHtml.push(''),searchHtml.push(""),searchHtml.push("
    ")),searchHtml.push('
    '),searchHtml.push('
    Values
    '),searchHtml.push("
    "),searchHtml.push('
    '),searchHtml.push('
    '),searchHtml.push("
    "),searchHtml.push('"),searchHtml.push('"),searchHtml.push('
    '),searchHtml.push('
    '),searchHtml.push('
    '),searchHtml.push("
    "),searchHtml.push('
    '),$(searchHtml.join("")).appendTo($search),controller.options.toolbar.searchValues||$search.find("[data-name=searchValuesDiv]").css("display","none");var $buttons=$search.find("[data-name=buttons]"),$tools=$('
    ');$tools.on("submit",function(e){e.preventDefault()});var toolbarHtml=[];controller.options.toolbar.zoom&&(toolbarHtml.push(''),toolbarHtml.push(''),toolbarHtml.push(''),toolbarHtml.push('')),toolbarHtml.push('
    '),controller.options.toolbar.sort&&toolbarHtml.push(''),controller.options.toolbar.options&&toolbarHtml.push(''), toolbarHtml.push('
    '),controller.options.toolbar.saveImage&&toolbarHtml.push(''),controller.options.toolbar.saveDataset&&toolbarHtml.push(''),controller.options.toolbar.openFile&&toolbarHtml.push(''),toolbarHtml.push('
    '),controller.options.toolbar.filter&&toolbarHtml.push(''),"undefined"!=typeof Plotly&&toolbarHtml.push('');var tools=[{tool:new morpheus.HClusterTool},{tool:new morpheus.MarkerSelection},{tool:new morpheus.NearestNeighbors},{tool:new morpheus.NewHeatMapTool},null,{tool:new morpheus.AdjustDataTool},{tool:new morpheus.CollapseDatasetTool},{tool:new morpheus.CreateAnnotation},{tool:new morpheus.SimilarityMatrixTool},{tool:new morpheus.TransposeTool},{tool:new morpheus.WordCloudTool}];if(this.getToolByName=function(name){for(var i=0;i'),toolbarHtml.push(''),toolbarHtml.push('")}toolbarHtml.push('
    '),controller.options.toolbar.colorKey&&(toolbarHtml.push('
    '),toolbarHtml.push(''),toolbarHtml.push('"),toolbarHtml.push("
    ")),toolbarHtml.push('
    '),toolbarHtml.push(''),toolbarHtml.push(''),$buttons.on("click","[name=pca]",function(){console.log("test button clicked"),new morpheus.PcaPlotTool({project:controller.getProject()})}),$buttons.on("click","[name=es]",function(){console.log("es button clicked");controller.getProject().getFullDataset().getESSession()});var $lineOneColumn=$el.find("[data-name=lineOneColumn]");$search.appendTo($lineOneColumn);var $toolbarForm=$(toolbarHtml.join(""));$toolbarForm.appendTo($buttons),controller.options.$help&&controller.options.$help.appendTo($buttons),$('
    ').appendTo($el.find("[data-name=lineTwoColumn]")),$el.prependTo(controller.$content);var $tools=$el.find("[data-name=tools]");this.$tip=$el.find("[data-name=tip]"),$tools.on("click","li > a",function(e){e.preventDefault();var index=parseInt($(this).attr("data-name"));tools[index].tool?morpheus.HeatMap.showTool(tools[index].tool,controller):tools[index].action()}),this.defaultRowMatchMode="contains",this.defaultColumnMatchMode="contains";var $rowSearchOptions=$el.find("[data-name=rowSearchOptions]");$rowSearchOptions.on("click","li > a",function(e){e.preventDefault(),_this.defaultRowMatchMode=$(this).attr("data-name"),$rowSearchOptions.find("li").removeClass("active"),$(this).parent("li").addClass("active"),_this.search(!0),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"rowSearchMatchMode"})});var $columnSearchOptions=$el.find("[data-name=columnSearchOptions]");$columnSearchOptions.on("click","li > a",function(e){e.preventDefault(),_this.defaultColumnMatchMode=$(this).attr("data-name"),$columnSearchOptions.find("li").removeClass("active"),$(this).parent("li").addClass("active"),_this.search(!1),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"columnSearchMatchMode"})});var filterModal=[],filterLabelId=_.uniqueId("morpheus");filterModal.push('");var $filterModal=$(filterModal.join(""));$filterModal.on("mousewheel",function(e){e.stopPropagation()});var $filter=$("
    ");$filter.appendTo($filterModal.find(".modal-body")),$filterModal.appendTo($el);var filterHtml=[];filterHtml.push('
    '),filterHtml.push('
    ');var $filterChooser=$(filterHtml.join(""));$filterChooser.appendTo($filter);var columnFilterUI=new morpheus.FilterUI(controller.getProject(),(!0)),rowFilterUI=new morpheus.FilterUI(controller.getProject(),(!1));controller.getProject().getRowFilter().on("focus",function(e){$filterChooser.find("[value=rows]").prop("checked",!0),columnFilterUI.$div.hide(),rowFilterUI.$div.show(),$filterModal.modal("show"),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"rowFilter"})}),controller.getProject().getColumnFilter().on("focus",function(e){$filterChooser.find("[value=columns]").prop("checked",!0),columnFilterUI.$div.show(),rowFilterUI.$div.hide(),$filterModal.modal("show"),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"columnFilter"})}),rowFilterUI.$div.appendTo($filter),columnFilterUI.$div.appendTo($filter),columnFilterUI.$div.css("display","none");var $filterRadio=$filterChooser.find("[name=rowsOrColumns]");$filterRadio.on("change",function(e){var val=$filterRadio.filter(":checked").val();"columns"===val?(columnFilterUI.$div.show(),rowFilterUI.$div.hide()):(columnFilterUI.$div.hide(),rowFilterUI.$div.show()),e.preventDefault()}),$el.find("[name=filterButton]").on("click",function(){$filterModal.modal("show"),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"filter"})}),$el.find('[data-toggle="tooltip"]').tooltip({placement:"bottom",container:"body",trigger:"hover"}).on("click",function(){$(this).tooltip("hide")});var $key=$el.find("[data-name=key]"),$keyContent=$el.find("[data-name=keyContent]");$key.dropdown().parent().on("show.bs.dropdown",function(){new morpheus.HeatMapColorSchemeLegend(controller,$keyContent),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"colorKey"})}),$el.find("[name=openFile]").on("click",function(){morpheus.HeatMap.showTool(new morpheus.OpenFileTool({customUrls:controller._customUrls}),controller)}),$el.find("[name=saveImage]").on("click",function(){morpheus.HeatMap.showTool(new morpheus.SaveImageTool,controller)}),$el.find("[name=saveDataset]").on("click",function(){morpheus.HeatMap.showTool(new morpheus.SaveDatasetTool,controller)}),$el.find("[name=chart]").on("click",function(){new morpheus.ChartTool({project:controller.getProject(),getVisibleTrackNames:_.bind(controller.getVisibleTrackNames,controller)}),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"chart"})});var _this=this;$el.find("[name=tutorial]").on("click",function(){window.open("http://www.broadinstitute.org/cancer/software/morpheus/tutorial.html"),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"tutorial"})}),this.$previousColumnMatch=$el.find("[name=previousColumnMatch]"),this.$nextColumnMatch=$el.find("[name=nextColumnMatch]"),this.$previousRowMatch=$el.find("[name=previousRowMatch]"),this.$nextRowMatch=$el.find("[name=nextRowMatch]"),this.$dimensionsLabel=$el.find("[data-name=dim]"),this.$columnTextField=$el.find("[name=searchColumns]"),this.$valueTextField=$el.find("[name=searchValues]"),this.$selectionLabel=$el.find("[data-name=selection]"),this.$rowTextField=$el.find("[name=searchRows]"),this.$columnMatchesToTop=$el.find("[name=columnMatchesToTop]"),this.$rowMatchesToTop=$el.find("[name=rowMatchesToTop]"),this.$rowSearchDiv=$el.find("[data-name=rowSearchDiv]"),this.$columnSearchDiv=$el.find("[data-name=columnSearchDiv]"),this.$searchRowDendrogramWrapper=$el.find("[data-name=searchRowDendrogramWrapper]"),this.$searchRowDendrogram=$el.find("[name=searchRowDendrogram]"),this.$searchResultsRowDendrogram=$el.find("[data-name=searchResultsRowDendrogram]"),this.$searchColumnDendrogramWrapper=$el.find("[data-name=searchColumnDendrogramWrapper]"),this.$searchColumnDendrogram=$el.find("[name=searchColumnDendrogram]"),this.$searchResultsColumnDendrogram=$el.find("[data-name=searchResultsColumnDendrogram]"),controller.on("dendrogramAnnotated",function(e){(e.isColumns?_this.$searchColumnDendrogramWrapper:_this.$searchRowDendrogramWrapper).show()}),controller.on("dendrogramChanged",function(e){(e.isColumns?_this.$searchColumnDendrogramWrapper:_this.$searchRowDendrogramWrapper).hide()});var project=controller.getProject();morpheus.Util.autosuggest({$el:this.$rowTextField,filter:function(terms,cb){var indices=[],meta=project.getSortedFilteredDataset().getRowMetadata();controller.getVisibleTrackNames(!1).forEach(function(name){indices.push(morpheus.MetadataUtil.indexOf(meta,name))}),meta=new morpheus.MetadataModelColumnView(meta,indices),morpheus.MetadataUtil.autocomplete(meta)(terms,cb)},select:function(){_this.search(!0)}}),this.$rowTextField.on("keyup",_.debounce(function(e){13===e.which&&e.preventDefault(),_this.search(!0),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"searchRows"})},500)),morpheus.Util.autosuggest({$el:this.$columnTextField,filter:function(terms,cb){var indices=[],meta=project.getSortedFilteredDataset().getColumnMetadata();controller.getVisibleTrackNames(!0).forEach(function(name){indices.push(morpheus.MetadataUtil.indexOf(meta,name))}),meta=new morpheus.MetadataModelColumnView(meta,indices),morpheus.MetadataUtil.autocomplete(meta)(terms,cb)},select:function(){_this.search(!1)}}),this.$columnTextField.on("keyup",_.debounce(function(e){13===e.which&&e.preventDefault(),_this.search(!1),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"searchColumns"})},500)),this.$searchRowDendrogram.on("keyup",_.debounce(function(e){13===e.which&&e.preventDefault(),_this.searchDendrogram(!1),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"searchRowDendrogram"})},500)),this.$searchColumnDendrogram.on("keyup",_.debounce(function(e){13===e.which&&e.preventDefault(),_this.searchDendrogram(!0),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"searchColumnDendrogram"})},500)),morpheus.Util.autosuggest({$el:this.$valueTextField,filter:function(terms,cb){morpheus.DatasetUtil.autocompleteValues(project.getSortedFilteredDataset())(terms,cb)},select:function(){searchValues()}}),this.$valueTextField.on("keyup",_.debounce(function(e){13===e.which&&(_this.$valueTextField.autocomplete("close"),e.preventDefault()),searchValues()},500)),$toolbarForm.on("submit",function(e){e.preventDefault()}),$buttons.on("click","[name=in]",function(e){e.preventDefault(),controller.zoom(!0),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"zoomIn"})}),$buttons.on("click","[name=out]",function(e){e.preventDefault(),controller.zoom(!1),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"zoomOut"})}),$buttons.on("click","[name=options]",function(e){e.preventDefault(),controller.showOptions(),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"options"})}),$buttons.on("click","[name=sort]",function(e){e.preventDefault(),new morpheus.SortDialog(project),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"sort"})}),$buttons.on("click","[name=fit]",function(e){e.preventDefault(),controller.fitToWindow(!0),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"fit"})}),$buttons.on("click","[name=resetZoom]",function(e){e.preventDefault(),controller.resetZoom(),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"resetZoom"})}),this.toggleMenu=function(){"none"===$lineOneColumn.css("display")?($lineOneColumn.css("display",""),_this.$rowTextField.focus()):($lineOneColumn.css("display","none"),$(_this.controller.heatmap.canvas).focus())},this.$el=$el;var updateFilterStatus=function(){controller.getProject().getRowFilter().isEnabled()||controller.getProject().getColumnFilter().isEnabled()?_this.$el.find("[name=filterButton]").addClass("btn-primary"):_this.$el.find("[name=filterButton]").removeClass("btn-primary")};updateFilterStatus(),this.$columnMatchesToTop.on("click",function(e){e.preventDefault();var $this=$(this);$this.toggleClass("btn-primary"),_this.setSelectionOnTop({isColumns:!0,isOnTop:$this.hasClass("btn-primary"),updateButtonStatus:!1}),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"columnMatchesToTop"})}),this.$rowMatchesToTop.on("click",function(e){e.preventDefault();var $this=$(this);$this.toggleClass("btn-primary"),_this.setSelectionOnTop({isColumns:!1,isOnTop:$this.hasClass("btn-primary"),updateButtonStatus:!1}),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"rowMatchesToTop"})}),project.on("rowSortOrderChanged.morpheus",function(e){_this.searching||(_this._updateSearchIndices(!1),_this.$rowMatchesToTop.removeClass("btn-primary"))}),project.on("columnSortOrderChanged.morpheus",function(e){_this.searching||(_this._updateSearchIndices(!0),_this.$columnMatchesToTop.removeClass("btn-primary"))}),controller.getProject().on("rowFilterChanged.morpheus",function(e){_this.search(!0),updateFilterStatus()}),controller.getProject().on("columnFilterChanged.morpheus",function(e){_this.search(!1),updateFilterStatus()}),controller.getProject().on("datasetChanged.morpheus",function(){_this.search(!0),_this.search(!1),updateFilterStatus()}),controller.getProject().getRowSelectionModel().on("selectionChanged.morpheus",function(){_this.updateSelectionLabel()}),controller.getProject().getColumnSelectionModel().on("selectionChanged.morpheus",function(){_this.updateSelectionLabel()}),this.rowSearchResultViewIndicesSorted=null,this.currentRowSearchIndex=0,this.columnSearchResultViewIndicesSorted=null,this.currentColumnSearchIndex=-1,this.$previousColumnMatch.on("click",function(){_this.currentColumnSearchIndex--,_this.currentColumnSearchIndex<0&&(_this.currentColumnSearchIndex=_this.columnSearchResultViewIndicesSorted.length-1),controller.scrollLeft(controller.getHeatMapElementComponent().getColumnPositions().getPosition(_this.columnSearchResultViewIndicesSorted[_this.currentColumnSearchIndex])),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"previousColumnMatch"})}),this.$previousRowMatch.on("click",function(){_this.currentRowSearchIndex--,_this.currentRowSearchIndex<0&&(_this.currentRowSearchIndex=_this.rowSearchResultViewIndicesSorted.length-1),controller.scrollTop(controller.getHeatMapElementComponent().getRowPositions().getPosition(_this.rowSearchResultViewIndicesSorted[_this.currentRowSearchIndex])),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"previousRowMatch"})}),this.$nextColumnMatch.on("click",function(){_this.next(!0),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"nextColumnMatch"})}),this.$nextRowMatch.on("click",function(){_this.next(!1),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"nextRowMatch"})}),this.updateDimensionsLabel(),this.updateSelectionLabel()},morpheus.HeatMapToolBar.HIGHLIGHT_SEARCH_MODE=0,morpheus.HeatMapToolBar.FILTER_SEARCH_MODE=1,morpheus.HeatMapToolBar.MATCHES_TO_TOP_SEARCH_MODE=2,morpheus.HeatMapToolBar.SELECT_MATCHES_SEARCH_MODE=3,morpheus.HeatMapToolBar.prototype={quickColumnFilter:!1,searching:!1,rowSearchMode:morpheus.HeatMapToolBar.SELECT_MATCHES_SEARCH_MODE,columnSearchMode:morpheus.HeatMapToolBar.SELECT_MATCHES_SEARCH_MODE,_updateSearchIndices:function(isColumns){var project=this.controller.getProject();if(isColumns){for(var viewIndices=[],modelIndices=this.columnSearchResultModelIndices,i=0,length=modelIndices.length;i=this.columnSearchResultViewIndicesSorted.length&&(this.currentColumnSearchIndex=0),controller.scrollLeft(controller.getHeatMapElementComponent().getColumnPositions().getPosition(this.columnSearchResultViewIndicesSorted[this.currentColumnSearchIndex]))):(this.currentRowSearchIndex++,this.currentRowSearchIndex>=this.rowSearchResultViewIndicesSorted.length&&(this.currentRowSearchIndex=0),controller.scrollTop(controller.getHeatMapElementComponent().getRowPositions().getPosition(this.rowSearchResultViewIndicesSorted[this.currentRowSearchIndex])))},setSearchText:function(options){var $tf=options.isColumns?this.$columnTextField:this.$rowTextField,existing=options.append?$.trim($tf.val()):"";""!==existing&&(existing+=" "),options.onTop&&(options.isColumns?this.$columnMatchesToTop.addClass("btn-primary"):this.$rowMatchesToTop.addClass("btn-primary")),$tf.val(existing+options.text),this.search(!options.isColumns),options.scrollTo&&this.next(options.isColumns)},updateDimensionsLabel:function(){var p=this.controller.getProject(),d=p.getFullDataset(),f=p.getSortedFilteredDataset(),text="showing "+morpheus.Util.intFormat(f.getRowCount())+"/"+morpheus.Util.intFormat(d.getRowCount())+" rows, "+morpheus.Util.intFormat(f.getColumnCount())+"/"+morpheus.Util.intFormat(d.getColumnCount())+" columns";this.$dimensionsLabel.html(text)},updateSelectionLabel:function(){var nc=this.controller.getProject().getColumnSelectionModel().count(),nr=this.controller.getProject().getRowSelectionModel().count(),text=[];text.push(morpheus.Util.intFormat(nr)+" row"),1!==nr&&text.push("s"),text.push(", "),text.push(morpheus.Util.intFormat(nc)+" column"),1!==nc&&text.push("s"),text.push(" selected"),this.$selectionLabel.html(text.join(""))},searchDendrogram:function(isColumns){var text=$.trim(isColumns?this.$searchColumnDendrogram.val():this.$searchRowDendrogram.val()),dendrogram=isColumns?this.controller.columnDendrogram:this.controller.rowDendrogram,$searchResults=isColumns?this.$searchResultsColumnDendrogram:this.$searchResultsRowDendrogram,matches=morpheus.AbstractDendrogram.search(dendrogram.tree.rootNode,text);if(matches===-1?$searchResults.html(""):$searchResults.html(matches+" match"+(1===matches?"":"es")),matches<=0){var positions=isColumns?this.controller.getHeatMapElementComponent().getColumnPositions():this.controller.getHeatMapElementComponent().getRowPositions();positions.setSquishedIndices(null),isColumns?this.controller.getProject().setGroupColumns([],!0):this.controller.getProject().setGroupRows([],!0),positions.setSize(isColumns?this.controller.getFitColumnSize():this.controller.getFitRowSize())}else morpheus.AbstractDendrogram.squishNonSearchedNodes(this.controller,isColumns);this.controller.updateDataset(),this.controller.revalidate()},search:function(isRows){this.searching=!0;for(var isMatchesOnTop=isRows?this.$rowMatchesToTop.hasClass("btn-primary"):this.$columnMatchesToTop.hasClass("btn-primary"),controller=this.controller,project=controller.getProject(),sortKeys=isRows?project.getRowSortKeys():project.getColumnSortKeys(),keyIndex=-1,i=0;i0&&tipText.push(separator),tipText.push(pair.name),tipText.push(": "),_.isArray(pair.value))for(var i=0;i0&&tipText.push(", "),tipText.push(pair.value[i]);else tipText.push(pair.value);tipText.push("")}),rowIndex!==-1&&columnIndex!==-1){for(var i=0,nseries=dataset.getSeriesCount();i0);if(quick){var quickRowTracks=heatMap.rowTracks.filter(function(t){return t.settings.inlineTooltip});morpheus.HeatMapTooltipProvider._tracksToString(quickRowTracks,dataset.getRowMetadata(),rowIndex,tipText,separator),morpheus.HeatMapTooltipProvider._tracksToString(heatMap.columnTracks.filter(function(t){return t.settings.inlineTooltip}),dataset.getColumnMetadata(),columnIndex,tipText,separator)}}else quick&&(rowIndex!==-1&&morpheus.HeatMapTooltipProvider._tracksToString(heatMap.rowTracks.filter(function(t){return t.settings.inlineTooltip&&options.name!==t.getName()}),dataset.getRowMetadata(),rowIndex,tipText,separator),columnIndex!==-1&&morpheus.HeatMapTooltipProvider._tracksToString(heatMap.columnTracks.filter(function(t){return t.settings.inlineTooltip&&options.name!==t.getName()}),dataset.getColumnMetadata(),columnIndex,tipText,separator));if(quick){if(null!=options.name){var metadata=rowIndex!==-1?dataset.getRowMetadata():dataset.getColumnMetadata(),vector=metadata.getByName(options.name),track=heatMap.getTrack(options.name,columnIndex!==-1),colorByName=null!=track?track.settings.colorByField:null,additionalVector=null!=colorByName?metadata.getByName(colorByName):null;morpheus.HeatMapTooltipProvider.vectorToString(vector,rowIndex!==-1?rowIndex:columnIndex,tipText,separator,additionalVector)}}else rowIndex!==-1&&morpheus.HeatMapTooltipProvider._metadataToString(options,heatMap.rowTracks,dataset.getRowMetadata(),rowIndex,tipText,separator),columnIndex!==-1&&morpheus.HeatMapTooltipProvider._metadataToString(options,heatMap.columnTracks,dataset.getColumnMetadata(),columnIndex,tipText,separator);var rowNodes=[],columnNodes=[],selectedRowNodes=[],selectedColumnNodes=[];if(options.rowNodes&&(rowNodes=options.rowNodes),options.columnNodes&&(columnNodes=options.columnNodes),!quick){if(heatMap.rowDendrogram&&(selectedRowNodes=_.values(heatMap.rowDendrogram.selectedRootNodeIdToNode)),heatMap.columnDendrogram&&(selectedColumnNodes=_.values(heatMap.columnDendrogram.selectedRootNodeIdToNode)),selectedRowNodes.length>0&&rowNodes.length>0){var nodeIds={};_.each(selectedRowNodes,function(n){nodeIds[n.id]=!0}),rowNodes=_.filter(rowNodes,function(n){return void 0===nodeIds[n.id]})}if(selectedColumnNodes.length>0&&columnNodes.length>0){var nodeIds={};_.each(selectedColumnNodes,function(n){nodeIds[n.id]=!0}),columnNodes=_.filter(columnNodes,function(n){return void 0===nodeIds[n.id]})}}morpheus.HeatMapTooltipProvider._nodesToString(tipText,rowNodes,null,separator),morpheus.HeatMapTooltipProvider._nodesToString(tipText,columnNodes,null,separator),quick||(selectedRowNodes.length>0&&morpheus.HeatMapTooltipProvider._nodesToString(tipText,selectedRowNodes,heatMap.rowDendrogram._selectedNodeColor,separator),selectedColumnNodes.length>0&&morpheus.HeatMapTooltipProvider._nodesToString(tipText,selectedColumnNodes,heatMap.columnDendrogram._selectedNodeColor,separator))},morpheus.HeatMapTooltipProvider._matrixValueToString=function(dataset,rowIndex,columnIndex,seriesIndex,tipText,separator,showSeriesNameInTooltip){var val=dataset.getValue(rowIndex,columnIndex,seriesIndex);if(null!=val)if(val.toObject||!_.isNumber(val)){var obj=val.toObject?val.toObject():val,keys=_.keys(obj);if(0===keys.length){var v=morpheus.Util.toString(obj);tipText.length>0&&tipText.push(separator),showSeriesNameInTooltip&&(tipText.push(dataset.getName(seriesIndex)),tipText.push(": ")),tipText.push(""),tipText.push(v),tipText.push("")}else for(var i=0,nkeys=keys.length;i0&&tipText.push(separator),tipText.push(key),tipText.push(": "),tipText.push(v),tipText.push("")}}}else tipText.length>0&&tipText.push(separator),showSeriesNameInTooltip&&(tipText.push(dataset.getName(seriesIndex)),tipText.push(": ")),tipText.push(""),tipText.push(morpheus.Util.nf(val)),tipText.push("")},morpheus.HeatMapTooltipProvider.vectorToString=function(vector,index,tipText,separator,additionalVector){var arrayValueToString=function(arrayFieldName,arrayVal){if(null!=arrayVal)if(null!=arrayFieldName&&(tipText.length>0&&tipText.push(separator),tipText.push(arrayFieldName)),arrayVal.toObject){tipText.push(" ");var obj=arrayVal.toObject(),keys=_.keys(obj);_.each(keys,function(key){var subVal=obj[key];null!=subVal&&""!=subVal&&(tipText.length>0&&tipText.push(separator),tipText.push(key),tipText.push(": "),tipText.push(morpheus.Util.toString(subVal)),tipText.push(""))})}else tipText.push(": "),tipText.push(morpheus.Util.toString(arrayVal)),tipText.push("")};if(null!=vector){var primaryVal=vector.getValue(index);if(null!=primaryVal&&""!=primaryVal){var primaryFields=vector.getProperties().get(morpheus.VectorKeys.FIELDS);if(null!=primaryFields){var visibleFieldIndices=vector.getProperties().get(morpheus.VectorKeys.VISIBLE_FIELDS);void 0===visibleFieldIndices&&(visibleFieldIndices=morpheus.Util.seq(primaryFields.length));var additionalFieldNames=null!=additionalVector?additionalVector.getProperties().get(morpheus.VectorKeys.FIELDS):null,additionalVal=null!=additionalFieldNames?additionalVector.getValue(index):null;tipText.length>0&&tipText.push(separator),tipText.push(vector.getName());for(var j=0;j0&&tipText.push(separator),tipText.push(additionalVector.getName());for(var j=0;j0&&tipText.push(separator),tipText.push(vector.getName()),tipText.push(": "),tipText.push(morpheus.Util.toString(primaryVal)),tipText.push("")}}},morpheus.HeatMapTooltipProvider._tracksToString=function(tracks,metadata,index,tipText,separator){ for(var i=0;i0&&tipText.push(separator),color&&tipText.push(''),tipText.push(name),tipText.push(": "),_.isArray(value))for(var i=0;i0&&tipText.push(", "),tipText.push(morpheus.Util.toString(value[i]));else tipText.push(morpheus.Util.toString(value));tipText.push(""),color&&tipText.push("")}};_.each(nodes,function(node){if(node.info)for(var name in node.info){var value=node.info[name];renderField(name,value)}renderField("depth",node.depth);var nLeafNodes=1+Math.abs(node.maxIndex-node.minIndex);nLeafNodes>0&&renderField("# of leaf nodes",nLeafNodes)})},morpheus.HeatMapTrackColorLegend=function(tracks,colorModel){morpheus.AbstractCanvas.call(this,!1),this.tracks=tracks,this.colorModel=colorModel,this.canvas.style.position=""},morpheus.HeatMapTrackColorLegend.prototype={getPreferredSize:function(){var tracks=this.tracks,colorModel=this.colorModel,xpix=0,ypix=0,maxYPix=0,canvas=this.canvas,context=canvas.getContext("2d");context.font="12px "+morpheus.CanvasUtil.FONT_NAME;for(var i=0;i0?maxYPix+12:0}},draw:function(clip,context){for(var tracks=this.tracks,colorModel=this.colorModel,xpix=0,i=0;i0?maxYPix+30:0}},draw:function(clip,context){var tracks=this.tracks,shapeModel=this.shapeModel,xpix=0,ypix=0;context.textAlign="left",context.textBaseline="top",context.font="12px "+morpheus.CanvasUtil.FONT_NAME,context.fillStyle=morpheus.CanvasUtil.FONT_COLOR,context.strokeStyle="black";for(var i=0;i'),html.push(''),html.push('"),html.push(""),this.$el=$(html.join("")),this.$el.find("button").on("click",function(e){e.stopImmediatePropagation()}),this.$el.find("[data-name=contact]").on("click",function(e){e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),window.open("mailto:morpheus@broadinstitute.org"),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"contact"})}),this.$el.find("[data-name=tutorial]").on("click",function(e){e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),window.open(morpheus.Util.URL+"tutorial.html"),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"tutorial"})}),this.$el.find("[data-name=linking]").on("click",function(e){e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),window.open(morpheus.Util.URL+"linking.html"),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"linking"})}),this.$el.find("[data-name=source]").on("click",function(e){e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),window.open("https://github.com/joshua-gould/morpheus.js"),morpheus.Util.trackEvent({eventCategory:"ToolBar",eventAction:"source"})})},morpheus.LegendWithStops=function(){morpheus.AbstractCanvas.call(this,!1),this.setBounds({width:300,height:40});var that=this;this.hammer=morpheus.Util.hammer(this.canvas,["pan","tap","press"]).on("panmove",function(event){if(that.panStartSelectedIndex!==-1){var position=morpheus.CanvasUtil.getMousePos(event.target,event),fraction=that.fractionToStopPix.invert(position.x);fraction=Math.max(0,fraction),fraction=Math.min(1,fraction),that.trigger("moved",{fraction:fraction})}}).on("panstart",function(event){that.panStartSelectedIndex=that.findIndexForPosition(morpheus.CanvasUtil.getMousePos(event.target,event,!0))}).on("panend",function(event){that.panStartSelectedIndex=-1}).on("tap",function(event){var position=morpheus.CanvasUtil.getMousePos(event.target,event);if(event.tapCount>1){var fraction=that.fractionToStopPix.invert(position.x);that.trigger("added",{fraction:fraction})}else that.selectedIndex=that.findIndexForPosition(position),that.trigger("selectedIndex",{selectedIndex:that.selectedIndex})}),$(this.canvas).on("keydown",function(e){8!=e.which&&46!=e.which||that.selectedIndex===-1||(that.trigger("delete"),e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation())})},morpheus.LegendWithStops.prototype={selectedIndex:-1,border:7,stopHalfSize:5,panStartSelectedIndex:-1,destroy:function(){$(this.canvas).off("keyup"),this.hammer.destroy()},setSelectedIndex:function(index){this.panStartSelectedIndex=-1},findIndexForPosition:function(position){if(position.y>=22)for(var i=0,length=this.fractions.length;i=start&&position.x<=end)return i}return-1},draw:function(fractions,colors,stepped,fractionToStopPix){this.fractions=fractions,this.colors=colors,this.stepped=stepped,this.fractionToStopPix=fractionToStopPix;var context=this.canvas.getContext("2d");morpheus.CanvasUtil.resetTransform(context),context.clearRect(0,0,this.getUnscaledWidth(),this.getUnscaledHeight()),context.translate(this.border,0),morpheus.HeatMapColorSchemeLegend.draw(context,fractions,colors,this.getUnscaledWidth()-2*this.border,this.getUnscaledHeight()-20,stepped),context.translate(-this.border,0),context.lineWidth=1,context.strokeStyle="Grey",context.strokeRect(this.border,0,this.getUnscaledWidth()-2*this.border,this.getUnscaledHeight()-20);for(var i=0;i0&&fractions[i]===fractions[i-1])){context.fillStyle=colors[i];var pix=fractionToStopPix(fractions[i]);context.fillRect(pix-this.stopHalfSize,22,2*this.stopHalfSize,2*this.stopHalfSize),this.selectedIndex===i?(context.lineWidth=2,context.strokeStyle="black"):(context.lineWidth=1,context.strokeStyle="Grey"),context.strokeRect(pix-this.stopHalfSize,22,2*this.stopHalfSize,2*this.stopHalfSize)}}},morpheus.Util.extend(morpheus.LegendWithStops,morpheus.AbstractCanvas),morpheus.Util.extend(morpheus.LegendWithStops,morpheus.Events),morpheus.Popup={},morpheus.Popup.initted=!1,morpheus.Popup.init=function(){if(!morpheus.Popup.initted){var client=new Clipboard("a[data-name=Copy]",{text:function(trigger){var event={clipboardData:{setData:function(dataType,data){this.data=data}}};return morpheus.Popup.popupCallback(event,"Copy"),morpheus.Popup.hide(),event.clipboardData.data}});morpheus.Popup.client=client,morpheus.Popup.initted=!0,morpheus.Popup.$popupDiv=$(document.createElement("div")),morpheus.Popup.$popupDiv.css("position","absolute").css("zIndex",999).addClass("dropdown clearfix"),morpheus.Popup.$contextMenu=$(document.createElement("ul")),morpheus.Popup.$contextMenu.addClass("dropdown-menu").css("display","block").css("position","static").css("margin-bottom","5px"),morpheus.Popup.$contextMenu.appendTo(morpheus.Popup.$popupDiv),morpheus.Popup.$contextMenu.on("click","a",function(e){e.preventDefault();var $this=$(this),name=$.trim($this.text());"Copy"!==name&&(morpheus.Popup.popupCallback(e,name),morpheus.Popup.hide())})}},morpheus.Popup.popupInDom=!1,morpheus.Popup.hidePopupMenu=function(e){morpheus.Popup.component==e.target&&(e.preventDefault(),e.stopPropagation()),morpheus.Popup.hide()},morpheus.Popup.hide=function(){morpheus.Popup.$popupDiv.hide(),$(document.body).off("mousedown",morpheus.Popup.hidePopupMenu),morpheus.Popup.popupCallback=null,morpheus.Popup.component=null},morpheus.Popup.showPopup=function(menuItems,position,component,callback){if(morpheus.Popup.init(),morpheus.Popup.component==component)return void morpheus.Popup.hide();morpheus.Popup.popupCallback=callback,morpheus.Popup.component=component;for(var html=[],i=0,length=menuItems.length;i'+item.name+""):item.separator?html.push('
  • '):(html.push('
  • '),item.checked&&html.push(''),html.push(item.name),item.icon&&html.push(''),html.push(""),html.push("
  • "))}morpheus.Popup.$contextMenu.html(html.join("")),morpheus.Popup.popupInDom||(morpheus.Popup.popupInDom=!0,morpheus.Popup.$popupDiv.appendTo($(document.body)));var $body=$(document.body),$window=$(window),windowWidth=$window.width(),windowHeight=$window.height(),popupWidth=morpheus.Popup.$popupDiv.width(),popupHeight=morpheus.Popup.$popupDiv.height(),left=position.x,top=position.y;left+popupWidth>=windowWidth&&(left-=popupWidth),top+popupHeight>=windowHeight&&(top-=popupHeight),morpheus.Popup.$popupDiv.css({display:"block",left:left,top:top}),morpheus.Popup.$popupDiv.show(),$body.off("mousedown",morpheus.Popup.hidePopupMenu),window.setTimeout(function(){$body.on("mousedown",function(e){var $target=$(e.target);"popup-item"!==$target.data("type")&&morpheus.Popup.hidePopupMenu(e)})},1)},morpheus.RowDendrogram=function(controller,tree,positions,project){morpheus.AbstractDendrogram.call(this,controller,tree,positions,project,morpheus.AbstractDendrogram.Type.ROW)},morpheus.RowDendrogram.prototype={drawNode:function(context,node){var radius=this.getNodeRadius(node),pix=this.toPix(node);context.beginPath(),context.arc(pix[0],pix[1],radius,2*Math.PI,!1),context.fill()},isDragHotSpot:function(p){return Math.abs(this.scale(this.cutHeight)-p.x)<=2},preDraw:function(context,clip){context.setLineDash&&context.setLineDash([5]),context.strokeStyle="black";var nx=this.scale(this.cutHeight);context.beginPath(),context.moveTo(nx,clip.y),context.lineTo(nx,this.getUnscaledHeight()),context.stroke(),context.setLineDash&&context.setLineDash([])},getPreferredSize:function(){return{width:100,height:Math.ceil(this.positions.getPosition(this.positions.getLength()-1)+this.positions.getItemSize(this.positions.getLength()-1))}},paintMouseOver:function(clip,context){this.project.getHoverRowIndex()!==-1&&(morpheus.CanvasUtil.resetTransform(context),context.translate(0,-clip.y),this.drawRowBorder(context,this.positions,this.project.getHoverRowIndex(),this.getUnscaledWidth()))},drawRowBorder:function(context,positions,index,gridSize){var size=positions.getItemSize(index),pix=positions.getPosition(index);context.beginPath(),context.moveTo(0,pix+size),context.lineTo(gridSize,pix+size),context.stroke(),context.beginPath(),context.moveTo(0,pix),context.lineTo(gridSize,pix),context.stroke()},createScale:function(){return d3.scale.linear().domain([0,this.tree.maxHeight]).range([this.getUnscaledWidth(),0])},getMaxIndex:function(clip){return morpheus.Positions.getBottom(clip,this.positions)},getMinIndex:function(clip){return morpheus.Positions.getTop(clip,this.positions)},toPix:function(node){var min=this.positions.getPosition(node.minIndex)+this.positions.getItemSize(node.minIndex)/2,max=this.positions.getPosition(node.maxIndex)+this.positions.getItemSize(node.maxIndex)/2;return[this.scale(node.height),(min+max)/2]},drawPathFromNodeToParent:function(context,node){var pix=this.toPix(node),parentPix=this.toPix(node.parent);context.beginPath(),context.moveTo(pix[0],pix[1]),context.lineTo(parentPix[0],pix[1]),context.lineTo(parentPix[0],parentPix[1]),context.stroke()},drawNodePath:function(context,node,minIndex,maxIndex){var x,y,children=node.children,left=children[0],right=children[1],ry=this.toPix(right)[1],rx=this.scale(right.height),ly=this.toPix(left)[1],lx=this.scale(left.height),nx=this.scale(node.height);if(this.drawLeafNodes)x=[rx,nx,nx,lx],y=[ry,ry,ly,ly];else{var leftIsLeaf=void 0!==left.children,rightIsLeaf=void 0!==right.children;leftIsLeaf&&(lx=nx+4),rightIsLeaf&&(rx=nx+4),x=[rx,nx,nx,lx],y=[ry,ry,ly,ly]}context.beginPath(),context.moveTo(x[0],y[0]);for(var i=1,length=x.length;i=0};isVertical?controller.setToolTip(indices.length>=0?indices:null,-1,tipOptions):controller.setToolTip(-1,indices.length>=0?indices:null,tipOptions)},mouseExit=function(e){document.body.style.cursor="default",scrollbar.canvas.style.cursor="default",controller.setToolTip(-1,-1,{event:e})},showPopup=function(e){return e.preventDefault(),e.stopPropagation&&e.stopPropagation(),e.stopImmediatePropagation&&e.stopImmediatePropagation(),morpheus.Popup.showPopup([{name:"Selection To Top",checked:controller.getToolbar().isSelectionOnTop(!isVertical),disabled:isVertical?0===controller.getProject().getRowSelectionModel().count():0===controller.getProject().getColumnSelectionModel().count()},{name:"New Heat Map ("+morpheus.Util.COMMAND_KEY+"X)"}],{x:e.pageX,y:e.pageY},e.target,function(event,item){"Selection To Top"===item?controller.getToolbar().setSelectionOnTop({isColumns:!isVertical,isOnTop:!controller.getToolbar().isSelectionOnTop(!isVertical),updateButtonStatus:!0}):morpheus.HeatMap.showTool(new morpheus.NewHeatMapTool,controller)}),!1};$(scrollbar.canvas).on("mousemove.morpheus",mouseMove).on("mouseout.morpheus",mouseExit).on("contextmenu.morpheus",showPopup)},morpheus.ScentedSearch.LINE_HEIGHT=3.5,morpheus.ScentedSearch.prototype={mouseMovedIndex:-1,getIndex:function(event){var pix=morpheus.CanvasUtil.getMousePos(event.target,event),val=pix[this.isVertical?"y":"x"];return this.getIndexForPix(val)},getSearchIndices:function(event){var pix=morpheus.CanvasUtil.getMousePos(event.target,event),val=pix[this.isVertical?"y":"x"];return this.getSearchIndicesForPix(val)},getSearchIndicesForPix:function(pix){var indices=this.searchIndices;if(null==indices)return[];for(var scale=this.scale,tolerance=morpheus.ScentedSearch.LINE_HEIGHT,matches=[],i=0,length=indices.length;i0){var midVal=this.positions.getPosition(indices[this.mouseMovedIndex])*scale;if(Math.abs(midVal-pix)<=tolerance)return this.mouseMovedIndex}for(var low=0,scale=this.scale,high=indices.length-1;low<=high;){var mid=low+high>>1,midVal=this.positions.getPosition(indices[mid])*scale,cmp=0;if(Math.abs(midVal-pix)<=tolerance?cmp=0:midValpix&&(cmp=1),cmp<0)low=mid+1;else{if(!(cmp>0))return mid;high=mid-1}}return-1},tap:function(position){var val=position[this.isVertical?"y":"x"],index=this.getIndexForPix(val);return this.scrollbar.canvas.style.cursor=index<0?"default":"pointer",index>=0&&(this.isVertical?this.controller.scrollTop(this.positions.getPosition(this.searchIndices[index])):this.controller.scrollLeft(this.positions.getPosition(this.searchIndices[index])),!0)},update:function(){this.searchIndices=this.model.getViewIndices().values().sort(function(a,b){return a=that.thumbPos&&position[that.field]<=that.thumbPos+that.thumbExtent;that.thumbMouseOver!==mouseOver&&(that.thumbMouseOver=mouseOver,that.repaint())}},mouseExit=function(e){!morpheus.CanvasUtil.dragging&&that.thumbMouseOver&&(that.thumbMouseOver=!1,that.repaint())};$(this.canvas).on("mousemove",mouseMove).on("mouseout",mouseExit).on("mouseenter",mouseMove),this.hammer=morpheus.Util.hammer(this.canvas,[this.isVertical?"panv":"panh","tap"]).on("panstart",function(event){var position=morpheus.CanvasUtil.getMousePos(event.target,event,!0);position[that.field]>=that.thumbPos&&position[that.field]<=that.thumbPos+that.thumbExtent?(that.draggingThumb=!0,that.dragStartThumbPos=that.thumbPos):that.draggingThumb=!1}).on("panend",function(event){that.draggingThumb=!1}).on("panmove",function(event){if(that.draggingThumb){var thumbPosPix=(morpheus.CanvasUtil.getMousePos(event.target,event),that.dragStartThumbPos+(that.isVertical?event.deltaY:event.deltaX)),f=thumbPosPix/(that.visibleExtent-that.thumbExtent),value=f*that.maxValue;that.setValue(value,!0),event.preventDefault(),event.srcEvent.stopPropagation(),event.srcEvent.stopImmediatePropagation()}}).on("tap doubletap",function(event){if(!that.draggingThumb){var position=morpheus.CanvasUtil.getMousePos(event.target,event);if(!that.decorator.tap(position)){var thumbExtentToValue=that.thumbExtent/that.totalExtent*that.totalExtent;that.scrollToTop=position[that.field]'];map.forEach(function(val,key){html.push("'),html.push(key),html.push("")}),html.push(""),formBuilder.append({name:"selected_value",type:"custom",value:html.join("")});var shapeField=new morpheus.ShapeField;formBuilder.append({col:"col-xs-2",name:"selected_shape",type:"custom",value:'
    '}),shapeField.$el.appendTo(formBuilder.$form.find("[data-name=shape]"));var $valuePicker=formBuilder.$form.find("[name=valuePicker]"),selectedVal=$valuePicker.val(),_this=this;shapeField.setShapeValue(map.get(selectedVal)),shapeField.on("change",function(e){map.set(selectedVal,e.shape),_this.trigger("change",{value:selectedVal,shape:e.shape})}),$valuePicker.selectpicker().change(function(){selectedVal=$valuePicker.val(),shapeField.setShapeValue(map.get(selectedVal))}),this.$div=formBuilder.$form},morpheus.ShapeChooser.prototype={},morpheus.Util.extend(morpheus.ShapeChooser,morpheus.Events),morpheus.ShapeField=function(shapes){shapes=shapes||morpheus.VectorShapeModel.SHAPES;var _this=this,html=[],size2=8,x=4,y=4;html.push('
    '),html.push(''),html.push('
    ");var $el=$(html.join("")),$header=$el.find("[data-name=selection]");$el.on("click","li > a",function(e){var shape=$(this).attr("name");setShapeValue(shape),_this.trigger("change",{shape:shape})});var setShapeValue=function(val){if($header.data("name",val),"none"===val)$header.html("(None)");else{var context=new C2S(2*size2,2*size2);context.translate(4,4),morpheus.CanvasUtil.drawShape(context,val,x,y,size2),$header.html(context.getSerializedSvg())}};this.setShapeValue=setShapeValue,this.$el=$el},morpheus.ShapeField.prototype={},morpheus.Util.extend(morpheus.ShapeField,morpheus.Events),morpheus.SortByValuesIndicator=function(project,isVertical,positions){morpheus.AbstractCanvas.call(this,!0),this.project=project,this.isVertical=isVertical,this.positions=positions,this.lastPosition={start:-1,end:-1}},morpheus.SortByValuesIndicator.prototype={prePaint:function(clip,context){var positions=this.positions,start=0,end=positions.getLength();this.isVertical?(start=morpheus.Positions.getTop(clip,positions),end=morpheus.Positions.getBottom(clip,positions)):(start=morpheus.Positions.getLeft(clip,positions),end=morpheus.Positions.getRight(clip,positions)),(this.invalid||start!==this.lastPosition.start||end!==this.lastPosition.end)&&(this.lastPosition.start=start,this.lastPosition.end=end,this.invalid=!0)},draw:function(clip,context){var project=this.project,isVertical=this.isVertical,positions=this.positions,sortKeys=isVertical?project.getColumnSortKeys():project.getRowSortKeys();context.translate(-clip.x,-clip.y),context.fillStyle="black",context.textBaseline="top",context.textAlign="left",context.font="8px "+morpheus.CanvasUtil.FONT_NAME;var start=0,end=positions.getLength();isVertical?(start=morpheus.Positions.getTop(clip,positions),end=morpheus.Positions.getBottom(clip,positions)):(start=morpheus.Positions.getLeft(clip,positions),end=morpheus.Positions.getRight(clip,positions));for(var arrowWidth=3,arrowHeight=4,i=0;i=start&&view'),$div=$('
    '),html=[];html.push('
    '),html.push('
    '),html.push('
    '),html.push('
    '),html.push('
    '), html.push('
    '),html.push("
    "),html.push("
    "),html.push("
    "),$chooserDiv.html(html.join("")),$chooserDiv.on("change","[name=rowsOrColumns]",function(e){var $this=$(this);toggle("columns"===$this.val())}),toggle(!1);var $outer=$("
    ");$chooserDiv.appendTo($outer),$div.appendTo($outer),morpheus.FormBuilder.showOkCancel({title:"Sort",content:$outer,okCallback:function(){var $forms=$div.find("form"),sortBy=$forms.find("[name=sortBy]").map(function(){return $(this).val()}),sortOrder=$forms.find("[name=sortOrder]:checked").map(function(){return $(this).val()}),groupBy=$div.find("[name=groupBy]").val(),newSortKeys=[],modelIndices=_this.isColumns?project.getRowSelectionModel().toModelIndices():project.getColumnSelectionModel().toModelIndices(),existingSortKeys=_this.isColumns?project.getColumnSortKeys():project.getRowSortKeys(),keysToKeep=_.filter(existingSortKeys,function(key){return key instanceof morpheus.MatchesOnTopSortKey||key instanceof morpheus.SpecifiedModelSortOrder&&"dendrogram"===key.name});keysToKeep.length>0&&_.each(keysToKeep,function(key){newSortKeys.push(key)});for(var newSortKeyFields=new morpheus.Set,i=0;i'),html.push('
    '),html.push('
    '),html.push('
    ');var groupByKeys=(isColumns?project.getGroupColumns():project.getGroupRows()).map(function(key){return key.field});return html.push('"),html.push(""),html.push("
    "),$(html.join(""))},createLevel0:function(html){html.push('
    '),html.push('
    '),html.push('
    '),html.push('Add sort level'),html.push("
    "),html.push("
    "),html.push("
    ")},createLevel:function(html,key,fields){html.push('
    '),html.push('
    '),html.push('
    '),html.push('
    '),html.push('"),html.push("
    "),html.push('
    '),html.push('
    "),html.push('
    "),html.push("
    "),html.push('
    '),html.push('Delete'),html.push("
    "),html.push('
    '),html.push('Add sort level'),html.push("
    "),html.push("
    "),html.push("
    ")}},morpheus.Spacer=function(width,height){this.width=width,this.height=height},morpheus.Spacer.prototype={prefWidth:void 0,prefHeight:void 0,visible:!0,dispose:function(){},getPrefWidth:function(){return this.prefWidth},draw:function(clip){},getPreferredSize:function(){return{width:this.width,height:this.height}},setBounds:function(){},getPrefHeight:function(){return this.prefHeight},setPrefWidth:function(prefWidth){this.prefWidth=prefWidth},setPrefHeight:function(prefHeight){this.prefHeight=prefHeight},isVisible:function(){return this.visible},setVisible:function(visible){this.visible=visible},getWidth:function(){return this.width},getHeight:function(){return this.height}},morpheus.SteppedColorSupplier=function(){morpheus.AbstractColorSupplier.call(this),this.hiddenValue=0,this.hiddenValues=new morpheus.Set,this.stepped=!0},morpheus.SteppedColorSupplier.linearScale=function(value,input0,input1,pix0,pix1){return(value-input0)/(input1-input0)*(pix1-pix0)+pix0},morpheus.SteppedColorSupplier.prototype={createInstance:function(){return new morpheus.SteppedColorSupplier},isStepped:function(){return!0},getHiddenValues:function(){return this.hiddenValues},getIndexForFraction:function(f){var fractions=this.fractions;if(f<=fractions[0])return 0;if(f>=fractions[fractions.length-1])return fractions.length-1;for(var i=0;i=left&&f=max)return colors[colors.length-1];var fraction=morpheus.SteppedColorSupplier.linearScale(value,min,max,0,100)/100;return colors[this.getIndexForFraction(fraction)]}},morpheus.Util.extend(morpheus.SteppedColorSupplier,morpheus.AbstractColorSupplier),morpheus.TabManager=function(options){function rename($a){var builder=new morpheus.FormBuilder;builder.append({name:"name",type:"text",value:$.trim($a.contents().first().text())}),morpheus.FormBuilder.showOkCancel({title:"Rename Tab",content:builder.$form,okCallback:function(){var name=$.trim(builder.getValue("name"));""!==name&&(_this.activeTabObject.setName(name),$a.contents().first().replaceWith(name+" "))}})}this.options=$.extend({},{autohideTabBar:!1},options);var _this=this;this.activeTabObject=null,this.activeTabId=null,this.idToTabObject=new morpheus.Map,this.$nav=$(''),this.$nav.on("click","li > a",function(e){var tabId=$(this).attr("href");e.preventDefault(),_this.activeTabId!==tabId&&$(this).tab("show")}),this.$nav.on("dblclick","li > a",function(e){e.preventDefault(),$(this).data("morpheus-rename")&&rename($(this))}),this.$nav.on("contextmenu.morpheus","li > a",function(e){e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation();var $a=$(this);return $a.data("morpheus-rename")&&morpheus.Popup.showPopup([{name:"Rename"}],{x:e.pageX,y:e.pageY},e.target,function(event,item){rename($a)}),!1}),this.$nav.on("click","button",function(e){e.preventDefault();var target=$(this).attr("data-target");_this.remove(target)}),this.$tabContent=$('
    '),this.$nav.on("shown.bs.tab",'a[data-toggle="tab"]',function(e){if(!_this.adding){var previous=_this.activeTabObject;_this.activeTabId=$(e.target).attr("href"),_this.activeTabObject=_this.idToTabObject.get(_this.activeTabId),_this.trigger("change",{tab:_this.activeTabObject,previous:previous})}})},morpheus.TabManager.prototype={setTabText:function(id,text){this.$nav.find("a").filter("[href="+id+"]").contents().first().replaceWith(text+" "),this.idToTabObject.get(id).setName(name)},addTask:function(task){var $a=this.$nav.find("a[href="+task.tabId+"]");if(0===$a.length)throw new Error(task.tabId+" not found.");var $i=$a.find("i"),tasks=$i.data("tasks");tasks||(tasks=[]),task.id=_.uniqueId("task"),tasks.push(task),$i.data("tasks",tasks),$a.removeClass("animated flash").addClass("animated flash").one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){$(this).removeClass("animated flash")}),$i.addClass("fa fa-spinner fa-spin")},removeTask:function(task){var $a=this.$nav.find("a[href="+task.tabId+"]"),$i=$a.find("i"),tasks=$i.data("tasks");tasks||(tasks=[]);for(var index=-1,i=0;i'),li.push(''),li.push(options.title),li.push(' '),options.closeable&&li.push(' '),li.push("");var $link=$(li.join(""));$link.appendTo(this.$nav);var $panel=$('
    ');return options.$el.appendTo($panel),$panel.appendTo(this.$tabContent),options.enabled===!1&&($link.addClass("disabled"),$link.find("a").addClass("btn disabled")),options.focus&&(this.$nav.find('a[data-toggle="tab"]:last').tab("show"),this.activeTabId="#"+id,this.activeTabObject=options.object,$panel.focus()),this.options.autohideTabBar&&this.$nav.css("display",this.idToTabObject.size()>1?"":"none"),this.adding=!1,{$panel:$panel,id:"#"+id}},remove:function(target){void 0===target&&(target=this.activeTabId),this.idToTabObject.remove(target),this.$nav.find("[href="+target+"]").parent().remove(),this.$tabContent.find(target).remove();var $a=this.$nav.find('a[data-toggle="tab"]:last');0===$a.length&&this.options.landingPage&&this.options.landingPage.show(),$a.tab("show"),this.options.autohideTabBar&&this.$nav.css("display",this.idToTabObject.size()>1?"":"none"),this.trigger("remove",{tab:target})},setOptions:function(options){this.options=options,this.options.autohideTabBar&&this.$nav.css("display",this.idToTabObject.size()>1?"":"none")},getOptions:function(){return this.options},setActiveTab:function(id){id===this.activeTabId&&this.trigger("change",{tab:this.activeTabObject,previous:null});var $a=this.$nav.find("[href="+id+"]");$a.parent().removeClass("disabled"),$a.removeClass("btn disabled"),$a.tab("show")},setTabTitle:function(id,title){this.$nav.find("a").filter("[href="+id+"]").attr("title",title)},setTabEnabled:function(id,enabled){var $a=this.$nav.find("a").filter("[href="+id+"]");enabled?($a.parent().removeClass("disabled"),$a.removeClass("btn disabled")):($a.parent().addClass("disabled"),$a.addClass("btn disabled"))}},morpheus.Util.extend(morpheus.TabManager,morpheus.Events),morpheus.Table=function(options){options=morpheus.Table.createOptions(options),this.options=options,options.width||(options.width=options.$el.attr("class"));var _this=this,height=options.height,$gridDiv=$('
    ');this.$gridDiv=$gridDiv,$gridDiv.appendTo(options.$el);var columns=options.columns;this.columns=columns;var visibleColumns=columns.filter(function(c){return c.visible}),grid=new morpheus.Grid({gridOptions:{select:options.select,rowHeight:options.rowHeight,autoEdit:!1,editable:!1,autoHeight:"auto"===options.height,enableTextSelectionOnCells:!0},$el:$gridDiv,items:options.items,columns:visibleColumns});this.grid=grid,this.searchFunction=null;var searchFilter={isEmpty:function(){return null==_this.searchFunction},init:function(){},accept:function(item){return _this.searchFunction(item)}};this.grid.getFilter().add(searchFilter);var $header=$('
    ');this.$header=$header;var $right=$header.find(".pull-right");if(options.search){var tableSearch=new morpheus.TableSearchUI({$el:$header.find("[name=top]"),$right:$right});tableSearch.setTable(this),this.tableSearch=tableSearch}if(options.columnPicker&&visibleColumns.length!==this.columns.length){var select=[];select.push('");var $select=$(select.join(""));$select.appendTo($right),$select.selectpicker({iconBase:"fa",tickIcon:"fa-check",style:"btn-default btn-xs"}),$select.on("change",function(){var oldColumns=grid.getColumns().map(function(c){return c.id}),selectedColumnIndices=$select.val();visibleColumns=[];for(var i=0;ioldColumns.length){for(var set=new morpheus.Set,i=0;i1?(collapsed=!0,$gridDiv.addClass("slick-stacked"),_this.grid.grid.getOptions().rowHeight=(options.collapsedRowHeight?options.collapsedRowHeight:options.rowHeight)*visibleColumns.length,_this.grid.grid.setColumns([{id:0,tooltip:function(item,value){for(var html=[],i=0;i")},collapsed:!0,getter:function(item){return item},formatter:function(row,cell,value,columnDef,dataContext){var html=[];html.push('
    '),options.rowHeader&&(html.push(options.rowHeader(dataContext)),html.push('
    '));for(var i=0;i0&&html.push('
    ');var c=visibleColumns[i];html.push(c.name),html.push(":");var s=c.renderer(dataContext,c.getter(dataContext));html.push(s)}return html.push("
    "),html.join("")},sortable:!1,name:""}]),$gridDiv.find(".slick-header").hide(),_this.grid.grid.resizeCanvas(),_this.grid.grid.invalidate()):collapsed&&gridWidth>=options.collapseBreakpoint?($gridDiv.removeClass("slick-stacked"),collapsed=!1,options.showHeader&&$gridDiv.find(".slick-header").show(),_this.grid.grid.getOptions().rowHeight=options.rowHeight,_this.grid.grid.setColumns(visibleColumns),_this.grid.grid.resizeCanvas(),options.select&&_this.grid.grid.setSelectedRows(_this.grid.grid.getSelectedRows()),_this.grid.grid.invalidate()):(_this.grid.grid.resizeCanvas(),_this.grid.grid.invalidate()),_this.grid.maybeAutoResizeColumns())}};if(options.showHeader||$gridDiv.find(".slick-header").hide(),options.responsive&&($(window).on("resize orientationchange",resize),$gridDiv.on("remove",function(){$(window).off("resize",resize)}),resize()),this.resize=resize,visibleColumns.length>1&&null!=options.items&&options.items.length>0&&this.setItems(options.items),!$gridDiv.is(":visible")){for(var $parent=$gridDiv,observer=new MutationObserver(function(mutations){"none"!==window.getComputedStyle($parent[0]).display&&(observer.disconnect(),resize())});$parent.length>0&&"none"!==window.getComputedStyle($parent[0]).display;)$parent=$parent.parent();$parent.length>0&&observer.observe($parent[0],{attributes:!0,childList:!1,characterData:!1})}},morpheus.Table.defaultRenderer=function(item,value){if(null==value)return"";if(_.isNumber(value))return morpheus.Util.nf(value);if(morpheus.Util.isArray(value)){for(var s=[],i=0,length=value.length;i0&&s.push(", ");value[i];s.push(value[i])}return s.join("")}return""+value},morpheus.Table.prototype={toText:function(){for(var text=[],items=this.getItems(),columns=this.columns.filter(function(c){return c.visible}),j=0;j0&&text.push("\t"),text.push(columns[j].name);text.push("\n");for(var i=0;i0&&text.push("\t");var value=columns[j].getter(item);text.push(morpheus.Util.toString(value))}text.push("\n")}return text.join("")},setHeight:function(height){if(this.options.height=height,"auto"===height?(this.$gridDiv.css("height",""),this.grid.grid.getOptions().autoHeight=!0,this.grid.grid.setOptions(this.grid.grid.getOptions())):this.$gridDiv.css("height",height),this.grid.grid.resizeCanvas(),"auto"===height){var height=this.getItems().length*this.options.rowHeight+this.options.rowHeight;this.$gridDiv.find(".slick-viewport").css("height",height+"px")}this.grid.grid.invalidate()},setSearchVisible:function(visible){this.$header.find("[name=search]").css("display",visible?"":"none")},autocomplete:function(tokens,response){var matches=[],token=null!=tokens&&tokens.length>0?tokens[tokens.selectionStartIndex]:"";token=$.trim(token);var columns=this.columns.filter(function(c){return c.searchable&&c.visible||c.alwaysSearch}),ncolumns=columns.length,showField=ncolumns>1;if(""===token){if(ncolumns<=1)return response(matches);for(var i=0;i'+field+":",show:!0})}return matches.sort(function(a,b){return a.value===b.value?0:a.value0){if(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));for(var columnNameToColumn=new morpheus.Map,columnNames=columns.map(function(c){return c.name}),i=0;i1)for(var regex=new RegExp("^"+morpheus.Util.escapeRegex(token),"i"),j=0;j'+field+":",show:!0})}var set=new morpheus.Set,regex=new RegExp("^"+morpheus.Util.escapeRegex(token),"i"),items=this.getItems(),dataTypes=[],filteredColumns=[];columns.forEach(function(c){for(var dataType=null,i=0,nitems=items.length;i'+field+':'+val+"":''+val+""})),matches.length===maxSize)return response(matches)}else if(regex.test(value)&&!set.has(value)&&(set.add(value),matches.push({value:showField?field+":"+value:value,label:showField?''+field+':'+value+"":''+value+""}),matches.length===maxSize))return response(matches)}return response(matches)},searchWithPredicates:function(predicates){if(null==predicates||0===predicates.length)return this.searchFunction=null,void this.grid.setFilter(this.grid.getFilter());for(var columns=this.columns.filter(function(c){return c.searchable&&c.visible||c.alwaysSearch}),columnNameToColumn=new morpheus.Map,columnNames=columns.map(function(c){return c.name}),i=0;i
    '),options.rowHeader&&0===cell&&html.push(options.rowHeader(dataContext)),html.push(column.renderer(dataContext,value)),html.push("
    "),html.join("")},comparator:function(a,b){var aNaN=null==a||_.isNumber(a)&&isNaN(a),bNaN=null==b||_.isNumber(b)&&isNaN(b);return aNaN&&bNaN?0:aNaN?1:bNaN?-1:(a.toLowerCase&&(a=a.toLowerCase()),b.toLowerCase&&(b=b.toLowerCase()),a===b?0:a');$search.appendTo(options.$el),this.$search=$search,this.$searchResults=$(''),this.$showAll=$('
    Show all
    '),this.$searchResults.appendTo(options.$right),this.$showAll.appendTo(options.$right),this.$showAll.on("click",function(e){e.preventDefault(),$search.val(""),_this.table.search(""),_this.table.trigger("showAll",{table:_this.table})}),$search.on("keyup",_.debounce(function(){_this.table.search($.trim($(this).val()))},100)),morpheus.Util.autosuggest({$el:$search,suggestWhenEmpty:!0,filter:function(tokens,response){_this.table.autocomplete(tokens,response)},select:function(){_this.table.search($.trim($search.val()))}})},morpheus.TableSearchUI.prototype={updateSearchLabel:function(){var text="Showing: "+morpheus.Util.intFormat(this.table.getFilteredItemCount())+" / "+morpheus.Util.intFormat(this.table.getAllItemCount());this.$searchResults.html(text)},setTable:function(table){this.table=table;var _this=this;table.on("filter",function(){_this.updateSearchLabel()})}},morpheus.TrackSelection=function(track,positions,selectionModel,isColumns,controller){function getPosition(event,useDelta){if(track.settings.squished){var total=positions.getPosition(positions.getLength()-1)+positions.getItemSize(positions.getLength()-1),squishFactor=total/(isColumns?track.getUnscaledWidth():track.getUnscaledHeight()),p=(morpheus.CanvasUtil.getClientXY(event,useDelta),morpheus.CanvasUtil.getMousePosWithScroll(event.target,event,0,0,useDelta));return p[coord]*=squishFactor,p}return morpheus.CanvasUtil.getMousePosWithScroll(event.target,event,controller.scrollLeft(),controller.scrollTop(),useDelta)}var canvas=track.canvas,startIndex=-1,coord=isColumns?"x":"y";this.hammer=morpheus.Util.hammer(canvas,["pan","tap","longpress"]).on("longpress",function(event){event.preventDefault(),event.srcEvent.stopImmediatePropagation(),event.srcEvent.stopPropagation(),controller.setSelectedTrack(track.name,isColumns),track.showPopup(event.srcEvent)}).on("panmove",function(event){var position=getPosition(event),endIndex=positions.getIndex(position[coord],!1),commandKey=morpheus.Util.IS_MAC?event.srcEvent.metaKey:event.srcEvent.ctrlKey,viewIndices=commandKey?selectionModel.getViewIndices():new morpheus.Set,_startIndex=startIndex;if(startIndex>endIndex){var tmp=endIndex;endIndex=_startIndex,_startIndex=tmp}for(var i=_startIndex;i<=endIndex;i++)viewIndices.add(i);if(selectionModel.setViewIndices(viewIndices,!0),isColumns){var scrollLeft=controller.scrollLeft(),scrollRight=scrollLeft+controller.heatmap.getUnscaledWidth();position.x>scrollRight?controller.scrollLeft(scrollLeft+8):position.xscrollBottom?controller.scrollTop(scrollTop+8):position.y1){if(isColumns&&!controller.options.columnsSortable||!isColumns&&!controller.options.rowsSortable)return;controller.sortBasedOnSelection(null,isColumns,event.srcEvent.shiftKey)}else{controller.setSelectedTrack(track.name,isColumns);var commandKey=morpheus.Util.IS_MAC?event.srcEvent.metaKey:event.srcEvent.ctrlKey;if(morpheus.Util.IS_MAC&&event.srcEvent.ctrlKey)return;var viewIndices;if(commandKey)viewIndices=selectionModel.getViewIndices(),viewIndices.has(index)?viewIndices.remove(index):viewIndices.add(index);else if(event.srcEvent.shiftKey){viewIndices=selectionModel.getViewIndices();var min=Number.MAX_VALUE,max=-Number.MAX_VALUE;for(var viewIndex in viewIndices)min=Math.min(viewIndex,min),max=Math.max(viewIndex,max);if(index>=max)for(var i=max;i<=index;i++)viewIndices.add(i);else for(var i=Math.min(index,min),max=Math.max(index,min);i<=max;i++)viewIndices.add(i)}else viewIndices=new morpheus.Set,viewIndices.add(index);selectionModel.setViewIndices(viewIndices,!0)}})},morpheus.TrackSelection.prototype={dispose:function(){this.hammer.destroy()}},morpheus.VectorTrack=function(project,name,positions,isColumns,heatmap){morpheus.AbstractCanvas.call(this,!0),this.preferredSize={width:0,height:0},this.project=project,this.positions=positions,this.isColumns=isColumns,this.name=name,this.visible=!0,this.heatmap=heatmap,this.id=_.uniqueId();var _this=this;this.updateSpanMapFunction=function(){_this.spanMap=morpheus.VectorUtil.createSpanMap(_this.getVector())},this.lastPosition={start:-1,end:-1},this.events="rowSortOrderChanged rowFilterChanged datasetChanged";var mouseMoved=function(event){var index=-1;if("mouseout"!==event.type){var position=morpheus.CanvasUtil.getMousePosWithScroll(event.target,event,heatmap.scrollLeft(),heatmap.scrollTop());if(_this.settings.squished){var total=positions.getPosition(positions.getLength()-1)+positions.getItemSize(positions.getLength()-1),squishFactor=total/(isColumns?_this.getUnscaledWidth():_this.getUnscaledHeight());position[isColumns?"x":"y"]*=squishFactor}index=isColumns?_this.positions.getIndex(position.x,!1):_this.positions.getIndex(position.y,!1)}isColumns?heatmap.setMousePosition(-1,index,{name:_this.name,event:event}):heatmap.setMousePosition(index,-1,{name:_this.name,event:event})};$(this.canvas).on("contextmenu.morpheus",function(e){return e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),heatmap.setSelectedTrack(_this.name,isColumns),_this.showPopup(e),!1}),this.settings={ maxTextWidth:void 0,squished:!1,inlineTooltip:!1,tooltip:!0,discrete:!0,highlightMatchingValues:!1,discreteAutoDetermined:!1,colorBarSize:12,stackedBar:!1,renderMethod:{},selectionColor:"rgb(182,213,253)",colorByField:null,barColor:"#bdbdbd",barSize:40,arcSize:60,min:void 0,mid:void 0,max:void 0,minMaxReversed:!1},$(this.canvas).on("mousemove.morpheus mouseout.morpheus",mouseMoved)},morpheus.VectorTrack.RENDER={TEXT:0,COLOR:1,BAR:2,MOLECULE:3,TEXT_AND_COLOR:4,SHAPE:5,ARC:6,BOX_PLOT:7},morpheus.VectorTrack.vectorToString=function(vector){var formatter=function(v){return""+v},dataType=morpheus.VectorUtil.getDataType(vector);return"number"===dataType?formatter=morpheus.Util.nf:"[number]"===dataType?formatter=function(v){var s=[];if(null!=v)for(var i=0,arrayLength=v.length;i=6){var context=this.canvas.getContext("2d"),textWidth=morpheus.CanvasUtil.getVectorStringWidth(context,this.getVector(),this.positions,forPrint?-1:this.isColumns?120:100);forPrint||(textWidth=Math.min(textWidth,this.isColumns?100:500),this.settings.maxTextWidth=textWidth),width+=textWidth}else forPrint||(this.settings.maxTextWidth=0);this.isRenderAs(morpheus.VectorTrack.RENDER.BAR)&&(width+=this.settings.barSize),this.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)&&(width+=this.settings.colorBarSize),this.isRenderAs(morpheus.VectorTrack.RENDER.SHAPE)&&(width+=this.settings.colorBarSize),this.isRenderAs(morpheus.VectorTrack.RENDER.MOLECULE)&&(width+=300),forPrint||this.isRenderAs(morpheus.VectorTrack.RENDER.MOLECULE)||(width=Math.min(300,width)),this.isRenderAs(morpheus.VectorTrack.RENDER.ARC)&&(width+=this.settings.arcSize),this.isRenderAs(morpheus.VectorTrack.RENDER.BOX_PLOT)&&(width+=100);var nkeys=_.keys(this.settings.renderMethod).length;return nkeys>0&&(width+=2*(nkeys-1)),width=Math.max(0,width),this.isColumns?{width:height,height:width}:{width:width,height:height}},getPreferredSize:function(){return this.preferredSize},getPrintSize:function(){return this._computePreferredSize(!0)},_createDiscreteValueMap:function(){var values=morpheus.VectorUtil.getValues(this.getFullVector());values.sort(morpheus.SortKey.ASCENDING_COMPARATOR),this.discreteValueMap=new morpheus.Map;for(var i=0,length=values.length;i0&&doRequest(values.pop()),_this.invalid=!0,_this.repaint()})},i=0;i<6;i++)doRequest(values.pop());this.updateSpanMapFunction()}this._updatePreferredSize()},postPaint:function(clip,context){context.lineWidth=1,context.strokeStyle="Grey";var project=this.project,setup=this._setup(context,clip),vector=setup.vector,start=setup.start,end=setup.end;this.isColumns?project.getHoverColumnIndex()!==-1&&this.drawColumnBorder(context,this.positions,project.getHoverColumnIndex(),this.getUnscaledHeight()):project.getHoverRowIndex()!==-1&&this.drawRowBorder(context,this.positions,project.getHoverRowIndex(),this.getUnscaledWidth()),this._highlightMatchingValues(context,vector,start,end)},_highlightMatchingValues:function(context,viewVector,start,end){var project=this.project,positions=this.positions;context.strokeStyle="black",context.lineWidth=3;var hoverIndex=this.isColumns?project.getHoverColumnIndex():project.getHoverRowIndex(),value=viewVector.getValue(hoverIndex);if(this.settings.highlightMatchingValues&&hoverIndex!==-1&&this.heatmap.mousePositionOptions&&this.heatmap.mousePositionOptions.name===viewVector.getName()){var valueToModelIndices=this.getFullVector().getProperties().get(morpheus.VectorKeys.VALUE_TO_INDICES);if(!valueToModelIndices){var fullVector=this.getFullVector();valueToModelIndices=morpheus.VectorUtil.createValueToIndicesMap(fullVector),fullVector.getProperties().set(morpheus.VectorKeys.VALUE_TO_INDICES,valueToModelIndices)}var indices=valueToModelIndices.get(value);if(null==indices)return void console.log("valueToModelIndices error");if(indices.length<=1)return;if(this.isColumns){if(project.getHoverColumnIndex()!==-1){var height=this.getUnscaledHeight();context.beginPath();for(var i=0,nindices=indices.length;i=start&&viewIndex=start&&viewIndex=start&&i<=end){var size=positions.getItemSize(i),pix=positions.getPosition(i);context.fillRect(pix,0,size,height)}})}else{var width=this.getUnscaledWidth();if(!this.isRenderAs(morpheus.VectorTrack.RENDER.MOLECULE)){var viewIndices=project.getRowSelectionModel().getViewIndices();viewIndices.forEach(function(i){if(i>=start&&i<=end){var size=positions.getItemSize(i),pix=positions.getPosition(i);context.fillRect(0,pix,width,size)}})}}},prePaint:function(clip,context){var setup=(this.project,this.positions,this._setup(context,clip)),start=setup.start,end=setup.end;this.drawSelection({context:context,start:start,end:end}),(this.invalid||start!==this.lastPosition.start||end!==this.lastPosition.end)&&(this.lastPosition.start=start,this.lastPosition.end=end,this.invalid=!0)},drawRowBorder:function(context,positions,index,gridSize){var size=positions.getItemSize(index),pix=positions.getPosition(index);context.beginPath(),context.moveTo(0,pix+size),context.lineTo(gridSize,pix+size),context.stroke(),context.beginPath(),context.moveTo(0,pix),context.lineTo(gridSize,pix),context.stroke()},drawColumnBorder:function(context,positions,index,gridSize){var size=positions.getItemSize(index),pix=positions.getPosition(index);context.beginPath(),context.moveTo(pix+size,0),context.lineTo(pix+size,gridSize),context.stroke(),context.beginPath(),context.moveTo(pix,0),context.lineTo(pix,gridSize),context.stroke()},isSquished:function(){return this.settings.squished},_setup:function(context,clip){var start=0,vector=this.getVector(),end=vector.size(),settings=this.settings,positions=this.positions,width=clip.width,height=clip.height;if(settings.squished||(this.isColumns?(start=morpheus.Positions.getLeft(clip,positions),end=morpheus.Positions.getRight(clip,positions)):(start=morpheus.Positions.getTop(clip,positions),end=morpheus.Positions.getBottom(clip,positions))),settings.squished){var total=positions.getPosition(positions.getLength()-1)+positions.getItemSize(positions.getLength()-1);if(this.isColumns){var squishFactor=width/total;context.scale(squishFactor,1)}else{var squishFactor=height/total;context.scale(1,squishFactor)}}else context.translate(-clip.x,-clip.y);return{start:start,end:end,vector:vector}},draw:function(clip,context){var setup=this._setup(context,clip);this._draw({start:setup.start,end:setup.end,vector:setup.vector,context:context,availableSpace:this.isColumns?this.getUnscaledHeight():this.getUnscaledWidth(),clip:clip})},print:function(clip,context){var vector=this.getVector();this._draw({start:0,end:vector.size(),vector:vector,context:context,availableSpace:this.isColumns?clip.height:clip.width,clip:clip})},_draw:function(options){var context=options.context,vector=options.vector,availableSpace=options.availableSpace,fullAvailableSpace=options.availableSpace,start=options.start,end=options.end,clip=options.clip,positions=this.positions;context.textAlign="left",context.fillStyle=morpheus.CanvasUtil.FONT_COLOR;var fontSize=Math.min(24,positions.getSize()-2),size=0;if(context.font=fontSize+"px "+morpheus.CanvasUtil.FONT_NAME,context.strokeStyle=morpheus.HeatMapElementCanvas.GRID_COLOR,context.lineWidth=.1,this.heatmap.heatmap.isDrawGrid()&&!this.settings.squished)if(this.isColumns)for(var gridSize=availableSpace,i=start;i7&&(context.beginPath(),context.moveTo(pix+size,0),context.lineTo(pix+size,gridSize),context.stroke())}else if(!this.isRenderAs(morpheus.VectorTrack.RENDER.MOLECULE))for(var gridSize=availableSpace,i=start;i7&&(context.beginPath(),context.moveTo(0,pix+size),context.lineTo(gridSize,pix+size),context.stroke())}context.lineWidth=1;var offset=1;if(this.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)&&(this.renderColor(context,vector,start,end,clip,this.isColumns?availableSpace:0,!this.settings.discrete),offset+=this.settings.colorBarSize+2,availableSpace-=offset),!this.settings.squished&&this.isRenderAs(morpheus.VectorTrack.RENDER.SHAPE)&&(this.renderShape(context,vector,start,end,clip,this.isColumns?availableSpace-offset:offset),offset+=this.settings.colorBarSize+2,availableSpace-=offset),this.isRenderAs(morpheus.VectorTrack.RENDER.ARC)&&(this.renderArc(context,vector,start,end,clip,this.settings.arcSize),offset+=this.settings.arcSize+2,availableSpace-=offset),!this.settings.squished&&this.isRenderAs(morpheus.VectorTrack.RENDER.MOLECULE)&&this.renderMolecule(context,vector,start,end,clip,offset,availableSpace),this.isRenderAs(morpheus.VectorTrack.RENDER.BOX_PLOT)){var barSize=this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT)?this.settings.barSize:availableSpace-2;offset++,this.renderBoxPlot(context,vector,start,end,clip,offset,barSize),offset+=barSize+2,availableSpace-=offset}if(this.isRenderAs(morpheus.VectorTrack.RENDER.BAR)){var barSize=this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT)?this.settings.barSize:availableSpace-1;if(this.settings.stackedBar)this.renderStackedBar(context,vector,start,end,clip,offset,barSize);else{var fields=vector.getProperties().get(morpheus.VectorKeys.FIELDS),visibleFieldIndices=vector.getProperties().get(morpheus.VectorKeys.VISIBLE_FIELDS);null!=fields&&null==visibleFieldIndices&&(visibleFieldIndices=morpheus.Util.seq(fields.length)),null!=fields?this.renderUnstackedBar(context,vector,start,end,clip,offset,barSize,visibleFieldIndices):this.renderBar(context,vector,start,end,clip,offset,barSize)}offset+=barSize+2,availableSpace-=offset}if(!this.settings.squished&&this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR)&&(context.fillStyle=morpheus.CanvasUtil.FONT_COLOR,this.renderText(context,vector,!0,start,end,clip,offset,this.isColumns?fullAvailableSpace:0),offset+=this.settings.maxTextWidth+2,availableSpace-=offset),this.textWidth=0,!this.settings.squished&&this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT)){this.textWidth=availableSpace,context.fillStyle=morpheus.CanvasUtil.FONT_COLOR;var dataType=morpheus.VectorUtil.getDataType(vector);"url"===dataType&&(context.fillStyle="blue",this.canvas.style.cursor="pointer"),this.renderText(context,vector,!1,start,end,clip,offset,this.isColumns?fullAvailableSpace:0),offset+=this.settings.textWidth+2,availableSpace-=offset}},showPopup:function(e,isHeader){function addSection(name){items.length>0&&items.push({separator:!0}),items=items.concat(sectionToItems[name])}if(this.heatmap.options.popupEnabled){var _this=this,project=this.project,isColumns=this.isColumns,hasSelection=isColumns?project.getColumnSelectionModel().count()>0:project.getRowSelectionModel().count()>0,ANNOTATE_SELECTION="Annotate Selection",INVERT_SELECTION="Invert Selection",SELECT_ALL="Select All",SHOW_SELECTION_ONLY="Show Selection Only",CLEAR_SELECTION="Clear Selection",HIGHLIGHT_MATCHING_VALUES="Highlight Matching Values",FIELDS="Choose Fields...",DELETE="Delete...",TOOLTIP="Show In Tooltip",HIDE="Hide",HIDE_OTHERS="Hide Others",REMOVE_SHOW_SELECTION_ONLY="Show All",SORT_ASC="Sort Ascending",SORT_DESC="Sort Descending",FILTER="Filter...",SORT_SEL_ASC="Sort Heat Map Ascending ↑",SORT_SEL_DESC="Sort Heat Map Descending ↓",SORT_SEL_TOP_N="Sort Heat Map Descending/Ascending",DISPLAY_BAR="Show Bar Chart",DISPLAY_STACKED_BAR="Show Stacked Bar Chart",DISPLAY_BOX_PLOT="Show Box Plot",DISPLAY_COLOR="Show Color",COLOR_BAR_SIZE="Color Bar Size...",DISPLAY_TEXT="Show Text",DISPLAY_SHAPE="Show Shape",DISPLAY_ARC="Show Arc",DISPLAY_TEXT_AND_COLOR="Show Colored Text",DISPLAY_STRUCTURE="Show Chemical Structure",DISPLAY_CONTINUOUS="Continuous",positions=this.positions,heatmap=this.heatmap,sectionToItems={Sort:[],Selection:[],Display:[]};isHeader&§ionToItems.Sort.push({name:FILTER});var customItems=this.heatmap.getPopupItems();customItems&&customItems.length>0&&customItems.forEach(function(item){item.columns===isColumns&§ionToItems[item.section].push(item)}),sectionToItems.Selection.length>0&§ionToItems.Selection.push({separator:!0}),sectionToItems.Selection.push({name:"Copy"}),sectionToItems.Selection.push({separator:!0}),sectionToItems.Selection.push({name:ANNOTATE_SELECTION}),sectionToItems.Selection.push({name:INVERT_SELECTION}),sectionToItems.Selection.push({name:SELECT_ALL}),sectionToItems.Selection.push({name:CLEAR_SELECTION});var combinedFilter=isColumns?project.getColumnFilter():project.getRowFilter(),showSelectionOnlyIndex=combinedFilter.indexOf(SHOW_SELECTION_ONLY);showSelectionOnlyIndex!==-1&§ionToItems.Selection.push({name:REMOVE_SHOW_SELECTION_ONLY}),isHeader||(sectionToItems.Sort.push({name:SORT_SEL_ASC,disabled:!hasSelection}),sectionToItems.Sort.push({name:SORT_SEL_DESC,disabled:!hasSelection}),sectionToItems.Sort.push({name:SORT_SEL_TOP_N,disabled:!hasSelection}));var dataType=morpheus.VectorUtil.getDataType(this.getFullVector()),arrayFields=this.getFullVector().getProperties().get(morpheus.VectorKeys.FIELDS),isArray=void 0!==arrayFields,isNumber="number"===dataType||"[number]"===dataType;(isNumber||isArray)&§ionToItems.Display.push({name:DISPLAY_BAR,checked:this.isRenderAs(morpheus.VectorTrack.RENDER.BAR)}),isArray&&(sectionToItems.Display.push({name:DISPLAY_STACKED_BAR,checked:this.settings.stackedBar}),sectionToItems.Display.push({name:DISPLAY_BOX_PLOT,checked:this.isRenderAs(morpheus.VectorTrack.RENDER.BOX_PLOT)}),sectionToItems.Display.push({name:FIELDS})),"url"!==dataType&&(sectionToItems.Display.push({name:DISPLAY_TEXT,checked:this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT)}),sectionToItems.Display.push({name:DISPLAY_COLOR,checked:this.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)}),this.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)&§ionToItems.Display.push({name:COLOR_BAR_SIZE})),isArray||"url"===dataType||sectionToItems.Display.push({name:DISPLAY_SHAPE,checked:this.isRenderAs(morpheus.VectorTrack.RENDER.SHAPE)}),isArray||isNumber||this.isColumns||name.toLowerCase().indexOf("smile")===-1||sectionToItems.Display.push({name:DISPLAY_STRUCTURE,checked:this.isRenderAs(morpheus.VectorTrack.RENDER.MOLECULE)}),sectionToItems.Display.push({name:TOOLTIP,checked:this.settings.inlineTooltip}),isArray||"url"===dataType||sectionToItems.Display.push({name:HIGHLIGHT_MATCHING_VALUES,checked:this.settings.highlightMatchingValues}),"url"!==dataType&§ionToItems.Display.push({name:"Squished",checked:this.settings.squished}),(this.isRenderAs(morpheus.VectorTrack.RENDER.BAR)||this.isRenderAs(morpheus.VectorTrack.RENDER.BOX_PLOT))&&(sectionToItems.Display.push({separator:!0}),this.isRenderAs(morpheus.VectorTrack.RENDER.BAR)&§ionToItems.Display.push({name:"Edit Bar Color..."}),sectionToItems.Display.push({name:"Auto Range"}),sectionToItems.Display.push({name:"Custom Range..."})),(this.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)||this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR)||this.isRenderAs(morpheus.VectorTrack.RENDER.BAR)||this.isRenderAs(morpheus.VectorTrack.RENDER.SHAPE))&&(sectionToItems.Display.push({separator:!0}),isNumber&§ionToItems.Display.push({name:DISPLAY_CONTINUOUS,checked:!this.settings.discrete}),(this.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)||this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR)||this.isRenderAs(morpheus.VectorTrack.RENDER.BAR)&&isArray)&§ionToItems.Display.push({name:"Edit Colors..."}),this.isRenderAs(morpheus.VectorTrack.RENDER.SHAPE)&§ionToItems.Display.push({name:"Edit Shapes..."}),(this.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)||this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR)||this.isRenderAs(morpheus.VectorTrack.RENDER.BAR)&&isArray)&§ionToItems.Display.push({name:"Color Key",icon:"fa fa-key"})),this.isRenderAs(morpheus.VectorTrack.RENDER.SHAPE)&§ionToItems.Display.push({name:"Shape Key",icon:"fa fa-key"}),sectionToItems.Display.push({separator:!0}),sectionToItems.Display.push({name:HIDE}),sectionToItems.Display.push({name:HIDE_OTHERS,disabled:heatmap.getVisibleTrackNames(this.isColumns).length<=1}),sectionToItems.Display.push({separator:!0}),sectionToItems.Display.push({name:DELETE});var items=[];addSection("Sort"),_.each(sectionToItems.Selection,function(item){item.name!==REMOVE_SHOW_SELECTION_ONLY&&item.name!==SELECT_ALL&&(item.disabled=!hasSelection)}),addSection(isHeader?"Display":"Selection"),e.preventDefault&&e.preventDefault(),morpheus.Popup.showPopup(items,{x:e.pageX,y:e.pageY},e.target,function(event,item){var customItem;if("Copy"===item){var dataset=project.getSortedFilteredDataset(),v=isColumns?dataset.getColumnMetadata().getByName(_this.name):dataset.getRowMetadata().getByName(_this.name),selectionModel=isColumns?project.getColumnSelectionModel():project.getRowSelectionModel(),text=[];selectionModel.getViewIndices().forEach(function(index){text.push(morpheus.Util.toString(v.getValue(index)))}),event.clipboardData.setData("text/plain",text.join("\t"))}else if(item===FIELDS){var visibleFields,visibleFieldIndices=_this.getFullVector().getProperties().get(morpheus.VectorKeys.VISIBLE_FIELDS);if(null==visibleFieldIndices)visibleFields=arrayFields.slice(0);else{visibleFields=[];for(var i=0;i0&&(_this.settings.colorBarSize=val,_this.setInvalid(!0),_this.repaint())}),morpheus.FormBuilder.showInModal({title:"Color Bar Size",close:"Close",html:formBuilder.$form})}else if(item===ANNOTATE_SELECTION){var formBuilder=new morpheus.FormBuilder;formBuilder.append({name:"annotation_name",type:"text",required:!0}),formBuilder.append({name:"annotation_value",type:"text",required:!0}),morpheus.FormBuilder.showOkCancel({title:ANNOTATE_SELECTION,content:formBuilder.$form,okCallback:function(){var value=formBuilder.getValue("annotation_value"),annotationName=formBuilder.getValue("annotation_name"),dataset=project.getSortedFilteredDataset(),fullDataset=project.getFullDataset();isColumns&&(dataset=morpheus.DatasetUtil.transposedView(dataset),fullDataset=morpheus.DatasetUtil.transposedView(fullDataset));var existingVector=fullDataset.getRowMetadata().getByName(annotationName),v=dataset.getRowMetadata().add(annotationName),selectionModel=isColumns?project.getColumnSelectionModel():project.getRowSelectionModel();selectionModel.getViewIndices().forEach(function(index){v.setValue(index,value)}),morpheus.VectorUtil.maybeConvertStringToNumber(v),project.trigger("trackChanged",{vectors:[v],render:null!=existingVector?[]:[morpheus.VectorTrack.RENDER.TEXT],columns:isColumns})}})}else if(item===DELETE)morpheus.FormBuilder.showOkCancel({title:"Delete",content:"Are you sure you want to delete "+_this.name+"?",okCallback:function(){var metadata=isColumns?project.getFullDataset().getColumnMetadata():project.getFullDataset().getRowMetadata();metadata.remove(morpheus.MetadataUtil.indexOf(metadata,_this.name));var sortKeys=isColumns?project.getColumnSortKeys():project.getRowSortKeys(),sortKeyIndex=_.indexOf(sortKeys.map(function(key){return key.field}),_this.name);sortKeyIndex!==-1&&(sortKeys.splice(sortKeyIndex,1),isColumns?project.setColumnSortKeys(sortKeys,!0):project.setRowSortKeys(sortKeys,!0));var groupByKeys=isColumns?project.getGroupColumns():project.getGroupRows(),groupByKeyIndex=_.indexOf(groupByKeys.map(function(key){return key.field}),_this.name);groupByKeyIndex!==-1&&(groupByKeys.splice(groupByKeyIndex,1),isColumns?project.setGroupColumns(groupByKeys,!0):project.setGroupRows(groupByKeys,!0)),isColumns?project.trigger("columnTrackRemoved",{vector:_this.getFullVector()}):project.trigger("rowTrackRemoved",{vector:_this.getFullVector()})}});else if(item===CLEAR_SELECTION){var model=isColumns?project.getColumnSelectionModel():project.getRowSelectionModel();model.setViewIndices(new morpheus.Set,!0)}else if(item===INVERT_SELECTION){for(var model=isColumns?project.getColumnSelectionModel():project.getRowSelectionModel(),viewIndices=model.getViewIndices(),inverse=new morpheus.Set,i=0,n=positions.getLength();icanvasSize&&(colorBarSize=canvasSize>=5?canvasSize-1:canvasSize);var getColor;if(getColor=continuous?_.bind(colorModel.getContinuousMappedValue,colorModel):_.bind(colorModel.getMappedValue,colorModel),null!=vector.getProperties().get(morpheus.VectorKeys.FIELDS)){var visibleFieldIndices=vector.getProperties().get(morpheus.VectorKeys.VISIBLE_FIELDS);null==visibleFieldIndices&&(visibleFieldIndices=morpheus.Util.seq(vector.getProperties().get(morpheus.VectorKeys.FIELDS).length)),colorBarSize/=visibleFieldIndices.length;for(var nvisibleFieldIndices=visibleFieldIndices.length,i=start;icanvasSize&&(colorBarSize=canvasSize>=5?canvasSize-1:canvasSize),context.fillStyle="black",context.strokeStyle="black";var lineWidth=context.lineWidth;context.lineWidth=1;for(var i=start;i').appendTo($(document.body)),this.jsme=new JSApplet.JSME(this.jsmeId,"380px","340px",{})),this.jsme.readMolFile(sdf);var svg=$("#"+this.jsmeId+" > div > div > div:nth-child(2) > svg"),svgWidth=svg.width.baseVal.value,svgHeight=svg.height.baseVal.value,scale=Math.min(width/svgWidth,height/svgHeight),text=''+svg.innerHTML+"";return text},renderMolecule:function(context,vector,start,end,clip,offset){var positions=(this.isColumns,this.positions);context.fillStyle=morpheus.CanvasUtil.FONT_COLOR,context.strokeStyle="black";for(var width=this.getUnscaledWidth(),customUrlProvider=void 0!==this.heatmap.options.structureUrlProvider,dummyTarget={childNodes:[],getContext:function(){return context}},i=start;i=this.settings.mid?positivePairs.push({value:value,index:j}):value<0&&negativePairs.push({value:value,index:j})}for(var positiveIndices=morpheus.Util.indexSortPairs(positivePairs,!1),j=0,length=positiveIndices.length;j=_this.getUnscaledHeight()-3)return{cursor:"ns-resize",isPrevious:!1};if(pos.x>=_this.getUnscaledWidth()-3)return{isPrevious:!1,cursor:"ew-resize"}}else{if(pos.x<3)return{cursor:"ew-resize",isPrevious:!0};if(pos.x>=_this.getUnscaledWidth()-3)return{cursor:"ew-resize",isPrevious:!1}}}morpheus.AbstractCanvas.call(this),this.project=project,this.name=name,this.isColumns=isColumns;var canvas=this.canvas;this.controller=controller;var vector=(isColumns?project.getFullDataset().getColumnMetadata():project.getFullDataset().getRowMetadata()).getByName(name);vector&&vector.getProperties().has(morpheus.VectorKeys.TITLE)&&(this.canvas.setAttribute("title",vector.getProperties().get(morpheus.VectorKeys.TITLE)),$(this.canvas).tooltip());var _this=this;this.setBounds({height:this.defaultFontHeight+morpheus.VectorTrackHeader.FONT_OFFSET});var mouseMove=function(event){if(!morpheus.CanvasUtil.dragging){var pos=morpheus.CanvasUtil.getMousePos(event.target,event),resizeCursor=getResizeCursor(pos);canvas.style.cursor=null==resizeCursor?"default":resizeCursor.cursor,_this.isMouseOver=!0,_this.repaint()}},mouseExit=function(e){morpheus.CanvasUtil.dragging||(canvas.style.cursor="default"),_this.isMouseOver=!1,_this.repaint()},showPopup=function(e){controller.setSelectedTrack(_this.name,isColumns);var track=controller.getTrack(_this.name,isColumns);if(!track)throw _this.name+" track not found";return e.preventDefault(),e.stopPropagation&&e.stopPropagation(),e.stopImmediatePropagation&&e.stopImmediatePropagation(),track.showPopup(e,!0),!1};this.selectedBackgroundColor="#c8c8c8",this.backgroundColor="#f9f9f9",$(this.canvas).css({"background-color":this.backgroundColor}).on("mousemove.morpheus",mouseMove).on("mouseout.morpheus",mouseExit).on("mouseenter.morpheus",mouseMove),$(this.canvas).on("contextmenu.morpheus",showPopup);var resizeCursor,dragStartPosition,resizeTrackName,dragStartWidth=0,dragStartHeight=0,reorderingTrack=!1;this.hammer=morpheus.Util.hammer(canvas,["pan","tap","longpress"]).on("longpress",function(event){event.preventDefault(),controller.setSelectedTrack(_this.name,isColumns);var track=controller.getTrack(_this.name,isColumns);track.showPopup(event.srcEvent,!0)}).on("panend",function(event){_this.isMouseOver=!1,morpheus.CanvasUtil.dragging=!1,canvas.style.cursor="default";var index=controller.getTrackIndex(_this.name,isColumns),header=controller.getTrackHeaderByIndex(index,isColumns),track=controller.getTrackByIndex(index,isColumns),$canvas=$(track.canvas);$canvas.css("z-index","0"),$(header.canvas).css("z-index","0"),controller.revalidate()}).on("panstart",function(event){if(_this.isMouseOver=!1,!morpheus.CanvasUtil.dragging)if(resizeCursor=getResizeCursor(morpheus.CanvasUtil.getMousePos(event.target,event,!0)),null!=resizeCursor){if(morpheus.CanvasUtil.dragging=!0,canvas.style.cursor=resizeCursor.cursor,resizeCursor.isPrevious){var index=controller.getTrackIndex(_this.name,isColumns);index--,index===-1&&(index=0);var header=controller.getTrackHeaderByIndex(index,isColumns);dragStartWidth=header.getUnscaledWidth(),dragStartHeight=header.getUnscaledHeight(),resizeTrackName=header.name}else resizeTrackName=null,dragStartWidth=_this.getUnscaledWidth(),dragStartHeight=_this.getUnscaledHeight();event.preventDefault(),reorderingTrack=!1}else{var index=controller.getTrackIndex(_this.name,isColumns);if(index==-1)throw _this.name+" not found";var header=controller.getTrackHeaderByIndex(index,isColumns),track=controller.getTrackByIndex(index,isColumns);controller.setSelectedTrack(_this.name,isColumns);var $canvas=$(track.canvas);dragStartPosition=$canvas.position(),$canvas.css("z-index","100"),$(header.canvas).css("z-index","100"),morpheus.CanvasUtil.dragging=!0,resizeCursor=void 0,reorderingTrack=!0}}).on("panmove",function(event){if(_this.isMouseOver=!1,null!=resizeCursor){var width,height;if("ew-resize"===resizeCursor.cursor){var dx=event.deltaX;width=Math.max(8,dragStartWidth+dx)}if("ns-resize"===resizeCursor.cursor){var dy=event.deltaY;height=Math.max(8,dragStartHeight+dy)}controller.resizeTrack(null==resizeTrackName?_this.name:resizeTrackName,width,height,isColumns)}else if(reorderingTrack){var index=controller.getTrackIndex(_this.name,isColumns),header=controller.getTrackHeaderByIndex(index,isColumns),track=controller.getTrackByIndex(index,isColumns),ntracks=controller.getNumTracks(isColumns),delta=isColumns?event.deltaY:event.deltaX,newIndex=index+(delta>0?1:-1);newIndex=Math.min(Math.max(0,newIndex),ntracks-1);var prop=isColumns?"top":"left",w=isColumns?"getUnscaledHeight":"getUnscaledWidth",trackBounds={};trackBounds[prop]=dragStartPosition[prop]+delta,track.setBounds(trackBounds),header.setBounds(trackBounds);var dragOverTrack=controller.getTrackByIndex(newIndex,isColumns),dragOverWidth=dragOverTrack[w](),dragOverLeft=$(dragOverTrack.canvas).position()[prop],dragleft=dragStartPosition[prop]+delta,dragright=dragleft+track[w]();if((delta>0&&dragright>=dragOverLeft+dragOverWidth/2||delta<0&&dragleft<=dragOverLeft+dragOverWidth/2)&&index!==newIndex){controller.moveTrack(index,newIndex,isColumns);var otherHeader=controller.getTrackHeaderByIndex(index,isColumns),otherTrack=controller.getTrackByIndex(index,isColumns),$movedCanvas=$(otherTrack.canvas),newLeft=$movedCanvas.position()[prop];delta<0?newLeft+=track[w]():newLeft-=track[w]();var otherBounds={};otherBounds[prop]=newLeft,otherTrack.setBounds(otherBounds),otherHeader.setBounds(otherBounds)}}}).on("tap",function(event){if((!morpheus.Util.IS_MAC||!event.srcEvent.ctrlKey)&&(_this.isMouseOver=!1,controller.setSelectedTrack(_this.name,isColumns),(!isColumns||controller.options.columnsSortable)&&(isColumns||controller.options.rowsSortable))){var sortOrder,sortKey,additionalSort=event.srcEvent.shiftKey,isGroupBy=!1,existingSortKeyIndex=_this.getSortKeyIndexForColumnName(_this.getSortKeys(),_this.name);existingSortKeyIndex!=-1?(sortKey=_this.getSortKeys()[existingSortKeyIndex],sortOrder=sortKey.getSortOrder()===morpheus.SortKey.SortOrder.UNSORTED?morpheus.SortKey.SortOrder.ASCENDING:sortKey.getSortOrder()===morpheus.SortKey.SortOrder.ASCENDING?morpheus.SortKey.SortOrder.DESCENDING:morpheus.SortKey.SortOrder.UNSORTED):(sortKey=new morpheus.SortKey(_this.name,morpheus.SortKey.SortOrder.ASCENDING),sortOrder=morpheus.SortKey.SortOrder.ASCENDING),null!=sortKey&&(sortKey.setSortOrder(sortOrder),_this.setSortingStatus(_this.getSortKeys(),sortKey,additionalSort,isGroupBy))}})},morpheus.VectorTrackHeader.FONT_OFFSET=2,morpheus.VectorTrackHeader.prototype={selected:!1,isMouseOver:!1,defaultFontHeight:11,dispose:function(){morpheus.AbstractCanvas.prototype.dispose.call(this),$(this.canvas).off("contextmenu.morpheus mousemove.morpheus mouseout.morpheus mouseenter.morpheus"),this.hammer.destroy()},getPreferredSize:function(){var size=this.getPrintSize();return size.width+=22,this.isColumns||(size.height=this.defaultFontHeight+morpheus.VectorTrackHeader.FONT_OFFSET),size},getPrintSize:function(){var context=this.canvas.getContext("2d");context.font=this.defaultFontHeight+"px "+morpheus.CanvasUtil.FONT_NAME;var textWidth=4+context.measureText(this.name).width;return{width:textWidth,height:this.defaultFontHeight+morpheus.VectorTrackHeader.FONT_OFFSET}},getSortKeys:function(){return this.isColumns?this.project.getColumnSortKeys():this.project.getRowSortKeys()},setOrder:function(sortKeys){this.isColumns?this.project.setColumnSortKeys(morpheus.SortKey.keepExistingSortKeys(sortKeys,this.project.getColumnSortKeys()),!1):this.project.setRowSortKeys(morpheus.SortKey.keepExistingSortKeys(sortKeys,this.project.getRowSortKeys()),!1)},setGroupBy:function(groupBy){for(var existingGroupBy=this.isColumns?this.project.groupColumns:this.project.groupRows,index=-1,i=0,length=existingGroupBy.length;i1&&(xpix-=6));var ypix=this.isColumns?this.getUnscaledHeight()/2:this.getUnscaledHeight()-(this.defaultFontHeight+morpheus.VectorTrackHeader.FONT_OFFSET)/2;if(context.textBaseline="middle",this.isMouseOver){context.fillStyle="rgb(0,0,0)";for(var xdot=xpix-(isColumns?textWidth+4:4),ydot=ypix-3,i=0;i<2;i++)for(var j=0;j<3;j++)context.fillRect(xdot-3*i,ydot+3*j,1.5,1.5)}if(context.fillStyle=morpheus.CanvasUtil.FONT_COLOR,context.fillText(name,xpix,ypix),context.fillStyle=morpheus.CanvasUtil.FONT_COLOR,existingSortKeyIndex!==-1){context.beginPath();var x=this.isColumns?xpix+4:xpix+textWidth+6,arrowHeight=Math.min(8,this.getUnscaledHeight()/2-1),arrowWidth=3;sortKeys[existingSortKeyIndex].getSortOrder()===morpheus.SortKey.SortOrder.ASCENDING?(context.translate(x,ypix-arrowHeight),context.moveTo(0,0),context.lineTo(arrowWidth,arrowHeight),context.lineTo(-arrowWidth,arrowHeight)):sortKeys[existingSortKeyIndex].getSortOrder()===morpheus.SortKey.SortOrder.DESCENDING?(context.translate(x,ypix),context.moveTo(0,arrowHeight),context.lineTo(arrowWidth,0),context.lineTo(-arrowWidth,0)):(context.translate(x,ypix-arrowHeight/2),context.moveTo(0,0),context.lineTo(arrowWidth,arrowHeight/2),context.lineTo(0,arrowHeight),context.lineTo(-arrowWidth,arrowHeight/2)),context.fill(),morpheus.CanvasUtil.resetTransform(context),sortKeys.length>1&&(context.textAlign="left",context.font="8px "+morpheus.CanvasUtil.FONT_NAME,context.fillText(""+(existingSortKeyIndex+1),x+4,ypix-3))}}}},morpheus.Util.extend(morpheus.VectorTrackHeader,morpheus.AbstractCanvas),morpheus.AverageLinkage=function(nelements,distmatrix){var j,n,clusterid,number,result;clusterid=[],number=[],result=[];for(var i=0;i1;n--){morpheus.HCluster.findClosestPair(n,distmatrix,r),result[nelements-n]={},result[nelements-n].distance=r.distance;var is=r.ip,js=r.jp;result[nelements-n].left=clusterid[is],result[nelements-n].right=clusterid[js];var sum=number[is]+number[js];for(j=0;j1;n--){morpheus.HCluster.findClosestPair(n,distmatrix,r),result[nelements-n].distance=r.distance;var is=r.ip,js=r.jp;for(j=0;j=order2&&(neworder[j]+=increase),clusterid==i2&&order1order2&&(neworder[j]+=increase),clusterid==i2&&order1<=order2&&(neworder[j]+=increase),clusterid!=i1&&clusterid!=i2||(clusterids[j]=-i-1)}}}return morpheus.Util.indexSort(neworder,!0)},morpheus.HClusterGroupBy=function(dataset,groupByFieldNames,distanceFunction,linkageMethod){var vectors=(dataset.getRowMetadata(),morpheus.MetadataUtil.getVectors(dataset.getRowMetadata(),groupByFieldNames)),idToIndices=morpheus.VectorUtil.createValuesToIndicesMap(vectors),reorderedIndices=[],offset=0,root={id:-1,children:[],height:0},tree={maxHeight:0,rootNode:root,leafNodes:[],nLeafNodes:0};idToIndices.forEach(function(rowIndices,id){var hcl,originalIndicesForGroup=idToIndices.get(id),subset=morpheus.DatasetUtil.slicedView(dataset,originalIndicesForGroup,null),distanceMatrix=morpheus.HCluster.computeDistanceMatrix(subset,distanceFunction);hcl=new morpheus.HCluster(distanceMatrix,linkageMethod);for(var reorderedGroupIndices=hcl.reorderedIndices,i=0,rows=subset.getRowCount();i=score&&rowSpecificPValues[i]++}}for(var N=numPermutations,kArray=new Uint32Array(numRows),i=0;i=1;i--){var j=getRandomIntInclusive(0,i),tmp=indices[j];indices[j]=indices[i],indices[i]=tmp}for(var i=0;iranks[i-1].value?(pos=i+1,tiesTrace.length>1&&morpheus.Ranking.fillAverage(out,tiesTrace),tiesTrace=[],tiesTrace.push(ranks[i].position)):tiesTrace.push(ranks[i].position),out[ranks[i].position]=pos;return tiesTrace.length>1&&morpheus.Ranking.fillAverage(out,tiesTrace),out},morpheus.Ranking.fill=function(data,tiesTrace,value){for(var i=0,length=tiesTrace.length;i=temp[j]?(result[j].distance=result[vector[j]].distance&&(vector[j]=i)}for(i=0;iterm2?1:0}),i=0;i