"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;len>st&&val[st]<=" ";)st++;for(;len>st&&val[len-1]<=" ";)len--;return st>0||leni;i++)if(array instanceof types[i])return!0;return!1},morpheus.Util.getWindowSearchObject=function(){var searchObject={},hashObject={};return window.location.search.length>0&&(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.getQueryParams=function(s){var params={};if(!s)return params;for(var search=unescape(s),keyValuePairs=search.split("&"),i=0;i=0;i--){var src=scripts[i].src,index=src.lastIndexOf("/");if(-1!==index&&(src=src.substring(index)),-1!==src.indexOf("morpheus")&&-1===src.indexOf("external"))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,slash=name.lastIndexOf("/");-1!==slash&&slashvalue?"0"+value:value},morpheus.Util.getExtension=function(name){var dotIndex=name.lastIndexOf(".");if(dotIndex>0){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;length>i;i++)array.push(i);return array},morpheus.Util.sequ32=function(length){for(var array=new Uint32Array(length),i=0;length>i;i++)array[i]=i;return array},morpheus.Util.paramsToObject=function(hash){var search=hash?window.location.hash:window.location.search;if(search.length<=1)return{};search=unescape(search);for(var keyValuePairs=search.substring(1).split("&"),result={},i=0,length=keyValuePairs.length;length>i;i++){var pair=keyValuePairs[i].split("="),values=result[pair[0]];void 0===values&&(values=[],result[pair[0]]=values),values.push(pair[1])}return result},morpheus.Util.endsWith=function(string,suffix){return string.length>=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-1!==_.indexOf(recognizers,"pan")?hammer.add(new Hammer.Pan({threshold:1,direction:Hammer.DIRECTION_ALL})):-1!==_.indexOf(recognizers,"panh")?hammer.add(new Hammer.Pan({threshold:1,direction:Hammer.DIRECTION_HORIZONTAL})):-1!==_.indexOf(recognizers,"panv")&&hammer.add(new Hammer.Pan({threshold:1,direction:Hammer.DIRECTION_VERTICAL})),-1!==_.indexOf(recognizers,"tap")&&hammer.add(new Hammer.Tap),-1!==_.indexOf(recognizers,"pinch")&&hammer.add(new Hammer.Pinch),-1!==_.indexOf(recognizers,"longpress")&&hammer.add(new Hammer.Press({event:"longpress",time:1e3})),-1!==_.indexOf(recognizers,"press")&&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;n>i;i++){for(var item=array[i],j=0;nfields>j;j++){var field=fields[j],value=item[field];if(substrRegex.test(value)){filteredSet.add(value);break}}if(filteredSet.size()===max)break}else for(var i=0,n=array.length;n>i;i++){var value=array[i];if(substrRegex.test(value)&&filteredSet.add(value),filteredSet.size()===max)break}cb(filteredSet.values())},morpheus.Util.autosuggest=function(options){options=$.extend({},{multi:!0,delay:500,suggestWhenEmpty:!0},options),options.$el.on("keydown",function(event){event.keyCode===$.ui.keyCode.TAB&&$(this).data("ui-autocomplete").menu.active&&event.preventDefault()}).autocomplete({minLength:0,delay:options.delay,source:function(request,response){var terms=morpheus.Util.getAutocompleteTokens(request.term,{trim:!1,selectionStart:options.$el[0].selectionStart});void 0!==terms.selectionStartIndex&&-1!==terms.selectionStartIndex||(terms.selectionStartIndex=terms.length-1),(options.suggestWhenEmpty||terms.length>0)&&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[-1===terms.selectionStartIndex||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;n>i;i++){var c=text[i];'"'===c?(inQuote=!inQuote,currentToken.push(c)):" "!==c&&" "!==c||inQuote?currentToken.push(c):(tokens.push({s:currentToken.join(""),inSelectionStart:currentToken.inSelectionStart}),currentToken=[]),i===options.selectionStart-1&&(currentToken.inSelectionStart=!0)}tokens.push({s:currentToken.join(""),inSelectionStart:currentToken.inSelectionStart}),options.trim||inQuote||" "!==text[text.length-1]||tokens.push({s:" ",inSelectionStart:!1});for(var filteredTokens=[],selectionStartIndex=-1,i=0,ntokens=tokens.length;ntokens>i;i++){var token=tokens[i],s=token.s;(options.trim||ntokens-1>i)&&(s=$.trim(s)),""!==s&&(token.inSelectionStart&&(selectionStartIndex=filteredTokens.length),filteredTokens.push(s))}return filteredTokens.selectionStartIndex=selectionStartIndex,filteredTokens},morpheus.Util.autocomplete=function($el,filterFunction,selectCb,singleTerm,autoclose){$el.on("keydown",function(event){event.keyCode===$.ui.keyCode.TAB&&$(this).data("ui-autocomplete").menu.active&&event.preventDefault()}).autocomplete({minLength:1,delay:1200,source:function(request,response){var terms=morpheus.Util.getAutocompleteTokens(request.term);terms.length>0&&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;length>i;i++){for(var line=lines[i],obj={},f=0;nfields>f;f++){var value=line[f],field=header[f];obj[field]=value}array.push(obj)}return array},morpheus.Util.xlsxTo2dArray=function(data){var workbook=XLSX.read(data,{type:"binary",cellFormula:!1,cellHTML:!1}),sheetNames=workbook.SheetNames,worksheet=workbook.Sheets[sheetNames[0]],lines=morpheus.Util.sheetToArray(worksheet);return lines},morpheus.Util.xlsxTo1dArray=function(data){var workbook=XLSX.read(data,{type:"binary",cellFormula:!1,cellHTML:!1}),sheetNames=workbook.SheetNames,worksheet=workbook.Sheets[sheetNames[0]],lines=morpheus.Util.sheetToArray(worksheet," ");return lines},morpheus.Util.hashCode=function(val){var h=0;if(val.length>0)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;n>j;j++)rank[index[j]]=j+1;return rank},morpheus.Util.indexSort=function(array,ascending){var pairs=[];return array.forEach(function(value,index){pairs.push({value:value,index:index})}),morpheus.Util.indexSortPairs(pairs,ascending)},morpheus.Util.indexSortPairs=function(array,ascending){ascending?array.sort(function(a,b){return a.valuei;i++)if(!comparator(array1[i],array2[i]))return!1;return!0},morpheus.Util._intFormat="undefined"!=typeof d3?d3.format(",i"):function(d){return""+Math.round(d)},morpheus.Util.intFormat=function(n){return morpheus.Util._intFormat(n)},morpheus.Util._nf="undefined"!=typeof d3?d3.format(".4f"):function(d){return""+d},morpheus.Util.nf=function(n){var str=1>n&&n>-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.formatObject=function(value){return _.isNumber(value)?morpheus.Util.nf(value):value},morpheus.Util.arrayToString=function(array,sep){for(var s=[],i=0,length=array.length;length>i;i++)s.push(morpheus.Util.formatObject(array[i]));return s.join(sep)},morpheus.Util.wrapNumber=function(value,object){var n=new Number(value);return n.toObject=function(){return object},n},morpheus.Util.toString=function(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;length>i;i++)s.push(morpheus.Util.formatObject(value[i]));return s.join(", ")}return""+value},morpheus.Util.removeTrailingZerosInFraction=function(str){var index=str.lastIndexOf(".");if(-1!==index){for(var len=str.length,zeros=len,i=len-1;i>index&&"0"==str[i];i--,zeros--);if(zeros===index+1)return str.substring(0,index);if(len>zeros)return str.substring(0,index)+str.substring(index,zeros)}return str},morpheus.Util.s=function(n){return 1===n?"":"s"},morpheus.Util.create2dArray=function(rows,columns){for(var array2d=[],i=0;rows>i;i++){for(var array=[],j=0;columns>j;j++)array[j]=NaN;array2d.push(array)}return array2d},morpheus.Util.escapeRegex=function(value){return value.replace(/[*]/g,".*").replace(/[-[\]{}()+?,\\^$|#\s]/g,"\\$&")},morpheus.Util.createSearchPredicates=function(options){options=$.extend({},{validateFieldNames:!0,caseSensitive:!0},options);var tokens=options.tokens;if(null==tokens)return[];var availableFields=options.fields;if(!options.caseSensitive&&null!=availableFields)for(var i=0;i0,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&&-1===availableFields.indexOf(options.caseSensitive?possibleField:possibleField.toLowerCase())||(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=-1!==token.indexOf("*")?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(" "),tokens=[],i=0,nlines=lines.length;nlines>i;i++){var line=lines[i];""!==line&&tokens.push(line.split(tab))}return tokens},morpheus.Util.readLines=function(fileOrUrl){var isFile=fileOrUrl instanceof File,isString="string"==typeof fileOrUrl||fileOrUrl instanceof String,name=morpheus.Util.getFileName(fileOrUrl),ext=morpheus.Util.getExtension(name),deferred=$.Deferred();if(isString)if("xlsx"===ext){var oReq=new XMLHttpRequest;oReq.open("GET",fileOrUrl,!0),$.ajaxPrefilter({url:fileOrUrl},{},oReq),oReq.responseType="arraybuffer",oReq.onload=function(oEvent){var arrayBuffer=oReq.response;if(!arrayBuffer)throw"not found";for(var data=new Uint8Array(arrayBuffer),arr=[],i=0;i!=data.length;++i)arr[i]=String.fromCharCode(data[i]);var bstr=arr.join(""),lines=morpheus.Util.xlsxTo1dArray(bstr);deferred.resolve(lines)},oReq.send(null)}else $.ajax({url:fileOrUrl}).done(function(text,status,xhr){deferred.resolve(morpheus.Util.splitOnNewLine(text))});else if(isFile){var reader=new FileReader;reader.onload=function(event){deferred.resolve("xlsx"===ext?morpheus.Util.xlsxTo1dArray(event.target.result):morpheus.Util.splitOnNewLine(event.target.result))},"xlsx"===ext?reader.readAsBinaryString(fileOrUrl):reader.readAsText(fileOrUrl)}else deferred.resolve(fileOrUrl);return deferred},morpheus.Util.createValueToIndices=function(array,field){var map=new morpheus.Map;return _.each(array,function(item){var key=item[field],values=map.get(key);void 0===values&&(values=[],map.set(key,values)),values.push(item)}),map},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;nlines>i;i++){var line=lines[i].trim();""!==line&&(void 0!==commentCharCode?line.charCodeAt(0)!==commentCharCode&&rows.push(line):rows.push(line))}return rows},morpheus.Util.ContainsPredicate=function(field,text){this.field=field,text=text.toLowerCase(),this.text=text},morpheus.Util.ContainsPredicate.prototype={accept:function(value){return value.toLowerCase&&-1!==value.toLowerCase().indexOf(this.text)},getField:function(){return this.field},isNumber:function(){return!1},toString:function(){return"ContainsPredicate "+this.field+":"+this.text}},morpheus.Util.ExactTermPredicate=function(field,term){this.field=field,term=term.toLowerCase(),this.text=term},morpheus.Util.ExactTermPredicate.prototype={accept:function(value){return value&&value.toLowerCase&&value.toLowerCase()===this.text},getField:function(){return this.field},isNumber:function(){return!1},toString:function(){return"ExactTermPredicate "+this.field+":"+this.text}},morpheus.Util.RegexPredicate=function(field,text){this.field=field,this.text=text,this.regex=new RegExp(morpheus.Util.escapeRegex(text),"i")},morpheus.Util.RegexPredicate.prototype={accept:function(value){return this.regex.test(value)},getField:function(){return this.field},isNumber:function(){return!1},toString:function(){return"RegexPredicate "+this.field+":"+this.regex}},morpheus.Util.NumberRangePredicate=function(field,min,max){this.field=field,this.min=min,this.max=max},morpheus.Util.NumberRangePredicate.prototype={accept:function(value){return value>=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 valuen;n++)event=events[n],parts=event.split("."),baseEvent=parts[0],name=parts[1]||"",this.eventListeners[baseEvent]||(this.eventListeners[baseEvent]=[]),this.eventListeners[baseEvent].push({name:name,handler:handler});return this},getListeners:function(){return this.eventListeners||(this.eventListeners={}),this.eventListeners},setListeners:function(eventListeners){this.eventListeners=eventListeners},trigger:function(eventType,evt){this.eventListeners||(this.eventListeners={}),evt||(evt={}),evt.type=eventType,evt.source||(evt.source=this);var events=this.eventListeners[eventType];if(events)for(var len=events.length,i=0;len>i;i++)events[i].handler.apply(this,[evt]);return this},off:function(evtStr,handler){this.eventListeners||(this.eventListeners={});var n,t,event,parts,baseEvent,name,events=(evtStr||"").split(" "),len=events.length;if(!evtStr)for(t in this.eventListeners)this._off(t,null,handler);for(n=0;len>n;n++)if(event=events[n],parts=event.split("."),baseEvent=parts[0],name=parts[1],baseEvent)this.eventListeners[baseEvent]&&this._off(baseEvent,name,handler);else for(t in this.eventListeners)this._off(t,name,handler);return this},_off:function(type,name,handler){var i,evtName,evtListeners=this.eventListeners[type];for(i=0;ii;i++)if(this.array[i]!==other[i])return!1;return!0},getArray:function(){return this.array}},morpheus.Map=function(){this.map={},this.n=0},morpheus.Map.prototype={toString:function(){var s=[];return this.forEach(function(value,key){s.length>0&&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="\x00"+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="\x00"+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="\x00"+key,pair=this.map[skey];return void 0!==pair?(delete this.map[skey],this.n--,pair.value):void 0},has:function(key){var skey="\x00"+key;return void 0!==this.map[skey]}},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;end>i;i++)s+=String.fromCharCode(buffer[i]);return s}},morpheus.BufferedReader.prototype={readLine:function(){var index=this.index,bufferLength=this.bufferLength;if(index>=bufferLength)return null;for(var buffer=this.buffer,start=index,end=start;bufferLength>index;index++){var c=buffer[index];if(10===c||13===c){end=index,index===bufferLength-1||10!==buffer[index+1]&&13!==buffer[index+1]||index++,index++;break}}return this.index=index,start===end&&index===bufferLength?String(this.decoder(this.buffer,start,bufferLength)):String(this.decoder(this.buffer,start,end))}},morpheus.BufferedReader.getArrayBuffer=function(fileOrUrl,callback){var isString="string"==typeof fileOrUrl||fileOrUrl instanceof String;if(isString){var oReq=new XMLHttpRequest;oReq.open("GET",fileOrUrl,!0),oReq.responseType="arraybuffer",oReq.onload=function(oEvent){callback(null,oReq.response)},oReq.onerror=function(oEvent){callback(oEvent)},oReq.onreadystatechange=function(oEvent){4===oReq.readyState&&200!==oReq.status&&(oReq.onload=null,oReq.onerror=null,callback(404===oReq.status?new Error(fileOrUrl+" not found."):new Error("Unable to read "+fileOrUrl+".")))},oReq.send(null)}else{var reader=new FileReader;reader.onload=function(event){callback(null,event.target.result)},reader.onerror=function(event){callback(event)},reader.readAsArrayBuffer(fileOrUrl)}},morpheus.ClsReader=function(){},morpheus.ClsReader.prototype={read:function(lines){var regex=/[ ,]+/,header=lines[0].split(regex);if(header.length<3)throw new Error("Header line needs three numbers");var headerNumbers=[];try{for(var i=0;3>i;i++)headerNumbers[i]=parseInt($.trim(header[i])); }catch(e){throw new Error("Header line element "+i+" is not a number")}if(headerNumbers[0]<=0)throw new Error("Header line missing first number, number of data points");if(headerNumbers[1]<=0)throw new Error("Header line missing second number, number of classes");var numClasses=headerNumbers[1],classDefinitionLine=(headerNumbers[0],lines[1]);classDefinitionLine=classDefinitionLine.substring(classDefinitionLine.indexOf("#")+1);var classNames=$.trim(classDefinitionLine).split(regex);if(classNames.lengthi;i++)i>0&&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:" ",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]),(0>=nrows||0>=ncols)&&callback("Number of rows and columns must be greater than 0.")),dataColumnStart=numRowAnnotations+1}else if(2===lineNumber){if(columnNamesArray=result.data[0],-1===ncols&&(ncols=columnNamesArray.length-numRowAnnotations-1),2==version){var expectedColumns=ncols+2;columnNamesArray.length!==expectedColumns&&callback("Expected "+(expectedColumns-2)+" column names, but read "+(columnNamesArray.length-2)+" column names.")}var name=columnNamesArray[0],slashIndex=name.lastIndexOf("/");-1!=slashIndex&&slashIndexj;j++){var index=j+numRowAnnotations+1,columnName=indexj;j++){var rowMetadataName=""===columnNamesArray[1]?"description":columnNamesArray[j+1];rowMetadataNames.push(rowMetadataName),rowMetadata.push([])}dataMatrixLineNumberStart=3+numColumnAnnotations}else{var tokens=result.data[0];if(dataMatrixLineNumberStart>lineNumber){var metadataName=tokens[0],v=[];columnMetadata.push(v),columnMetadataNames.push(metadataName);for(var j=0;ncols>j;j++)v.push(String(tokens[j+dataColumnStart]))}else if(""!==tokens[0]){var array=new Float32Array(ncols);matrix.push(array);for(var rowAnnotationIndex=0;numRowAnnotations>=rowAnnotationIndex;rowAnnotationIndex++){var rowMetadataValue=tokens[rowAnnotationIndex];rowMetadata[rowAnnotationIndex].push(String(rowMetadataValue))}for(var columnIndex=0;ncols>columnIndex;columnIndex++){var token=tokens[columnIndex+dataColumnStart];array[columnIndex]=parseFloat(token)}}}lineNumber++},complete:function(){for(var dataset=new morpheus.Dataset({name:morpheus.Util.getBaseFileName(morpheus.Util.getFileName(fileOrUrl)),rows:matrix.length,columns:ncols,array:matrix,dataType:"Float32"}),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]),0>=nrows||0>=ncols)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(-1===ncols&&(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(-1!=slashIndex&&slashIndexj;j++){var index=j+numRowAnnotations+1,columnName=indexj;j++){var rowMetadataName=""===columnNamesArray[1]?"description":columnNamesArray[j+1];rowMetadataNames.push(rowMetadataName),rowMetadata.push([])}var dataColumnStart=numRowAnnotations+1;if(numColumnAnnotations>0)for(var columnAnnotationIndex=0;numColumnAnnotations>columnAnnotationIndex;columnAnnotationIndex++){var tokens=reader.readLine().split(tab),metadataName=tokens[0],v=[];columnMetadata.push(v),columnMetadataNames.push(metadataName);for(var j=0;ncols>j;j++)v.push(String(tokens[j+dataColumnStart]))}for(var s,nonEmptyDescriptionFound=!1,numRowAnnotationsPlusOne=numRowAnnotations+1;null!==(s=reader.readLine());)if(""!==s){var array=new Float32Array(ncols);matrix.push(array);for(var tokens=s.split(tab),rowAnnotationIndex=0;numRowAnnotationsPlusOne>rowAnnotationIndex;rowAnnotationIndex++){var rowMetadataValue=tokens[rowAnnotationIndex];rowMetadata[rowAnnotationIndex].push(String(rowMetadataValue))}for(var columnIndex=0;ncols>columnIndex;columnIndex++){var token=tokens[columnIndex+dataColumnStart];array[columnIndex]=parseFloat(token)}}for(var dataset=new morpheus.Dataset({name:datasetName,rows:matrix.length,columns:ncols,array:matrix,dataType:"Float32"}),i=0;ij;j++){var index=j+numRowAnnotations+1,columnName=indexj;j++){var columnName=columnNamesArray[j+numRowAnnotations+1];columnIds.setValue(j,String(columnName))}var rowAnnotationVectors=[dataset.getRowMetadata().add(rowIdFieldName)];if(3===version)for(var j=0;numRowAnnotations>j;j++){var rowMetadataName=""===columnNamesArray[1]?"description":columnNamesArray[j+1];rowAnnotationVectors.push(dataset.getRowMetadata().add(rowMetadataName))}else rowAnnotationVectors.push(dataset.getRowMetadata().add(columnNamesArray[1]));var dataColumnStart=numRowAnnotations+1;if(numColumnAnnotations>0)for(var columnAnnotationIndex=0;numColumnAnnotations>columnAnnotationIndex;columnAnnotationIndex++)for(var tokens=reader.readLine().split(tab),metadataName=tokens[0],v=dataset.getColumnMetadata().add(metadataName),j=0;ncols>j;j++)v.setValue(j,String(tokens[j+dataColumnStart]));for(var nonEmptyDescriptionFound=!1,numRowAnnotationsPlusOne=numRowAnnotations+1,rowIndex=0,nrows=dataset.getRowCount();nrows>rowIndex;rowIndex++){var s=reader.readLine();if(null===s)throw new Error("Missing data rows.");var tokens=s.split(tab);if(2===version){rowAnnotationVectors[0].setValue(rowIndex,String(tokens[0]));var desc=tokens[1];nonEmptyDescriptionFound||(nonEmptyDescriptionFound=""!==desc),rowAnnotationVectors[1].setValue(rowIndex,String(desc))}else for(var rowAnnotationIndex=0;numRowAnnotationsPlusOne>rowAnnotationIndex;rowAnnotationIndex++){var rowMetadataValue=tokens[rowAnnotationIndex];rowAnnotationVectors[rowAnnotationIndex].setValue(rowIndex,String(rowMetadataValue))}for(var columnIndex=0;ncols>columnIndex;columnIndex++){var token=tokens[columnIndex+dataColumnStart];dataset.setValue(rowIndex,columnIndex,parseFloat(token))}}if(2!==version||nonEmptyDescriptionFound||dataset.getRowMetadata().remove(1),rowIndex!==nrows)throw new Error("Missing data rows");return morpheus.MetadataUtil.maybeConvertStrings(dataset.getRowMetadata(),1),morpheus.MetadataUtil.maybeConvertStrings(dataset.getColumnMetadata(),1),dataset},_readNoChunking:function(fileOrUrl,callback){var _this=this,name=morpheus.Util.getBaseFileName(morpheus.Util.getFileName(fileOrUrl));morpheus.BufferedReader.getArrayBuffer(fileOrUrl,function(err,arrayBuffer){if(err)callback(err);else try{callback(null,_this._read(name,new morpheus.BufferedReader(new Uint8Array(arrayBuffer))))}catch(x){x.stack&&console.log(x.stack),callback(x)}})}},morpheus.GctWriter=function(){},morpheus.GctWriter.idFirst=function(model){for(var fields=["id","Id","pr_id"],idIndex=-1,i=0;ii;i++)i!==idIndex&&(order[j++]=i);return new morpheus.MetadataModelColumnView(model,order)}return model},morpheus.GctWriter.prototype={toString:function(value){return morpheus.Util.toString(value)},write:function(dataset){var pw=[],rowMetadata=morpheus.GctWriter.idFirst(dataset.getRowMetadata()),columnMetadata=morpheus.GctWriter.idFirst(dataset.getColumnMetadata());return this.writeHeader(rowMetadata,columnMetadata,pw),this.writeData(dataset,rowMetadata,pw),pw.join("")},writeData:function(dataset,rowMetadata,pw){for(var ncols=dataset.getColumnCount(),rowMetadataCount=rowMetadata.getMetadataCount(),i=0,rows=dataset.getRowCount();rows>i;i++){for(var rowMetadataIndex=0;rowMetadataCount>rowMetadataIndex;rowMetadataIndex++){rowMetadataIndex>0&&pw.push(" ");var value=rowMetadata.get(rowMetadataIndex).getValue(i);null!==value&&pw.push(this.toString(value))}for(var j=0;ncols>j;j++){pw.push(" ");var value=dataset.getValue(i,j);pw.push(morpheus.Util.nf(value))}pw.push("\n")}},writeHeader:function(rowMetadata,columnMetadata,pw){var rows=rowMetadata.getItemCount(),ncols=columnMetadata.getItemCount();pw.push("#1.3\n");var rowMetadataCount=rowMetadata.getMetadataCount();pw.push(rows+" "+ncols+" "+(rowMetadataCount-1)+" "+(columnMetadata.getMetadataCount()-1)),pw.push("\n");for(var i=0;rowMetadataCount>i;i++){i>0&&pw.push(" ");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;ncols>j;j++)pw.push(" "),pw.push(this.toString(columnMetadata.get(0).getValue(j)));pw.push("\n");for(var columnMetadataIndex=1,metadataSize=columnMetadata.getMetadataCount();metadataSize>columnMetadataIndex;columnMetadataIndex++){pw.push(columnMetadata.get(columnMetadataIndex).getName());for(var i=1;rowMetadataCount>i;i++)pw.push(" "),pw.push("na");for(var j=0;ncols>j;j++){pw.push(" ");var value=columnMetadata.get(columnMetadataIndex).getValue(j);null!=value&&pw.push(this.toString(value))}pw.push("\n")}}},morpheus.GctWriter12=function(){this.options={rowDescription:"Description",rowId:"id",columnId:"id"}},morpheus.GctWriter12.prototype={toString:function(value){return morpheus.Util.toString(value)},write:function(dataset){var pw=[],rows=dataset.getRowCount(),columns=dataset.getColumnCount(),version="#1.2";pw.push(version),pw.push("\n"),pw.push(rows+" "+columns),pw.push("\n");var rowMetadata=morpheus.GctWriter.idFirst(dataset.getRowMetadata()),columnMetadata=morpheus.GctWriter.idFirst(dataset.getColumnMetadata());pw.push("Name"),pw.push(" "),pw.push("Description");var columnIds=columnMetadata.getByName(this.options.columnId);columnIds||(columnIds=columnMetadata.get(0));for(var j=0;columns>j;j++)pw.push(" "),pw.push(this.toString(columnIds.getValue(j)));var rowIds=rowMetadata.get(this.options.rowId);rowIds||(rowIds=rowMetadata.get(0));var rowDescriptions=rowMetadata.getByName(this.options.rowDescription);null==rowDescriptions&&rowMetadata.getMetadataCount()>1&&(rowDescriptions=rowMetadata.get(1));for(var i=0;rows>i;i++){pw.push("\n"),pw.push(this.toString(rowIds.getValue(i))),pw.push(" ");var rowDescription=null!=rowDescriptions?rowDescriptions.getValue(i):null;null!=rowDescription&&pw.push(this.toString(rowDescription));for(var j=0;columns>j;j++)pw.push(" "),pw.push(morpheus.Util.nf(dataset.getValue(i,j)))}return pw.push("\n"),pw.join("")}},morpheus.GisticReader=function(){},morpheus.GisticReader.prototype={read:function(fileOrUrl,callback){var _this=this,name=morpheus.Util.getBaseFileName(morpheus.Util.getFileName(fileOrUrl));morpheus.BufferedReader.getArrayBuffer(fileOrUrl,function(err,arrayBuffer){if(err)callback(err);else try{callback(null,_this._read(name,new morpheus.BufferedReader(new Uint8Array(arrayBuffer))))}catch(x){x.stack&&console.log(x.stack),callback(x)}})},_read:function(datasetName,reader){for(var s,tab=/\t/,header=morpheus.Util.trim(reader.readLine()).split(tab),ncols=header.length-9,matrix=[],rowIds=[],qValues=[];null!==(s=reader.readLine());)if(s=morpheus.Util.trim(s),""!==s){var tokens=s.split(tab);if("Actual Copy Change Given"===tokens[8]){var array=new Float32Array(ncols);matrix.push(array),rowIds.push(String($.trim(tokens[1]))),qValues.push(parseFloat(tokens[5]));for(var j=9;ncols>=j;j++){var token=tokens[j];array[j-9]=parseFloat(token)}}}for(var dataset=new morpheus.Dataset({name:datasetName,rows:matrix.length,columns:ncols,array:matrix,dataType:"Float32"}),columnIds=dataset.getColumnMetadata().add("id"),j=0;ncols>j;j++)columnIds.setValue(j,String(header[j+9]));return dataset.getRowMetadata().add("id").array=rowIds,dataset.getRowMetadata().add("q_value").array=qValues,dataset}},morpheus.GmtDatasetReader=function(){},morpheus.GmtDatasetReader.prototype={getFormatName:function(){return"gmt"},read:function(fileOrUrl,callback){var name=morpheus.Util.getBaseFileName(morpheus.Util.getFileName(fileOrUrl));morpheus.BufferedReader.getArrayBuffer(fileOrUrl,function(err,arrayBuffer){if(err)callback(err);else try{callback(null,morpheus.DatasetUtil.geneSetsToDataset(name,(new morpheus.GmtReader).read(new morpheus.BufferedReader(new Uint8Array(arrayBuffer)))))}catch(x){callback(x)}})}},morpheus.GmtReader=function(){},morpheus.GmtReader.prototype={read:function(reader){for(var s,sets=[],tab=/\t/;null!=(s=reader.readLine());)if(""!==s&&"#"!==s[0]){var tokens=s.split(tab),name=tokens[0].trim(),description=tokens.length>1?tokens[1].trim():"";"BLANK"===description&&(description="");for(var ids=[],i=2;ii;i++){for(var bins=new Int32Array(7),j=0,ncols=dataset.getColumnCount();ncols>j;j++){var value=dataset.getValue(i,j);value>0&&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;ii;i++){var name=header[i].toLowerCase();headerToIndex[name]=i}for(var fields=["Hugo_Symbol","Chromosome","Start_position","Reference_Allele","Tumor_Seq_Allele2","Variant_Classification","Protein_Change","ccf_hat","tumor_f","i_tumor_f","Tumor_Sample_Barcode","tumor_name","Tumor_Sample_UUID"],fieldNameToIndex={},i=0,length=fields.length;length>i;i++){var index=headerToIndex[fields[i].toLowerCase()];void 0!==index&&(fieldNameToIndex[fields[i].toLowerCase()]=index)}var ccfColumnName,ccfColumnIndex,sampleField=morpheus.MafFileReader.getField(["Tumor_Sample_Barcode","tumor_name","Tumor_Sample_UUID"],fieldNameToIndex,{lc:!0,remove:!0}),sampleColumnName=sampleField.name,sampleIdColumnIndex=sampleField.index,tumorFractionField=morpheus.MafFileReader.getField(["ccf_hat","tumor_f","i_tumor_f"],fieldNameToIndex,{lc:!0,remove:!0});void 0!==tumorFractionField&&(ccfColumnName=tumorFractionField.name,ccfColumnIndex=tumorFractionField.index);var chromosomeColumn=fieldNameToIndex["Chromosome".toLowerCase()],startPositionColumn=fieldNameToIndex["Start_position".toLowerCase()],refAlleleColumn=fieldNameToIndex["Reference_Allele".toLowerCase()],tumorAllelColumn=fieldNameToIndex["Tumor_Seq_Allele2".toLowerCase()],proteinChangeColumn=fieldNameToIndex["Protein_Change".toLowerCase()],geneSymbolColumn=fieldNameToIndex["Hugo_Symbol".toLowerCase()],variantColumnIndex=headerToIndex["Variant_Classification".toLowerCase()];if(void 0===variantColumnIndex)throw new Error("Variant_Classification not found");fields=[];var geneFields=[];for(var key in fieldNameToIndex)key!==sampleColumnName&&key!==ccfColumnName&&geneFields.push(key),fields.push(key);for(var s,geneColumnIndices=geneFields.map(function(field){return fieldNameToIndex[field]}),geneSymbolToIndex=(geneColumnIndices.length,new morpheus.Map),sampleIdToIndex=new morpheus.Map,variantMatrix=[],ccfMatrix=[];null!==(s=reader.readLine());){var tokens=s.split(tab),sample=String(tokens[sampleIdColumnIndex]),columnIndex=sampleIdToIndex.get(sample);void 0===columnIndex&&(columnIndex=sampleIdToIndex.size(),sampleIdToIndex.set(sample,columnIndex));var gene=String(tokens[geneSymbolColumn]);if("Unknown"!==gene&&(null==this.geneFilter||this.geneFilter.has(tokens[geneSymbolColumn]))){var rowIndex=geneSymbolToIndex.get(gene);void 0===rowIndex&&(rowIndex=geneSymbolToIndex.size(),geneSymbolToIndex.set(gene,rowIndex));var value=String(tokens[variantColumnIndex]),variantCode=morpheus.MafFileReader.VARIANT_MAP.get(value);void 0===variantCode&&(variantCode=3);var variantObject={},Protein_Change=tokens[proteinChangeColumn];Protein_Change&&(variantObject.Protein=String(Protein_Change)),variantObject.__v=variantCode,variantObject.Variant=value,variantObject.Mutation=String(tokens[chromosomeColumn])+":"+String(tokens[startPositionColumn])+" "+String(tokens[refAlleleColumn])+" > "+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();nrows>i;i++)for(var j=0;ncols>j;j++)void 0===variantMatrix[i][j]&&(variantMatrix[i][j]=0);if(void 0!==ccfColumnIndex&&dataset.addSeries({dataType:"object",name:"allelic_fraction",array:ccfMatrix}),this.geneFilter){for(var orderVector=dataset.getRowMetadata().add("order"),i=0,size=orderVector.size();size>i;i++){var gene=rowIds.getValue(i),order=this.geneFilter.get(gene);orderVector.setValue(i,order)}var project=new morpheus.Project(dataset);project.setRowSortKeys([new morpheus.SortKey("order",morpheus.SortKey.SortOrder.ASCENDING)],!0);var tmp=project.getSortedFilteredDataset();project=new morpheus.Project(tmp);var columnIndices=morpheus.Util.seq(tmp.getColumnCount());columnIndices.sort(function(a,b){for(var i=0,nrows=tmp.getRowCount();nrows>i;i++)for(var seriesIndex=0,nseries=tmp.getSeriesCount();nseries>seriesIndex;seriesIndex++){var f1=tmp.getValue(i,a,seriesIndex);isNaN(f1)&&(f1=Number.NEGATIVE_INFINITY),f1=f1.valueOf();var f2=tmp.getValue(i,b,seriesIndex);isNaN(f2)&&(f2=Number.NEGATIVE_INFINITY),f2=f2.valueOf();var returnVal=f1===f2?0:f2>f1?1:-1;if(0!==returnVal)return returnVal}return 0}),dataset=new morpheus.SlicedDatasetView(dataset,null,columnIndices)}return morpheus.MafFileReader.summarizeMutations(dataset),morpheus.MafFileReader.summarizeMutations(new morpheus.TransposedDatasetView(dataset)),dataset},read:function(fileOrUrl,callback){var _this=this,name=morpheus.Util.getBaseFileName(morpheus.Util.getFileName(fileOrUrl));morpheus.BufferedReader.getArrayBuffer(fileOrUrl,function(err,arrayBuffer){if(err)callback(err);else try{callback(null,_this._getGeneLevelDataset(name,new morpheus.BufferedReader(new Uint8Array(arrayBuffer))))}catch(err){callback(err)}})}},morpheus.SegTabReader=function(){this.regions=null},morpheus.SegTabReader.binByRegion=function(dataset,regions){var chromosomeVector=dataset.getRowMetadata().getByName("Chromosome"),startVector=dataset.getRowMetadata().getByName("Start_bp"),endVector=dataset.getRowMetadata().getByName("End_bp"),collapsedDataset=new morpheus.Dataset({name:dataset.getName(),rows:regions.length,columns:dataset.getColumnCount(),dataType:"Float32"});morpheus.DatasetUtil.fill(collapsedDataset,NaN);for(var regionIdVector=collapsedDataset.getRowMetadata().add("id"),newChromosomeVector=collapsedDataset.getRowMetadata().add("chromosome"),newStartVector=collapsedDataset.getRowMetadata().add("start"),newEndVector=collapsedDataset.getRowMetadata().add("end"),nsegmentsVector=collapsedDataset.getRowMetadata().add("nsegments"),nseries=dataset.getSeriesCount(),series=1;nseries>series;series++)collapsedDataset.addSeries({name:dataset.getName(series),dataType:"Float32"});var summarizeFunction=morpheus.Mean;collapsedDataset.setColumnMetadata(dataset.getColumnMetadata());for(var regionIndex=0;regionIndexi;i++){var chromosome=chromosomeVector.getValue(i),start=startVector.getValue(i),end=endVector.getValue(i);region.chromosome==chromosome&&start>=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;jseries;series++)columnView.setSeriesIndex(series),collapsedDataset.setValue(regionIndex,j,summarizeFunction(columnView),series)}nsegmentsVector.setValue(regionIndex,rowIndices.length),regionIdVector.setValue(regionIndex,region.id),newChromosomeVector.setValue(regionIndex,region.chromosome),newStartVector.setValue(regionIndex,region.start),newEndVector.setValue(regionIndex,region.end)}return collapsedDataset},morpheus.SegTabReader.prototype={getFormatName:function(){return"seg"},setRegions:function(regions){this.regions=regions},_read:function(datasetName,reader){for(var tab=/\t/,header=reader.readLine().split(tab),fieldNameToIndex={},i=0,length=header.length;length>i;i++){var name=header[i].toLowerCase();fieldNameToIndex[name]=i}var ccfColumnName,ccfColumnIndex,sampleField=morpheus.MafFileReader.getField(["pair_id","Tumor_Sample_Barcode","tumor_name","Tumor_Sample_UUID","Sample"],fieldNameToIndex,{remove:!1,lc:!0}),sampleIdColumnIndex=(sampleField.name,sampleField.index),tumorFractionField=morpheus.MafFileReader.getField(["ccf_hat","tumor_f","i_tumor_f"],fieldNameToIndex,{remove:!1,lc:!0});void 0!==tumorFractionField&&(ccfColumnName=tumorFractionField.name,ccfColumnIndex=tumorFractionField.index);for(var s,chromosomeColumn=fieldNameToIndex.Chromosome,startPositionColumn=morpheus.MafFileReader.getField(["Start_bp","Start"],fieldNameToIndex,{remove:!1,lc:!0}).index,endPositionColumn=morpheus.MafFileReader.getField(["End_bp","End"],fieldNameToIndex,{remove:!1,lc:!0}).index,valueField=morpheus.MafFileReader.getField(["tau","Segment_Mean"],fieldNameToIndex,{remove:!1,lc:!0}).index,matrix=[],ccfMatrix=[],sampleIdToIndex=new morpheus.Map,chromosomeStartEndToIndex=new morpheus.Map;null!==(s=reader.readLine());)if(""!==s){var tokens=s.split(tab),sample=String(tokens[sampleIdColumnIndex]),columnIndex=sampleIdToIndex.get(sample);void 0===columnIndex&&(columnIndex=sampleIdToIndex.size(),sampleIdToIndex.set(sample,columnIndex));var rowId=new morpheus.Identifier([String(tokens[chromosomeColumn]),String(tokens[startPositionColumn]),String(tokens[endPositionColumn])]),rowIndex=chromosomeStartEndToIndex.get(rowId);void 0===rowIndex&&(rowIndex=chromosomeStartEndToIndex.size(),chromosomeStartEndToIndex.set(rowId,rowIndex));var value=parseFloat(String(tokens[valueField]));value=isNaN(value)?value:morpheus.Log2(value)-1;var matrixRow=matrix[rowIndex];void 0===matrixRow&&(matrixRow=[],matrix[rowIndex]=matrixRow,void 0!==ccfColumnIndex&&(ccfMatrix[rowIndex]=[])),matrixRow[columnIndex]=value,void 0!==ccfColumnIndex&&(ccfMatrix[rowIndex][columnIndex]=parseFloat(tokens[ccfColumnIndex]))}var dataset=new morpheus.Dataset({name:datasetName,array:matrix,dataType:"object",rows:chromosomeStartEndToIndex.size(),columns:sampleIdToIndex.size()}),columnIds=dataset.getColumnMetadata().add("id");sampleIdToIndex.forEach(function(index,id){columnIds.setValue(index,id)});var chromosomeVector=dataset.getRowMetadata().add("Chromosome"),startVector=dataset.getRowMetadata().add("Start_bp"),endVector=dataset.getRowMetadata().add("End_bp");return chromosomeStartEndToIndex.forEach(function(index,id){chromosomeVector.setValue(index,id.getArray()[0]),startVector.setValue(index,id.getArray()[1]),endVector.setValue(index,id.getArray()[2])}),void 0!==ccfColumnIndex&&dataset.addSeries({dataType:"object",name:"ccf",array:ccfMatrix}),null!=this.regions&&this.regions.length>0&&(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={LAML:"Acute Myeloid Leukemia",ACC:"Adrenocortical carcinoma",BLCA:"Bladder Urothelial Carcinoma",LGG:"Brain Lower Grade Glioma",BRCA:"Breast invasive carcinoma",CESC:"Cervical squamous cell carcinoma and endocervical adenocarcinoma",CHOL:"Cholangiocarcinoma",LCML:"Chronic Myelogenous Leukemia",COAD:"Colon adenocarcinoma",CNTL:"Controls",ESCA:"Esophageal carcinoma ",FPPP:"FFPE Pilot Phase II",GBM:"Glioblastoma multiforme",HNSC:"Head and Neck squamous cell carcinoma",KICH:"Kidney Chromophobe",KIRC:"Kidney renal clear cell carcinoma",KIRP:"Kidney renal papillary cell carcinoma",LIHC:"Liver hepatocellular carcinoma",LUAD:"Lung adenocarcinoma",LUSC:"Lung squamous cell carcinoma",DLBC:"Lymphoid Neoplasm Diffuse Large B-cell Lymphoma",MESO:"Mesothelioma",MISC:"Miscellaneous",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",TGCT:"Testicular Germ Cell Tumors",THYM:"Thymoma",THCA:"Thyroid carcinoma",UCS:"Uterine Carcinosarcoma",UCEC:"Uterine Corpus Endometrial Carcinoma",UVM:"Uveal Melanoma",KIPAN:"Pan-Kidney Cohort",COADREAD:"Colonrectal adenocarcinoma",GBMLGG:"Glioma",STES:"Stomach and Esophageal Carcinoma"},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();size>i;i++){var barcode=morpheus.TcgaUtil.barcode(idVector.getValue(i));idVector.setValue(i,barcode.id+"-"+barcode.sampleType),sampleType.setValue(i,barcode.sampleType),participantId.setValue(i,barcode.id)}},morpheus.TcgaUtil.getDataset=function(options){var promises=[],datasets=[],returnDeferred=$.Deferred();if(options.mrna){var mrna=$.Deferred();promises.push(mrna),(new morpheus.TxtReader).read(options.mrna,function(err,dataset){err?console.log("Error reading file:"+err):(datasets.push(dataset),morpheus.TcgaUtil.setIdAndSampleType(dataset)),mrna.resolve()})}var sigGenesLines;if(options.mutation){var mutation=$.Deferred();promises.push(mutation),(new morpheus.MafFileReader).read(options.mutation,function(err,dataset){err?console.log("Error reading file:"+err):(datasets.push(dataset),morpheus.TcgaUtil.setIdAndSampleType(dataset)),mutation.resolve()});var sigGenesAnnotation=morpheus.Util.readLines(options.sigGenes);sigGenesAnnotation.done(function(lines){sigGenesLines=lines}),promises.push(sigGenesAnnotation)}if(options.gistic){var gistic=$.Deferred();promises.push(gistic),(new morpheus.GisticReader).read(options.gistic,function(err,dataset){err?console.log("Error reading file:"+err):(datasets.push(dataset),morpheus.TcgaUtil.setIdAndSampleType(dataset)),gistic.resolve()})}if(options.gisticGene){var gisticGene=$.Deferred();promises.push(gisticGene),new morpheus.TxtReader({dataColumnStart:3}).read(options.gisticGene,function(err,dataset){err?console.log("Error reading file:"+err):(datasets.push(dataset),morpheus.TcgaUtil.setIdAndSampleType(dataset)),gisticGene.resolve()})}if(options.seg){var seg=$.Deferred();promises.push(seg),(new morpheus.SegTabReader).read(options.seg,function(err,dataset){err?console.log("Error reading file:"+err):(datasets.push(dataset),morpheus.TcgaUtil.setIdAndSampleType(dataset)),seg.resolve()})}if(options.rppa){var rppa=$.Deferred();promises.push(rppa),(new morpheus.TxtReader).read(options.rppa,function(err,dataset){err?console.log("Error reading file:"+err):(datasets.push(dataset),morpheus.TcgaUtil.setIdAndSampleType(dataset)),rppa.resolve()})}if(options.methylation){var methylation=$.Deferred();promises.push(methylation),new morpheus.TxtReader({}).read(options.methylation,function(err,dataset){err?console.log("Error reading file:"+err):(datasets.push(dataset),morpheus.TcgaUtil.setIdAndSampleType(dataset)),methylation.resolve()})}var mrnaClustPromise=morpheus.Util.readLines(options.mrnaClust);promises.push(mrnaClustPromise);var sampleIdToClusterId;mrnaClustPromise.done(function(lines){sampleIdToClusterId=new morpheus.Map;for(var lineNumber=0;-1!==lines[lineNumber].indexOf("SampleName");)lineNumber++;for(var tab=/\t/;lineNumbermaxColumns&&(maxColumns=datasets[i].getColumnCount(),maxIndex=i),"mutations_merged.maf"===datasets[i].getName()&&(maxColumns=Number.MAX_VALUE,maxIndex=i);var datasetIndices=[];datasetIndices.push(maxIndex);for(var i=0;ij;j++)clusterIdVector.setValue(j,sampleIdToClusterId.get(idVector.getValue(j)));if(options.mutation){var sourceToIndices=morpheus.VectorUtil.createValueToIndicesMap(datasetToReturn.getRowMetadata().getByName("Source")),mutationDataset=new morpheus.SlicedDatasetView(datasetToReturn,sourceToIndices.get("mutations_merged.maf"));(new morpheus.OpenFileTool).annotate(sigGenesLines,mutationDataset,!1,null,"id","gene",["q"]);var qVector=mutationDataset.getRowMetadata().getByName("q"),qValueVector=mutationDataset.getRowMetadata().getByName("q_value");null==qValueVector&&(qValueVector=mutationDataset.getRowMetadata().add("q_value"));for(var i=0,size=qValueVector.size();size>i;i++)qValueVector.setValue(i,qVector.getValue(i));mutationDataset.getRowMetadata().remove(morpheus.MetadataUtil.indexOf(mutationDataset.getRowMetadata(),"q"))}annotationDef&&annotationCallbacks.forEach(function(f){f(datasetToReturn)}),returnDeferred.resolve(datasetToReturn)}),returnDeferred},morpheus.TxtReader=function(options){this.options=$.extend({},{dataRowStart:1,dataColumnStart:1},options)},morpheus.TxtReader.prototype={read:function(fileOrUrl,callback){var _this=this,name=morpheus.Util.getBaseFileName(morpheus.Util.getFileName(fileOrUrl));morpheus.BufferedReader.getArrayBuffer(fileOrUrl,function(err,arrayBuffer){if(err)callback(err);else try{callback(null,_this._read(name,new morpheus.BufferedReader(new Uint8Array(arrayBuffer))))}catch(x){callback(x)}})},_read:function(datasetName,reader){var tab=/\t/,header=morpheus.Util.trim(reader.readLine()).split(tab);if(this.options.dataRowStart>1)for(var i=1;ii;i++)arrayOfRowArrays.push([]);for(;null!==(s=reader.readLine());)if(s=morpheus.Util.trim(s),""!==s){var array=new Float32Array(ncols);matrix.push(array);for(var tokens=s.split(tab),j=0;dataColumnStart>j;j++)arrayOfRowArrays[j].push(String(tokens[j]));for(var j=dataColumnStart;ncols>=j;j++){var token=tokens[j];array[j-dataColumnStart]=parseFloat(token)}}for(var dataset=new morpheus.Dataset({name:datasetName,rows:matrix.length,columns:ncols,array:matrix,dataType:"Float32"}),columnIds=dataset.getColumnMetadata().add("id"),i=0,j=dataColumnStart;ncols>i;i++,j++)columnIds.setValue(i,String(header[j]));var rowIdVector=dataset.getRowMetadata().add("id");rowIdVector.array=arrayOfRowArrays[0];for(var i=1;dataColumnStart>i;i++){var v=dataset.getRowMetadata().add(header[i]);v.array=arrayOfRowArrays[i]}return dataset}},morpheus.XlsxDatasetReader=function(){},morpheus.XlsxDatasetReader.prototype={read:function(fileOrUrl,callback){var _this=this,name=morpheus.Util.getBaseFileName(morpheus.Util.getFileName(fileOrUrl));morpheus.BufferedReader.getArrayBuffer(fileOrUrl,function(err,arrayBuffer){if(err)callback(err);else try{for(var data=new Uint8Array(arrayBuffer),arr=[],i=0;i!=data.length;++i)arr[i]=String.fromCharCode(data[i]);var bstr=arr.join("");callback(null,_this._read(name,bstr))}catch(x){callback(x)}})},_read:function(datasetName,bstr){for(var lines=morpheus.Util.xlsxTo2dArray(bstr),nrows=lines.length-1,header=lines[0],ncols=header.length-1,dataset=new morpheus.Dataset({name:datasetName,rows:nrows,columns:ncols}),columnIds=dataset.getColumnMetadata().add("id"),j=1;ncols>=j;j++)columnIds.setValue(j-1,header[j]);for(var rowIds=dataset.getRowMetadata().add("id"),i=1;i=j;j++){var token=tokens[j],value=parseFloat(token);dataset.setValue(i-1,j-1,value)}}return dataset}},morpheus.VectorAdapter=function(v){if(null==v)throw"vector is null";this.v=v},morpheus.VectorAdapter.prototype={setValue:function(i,value){this.v.setValue(i,value)},getValue:function(i){return this.v.getValue(i)},getProperties:function(){return this.v.getProperties()},size:function(){return this.v.size()},getName:function(){return this.v.getName()},setName:function(name){this.v.setName(name)}},morpheus.AbstractDataset=function(name,rows,columns){this.seriesNames=[name],this.seriesArrays=[],this.seriesDataTypes=[],this.rows=rows,this.columns=columns,this.rowMetadataModel=new morpheus.MetadataModel(rows),this.columnMetadataModel=new morpheus.MetadataModel(columns)},morpheus.AbstractDataset.prototype={setRowMetadata:function(metadata){this.rowMetadataModel=metadata},setColumnMetadata:function(metadata){this.columnMetadataModel=metadata},getName:function(seriesIndex){return this.seriesNames[seriesIndex||0]},setName:function(seriesIndex,name){this.seriesNames[seriesIndex||0]=name},getRowMetadata:function(){return this.rowMetadataModel},getColumnMetadata:function(){return this.columnMetadataModel},getRowCount:function(){return this.rows},getColumnCount:function(){return this.columns},getValue:function(rowIndex,columnIndex,seriesIndex){},setValue:function(rowIndex,columnIndex,value,seriesIndex){},addSeries:function(options){},getSeriesCount:function(){return this.seriesArrays.length},getDataType:function(rowIndex,seriesIndex){return this.seriesDataTypes[seriesIndex]},toString:function(){return this.getName()}},morpheus.SignalToNoise=function(list1,list2){var m1=morpheus.Mean(list1),m2=morpheus.Mean(list2),s1=Math.sqrt(morpheus.Variance(list1,m1)),s2=Math.sqrt(morpheus.Variance(list2,m2));return(m1-m2)/(s1+s2)},morpheus.SignalToNoise.toString=function(){return"Signal to noise"},morpheus.createSignalToNoiseAdjust=function(percent){percent=percent||.2;var f=function(list1,list2){var m1=morpheus.Mean(list1),m2=morpheus.Mean(list2),s1=Math.sqrt(morpheus.Variance(list1,m1)),s2=Math.sqrt(morpheus.Variance(list2,m2));return s1=morpheus.SignalToNoise.thresholdStandardDeviation(m1,s1,percent),s2=morpheus.SignalToNoise.thresholdStandardDeviation(m2,s2,percent),(m1-m2)/(s1+s2)};return f.toString=function(){return"Signal to noise (adjust standard deviation)"},f},morpheus.SignalToNoise.thresholdStandardDeviation=function(mean,standardDeviation,percent){var returnValue=standardDeviation,absMean=Math.abs(mean),minStdev=percent*absMean;return minStdev>standardDeviation&&(returnValue=minStdev),percent>returnValue&&(returnValue=percent),returnValue},morpheus.createContingencyTable=function(listOne,listTwo,groupingValue){(null==groupingValue||isNaN(groupingValue))&&(groupingValue=1);for(var aHit=0,aMiss=0,j=0,size=listOne.size();size>j;j++){var val=listOne.getValue(j);isNaN(val)||(val>=groupingValue?aHit++:aMiss++)}for(var bHit=0,bMiss=0,j=0,size=listTwo.size();size>j;j++){var val=listTwo.getValue(j);isNaN(val)||(val>=groupingValue?bHit++:bMiss++)}var N=aHit+aMiss+bHit+bMiss,K=aHit+bHit,n=aHit+aMiss,k=aHit,a=k,b=K-k,c=n-k,d=N+k-n-K;return[a,b,c,d]},morpheus.FisherExact=function(listOne,listTwo){var abcd=morpheus.createContingencyTable(listOne,listTwo,1);return morpheus.FisherExact.fisherTest(abcd[0],abcd[1],abcd[2],abcd[3])},morpheus.createFisherExact=function(groupingValue){var f=function(listOne,listTwo){var abcd=morpheus.createContingencyTable(listOne,listTwo,groupingValue);return morpheus.FisherExact.fisherTest(abcd[0],abcd[1],abcd[2],abcd[3])};return f},morpheus.FisherExact.phyper=function(a,b,c,d){return Math.exp(morpheus.FisherExact.logFactorial(a+b)+morpheus.FisherExact.logFactorial(c+d)+morpheus.FisherExact.logFactorial(a+c)+morpheus.FisherExact.logFactorial(b+d)-(morpheus.FisherExact.logFactorial(a)+morpheus.FisherExact.logFactorial(b)+morpheus.FisherExact.logFactorial(c)+morpheus.FisherExact.logFactorial(d)+morpheus.FisherExact.logFactorial(a+b+c+d)))},morpheus.FisherExact.logFactorials=[0,0,.6931471805599453,1.791759469228055,3.1780538303479458,4.787491742782046,6.579251212010101,8.525161361065415,10.60460290274525,12.801827480081469,15.104412573075516,17.502307845873887,19.987214495661885,22.552163853123425,25.19122118273868,27.89927138384089,30.671860106080672,33.50507345013689,36.39544520803305,39.339884187199495,42.335616460753485,45.38013889847691,48.47118135183523,51.60667556776438,54.78472939811232,58.00360522298052,61.261701761002,64.55753862700634,67.88974313718154,71.25703896716801],morpheus.FisherExact.logFactorial=function(k){if(k>=30){var C0=.9189385332046728,C1=.08333333333333333,C3=-.002777777777777778,C5=.0007936507936507937,C7=-.0005952380952380953,r=1/k,rr=r*r;return(k+.5)*Math.log(k)-k+C0+r*(C1+rr*(C3+rr*(C5+rr*C7)))}return morpheus.FisherExact.logFactorials[k]},morpheus.FisherExact.fisherTest=function(a,b,c,d){for(var p=morpheus.FisherExact.phyper(a,b,c,d),sum=p,_a=0,n=a+b+c+d;n>=_a;_a++){var _b=a+b-_a,_c=a+c-_a,_d=b+d-_b;if(_a!==a&&_b>=0&&_c>=0&&_d>=0){var _p=morpheus.FisherExact.phyper(_a,_b,_c,_d);p>=_p&&(sum+=_p)}}return Math.min(1,sum)},morpheus.FisherExact.toString=function(){return"Fisher Exact Test"},morpheus.FoldChange=function(list1,list2){var m1=morpheus.Mean(list1),m2=morpheus.Mean(list2);return m1/m2},morpheus.FoldChange.toString=function(){return"Fold Change"},morpheus.TTest=function(list1,list2){var m1=morpheus.Mean(list1),m2=morpheus.Mean(list2),s1=Math.sqrt(morpheus.Variance(list1,m1)),s2=Math.sqrt(morpheus.Variance(list2,m2)),n1=morpheus.CountNonNaN(list1),n2=morpheus.CountNonNaN(list2);return(m1-m2)/Math.sqrt(s1*s1/n1+s2*s2/n2)},morpheus.TTest.toString=function(){return"T-Test"},morpheus.Spearman=function(list1,list2){for(var flist1=[],flist2=[],i=0,n=list1.size();n>i;i++){var v1=list1.getValue(i),v2=list2.getValue(i);isNaN(v1)||isNaN(v2)||(flist1.push(v1),flist2.push(v2))}var rank1=morpheus.Ranking(flist1),rank2=morpheus.Ranking(flist2);return morpheus.Pearson(new morpheus.Vector("",rank1.length).setArray(rank1),new morpheus.Vector("",rank2.length).setArray(rank2))},morpheus.Spearman.toString=function(){return"Spearman rank correlation"},morpheus.WeightedMean=function(weights,values){for(var numerator=0,denom=0,i=0,size=values.size();size>i;i++){var value=values.getValue(i);if(!isNaN(value)){var weight=weights.getValue(i);isNaN(weight)||(numerator+=weight*value,denom+=weight)}}return 0==denom?NaN:numerator/denom},morpheus.WeightedMean.toString=function(){return"Weighted average"},morpheus.createOneMinusMatrixValues=function(dataset){var f=function(listOne,listTwo){return 1-dataset.getValue(listOne.getIndex(),listTwo.getIndex())};return f.toString=function(){return"One minus matrix values (for a precomputed similarity matrix)"},f},morpheus.Pearson=function(listOne,listTwo){for(var sumx=0,sumxx=0,sumy=0,sumyy=0,sumxy=0,N=0,i=0,size=listOne.size();size>i;i++){var x=listOne.getValue(i),y=listTwo.getValue(i);isNaN(x)||isNaN(y)||(sumx+=x,sumxx+=x*x,sumy+=y,sumyy+=y*y,sumxy+=x*y,N++)}var numr=sumxy-sumx*sumy/N,denr=Math.sqrt((sumxx-sumx*sumx/N)*(sumyy-sumy*sumy/N));return 0==denr?1:numr/denr},morpheus.Pearson.toString=function(){return"Pearson correlation"},morpheus.Jaccard=function(listOne,listTwo){for(var orCount=0,andCount=0,i=0,size=listOne.size();size>i;i++){var xval=listOne.getValue(i),yval=listTwo.getValue(i);if(!isNaN(xval)&&!isNaN(yval)){var x=xval>0,y=yval>0;x&&y?andCount++:(x||y)&&orCount++}}return 0===orCount?1:1-andCount/orCount},morpheus.Jaccard.toString=function(){return"Jaccard distance"},morpheus.Cosine=function(listOne,listTwo){for(var sumX2=0,sumY2=0,sumXY=0,i=0,size=listOne.size();size>i;i++){var x=listOne.getValue(i),y=listTwo.getValue(i);isNaN(x)||isNaN(y)||(sumX2+=x*x,sumY2+=y*y,sumXY+=x*y)}return sumXY/Math.sqrt(sumX2*sumY2)},morpheus.Cosine.toString=function(){return"Cosine similarity"},morpheus.Euclidean=function(x,y){for(var dist=0,i=0,size=x.size();size>i;++i){var x_i=x.getValue(i),y_i=y.getValue(i);isNaN(x_i)||isNaN(y_i)||(dist+=(x_i-y_i)*(x_i-y_i))}return Math.sqrt(dist)},morpheus.Euclidean.toString=function(){return"Euclidean distance"},morpheus.OneMinusFunction=function(f){var dist=function(x,y){return 1-f(x,y)};return dist.toString=function(){var s=f.toString();return"One minus "+s[0].toLowerCase()+s.substring(1)},dist},morpheus.Dataset=function(options){morpheus.AbstractDataset.call(this,options.name,options.rows,options.columns),null==options.dataType&&(options.dataType="Float32"),this.seriesArrays.push(options.array?options.array:morpheus.Dataset.createArray(options)),this.seriesDataTypes.push(options.dataType)},morpheus.Dataset.toJson=function(dataset,options){options=options||{};for(var data=[],i=0,nrows=dataset.getRowCount();nrows>i;i++){var row=[];data.push(row);for(var j=0,ncols=dataset.getColumnCount();ncols>j;j++)row[j]=dataset.getValue(i,j)}var vectorToJson=function(vector){for(var array=[],i=0,size=vector.size();size>i;i++)array[i]=vector.getValue(i);return{name:vector.getName(),array:array}},metadataToJson=function(metadata,fields){var filter,vectors=[];fields&&(filter=new morpheus.Set,fields.forEach(function(field){filter.add(field)}));for(var i=0,count=metadata.getMetadataCount();count>i;i++){var v=metadata.get(i);filter?filter.has(v.getName())&&vectors.push(vectorToJson(v)):vectors.push(vectorToJson(v))}return vectors};return{rows:dataset.getRowCount(),columns:dataset.getColumnCount(),seriesArrays:[data],seriesNames:[dataset.getName()],rowMetadataModel:{vectors:metadataToJson(dataset.getRowMetadata(),options.rowFields)},columnMetadataModel:{vectors:metadataToJson(dataset.getColumnMetadata(),options.columnFields)}}},morpheus.Dataset.fromJson=function(options){options.array=options.seriesArrays[0];var dataset=new morpheus.Dataset(options);return dataset.seriesNames=options.seriesNames,options.rowMetadataModel&&options.rowMetadataModel.vectors.forEach(function(v){var vector=new morpheus.Vector(v.name,dataset.getRowCount());vector.array=v.array,dataset.rowMetadataModel.vectors.push(vector)}),options.columnMetadataModel&&options.columnMetadataModel.vectors.forEach(function(v){var vector=new morpheus.Vector(v.name,dataset.getColumnCount());vector.array=v.array,dataset.columnMetadataModel.vectors.push(vector)}),dataset},morpheus.Dataset.createArray=function(options){var array=[];if(null==options.dataType||"Float32"===options.dataType)for(var i=0;ii;i++)for(var j=0,columns=dataset.getColumnCount();columns>j;j++){var d=dataset.getValue(i,j,seriesIndex);isNaN(d)||(min=Math.min(min,d))}return min},morpheus.DatasetUtil.slicedView=function(dataset,rows,columns){return new morpheus.SlicedDatasetView(dataset,rows,columns)},morpheus.DatasetUtil.transposedView=function(dataset){return dataset instanceof morpheus.TransposedDatasetView?dataset.getDataset():new morpheus.TransposedDatasetView(dataset)},morpheus.DatasetUtil.max=function(dataset,seriesIndex){seriesIndex=seriesIndex||0;for(var max=-Number.MAX_VALUE,i=0,rows=dataset.getRowCount();rows>i;i++)for(var j=0,columns=dataset.getColumnCount();columns>j;j++){var d=dataset.getValue(i,j,seriesIndex);isNaN(d)||(max=Math.max(max,d))}return max},morpheus.DatasetUtil.getDatasetReader=function(ext,options){var datasetReader;return"maf"===ext?(datasetReader=new morpheus.MafFileReader,options&&options.mafGeneFilter&&datasetReader.setGeneFilter(options.mafGeneFilter)):"gct"===ext?datasetReader=new morpheus.GctReader:"gmt"===ext?datasetReader=new morpheus.GmtDatasetReader:"xlsx"===ext?datasetReader=new morpheus.XlsxDatasetReader:"segtab"===ext||"seg"===ext?(datasetReader=new morpheus.SegTabReader,options&&options.regions&&datasetReader.setRegions(options.regions)):datasetReader="txt"===ext||"tsv"===ext||"csv"===ext?new morpheus.TxtReader:new morpheus.GctReader,datasetReader},morpheus.DatasetUtil.readDatasetArray=function(options){var retDef=$.Deferred(),loadedDatasets=[],promises=[];return _.each(options.dataset,function(option,i){var p=option.dataset.file?morpheus.DatasetUtil.read(option.dataset.file,option.dataset.options):morpheus.DatasetUtil.read(option.dataset);p.index=i,p.done(function(dataset){loadedDatasets[this.index]=dataset}),p.fail(function(err){var message=["Error opening "+(option.dataset.file?morpheus.Util.getFileName(option.dataset.file):morpheus.Util.getFileName(option.dataset))+"."];err.message&&(message.push("
    Cause: "),message.push(err.message)),retDef.reject(message.join(""))}),promises.push(p)}),0===promises.length&&retDef.reject("No datasets specified."),$.when.apply($,promises).then(function(){var joined;if(loadedDatasets.length>1){joined=new morpheus.JoinedDataset(loadedDatasets[0],loadedDatasets[1],"id","id");for(var i=2;ii;i++)sourceVector.setValue(i,name)}retDef.resolve(joined)}),retDef},morpheus.DatasetUtil.annotate=function(options){var retDef=$.Deferred(),promises=[],functions=[],isColumns=options.isColumns;return _.each(options.annotations,function(ann){if(morpheus.Util.isArray(ann.file))functions.push(function(dataset){(new morpheus.OpenFileTool).annotate(ann.file,dataset,isColumns,null,ann.datasetField,ann.fileField,ann.include)});else{var result=morpheus.Util.readLines(ann.file),fileName=morpheus.Util.getFileName(ann.file),deferred=$.Deferred();promises.push(deferred),result.fail(function(message){deferred.reject(message)}),result.done(function(lines){if(morpheus.Util.endsWith(fileName,".gmt")){var sets=(new morpheus.GmtReader).parseLines(lines);functions.push(function(dataset){(new morpheus.OpenFileTool).annotate(null,dataset,isColumns,sets,ann.datasetField,ann.fileField)}),deferred.resolve()}else morpheus.Util.endsWith(fileName,".cls")?(functions.push(function(dataset){(new morpheus.OpenFileTool).annotateCls(null,dataset,fileName,isColumns,lines)}),deferred.resolve()):(functions.push(function(dataset){(new morpheus.OpenFileTool).annotate(lines,dataset,isColumns,null,ann.datasetField,ann.fileField,ann.include)}),deferred.resolve())})}}),$.when.apply($,promises).then(function(){retDef.resolve(functions)}),retDef},morpheus.DatasetUtil.read=function(fileOrUrl,options){var isFile=fileOrUrl instanceof File,isString=_.isString(fileOrUrl),ext=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, e.data.options);datasetReader.read(e.data.fileOrUrl, function(err,dataset) { self.postMessage(dataset); });}"]),blobURL=window.URL.createObjectURL(blob),worker=new Worker(blobURL);worker.addEventListener("message",function(e){deferred.resolve(morpheus.Dataset.fromJson(e.data)),window.URL.revokeObjectURL(blobURL)},!1),worker.postMessage({path:path,fileOrUrl:fileOrUrl,options:options})}else datasetReader.read(fileOrUrl,function(err,dataset){err?deferred.reject(err):deferred.resolve(dataset)});var pr=deferred.promise();return pr.toString=function(){return""+fileOrUrl},pr}if("function"==typeof fileOrUrl.done)return fileOrUrl;var deferred=$.Deferred();return deferred.resolve(fileOrUrl),deferred.promise()},morpheus.DatasetUtil.toObjectArray=function(dataset,options){var columns=options.columns||[0],columnFields=options.columnFields||["value"];if(columnFields.length!==columns.length)throw"columns.length !== columnFields.length";var metadataFields=options.metadataFields,rowMetadata=dataset.getRowMetadata();metadataFields||(metadataFields=morpheus.MetadataUtil.getMetadataNames(rowMetadata));for(var vectors=morpheus.MetadataUtil.getVectors(rowMetadata,metadataFields),array=[],i=0;ii;i++){var v=metadata.get(i),name=v.getName(),mapped=names[name];mapped&&v.setName(mapped)}};fixNames(dataset.getRowMetadata()),fixNames(dataset.getColumnMetadata());var fix666=function(metadata){for(var i=0,count=metadata.getMetadataCount();count>i;i++){var v=metadata.get(i);if("Dose (µM)"==v.getName())for(var j=0,size=v.size();size>j;j++){var value=v.getValue(j);null!=value&&v.setValue(j,parseFloat(value))}for(var isNumber=!1,j=0,size=v.size();size>j;j++){var value=v.getValue(j);if(null!=value){isNumber=_.isNumber(value);break}}for(var newValue=isNumber||"Dose (µM)"==v.getName()?0:"",j=0,size=v.size();size>j;j++){var value=v.getValue(j);null!=value&&"-666"==value&&v.setValue(j,newValue)}}};fix666(dataset.getRowMetadata()),fix666(dataset.getColumnMetadata());var fixCommas=function(metadata){var regex=/(,)([^ ])/g;_.each(["Lineage","Histology"],function(name){var v=metadata.getByName(name);if(null!=v)for(var i=0,size=v.size();size>i;i++){var val=v.getValue(i);val&&v.setValue(i,val.replace(regex,", $2"))}})};fixCommas(dataset.getRowMetadata()),fixCommas(dataset.getColumnMetadata())},morpheus.DatasetUtil.geneSetsToDataset=function(name,sets){for(var uniqueIds=new morpheus.Map,i=0,length=sets.length;length>i;i++)for(var ids=sets[i].ids,j=0,nIds=ids.length;nIds>j;j++)uniqueIds.set(ids[j],1);for(var uniqueIdsArray=uniqueIds.keys(),dataset=new morpheus.Dataset({name:name,rows:uniqueIdsArray.length,columns:sets.length}),columnIds=dataset.getColumnMetadata().add("id"),i=0,length=sets.length;length>i;i++)columnIds.setValue(i,sets[i].name);for(var rowIds=dataset.getRowMetadata().add("id"),i=0,size=uniqueIdsArray.length;size>i;i++)rowIds.setValue(i,uniqueIdsArray[i]);for(var rowIdToIndex=morpheus.VectorUtil.createValueToIndexMap(rowIds),i=0,length=sets.length;length>i;i++)for(var ids=sets[i].ids,j=0,nIds=ids.length;nIds>j;j++)dataset.setValue(rowIdToIndex.get(ids[j]),i,1);return dataset},morpheus.DatasetUtil.DATASET_FILE_FORMATS='GCT 1.3, GCT 1.2, MAF, GMT, or a tab-delimited text file', morpheus.DatasetUtil.BASIC_DATASET_FILE_FORMATS='GCT 1.3, GCT 1.2, or a tab-delimited text file',morpheus.DatasetUtil.GCT_FILE_FORMAT='GCT 1.3',morpheus.DatasetUtil.ANNOTATION_FILE_FORMATS='an xlsx file, tab-delimited text file, or a GMT file',morpheus.DatasetUtil.DENDROGRAM_FILE_FORMATS='a Newick file',morpheus.DatasetUtil.OPEN_FILE_FORMATS='GCT 1.3, GCT 1.2, MAF, GMT, a tab-delimited text file, or a Newick file',morpheus.DatasetUtil.getRootDataset=function(dataset){for(;dataset.getDataset;)dataset=dataset.getDataset();return dataset},morpheus.DatasetUtil.getSeriesIndex=function(dataset,name){for(var i=0,nseries=dataset.getSeriesCount();nseries>i;i++)if(name===dataset.getName(i))return i;return-1},morpheus.DatasetUtil.getSeriesNames=function(dataset){for(var names=[],i=0,nseries=dataset.getSeriesCount();nseries>i;i++)names.push(dataset.getName(i));return names.sort(function(a,b){return a=a.toLowerCase(),b=b.toLowerCase(),b>a?-1:a===b?0:1}),names},morpheus.DatasetUtil.searchValues=function(dataset,text,cb){if(""!==text){var tokens=morpheus.Util.getAutocompleteTokens(text);if(0!=tokens.length){for(var seriesIndices=[],i=0,nrows=dataset.getRowCount();nrows>i;i++)for(var k=0,nseries=dataset.getSeriesCount();nseries>k;k++)"object"===dataset.getDataType(i,k)&&seriesIndices.push([i,k]);if(0!==seriesIndices.length){var _val;elementSearch:for(var k=0,nseries=seriesIndices.length;nseries>k;k++)for(var pair=seriesIndices[k],j=0,ncols=dataset.getColumnCount();ncols>j;j++){var element=dataset.getValue(pair[0],j,pair[1]);if(null!=element&&element.toObject){_val=element.toObject();break elementSearch}}for(var fields=null==_val?[]:_.keys(_val),predicates=morpheus.Util.createSearchPredicates({tokens:tokens,fields:fields}),npredicates=predicates.length,k=0,nseries=seriesIndices.length;nseries>k;k++)for(var pair=seriesIndices[k],j=0,ncols=dataset.getColumnCount();ncols>j;j++){var matches=!1,element=dataset.getValue(pair[0],j,pair[1]);if(element&&element.toObject)for(var object=element.toObject(),p=0;npredicates>p&&!matches;p++){var predicate=predicates[p],filterColumnName=predicate.getField();if(null!=filterColumnName){var value=object[filterColumnName];if(null!=value&&predicate.accept(value)){if(cb(value,pair[0],j)===!1)return;matches=!0;break}}else for(var name in object){var value=object[name];if(null!=value&&predicate.accept(value)){if(cb(value,pair[0],j)===!1)return;matches=!0;break}}}}}}}},morpheus.DatasetUtil.autocompleteValues=function(dataset){return function(tokens,cb){var token=null!=tokens&&tokens.length>0?tokens[tokens.selectionStartIndex]:"";token=$.trim(token);for(var seriesIndices=[],i=0,nrows=dataset.getRowCount();nrows>i;i++)for(var k=0,nseries=dataset.getSeriesCount();nseries>k;k++)"object"===dataset.getDataType(i,k)&&seriesIndices.push([i,k]);if(0===seriesIndices.length)return cb();var _val;elementSearch:for(var k=0,nseries=seriesIndices.length;nseries>k;k++)for(var pair=seriesIndices[k],j=0,ncols=dataset.getColumnCount();ncols>j;j++){var element=dataset.getValue(pair[0],j,pair[1]);if(null!=element&&element.toObject){_val=element.toObject();break elementSearch}}var matches=[],fields=null==_val?[]:_.keys(_val);if(""===token)return fields.sort(function(a,b){return a===b?0:b>a?-1:1}),fields.forEach(function(field){matches.push({value:field+":",label:''+field+":",show:!0})}),cb(matches);var field=null,semi=token.indexOf(":");if(semi>0&&92!==token.charCodeAt(semi-1)){var possibleField=$.trim(token.substring(0,semi));possibleField.length>0&&'"'===possibleField[0]&&'"'===possibleField[token.length-1]&&(possibleField=possibleField.substring(1,possibleField.length-1));var index=fields.indexOf(possibleField);-1!==index&&(token=$.trim(token.substring(semi+1)),field=possibleField)}var set=new morpheus.Set,regex=new RegExp("^"+morpheus.Util.escapeRegex(token),"i"),max=10;loop:for(var k=0,nseries=seriesIndices.length;nseries>k;k++)for(var pair=seriesIndices[k],j=0,ncols=dataset.getColumnCount();ncols>j;j++){var element=dataset.getValue(pair[0],j,pair[1]);if(element&&element.toObject){var object=element.toObject();if(null!==field){var val=object[field];if(null!=val){var id=new morpheus.Identifier([val,field]);if(!set.has(id)&®ex.test(val)&&(set.add(id),set.size()===max))break loop}}else for(var name in object){var val=object[name],id=new morpheus.Identifier([val,name]);if(!set.has(id)&®ex.test(val)&&(set.add(id),set.size()===max))break loop}}}set.forEach(function(id){var array=id.getArray(),field=array[1],val=array[0];matches.push({value:field+":"+val,label:''+field+':'+val+""})}),null==field&&fields.forEach(function(field){regex.test(field)&&matches.push({value:field+":",label:''+field+":",show:!0})}),cb(matches)}},morpheus.DatasetUtil.fill=function(dataset,value,seriesIndex){seriesIndex=seriesIndex||0;for(var i=0,nrows=dataset.getRowCount(),ncols=dataset.getColumnCount();nrows>i;i++)for(var j=0;ncols>j;j++)dataset.setValue(i,j,value,seriesIndex)},morpheus.DatasetUtil.shallowCopy=function(dataset){var rowMetadataModel=morpheus.MetadataUtil.shallowCopy(dataset.getRowMetadata()),columnMetadataModel=morpheus.MetadataUtil.shallowCopy(dataset.getColumnMetadata());return dataset.getRowMetadata=function(){return rowMetadataModel},dataset.getColumnMetadata=function(){return columnMetadataModel},dataset},morpheus.DatasetUtil.copy=function(dataset){for(var newDataset=new morpheus.Dataset({name:dataset.getName(),rows:dataset.getRowCount(),columns:dataset.getColumnCount(),dataType:"object"}),seriesIndex=0,nseries=dataset.getSeriesCount();nseries>seriesIndex;seriesIndex++){seriesIndex>0&&newDataset.addSeries({name:dataset.getName(seriesIndex),rows:dataset.getRowCount(),columns:dataset.getColumnCount(),dataType:"object"});for(var i=0,nrows=dataset.getRowCount(),ncols=dataset.getColumnCount();nrows>i;i++)for(var j=0;ncols>j;j++)newDataset.setValue(i,j,dataset.getValue(i,j,seriesIndex),seriesIndex)}var rowMetadataModel=morpheus.MetadataUtil.shallowCopy(dataset.getRowMetadata()),columnMetadataModel=morpheus.MetadataUtil.shallowCopy(dataset.getColumnMetadata());return newDataset.getRowMetadata=function(){return rowMetadataModel},newDataset.getColumnMetadata=function(){return columnMetadataModel},newDataset},morpheus.DatasetUtil.toString=function(dataset,value,seriesIndex){seriesIndex=seriesIndex||0;for(var s=[],i=0,nrows=dataset.getRowCount(),ncols=dataset.getColumnCount();nrows>i;i++){for(var j=0;ncols>j;j++)j>0&&s.push(", "),s.push(morpheus.Util.nf(dataset.getValue(i,j,seriesIndex)));s.push("\n")}return s.join("")},morpheus.DatasetUtil.getNonEmptyRows=function(dataset){for(var rowsToKeep=[],i=0,nrows=dataset.getRowCount();nrows>i;i++){for(var keep=!1,j=0,ncols=dataset.getColumnCount();ncols>j;j++){var value=dataset.getValue(i,j);if(!isNaN(value)){keep=!0;break}}keep&&rowsToKeep.push(i)}return rowsToKeep},morpheus.ElementSelectionModel=function(project){this.viewIndices=new morpheus.Set,this.project=project},morpheus.ElementSelectionModel.prototype={click:function(rowIndex,columnIndex,add){var id=new morpheus.Identifier([rowIndex,columnIndex]),isSelected=this.viewIndices.has(id);add?isSelected?this.viewIndices.remove(id):this.viewIndices.add(id):(this.viewIndices.clear(),isSelected||this.viewIndices.add(id)),this.trigger("selectionChanged")},setViewIndices:function(indices){this.viewIndices=indices,this.trigger("selectionChanged")},clear:function(){this.viewIndices=new morpheus.Set},getViewIndices:function(){return this.viewIndices},count:function(){return this.viewIndices.size()},toModelIndices:function(){var project=this.project,modelIndices=[];return this.viewIndices.forEach(function(id){modelIndices.push(project.convertViewRowIndexToModel(id.getArray()[0]),project.convertViewColumnIndexToModel(id.getArray()[1]))}),modelIndices},save:function(){this.modelIndices=this.toModelIndices()},restore:function(){var project=this.project;this.viewIndices=new morpheus.Set;for(var i=0,length=this.modelIndices.length;length>i;i++){var rowIndex=project.convertModelRowIndexToView(this.modelIndices[i][0]),columnIndex=project.convertModelColumnIndexToView(this.modelIndices[i][1]);-1!==rowIndex&&-1!==columnIndex&&this.viewIndices.add(new morpheus.Identifier([rowIndex,columnIndex]))}}},morpheus.Util.extend(morpheus.ElementSelectionModel,morpheus.Events),morpheus.CombinedFilter=function(isAndFilter){this.filters=[],this.isAndFilter=isAndFilter,this.enabledFilters=[],this.name="combined filter"},morpheus.CombinedFilter.prototype={shallowClone:function(){var f=new morpheus.CombinedFilter(this.isAndFilter);return f.filters=this.filters.slice(0),f},toString:function(){return this.name},setAnd:function(isAndFilter,notify){this.isAndFilter=isAndFilter,notify&&this.trigger("and",{})},isAnd:function(){return this.isAndFilter},equals:function(f){if(!(f instanceof morpheus.CombinedFilter))return!1;if(this.isAndFilter!==f.isAndFilter)return!1;if(this.filters.length!==f.filters.length)return!1;for(var i=0,length=this.filters.length;length>i;i++)if(!this.filters[i].equals(f.filters[i]))return!1;return!0},add:function(filter,notify){this.filters.push(filter),notify&&this.trigger("add",{filter:filter})},getFilters:function(){return this.filters},get:function(index){return this.filters[index]},indexOf:function(name,type){for(var i=0,length=this.filters.length;length>i;i++)if(this.filters[i].toString()===name&&(null==type?!0:this.filters[i]instanceof type))return i;return-1},remove:function(index,notify){this.filters.splice(index,1),notify&&this.trigger("remove",{index:index})},set:function(index,filter){this.filters[index]=filter},insert:function(index,filter){this.filters.splice(index,0,filter)},clear:function(){this.filters=[]},init:function(dataset){for(var i=0,nfilters=this.filters.length;nfilters>i;i++)this.filters[i].init&&this.filters[i].init(dataset);this.enabledFilters=this.filters.filter(function(filter){return filter.isEnabled()})},accept:function(index){var filters=this.enabledFilters;if(this.isAndFilter){for(var i=0,nfilters=filters.length;nfilters>i;i++)if(filters[i].accept(index)===!1)return!1;return!0}for(var i=0,nfilters=filters.length;nfilters>i;i++)if(filters[i].accept(index))return!0;return!1},isEnabled:function(){return this.enabledFilters.length>0}},morpheus.Util.extend(morpheus.CombinedFilter,morpheus.Events),morpheus.IndexFilter=function(acceptIndicesSet,name){this.acceptIndicesSet=acceptIndicesSet,this.name=name},morpheus.IndexFilter.prototype={enabled:!0,isEnabled:function(){return this.enabled},setAcceptIndicesSet:function(acceptIndicesSet){this.acceptIndicesSet=acceptIndicesSet},setEnabled:function(enabled){this.enabled=enabled},equals:function(filter){return filter instanceof morpheus.IndexFilter&&this.acceptIndicesSet.equals(filter.acceptIndicesSet)},init:function(dataset){},toString:function(){return this.name},accept:function(index){return this.acceptIndicesSet.has(index)}},morpheus.VectorFilter=function(set,maxSetSize,name){this.set=set,this.name=name,this.maxSetSize=maxSetSize},morpheus.VectorFilter.prototype={enabled:!0,isEnabled:function(){return this.enabled&&this.set.size()>0&&this.set.size()!==this.maxSetSize&&null!=this.vector},setEnabled:function(enabled){this.enabled=enabled},equals:function(filter){return filter instanceof morpheus.VectorFilter&&this.name===filter.name},init:function(dataset){this.vector=dataset.getRowMetadata().getByName(this.name)},toString:function(){return this.name},accept:function(index){return this.set.has(this.vector.getValue(index))}},morpheus.NotNullFilter=function(name){this.name=name},morpheus.NotNullFilter.prototype={enabled:!0,isEnabled:function(){return this.enabled&&null!=this.vector},setEnabled:function(enabled){this.enabled=enabled},equals:function(filter){return filter instanceof morpheus.NotNullFilter&&this.name===filter.name},init:function(dataset){this.vector=dataset.getRowMetadata().getByName(this.name)},toString:function(){return this.name},accept:function(index){return null!=this.vector.getValue(index)}},morpheus.RangeFilter=function(min,max,name){this.min=min,this.max=max,this.name=name},morpheus.RangeFilter.prototype={enabled:!0,isEnabled:function(){return this.enabled&&(!isNaN(this.min)||!isNaN(this.max))&&this.vector},setEnabled:function(enabled){this.enabled=enabled},setMin:function(value){this.min=isNaN(value)?-Number.MAX_VALUE:value},setMax:function(value){this.max=isNaN(value)?Number.MAX_VALUE:value},equals:function(filter){return filter instanceof morpheus.RangeFilter&&this.name===filter.name},init:function(dataset){this.vector=dataset.getRowMetadata().getByName(this.name)},toString:function(){return this.name},accept:function(index){var value=this.vector.getValue(index);return value>=this.min&&value<=this.max}},morpheus.TopNFilter=function(n,direction,name){this.n=n,this.direction=direction,this.name=name},morpheus.TopNFilter.TOP=0,morpheus.TopNFilter.BOTTOM=1,morpheus.TopNFilter.TOP_BOTTOM=2,morpheus.TopNFilter.prototype={enabled:!0,isEnabled:function(){return this.enabled&&this.n>0&&this.vector},setEnabled:function(enabled){this.enabled=enabled},setN:function(value){this.n=value},setDirection:function(direction){this.direction=direction},equals:function(filter){return filter instanceof morpheus.TopNFilter&&this.name===filter.name&&this.n===filter.n&&this.direction===filter.direction},init:function(dataset){if(!this.vector){var vector=dataset.getRowMetadata().getByName(this.name);this.vector=vector;for(var set=new morpheus.Set,i=0,size=vector.size();size>i;i++){var value=vector.getValue(i);isNaN(value)||set.add(value)}var values=set.values();values.sort(function(a,b){return a===b?0:b>a?-1:1}),this.sortedValues=values}for(var topAndBottomIndices=[this.sortedValues.length-this.n,this.n-1],i=0;i=topAndBottomValues[0]}:this.direction===morpheus.TopNFilter.BOTTOM?this.f=function(val){return isNaN(val)?!1:val<=topAndBottomValues[1]}:this.f=function(val){return isNaN(val)?!1:val>=topAndBottomValues[0]||val<=topAndBottomValues[1]}},accept:function(index){return this.f(this.vector.getValue(index))},toString:function(){return this.name}},morpheus.AlwaysTrueFilter=function(){},morpheus.AlwaysTrueFilter.prototype={isEnabled:function(){return!1},setEnabled:function(enabled){},equals:function(filter){return filter instanceof morpheus.AlwaysTrueFilter},init:function(dataset){},toString:function(){return"AlwaysTrue"},accept:function(index){return!0}},morpheus.IndexMapper=function(project,isRows){this.project=project,this.isRows=isRows,this.sortKeys=[],this.modelToView=null,this.filteredModelIndices=null,this.filteredSortedModelIndices=null,this.filter=new morpheus.CombinedFilter(!0),this._filter(),this._sort()},morpheus.IndexMapper.prototype={convertModelIndexToView:function(modelIndex){var index=this.modelToView.get(modelIndex);return void 0!==index?index:-1},convertViewIndexToModel:function(viewIndex){return viewIndex=0?this.filteredSortedModelIndices[viewIndex]:-1},convertToView:function(){return this.filteredSortedModelIndices},setFilter:function(filter){this.filter=filter,this._filter(),this._sort()},_filter:function(){var filteredModelIndices,filter=this.filter,dataset=this.getFullDataset();if(null!=filter&&(filter.init(dataset),filter.isEnabled())){filteredModelIndices=[];for(var i=0,nrows=dataset.getRowCount();nrows>i;i++)filter.accept(i)&&filteredModelIndices.push(i)}this.filteredModelIndices=null!=filteredModelIndices?filteredModelIndices:morpheus.Util.seq(dataset.getRowCount())},_sort:function(){var sortKeys=this.sortKeys;if(sortKeys.length>0){for(var dataset=this.getFullDataset(),nkeys=sortKeys.length,i=0;nkeys>i;i++)sortKeys[i].init(dataset,this.filteredSortedModelIndices);this.filteredSortedModelIndices=this.filteredModelIndices.slice(0),this.filteredSortedModelIndices.sort(function(a,b){for(var i=0;nkeys>i;i++){var key=sortKeys[i],comparator=key.getComparator(),val1=key.getValue(a),val2=key.getValue(b),c=comparator(val1,val2);if(0!==c)return c}return 0})}else this.filteredSortedModelIndices=this.filteredModelIndices;for(var modelToView=new morpheus.Map,i=0,length=this.filteredSortedModelIndices.length;length>i;i++)modelToView.set(this.filteredSortedModelIndices[i],i);this.modelToView=modelToView},getFilter:function(){return this.filter},getViewCount:function(){return null==this.getFullDataset()?0:this.filteredSortedModelIndices.length},setSelectedModelIndices:function(selectedModelIndices){this.selectionModel.setSelectedModelIndices(selectedModelIndices)},setSortKeys:function(sortKeys){null==sortKeys&&(sortKeys=[]),this.sortKeys=sortKeys,this._sort()},getFullDataset:function(){var originalDataset=this.project.getFullDataset();return this.isRows?originalDataset:morpheus.DatasetUtil.transposedView(originalDataset)}},morpheus.JoinedDataset=function(dataset1,dataset2,dataset1Field,dataset2Field,sourceFieldName){if(sourceFieldName=sourceFieldName||"Source",this.dataset1Field=dataset1Field,this.dataset2Field=dataset2Field,null==dataset1)throw"dataset1 is null";if(null==dataset2)throw"dataset2 is null";if(dataset1Field){for(var v1=dataset1.getColumnMetadata().getByName(dataset1Field),dataset2ValueToIndex=morpheus.VectorUtil.createValueToIndexMap(dataset2.getColumnMetadata().getByName(dataset2Field)),dataset2ColumnIndices=[],i=0;ii;i++)sourceVector.setValue(i,name);if(!dataset2.getRowMetadata().getByName(sourceFieldName))for(var sourceVector=dataset2.getRowMetadata().add(sourceFieldName),name=dataset2.getName(),i=0,nrows=sourceVector.size();nrows>i;i++)sourceVector.setValue(i,name);for(var i=0,count=dataset1.getRowMetadata().getMetadataCount();count>i;i++){var name=dataset1.getRowMetadata().get(i).getName();null==dataset2.getRowMetadata().getByName(name)&&dataset2.getRowMetadata().add(name)}for(var i=0,count=dataset2.getRowMetadata().getMetadataCount();count>i;i++){var name=dataset2.getRowMetadata().get(i).getName();null==dataset1.getRowMetadata().getByName(name)&&dataset1.getRowMetadata().add(name)}for(var dataset2RowMetadataOrder=[],metadataInDifferentOrder=!1,i=0,count=dataset1.getRowMetadata().getMetadataCount();count>i;i++){var name=dataset1.getRowMetadata().get(i).getName(),index=morpheus.MetadataUtil.indexOf(dataset2.getRowMetadata(),name);dataset2RowMetadataOrder.push(index),index!==i&&(metadataInDifferentOrder=!0)}this.dataset1=dataset1,this.dataset2=dataset2;for(var maxSeriesCount=Math.max(this.dataset1.getSeriesCount(),this.dataset2.getSeriesCount()),i=this.dataset1.getSeriesCount();maxSeriesCount>i;i++)this.dataset1.addSeries({name:this.dataset2.getName(i)});for(var i=this.dataset2.getSeriesCount();maxSeriesCount>i;i++)this.dataset2.addSeries({name:this.dataset1.getName(i)});this.rowMetadata=new morpheus.JoinedMetadataModel(this.dataset1.getRowMetadata(),metadataInDifferentOrder?new morpheus.MetadataModelColumnView(this.dataset2.getRowMetadata(),dataset2RowMetadataOrder):this.dataset2.getRowMetadata())},morpheus.JoinedDataset.prototype={getName:function(seriesIndex){return this.dataset1.getName(seriesIndex)},setName:function(seriesIndex,name){this.dataset1.setName(seriesIndex,name)},getDatasets:function(){return[this.dataset1,this.dataset2]},getDataset1:function(){return this.dataset1},getRowMetadata:function(){return this.rowMetadata},getColumnMetadata:function(){return this.dataset1.getColumnMetadata()},getRowCount:function(){return this.dataset1.getRowCount()+this.dataset2.getRowCount()},getColumnCount:function(){return this.dataset1.getColumnCount()},getValue:function(i,j,seriesIndex){return ii;i++){var v1=this.m1.get(i),v2=this.m2.get(i),v=new morpheus.JoinedVector(v1,v2);v1.getProperties().forEach(function(val,key){morpheus.VectorKeys.COPY_IGNORE.has(key)||v.properties.set(key,val)}),v2.getProperties().forEach(function(val,key){morpheus.VectorKeys.COPY_IGNORE.has(key)||v.properties.set(key,val)}),this.vectors.push(v)}},morpheus.JoinedMetadataModel.prototype={add:function(name){var oldVector,index=morpheus.MetadataUtil.indexOf(this,name);-1!==index&&(oldVector=this.remove(index));var v=new morpheus.Vector(name,this.getItemCount());if(null!=oldVector){oldVector.getProperties().forEach(function(val,key){v.getProperties().set(key,val)});for(var i=0,size=oldVector.size();size>i;i++)v.setValue(i,oldVector.getValue(i))}return this.vectors.push(v),v},getItemCount:function(){return this.m1.getItemCount()+this.m2.getItemCount()},get:function(index){return this.vectors[index]},remove:function(index){return this.vectors.splice(index,1)[0]},getByName:function(name){for(var i=0,length=this.vectors.length;length>i;i++)if(name===this.vectors[i].getName())return this.vectors[i]},getMetadataCount:function(){return this.vectors.length}},morpheus.MetadataModel=function(itemCount){this.itemCount=itemCount,this.vectors=[]},morpheus.MetadataModel.prototype={add:function(name){var oldVector,index=morpheus.MetadataUtil.indexOf(this,name);-1!==index&&(oldVector=this.remove(index));var v=new morpheus.Vector(name,this.getItemCount());if(null!=oldVector)for(var i=0,size=oldVector.size();size>i;i++){var val=oldVector.getValue(i);v.setValue(i,val)}return this.vectors.push(v),v},getItemCount:function(){return this.itemCount},get:function(index){if(0>index||index>=this.vectors.length)throw"index "+index+" out of range";return this.vectors[index]},remove:function(index){if(0>index||index>=this.vectors.length)throw"index "+index+" out of range";return this.vectors.splice(index,1)[0]},getByName:function(name){var index=morpheus.MetadataUtil.indexOf(this,name);return-1!==index?this.get(index):void 0},getMetadataCount:function(){return this.vectors.length}},morpheus.MetadataModelAdapter=function(model){this.model=model},morpheus.MetadataModelAdapter.prototype={add:function(name){return this.model.add(name)},getItemCount:function(){return this.model.getItemCount()},get:function(index){return this.model.get(index)},remove:function(index){return this.model.remove(index)},getByName:function(name){return this.model.getByName(name)},getMetadataCount:function(){return this.model.getMetadataCount()}},morpheus.MetadataModelColumnView=function(model,indices){this.model=model,this.indices=indices},morpheus.MetadataModelColumnView.prototype={add:function(name){var vector=this.model.add(name),index=morpheus.MetadataUtil.indexOf(this.model,name);return this.indices.push(index),vector},getMetadataCount:function(){return this.indices.length},get:function(index){if(0>index||index>=this.indices.length)throw"index out of bounds";return this.model.get(this.indices[index])},remove:function(index){if(0>index||index>=this.indices.length)throw"index out of bounds";var v=this.model.remove(this.indices[index]);return this.indices.splice(index,1),v},getByName:function(name){var index=morpheus.MetadataUtil.indexOf(this,name);return-1!==index?this.get(index):void 0}},morpheus.Util.extend(morpheus.MetadataModelColumnView,morpheus.MetadataModelAdapter),morpheus.MetadataModelItemView=function(model,indices){this.model=model,this.indices=indices},morpheus.MetadataModelItemView.prototype={add:function(name){var v=this.model.add(name);return new morpheus.SlicedVector(v,this.indices)},getItemCount:function(){return this.indices.length},get:function(index){var v=this.model.get(index);if(void 0!==v)return new morpheus.SlicedVector(v,this.indices)},getByName:function(name){var v=this.model.getByName(name);if(void 0!==v)return new morpheus.SlicedVector(v,this.indices)},getMetadataCount:function(){return this.model.getMetadataCount()}},morpheus.Util.extend(morpheus.MetadataModelItemView,morpheus.MetadataModelAdapter),morpheus.MetadataUtil=function(){},morpheus.MetadataUtil.renameFields=function(dataset,options){_.each(options.rows,function(item){if(item.renameTo){var v=dataset.getRowMetadata().getByName(item.field);v&&v.setName(item.renameTo)}}),_.each(options.columns,function(item){if(item.renameTo){var v=dataset.getColumnMetadata().getByName(item.field);v&&v.setName(item.renameTo)}})},morpheus.MetadataUtil.search=function(options){var model=options.model,text=options.text,isColumns=options.isColumns;if(text=$.trim(text),""===text)return null;var tokens=morpheus.Util.getAutocompleteTokens(text);if(0==tokens.length)return null;var indexField=isColumns?"COLUMN":"ROW",fieldNames=morpheus.MetadataUtil.getMetadataNames(model);fieldNames.push(indexField);for(var predicates=morpheus.Util.createSearchPredicates({tokens:tokens,fields:fieldNames,defaultMatchMode:options.defaultMatchMode}),vectors=[],nameToVector=new morpheus.Map,j=0;ji;i++){for(var matches=!1,p=0;npredicates>p&&!matches;p++){var predicate=predicates[p],filterColumnName=predicate.getField();if(null!=filterColumnName){var value=null;if(filterColumnName===indexField){if(value=i+1,predicate.accept(value)){matches=!0;break}}else{var wrapper=nameToVector.get(filterColumnName);if(wrapper&&(value=wrapper.vector.getValue(i),null!=value))if(wrapper.isArray){for(var k=0;kj;j++){var wrapper=vectors[j],value=wrapper.vector.getValue(i);if(null!=value)if(wrapper.isArray){for(var k=0;k0?tokens[tokens.selectionStartIndex]:"";token=$.trim(token);try{if(""!==token){var field=null,semi=token.indexOf(":");if(semi>0&&92!==token.charCodeAt(semi-1)){var possibleField=$.trim(token.substring(0,semi));possibleField.length>0&&'"'===possibleField[0]&&'"'===possibleField[token.length-1]&&(possibleField=possibleField.substring(1,possibleField.length-1));var index=morpheus.MetadataUtil.indexOf(searchModel,possibleField);-1!==index&&(token=$.trim(token.substring(semi+1)),searchModel=new morpheus.MetadataModelColumnView(model,[index]))}var set=new morpheus.Set;regex=new RegExp("^"+morpheus.Util.escapeRegex(token),"i");for(var max=10,vectors=[],isArray=[],j=0;ji;i++)for(var j=0;nfields>j;j++){var v=vectors[j],val=v.getValue(i);if(null!=val)if(isArray[j])for(var k=0;k'+field+':'+val+"" })})}}catch(x){}null==regex&&(regex=new RegExp(".*","i"));for(var j=0;j'+field+":",show:!0})}}cb(matches)}},morpheus.MetadataUtil.getMetadataNames=function(metadataModel){for(var names=[],i=0,count=metadataModel.getMetadataCount();count>i;i++)names.push(metadataModel.get(i).getName(i));return names.sort(function(a,b){return a=a.toLowerCase(),b=b.toLowerCase(),b>a?-1:a===b?0:1}),names},morpheus.MetadataUtil.getVectors=function(metadataModel,names){var vectors=[];return names.forEach(function(name){var v=metadataModel.getByName(name);if(!v)throw name+" not found. Available fields are "+morpheus.MetadataUtil.getMetadataNames(metadataModel);vectors.push(v)}),vectors},morpheus.MetadataUtil.indexOf=function(metadataModel,name){for(var i=0,length=metadataModel.getMetadataCount();length>i;i++)if(name===metadataModel.get(i).getName())return i;return-1},morpheus.MetadataUtil.DEFAULT_STRING_ARRAY_FIELDS=["target","moa"],morpheus.MetadataUtil.DEFAULT_HIDDEN_FIELDS=new morpheus.Set,["pr_analyte_id","pr_gene_title","pr_gene_id","pr_analyte_num","pr_bset_id","pr_lua_id","pr_pool_id","pr_is_bing","pr_is_inf","pr_is_lmark","qc_slope","qc_f_logp","qc_iqr","bead_batch","bead_revision","bead_set","det_mode","det_plate","det_well","mfc_plate_dim","mfc_plate_id","mfc_plate_name","mfc_plate_quad","mfc_plate_well","pert_dose_unit","pert_id_vendor","pert_mfc_desc","pert_mfc_id","pert_time","pert_time_unit","pert_univ_id","pert_vehicle","pool_id","rna_plate","rna_well","count_mean","count_cv","provenance_code"].forEach(function(name){morpheus.MetadataUtil.DEFAULT_HIDDEN_FIELDS.add(name)}),morpheus.MetadataUtil.maybeConvertStrings=function(metadata,metadataStartIndex){for(var i=metadataStartIndex,count=metadata.getMetadataCount();count>i;i++)morpheus.VectorUtil.maybeConvertStringToNumber(metadata.get(i));morpheus.MetadataUtil.DEFAULT_STRING_ARRAY_FIELDS.forEach(function(field){metadata.getByName(field)&&morpheus.VectorUtil.maybeConvertToStringArray(metadata.getByName(field),",")})},morpheus.MetadataUtil.copy=function(src,dest){if(src.getItemCount()!=dest.getItemCount())throw"Item count not equal in source and destination. "+src.getItemCount()+" != "+dest.getItemCount();for(var itemCount=src.getItemCount(),metadataColumns=src.getMetadataCount(),j=0;metadataColumns>j;j++){var srcVector=src.get(j),destVector=dest.getByName(srcVector.getName());null==destVector&&(destVector=dest.add(srcVector.getName()));for(var i=0;itemCount>i;i++)destVector.setValue(i,srcVector.getValue(i))}},morpheus.MetadataUtil.addVectorIfNotExists=function(metadataModel,name){var v=metadataModel.getByName(name);return v||(v=metadataModel.add(name)),v},morpheus.MetadataUtil.getMatchingIndices=function(metadataModel,tokens){for(var indices={},itemIndex=0,nitems=metadataModel.getItemCount();nitems>itemIndex;itemIndex++){for(var matches=!1,metadataIndex=0,metadataCount=metadataModel.getMetadataCount();metadataCount>metadataIndex&&!matches;metadataIndex++)for(var vector=metadataModel.get(metadataModel.getColumnName(metadataIndex)),value=vector.getValue(itemIndex),i=0,length=tokens.length;length>i;i++)if(tokens[i]==value){matches=!0;break}matches&&(indices[itemIndex]=1)}return indices},morpheus.Positions=function(){this.spaces=void 0,this.defaultPositionFunction=function(index){return this.size*index},this.squishedPositionFunction=function(index){return this.positions[index]},this.positionFunction=this.defaultPositionFunction,this.squishedIndices={},this.isSquished=!1},morpheus.Positions.getBottom=function(rect,rowPositions){var bottom=rowPositions.getLength();return null!=rect&&(bottom=1+rowPositions.getIndex(rect.y+rect.height,!1),bottom=Math.max(0,bottom),bottom=Math.min(rowPositions.getLength(),bottom)),bottom},morpheus.Positions.getTop=function(rect,rowPositions){var top=0;return null!=rect&&(top=rowPositions.getIndex(rect.y,!1)-1,top=Math.max(0,top),top=Math.min(rowPositions.getLength(),top)),top},morpheus.Positions.getLeft=function(rect,columnPositions){var left=0;return null!=rect&&(left=columnPositions.getIndex(rect.x,!1)-1,left=Math.max(0,left),left=Math.min(columnPositions.getLength(),left)),left},morpheus.Positions.getRight=function(rect,columnPositions){var right=columnPositions.getLength();return null!=rect&&(right=1+columnPositions.getIndex(rect.x+rect.width,!1),right=Math.min(columnPositions.getLength(),right)),right},morpheus.Positions.prototype={length:0,size:13,squishFactor:.1,compress:!0,copy:function(){var copy=new morpheus.Positions;return this.spaces&&(copy.spaces=this.spaces.slice()),copy.compress=this.compress,copy.squishFactor=this.squishFactor,copy.size=this.size,copy.length=this.length,this.isSquished&&(copy.positionFunction=copy.squishedPositionFunction,copy.squishedIndices=_.clone(this.squishedIndices),copy.isSquished=!0),copy},getIndex:function(position,exact){return exact?this.binaryExactSearch(position):this.binaryInExactSearch(position)},getLength:function(){return this.length},getPosition:function(index){return this.positionFunction(index)+(void 0!==this.spaces?this.spaces[index]:0)},getItemSize:function(index){return this.squishedIndices[index]===!0?this.size*this.squishFactor:this.size},getSize:function(){return this.size},setSpaces:function(spaces){this.spaces=spaces},setLength:function(length){this.length=length},setSize:function(size){this.size=size,this.isSquished&&this.setSquishedIndices(this.squishedIndices)},setSquishedIndices:function(squishedIndices){if(null!=squishedIndices){var compress=this.compress;this.squishedIndices=squishedIndices;for(var positions=[],squishFactor=this.squishFactor,size=this.size,position=0,i=0,length=this.getLength();length>i;i++){var itemSize;squishedIndices[i]===!0?(positions.push(position),itemSize=size*squishFactor,position+=itemSize):(compress||(position=size*i),positions.push(position),position+=size)}this.isSquished=!0,this.positions=positions,this.positionFunction=this.squishedPositionFunction}else this.squishedIndices={},this.isSquished=!1,this.positionFunction=this.defaultPositionFunction},setSquishFactor:function(f){this.squishFactor!==f&&(this.squishFactor=f,this.isSquished&&this.setSquishedIndices(this.squishedIndices))},getSquishFactor:function(){return this.squishFactor},binaryExactSearch:function(position){for(var low=0,high=this.length-1;high>=low;){var mid=low+high>>1,midVal=this.getPosition(mid),size=this.getItemSize(mid);if(position>=midVal&&midVal+size>position)return mid;if(position>midVal)low=mid+1;else{if(!(midVal>position))return mid;high=mid-1}}return-1},binaryInExactSearch:function(position){var low=0,high=this.getLength()-1,maxIndex=this.getLength()-1;if(position<=this.getPosition(0))return 0;for(;high>=low;){var mid=low+high>>1,midVal=this.getPosition(mid),size=this.getItemSize(mid),nextStart=maxIndex===mid?midVal+size:this.getPosition(mid+1);if(position>=midVal&&nextStart>position)return mid;if(position>midVal)low=mid+1;else{if(!(midVal>position))return mid;high=mid-1}}return low-1}},morpheus.Project=function(dataset){this.originalDataset=dataset,this.rowIndexMapper=new morpheus.IndexMapper(this,!0),this.columnIndexMapper=new morpheus.IndexMapper(this,!1),this.groupRows=[],this.groupColumns=[],this.rowColorModel=new morpheus.VectorColorModel,this.columnColorModel=new morpheus.VectorColorModel,this.rowShapeModel=new morpheus.VectorShapeModel,this.columnShapeModel=new morpheus.VectorShapeModel,this.hoverColumnIndex=-1,this.hoverRowIndex=-1,this.columnSelectionModel=new morpheus.SelectionModel(this,!0),this.rowSelectionModel=new morpheus.SelectionModel(this,!1),this.elementSelectionModel=new morpheus.ElementSelectionModel(this),morpheus.Project._recomputeCalculatedFields(this.originalDataset),morpheus.Project._recomputeCalculatedFields(new morpheus.TransposedDatasetView(this.originalDataset))},morpheus.Project.Events={DATASET_CHANGED:"datasetChanged",ROW_GROUP_BY_CHANGED:"rowGroupByChanged",COLUMN_GROUP_BY_CHANGED:"columnGroupByChanged",ROW_FILTER_CHANGED:"rowFilterChanged",COLUMN_FILTER_CHANGED:"columnFilterChanged",ROW_SORT_ORDER_CHANGED:"rowSortOrderChanged",COLUMN_SORT_ORDER_CHANGED:"columnSortOrderChanged",ROW_TRACK_REMOVED:"rowTrackRemoved",COLUMN_TRACK_REMOVED:"columnTrackRemoved"},morpheus.Project._recomputeCalculatedFields=function(dataset){for(var metadata=dataset.getRowMetadata(),view=new morpheus.DatasetRowView(dataset),metadataIndex=0,count=metadata.getMetadataCount();count>metadataIndex;metadataIndex++){var v=metadata.get(metadataIndex),f=v.getProperties().get(morpheus.VectorKeys.FUNCTION);if(null!=f&&v.getProperties().get(morpheus.VectorKeys.RECOMPUTE_FUNCTION))for(var i=0,nrows=dataset.getRowCount();nrows>i;i++)v.setValue(i,f(view.setIndex(i)))}},morpheus.Project.prototype={getHoverColumnIndex:function(){return this.hoverColumnIndex},setHoverColumnIndex:function(index){this.hoverColumnIndex=index},getHoverRowIndex:function(){return this.hoverRowIndex},setHoverRowIndex:function(index){this.hoverRowIndex=index},getRowColorModel:function(){return this.rowColorModel},getRowShapeModel:function(){return this.rowShapeModel},getColumnShapeModel:function(){return this.columnShapeModel},getGroupRows:function(){return this.groupRows},getGroupColumns:function(){return this.groupColumns},getFullDataset:function(){return this.originalDataset},getColumnSelectionModel:function(){return this.columnSelectionModel},getRowSelectionModel:function(){return this.rowSelectionModel},getFilteredSortedRowIndices:function(){return this.rowIndexMapper.convertToView()},getFilteredSortedColumnIndices:function(){return this.columnIndexMapper.convertToView()},getElementSelectionModel:function(){return this.elementSelectionModel},setFullDataset:function(dataset,notify){this.originalDataset=dataset,this.rowIndexMapper.setFilter(this.rowIndexMapper.getFilter()),this.columnIndexMapper.setFilter(this.columnIndexMapper.getFilter()),this.columnSelectionModel.clear(),this.rowSelectionModel.clear(),this.elementSelectionModel.clear(),notify&&this.trigger(morpheus.Project.Events.DATASET_CHANGED)},setGroupRows:function(keys,notify){this.groupRows=keys,notify&&this.trigger(morpheus.Project.Events.ROW_GROUP_BY_CHANGED)},setGroupColumns:function(keys,notify){this.groupColumns=keys,notify&&this.trigger(morpheus.Project.Events.COLUMN_GROUP_BY_CHANGED)},setRowFilter:function(filter,notify){this._saveSelection(!1),this.rowIndexMapper.setFilter(filter),this._restoreSelection(!1),notify&&this.trigger(morpheus.Project.Events.ROW_FILTER_CHANGED)},getRowFilter:function(){return this.rowIndexMapper.getFilter()},getColumnFilter:function(){return this.columnIndexMapper.getFilter()},setColumnFilter:function(filter,notify){this._saveSelection(!0),this.columnIndexMapper.setFilter(filter),this._restoreSelection(!0),notify&&this.trigger(morpheus.Project.Events.COLUMN_FILTER_CHANGED)},getColumnColorModel:function(){return this.columnColorModel},getSortedFilteredDataset:function(){return morpheus.DatasetUtil.slicedView(this.getFullDataset(),this.rowIndexMapper.convertToView(),this.columnIndexMapper.convertToView())},getSelectedDataset:function(options){options=$.extend({},{selectedRows:!0,selectedColumns:!0,emptyToAll:!0},options);var dataset=this.getSortedFilteredDataset(),rows=null;options.selectedRows&&(rows=this.rowSelectionModel.getViewIndices().values().sort(function(a,b){return a===b?0:b>a?-1:1}),0===rows.length&&options.emptyToAll&&(rows=null));var columns=null;return options.selectedColumns&&(columns=this.columnSelectionModel.getViewIndices().values().sort(function(a,b){return a===b?0:b>a?-1:1}),0===columns.length&&options.emptyToAll&&(columns=null)),morpheus.DatasetUtil.slicedView(dataset,rows,columns)},_saveSelection:function(isColumns){this.elementSelectionModel.save(),isColumns?this.columnSelectionModel.save():this.rowSelectionModel.save()},_restoreSelection:function(isColumns){isColumns?this.columnSelectionModel.restore():this.rowSelectionModel.restore(),this.elementSelectionModel.restore()},setRowSortKeys:function(keys,notify){this._saveSelection(!1),this.rowIndexMapper.setSortKeys(keys),this._restoreSelection(!1),notify&&this.trigger(morpheus.Project.Events.ROW_SORT_ORDER_CHANGED)},setColumnSortKeys:function(keys,notify){this._saveSelection(!0),this.columnIndexMapper.setSortKeys(keys),this._restoreSelection(!0),notify&&this.trigger(morpheus.Project.Events.COLUMN_SORT_ORDER_CHANGED)},getRowSortKeys:function(){return this.rowIndexMapper.sortKeys},getColumnSortKeys:function(){return this.columnIndexMapper.sortKeys},convertViewColumnIndexToModel:function(viewIndex){return this.columnIndexMapper.convertViewIndexToModel(viewIndex)},convertViewRowIndexToModel:function(viewIndex){return this.rowIndexMapper.convertViewIndexToModel(viewIndex)},convertModelRowIndexToView:function(modelIndex){return this.rowIndexMapper.convertModelIndexToView(modelIndex)},convertModelColumnIndexToView:function(modelIndex){return this.columnIndexMapper.convertModelIndexToView(modelIndex)},isColumnViewIndexSelected:function(index){return this.columnSelectionModel.isViewIndexSelected(index)},isRowViewIndexSelected:function(index){return this.rowSelectionModel.isViewIndexSelected(index)}},morpheus.Util.extend(morpheus.Project,morpheus.Events),morpheus.SelectionModel=function(project,isColumns){this.viewIndices=new morpheus.Set,this.project=project,this.isColumns=isColumns},morpheus.SelectionModel.prototype={setViewIndices:function(indices,notify){this.viewIndices=indices,notify&&this.trigger("selectionChanged")},isViewIndexSelected:function(index){return this.viewIndices.has(index)},clear:function(){this.viewIndices=new morpheus.Set},getViewIndices:function(){return this.viewIndices},count:function(){return this.viewIndices.size()},toModelIndices:function(){var project=this.project,f=this.isColumns?project.convertViewColumnIndexToModel:project.convertViewRowIndexToModel;f=_.bind(f,project);var modelIndices=[];return this.viewIndices.forEach(function(index){var m=f(index);modelIndices.push(m)}),modelIndices},save:function(){this.modelIndices=this.toModelIndices()},restore:function(){var project=this.project;this.viewIndices=new morpheus.Set;var f=this.isColumns?project.convertModelColumnIndexToView:project.convertModelRowIndexToView;f=_.bind(f,project);for(var i=0,length=this.modelIndices.length;length>i;i++){var index=f(this.modelIndices[i]);-1!==index&&this.viewIndices.add(index)}}},morpheus.Util.extend(morpheus.SelectionModel,morpheus.Events),morpheus.SlicedDatasetView=function(dataset,rowIndices,columnIndices){morpheus.DatasetAdapter.call(this,dataset),null==rowIndices&&(rowIndices=null),null==columnIndices&&(columnIndices=null),this.rowIndices=rowIndices,this.columnIndices=columnIndices},morpheus.SlicedDatasetView.prototype={getRowCount:function(){return null!==this.rowIndices?this.rowIndices.length:this.dataset.getRowCount()},getColumnCount:function(){return null!==this.columnIndices?this.columnIndices.length:this.dataset.getColumnCount()},getValue:function(i,j,seriesIndex){return this.dataset.getValue(null!==this.rowIndices?this.rowIndices[i]:i,null!==this.columnIndices?this.columnIndices[j]:j,seriesIndex)},setValue:function(i,j,value,seriesIndex){this.dataset.setValue(null!==this.rowIndices?this.rowIndices[i]:i,null!==this.columnIndices?this.columnIndices[j]:j,value,seriesIndex)},getRowMetadata:function(){return null!==this.rowIndices?new morpheus.MetadataModelItemView(this.dataset.getRowMetadata(),this.rowIndices):this.dataset.getRowMetadata()},getColumnMetadata:function(){return null!==this.columnIndices?new morpheus.MetadataModelItemView(this.dataset.getColumnMetadata(),this.columnIndices):this.dataset.getColumnMetadata()},toString:function(){return this.getName()}},morpheus.Util.extend(morpheus.SlicedDatasetView,morpheus.DatasetAdapter),morpheus.SlicedVector=function(v,indices){morpheus.VectorAdapter.call(this,v),this.indices=indices},morpheus.SlicedVector.prototype={setValue:function(i,value){this.v.setValue(this.indices[i],value)},getValue:function(i){return this.v.getValue(this.indices[i])},size:function(){return this.indices.length}},morpheus.Util.extend(morpheus.SlicedVector,morpheus.VectorAdapter),morpheus.MatchesOnTopSortKey=function(project,modelIndices,name){for(var modelHighlight={},viewIndices=[],i=0,length=modelIndices.length;length>i;i++)modelHighlight[modelIndices[i]]=!0,viewIndices.push(i);this.comparator=function(i1,i2){var a=void 0===modelHighlight[i1]?0:1,b=void 0==modelHighlight[i2]?0:1;return a>b?-1:a===b?0:1},this.indices=viewIndices,this.name=name},morpheus.MatchesOnTopSortKey.prototype={init:function(){},getSortOrder:function(){return 2},getComparator:function(){return this.comparator},getValue:function(i){return i},toString:function(i){return this.name}},morpheus.SortKey=function(field,sortOrder){"string"==typeof sortOrder&&(sortOrder=morpheus.SortKey.SortOrder[sortOrder.toUpperCase()]),this.field=field,this.sortOrder=sortOrder,this.v=null,this.c=null,this.setSortOrder(sortOrder)},morpheus.SortKey.SortOrder={ASCENDING:0,DESCENDING:1,UNSORTED:2,CUSTOM:3,TOP_N:4},morpheus.SortKey.ASCENDING_COMPARATOR=function(a,b){var aNaN=null==a||_.isNumber(a)&&isNaN(a)||0===a.length,bNaN=null==b||_.isNumber(b)&&isNaN(b)||0===b.length;return aNaN&&bNaN?0:aNaN?1:bNaN?-1:(a.toLowerCase&&(a=a.toLowerCase()),b.toLowerCase&&(b=b.toLowerCase()),a===b?0:b>a?-1:1)},morpheus.SortKey.DESCENDING_COMPARATOR=function(a,b){var aNaN=null==a||_.isNumber(a)&&isNaN(a)||0===a.length,bNaN=null==b||_.isNumber(b)&&isNaN(b)||0===b.length;return aNaN&&bNaN?0:aNaN?1:bNaN?-1:(a.toLowerCase&&(a=a.toLowerCase()),b.toLowerCase&&(b=b.toLowerCase()),a===b?0:b>a?1:-1)},morpheus.SortKey.NUMBER_ASCENDING_COMPARATOR=function(a,b){var aNaN=null==a||isNaN(a),bNaN=null==b||isNaN(b);return aNaN&&bNaN?0:aNaN?1:bNaN?-1:a===b?0:b>a?-1:1},morpheus.SortKey.NUMBER_DESCENDING_COMPARATOR=function(a,b){var aNaN=null==a||isNaN(a),bNaN=null==b||isNaN(b);return aNaN&&bNaN?0:aNaN?1:bNaN?-1:a===b?0:b>a?1:-1},morpheus.SortKey.STRING_ASCENDING_COMPARATOR=function(a,b){return a=null==a||void 0===a.toLowerCase?null:a.toLowerCase(),b=null==b||void 0===b.toLowerCase?null:b.toLowerCase(),a===b?0:b>a?-1:1},morpheus.SortKey.STRING_DESCENDING_COMPARATOR=function(a,b){return a=null==a||void 0===a.toLowerCase?null:a.toLowerCase(),b=null==b||void 0===b.toLowerCase?null:b.toLowerCase(),a===b?0:b>a?1:-1},morpheus.SortKey.ELEMENT_ASCENDING_COMPARATOR=function(obj1,obj2){var a=+obj1,b=+obj2,aNaN=isNaN(a),bNaN=isNaN(b);if(aNaN&&bNaN)return 0;if(aNaN)return 1;if(bNaN)return-1;if(a===b&&obj1.toObject&&obj2.toObject){var a1=obj1.toObject(),b1=obj2.toObject();for(var name in a1){a=a1[name],b=b1[name];var c=a===b?0:b>a?-1:1;if(0!==c)return c}}return a===b?0:b>a?-1:1},morpheus.SortKey.ELEMENT_DESCENDING_COMPARATOR=function(obj1,obj2){var a=+obj1,b=+obj2,aNaN=isNaN(a),bNaN=isNaN(b);if(aNaN&&bNaN)return 0;if(aNaN)return 1;if(bNaN)return-1;if(a===b&&obj1.toObject&&obj2.toObject){var a1=obj1.toObject(),b1=obj2.toObject();for(var name in a1){a=a1[name],b=b1[name];var c=a===b?0:b>a?1:-1;if(0!==c)return c}}return a===b?0:b>a?1:-1},morpheus.SortKey.BOX_PLOT_SUMMARY_FUNCTION=function(array){var box=array.box;if(null==box){var v=morpheus.VectorUtil.arrayAsVector(array);box=morpheus.BoxPlotItem(null!=this.indices?new morpheus.SlicedVector(v,this.indices):v),array.box=box}return box.q3},morpheus.SortKey.ARRAY_MAX_SUMMARY_FUNCTION=function(array){var a=0;if(null!=array){for(var aPosMax=-Number.MAX_VALUE,aNegMax=Number.MAX_VALUE,i=0,length=array.length;length>i;i++){var value=array[i];isNaN(value)||(value>=0?aPosMax=value>aPosMax?value:aPosMax:aNegMax=aNegMax>value?value:aNegMax)}aPosMax!==-Number.MAX_VALUE&&(a=aPosMax),aNegMax!==Number.MAX_VALUE&&(a=Math.abs(aNegMax)>a?aNegMax:a)}return a},morpheus.SortKey.ARRAY_ASCENDING_COMPARATOR=function(summary){return function(a,b){var aNaN=null==a,bNaN=null==b;return aNaN&&bNaN?0:aNaN?1:bNaN?-1:(a=summary(a),b=summary(b),aNaN=isNaN(a),bNaN=isNaN(b),aNaN&&bNaN?0:aNaN?1:bNaN?-1:a===b?0:b>a?-1:1)}},morpheus.SortKey.ARRAY_DESCENDING_COMPARATOR=function(summary){return function(a,b){var aNaN=null==a,bNaN=null==b;return aNaN&&bNaN?0:aNaN?1:bNaN?-1:(a=summary(a),b=summary(b),aNaN=isNaN(a),bNaN=isNaN(b),aNaN&&bNaN?0:aNaN?1:bNaN?-1:a===b?0:b>a?1:-1)}},morpheus.SortKey.reverseComparator=function(c){return function(a,b){return c(b,a)}},morpheus.SortKey.prototype={init:function(dataset){if(this.v=dataset.getRowMetadata().getByName(this.field),this.v){var dataType=morpheus.VectorUtil.getDataType(this.v);if("number"===dataType)this.c=this.sortOrder===morpheus.SortKey.SortOrder.ASCENDING?morpheus.SortKey.NUMBER_ASCENDING_COMPARATOR:morpheus.SortKey.NUMBER_DESCENDING_COMPARATOR;else if("[number]"===dataType){var summary=this.v.getProperties().get(morpheus.VectorKeys.ARRAY_SUMMARY_FUNCTION)||morpheus.SortKey.ARRAY_MAX_SUMMARY_FUNCTION;this.c=this.sortOrder===morpheus.SortKey.SortOrder.ASCENDING?morpheus.SortKey.ARRAY_ASCENDING_COMPARATOR(summary):morpheus.SortKey.ARRAY_DESCENDING_COMPARATOR(summary)}else this.c=this.sortOrder===morpheus.SortKey.SortOrder.ASCENDING?morpheus.SortKey.ASCENDING_COMPARATOR:morpheus.SortKey.DESCENDING_COMPARATOR}else this.v={},this.v.getValue=function(){return 0},this.c=this.sortOrder===morpheus.SortKey.SortOrder.ASCENDING?morpheus.SortKey.ASCENDING_COMPARATOR:morpheus.SortKey.DESCENDING_COMPARATOR},getComparator:function(){return this.c},getValue:function(i){return this.v.getValue(i)},setSortOrder:function(sortOrder){this.sortOrder=sortOrder},getSortOrder:function(){return this.sortOrder},toString:function(){return this.field}},morpheus.SortByValuesKey=function(modelIndices,sortOrder,isColumnSort){this.field="selection",this.bothCount=10,this.modelIndices=modelIndices,this.sortOrder=sortOrder,this.isColumnSort=isColumnSort,this.setSortOrder(sortOrder)},morpheus.SortByValuesKey.prototype={init:function(dataset,visibleModelIndices){if(this.dataset=morpheus.DatasetUtil.slicedView(dataset,null,this.modelIndices),this.rowView=new morpheus.DatasetRowView(this.dataset),this.summaryFunction=this.modelIndices.length>1?morpheus.Median:function(row){return row.getValue(0)},this.sortOrder===morpheus.SortKey.SortOrder.TOP_N){for(var pairs=[],missingIndices=[],i=0,nrows=visibleModelIndices.length;nrows>i;i++){var index=visibleModelIndices[i],value=this.summaryFunction(this.rowView.setIndex(index));isNaN(value)?missingIndices.push(index):pairs.push({index:index,value:value})}pairs.sort(function(a,b){return a.valuecounter;){for(var i=0;nInGroup>i&&ntop>topIndex;i++,topIndex++,counter++)modelIndexToValue[topPairs[topIndex].index]=counter;for(var indexCounterPairs=[],i=0;nInGroup>i&&bottomIndex>=0;i++,bottomIndex--,counter++)indexCounterPairs.push([bottomPairs[bottomIndex].index,counter]);for(var i=indexCounterPairs.length-1,j=0;i>=0;i--,j++){var item_i=indexCounterPairs[i],item_j=indexCounterPairs[j];modelIndexToValue[item_i[0]]=item_j[1]}}for(var i=0,length=missingIndices.length;length>i;i++,counter++)modelIndexToValue[missingIndices[i]]=counter;this.modelIndexToValue=modelIndexToValue}else delete this.modelIndexToValue},getComparator:function(){return this.c},getValue:function(i){return this.modelIndexToValue?this.modelIndexToValue[i]:this.summaryFunction(this.rowView.setIndex(i))},setSortOrder:function(sortOrder){"string"==typeof sortOrder&&(sortOrder=morpheus.SortKey.SortOrder[sortOrder.toUpperCase()]),this.sortOrder=sortOrder,this.sortOrder===morpheus.SortKey.SortOrder.ASCENDING?this.c=morpheus.SortKey.ELEMENT_ASCENDING_COMPARATOR:this.sortOrder===morpheus.SortKey.SortOrder.DESCENDING?this.c=morpheus.SortKey.ELEMENT_DESCENDING_COMPARATOR:this.c=morpheus.SortKey.NUMBER_ASCENDING_COMPARATOR},getSortOrder:function(){return this.sortOrder},toString:function(){return"values"}},morpheus.SpecifiedModelSortOrder=function(modelIndices,nvisible,name){this.nvisible=nvisible;for(var modelIndexToValue=[],i=0,length=modelIndices.length;length>i;i++)modelIndexToValue[modelIndices[i]]=i;this.modelIndexToValue=modelIndexToValue,this.name=name,this.c=morpheus.SortKey.ASCENDING_COMPARATOR},morpheus.SpecifiedModelSortOrder.prototype={init:function(dataset){},getComparator:function(a,b){return this.c},getValue:function(i){return this.modelIndexToValue[i]},setSortOrder:function(sortOrder){this.sortOrder=sortOrder,this.c=this.sortOrder===morpheus.SortKey.SortOrder.ASCENDING?morpheus.SortKey.NUMBER_ASCENDING_COMPARATOR:morpheus.SortKey.NUMBER_DESCENDING_COMPARATOR},getSortOrder:function(){return this.sortOrder},getName:function(){return this.name}},morpheus.SortKey.keepExistingSortKeys=function(newSortKeys,existingSortKeys){for(var existingSpecifiedSortKey=null,i=0,length=existingSortKeys.length;length>i;i++){var key=existingSortKeys[i];key instanceof morpheus.SpecifiedModelSortOrder&&"dendrogram"===key.name&&(existingSpecifiedSortKey=key)}if(existingSpecifiedSortKey){for(var newSortKeysHasSpecifiedSortKey=!1,i=0,length=newSortKeys.length;length>i;i++){var key=newSortKeys[i];key instanceof morpheus.SpecifiedModelSortOrder&&"dendrogram"===key.name&&(newSortKeysHasSpecifiedSortKey=!0)}existingSpecifiedSortKey&&!newSortKeysHasSpecifiedSortKey&&newSortKeys.splice(newSortKeys.length,0,existingSpecifiedSortKey)}return newSortKeys},morpheus.SpecifiedGroupByKey=function(clusterIds){this.clusterIds=clusterIds,this.c=function(a,b){return a===b?0:b>a?-1:1}},morpheus.SpecifiedGroupByKey.prototype={init:function(dataset){},getComparator:function(a,b){return this.c},getValue:function(i){return this.clusterIds[i]},setSortOrder:function(sortOrder){},getSortOrder:function(){},getName:function(){return"Dendrogram Cut"}},morpheus.SymmetricProject=function(dataset){this.originalDataset=dataset,this.indexMapper=new morpheus.IndexMapper(this,!0),this.groups=[],this.colorModel=new morpheus.VectorColorModel,this.shapeModel=new morpheus.VectorShapeModel,this.hoverRowIndex=-1,this.hoverColumnIndex=-1,this.selectionModel=new morpheus.SelectionModel(this,!1),this.elementSelectionModel=new morpheus.ElementSelectionModel(this)},morpheus.SymmetricProject.prototype={getHoverColumnIndex:function(){return this.hoverColumnIndex},setHoverColumnIndex:function(index){this.hoverColumnIndex=index},getHoverRowIndex:function(){return this.hoverRowIndex},setHoverRowIndex:function(index){this.hoverRowIndex=index},getRowColorModel:function(){return this.colorModel},getRowShapeModel:function(){return this.shapeModel},getColumnShapeModel:function(){return this.shapeModel},getGroupRows:function(){return this.groups},getGroupColumns:function(){return this.groups},getFullDataset:function(){return this.originalDataset},getColumnSelectionModel:function(){return this.selectionModel},getRowSelectionModel:function(){return this.selectionModel},getElementSelectionModel:function(){return this.elementSelectionModel},getFilteredSortedRowIndices:function(){return this.indexMapper.convertToView()},getFilteredSortedColumnIndices:function(){return this.indexMapper.convertToView()},setFullDataset:function(dataset,notify){this.originalDataset=dataset,this.indexMapper.setFilter(this.indexMapper.getFilter()),this.selectionModel.clear(),this.elementSelectionModel.clear(),notify&&this.trigger(morpheus.Project.Events.DATASET_CHANGED)},setGroupRows:function(keys,notify){this.groups=keys,notify&&(this.trigger(morpheus.Project.Events.ROW_GROUP_BY_CHANGED),this.trigger(morpheus.Project.Events.COLUMN_GROUP_BY_CHANGED))},setGroupColumns:function(keys,notify){this.groups=keys,notify&&(this.trigger(morpheus.Project.Events.ROW_GROUP_BY_CHANGED),this.trigger(morpheus.Project.Events.COLUMN_GROUP_BY_CHANGED))},setRowFilter:function(filter,notify){this._saveSelection(!1),this.indexMapper.setFilter(filter),this._restoreSelection(!1),notify&&this.trigger(morpheus.Project.Events.ROW_FILTER_CHANGED)},getRowFilter:function(){return this.indexMapper.getFilter()},getColumnFilter:function(){return this.indexMapper.getFilter()},setColumnFilter:function(filter,notify){this._saveSelection(!0),this.indexMapper.setFilter(filter),this._restoreSelection(!0),notify&&this.trigger(morpheus.Project.Events.COLUMN_FILTER_CHANGED)},getColumnColorModel:function(){return this.colorModel},getSortedFilteredDataset:function(){return morpheus.DatasetUtil.slicedView(this.getFullDataset(),this.indexMapper.convertToView(),this.indexMapper.convertToView())},getSelectedDataset:function(options){options=$.extend({},{selectedRows:!0,selectedColumns:!0,emptyToAll:!0},options);var dataset=this.getSortedFilteredDataset(),rows=null;options.selectedRows&&(rows=this.selectionModel.getViewIndices().values().sort(function(a,b){return a===b?0:b>a?-1:1}),0===rows.length&&options.emptyToAll&&(rows=null));var columns=null;return options.selectedColumns&&(columns=this.selectionModel.getViewIndices().values().sort(function(a,b){return a===b?0:b>a?-1:1}),0===columns.length&&options.emptyToAll&&(columns=null)),morpheus.DatasetUtil.slicedView(dataset,rows,columns)},_saveSelection:function(isColumns){this.elementSelectionModel.save(),isColumns?this.selectionModel.save():this.selectionModel.save()},_restoreSelection:function(isColumns){isColumns?this.selectionModel.restore():this.selectionModel.restore(),this.elementSelectionModel.restore()},setRowSortKeys:function(keys,notify){this._saveSelection(!1),this.indexMapper.setSortKeys(keys),this._restoreSelection(!1),notify&&this.trigger(morpheus.Project.Events.ROW_SORT_ORDER_CHANGED)},setColumnSortKeys:function(keys,notify){this._saveSelection(!0),this.indexMapper.setSortKeys(keys),this._restoreSelection(!0),notify&&this.trigger(morpheus.Project.Events.COLUMN_SORT_ORDER_CHANGED)},getRowSortKeys:function(){return this.indexMapper.sortKeys},getColumnSortKeys:function(){return this.indexMapper.sortKeys},convertViewColumnIndexToModel:function(viewIndex){return this.indexMapper.convertViewIndexToModel(viewIndex)},convertViewRowIndexToModel:function(viewIndex){return this.indexMapper.convertViewIndexToModel(viewIndex)},convertModelRowIndexToView:function(modelIndex){return this.indexMapper.convertModelIndexToView(modelIndex)},convertModelColumnIndexToView:function(modelIndex){return this.indexMapper.convertModelIndexToView(modelIndex)},isColumnViewIndexSelected:function(index){return this.selectionModel.isViewIndexSelected(index)},isRowViewIndexSelected:function(index){return this.selectionModel.isViewIndexSelected(index)}},morpheus.Util.extend(morpheus.SymmetricProject,morpheus.Events),morpheus.TransposedDatasetView=function(dataset){morpheus.DatasetAdapter.call(this,dataset)},morpheus.TransposedDatasetView.prototype={getRowCount:function(){return this.dataset.getColumnCount()},getColumnCount:function(){return this.dataset.getRowCount()},getValue:function(i,j,seriesIndex){return this.dataset.getValue(j,i,seriesIndex)},setValue:function(i,j,value,seriesIndex){this.dataset.setValue(j,i,value,seriesIndex)},getRowMetadata:function(){return this.dataset.getColumnMetadata()},getColumnMetadata:function(){return this.dataset.getRowMetadata()}},morpheus.Util.extend(morpheus.TransposedDatasetView,morpheus.DatasetAdapter),morpheus.Percentile=function(vector,p,isSorted){return morpheus.ArrayPercentile(morpheus.RemoveNaN(vector),p,isSorted)},morpheus.RemoveNaN=function(values){for(var array=[],i=0,size=values.size();size>i;i++){var value=values.getValue(i);isNaN(value)||array.push(value)}return array},morpheus.Median=function(vector){return morpheus.ArrayPercentile(morpheus.RemoveNaN(vector),50,!1)}, morpheus.Median.toString=function(){return"Median"},morpheus.ArrayPercentile=function(values,p,isSorted){return isSorted||values.sort(function(a,b){return b>a?-1:a===b?0:1}),d3.quantile(values,p/100)},morpheus.MaxPercentiles=function(percentiles){var f=function(vector){for(var values=[],i=0,size=vector.size();size>i;i++){var value=vector.getValue(i);isNaN(value)||values.push(value)}if(0===values.length)return NaN;values.sort(function(a,b){return b>a?-1:a===b?0:1});for(var max=0,i=0;iMath.abs(max)&&(max=p)}return max};return f.toString=function(){for(var s=["Maximum of "],i=0,length=percentiles.length;length>i;i++)i>0&&length>2&&s.push(", "),i===length-1&&s.push(2==length?" and ":"and "),s.push(percentiles[i]);return s.push(" percentiles"),s.join("")},f},morpheus.Mean=function(vector){for(var sum=0,count=0,i=0,length=vector.size();length>i;i++){var val=vector.getValue(i);isNaN(val)||(sum+=val,count++)}return 0===count?NaN:sum/count},morpheus.Mean.toString=function(){return"Mean"},morpheus.Sum=function(vector){for(var sum=0,found=!1,i=0,length=vector.size();length>i;i++){var val=vector.getValue(i);isNaN(val)||(found=!0,sum+=val)}return found?sum:NaN},morpheus.Sum.toString=function(){return"Sum"},morpheus.CountNonNaN=function(vector){for(var count=0,i=0,length=vector.size();length>i;i++){var val=vector.getValue(i);isNaN(val)||count++}return count},morpheus.CountNonNaN.toString=function(){return"Count non-NaN"},morpheus.Max=function(vector){for(var max=-Number.MAX_VALUE,found=!1,i=0,length=vector.size();length>i;i++){var val=vector.getValue(i);isNaN(val)||(found=!0,max=Math.max(max,val))}return found?max:NaN},morpheus.Max.toString=function(){return"Max"},morpheus.Min=function(vector){for(var min=Number.MAX_VALUE,found=!1,i=0,length=vector.size();length>i;i++){var val=vector.getValue(i);isNaN(val)||(found=!0,min=Math.min(min,val))}return found?min:NaN},morpheus.Min.toString=function(){return"Min"},morpheus.Variance=function(list,mean){void 0==mean&&(mean=morpheus.Mean(list));for(var sum=0,n=0,j=0,size=list.size();size>j;j++){var x=list.getValue(j);if(!isNaN(x)){var diff=x-mean;diff*=diff,sum+=diff,n++}}if(1>=n)return NaN;n-=1,1>n&&(n=1);var variance=sum/n;return variance};var LOG_10=Math.log(10);morpheus.Log10=function(x){return 0>=x?0:Math.log(x)/LOG_10};var LOG_2=Math.log(2);morpheus.Log2=function(x){return 0>=x?0:Math.log(x)/LOG_2},morpheus.FDR_BH=function(nominalPValues){for(var size=nominalPValues.length,fdr=[],pValueIndices=morpheus.Util.indexSort(nominalPValues,!0),ranks=morpheus.Util.rankIndexArray(pValueIndices),i=pValueIndices.length-1;i>0;i--){var bigPValue=nominalPValues[pValueIndices[i]],smallPValue=nominalPValues[pValueIndices[i-1]];bigPValue==smallPValue&&(ranks[pValueIndices[i-1]]=ranks[pValueIndices[i]])}for(var i=0;size>i;i++){var rank=ranks[i],p=nominalPValues[i];fdr[i]=p*size/rank}for(var pIndices=morpheus.Util.indexSort(nominalPValues,!1),i=0;ii;i++)fdr[i]=Math.min(fdr[i],1);return fdr},morpheus.FDR_BH.tString=function(){return"FDR(BH)"},morpheus.Variance.toString=function(){return"Variance"},morpheus.MAD=function(list,median){null==median&&(median=morpheus.Percentile(list,50));for(var temp=[],j=0,size=list.size();size>j;j++){var value=list.getValue(j);isNaN(value)||temp.push(Math.abs(value-median))}var r=morpheus.Percentile(new morpheus.Vector("",temp.length).setArray(temp),50);return 1.4826*r},morpheus.MAD.toString=function(){return"Median absolute deviation"},morpheus.CV=function(list){var mean=morpheus.Mean(list),stdev=Math.sqrt(morpheus.Variance(list,mean));return stdev/mean},morpheus.CV.toString=function(){return"Coefficient of variation"},morpheus.BoxPlotItem=function(list){var values=morpheus.RemoveNaN(list);if(values.sort(function(a,b){return a===b?0:b>a?-1:1}),0===values.length)return{median:NaN,q1:NaN,q3:NaN,lowerAdjacentValue:NaN,upperAdjacentValue:NaN};for(var median=morpheus.ArrayPercentile(values,50,!0),q1=morpheus.ArrayPercentile(values,25,!0),q3=morpheus.ArrayPercentile(values,75,!0),w=1.5,upperAdjacentValue=-Number.MAX_VALUE,lowerAdjacentValue=Number.MAX_VALUE,upperOutlier=q3+w*(q3-q1),lowerOutlier=q1-w*(q3-q1),sum=0,i=0,length=values.length;length>i;i++){var value=values[i];upperOutlier>=value&&(upperAdjacentValue=Math.max(upperAdjacentValue,value)),value>=lowerOutlier&&(lowerAdjacentValue=Math.min(lowerAdjacentValue,value)),sum+=value}var mean=sum/values.length;return lowerAdjacentValue>q1&&(lowerAdjacentValue=q1),q3>upperAdjacentValue&&(upperAdjacentValue=q3),{mean:mean,median:median,q1:q1,q3:q3,lowerAdjacentValue:lowerAdjacentValue,upperAdjacentValue:upperAdjacentValue}},morpheus.Vector=function(name,size){this.name=name,this.array=[],this.n=size,this.properties=new morpheus.Map},morpheus.Vector.fromArray=function(name,array){var v=new morpheus.Vector(name,array.length);return v.array=array,v},morpheus.Vector.prototype={push:function(value){this.array.push(value)},getProperties:function(){return this.properties},setValue:function(index,value){this.array[index]=value},getValue:function(index){return this.array[index]},size:function(){return this.n},getName:function(){return this.name},setName:function(name){this.name=name},setArray:function(array){return this.array=array,this}},morpheus.VectorColorModel=function(){this.vectorNameToColorMap=new morpheus.Map,this.vectorNameToColorScheme=new morpheus.Map,this.colors=morpheus.VectorColorModel.TWENTY_COLORS},morpheus.VectorColorModel.YES_COLOR="#d8b365",morpheus.VectorColorModel.FEMALE="#ff99ff",morpheus.VectorColorModel.MALE="#66ccff",morpheus.VectorColorModel.TWENTY_COLORS=["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b","#c49c94","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"],morpheus.VectorColorModel.CATEGORY_20A=morpheus.VectorColorModel.TWENTY_COLORS,morpheus.VectorColorModel.CATEGORY_20B=["#393b79","#5254a3","#6b6ecf","#9c9ede","#637939","#8ca252","#b5cf6b","#cedb9c","#8c6d31","#bd9e39","#e7ba52","#e7cb94","#843c39","#ad494a","#d6616b","#e7969c","#7b4173","#a55194","#ce6dbd","#de9ed6"],morpheus.VectorColorModel.CATEGORY_20C=["#3182bd","#6baed6","#9ecae1","#c6dbef","#e6550d","#fd8d3c","#fdae6b","#fdd0a2","#31a354","#74c476","#a1d99b","#c7e9c0","#756bb1","#9e9ac8","#bcbddc","#dadaeb","#636363","#969696","#bdbdbd","#d9d9d9"],morpheus.VectorColorModel.CATEGORY_ALL=[].concat(morpheus.VectorColorModel.CATEGORY_20A,morpheus.VectorColorModel.CATEGORY_20B,morpheus.VectorColorModel.CATEGORY_20C),morpheus.VectorColorModel.TABLEAU10=["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],morpheus.VectorColorModel.STANDARD_COLORS={na:"#c0c0c0",nan:"#c0c0c0","":"#ffffff",wt:"#ffffff",n:"#ffffff",0:"#ffffff",y:morpheus.VectorColorModel.YES_COLOR,1:morpheus.VectorColorModel.YES_COLOR,male:morpheus.VectorColorModel.MALE,m:morpheus.VectorColorModel.MALE,female:morpheus.VectorColorModel.FEMALE,f:morpheus.VectorColorModel.FEMALE,kd:"#C675A8",oe:"#56b4e9",cp:"#FF9933","trt_sh.cgs":"#C675A8",trt_oe:"#56b4e9",trt_cp:"#FF9933",a375:"#1490C1",a549:"#AAC8E9",hcc515:"#1C9C2A",hepg2:"#94DC89",ht29:"#946DBE",mcf7:"#C5B2D5",pc3:"#38C697",asc:"#FF8000",cd34:"#FFBB75",ha1e:"#FB4124",neu:"#FF9A94",npc:"#E57AC6",cancer:"#1490C1","immortalized normal":"#FF8000"},morpheus.VectorColorModel.getStandardColor=function(value){if(null==value)return"#ffffff";var stringValue=value.toString().toLowerCase();return morpheus.VectorColorModel.STANDARD_COLORS[stringValue]},morpheus.VectorColorModel.getColorMapForNumber=function(length){var colors;return colors=3>length?colorbrewer.Set1[3]:colorbrewer.Paired[length],colors?colors:morpheus.VectorColorModel.TWENTY_COLORS},morpheus.VectorColorModel.prototype={clear:function(vector){this.vectorNameToColorMap.remove(vector.getName()),this.vectorNameToColorScheme.remove(vector.getName())},copy:function(){var c=new morpheus.VectorColorModel;return c.colors=this.colors.slice(0),this.vectorNameToColorMap.forEach(function(colorMap,name){var newColorMap=new morpheus.Map;newColorMap.setAll(colorMap),c.vectorNameToColorMap.set(name,newColorMap)}),this.vectorNameToColorScheme.forEach(function(colorScheme,name){c.vectorNameToColorScheme.set(name,colorScheme.copy(new morpheus.Project(new morpheus.Dataset("",1,1))))}),c},clearAll:function(){this.vectorNameToColorMap=new morpheus.Map,this.vectorNameToColorScheme=new morpheus.Map},containsDiscreteColor:function(vector,value){var metadataValueToColorMap=this.vectorNameToColorMap.get(vector.getName());if(void 0===metadataValueToColorMap)return!1;var c=metadataValueToColorMap.get(value);return null!=c},setDiscreteColorMap:function(colors){this.colors=colors},getContinuousColorScheme:function(vector){return this.vectorNameToColorScheme.get(vector.getName())},getDiscreteColorScheme:function(vector){return this.vectorNameToColorMap.get(vector.getName())},createContinuousColorMap:function(vector){var minMax=morpheus.VectorUtil.getMinMax(vector),min=minMax.min,max=minMax.max,cs=new morpheus.HeatMapColorScheme(new morpheus.Project(new morpheus.Dataset("",1,1)),{type:"fixed",map:[{value:min,color:colorbrewer.Greens[3][0]},{value:max,color:colorbrewer.Greens[3][2]}]});return this.vectorNameToColorScheme.set(vector.getName(),cs),cs},getContinuousMappedValue:function(vector,value){var cs=this.vectorNameToColorScheme.get(vector.getName());return void 0===cs&&(cs=this.createContinuousColorMap(vector)),cs.getColor(0,0,value)},_getColorForValue:function(value){var color=morpheus.VectorColorModel.getStandardColor(value);if(null==color)for(var existingMetadataValueToColorMap=this.vectorNameToColorMap.values(),i=0,length=existingMetadataValueToColorMap.length;length>i;i++)if(color=existingMetadataValueToColorMap[i].get(value),void 0!==color)return color;return color},getMappedValue:function(vector,value){var metadataValueToColorMap=this.vectorNameToColorMap.get(vector.getName());if(void 0===metadataValueToColorMap){metadataValueToColorMap=new morpheus.Map,this.vectorNameToColorMap.set(vector.getName(),metadataValueToColorMap);var values=morpheus.VectorUtil.getValues(vector),ncolors=0,colors=null;if(colors=values.length<3?colorbrewer.Dark2[3]:colorbrewer.Paired[values.length],colors||(colors=values.length<=20?d3.scale.category20().range():morpheus.VectorColorModel.CATEGORY_ALL),colors)for(var ncolors=colors.length,i=0,nvalues=values.length;nvalues>i;i++){var color=this._getColorForValue(values[i]);null==color&&(color=colors[i%ncolors]),metadataValueToColorMap.set(values[i],color)}else{var _this=this;_.each(values,function(val){_this.getMappedValue(vector,val)})}}var color=metadataValueToColorMap.get(value);if(null==color){if(color=this._getColorForValue(value),null==color){var index=metadataValueToColorMap.size();color=this.colors[index%this.colors.length]}metadataValueToColorMap.set(value,color)}return color},setMappedValue:function(vector,value,color){var metadataValueToColorMap=this.vectorNameToColorMap.get(vector.getName());void 0===metadataValueToColorMap&&(metadataValueToColorMap=new morpheus.Map,this.vectorNameToColorMap.set(vector.getName(),metadataValueToColorMap)),metadataValueToColorMap.set(value,color)}},morpheus.VectorKeys={},morpheus.VectorKeys.FIELDS="morpheus.fields",morpheus.VectorKeys.VALUE_TO_INDICES="morpheus.valueToIndices",morpheus.VectorKeys.VISIBLE_FIELDS="morpheus.visibleFields",morpheus.VectorKeys.DATA_TYPE="morpheus.dataType",morpheus.VectorKeys.ARRAY_SUMMARY_FUNCTION="morpheus.arraySummaryFunction",morpheus.VectorKeys.HEADER_SUMMARY="morpheus.headerSummary",morpheus.VectorKeys.SHOW_HEADER_SUMMARY="morpheus.showHeaderSummary",morpheus.VectorKeys.TITLE="morpheus.title",morpheus.VectorKeys.FUNCTION="morpheus.function",morpheus.VectorKeys.RECOMPUTE_FUNCTION="morpheus.recompute.function",morpheus.VectorKeys.COPY_IGNORE=new morpheus.Set,morpheus.VectorKeys.COPY_IGNORE.add(morpheus.VectorKeys.HEADER_SUMMARY),morpheus.VectorKeys.COPY_IGNORE.add(morpheus.VectorKeys.DATA_TYPE),morpheus.VectorKeys.COPY_IGNORE.add(morpheus.VectorKeys.VALUE_TO_INDICES),morpheus.VectorShapeModel=function(){this.shapes=morpheus.VectorShapeModel.SHAPES,this.vectorNameToShapeMap=new morpheus.Map},morpheus.VectorShapeModel.SHAPES=["circle","square","plus","x","asterisk","diamond","triangle-up","triangle-down","triangle-left","triangle-right","minus"],morpheus.VectorShapeModel.STANDARD_SHAPES={cp:"diamond",oe:"plus",pcl:"asterisk",kd:"minus",ctrl:"circle"},morpheus.VectorShapeModel.prototype={clear:function(vector){this.vectorNameToShapeMap.remove(vector.getName())},copy:function(){var c=new morpheus.VectorShapeModel;return c.shapes=this.shapes.slice(0),this.vectorNameToShapeMap.forEach(function(shapeMap,name){var newShapeMap=new morpheus.Map;newShapeMap.setAll(shapeMap),c.vectorNameToShapeMap.set(name,newShapeMap)}),c},clearAll:function(){this.vectorNameToShapeMap=new morpheus.Map},_getShapeForValue:function(value){if(null==value)return"none";var str=value.toString().toLowerCase(),mapped=morpheus.VectorShapeModel.STANDARD_SHAPES[str];if(void 0!==mapped)return mapped;for(var existingMetadataValueToShapeMap=this.vectorNameToShapeMap.values(),i=0,length=existingMetadataValueToShapeMap.length;length>i;i++){var shape=existingMetadataValueToShapeMap[i].get(value);if(void 0!==shape)return shape}},getMap:function(name){return this.vectorNameToShapeMap.get(name)},getMappedValue:function(vector,value){var metadataValueToShapeMap=this.vectorNameToShapeMap.get(vector.getName());if(void 0===metadataValueToShapeMap){metadataValueToShapeMap=new morpheus.Map,this.vectorNameToShapeMap.set(vector.getName(),metadataValueToShapeMap);for(var values=morpheus.VectorUtil.getValues(vector),i=0,nvalues=values.length;nvalues>i;i++){var shape=this._getShapeForValue(values[i]);null==shape&&(shape=this.shapes[i%this.shapes.length]),metadataValueToShapeMap.set(values[i],shape)}}var shape=metadataValueToShapeMap.get(value);if(null==shape){if(shape=this._getShapeForValue(value),null==shape){var index=metadataValueToShapeMap.size();shape=this.shapes[index%this.shapes.length]}metadataValueToShapeMap.set(value,shape)}return shape},setMappedValue:function(vector,value,shape){var metadataValueToShapeMap=this.vectorNameToShapeMap.get(vector.getName());void 0===metadataValueToShapeMap&&(metadataValueToShapeMap=new morpheus.Map,this.vectorNameToShapeMap.set(vector.getName(),metadataValueToShapeMap)),metadataValueToShapeMap.set(value,shape)}},morpheus.VectorUtil=function(){},morpheus.VectorUtil.createValueToIndicesMap=function(vector){if(!vector)throw"vector is null";for(var map=new morpheus.Map,j=0,size=vector.size();size>j;j++){var val=vector.getValue(j),list=map.get(val);void 0===list&&(list=[],map.set(val,list)),list.push(j)}return map},morpheus.VectorUtil.createValueToCountMap=function(vector){if(!vector)throw"vector is null";for(var map=new morpheus.Map,dataType=morpheus.VectorUtil.getDataType(vector),isArray="["===dataType[0],j=0,size=vector.size();size>j;j++){var val=vector.getValue(j);if(null!=val)if(isArray)for(var k=0;ki;i++){var s=vector.getValue(i);if(null!=s){var tokens=s.split(regex);newValues.push(tokens),!found&&tokens.length>1&&(found=!0)}}if(found)for(var i=0,nrows=newValues.length;nrows>i;i++)vector.setValue(i,newValues[i]);return vector.getProperties().set(morpheus.VectorKeys.DATA_TYPE,"[string]"),found},morpheus.VectorUtil.maybeConvertStringToNumber=function(vector){for(var newValues=[],i=0,nrows=vector.size();nrows>i;i++){var s=vector.getValue(i);if(null!=s&&""!==s&&"NA"!==s&&"NaN"!==s&&!$.isNumeric(s))return!1;newValues.push(parseFloat(s))}for(var i=0,nrows=newValues.length;nrows>i;i++)vector.setValue(i,newValues[i]);return vector.getProperties().set(morpheus.VectorKeys.DATA_TYPE,"number"),!0},morpheus.VectorUtil.createValuesToIndicesMap=function(vectors){var map=new morpheus.Map,nvectors=vectors.length;if(null==vectors[0])throw"no vectors found";for(var i=0,nitems=vectors[0].size();nitems>i;i++){for(var array=[],j=0;nvectors>j;j++){var vector=vectors[j],val=vector.getValue(i);array.push(val)}var key=new morpheus.Identifier(array),list=map.get(key);void 0===list&&(list=[],map.set(key,list)),list.push(i)}return map},morpheus.VectorUtil.createValuesToIndexMap=function(vectors){var map=new morpheus.Map,nvectors=vectors.length;if(null==vectors[0])throw"no vectors found";for(var i=0,nitems=vectors[0].size();nitems>i;i++){for(var array=[],j=0;nvectors>j;j++){var vector=vectors[j],val=vector.getValue(i);array.push(val)}var key=new morpheus.Identifier(array);map.set(key,i)}return map},morpheus.VectorUtil.containsMoreThanOneValue=function(vector){return morpheus.VectorUtil.containsMoreThanNValues(vector,1)},morpheus.VectorUtil.containsMoreThanNValues=function(vector,n){for(var s=new morpheus.Set,j=0,size=vector.size();size>j;j++){var val=vector.getValue(j);if(s.add(val),s.size()>n)return!0}return!1},morpheus.VectorUtil.createValueToIndexMap=function(vector){for(var map=new morpheus.Map,j=0,size=vector.size();size>j;j++){var val=vector.getValue(j);map.set(val,j)}return map},morpheus.VectorUtil.getValues=function(vector,excludeNull){for(var set=new morpheus.Set,j=0,size=vector.size();size>j;j++){var val=vector.getValue(j);excludeNull&&null==val||set.add(val)}var array=set.values();return array.sort(morpheus.SortKey.ASCENDING_COMPARATOR),array},morpheus.VectorUtil.getSet=function(vector){for(var set=new morpheus.Set,j=0,size=vector.size();size>j;j++)set.add(vector.getValue(j));return set},morpheus.VectorUtil.createSpanMap=function(vector){for(var previous=vector.getValue(0),startIndexToEndIndex=new morpheus.Map,start=0,i=1,nrows=vector.size();nrows>i;i++){var val=vector.getValue(i);previous!==val&&(previous=val,startIndexToEndIndex.set(start,i),start=i)}return startIndexToEndIndex.set(start,vector.size()),startIndexToEndIndex},morpheus.VectorUtil.toArray=function(vector){for(var array=[],i=0,length=vector.size();length>i;i++){var val=vector.getValue(i);array.push(val)}return array},morpheus.VectorUtil.arrayAsVector=function(array,name){var v=new morpheus.Vector(name,array.length);return v.array=array,v},morpheus.VectorUtil.toString=function(vector){for(var array=[],i=0,length=vector.size();length>i;i++){var val=vector.getValue(i);array.push(val)}return array.join(", ")},morpheus.VectorUtil.getDataType=function(vector){var dataType=vector.getProperties().get(morpheus.VectorKeys.DATA_TYPE);if(void 0===dataType){var firstNonNull=morpheus.VectorUtil.getFirstNonNull(vector);dataType=morpheus.Util.getDataType(firstNonNull),vector.getProperties().set(morpheus.VectorKeys.DATA_TYPE,dataType)}return dataType},morpheus.VectorUtil.getMinMax=function(vector){var min=Number.MAX_VALUE,max=-Number.MAX_VALUE,fields=vector.getProperties().get(morpheus.VectorKeys.FIELDS);if(null!=fields)for(var nvalues=fields.length,i=0,size=vector.size();size>i;i++){var array=vector.getValue(i);if(array)for(var j=0;nvalues>j;j++){var value=array[j];isNaN(value)||(min=min>value?value:min,max=value>max?value:max)}}else for(var i=0,size=vector.size();size>i;i++){var value=vector.getValue(i);isNaN(value)||(min=min>value?value:min,max=value>max?value:max)}return{min:min,max:max}},morpheus.VectorUtil.getFirstNonNull=function(vector){for(var i=0,length=vector.size();length>i;i++){var val=vector.getValue(i);if(null!=val)return val}return null},morpheus.VectorUtil.isNumber=function(vector){return"number"===morpheus.VectorUtil.getDataType(vector)},morpheus.LandingPage=function(pageOptions){pageOptions=$.extend({},{el:$("#vis")},pageOptions),this.pageOptions=pageOptions;var $el=$('');this.$el=$el;var html=[];html.push('
    '),html.push('
    logo Morpheus
    '),html.push("

    Open your own file

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

    Or select a preloaded dataset

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

    Please select rows and columns in the heat map.

    ").appendTo(this.$chart);dataset.getRowCount()*dataset.getColumnCount()>1e5&&(showPoints=!1);var grid=[],rowIds=[void 0],columnIds=[void 0],items=[],colorByInfo=(this.heatmap,morpheus.ChartTool2.getVectorInfo(colorBy)),sizeByInfo=morpheus.ChartTool2.getVectorInfo(sizeBy),colorModel=colorByInfo.isColumns?this.project.getColumnColorModel():this.project.getRowColorModel(),axisLabelInfo=morpheus.ChartTool2.getVectorInfo(axisLabel),axisLabelVector=axisLabelInfo.isColumns?dataset.getColumnMetadata().getByName(axisLabelInfo.field):dataset.getRowMetadata().getByName(axisLabelInfo.field),sizeByVector=sizeByInfo.isColumns?dataset.getColumnMetadata().getByName(sizeByInfo.field):dataset.getRowMetadata().getByName(sizeByInfo.field),colorByVector=colorByInfo.isColumns?dataset.getColumnMetadata().getByName(colorByInfo.field):dataset.getRowMetadata().getByName(colorByInfo.field),sizeByScale=null;if(sizeByVector){var minMax=morpheus.VectorUtil.getMinMax(sizeByVector);sizeByScale=d3.scale.linear().domain([minMax.min,minMax.max]).range([3,16]).clamp(!0)}if("row profile"===chartType||"column profile"===chartType){var $chart=$("
    "),myPlot=$chart[0];$chart.appendTo(this.$chart),"column profile"===chartType&&(dataset=new morpheus.TransposedDatasetView(dataset)),this._createProfile({showPoints:showPoints,isColumnChart:"column profile"===chartType,axisLabelVector:axisLabelVector,colorByVector:colorByVector,colorModel:colorModel,sizeByVector:sizeByVector,sizeFunction:sizeByScale,myPlot:myPlot,dataset:dataset,config:config,layout:$.extend(!0,{},layout,{showlegend:!0,width:chartWidth,height:chartHeight,margin:{b:80},yaxis:{},xaxis:{}})})}if("row scatter"===chartType||"column scatter"===chartType){var transpose="column scatter"===chartType;if(transpose&&(dataset=new morpheus.TransposedDatasetView(dataset)),dataset.getRowCount()>20)return void $("

    Maximum chart size exceeded.

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

    Use your own file

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

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

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

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

    '+options.title+"

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

    All | None

    '),that.$form.on("click","[data-name="+name+"_all]",function(evt){evt.preventDefault();var $select=that.$form.find("[name="+name+"]");$select.selectpicker("val",$.map($select.find("option"),function(o){return $(o).val()})),$select.trigger("change")}),that.$form.on("click","[data-name="+name+"_none]",function(evt){evt.preventDefault();var $select=that.$form.find("[name="+name+"]");$select.selectpicker("val",[]),$select.trigger("change")}));else if("textarea"==type)html.push('");else if("button"==type)html.push('");else if("custom"===type)html.push(value);else if("file"===type){var isMultiple=field.multiple;html.push('"),field.url!==!1&&(html.push("
    "),html.push(''),html.push("
    ")),html.push('"),that.$form.on("change","[name="+name+"_picker]",function(evt){var $this=$(this),val=$this.val(),showTextInput="URL"===val;if("Dropbox"===val){var options={success:function(results){var val=isMultiple?results.map(function(result){return result.link}):results[0].link;that.setValue(name,val),that.trigger("change",{name:name,value:val})},linkType:"direct",multiselect:isMultiple};Dropbox.choose(options),that.$form.find("[name="+name+"_picker]").selectpicker("val","")}else"My Computer"===val&&(that.$form.find("[name="+name+"_file]").click(),that.$form.find("[name="+name+"_picker]").selectpicker("val",""));that.$form.find("[name="+name+"_text]").css("display",showTextInput?"":"none")}),that.$form.on("keyup","[name="+name+"_text]",function(evt){var text=$.trim($(this).val());isMultiple&&(text=text.split(",").filter(function(t){return t=$.trim(t),""!==t})),that.setValue(name,text),13===evt.which&&that.trigger("change",{name:name,value:text})}),that.$form.on("change","[name="+name+"_file]",function(evt){var files=evt.target.files;that.setValue(name,isMultiple?files:files[0]),that.trigger("change",{name:name,value:isMultiple?files:files[0]})})}else type=null==type?"text":type,"div"===type?html.push('
    "),"div"===type&&html.push("
    ");void 0!==help&&(html.push(''),html.push(help),html.push(""))},append:function(fields){var html=[],that=this,isArray=morpheus.Util.isArray(fields);isArray||(fields=[fields]),html.push('
    '),_.each(fields,function(field,index){that._append(html,field,0===index)}),html.push("
    "),html.push("
    ");var $div=$(html.join(""));this.$form.append($div);var checkBoxLists=$div.find(".checkbox-list");if(checkBoxLists.length>0){var checkBoxIndex=0;_.each(fields,function(field){if("checkbox-list"===field.type){var list=new morpheus.CheckBoxList({responsive:!1,$el:$(checkBoxLists[checkBoxIndex]),items:field.options});$(checkBoxLists[checkBoxIndex]).data("morpheus.checkbox-list",list),checkBoxIndex++}})}$div.find(".selectpicker").selectpicker({iconBase:"fa",tickIcon:"fa-check",style:"btn-default btn-sm"})},clear:function(){this.$form.empty()},getValue:function(name){var $v=this.$form.find("[name="+name+"]");return 0===$v.length&&($v=this.$form.find("[name="+name+"_picker]")),morpheus.FormBuilder.getValue($v)},setOptions:function(name,options,selectFirst){var $select=this.$form.find("[name="+name+"]"),checkBoxList=$select.data("morpheus.checkbox-list");if(checkBoxList)checkBoxList.setItems(options);else{var html=[],selection=$select.val();_.each(options,function(choice){html.push('")}),$select.html(html.join("")),$select.val(selection),selectFirst&&null==$select.val()&&$select[0].options.length>0&&$select.val($select[0].options[0].value),$select.hasClass("selectpicker")&&($select.selectpicker("refresh"),$select.selectpicker("render"))}},find:function(name){return this.$form.find("[name="+name+"]")},setHelpText:function(name,value){var v=this.$form.find("[data-name="+name+"_help]");v.html(value)},setValue:function(name,value){var v=this.$form.find("[name="+name+"]");if(0===v.length&&(v=this.$form.find("[name="+name+"_picker]"),"file"===v.data("type")))return v.val(value),v.selectpicker("render"),void v.data("files",value);var type=v.attr("type"),list=v.data("morpheus.checkbox-list");list?list.setValue(value):("radio"===type?v.filter("[value="+value+"]").prop("checked",!0):"checkbox"===type?v.prop("checked",value):v.val(value),v.hasClass("selectpicker")&&v.selectpicker("render"))},setVisible:function(name,visible){var $div=this.$form.find("[name="+name+"]").parents(".form-group");visible?$div.show():$div.hide()},remove:function(name){var $div=this.$form.find("[name="+name+"]").parents(".form-group");$div.remove()},setEnabled:function(name,enabled){var $div=this.$form.find("[name="+name+"]");$div.attr("disabled",!enabled),enabled?$div.parents(".form-group").find("label").removeClass("text-muted"):$div.parents(".form-group").find("label").addClass("text-muted")}},morpheus.Util.extend(morpheus.FormBuilder,morpheus.Events),morpheus.GradientColorSupplier=function(){morpheus.AbstractColorSupplier.call(this),this._updateScale()},morpheus.GradientColorSupplier.prototype={createInstance:function(){return new morpheus.GradientColorSupplier},getColor:function(row,column,value){if(isNaN(value))return this.missingColor;var min=this.min,max=this.max,colors=this.colors;if(min>=value)return colors[0];if(value>=max)return colors[colors.length-1];var fraction=morpheus.SteppedColorSupplier.linearScale(value,min,max,0,100)/100;return this.colorScale(fraction)},setFractions:function(options){morpheus.AbstractColorSupplier.prototype.setFractions.call(this,options),this._updateScale()},_updateScale:function(){this.colorScale=d3.scale.linear().domain(this.fractions).range(this.colors).clamp(!0)}},morpheus.Util.extend(morpheus.GradientColorSupplier,morpheus.AbstractColorSupplier), morpheus.Grid=function(options){function getItemColumnValue(item,column){return column.getter(item)}this.options=options;var grid,_this=this;this.items=options.items,this.modelToView=null,this.viewOrder=null,this.filter=new morpheus.CombinedGridFilter;var model={getLength:function(){return null!=_this.viewOrder?_this.viewOrder.length:_this.items.length},getItem:function(index){return _this.items[null!=_this.viewOrder?_this.viewOrder[index]:index]}};this.$el=options.$el;var gridOptions=$.extend({},{select:!0,headerRowHeight:0,showHeaderRow:!1,multiColumnSort:!0,multiSelect:!1,topPanelHeight:0,enableTextSelectionOnCells:!0,forceFitColumns:!0,dataItemColumnValueExtractor:getItemColumnValue,defaultFormatter:function(row,cell,value,columnDef,dataContext){if(_.isNumber(value))return morpheus.Util.nf(value);if(morpheus.Util.isArray(value)){for(var s=[],i=0,length=value.length;length>i;i++){i>0&&s.push(", ");value[i];s.push(value[i])}return s.join("")}return value}},options.gridOptions||{});if(grid=new Slick.Grid(options.$el,model,options.columns,gridOptions),this.grid=grid,grid.registerPlugin(new morpheus.AutoTooltips2),grid.onCellChange.subscribe(function(e,args){_this.trigger("edit",args)}),gridOptions.select&&(grid.setSelectionModel(new Slick.RowSelectionModel({selectActiveRow:!0,multiSelect:gridOptions.multiSelect})),grid.getSelectionModel().onSelectedRangesChanged.subscribe(function(e){var nitems=grid.getDataLength();_this.trigger("selectionChanged",{selectedRows:grid.getSelectedRows().filter(function(row){return row>=0&&nitems>=row})})})),grid.onSort.subscribe(function(e,args){_this.sortCols=args.sortCols,_this._updateMappings(),grid.invalidate()}),options.$el.on("click",function(e){var cell=grid.getCellFromEvent(e);cell&&_this.trigger("click",{row:cell.row,target:e.target})}),options.$el.on("dblclick",function(e){var cell=grid.getCellFromEvent(e);cell&&_this.trigger("dblclick",{row:cell.row,target:e.target})}),options.sort){var gridSortColumns=[],gridColumns=grid.getColumns();options.sort.forEach(function(c){for(var column=null,i=0;i=0&&nitems>=row})},getSelectedItems:function(){for(var rows=this.grid.getSelectedRows(),selection=[],i=0,nrows=rows.length;nrows>i;i++)selection.push(this.items[this.convertViewIndexToModel(rows[i])]);return selection},getSelectedItem:function(){var rows=this.grid.getSelectedRows();return 1===rows.length?this.items[this.convertViewIndexToModel(rows[0])]:null},getItems:function(){for(var items=[],i=0,length=this.getFilteredItemCount();length>i;i++)items.push(this.items[this.convertViewIndexToModel(i)]);return items},getAllItemCount:function(){return this.items.length},getAllItems:function(){return this.items},getFilteredItemCount:function(){return this.viewOrder?this.viewOrder.length:this.items.length},redraw:function(){this.grid.invalidate()},redrawRows:function(rows){this.grid.invalidateRows(rows),this.grid.render()},setItems:function(items){this.items=items,this.grid.getSelectionModel()&&this.grid.setSelectedRows([]),this.setFilter(this.filter),this.maybeAutoResizeColumns()},maybeAutoResizeColumns:function(){this.columnsAutosized||this.autosizeColumns()},convertModelIndexToView:function(modelIndex){if(null!==this.modelToView){var index=this.modelToView.get(modelIndex);return void 0!==index?index:-1}return modelIndex},convertViewIndexToModel:function(viewIndex){return null!=this.viewOrder?viewIndex=0?this.viewOrder[viewIndex]:-1:viewIndex},_updateMappings:function(){var selectedViewIndices=null!=this.grid.getSelectionModel()?this.grid.getSelectedRows():null,selectedModelIndices=[];if(selectedViewIndices)for(var i=0,length=selectedViewIndices.length;length>i;i++)selectedModelIndices.push(this.convertViewIndexToModel(selectedViewIndices[i]));if(this.viewOrder=null,null!=this.filter&&(this.filter.init(),!this.filter.isEmpty())){this.viewOrder=[];for(var i=0,length=this.items.length;length>i;i++)this.filter.accept(this.items[i])&&this.viewOrder.push(i)}var cols=this.sortCols;if(cols&&cols.length>0){if(null==this.viewOrder){this.viewOrder=[];for(var i=0,length=this.items.length;length>i;i++)this.viewOrder.push(i)}var ncols=cols.length,items=this.items;this.viewOrder.sort(function(index1,index2){for(var i=0;ncols>i;i++){var getter=cols[i].sortCol.getter,comparator=cols[i].sortAsc?morpheus.SortKey.ASCENDING_COMPARATOR:morpheus.SortKey.DESCENDING_COMPARATOR,value1=getter(items[index1]),value2=getter(items[index2]),result=comparator(value1,value2);if(0!==result)return result}return 0})}if(null!=this.viewOrder){this.modelToView=new morpheus.Map;for(var i=0,length=this.viewOrder.length;length>i;i++)this.modelToView.set(this.viewOrder[i],i)}else this.modelToView=null;if(null!=this.grid.getSelectionModel()){for(var newSelectedViewIndices=[],i=0,length=selectedModelIndices.length;length>i;i++){var index=this.convertModelIndexToView(selectedModelIndices[i]);void 0!==index&&newSelectedViewIndices.push(index)}this.grid.setSelectedRows(newSelectedViewIndices)}},setSelectedRows:function(rows){this.grid.setSelectedRows(rows)},setFilter:function(filter){this.filter=filter,this._updateMappings(),this.grid.invalidate(),this.trigger("filter")},getFilter:function(){return this.filter},autosizeColumns:function(){var columns=this.grid.getColumns(),items=this.getItems();if(items&&0!==items.length&&columns&&0!==columns.length){var gridWidth=this.options.$el.width()-30;if(!(0>=gridWidth)&&(this.columnsAutosized=!0,columns.length>-1)){var div=document.createElement("div");document.body.appendChild(div);var $d=$(div);$d.css({position:"absolute",left:-1e3,top:-1e3});var $row=$('
    '),$cell=$row.find(".slick-cell"),$header=$row.find(".slick-header-column");$row.appendTo($d);for(var maxWidth=Math.min(parseInt(gridWidth/2),400),getColumnWidth=function(column){var w=$header.html(column.name).outerWidth()+13;if(column.prototypeValue)$cell.html(column.prototypeValue),w=Math.max($cell.outerWidth(),w);else for(var i=0,nrows=Math.min(items.length,10);nrows>i;i++){var html=column.formatter(i,null,column.getter(items[i]),column,items[i]),$html=$(html);$html.find(".slick-cell-wrapper").attr("class",""),$cell.html($html),w=Math.max($cell.outerWidth(),w)}column.width=parseInt(Math.min(maxWidth,w))},totalWidth=0,i=0;i$checkNode[0].offsetWidth){var item=_grid.getDataItem(cell.row);text=c.tooltip(item,c.getter(item)),show=!0}$node.attr("data-original-title",text);var hasTip=$node.data("bs.tooltip");hasTip||$node.tooltip({placement:"auto",html:!0,container:"body",trigger:"manual"}),show?$node.tooltip("show"):hasTip&&$node.tooltip("hide")}}var _grid;$.extend(this,{init:init,destroy:destroy})},morpheus.CombinedGridFilter=function(){this.filters=[]},morpheus.CombinedGridFilter.prototype={add:function(filter){this.filters.push(filter)},getFilters:function(){return this.filters},get:function(index){return this.filters[index]},set:function(index,f){this.filters[index]=f},init:function(){for(var i=0;iLoading...
    '),closeable:!0,toolbar:{zoom:!0,tools:!0,searchRows:!0,searchColumns:!0,sort:!0,options:!0,saveImage:!0,saveDataset:!0,openFile:!0,filter:!0,colorKey:!0,searchValues:!1}},options),this.options=options,this.tooltipProvider=morpheus.HeatMapTooltipProvider,options.el?this.$el=$(options.el):this.$el=$("
    "),this.$el.addClass("morpheus"),options.landingPage||(options.landingPage=new morpheus.LandingPage,options.landingPage.$el.prependTo(this.$el)),this.options.name||(this.options.name=morpheus.Util.getBaseFileName(morpheus.Util.getFileName(this.options.dataset.file?this.options.dataset.file:this.options.dataset)));null==this.options.parent;if(null==this.options.parent){if(this.tabManager=this.options.tabManager?this.options.tabManager:new morpheus.TabManager({landingPage:this.options.landingPage}),!morpheus.HelpMenu.ADDED){morpheus.HelpMenu.ADDED=!0;var $a=$('Morpheus Icon');$a.tooltip({placement:"auto"});var $right=$('
  • ');$a.appendTo($right),(new morpheus.HelpMenu).$el.appendTo($right),$right.appendTo(this.tabManager.$nav)}this.options.tabManager||(this.tabManager.$nav.appendTo(this.$el),this.tabManager.$tabContent.appendTo(this.$el))}else this.options.inheritFromParent&&(this.popupItems=this.options.parent.popupItems,this.options.tabOpened||(this.options.tabOpened=this.options.parent.options.tabOpened),this.options.drawCallback=this.options.parent.options.drawCallback),this.tabManager=this.options.parent.tabManager;this.$content=$("
    "),this.$content.css({width:"100%","user-select":"none","-webkit-user-select":"none","-webkit-user-drag":"none","-webkit-tap-highlight-color":"rgba(0, 0, 0, 0)","-moz-user-select":"none","-moz-user-drag":"none","-moz-tap-highlight-color":"rgba(0, 0, 0, 0)","-ms-user-select":"none","-ms-user-drag":"none","-ms-tap-highlight-color":"rgba(0, 0, 0, 0)","-o-user-select":"none","-o-user-drag":"none","-o-tap-highlight-color":"rgba(0, 0, 0, 0)","overflow-x":"visible","overflow-y":"visible"});var tab=this.tabManager.add({$el:this.$content,closeable:this.options.closeable,rename:!0,title:this.options.name,object:this,focus: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("(");-1!==parenIndex&&(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;nkeys>keyIndex;keyIndex++){var key=groupByKeys[keyIndex];previousArray.push(key.getValue(0))}var spaces=[],sum=0;spaces.push(sum);for(var i=1;length>i;i++){for(var isEqual=!0,keyIndex=0;nkeys>keyIndex;keyIndex++){var key=groupByKeys[keyIndex],comparator=key.getComparator(),val=key.getValue(i),c=comparator(val,previousArray[keyIndex]);if(0!==c){isEqual=!1;for(var keyIndex2=0;nkeys>keyIndex2;keyIndex2++)previousArray[keyIndex2]=groupByKeys[keyIndex2].getValue(i);break}}isEqual||(sum+=gapSize),spaces.push(sum)}return spaces},morpheus.HeatMap.createGroupBySpaces=function(dataset,groupByKeys,gapSize){if(groupByKeys.length>0){for(var nkeys=groupByKeys.length,keyIndex=0;nkeys>keyIndex;keyIndex++)groupByKeys[keyIndex].init(dataset);return morpheus.HeatMap.getSpaces(groupByKeys,dataset.getRowCount(),gapSize)}},morpheus.HeatMap.isDendrogramVisible=function(project,isColumns){var sortKeys=isColumns?project.getColumnSortKeys():project.getRowSortKeys(),size=isColumns?project.getSortedFilteredDataset().getColumnCount():project.getSortedFilteredDataset().getRowCount();return 1===sortKeys.length?sortKeys[0]instanceof morpheus.SpecifiedModelSortOrder&&"dendrogram"===sortKeys[0].name&&sortKeys[0].nvisible===size:void 0},morpheus.HeatMap.prototype={gapSize:10,updatingScroll:!1,autoDisplay:function(options){null==options.filename&&(options.filename="");var colorScheme;if("segtab"===options.extension||"seg"===options.extension)colorScheme={type:"fixed",map:morpheus.HeatMapColorScheme.Predefined.CN().map.map(function(item){return{value:Math.pow(2,1+item.value),color:item.color}})};else if("maf"===options.extension){colorScheme=morpheus.HeatMapColorScheme.Predefined.MAF();var colorMap=morpheus.HeatMapColorScheme.Predefined.MAF().map,rowMutProfile=this.project.getFullDataset().getRowMetadata().getByName("mutation_summary"),columnMutProfile=this.project.getFullDataset().getColumnMetadata().getByName("mutation_summary"),track=this.getTrack("mutation_summary",!1);track&&track.settingFromConfig("stacked_bar"),track=this.getTrack("mutation_summary",!0),track&&track.settingFromConfig("stacked_bar");for(var i=1;ii;i++){var key=existingSortKeys[i];if(key instanceof morpheus.SortByValuesKey&&morpheus.Util.arrayEquals(key.modelIndices,modelIndices)){priorSortKeyIndex=i,key.getSortOrder()===morpheus.SortKey.SortOrder.UNSORTED?sortOrder=morpheus.SortKey.SortOrder.DESCENDING:key.getSortOrder()===morpheus.SortKey.SortOrder.DESCENDING?sortOrder=morpheus.SortKey.SortOrder.ASCENDING:key.getSortOrder()===morpheus.SortKey.SortOrder.ASCENDING?sortOrder=morpheus.SortKey.SortOrder.TOP_N:key.getSortOrder()===morpheus.SortKey.SortOrder.TOP_N&&(sortOrder=morpheus.SortKey.SortOrder.UNSORTED);break}}null==sortOrder&&(sortOrder=morpheus.SortKey.SortOrder.DESCENDING);var sortKeys;if(append)sortKeys=isColumns?project.getRowSortKeys():project.getColumnSortKeys(),-1!==priorSortKeyIndex?sortOrder===morpheus.SortKey.SortOrder.UNSORTED?sortKeys.splice(priorSortKeyIndex,1):sortKeys[priorSortKeyIndex].setSortOrder(sortOrder):sortOrder!==morpheus.SortKey.SortOrder.UNSORTED&&sortKeys.push(new morpheus.SortByValuesKey(modelIndices,sortOrder,!isColumns)),sortKeys=morpheus.SortKey.keepExistingSortKeys(sortKeys,isColumns?project.getRowSortKeys():project.getColumnSortKeys());else{var newSortKeys=sortOrder===morpheus.SortKey.SortOrder.UNSORTED?[]:[new morpheus.SortByValuesKey(modelIndices,sortOrder,!isColumns)];sortKeys=morpheus.SortKey.keepExistingSortKeys(newSortKeys,isColumns?project.getRowSortKeys():project.getColumnSortKeys())}isColumns?(project.setRowSortKeys(sortKeys,!0),this.scrollTop(0)):(project.setColumnSortKeys(sortKeys,!0),this.scrollLeft(0)),morpheus.Util.trackEvent({eventCategory:"Tool",eventAction:isColumns?"sortRowsBasedOnSelection":"sortColumnsBasedOnSelection"})}},getToolbarElement:function(){return this.toolbar.$el},getToolbar:function(){return this.toolbar},setName:function(name){this.options.name=name},getName:function(){return this.options.name},showOptions:function(){new morpheus.HeatMapOptions(this)},getProject:function(){return this.project},setDendrogram:function(tree,isColumns,viewIndices){var dendrogram=isColumns?this.columnDendrogram:this.rowDendrogram;if(dendrogram&&(dendrogram.dispose(),dendrogram=null),null!=tree){for(var modelIndices=[],modelIndexSet=new morpheus.Set,size=isColumns?this.project.getFullDataset().getColumnCount():this.project.getFullDataset().getRowCount(),i=0;size>i;i++)modelIndexSet.add(i);for(var i=0,length=viewIndices.length;length>i;i++){var modelIndex=isColumns?this.project.convertViewColumnIndexToModel(viewIndices[i]):this.project.convertViewRowIndexToModel(viewIndices[i]);modelIndices.push(modelIndex),modelIndexSet.remove(modelIndex)}var nvisible=modelIndices.length;if(modelIndexSet.size()>0)for(var indices=modelIndexSet.values(),i=0,length=indices.length;length>i;i++)modelIndices.push(indices[i]);isColumns?(dendrogram=new morpheus.ColumnDendrogram(this,tree,this.heatmap.getColumnPositions(),this.project),dendrogram.filter=this.project.getColumnFilter().shallowClone(),this.columnDendrogram=dendrogram,this.project.setColumnSortKeys([new morpheus.SpecifiedModelSortOrder(modelIndices,nvisible,"dendrogram")],!0)):(dendrogram=new morpheus.RowDendrogram(this,tree,this.heatmap.getRowPositions(),this.project),dendrogram.filter=this.project.getRowFilter().shallowClone(),this.rowDendrogram=dendrogram,this.project.setRowSortKeys([new morpheus.SpecifiedModelSortOrder(modelIndices,nvisible,"dendrogram")],!0)),dendrogram.appendTo(this.$parent),dendrogram.$label.appendTo(this.$parent),dendrogram.$squishedLabel.appendTo(this.$parent)}else{for(var sortKeys=isColumns?this.project.getColumnSortKeys():this.project.getRowSortKeys(),i=0;i0){var tipText=[],dataset=project.getSortedFilteredDataset(),rowTracks=_this.rowTracks.filter(function(t){return t.settings.inlineTooltip}),columnTracks=_this.columnTracks.filter(function(t){return t.settings.inlineTooltip});return selectedViewIndices.forEach(function(id){var rowIndex=id.getArray()[0],columnIndex=id.getArray()[1];tipText.push(morpheus.Util.nf(dataset.getValue(rowIndex,columnIndex))),rowTracks.forEach(function(track){tipText.push(" "),tipText.push(morpheus.Util.formatObject(dataset.getRowMetadata().getByName(track.name).getValue(rowIndex)))}),columnTracks.forEach(function(track){tipText.push(" "),tipText.push(morpheus.Util.formatObject(dataset.getColumnMetadata().getByName(track.name).getValue(columnIndex)))}),tipText.push("\n")}),tipText.join("")}},_init:function(){function reorderTracks(array,isColumns){var nameOrderPairs=[],found=!1;if(_.each(array,function(item){var name=item.renameTo||item.field,order=999;null!=item.order&&(order=item.order,found=!0),nameOrderPairs.push({name:name,order:order})}),found){nameOrderPairs.sort(function(a,b){return a.order===b.order?0:a.order").css("position","relative"),this.$parent.appendTo(this.$content),this.toolbar=new morpheus.HeatMapToolBar(this),this.options.customUrls&&this.setCustomUrls(this.options.customUrls),this.vscroll=new morpheus.ScrollBar(!0),this.vscroll.appendTo(this.$parent),this.vscroll.on("scroll",function(){_this.updatingScroll||_this.paintAll({paintRows:!0,paintColumns:!1,invalidateRows:!0,invalidateColumns:!1})}),this.beforeColumnTrackDivider=new morpheus.Divider(!1),this.beforeColumnTrackDivider.appendTo(this.$parent);var dragStartHeight=0;this.beforeColumnTrackDivider.on("resizeStart",function(e){dragStartHeight=_this.columnDendrogram.getUnscaledHeight()}).on("resize",function(e){var newHeight=Math.max(8,dragStartHeight+e.delta);_this.columnDendrogram.setPrefHeight(newHeight),_this.revalidate()}).on("resizeEnd",function(){dragStartHeight=0}),this.afterRowDendrogramDivider=new morpheus.Divider(!0),this.afterRowDendrogramDivider.appendTo(this.$parent);var rowDendrogramStartWidth=0;this.afterRowDendrogramDivider.on("resizeStart",function(e){rowDendrogramStartWidth=_this.rowDendrogram.getUnscaledWidth()}).on("resize",function(e){var newWidth=Math.max(8,rowDendrogramStartWidth+e.delta);_this.rowDendrogram.setPrefWidth(newWidth),_this.revalidate()}).on("resizeEnd",function(){rowDendrogramStartWidth=0}),this.afterVerticalScrollBarDivider=new morpheus.Divider(!0),this.afterVerticalScrollBarDivider.appendTo(this.$parent);var resizeStartHeatMapWidth=0;this.afterVerticalScrollBarDivider.on("resizeStart",function(e){resizeStartHeatMapWidth=_this.heatmap.getUnscaledWidth()}).on("resize",function(e){_this.heatmap.prefWidth=resizeStartHeatMapWidth+e.delta,_this.revalidate()}),this.hscroll=new morpheus.ScrollBar(!1), this.hscroll.appendTo(this.$parent),this.hscroll.on("scroll",function(){_this.updatingScroll||_this.paintAll({paintRows:!1,paintColumns:!0,invalidateRows:!1,invalidateColumns:!0})});var heatmap=new morpheus.HeatMapElementCanvas(this.project);this.options.drawCallback&&heatmap.setDrawCallback(this.options.drawCallback),$(heatmap.canvas).on("contextmenu",function(e){morpheus.Popup.showPopup([{name:"Copy",disabled:0===_this.project.getElementSelectionModel().count()},{name:"Save Image (Ctrl-S)"},{separator:!0},{name:"Show Inline Tooltip",checked:_this.options.inlineTooltip}],{x:e.pageX,y:e.pageY},e.target,function(event,item){if("Show Inline Tooltip"===item)_this.options.inlineTooltip=!_this.options.inlineTooltip;else if("Save Image (Ctrl-S)"===item)morpheus.HeatMap.showTool(new morpheus.SaveImageTool,_this);else{var text=_this.getSelectedElementsText();""!==text&&event.clipboardData.setData("text/plain",text)}}),e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation()}),heatmap.appendTo(this.$parent),this.heatmap=heatmap;var rowDendrogramSortKey=null;if(void 0!=rowDendrogram){var tree=rowDendrogram;if(tree.leafNodes.length!==this.project.getFullDataset().getRowCount())throw"# leaf nodes in row dendrogram "+tree.leafNodes.length+" != "+this.project.getFullDataset().getRowCount();if(null!=this.options.rowDendrogramField){for(var vector=dataset.getRowMetadata().getByName(this.options.rowDendrogramField),rowIndices=[],map=new morpheus.Map,re=/[,:]/g,j=0,size=vector.size();size>j;j++){var key=vector.getValue(j);map.set(key.replace(re,""),j)}for(var i=0,length=tree.leafNodes.length;length>i;i++){var index=map.get(tree.leafNodes[i].name);if(void 0===index)throw"Unable to find row dendrogram id "+tree.leafNodes[i].name+" in row annotations";rowIndices.push(index)}}else for(var i=0,length=tree.leafNodes.length;length>i;i++)rowIndices.push(i);this.rowDendrogram=new morpheus.RowDendrogram(this,tree,heatmap.getRowPositions(),this.project,!0),rowDendrogramSortKey=new morpheus.SpecifiedModelSortOrder(rowIndices,rowIndices.length,"dendrogram"),this.rowDendrogram.appendTo(this.$parent),this.rowDendrogram.$label.appendTo(this.$parent),this.rowDendrogram.$squishedLabel.appendTo(this.$parent)}var columnDendrogramSortKey=null;if(void 0!==columnDendrogram){var tree=columnDendrogram;if(tree.leafNodes.length!==this.project.getFullDataset().getColumnCount())throw"# leaf nodes "+tree.leafNodes.length+" != "+this.project.getFullDataset().getColumnCount();var columnIndices=[];if(null!=this.options.columnDendrogramField){for(var vector=dataset.getColumnMetadata().getByName(this.options.columnDendrogramField),map=new morpheus.Map,re=/[,:]/g,j=0,size=vector.size();size>j;j++){var key=vector.getValue(j);map.set(key.replace(re,""),j)}for(var i=0,length=tree.leafNodes.length;length>i;i++){var index=map.get(tree.leafNodes[i].name);if(void 0===index)throw"Unable to find column dendrogram id "+tree.leafNodes[i].name+" in column annotations";columnIndices.push(index)}}else for(var i=0,length=tree.leafNodes.length;length>i;i++)columnIndices.push(i);this.columnDendrogram=new morpheus.ColumnDendrogram(this,tree,heatmap.getColumnPositions(),this.project,!0),columnDendrogramSortKey=new morpheus.SpecifiedModelSortOrder(columnIndices,columnIndices.length,"dendrogram"),this.columnDendrogram.appendTo(this.$parent),this.columnDendrogram.$label.appendTo(this.$parent),this.columnDendrogram.$squishedLabel.appendTo(this.$parent)}if(null!==rowDendrogramSortKey&&this.project.setRowSortKeys([rowDendrogramSortKey]),null!==columnDendrogramSortKey&&this.project.setColumnSortKeys([columnDendrogramSortKey]),null!=this.options.rowGroupBy)for(var i=0;ii;i++){var v=displayMetadata.get(i);defaultFieldsToShow.has(v.getName())&&(nameToOption.set(v.getName(),{display:"text"}),displaySpecified=!0)}}for(var isFirst=!0,i=0,metadataCount=displayMetadata.getMetadataCount();metadataCount>i;i++){var display=displaySpecified?"None":void 0,v=displayMetadata.get(i),name=v.getName(),option=nameToOption.get(name);if(!morpheus.MetadataUtil.DEFAULT_HIDDEN_FIELDS.has(name)||null!=option){var count=isColumns?dataset.getColumnCount():dataset.getRowCount();if(option||displaySpecified||!(count>1)||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)}-1!==morpheus.DatasetUtil.getSeriesIndex(this.project.getFullDataset(),"allelic_fraction")&&(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(-1===index)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);-1!==index&&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);-1!==index&&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();count>i;i++){for(var j=0,nfields=model.getMetadataCount();nfields>j;j++){var v=model.get(j);j>0&&text.push(" "),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={};-1!==_this.project.getHoverRowIndex()&&(reval.scrollTop=this.heatmap.getRowPositions().getPosition(this.project.getHoverRowIndex())),-1!==_this.project.getHoverColumnIndex()&&(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||rowi;i++){var track=this.rowTracks[i];track.isVisible()&&(trackWidth+=track.getUnscaledWidth())}var canvasWidth=trackWidth+heatMapWidth+morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS;canvas.width=canvasWidth*morpheus.CanvasUtil.BACKING_SCALE,canvas.style.width=canvasWidth+"px",canvas.height=heatMapHeight*morpheus.CanvasUtil.BACKING_SCALE,canvas.style.height=heatMapHeight+"px";var context=canvas.getContext("2d");morpheus.CanvasUtil.resetTransform(context),context.save(),context.translate(-this.heatmap.lastClip.x,-startPix),context.rect(this.heatmap.lastClip.x,startPix,this.heatmap.lastClip.width,this.heatmap.lastClip.height),context.clip(),this.heatmap._draw({left:this.heatmap.lastPosition.left,right:this.heatmap.lastPosition.right,top:top,bottom:bottom,context:context}),context.restore(),context.translate(heatMapWidth+morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS,-startPix),trackWidth=0;for(var i=0,ntracks=this.rowTracks.length;ntracks>i;i++){var track=this.rowTracks[i];track.isVisible()&&(context.save(),context.translate(trackWidth,0),context.rect(0,startPix,track.getUnscaledWidth(),track.lastClip.height),context.clip(),track._draw({start:top,end:bottom,vector:track.getVector(),context:context,availableSpace:track.getUnscaledWidth()}),context.restore(),trackWidth+=track.getUnscaledWidth())}$(canvas).appendTo($wrapper),canvas.style.top=wrapperHeight+"px",wrapperHeight+=parseFloat(canvas.style.height),wrapperWidth=parseFloat(canvas.style.width)}else inline.push(row)}if(found){$wrapper.css({height:wrapperHeight,width:wrapperWidth});var rect=this.$parent[0].getBoundingClientRect();return void this.$tipFollow.html($wrapper).css({left:parseFloat(this.heatmap.canvas.style.left)-1,top:options.event.clientY-rect.top-wrapperHeight/2})}for(var tipText=[],tipFollowText=[],hoverIndex=0;hoverIndex",!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||columni;i++){var track=this.columnTracks[i];track.isVisible()&&(trackHeight+=track.getUnscaledHeight())}var canvasHeight=trackHeight+heatMapHeight+morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS;canvas.width=heatMapWidth*morpheus.CanvasUtil.BACKING_SCALE,canvas.style.width=heatMapWidth+"px",canvas.height=canvasHeight*morpheus.CanvasUtil.BACKING_SCALE,canvas.style.height=canvasHeight+"px";var context=canvas.getContext("2d");morpheus.CanvasUtil.resetTransform(context),context.translate(-startPix,0),context.save(),context.rect(startPix,trackHeight+morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS,this.heatmap.lastClip.width,this.heatmap.lastClip.height+trackHeight+morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS),context.clip(),context.translate(0,trackHeight+morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS-this.heatmap.lastClip.y),this.heatmap._draw({top:this.heatmap.lastPosition.top,bottom:this.heatmap.lastPosition.bottom,left:left,right:right,context:context}),context.restore(),trackHeight=0;for(var i=0,ntracks=this.columnTracks.length;ntracks>i;i++){var track=this.columnTracks[i];track.isVisible()&&(context.save(),context.translate(0,trackHeight),context.rect(startPix,0,track.lastClip.width,track.getUnscaledHeight()),context.clip(),track._draw({start:left,end:right,vector:track.getVector(),context:context,availableSpace:track.getUnscaledHeight(),clip:{x:track.lastClip.x,y:track.lastClip.y}}),context.restore(),trackHeight+=track.getUnscaledHeight())}canvas.style.left=wrapperWidth+"px",wrapperWidth+=parseFloat(canvas.style.width),wrapperHeight=parseFloat(canvas.style.height),$(canvas).appendTo($wrapper)}else inline.push(column)}if(found){$wrapper.css({height:wrapperHeight,width:wrapperWidth});var rect=this.$parent[0].getBoundingClientRect();return void this.$tipFollow.html($wrapper).css({top:parseFloat(this.heatmap.canvas.style.top)-trackHeight-morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS-1,left:options.event.clientX-rect.left-wrapperWidth/2})}for(var tipText=[],tipFollowText=[],hoverIndex=0;hoverIndex",!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._setTipText(tipText,tipFollowText,options)},_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.renderSettings).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(-1===trackIndex){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)||0>index||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&&-1!==this.project.getHoverRowIndex()&&(reval.scrollTop=this.heatmap.getRowPositions().getPosition(this.project.getHoverRowIndex())),options.columns&&-1!==this.project.getHoverColumnIndex()&&(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;length>i;i++)if(void 0!==tracks[i].name&&tracks[i].name===name)return i;return-1},getNumTracks:function(isColumns){return isColumns?this.columnTracks.length:this.rowTracks.length; },moveTrack:function(index,newIndex,isColumns){var tracks=isColumns?this.columnTracks:this.rowTracks,headers=isColumns?this.columnTrackHeaders:this.rowTrackHeaders,track=tracks[index];tracks.splice(index,1);var header=headers[index];headers.splice(index,1),tracks.splice(newIndex,0,track),headers.splice(newIndex,0,header),this.trigger("change",{name:"moveTrack",source:this,arguments:arguments})},getTrackByIndex:function(index,isColumns){return isColumns?this.columnTracks[index]:this.rowTracks[index]},getTrackHeaderByIndex:function(index,isColumns){return isColumns?this.columnTrackHeaders[index]:this.rowTrackHeaders[index]},getTrack:function(name,isColumns){var index=this.getTrackIndex(name,isColumns);if(-1!==index)return isColumns?this.columnTracks[index]:this.rowTracks[index]},isActiveComponent:function(){var active=document.activeElement,tagName=active.tagName;return"INPUT"==tagName||"SELECT"==tagName||"TEXTAREA"==tagName?!1:this.$tabPanel[0].contains(active)},getActiveComponent:function(){var active=document.activeElement;if("CANVAS"===active.tagName){for(var i=0,ntracks=this.columnTracks.length;ntracks>i;i++)if(this.columnTracks[i].canvas===active)return 1;for(var i=0,ntracks=this.rowTracks.length;ntracks>i;i++)if(this.rowTracks[i].canvas===active)return 0;if(this.heatmap.canvas===active)return 2}return-1},getVisibleTrackNames:function(isColumns){for(var names=[],tracks=isColumns?this.columnTracks:this.rowTracks,i=0,length=tracks.length;length>i;i++)tracks[i].isVisible()&&names.push(tracks[i].name);return names},resizeTrack:function(name,width,height,isColumns){var index=this.getTrackIndex(name,isColumns);if(-1===index)throw name+" not found in resize track";if(isColumns){var track=this.columnTracks[index],header=this.columnTrackHeaders[index];if(height&&(track.setPrefHeight(height),header.setPrefHeight(height)),width)for(var i=0;ii;i++){var track=this.rowTracks[i];track.setInvalid(invalidateRows),track.isVisible()&&(track.paint({x:0,y:y,height:unscaledHeight,width:unscaledWidth}),this.rowTrackHeaders[i].paint())}null!=this.rowDendrogram&&(this.rowDendrogram.setInvalid(invalidateRows),this.isDendrogramVisible(!1)?(this.rowDendrogram.setVisible(!0),this.rowDendrogram.paint({x:0,y:y,height:unscaledHeight,width:this.rowDendrogram.getUnscaledWidth()})):this.rowDendrogram.setVisible(!1))}if(columns){for(var i=0,length=this.columnTracks.length;length>i;i++){var track=this.columnTracks[i];track.setInvalid(invalidateColumns),track.paint({x:x,y:0,width:unscaledWidth,height:track.getUnscaledHeight()}),this.columnTrackHeaders[i].paint()}null!=this.columnDendrogram&&(this.columnDendrogram.setInvalid(invalidateColumns),this.isDendrogramVisible(!0)?(this.columnDendrogram.setVisible(!0),this.columnDendrogram.paint({x:x,y:0,width:unscaledWidth,height:this.columnDendrogram.getUnscaledHeight()})):this.columnDendrogram.setVisible(!1))}(invalidateRows||invalidateColumns)&&this.heatmap.setInvalid(!0),this.heatmap.paint({x:x,y:y,width:unscaledWidth,height:unscaledHeight}),this.trigger("change",{name:"paintAll",source:this,arguments:arguments})},scrollTop:function(pos){return void 0===pos?this.vscroll.getValue():(this.vscroll.setValue(pos,!0),void this.trigger("change",{name:"scrollTop",source:this,arguments:arguments}))},scrollLeft:function(pos){return void 0===pos?this.hscroll.getValue():(this.trigger("change",{name:"scrollLeft",source:this,arguments:arguments}),void this.hscroll.setValue(pos,!0))},setSelectedTrack:function(name,isColumns){if(name!==this.selectedTrackName||isColumns!==this.selectedTrackIsColumns){var index=this.getTrackIndex(this.selectedTrackName,this.selectedTrackIsColumns);-1!==index&&this.getTrackHeaderByIndex(index,this.selectedTrackIsColumns).setSelected(!1),this.selectedTrackName=name,this.selectedTrackIsColumns=isColumns;var index=this.getTrackIndex(this.selectedTrackName,this.selectedTrackIsColumns);-1!==index&&this.getTrackHeaderByIndex(index,this.selectedTrackIsColumns).setSelected(!0),this.trigger("change",{name:"setSelected",source:this,arguments:arguments})}},saveImage:function(file,format){var bounds=this.getTotalSize();if("svg"===format){var context=new C2S(bounds.width,bounds.height);this.snapshot(context);var svg=context.getSerializedSvg(),blob=new Blob([svg],{type:"text/plain;charset=utf-8"});saveAs(blob,file,!0)}else{var canvas=$("")[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;length>i;i++){var track=this.rowTracks[i];if(track.isVisible()){var headerSize=this.rowTrackHeaders[i].getPrintSize();totalSize.width+=Math.max(headerSize.width,track.getPrintSize().width),maxRowHeaderHeight=Math.max(maxRowHeaderHeight,headerSize.height)}}for(var maxColumnHeaderWidth=0,columnTrackHeightSum=0,i=0,length=this.columnTracks.length;length>i;i++){var track=this.columnTracks[i];track.isVisible()&&(columnTrackHeightSum+=track.getPrintSize().height,maxColumnHeaderWidth=Math.max(maxColumnHeaderWidth,this.columnTrackHeaders[i].getPrintSize().width))}if(totalSize.height+=Math.max(columnTrackHeightSum,maxRowHeaderHeight)+morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS,totalSize.width+=maxColumnHeaderWidth+morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS,options.legend){var legendHeight=null!=this.heatmap.getColorScheme().getNames()?14*this.heatmap.getColorScheme().getNames().length:40;totalSize.height+=legendHeight+morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS}var trackLegendSize=new morpheus.HeatMapTrackColorLegend(_.filter(this.columnTracks,function(track){return track.isVisible()&&(track.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)||track.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR))}),this.getProject().getColumnColorModel()).getPreferredSize();return totalSize.height+=trackLegendSize.height,totalSize.width=Math.max(totalSize.width,trackLegendSize.width),trackLegendSize=new morpheus.HeatMapTrackColorLegend(_.filter(this.rowTracks,function(track){return track.isVisible()&&(track.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)||track.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR))}),this.getProject().getRowColorModel()).getPreferredSize(),totalSize.height+=morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS+trackLegendSize.height,totalSize.width=morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS+Math.max(totalSize.width,trackLegendSize.width),totalSize},getHeatMapElementComponent:function(){return this.heatmap},snapshot:function(context,options){options=$.extend({},{legend:!0},options);var heatmapPrefSize=this.heatmap.getPreferredSize(),legendHeight=(this.getTotalSize(options),0);options.legend&&(context.save(),context.translate(50,0),morpheus.HeatMapColorSchemeLegend.drawColorScheme(context,this.heatmap.getColorScheme(),200,!0),context.restore(),legendHeight=null!=this.heatmap.getColorScheme().getNames()?14*this.heatmap.getColorScheme().getNames().length:40),context.save(),context.translate(4,legendHeight);var columnTrackLegend=new morpheus.HeatMapTrackColorLegend(_.filter(this.columnTracks,function(track){return track.isVisible()&&(track.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)||track.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR))}),this.getProject().getColumnColorModel());columnTrackLegend.draw({},context),context.restore();var columnTrackLegendSize=columnTrackLegend.getPreferredSize();context.save(),context.translate(4+columnTrackLegendSize.width,legendHeight);var rowTrackLegend=new morpheus.HeatMapTrackColorLegend(_.filter(this.rowTracks,function(track){return track.isVisible()&&(track.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)||track.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR))}),this.getProject().getRowColorModel());rowTrackLegend.draw({},context),context.restore(),legendHeight+=Math.max(rowTrackLegend.getPreferredSize().height,columnTrackLegendSize.height);var heatmapY=this.isDendrogramVisible(!0)?this.columnDendrogram.getUnscaledHeight()+morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS:0;heatmapY+=legendHeight;for(var columnTrackY=heatmapY,heatmapX=this.isDendrogramVisible(!1)?this.rowDendrogram.getUnscaledWidth()+morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS:0,isColumnTrackVisible=!1,i=0,length=this.columnTracks.length;length>i;i++){var track=this.columnTracks[i];if(track.isVisible()){var header=this.columnTrackHeaders[i];heatmapX=Math.max(heatmapX,header.getPrintSize().width),heatmapY+=track.getPrintSize().height,isColumnTrackVisible=!0}}isColumnTrackVisible&&(heatmapY+=morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS);for(var i=0,length=this.rowTracks.length;length>i;i++){var track=this.rowTracks[i];if(track.isVisible()){var header=this.rowTrackHeaders[i];heatmapY=Math.max(heatmapY,header.getPrintSize().height)}}if(this.isDendrogramVisible(!0)){var columnDendrogramClip={x:0,y:0,height:this.columnDendrogram.getUnscaledHeight(),width:heatmapPrefSize.width};context.save(),context.translate(heatmapX,legendHeight),this.columnDendrogram.prePaint(columnDendrogramClip,context),this.columnDendrogram.draw(columnDendrogramClip,context),context.restore()}if(this.isDendrogramVisible(!1)){var rowDendrogramClip={x:0,y:0,width:this.rowDendrogram.getUnscaledWidth(),height:heatmapPrefSize.height};context.save(),context.translate(0,heatmapY),this.rowDendrogram.prePaint(rowDendrogramClip,context),this.rowDendrogram.draw(rowDendrogramClip,context),context.restore()}for(var i=0,length=this.columnTracks.length;length>i;i++){var track=this.columnTracks[i];if(track.isVisible()){context.save(),context.translate(heatmapX,columnTrackY);var trackClip={x:0,y:0,width:heatmapPrefSize.width,height:track.getPrintSize().height};track.print(trackClip,context),context.restore();var header=this.columnTrackHeaders[i];context.save();var headerSize=header.getPrintSize(),headerClip={x:0,y:0,width:headerSize.width,height:trackClip.height};context.translate(heatmapX-2,columnTrackY+trackClip.height),header.print(headerClip,context),context.restore(),columnTrackY+=Math.max(headerClip.height,trackClip.height)}}context.save(),context.translate(heatmapX,heatmapY),this.heatmap.draw({x:0,y:0,width:heatmapPrefSize.width,height:heatmapPrefSize.height},context),context.restore();for(var rowTrackWidthSum=0,i=0,length=this.rowTracks.length;length>i;i++){var track=this.rowTracks[i];if(track.isVisible()){context.save();var tx=morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS+heatmapX+heatmapPrefSize.width+rowTrackWidthSum,ty=heatmapY,trackClip={x:0,y:0,width:track.getPrintSize().width,height:heatmapPrefSize.height};context.translate(tx,ty),context.strokeStyle="white",context.rect(0,0,trackClip.width,trackClip.height),context.stroke(),context.clip(),track.print(trackClip,context),context.restore();var header=this.rowTrackHeaders[i];context.save();var headerSize=header.getPrintSize(),headerClip={x:0,y:0,width:headerSize.width,height:headerSize.height};context.translate(tx,ty-4),header.print(headerClip,context),context.restore(),rowTrackWidthSum+=Math.max(headerSize.width,trackClip.width)}}},resetZoom:function(){var heatmap=this.heatmap,rowSizes=heatmap.getRowPositions(),columnSizes=heatmap.getColumnPositions();rowSizes.setSize(13),columnSizes.setSize(13);var reval={};-1!==this.project.getHoverRowIndex()&&(reval.scrollTop=this.heatmap.getRowPositions().getPosition(this.project.getHoverRowIndex())),-1!==this.project.getHoverColumnIndex()&&(reval.scrollLeft=this.heatmap.getColumnPositions().getPosition(this.project.getHoverColumnIndex())),this.revalidate(reval)},getFitColumnSize:function(){var heatmap=this.heatmap,availablePixels=this.getAvailableWidth();this.rowDendrogram&&(availablePixels-=this.rowDendrogram.getUnscaledWidth());for(var trackPixels=12,i=0,length=this.rowTracks.length;length>i;i++){var track=this.rowTracks[i];track.isVisible()&&(trackPixels+=track.getUnscaledWidth())}for(var i=0,length=this.columnTracks.length;length>i;i++){var track=this.columnTracks[i];if(track.isVisible()){trackPixels+=this.columnTrackHeaders[i].getUnscaledWidth();break}}availablePixels-=trackPixels;var positions=heatmap.getColumnPositions(),totalCurrent=positions.getItemSize(positions.getLength()-1)+positions.getPosition(positions.getLength()-1),size=positions.getSize();return size*=availablePixels/totalCurrent,size=Math.min(13,size)},getFitRowSize:function(){var heatmap=this.heatmap,availablePixels=this.getAvailableHeight();this.columnDendrogram&&(availablePixels-=this.columnDendrogram.getUnscaledHeight());for(var trackPixels=12,i=0,length=this.columnTracks.length;length>i;i++){var track=this.columnTracks[i];track.isVisible()&&(trackPixels+=track.getUnscaledHeight())}availablePixels-=trackPixels;var positions=heatmap.getRowPositions(),totalCurrent=positions.getItemSize(positions.getLength()-1)+positions.getPosition(positions.getLength()-1),size=positions.getSize();return size*=availablePixels/totalCurrent,size=Math.min(13,size)},fitToWindow:function(repaint){if(this.heatmap.getRowPositions().setSize(this.getFitRowSize()),this.heatmap.getColumnPositions().setSize(this.getFitColumnSize()),repaint){var reval={};-1!==this.project.getHoverRowIndex()&&(reval.scrollTop=this.heatmap.getRowPositions().getPosition(this.project.getHoverRowIndex())),-1!==this.project.getHoverColumnIndex()&&(reval.scrollLeft=this.heatmap.getColumnPositions().getPosition(this.project.getHoverColumnIndex())),this.revalidate(reval)}},getAvailableHeight:function(){if(_.isNumber(this.options.height))return this.options.height;var height=$(window).height()-this.$parent.offset().top-24;return"window"===this.options.height?height:Math.max(Math.round(.7*screen.height),height)},getAvailableWidth:function(){return this.options.width?this.options.width:this.tabManager.getWidth()-30},revalidate:function(options){options=$.extend({},{paint:!0},options),this.updatingScroll=!0;var availableHeight=this.getAvailableHeight(),availableWidth=this.getAvailableWidth(),heatmapPrefSize=this.heatmap.getPreferredSize(),columnDendrogramHeight=0,rowDendrogramWidth=0;this.columnDendrogram&&(columnDendrogramHeight=morpheus.CanvasUtil.getPreferredSize(this.columnDendrogram).height),this.rowDendrogram&&(rowDendrogramWidth=morpheus.CanvasUtil.getPreferredSize(this.rowDendrogram).width);for(var rowTrackWidthSum=0,i=0,length=this.rowTracks.length;length>i;i++)this.rowTracks[i].isVisible()&&(rowTrackWidthSum+=Math.max(morpheus.CanvasUtil.getPreferredSize(this.rowTrackHeaders[i]).width,morpheus.CanvasUtil.getPreferredSize(this.rowTracks[i]).width));for(var ypos=columnDendrogramHeight,maxHeaderWidth=0,i=0,length=this.columnTracks.length;length>i;i++)if(this.columnTracks[i].isVisible()){var width=morpheus.CanvasUtil.getPreferredSize(this.columnTrackHeaders[i]).width;maxHeaderWidth=Math.max(maxHeaderWidth,width)}var xpos=Math.max(rowDendrogramWidth,maxHeaderWidth),heatMapWidth=heatmapPrefSize.width,maxHeatMapWidth=Math.max(50,availableWidth-rowTrackWidthSum-xpos-morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS);maxHeatMapWidth>0&&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;length>i;i++){var track=this.columnTracks[i];if(track.isVisible()){var size=morpheus.CanvasUtil.getPreferredSize(track),headerSize=morpheus.CanvasUtil.getPreferredSize(this.columnTrackHeaders[i]);size.height=Math.max(size.height,headerSize.height),track.setBounds({width:heatMapWidth,height:size.height,left:xpos,top:ypos}),this.columnTrackHeaders[i].setBounds({width:maxHeaderWidth,height:size.height,left:xpos-maxHeaderWidth,top:ypos}),ypos+=size.height}}ypos+=morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS;var heatMapHeight=heatmapPrefSize.height;heatMapHeight>availableHeight-ypos&&(heatMapHeight=Math.max(100,Math.min(heatmapPrefSize.height,availableHeight-ypos))),0>ypos&&(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(heatMapWidthi;i++){var track=this.rowTracks[i];if(track.isVisible()){nvisibleRowTracks++;break}}this.vSortByValuesIndicator.setBounds({width:4,height:heatMapHeight,left:xpos,top:ypos}),nvisibleRowTracks>0&&(xpos+=morpheus.HeatMap.SPACE_BETWEEN_HEAT_MAP_AND_ANNOTATIONS);for(var rowAnnotationXStart=xpos,i=0,length=this.rowTracks.length;length>i;i++){var track=this.rowTracks[i];if(track.isVisible()){var size=morpheus.CanvasUtil.getPreferredSize(track),headerSize=morpheus.CanvasUtil.getPreferredSize(this.rowTrackHeaders[i]);size.width=Math.max(headerSize.width,size.width),size.height=heatMapHeight,track.setBounds({width:size.width,height:size.height,left:xpos,top:ypos}),this.rowTrackHeaders[i].setBounds({width:size.width,left:xpos,top:ypos-headerSize.height-5,height:headerSize.height}),xpos+=size.width}}this.afterVerticalScrollBarDivider.setVisible(nvisibleRowTracks>0),this.afterVerticalScrollBarDivider.setBounds({left:rowAnnotationXStart-2,top:ypos-18}),this.vscroll.setVisible(heatMapHeightj;j++){var d=this.datasetRowView.getValue(j);isNaN(d)||(this.rowCachedMax=d>this.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);-1!==newIndex&&(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&&-1!==_.indexOf(fractions,val);)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",-1===this.legend.selectedIndex),-1!==this.legend.selectedIndex){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;halfway>i;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>lastTextPixEnd&&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;lastTextPixStart>pix&&(context.fillText(text,pix,14),lastTextPixStart=pix-textWidth/2)}}}},morpheus.HeatMapColorSchemeLegend.drawColorSchemeVertically=function(context,colorScheme,hiddenValues,printing){var fractionToValue=d3.scale.linear().domain([0,1]).range([colorScheme.getMin(),colorScheme.getMax()]).clamp(!0);context.textAlign="left",context.textBaseline="top",context.fillStyle="black";var fractions=colorScheme.getFractions(),colors=colorScheme.getColors(),names=colorScheme.getNames();context.strokeStyle="LightGrey";var xpix=0,ypix=0;context.font="12px "+morpheus.CanvasUtil.FONT_NAME;for(var i=0;ii;i++){context.fillStyle=colors[i];var x1=map(fractions[i]),x2=i===length-1?width:map(fractions[i+1]);context.fillRect(Math.min(x1,x2),0,Math.abs(x2-x1),height)}else{for(var gradient=context.createLinearGradient(0,0,width,height),i=0,length=fractions.length;length>i;i++)gradient.addColorStop(fractions[i],colors[i]);context.fillStyle=gradient,context.fillRect(0,0,width,height)}},morpheus.HeatMapColorSchemeLegend.prototype={},morpheus.HeatMapSynchronizer=function(){this.controllers=[]},morpheus.HeatMapSynchronizer.prototype={firing:!1,getProject:function(){return this.controllers[0].getProject()},zoom:function(){this.controllers[0].zoom.apply(this.controllers[0],arguments)},setTrackVisible:function(){this.controllers[0].setTrackVisible.apply(this.controllers[0],arguments)},revalidate:function(){this.controllers[0].revalidate.apply(this.controllers[0],arguments)},add:function(controller){var that=this;this.controllers.push(controller),controller.on("change",function(event){if(!that.firing){var source=event.source,method=event.name;that.firing=!0,_.each(that.controllers,function(c){c!==source&&c[method].apply(c,event.arguments)}),that.firing=!1}})}},morpheus.HeatMapElementCanvas=function(project){morpheus.AbstractCanvas.call(this,!0),this.colorScheme=null,this.project=project,this.dataset=null;var _this=this;this.columnPositions=new morpheus.Positions,this.rowPositions=new morpheus.Positions,this.lastPosition={left:-1,right:-1,top:-1,bottom:-1},project.getElementSelectionModel().on("selectionChanged",function(){_this.repaint()})},morpheus.HeatMapElementCanvas.GRID_COLOR="rgb(128,128,128)",morpheus.HeatMapElementCanvas.prototype={drawGrid:!0,getColorScheme:function(){return this.colorScheme},isDrawGrid:function(){return this.drawGrid},setDrawGrid:function(drawGrid){this.drawGrid=drawGrid},setColorScheme:function(colorScheme){this.colorScheme=colorScheme},setDataset:function(dataset){this.dataset=dataset,this.columnPositions.setLength(this.dataset.getColumnCount()),this.rowPositions.setLength(this.dataset.getRowCount())},getColumnPositions:function(){return this.columnPositions},getRowPositions:function(){return this.rowPositions},getPreferredSize:function(context){var w=Math.ceil(this.columnPositions.getPosition(this.columnPositions.getLength()-1)+this.columnPositions.getItemSize(this.columnPositions.getLength()-1)),h=Math.ceil(this.rowPositions.getPosition(this.rowPositions.getLength()-1)+this.rowPositions.getItemSize(this.rowPositions.getLength()-1));return{width:w,height:h}},prePaint:function(clip,context){var lastPosition=this.lastPosition,columnPositions=this.columnPositions,rowPositions=this.rowPositions,left=morpheus.Positions.getLeft(clip,columnPositions),right=morpheus.Positions.getRight(clip,columnPositions),top=morpheus.Positions.getTop(clip,rowPositions),bottom=morpheus.Positions.getBottom(clip,rowPositions);(this.invalid||left!==lastPosition.left||right!==lastPosition.right||top!==lastPosition.top||bottom!==lastPosition.bottom)&&(lastPosition.right=right,lastPosition.left=left,lastPosition.top=top,lastPosition.bottom=bottom,this.invalid=!0)},postPaint:function(clip,context){morpheus.CanvasUtil.resetTransform(context);var project=this.project;context.strokeStyle="Grey",context.lineWidth=1;var rowPositions=this.getRowPositions(),columnPositions=this.getColumnPositions();if(project.getHoverColumnIndex()>=0||project.getHoverRowIndex()>=0){var height=rowPositions.getItemSize(project.getHoverColumnIndex()),width=columnPositions.getItemSize(project.getHoverColumnIndex()),y=-1===project.getHoverRowIndex()?rowPositions.getPosition(rowPositions.getLength()-1):rowPositions.getPosition(project.getHoverRowIndex()),x=-1===project.getHoverColumnIndex()?columnPositions.getPosition(0):columnPositions.getPosition(project.getHoverColumnIndex());-1!==project.getHoverColumnIndex()&&context.strokeRect(x-clip.x,0,width,this.getUnscaledHeight()),-1!==project.getHoverRowIndex()&&context.strokeRect(0,y-clip.y,this.getUnscaledWidth(),height),-1!==project.getHoverColumnIndex()&&-1!==project.getHoverRowIndex()&&(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&&bottom>rowIndex&&columnIndex>=left&&right>columnIndex){var rowSize=rowPositions.getItemSize(rowIndex),py=rowPositions.getPosition(rowIndex),columnSize=columnPositions.getItemSize(columnIndex),px=columnPositions.getPosition(columnIndex);context.strokeRect(px+1.5,py+1.5,columnSize-1.5,rowSize-1.5)}})},setElementDrawCallback:function(elementDrawCallback){this._elementDrawCallback=elementDrawCallback},draw:function(clip,context){var columnPositions=this.columnPositions,rowPositions=this.rowPositions,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.translate(-clip.x,-clip.y),this._draw({left:left,right:right,top:top,bottom:bottom,context:context}),context.translate(clip.x,clip.y)},_draw:function(options){for(var left=options.left,right=options.right,top=options.top,bottom=options.bottom,context=options.context,dataset=this.dataset,columnPositions=this.columnPositions,rowPositions=this.rowPositions,colorScheme=this.colorScheme,drawGrid=this.drawGrid,elementDrawCallback=this._elementDrawCallback,seriesNameToIndex={},i=0;irow;row++)for(var rowSize=rowPositions.getItemSize(row),py=rowPositions.getPosition(row),column=left;right>column;column++){var columnSize=columnPositions.getItemSize(column),px=columnPositions.getPosition(column);if(context.fillStyle=colorScheme.getColor(row,column,dataset.getValue(row,column)),column===left){sizer=colorScheme.getSizer(),sizeBySeriesName=sizer.getSeriesName(),sizeBySeriesIndex=null!=sizeBySeriesName?seriesNameToIndex[sizeBySeriesName]:void 0,conditionSeriesIndices=[],conditions=colorScheme.getConditions().getConditions();for(var ci=0,nconditions=conditions.length;nconditions>ci;ci++)conditionSeriesIndices.push(seriesNameToIndex[conditions[ci].series])}var yoffset=0,cellRowSize=rowSize;if(void 0!==sizeBySeriesIndex){var sizeByValue=dataset.getValue(row,column,sizeBySeriesIndex);if(!isNaN(sizeByValue)){var f=sizer.valueToFraction(sizeByValue),rowDiff=rowSize-rowSize*f;yoffset=rowDiff,cellRowSize-=rowDiff}}if(conditions.length>0){for(var condition=null,ci=0,nconditions=conditions.length;nconditions>ci;ci++){var cond=conditions[ci],condValue=dataset.getValue(row,column,conditionSeriesIndices[ci]);if(!isNaN(condValue)&&cond.accept(condValue)){condition=cond;break}}if(null!==condition){context.fillRect(px,py+yoffset,columnSize,cellRowSize);var x=px+cellRowSize/2,y=py+yoffset+columnSize/2;context.fillStyle=condition.color,morpheus.CanvasUtil.drawShape(context,condition.shape,x,y,Math.min(columnSize,cellRowSize)/4),context.fill()}else context.fillRect(px,py+yoffset,columnSize,cellRowSize)}else context.fillRect(px,py+yoffset,columnSize,cellRowSize);elementDrawCallback&&elementDrawCallback(context,dataset,row,column,px,py,columnSize,rowSize)}if(drawGrid){context.strokeStyle=morpheus.HeatMapElementCanvas.GRID_COLOR,context.lineWidth=.1;for(var row=top;bottom>row;row++)for(var rowSize=rowPositions.getItemSize(row),py=rowPositions.getPosition(row),column=left;right>column;column++){var columnSize=columnPositions.getItemSize(column),px=columnPositions.getPosition(column),grid=drawGrid&&columnSize>10&&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;if("INPUT"!=tagName&&"SELECT"!=tagName&&"TEXTAREA"!=tagName){var found=!1,commandKey=morpheus.Util.IS_MAC?e.metaKey:e.ctrlKey,shiftKey=(e.altKey,e.shiftKey);if(commandKey&&65===e.which){var active=controller.getActiveComponent();if(-1!==active){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;count>i;i++)indices.add(i);selectionModel.setViewIndices(indices,!0),found=!0}}else if(61===e.which||187===e.which||107===e.which)controller.zoom(!0),found=!0;else if(173===e.which||189===e.which||109===e.which)controller.zoom(!1),found=!0;else if(35===e.which)controller.scrollLeft(controller.heatmap.getPreferredSize().width),controller.scrollTop(controller.heatmap.getPreferredSize().height),found=!0;else if(36===e.which)controller.scrollLeft(0),controller.scrollTop(0),found=!0;else if(34===e.which){var pos=controller.scrollTop();controller.scrollTop(pos+controller.heatmap.getUnscaledHeight()-2),found=!0}else if(33===e.which){var pos=controller.scrollTop();controller.scrollTop(pos-controller.heatmap.getUnscaledHeight()+2),found=!0}else 38===e.which?(commandKey?controller.scrollTop(0):controller.scrollTop(controller.scrollTop()-8),found=!0):40===e.which?(commandKey?controller.scrollTop(controller.heatmap.getPreferredSize().height):controller.scrollTop(controller.scrollTop()+8),found=!0):37===e.which?(commandKey?controller.scrollLeft(0):controller.scrollLeft(controller.scrollLeft()-8),found=!0):39===e.which?(commandKey?controller.scrollLeft(controller.heatmap.getPreferredSize().width):controller.scrollLeft(controller.scrollLeft()+8),found=!0):commandKey&&(83===e.which?(shiftKey?morpheus.HeatMap.showTool(new morpheus.SaveDatasetTool,controller):morpheus.HeatMap.showTool(new morpheus.SaveImageTool,controller),found=!0):79===e.which?(morpheus.HeatMap.showTool(new morpheus.OpenFileTool,controller),found=!0):70===e.which?(controller.getToolbarElement().find(e.shiftKey?"[data-name=searchColumns]":"[data-name=searchRows]").focus(),found=!0):88===e.which&&(morpheus.HeatMap.showTool(new morpheus.NewHeatMapTool,controller),found=!0));return found?(e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation(),!1):void 0}},$keyelement=controller.$content;$keyelement.on("keydown",keydown),$keyelement.on("dragover.morpheus dragenter.morpheus",function(e){e.preventDefault(),e.stopPropagation()}).on("drop.morpheus",function(e){if(e.originalEvent.dataTransfer&&e.originalEvent.dataTransfer.files.length){e.preventDefault(),e.stopPropagation();var files=e.originalEvent.dataTransfer.files;morpheus.HeatMap.showTool(new morpheus.OpenFileTool({file:files[0]}),controller)}}),$keyelement.on("paste.morpheus",function(e){var tagName=e.target.tagName;if("INPUT"!=tagName&&"SELECT"!=tagName&&"TEXTAREA"!=tagName){var text=e.originalEvent.clipboardData.getData("text/plain");if(null!=text&&text.length>0){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("
    ")),$search.appendTo($el.find("[data-name=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.ChartTool2({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.$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;length>i;i++){var index=project.convertModelColumnIndexToView(modelIndices[i]);-1!==index&&viewIndices.push(index)}viewIndices.sort(function(a,b){return b>a?-1:1}),this.columnSearchResultViewIndicesSorted=viewIndices,this.currentColumnSearchIndex=-1}else{for(var viewIndices=[],modelIndices=this.rowSearchResultModelIndices,i=0,length=modelIndices.length;length>i;i++){var index=project.convertModelRowIndexToView(modelIndices[i]);-1!==index&&viewIndices.push(index)}viewIndices.sort(function(a,b){return b>a?-1:1}),this.rowSearchResultViewIndicesSorted=viewIndices,this.currentRowSearchIndex=-1}},next:function(isColumns){var controller=this.controller;isColumns?(this.currentColumnSearchIndex++,this.currentColumnSearchIndex>=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(-1===matches?$searchResults.html(""):$searchResults.html(matches+" match"+(1===matches?"":"es")),0>=matches){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;ii;i++){var viewIndex=searchResultViewIndices[i];searchResultsModelIndices.push(isRows?project.convertViewRowIndexToModel(viewIndex):project.convertViewColumnIndexToModel(viewIndex))}if(null!==searchResultViewIndices&&isMatchesOnTop){var key=new morpheus.MatchesOnTopSortKey(project,searchResultsModelIndices,"matches on top");sortKeys=sortKeys.filter(function(key){return!(key instanceof morpheus.MatchesOnTopSortKey)}),searchResultViewIndices=key.indices,sortKeys.splice(0,0,key),isRows?project.setRowSortKeys(sortKeys,!1):project.setColumnSortKeys(sortKeys,!1)}var searchResultsViewIndicesSet=new morpheus.Set;if(null!=searchResultViewIndices)for(var i=0,length=searchResultViewIndices.length;length>i;i++){var viewIndex=searchResultViewIndices[i];searchResultsViewIndicesSet.add(viewIndex)}null==searchResultViewIndices&&(searchResultViewIndices=[]),isRows?(this.rowSearchResultModelIndices=searchResultsModelIndices,this.rowSearchResultViewIndicesSorted=searchResultViewIndices.sort(function(a,b){return b>a?-1:1}),this.currentRowSearchIndex=-1):(this.columnSearchResultModelIndices=searchResultsModelIndices,this.columnSearchResultViewIndicesSorted=searchResultViewIndices.sort(function(a,b){return b>a?-1:1}),this.currentColumnSearchIndex=-1),(isRows?project.getRowSelectionModel():project.getColumnSelectionModel()).setViewIndices(searchResultsViewIndicesSet,!0),isMatchesOnTop&&(isRows?project.setRowSortKeys(morpheus.SortKey.keepExistingSortKeys(sortKeys,project.getRowSortKeys()),!0):project.setColumnSortKeys(morpheus.SortKey.keepExistingSortKeys(sortKeys,project.getColumnSortKeys()),!0)),this.updateDimensionsLabel(),this.updateSelectionLabel(),this.searching=!1},isSelectionOnTop:function(isColumns){var $btn=isColumns?this.$columnMatchesToTop:this.$rowMatchesToTop;return $btn.hasClass("btn-primary")},setSelectionOnTop:function(options){if(options.updateButtonStatus){var $btn=options.isColumns?this.$columnMatchesToTop:this.$rowMatchesToTop;options.isOnTop?$btn.addClass("btn-primary"):$btn.removeClass("btn-primary")}var project=this.controller.getProject(),sortKeys=options.isColumns?project.getColumnSortKeys():project.getRowSortKeys();if(sortKeys=sortKeys.filter(function(key){return key instanceof morpheus.SpecifiedModelSortOrder&&"dendrogram"===key.name}),options.isOnTop){var key=new morpheus.MatchesOnTopSortKey(project,options.isColumns?this.columnSearchResultModelIndices:this.rowSearchResultModelIndices,"matches on top");sortKeys.splice(0,0,key),options.isColumns?this.controller.scrollLeft(0):this.controller.scrollTop(0)}this.searching=!0,options.isColumns?project.setColumnSortKeys(sortKeys,!0):project.setRowSortKeys(sortKeys,!0),this._updateSearchIndices(options.isColumns),this.searching=!1}},morpheus.HeatMapTooltipProvider=function(heatMap,rowIndex,columnIndex,options,separator,quick,tipText){var dataset=heatMap.project.getSortedFilteredDataset();if(quick||options.value&&_.each(options.value,function(pair){if(tipText.length>0&&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("")}),-1!==rowIndex&&-1!==columnIndex){for(var i=0,nseries=dataset.getSeriesCount();nseries>i;i++)morpheus.HeatMapTooltipProvider._matrixValueToString(dataset,rowIndex,columnIndex,i,tipText,separator,options.showSeriesNameInTooltip||i>0);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&&(-1!==rowIndex&&morpheus.HeatMapTooltipProvider._tracksToString(heatMap.rowTracks.filter(function(t){return t.settings.inlineTooltip&&options.name!==t.getName()}),dataset.getRowMetadata(),rowIndex,tipText,separator),-1!==columnIndex&&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=-1!==rowIndex?dataset.getRowMetadata():dataset.getColumnMetadata(),vector=metadata.getByName(options.name),track=heatMap.getTrack(options.name,-1!==columnIndex),colorByName=null!=track?track.settings.colorByField:null,additionalVector=null!=colorByName?metadata.getByName(colorByName):null;morpheus.HeatMapTooltipProvider.vectorToString(vector,-1!==rowIndex?rowIndex:columnIndex,tipText,separator,additionalVector)}}else-1!==rowIndex&&morpheus.HeatMapTooltipProvider._metadataToString(options,heatMap.rowTracks,dataset.getRowMetadata(),rowIndex,tipText,separator),-1!==columnIndex&&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.formatObject(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;nkeys>i;i++){var key=keys[i];if("__v"!==key){var v=morpheus.Util.formatObject(obj[key]);tipText.length>0&&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.formatObject(subVal)),tipText.push(""))})}else tipText.push(": "),tipText.push(morpheus.Util.formatObject(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.formatObject(primaryVal)),tipText.push("")}}},morpheus.HeatMapTooltipProvider._tracksToString=function(tracks,metadata,index,tipText,separator){for(var i=0;ii;i++){var track=tracks[i];track.isVisible()&&track.isShowTooltip()&&(tracks[i].name===options.name?filtered.splice(0,0,track):filtered.push(track))}morpheus.HeatMapTooltipProvider._tracksToString(filtered,metadata,index,tipText,separator)},morpheus.HeatMapTooltipProvider._nodesToString=function(tipText,nodes,color,separator){var renderField=function(name,value){if(null!=value){if(tipText.length>0&&tipText.push(separator),color&&tipText.push(''),tipText.push(name),tipText.push(": "),_.isArray(value))for(var i=0;i0&&tipText.push(", "),tipText.push(morpheus.Util.formatObject(value[i]));else tipText.push(morpheus.Util.formatObject(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(-1!==that.panStartSelectedIndex){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||-1===that.selectedIndex||(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;length>i;i++){var pix=this.fractionToStopPix(this.fractions[i]),start=pix-this.stopHalfSize,end=pix+this.stopHalfSize;if(position.x>=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;length>i;i++){var item=menuItems[i];item.header?html.push('"):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){-1!==this.project.getHoverRowIndex()&&(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;length>i;i++)context.lineTo(x[i],y[i]);context.stroke()}},morpheus.Util.extend(morpheus.RowDendrogram,morpheus.AbstractDendrogram),morpheus.ScentedSearch=function(model,positions,isVertical,scrollbar,controller){morpheus.AbstractCanvas.call(this,!1),this.model=model,this.positions=positions,this.isVertical=isVertical,this.scrollbar=scrollbar,this.controller=controller,this.searchIndices=[],scrollbar.decorator=this;var _this=this,mouseMove=function(e){var indices=_this.getSearchIndices(e);document.body.style.cursor=0===indices.length?"default":"pointer",scrollbar.canvas.style.cursor=0===indices.length?"default":"pointer";var tipOptions={event:e,heatMapLens:indices.length>=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;length>i;i++){var midVal=this.positions.getPosition(indices[i])*scale;Math.abs(midVal-pix)<=tolerance&&matches.push(indices[i])}return matches},getIndexForPix:function(pix){var indices=this.searchIndices;if(null==indices)return-1;var tolerance=morpheus.ScentedSearch.LINE_HEIGHT;if(this.mouseMovedIndex>0){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;high>=low;){var mid=low+high>>1,midVal=this.positions.getPosition(indices[mid])*scale,cmp=0;if(Math.abs(midVal-pix)<=tolerance?cmp=0:pix>midVal?cmp=-1:midVal>pix&&(cmp=1),0>cmp)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=0>index?"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):!1},update:function(){this.searchIndices=this.model.getViewIndices().values().sort(function(a,b){return b>a?-1:1})},draw:function(clip,context){var width=this.scrollbar.getUnscaledWidth(),height=this.scrollbar.getUnscaledHeight(),availableLength=(this.isVertical?height:width)-morpheus.ScentedSearch.LINE_HEIGHT;this.scale=availableLength/(this.positions.getPosition(this.positions.getLength()-1)+this.positions.getItemSize(this.positions.getLength()-1)),context.strokeStyle="rgb(106,137,177)",context.fillStyle="rgb(182,213,253)",context.lineWidth=1,this.drawIndices(context,this.searchIndices),this.drawHoverMatchingValues(context)},drawHoverMatchingValues:function(context){var heatmap=this.controller;if(context.fillStyle="black",heatmap.mousePositionOptions&&null!=heatmap.mousePositionOptions.name){var isColumns=!this.isVertical,track=heatmap.getTrack(heatmap.mousePositionOptions.name,isColumns);if(null==track)return;if(track.settings.highlightMatchingValues){var hoverIndex=isColumns?heatmap.getProject().getHoverColumnIndex():heatmap.getProject().getHoverRowIndex();if(-1===hoverIndex)return;var vector=track.getVector(),value=vector.getValue(hoverIndex),valueToModelIndices=track.getFullVector().getProperties().get(morpheus.VectorKeys.VALUE_TO_INDICES);if(!valueToModelIndices){var fullVector=track.getFullVector();valueToModelIndices=morpheus.VectorUtil.createValueToIndicesMap(fullVector),fullVector.getProperties().set(morpheus.VectorKeys.VALUE_TO_INDICES,valueToModelIndices)}var modelIndices=valueToModelIndices.get(value);if(null==modelIndices)return void console.log("valueToModelIndices error");for(var scale=this.scale,lineLength=this.isVertical?this.scrollbar.getUnscaledWidth():this.scrollbar.getUnscaledHeight(),isVertical=this.isVertical,positions=this.positions,project=heatmap.getProject(),i=0,length=modelIndices.length;length>i;i++){var modelIndex=modelIndices[i],index=isVertical?project.convertModelRowIndexToView(modelIndex):project.convertModelColumnIndexToView(modelIndex);if(-1!==index){var pix=positions.getPosition(index)*scale;isVertical?context.fillRect(0,pix,lineLength,morpheus.ScentedSearch.LINE_HEIGHT):context.fillRect(pix,0,morpheus.ScentedSearch.LINE_HEIGHT,lineLength)}}}}},drawIndices:function(context,highlightedIndices){for(var scale=this.scale,lineLength=this.isVertical?this.scrollbar.getUnscaledWidth():this.scrollbar.getUnscaledHeight(),isVertical=this.isVertical,positions=this.positions,i=0,length=highlightedIndices.length;length>i;i++){var index=highlightedIndices[i],pix=positions.getPosition(index)*scale;isVertical?(context.beginPath(),context.rect(0,pix,lineLength,morpheus.ScentedSearch.LINE_HEIGHT),context.fill(),context.stroke()):(context.beginPath(),context.rect(pix,0,morpheus.ScentedSearch.LINE_HEIGHT,lineLength),context.fill(),context.stroke())}}},morpheus.Util.extend(morpheus.ScentedSearch,morpheus.AbstractCanvas),morpheus.ScrollBar=function(isVertical){morpheus.AbstractCanvas.call(this),this.isVertical=isVertical,$(this.canvas).css("border","1px solid #d8d8d8"),isVertical?this.setBounds({width:12}):this.setBounds({height:12}),this.field=this.isVertical?"y":"x";var that=this,mouseMove=function(event){if(!morpheus.CanvasUtil.dragging){var position=morpheus.CanvasUtil.getMousePos(event.target,event,!0),mouseOver=position[that.field]>=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&&end>view){context.save();var pix=positions.getPosition(view),size=positions.getItemSize(view);isVertical?context.translate(2,pix+size/2):context.translate(pix+size/2,0),context.beginPath(),key.getSortOrder()===morpheus.SortKey.SortOrder.ASCENDING?(context.moveTo(0,0),context.lineTo(arrowWidth,arrowHeight),context.lineTo(-arrowWidth,arrowHeight)):key.getSortOrder()===morpheus.SortKey.SortOrder.DESCENDING?(context.moveTo(0,arrowHeight),context.lineTo(arrowWidth,0),context.lineTo(-arrowWidth,0)):(context.moveTo(0,0),context.lineTo(arrowWidth,arrowHeight/2),context.lineTo(0,arrowHeight),context.lineTo(-arrowWidth,arrowHeight/2)),context.fill(),context.restore()}}}}},morpheus.Util.extend(morpheus.SortByValuesIndicator,morpheus.AbstractCanvas),morpheus.SortDialog=function(project){function toggle(isColumns){_this.isColumns=isColumns;var $element=_this.build(project,isColumns);$div.empty().html($element),$div.on("click","[data-name=delete]",function(e){var $this=$(this);e.preventDefault(),$this.closest("div.row").remove()}),$div.on("click","[data-name=add]",function(e){var $this=$(this),level=[],$sibling=$this.closest("div.row");_this.createLevel(level,new morpheus.SortKey("",morpheus.SortKey.SortOrder.ASCENDING),_this.fields),$sibling.after($(level.join(""))),e.preventDefault()})}var _this=this,$chooserDiv=$('
    '),$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&&right>f)return i}return fractions.length-1},getColor:function(row,column,value){if(this.hiddenValues.has(value)&&(value=this.hiddenValue),isNaN(value))return this.missingColor;var min=this.min,max=this.max,colors=this.colors;if(min>=value)return colors[0];if(value>=max)return colors[colors.length-1];var fraction=morpheus.SteppedColorSupplier.linearScale(value,min,max,0,100)/100;return 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})},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;length>i;i++){i>0&&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(" "),text.push(columns[j].name);text.push("\n");for(var i=0;i0&&text.push(" ");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(1>=ncolumns)return response(matches);for(var i=0;ncolumns>i;i++){var field=columns[i].name;matches.push({value:field+":",label:''+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;ncolumns>j;j++){var field=columns[j].name;regex.test(field)&&matches.push({value:field+":",label:''+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;nitems>i;i++){var value=c.getter(items[i]);if(null!=value){dataType=morpheus.Util.getDataType(value);break}}"string"!==dataType&&"[string]"!==dataType||(dataTypes.push(dataType),filteredColumns.push(c))}),columns=filteredColumns,ncolumns=columns.length;for(var maxSize=matches.length+10,i=0,nitems=items.length;nitems>i;i++)for(var item=items[i],j=0;ncolumns>j;j++){var field=columns[j].name,value=columns[j].getter(item),dataType=dataTypes[j];if("[string]"===dataType)for(var nvalues=null==value?0:value.length,k=0;nvalues>k;k++){var val=value[k];if(regex.test(val)&&!set.has(val)&&(set.add(val),matches.push({value:showField?field+":"+val:val,label:showField?''+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;ii;i++){var predicate=predicates[i],filterColumnName=predicate.getField();if(null!=filterColumnName){var column=columnNameToColumn.get(filterColumnName);column&&(predicate.column=column,filteredPredicates.push(predicate))}else filteredPredicates.push(predicate)}predicates=filteredPredicates,npredicates=predicates.length;var f=function(item){for(var p=0;npredicates>p;p++){var searchColumns,predicate=predicates[p];searchColumns=predicate.column?[predicate.column]:columns;for(var j=0,ncolumns=searchColumns.length;ncolumns>j;j++){var value=searchColumns[j].getter(item);if(morpheus.Util.isArray(value)){for(var nvalues=value.length,i=0;nvalues>i;i++)if(predicate.accept(value[i]))return!0}else{var predicate=predicates[p];if(predicate.accept(value))return!0}}}return!1};this.searchFunction=f,this.grid.setFilter(this.grid.getFilter())},search:function(text){if(""===text)this.searchFunction=null,this.grid.setFilter(this.grid.getFilter());else{var tokens=morpheus.Util.getAutocompleteTokens(text),columns=this.columns.filter(function(c){return c.searchable&&c.visible||c.alwaysSearch}),columnNames=columns.map(function(c){return c.name}),predicates=morpheus.Util.createSearchPredicates({tokens:tokens,fields:columnNames});this.searchWithPredicates(predicates)}},getSelectedRows:function(){return this.grid.getSelectedRows()},getSelectedItems:function(){return this.grid.getSelectedItems()},getSelectedItem:function(){return this.grid.getSelectedItem()},setSelectedRows:function(rows){this.grid.setSelectedRows(rows)},getItems:function(items){return this.grid.getItems()},getAllItemCount:function(){return this.grid.getAllItemCount()},getFilteredItemCount:function(){return this.grid.getFilteredItemCount()},setFilter:function(f){this.grid.setFilter(f)},getFilter:function(){return this.grid.getFilter()},setItems:function(items){this.grid.setItems(items),this.grid.redraw()},redraw:function(){this.grid.redraw()},on:function(evtStr,handler){return this.grid.on(evtStr,handler),this},off:function(evtStr,handler){return this.grid.off(evtStr,handler),this},trigger:function(evtStr){this.grid.trigger(evtStr)}},morpheus.Table.createOptions=function(options){options=$.extend(!0,{},{items:[],height:"564px",collapseBreakpoint:400,showHeader:!0,select:!0,rowHeader:null,responsive:!0,fixedWidth:"320px",columnPicker:!0},options),options.columns||(options.columns=[{name:""}]);var columns=[];return options.columns.forEach(function(c,i){var column=$.extend(!0,{},{id:i,tooltip:function(dataContext,value){return morpheus.Table.defaultRenderer(dataContext,value)},formatter:function(row,cell,value,columnDef,dataContext){var html=[];return html.push('
    '),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:b>a?-1:1)},sortable:!0,searchable:!0,width:null,name:c.name,renderer:morpheus.Table.defaultRenderer},c);void 0===column.visible&&(column.visible=!0),column.getter||(column.getter=null==column.field?function(item){return item}:function(item){return item[c.field]}),columns.push(column)}),options.columns=columns,1===options.columns.length?options.tableClass="slick-table-compact":options.tableClass="slick-bordered-table",options.rowHeight||(options.rowHeight=22),options},morpheus.TableSearchUI=function(options){var _this=this,$search=$('');$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;endIndex>=i;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;index>=i;i++)viewIndices.add(i);else for(var i=Math.min(index,min),max=Math.max(index,min);max>=i;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;arrayLength>i;i++)s.push(morpheus.Util.nf(v[i]));return s.join(", ")}:"[string]"===dataType&&(formatter=function(v){var s=[];if(null!=v)for(var i=0,arrayLength=v.length;arrayLength>i;i++)s.push(v[i]);return s.join(", ")}),formatter},morpheus.VectorTrack.prototype={settingFromConfig:function(conf){var settings=this.settings;if(_.isString(conf)){settings.renderMethod={};for(var tokens=conf.split(","),i=0,length=tokens.length;length>i;i++){var method=$.trim(tokens[i]);method=method.toUpperCase();var mapped=morpheus.VectorTrack.RENDER[method];void 0!==mapped?settings.renderMethod[mapped]=!0:"DISCRETE"===method?(settings.discrete=!0,settings.discreteAutoDetermined=!0):"CONTINUOUS"===method?(settings.discrete=!1,settings.discreteAutoDetermined=!0):"HIGHLIGHT"===method?settings.highlightMatchingValues=!0:"STACKED_BAR"===method?(settings.stackedBar=!0,settings.renderMethod[morpheus.VectorTrack.RENDER.BAR]=!0):"BOX_PLOT"===method?settings.renderMethod[morpheus.VectorTrack.RENDER.BOX_PLOT]=!0:"TOOLTIP"===method?settings.inlineTooltip=!0:console.log(method+" not found.")}}else _.isNumber(conf)?(settings.renderMethod={},settings.renderMethod[conf]=!0):_.isObject(conf)&&(conf.maxTextWidth=void 0,this.settings=$.extend({},this.settings,conf));this._update()},isDiscrete:function(){return this.settings.discrete},setShowTooltip:function(value){this.settings.tooltip=value},isShowTooltip:function(){return this.settings.tooltip},isRenderAs:function(value){return this.settings.renderMethod[value]},dispose:function(){morpheus.AbstractCanvas.prototype.dispose.call(this),$(this.canvas).off("contextmenu.morpheus mousemove.morpheus mouseout.morpheus"),this.project.off(this.events,this.updateSpanMapFunction)},getName:function(){return this.name},getVector:function(name){name=null==name?this.name:name;var vector=this.isColumns?this.project.getSortedFilteredDataset().getColumnMetadata().getByName(name):this.project.getSortedFilteredDataset().getRowMetadata().getByName(name);return vector?vector:new morpheus.Vector(name,0)},getFullVector:function(){var vector=this.isColumns?this.project.getFullDataset().getColumnMetadata().getByName(this.name):this.project.getFullDataset().getRowMetadata().getByName(this.name);return vector?vector:new morpheus.Vector(this.name,0)},_updatePreferredSize:function(){var size=this._computePreferredSize();this.preferredSize.width=size.width,this.preferredSize.height=size.height},_computePreferredSize:function(forPrint){var width=0,height=0;if(this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT)||this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR))if(this.positions.getSize()>=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;length>i;i++)this.discreteValueMap.set(values[i],i+1);this.settings.min=0,this.settings.mid=0,this.settings.max=values.length},_setChartMinMax:function(){if(this.isRenderAs(morpheus.VectorTrack.RENDER.BAR)||this.isRenderAs(morpheus.VectorTrack.RENDER.BOX_PLOT))if(this.settings.stackedBar||!this.settings.discrete||this.isRenderAs(morpheus.VectorTrack.RENDER.BOX_PLOT)){if(null==this.settings.min||null==this.settings.max||null==this.settings.mid){var vector=this.getFullVector(),minMax=morpheus.VectorUtil.getMinMax(vector),min=minMax.min,max=minMax.max;if(this.settings.minMaxReversed){var tmp=max;max=min,min=tmp}null==this.settings.min&&(this.settings.min=Math.min(0,min)),null==this.settings.max&&(this.settings.max=Math.max(0,max)),null==this.settings.mid&&(this.settings.mid=this.settings.min<0?0:this.settings.min)}}else this.discreteValueMap||this._createDiscreteValueMap()},_update:function(){if(!this.settings.discreteAutoDetermined&&(this.isRenderAs(morpheus.VectorTrack.RENDER.TEXT_AND_COLOR)||this.isRenderAs(morpheus.VectorTrack.RENDER.COLOR)||this.isRenderAs(morpheus.VectorTrack.RENDER.BAR))&&((this.getFullVector().getProperties().has(morpheus.VectorKeys.FIELDS)||"number"===morpheus.VectorUtil.getDataType(this.getFullVector())||"[number]"===morpheus.VectorUtil.getDataType(this.getFullVector()))&&(this.settings.discrete=!1,this.settings.highlightMatchingValues=!1),this.settings.discreteAutoDetermined=!0),this.isRenderAs(morpheus.VectorTrack.RENDER.MOLECULE)&&this.project.off(this.events,this.updateSpanMapFunction),this._setChartMinMax(),this.isRenderAs(morpheus.VectorTrack.RENDER.MOLECULE)&&(this.project.on(this.events,this.updateSpanMapFunction),!this.moleculeCache)){this.moleculeCache={};var _this=this,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)}if(void 0!==_this.heatmap.options.structureUrlProvider)valueToModelIndices.forEach(function(indices,value){var url=_this.heatmap.options.structureUrlProvider(value),image=new Image;image.src=url,_this.moleculeCache[value]=image}),setTimeout(2e3,function(){_this.setInvalid(!0),_this.repaint()});else for(var values=valueToModelIndices.keys(),doRequest=function(smile){$.ajax({contentType:"text/plain",context:{smile:smile},data:{string:smile,representation:"sdf"},url:"http://cactus.nci.nih.gov/chemical/structure"}).done(function(text){_this.moleculeCache[this.smile]=text,values.length>0&&doRequest(values.pop()),_this.invalid=!0,_this.repaint()})},i=0;6>i;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?-1!==project.getHoverColumnIndex()&&this.drawColumnBorder(context,this.positions,project.getHoverColumnIndex(),this.getUnscaledHeight()):-1!==project.getHoverRowIndex()&&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&&-1!==hoverIndex&&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(-1!==project.getHoverColumnIndex()){var height=this.getUnscaledHeight();context.beginPath();for(var i=0,nindices=indices.length;nindices>i;i++){var viewIndex=project.convertModelColumnIndexToView(indices[i]);if(viewIndex>=start&&end>viewIndex){var size=positions.getItemSize(viewIndex),pix=positions.getPosition(viewIndex);context.rect(pix,0,size,height)}}context.stroke()}}else{context.beginPath();for(var width=this.getUnscaledWidth(),indices=valueToModelIndices.get(value),i=0,nindices=indices.length;nindices>i;i++){var viewIndex=project.convertModelRowIndexToView(indices[i]);if(viewIndex>=start&&end>viewIndex){var size=positions.getItemSize(viewIndex),pix=positions.getPosition(viewIndex);context.rect(0,pix,width,size)}}context.stroke()}}},drawSelection:function(options){var project=this.project,positions=this.positions,context=options.context,start=options.start,end=options.end;if(context.lineWidth=1,context.fillStyle=this.settings.selectionColor,this.isColumns){var height=this.getUnscaledHeight(),viewIndices=project.getColumnSelectionModel().getViewIndices();viewIndices.forEach(function(i){if(i>=start&&end>=i){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&&end>=i){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;end>i;i++){var size=positions.getItemSize(i),pix=positions.getPosition(i);size>7&&(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;end>i;i++){var size=positions.getItemSize(i),pix=positions.getPosition(i);size>7&&(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);-1!==showSelectionOnlyIndex&§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||-1===name.toLowerCase().indexOf("smile")||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(" "))}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);-1!==sortKeyIndex&&(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);-1!==groupByKeyIndex&&(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();n>i;i++)viewIndices.has(i)||inverse.add(i);model.setViewIndices(inverse,!0)}else if(item===FILTER){var filter,vector=_this.getFullVector(),index=_this.isColumns?_this.project.getColumnFilter().indexOf(vector.getName()):_this.project.getRowFilter().indexOf(vector.getName());if(-1===index){if(morpheus.VectorUtil.isNumber(vector)&&morpheus.VectorUtil.containsMoreThanNValues(vector,9))filter=new morpheus.RangeFilter(NaN,NaN,vector.getName());else{var set=morpheus.VectorUtil.getSet(vector),array=set.values();array.sort(morpheus.SortKey.ASCENDING_COMPARATOR),filter=new morpheus.VectorFilter(set,set.size(),vector.getName())}filter&&(_this.isColumns?_this.project.getColumnFilter().add(filter,!0):_this.project.getRowFilter().add(filter,!0))}_this.isColumns?_this.project.getColumnFilter().trigger("focus",{}):_this.project.getRowFilter().trigger("focus",{})}else if(item===SORT_ASC||item===SORT_DESC){var sortKey=new morpheus.SortKey(_this.name,item===SORT_ASC?morpheus.SortKey.SortOrder.ASCENDING:morpheus.SortKey.SortOrder.DESCENDING);_this.isColumns?_this.project.setColumnSortKeys(morpheus.SortKey.keepExistingSortKeys([sortKey],project.getColumnSortKeys()),!0):_this.project.setRowSortKeys(morpheus.SortKey.keepExistingSortKeys([sortKey],project.getRowSortKeys()),!0)}else if(item==SORT_SEL_ASC||item==SORT_SEL_DESC||item===SORT_SEL_TOP_N){var sortOrder;sortOrder=item===SORT_SEL_ASC?morpheus.SortKey.SortOrder.ASCENDING:item===SORT_SEL_DESC?morpheus.SortKey.SortOrder.DESCENDING:morpheus.SortKey.SortOrder.TOP_N,heatmap.sortBasedOnSelection(sortOrder,isColumns,e&&e.shiftKey)}else if(item===SELECT_ALL){for(var selectionModel=isColumns?heatmap.getProject().getColumnSelectionModel():heatmap.getProject().getRowSelectionModel(),count=isColumns?heatmap.getProject().getSortedFilteredDataset().getColumnCount():heatmap.getProject().getSortedFilteredDataset().getRowCount(),indices=new morpheus.Set,i=0;count>i;i++)indices.add(i);selectionModel.setViewIndices(indices,!0)}else if("Auto Range"===item)delete _this.settings.min,delete _this.settings.max,delete _this.settings.mid,_this._update(),heatmap.revalidate();else if("Custom Range..."===item){var formBuilder=new morpheus.FormBuilder,items=[{name:"min",required:!0,type:"number",value:_this.settings.min},{name:"mid",required:!0,type:"number",value:_this.settings.mid},{name:"max",required:!0,type:"number",value:_this.settings.max}];_.each(items,function(item){formBuilder.append(item)}),morpheus.FormBuilder.showOkCancel({title:"Range",content:formBuilder.$form,okCallback:function(){_this.settings.min=parseFloat(formBuilder.getValue("min")),_this.settings.mid=parseFloat(formBuilder.getValue("mid")),_this.settings.max=parseFloat(formBuilder.getValue("max")),_this._update(),heatmap.revalidate()}})}else if("Squished"===item)_this.settings.squished=!_this.settings.squished,heatmap.revalidate();else if("Color Key"===item){var legend=new morpheus.HeatMapTrackColorLegend([_this],isColumns?_this.project.getColumnColorModel():_this.project.getRowColorModel()),size=legend.getPreferredSize();legend.setBounds(size),legend.repaint(),morpheus.FormBuilder.showInModal({title:"Color Key",html:legend.canvas})}else if("Shape Key"===item){var legend=new morpheus.HeatMapTrackShapeLegend([_this],isColumns?_this.project.getColumnShapeModel():_this.project.getRowShapeModel()),size=legend.getPreferredSize();legend.setBounds(size),legend.repaint(),morpheus.FormBuilder.showInModal({title:"Shape Key",html:legend.canvas})}else if("Edit Shapes..."===item){var shapeModel=(new morpheus.FormBuilder,isColumns?_this.project.getColumnShapeModel():_this.project.getRowShapeModel()),chooser=new morpheus.ShapeChooser({map:shapeModel.getMap(_this.name)});chooser.on("change",function(event){shapeModel.setMappedValue(_this.getFullVector(),event.value,event.shape),_this.setInvalid(!0),_this.repaint()}),morpheus.FormBuilder.showInModal({title:"Edit Shapes",html:chooser.$div,close:"Close"})}else if("Edit Colors..."===item){var colorSchemeChooser,colorModel=isColumns?_this.project.getColumnColorModel():_this.project.getRowColorModel();_this.settings.discrete?(colorSchemeChooser=new morpheus.DiscreteColorSchemeChooser({colorScheme:{scale:colorModel.getDiscreteColorScheme(_this.getFullVector())}}),colorSchemeChooser.on("change",function(event){colorModel.setMappedValue(_this.getFullVector(),event.value,event.color),_this.setInvalid(!0),_this.repaint()})):(colorSchemeChooser=new morpheus.HeatMapColorSchemeChooser({showRelative:!1}),colorSchemeChooser.setColorScheme(colorModel.getContinuousColorScheme(_this.getFullVector())),colorSchemeChooser.on("change",function(event){_this.setInvalid(!0),_this.repaint()})),morpheus.FormBuilder.showInModal({title:"Edit Colors",html:colorSchemeChooser.$div,close:"Close",callback:function(){colorSchemeChooser.dispose()}})}else if(item===TOOLTIP)_this.settings.inlineTooltip=!_this.settings.inlineTooltip;else if(item===HIGHLIGHT_MATCHING_VALUES)_this.settings.highlightMatchingValues=!_this.settings.highlightMatchingValues;else if(customItem=_.find(customItems,function(customItem){return customItem.name===item&&customItem.columns===isColumns}))if(customItem.task){var task={tabId:_this.heatmap.getTabManager().getActiveTabId()};_this.heatmap.getTabManager().addTask(task),setTimeout(function(){try{customItem.callback(heatmap)}catch(x){}_this.heatmap.getTabManager().removeTask(task)},1)}else customItem.callback(heatmap);else if(item===DISPLAY_CONTINUOUS)_this.settings.discrete=!_this.settings.discrete,_this._setChartMinMax(),_this.setInvalid(!0),_this.repaint();else if(item===HIDE)heatmap.setTrackVisible(_this.name,!1,_this.isColumns),heatmap.revalidate();else if(item===HIDE_OTHERS){for(var names=heatmap.getVisibleTrackNames(_this.isColumns),i=0;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;end>i;i++){var array=vector.getValue(i),position=positions.getPosition(i),size=positions.getItemSize(i),_offset=offset;if(null!=array)for(var j=0;nvisibleFieldIndices>j;j++){var value=array[visibleFieldIndices[j]],color=getColor(vector,value);context.fillStyle=color,isColumns?(context.beginPath(),context.rect(position,_offset-colorBarSize,size,colorBarSize),context.fill()):(context.beginPath(),context.rect(_offset,position,colorBarSize,size),context.fill()),_offset+=colorBarSize}}}else for(var i=start;end>i;i++){var value=vector.getValue(i),position=positions.getPosition(i),size=positions.getItemSize(i),color=getColor(vector,value);context.fillStyle=color,isColumns?(context.beginPath(),context.rect(position,offset-colorBarSize,size,settings.colorBarSize),context.fill()):(context.beginPath(),context.rect(offset,position,colorBarSize,size),context.fill())}},renderShape:function(context,vector,start,end,clip,offset){var isColumns=this.isColumns,positions=this.positions,shapeModel=isColumns?this.project.getColumnShapeModel():this.project.getRowShapeModel(),settings=this.settings,canvasSize=isColumns?this.getUnscaledHeight():this.getUnscaledWidth(),colorBarSize=settings.colorBarSize;colorBarSize>canvasSize&&(colorBarSize=canvasSize>=5?canvasSize-1:canvasSize),context.fillStyle="black",context.strokeStyle="black";var lineWidth=context.lineWidth;context.lineWidth=1;for(var i=start;end>i;i++){var value=vector.getValue(i),position=positions.getPosition(i),itemSize=positions.getItemSize(i),minSize=Math.min(colorBarSize,itemSize),size2=minSize/2,shape=shapeModel.getMappedValue(vector,value),x=isColumns?position+itemSize/2:offset+size2,y=isColumns?offset-size2:position+itemSize/2;size2-=.5,morpheus.CanvasUtil.drawShape(context,shape,x,y,size2)}context.lineWidth=lineWidth},renderArc:function(context,vector,start,end,clip,size){var isColumns=this.isColumns,positions=this.positions;this.project;context.save(),context.lineWidth=1;var fill=(d3.scale.linear().domain([1,size]).range([.8,1]).clamp(!0),d3.scale.category20b()),valueToIndices=morpheus.VectorUtil.createValueToIndicesMap(vector),total=positions.getPosition(positions.getLength()-1)+positions.getItemSize(positions.getLength()-1);context.translate(clip.x,clip.y);var width=clip.width,height=clip.height;if(isColumns){var squishFactor=width/total;context.scale(squishFactor,1)}else{var squishFactor=height/total;context.scale(1,squishFactor)}start=0,end=vector.size();for(var i=start;end>i;i++){var value=vector.getValue(i);if(null!=value){context.strokeStyle=fill(value);for(var indices=valueToIndices.get(value),pix=positions.getPosition(i)+positions.getItemSize(i)/2,j=0,nindices=indices.length;nindices>j;j++){var viewIndex=indices[j];if(viewIndex!==i){var endPix=positions.getPosition(viewIndex)+positions.getItemSize(viewIndex)/2,midPix=(endPix+pix)/2,arcRadius=(Math.abs(i-viewIndex),size);isColumns?(context.beginPath(),context.moveTo(pix,arcRadius),context.quadraticCurveTo(midPix,1,endPix,arcRadius)):(context.beginPath(),context.moveTo(1,pix),context.quadraticCurveTo(arcRadius,midPix,1,endPix)),context.stroke()}}}}context.restore()},sdfToSvg:function(sdf,width,height){this.jsme||"undefined"==typeof JSApplet||(this.jsmeId=_.uniqueId("m"),this.$jsmeDiv=$('
    ').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;end>i;i++){var spanEnd=this.spanMap.get(i);if(void 0!==spanEnd){var startPix=positions.getPosition(i),endPix=positions.getPosition(spanEnd-1)+positions.getSize(),size=endPix-startPix,value=vector.getValue(i),cache=this.moleculeCache[value];if(cache)if(customUrlProvider){if(cache.complete){var scaleFactor=Math.min(size/cache.height,width/cache.width),scaledWidth=cache.width*scaleFactor,scaledHeight=cache.height*scaleFactor,diff=cache.height-scaledHeight;startPix+=diff/2;try{context.drawImage(cache,offset,startPix,scaledWidth,scaledHeight)}catch(x){}}}else{var text=this.sdfToSvg(cache,width,size);canvg(dummyTarget,text,{ignoreMouse:!0,ignoreAnimation:!0,offsetY:startPix,ignoreClear:!0,ignoreDimensions:!0})}}}},createChartScale:function(availableSpace){var domain,range;this.settings.mid!==this.settings.min&&this.settings.mid!==this.settings.max?(domain=[this.settings.min,this.settings.mid,this.settings.max],range=this.isColumns?[availableSpace,availableSpace/2,0]:[0,availableSpace/2,availableSpace]):(domain=[this.settings.min,this.settings.max],range=this.isColumns?[availableSpace,0]:[0,availableSpace]);var scale=d3.scale.linear().domain(domain).range(range).clamp(!0);return scale},renderBar:function(context,vector,start,end,clip,offset,availableSpace){var isColumns=this.isColumns,positions=this.positions;context.fillStyle=this.settings.barColor;for(var scale=this.createChartScale(availableSpace),midPix=scale(this.settings.mid),settings=this.settings,discrete=settings.discrete&&null!=this.discreteValueMap,i=start;end>i;i++){var value=vector.getValue(i);discrete&&(value=this.discreteValueMap.get(value));var position=positions.getPosition(i),size=positions.getItemSize(i),scaledValue=scale(value);isColumns?(context.beginPath(),context.rect(position,Math.min(midPix,scaledValue),size,Math.abs(midPix-scaledValue)),context.fill()):(context.beginPath(),context.rect(offset+Math.min(midPix,scaledValue),position,Math.abs(midPix-scaledValue),size),context.fill())}},renderBoxPlot:function(context,vector,start,end,clip,offset,availableSpace){var isColumns=this.isColumns,positions=this.positions;context.strokeStyle="black",context.save(),context.translate(offset,0);var scale=this.createChartScale(availableSpace),visibleFieldIndices=vector.getProperties().get(morpheus.VectorKeys.VISIBLE_FIELDS);null==visibleFieldIndices&&(visibleFieldIndices=morpheus.Util.seq(vector.getProperties().get(morpheus.VectorKeys.FIELDS).length));for(var colorByVector=null!=this.settings.colorByField?this.getVector(this.settings.colorByField):null,colorModel=isColumns?this.project.getColumnColorModel():this.project.getRowColorModel(),i=start;end>i;i++){var array=vector.getValue(i);if(null!=array){var itemSize=positions.getItemSize(i);if(3>=itemSize)continue;var radius=2,pix=positions.getPosition(i),start=pix+1,end=pix+itemSize-1,center=(start+end)/2,_itemSize=itemSize-2,lineHeight=Math.max(2,_itemSize-8),box=array.box;if(null==box){var v=morpheus.VectorUtil.arrayAsVector(array);box=morpheus.BoxPlotItem(null!=visibleFieldIndices?new morpheus.SlicedVector(v,visibleFieldIndices):v),array.box=box}if(context.fillStyle="#bdbdbd",!isColumns){context.fillRect(Math.min(scale(box.q1),scale(box.q3)),start,Math.abs(scale(box.q1)-scale(box.q3)),_itemSize),context.fillRect(Math.min(scale(box.q1),scale(box.lowerAdjacentValue)),center-lineHeight/2,Math.abs(scale(box.q1)-scale(box.lowerAdjacentValue)),lineHeight),context.fillRect(Math.min(scale(box.q3),scale(box.upperAdjacentValue)),center-lineHeight/2,Math.abs(scale(box.q3)-scale(box.upperAdjacentValue)),lineHeight),context.fillStyle="#636363";for(var j=0,length=visibleFieldIndices.length;length>j;j++){var value=array[visibleFieldIndices[j]];if(null!=value){if(null!=colorByVector){var colorByArray=colorByVector.getValue(i);if(null!=colorByArray){var color=colorModel.getMappedValue(colorByVector,colorByArray[visibleFieldIndices[j]]);context.fillStyle=color}else context.fillStyle="#636363"}var pix=scale(value);context.beginPath(),context.arc(pix,center,radius,2*Math.PI,!1),context.fill()}}}}}context.restore()},renderStackedBar:function(context,vector,start,end,clip,offset,availableSpace){var isColumns=this.isColumns,positions=this.positions,scale=this.createChartScale(availableSpace),midPix=scale(this.settings.mid),colorModel=(this.settings,isColumns?this.project.getColumnColorModel():this.project.getRowColorModel()),selectionModel=isColumns?this.project.getRowSelectionModel():null,selectedModelIndices=null==selectionModel?[]:selectionModel.toModelIndices();context.strokeStyle="black",context.lineWidth=2;for(var i=start;end>i;i++){var array=vector.getValue(i);if(null!=array){var selectedBinToCount=new morpheus.Map;if(null!=array.modelIndexToBin)for(var j=0;jj;j++){var value=array[j];value>=this.settings.mid?positivePairs.push({value:value,index:j}):0>value&&negativePairs.push({value:value,index:j})}for(var positiveIndices=morpheus.Util.indexSortPairs(positivePairs,!1),j=0,length=positiveIndices.length;length>j;j++){var index=positiveIndices[j],value=array[index],color=colorModel.getMappedValue(vector,index);context.fillStyle=color;var scaledValue=scale(value),nextScaledValue=j===length-1?midPix:scale(array[positiveIndices[j+1]]);if(isColumns?(context.beginPath(),context.rect(position,Math.min(nextScaledValue,scaledValue),size,Math.abs(nextScaledValue-scaledValue)),context.fill()):(context.beginPath(),context.rect(offset+Math.min(nextScaledValue,scaledValue),position,Math.abs(nextScaledValue-scaledValue),size),context.fill()),selectedBinToCount.has(index)){context.beginPath();var ytop=(nextScaledValue+scaledValue)/2;context.moveTo(position,ytop),context.lineTo(position+size,ytop),context.stroke()}}for(var negativeIndices=morpheus.Util.indexSortPairs(negativePairs,!0),j=0,length=negativeIndices.length;length>j;j++){var index=negativeIndices[j],value=array[index],color=colorModel.getMappedValue(vector,index);context.fillStyle=color;var scaledValue=scale(value),nextScaledValue=j===length-1?midPix:scale(array[negativeIndices[j+1]]);if(isColumns?(context.beginPath(),context.rect(position,Math.min(nextScaledValue,scaledValue),size,Math.abs(nextScaledValue-scaledValue)),context.fill()):(context.beginPath(),context.rect(offset+Math.min(nextScaledValue,scaledValue),position,Math.abs(nextScaledValue-scaledValue),size),context.fill()),selectedBinToCount.has(index)){ context.beginPath();var ytop=(nextScaledValue+scaledValue)/2;context.moveTo(position,ytop),context.lineTo(position+size,ytop),context.stroke()}}}}context.lineWidth=1},renderUnstackedBar:function(context,vector,start,end,clip,offset,availableSpace,fieldIndices){var isColumns=this.isColumns,positions=this.positions,nvalues=fieldIndices.length,colorModel=(this.settings,isColumns?this.project.getColumnColorModel():this.project.getRowColorModel());context.fillStyle=this.settings.barColor;var barSpacer=0,barWidth=(availableSpace-(nvalues-1)*barSpacer)/nvalues,colorByVector=null!=this.settings.colorByField?this.getVector(this.settings.colorByField):null;context.strokeStyle="white";for(var i=start;end>i;i++){var array=vector.getValue(i);if(null!=array)for(var position=positions.getPosition(i),itemSize=positions.getItemSize(i),scale=this.createChartScale(itemSize-1),midPix=scale(this.settings.mid),xpix=0,j=0;nvalues>j;j++){var value=array[fieldIndices[j]];if(null!=colorByVector){var colorByArray=colorByVector.getValue(i),color=colorModel.getMappedValue(colorByVector,null!=colorByArray?colorByArray[fieldIndices[j]]:null);context.fillStyle=color}var scaledValue=scale(value);if(isColumns)context.beginPath(),context.rect(Math.min(midPix,scaledValue),offset+xpix,Math.abs(midPix-scaledValue),barWidth),context.fill();else{context.beginPath();var barHeight=Math.abs(midPix-scaledValue),ypix=position+itemSize-Math.max(midPix,scaledValue);context.rect(offset+xpix,ypix,barWidth,barHeight),context.fill()}xpix+=barWidth+barSpacer}}},renderText:function(context,vector,isColor,start,end,clip,offset,canvasSize){context.textBaseline="middle";var positions=this.positions,isColumns=this.isColumns,colorModel=isColumns?this.project.getColumnColorModel():this.project.getRowColorModel();isColumns&&context.translate(clip.x,clip.y);for(var toStringFunction=morpheus.VectorTrack.vectorToString(vector),i=start;end>i;i++){var size=this.positions.getItemSize(i);if(!(6>size)){var value=vector.getValue(i);if(null!=value){value=toStringFunction(value);var position=positions.getPosition(i);isColor&&(context.fillStyle=colorModel.getMappedValue(vector,value)),isColumns?(context.save(),context.translate(position+size/2-clip.x,canvasSize-clip.y-offset),context.rotate(-Math.PI/2),context.fillText(value,0,0),context.restore()):context.fillText(value,offset,position+size/2)}}}}},morpheus.Util.extend(morpheus.VectorTrack,morpheus.AbstractCanvas),morpheus.VectorTrackHeader=function(project,name,isColumns,controller){function getResizeCursor(pos){if(isColumns){if(pos.y<3)return{cursor:"ns-resize",isPrevious:!0};if(pos.y>=_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--,-1===index&&(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(-1==index)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||0>delta&&dragOverLeft+dragOverWidth/2>=dragleft)&&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];0>delta?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);-1!=existingSortKeyIndex?(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;length>i;i++)if(existingGroupBy[i].toString()===groupBy.toString()){index=i;break}var newGroupBy=[groupBy];-1!==index&&(newGroupBy=existingGroupBy,newGroupBy.splice(index,1)),this.isColumns?this.project.setGroupColumns(newGroupBy,!0):this.project.setGroupRows(newGroupBy,!0)},setSelected:function(selected){selected!=this.selected&&(this.selected=selected,$(this.canvas).css({"background-color":this.selected?this.selectedBackgroundColor:this.backgroundColor}))},setSortingStatus:function(sortKeys,sortKey,additionalSort,isGroupBy){if(!isGroupBy)if(sortKey.getSortOrder()!=morpheus.SortKey.SortOrder.UNSORTED||additionalSort){if(additionalSort&&0==sortKeys.length&&(additionalSort=!1),additionalSort){var sortKeyIndex=this.getSortKeyIndexForColumnName(sortKeys,sortKey.toString());-1===sortKeyIndex?sortKeys.push(sortKey):sortKeys[sortKeyIndex]=sortKey}else sortKeys=[sortKey];this.setOrder(sortKeys)}else this.setOrder([]);isGroupBy?this.setGroupBy(sortKey):this.isColumns?this.project.trigger("columnSortOrderChanged"):this.project.trigger("rowSortOrderChanged")},getSortKeyIndexForColumnName:function(sortKeys,columnName){if(null!=sortKeys)for(var i=0,size=sortKeys.length;size>i;i++)if(columnName===sortKeys[i].toString())return i;return-1},print:function(clip,context){clip.height<=6||(context.textBaseline="bottom",this.isColumns?(context.textAlign="right",context.font=Math.min(this.defaultFontHeight,clip.height-morpheus.VectorTrackHeader.FONT_OFFSET)+"px "+morpheus.CanvasUtil.FONT_NAME):(context.textAlign="left",context.font=clip.height-morpheus.VectorTrackHeader.FONT_OFFSET+"px "+morpheus.CanvasUtil.FONT_NAME),context.fillStyle=morpheus.CanvasUtil.FONT_COLOR,context.fillText(this.name,0,0))},draw:function(clip,context){var sortKeys=this.getSortKeys(),name=this.name,existingSortKeyIndex=this.getSortKeyIndexForColumnName(sortKeys,name);if(morpheus.CanvasUtil.resetTransform(context),context.clearRect(0,0,this.getUnscaledWidth(),this.getUnscaledHeight()),!(this.getUnscaledHeight()<5)){this.isColumns?(context.beginPath(),context.moveTo(0,this.getUnscaledHeight()),context.lineTo(this.getUnscaledWidth(),this.getUnscaledHeight()),context.stroke(),context.textAlign="right"):(context.beginPath(),context.moveTo(this.getUnscaledWidth(),0),context.lineTo(this.getUnscaledWidth(),this.getUnscaledHeight()),context.stroke(),context.textAlign="left");var fontHeight=Math.min(this.defaultFontHeight,this.getUnscaledHeight()-morpheus.VectorTrackHeader.FONT_OFFSET),squished=this.controller.getTrack(this.name,this.isColumns).settings.squished;context.font=(squished?"Italic ":"")+fontHeight+"px "+morpheus.CanvasUtil.FONT_NAME;var textWidth=context.measureText(name).width,isColumns=this.isColumns,xpix=this.isColumns?this.getUnscaledWidth()-2:10;isColumns&&(-1!=existingSortKeyIndex&&(xpix-=6),sortKeys.length>1&&(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;2>i;i++)for(var j=0;3>j;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,-1!==existingSortKeyIndex){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;nelements-1>i;i++)result[i]={left:0,right:0,distance:0};for(j=0;nelements>j;j++)number[j]=1,clusterid[j]=j;var r={};for(n=nelements;n>1;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;js>j;j++)distmatrix[js][j]=distmatrix[is][j]*number[is]+distmatrix[js][j]*number[js],distmatrix[js][j]/=sum;for(j=js+1;is>j;j++)distmatrix[j][js]=distmatrix[is][j]*number[is]+distmatrix[j][js]*number[js],distmatrix[j][js]/=sum;for(j=is+1;n>j;j++)distmatrix[j][js]=distmatrix[j][is]*number[is]+distmatrix[j][js]*number[js],distmatrix[j][js]/=sum;for(j=0;is>j;j++)distmatrix[is][j]=distmatrix[n-1][j];for(j=is+1;n-1>j;j++)distmatrix[j][is]=distmatrix[n-1][j];number[js]=sum,number[is]=number[n-1],clusterid[js]=n-nelements-1,clusterid[is]=clusterid[n-1]}return result},morpheus.CollapseDataset=function(dataset,collapseToFields,summarizeFunction,shallowCopy){for(var vectors=[],i=0;iseries;series++)collapsedDataset.addSeries({name:dataset.getName(i),dataType:"Float32"});shallowCopy?collapsedDataset.setColumnMetadata(dataset.getColumnMetadata()):morpheus.MetadataUtil.copy(dataset.getColumnMetadata(),collapsedDataset.getColumnMetadata());for(var nfields=collapseToFields.length,collapseToVectors=[],i=0;nfields>i;i++)collapseToVectors.push(collapsedDataset.getRowMetadata().add(collapseToFields[i]));var counter=0;return idToIndices.forEach(function(rowIndices,key){for(var slice=morpheus.DatasetUtil.slicedView(dataset,rowIndices,null),view=new morpheus.DatasetColumnView(slice),series=0;nseries>series;series++){view.setSeriesIndex(series);for(var j=0,ncols=dataset.getColumnCount();ncols>j;j++)view.setIndex(j),collapsedDataset.setValue(counter,j,summarizeFunction(view),series)}for(var i=0;nfields>i;i++){var collapsedToVector=collapseToVectors[i],vector=vectors[i];collapsedToVector.setValue(counter,vector.getValue(rowIndices[0]))}counter++}),collapsedDataset},morpheus.CompleteLinkage=function(nelements,distmatrix){for(var j,n,clusterid=[],result=[],i=0;nelements-1>i;i++)result[i]={left:0,right:0,distance:0};for(j=0;nelements>j;j++)clusterid[j]=j;var r={};for(n=nelements;n>1;n--){morpheus.HCluster.findClosestPair(n,distmatrix,r),result[nelements-n].distance=r.distance;var is=r.ip,js=r.jp;for(j=0;js>j;j++)distmatrix[js][j]=Math.max(distmatrix[is][j],distmatrix[js][j]);for(j=js+1;is>j;j++)distmatrix[j][js]=Math.max(distmatrix[is][j],distmatrix[j][js]);for(j=is+1;n>j;j++)distmatrix[j][js]=Math.max(distmatrix[j][is],distmatrix[j][js]);for(j=0;is>j;j++)distmatrix[is][j]=distmatrix[n-1][j];for(j=is+1;n-1>j;j++)distmatrix[j][is]=distmatrix[n-1][j];result[nelements-n].left=clusterid[is],result[nelements-n].right=clusterid[js],clusterid[js]=n-nelements-1,clusterid[is]=clusterid[n-1]}return result},morpheus.HCluster=function(distmatrix,linkageAlgorithm){var nelements=distmatrix.length,nNodes=nelements-1;if(-1===nNodes){var root={id:0,height:0,index:0,minIndex:0,maxIndex:0,depth:0};return this.tree={maxHeight:0,rootNode:root,leafNodes:[],nLeafNodes:0},void(this.reorderedIndices=[0])}for(var tree=linkageAlgorithm(nelements,distmatrix),nodeorder=[],nodecounts=[],order=[],nodeID=[],i=0;nelements>i;i++)order[i]=i;for(var leftIds=[],rightIds=[],i=0;nNodes>i;i++){var order1,order2,counts1,counts2,ID1,ID2,min1=tree[i].left,min2=tree[i].right;if(nodeID[i]=nNodes+(i+2),0>min1){var index1=-min1-1;order1=nodeorder[index1],counts1=nodecounts[index1],ID1=nodeID[index1],tree[i].distance=Math.max(tree[i].distance,tree[index1].distance)}else order1=order[min1],counts1=1,ID1=min1;if(0>min2){var index2=-min2-1;order2=nodeorder[index2],counts2=nodecounts[index2],ID2=nodeID[index2],tree[i].distance=Math.max(tree[i].distance,tree[index2].distance)}else order2=order[min2],counts2=1,ID2=min2;leftIds[i]=ID1,rightIds[i]=ID2,nodecounts[i]=counts1+counts2,nodeorder[i]=(counts1*order1+counts2*order2)/(counts1+counts2)}for(var reorderedIndices=morpheus.HCluster.treeSort(nNodes,order,nodeorder,nodecounts,tree),idToIndex={},i=0,length=reorderedIndices.length;length>i;i++){var index=reorderedIndices[i];idToIndex[index]=i}for(var node,nodeIdToNode={},i=0,length=nodeID.length;length>i;i++){var id=nodeID[i],leftId=leftIds[i],lnode=nodeIdToNode[leftId];if(void 0===lnode){lnode={id:leftId};var index=idToIndex[leftId];lnode.index=index,lnode.minIndex=index,lnode.maxIndex=index,nodeIdToNode[lnode.id]=lnode}var rightId=rightIds[i],rnode=nodeIdToNode[rightId];if(void 0===rnode){rnode={id:rightId};var index=idToIndex[rightId];rnode.index=index,rnode.minIndex=index,rnode.maxIndex=index,nodeIdToNode[rnode.id]=rnode}node={id:id,children:[lnode,rnode],height:tree[i].distance,index:(rnode.index+lnode.index)/2},node.minIndex=Math.min(rnode.minIndex,lnode.minIndex),node.maxIndex=Math.max(rnode.maxIndex,lnode.maxIndex),lnode.parent=node,rnode.parent=node,nodeIdToNode[node.id]=node}this.reorderedIndices=reorderedIndices;for(var leafNodes=[],i=0,length=reorderedIndices.length;length>i;i++){var leaf=nodeIdToNode[reorderedIndices[i]];leaf.height=0,leafNodes.push(leaf)}morpheus.AbstractDendrogram.setNodeDepths(node),this.tree={maxHeight:node.height,rootNode:node,leafNodes:leafNodes,nLeafNodes:leafNodes.length}},morpheus.HCluster.findClosestPair=function(n,distmatrix,r){var i,j,temp,distance=distmatrix[1][0],ip=1,jp=0;for(i=1;n>i;i++)for(j=0;i>j;j++)temp=distmatrix[i][j],distance>temp&&(distance=temp,ip=i,jp=j);r.distance=distance,r.ip=ip,r.jp=jp},morpheus.HCluster.computeDistanceMatrix=function(dataset,distanceFunction){for(var matrix=[],n=dataset.getRowCount(),i=1;n>i;i++)matrix[i]=new Float32Array(i);if(0===distanceFunction)for(var i=1;n>i;i++)for(var j=0;i>j;j++)matrix[i][j]=dataset.getValue(i,j);else if(1===distanceFunction)for(var i=1;n>i;i++)for(var j=0;i>j;j++)matrix[i][j]=1-dataset.getValue(i,j);else for(var list1=new morpheus.DatasetRowView(dataset),list2=new morpheus.DatasetRowView(dataset),i=1;n>i;i++){list1.setIndex(i);for(var j=0;i>j;j++)matrix[i][j]=distanceFunction(list1,list2.setIndex(j))}return matrix},morpheus.HCluster.treeSort=function(nNodes,order,nodeorder,nodecounts,tree){var i,nElements=nNodes+1,neworder=[],clusterids=[];for(i=0;nElements>i;i++)clusterids[i]=i,neworder[i]=0;for(i=0;nNodes>i;i++){var i1=tree[i].left,i2=tree[i].right,order1=0>i1?nodeorder[-i1-1]:order[i1],order2=0>i2?nodeorder[-i2-1]:order[i2],count1=0>i1?nodecounts[-i1-1]:1,count2=0>i2?nodecounts[-i2-1]:1;if(i2>i1){var j,increase=order2>order1?count1:count2;for(j=0;nElements>j;j++){var clusterid=clusterids[j];clusterid==i1&&order1>=order2&&(neworder[j]+=increase),clusterid==i2&&order2>order1&&(neworder[j]+=increase),clusterid!=i1&&clusterid!=i2||(clusterids[j]=-i-1)}}else{var j,increase=order2>=order1?count1:count2;for(j=0;nElements>j;j++){var clusterid=clusterids[j];clusterid==i1&&order1>order2&&(neworder[j]+=increase),clusterid==i2&&order2>=order1&&(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();rows>i;i++){var originalIndex=originalIndicesForGroup[reorderedGroupIndices[i]];reorderedIndices.push(originalIndex)}morpheus.AbstractDendrogram.dfs(hcl.tree.rootNode,function(node){return node.index+=offset,node.minIndex+=offset,node.maxIndex+=offset,node.id+=offset,!0}),0===hcl.tree.leafNodes.length?tree.leafNodes=tree.leafNodes.concat([hcl.tree.rootNode]):tree.leafNodes=tree.leafNodes.concat(hcl.tree.leafNodes),root.children.push(hcl.tree.rootNode),isNaN(hcl.tree.maxHeight)||(tree.maxHeight=Math.max(tree.maxHeight,hcl.tree.maxHeight)),offset+=subset.getRowCount()}),tree.nLeafNodes=tree.leafNodes.length,tree.rootNode.height=tree.maxHeight,this.tree=tree,this.reorderedIndices=reorderedIndices},morpheus.PermutationPValues=function(dataset,aIndices,bIndices,numPermutations,f){for(var numRows=dataset.getRowCount(),scores=new Float32Array(numRows),smoothPValues=!0,list1=new morpheus.DatasetRowView(new morpheus.SlicedDatasetView(dataset,null,aIndices)),list2=new morpheus.DatasetRowView(new morpheus.SlicedDatasetView(dataset,null,bIndices)),i=0;numRows>i;i++)scores[i]=f(list1.setIndex(i),list2.setIndex(i));dataset=new morpheus.SlicedDatasetView(dataset,null,aIndices.concat(bIndices));var rowSpecificPValues=new Float32Array(numRows),permuter=new morpheus.UnbalancedPermuter(aIndices.length,bIndices.length),permutationScore=new morpheus.TwoClassPermutationScore;permutationScore.init(dataset,f);for(var permutationIndex=0;numPermutations>permutationIndex;permutationIndex++){permutationScore.setPermutation(permuter.next());for(var i=0;numRows>i;i++){var permutedScore=permutationScore.getScore(i),score=scores[i];permutedScore>=score&&rowSpecificPValues[i]++}}for(var N=numPermutations,kArray=new Uint32Array(numRows),i=0;numRows>i;i++){var k=rowSpecificPValues[i];kArray[i]=k;var p;p=smoothPValues?(k+1)/(N+2):k/N;var oneMinusP=1-p;if(p>oneMinusP&&(p=oneMinusP),p*=2,0===p){for(var val=dataset.getValue(i,0),flat=!0,j=1,cols=dataset.getColumnCount();cols>j&♭j++)dataset.getValue(i,j)!=val&&(flat=!1);flat&&(p=1)}rowSpecificPValues[i]=p}this.rowSpecificPValues=rowSpecificPValues,this.k=kArray,this.fdr=morpheus.FDR_BH(rowSpecificPValues),this.scores=scores},morpheus.PermutationPValues.prototype={getBonferroni:function(index){return Math.min(this.rowSpecificPValues[index]*this.numRows,1)}},morpheus.UnbalancedPermuter=function(numClassZero,numClassOne){function getRandomIntInclusive(min,max){return Math.floor(Math.random()*(max-min+1))+min}for(var assignments=new Uint32Array(numClassZero+numClassOne),indices=new Uint32Array(numClassZero+numClassOne),i=0;i=1;i--){var j=getRandomIntInclusive(0,i),tmp=indices[j];indices[j]=indices[i],indices[i]=tmp}for(var i=0;n>i;i++)assignments[i]=0;for(var i=0;numClassOne>i;i++)assignments[indices[i]]=1;return assignments}},morpheus.TwoClassPermutationScore=function(){this.classZeroView=null,this.classOneView=null},morpheus.TwoClassPermutationScore.prototype={getScore:function(index){return this.classZeroView.setIndex(index),this.classOneView.setIndex(index),this.f(this.classZeroView,this.classOneView)},init:function(dataset,f){this.dataset=dataset,this.classZeroView=new morpheus.DatasetRowView(dataset),this.classOneView=new morpheus.DatasetRowView(dataset),this.f=f},setPermutation:function(permutedAssignments){for(var zeroIndices=[],oneIndices=[],i=0,length=permutedAssignments.length;length>i;i++)0===permutedAssignments[i]?zeroIndices.push(i):oneIndices.push(i);this.classZeroView.setDataset(new morpheus.SlicedDatasetView(this.dataset,null,zeroIndices)),this.classOneView.setDataset(new morpheus.SlicedDatasetView(this.dataset,null,oneIndices))}},morpheus.Ranking=function(values){for(var ranks=[],i=0,length=values.length;length>i;i++)ranks.push({value:values[i],position:i});if(0===ranks.length)return[];ranks.sort(function(a,b){return a.valueranks[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;length>i;i++)data[tiesTrace[i]]=value},morpheus.Ranking.fillAverage=function(ranks,tiesTrace){var c=ranks[tiesTrace[0]],length=tiesTrace.length;morpheus.Ranking.fill(ranks,tiesTrace,(2*c+length-1)/2)},morpheus.SingleLinkage=function(nelements,distmatrix){var i,j,k,nnodes=nelements-1,temp=[],index=[],vector=[],result=[];for(i=0;nelements>i;i++)result[i]={left:0,right:0,distance:0};for(i=0;nnodes>i;i++)vector[i]=i;for(i=0;nelements>i;i++){for(result[i].distance=Number.MAX_VALUE,j=0;i>j;j++)temp[j]=distmatrix[i][j];for(j=0;i>j;j++)k=vector[j],result[j].distance>=temp[j]?(result[j].distancej;j++)result[j].distance>=result[vector[j]].distance&&(vector[j]=i)}for(i=0;nnodes>i;i++)result[i].left=i;for(result.sort(function(node1,node2){var term1=node1.distance,term2=node2.distance;return term2>term1?-1:term1>term2?1:0}),i=0;nelements>i;i++)index[i]=i;for(i=0;nnodes>i;i++)j=result[i].left,k=vector[j],result[i].left=index[j],result[i].right=index[k],index[k]=-i-1;var result2=[];for(i=0;nelements-1>i;i++)result2[i]=result[i];return result2};