From 37187ac9bf2957bd16d5483684fd0577fc844d22 Mon Sep 17 00:00:00 2001 From: jgould Date: Wed, 20 Jul 2016 09:23:40 -0400 Subject: [PATCH] tcga cluster ids --- js/morpheus-latest.min.js | 2 +- src/io/tcga_util.js | 383 ++++++++++++++++++-------------------- 2 files changed, 186 insertions(+), 199 deletions(-) diff --git a/js/morpheus-latest.min.js b/js/morpheus-latest.min.js index 7a6a1ae..a9e6671 100644 --- a/js/morpheus-latest.min.js +++ b/js/morpheus-latest.min.js @@ -1,6 +1,6 @@ "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.getDataset=function(options){function setIdAndSampleType(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));void 0!==barcode.sampleType?(idVector.setValue(i,barcode.id+"-"+barcode.sampleType),sampleType.setValue(i,barcode.sampleType)):idVector.setValue(i,barcode.id),participantId.setValue(i,barcode.id)}}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),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),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),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),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),setIdAndSampleType(dataset)),seg.resolve()})}if(options.rppa){var rppa=$.Deferred();promises.push(rppa),(new morpheus.TxtReader).read(options.rppa,function(err,dataset){err?console.log("Error reading file:"+err):(datasets.push(dataset),setIdAndSampleType(dataset)),rppa.resolve()})}if(options.methylation){var methylation=$.Deferred();promises.push(methylation),new morpheus.TxtReader({}).read(options.methylation,function(err,dataset){err?console.log("Error reading file:"+err):(datasets.push(dataset),setIdAndSampleType(dataset)),methylation.resolve()})}var mrnaClustPromise=morpheus.Util.readLines(options.mrnaClust);promises.push(mrnaClustPromise);var sampleIdToClusterId;mrnaClustPromise.done(function(lines){sampleIdToClusterId=new morpheus.Map;for(var lineNumber=0;-1!==lines[lineNumber].indexOf("SampleName");)lineNumber++;for(var tab=/\t/;lineNumbermaxColumns&&(maxColumns=datasets[i].getColumnCount(),maxIndex=i),"mutations_merged.maf"===datasets[i].getName()&&(maxColumns=Number.MAX_VALUE,maxIndex=i);var datasetIndices=[];datasetIndices.push(maxIndex);for(var i=0;ij;j++)clusterIdVector.setValue(j,sampleIdToClusterId.get(idVector.getValue(j)));if(options.mutation){var sourceToIndices=morpheus.VectorUtil.createValueToIndicesMap(datasetToReturn.getRowMetadata().getByName("Source")),mutationDataset=new morpheus.SlicedDatasetView(datasetToReturn,sourceToIndices.get("mutations_merged.maf"));(new morpheus.OpenFileTool).annotate(sigGenesLines,mutationDataset,!1,null,"id","gene",["q"]);var qVector=mutationDataset.getRowMetadata().getByName("q"),qValueVector=mutationDataset.getRowMetadata().getByName("q_value");null==qValueVector&&(qValueVector=mutationDataset.getRowMetadata().add("q_value"));for(var i=0,size=qValueVector.size();size>i;i++)qValueVector.setValue(i,qVector.getValue(i));mutationDataset.getRowMetadata().remove(morpheus.MetadataUtil.indexOf(mutationDataset.getRowMetadata(),"q"))}annotationDef&&annotationCallbacks.forEach(function(f){f(datasetToReturn)}),returnDeferred.resolve(datasetToReturn)}),returnDeferred},morpheus.TxtReader=function(options){this.options=$.extend({},{dataRowStart:1,dataColumnStart:1},options)},morpheus.TxtReader.prototype={read:function(fileOrUrl,callback){var _this=this,name=morpheus.Util.getBaseFileName(morpheus.Util.getFileName(fileOrUrl));morpheus.BufferedReader.getArrayBuffer(fileOrUrl,function(err,arrayBuffer){if(err)callback(err);else try{callback(null,_this._read(name,new morpheus.BufferedReader(new Uint8Array(arrayBuffer))))}catch(x){callback(x)}})},_read:function(datasetName,reader){var tab=/\t/,header=morpheus.Util.trim(reader.readLine()).split(tab);if(this.options.dataRowStart>1)for(var i=1;ii;i++)arrayOfRowArrays.push([]);for(;null!==(s=reader.readLine());)if(s=morpheus.Util.trim(s),""!==s){var array=new Float32Array(ncols);matrix.push(array);for(var tokens=s.split(tab),j=0;dataColumnStart>j;j++)arrayOfRowArrays[j].push(String(tokens[j]));for(var j=dataColumnStart;ncols>=j;j++){var token=tokens[j];array[j-dataColumnStart]=parseFloat(token)}}for(var dataset=new morpheus.Dataset({name:datasetName,rows:matrix.length,columns:ncols,array:matrix,dataType:"Float32"}),columnIds=dataset.getColumnMetadata().add("id"),i=0,j=dataColumnStart;ncols>i;i++,j++)columnIds.setValue(i,String(header[j]));var rowIdVector=dataset.getRowMetadata().add("id");rowIdVector.array=arrayOfRowArrays[0];for(var i=1;dataColumnStart>i;i++){var v=dataset.getRowMetadata().add(header[i]);v.array=arrayOfRowArrays[i]}return dataset}},morpheus.XlsxDatasetReader=function(){},morpheus.XlsxDatasetReader.prototype={read:function(fileOrUrl,callback){var _this=this,name=morpheus.Util.getBaseFileName(morpheus.Util.getFileName(fileOrUrl));morpheus.BufferedReader.getArrayBuffer(fileOrUrl,function(err,arrayBuffer){if(err)callback(err);else try{for(var data=new Uint8Array(arrayBuffer),arr=[],i=0;i!=data.length;++i)arr[i]=String.fromCharCode(data[i]);var bstr=arr.join("");callback(null,_this._read(name,bstr))}catch(x){callback(x)}})},_read:function(datasetName,bstr){for(var lines=morpheus.Util.xlsxTo2dArray(bstr),nrows=lines.length-1,header=lines[0],ncols=header.length-1,dataset=new morpheus.Dataset({name:datasetName,rows:nrows,columns:ncols}),columnIds=dataset.getColumnMetadata().add("id"),j=1;ncols>=j;j++)columnIds.setValue(j-1,header[j]);for(var rowIds=dataset.getRowMetadata().add("id"),i=1;i=j;j++){var token=tokens[j],value=parseFloat(token);dataset.setValue(i-1,j-1,value)}}return dataset}},morpheus.VectorAdapter=function(v){if(null==v)throw"vector is null";this.v=v},morpheus.VectorAdapter.prototype={setValue:function(i,value){this.v.setValue(i,value)},getValue:function(i){return this.v.getValue(i)},getProperties:function(){return this.v.getProperties()},size:function(){return this.v.size()},getName:function(){return this.v.getName()},setName:function(name){this.v.setName(name)}},morpheus.AbstractDataset=function(name,rows,columns){this.seriesNames=[name],this.seriesArrays=[],this.seriesDataTypes=[],this.rows=rows,this.columns=columns,this.rowMetadataModel=new morpheus.MetadataModel(rows),this.columnMetadataModel=new morpheus.MetadataModel(columns)},morpheus.AbstractDataset.prototype={setRowMetadata:function(metadata){this.rowMetadataModel=metadata},setColumnMetadata:function(metadata){this.columnMetadataModel=metadata},getName:function(seriesIndex){return this.seriesNames[seriesIndex||0]},setName:function(seriesIndex,name){this.seriesNames[seriesIndex||0]=name},getRowMetadata:function(){return this.rowMetadataModel},getColumnMetadata:function(){return this.columnMetadataModel},getRowCount:function(){return this.rows},getColumnCount:function(){return this.columns},getValue:function(rowIndex,columnIndex,seriesIndex){},setValue:function(rowIndex,columnIndex,value,seriesIndex){},addSeries:function(options){},getSeriesCount:function(){return this.seriesArrays.length},getDataType:function(rowIndex,seriesIndex){return this.seriesDataTypes[seriesIndex]},toString:function(){return this.getName()}},morpheus.SignalToNoise=function(list1,list2){var m1=morpheus.Mean(list1),m2=morpheus.Mean(list2),s1=Math.sqrt(morpheus.Variance(list1,m1)),s2=Math.sqrt(morpheus.Variance(list2,m2));return(m1-m2)/(s1+s2)},morpheus.SignalToNoise.toString=function(){return"Signal to noise"},morpheus.createSignalToNoiseAdjust=function(percent){percent=percent||.2;var f=function(list1,list2){var m1=morpheus.Mean(list1),m2=morpheus.Mean(list2),s1=Math.sqrt(morpheus.Variance(list1,m1)),s2=Math.sqrt(morpheus.Variance(list2,m2));return s1=morpheus.SignalToNoise.thresholdStandardDeviation(m1,s1,percent),s2=morpheus.SignalToNoise.thresholdStandardDeviation(m2,s2,percent),(m1-m2)/(s1+s2)};return f.toString=function(){return"Signal to noise (adjust standard deviation)"},f},morpheus.SignalToNoise.thresholdStandardDeviation=function(mean,standardDeviation,percent){var returnValue=standardDeviation,absMean=Math.abs(mean),minStdev=percent*absMean;return minStdev>standardDeviation&&(returnValue=minStdev),percent>returnValue&&(returnValue=percent),returnValue},morpheus.createContingencyTable=function(listOne,listTwo,groupingValue){(null==groupingValue||isNaN(groupingValue))&&(groupingValue=1);for(var aHit=0,aMiss=0,j=0,size=listOne.size();size>j;j++){var val=listOne.getValue(j);isNaN(val)||(val>=groupingValue?aHit++:aMiss++)}for(var bHit=0,bMiss=0,j=0,size=listTwo.size();size>j;j++){var val=listTwo.getValue(j);isNaN(val)||(val>=groupingValue?bHit++:bMiss++)}var N=aHit+aMiss+bHit+bMiss,K=aHit+bHit,n=aHit+aMiss,k=aHit,a=k,b=K-k,c=n-k,d=N+k-n-K;return[a,b,c,d]},morpheus.FisherExact=function(listOne,listTwo){var abcd=morpheus.createContingencyTable(listOne,listTwo,1);return morpheus.FisherExact.fisherTest(abcd[0],abcd[1],abcd[2],abcd[3])},morpheus.createFisherExact=function(groupingValue){var f=function(listOne,listTwo){var abcd=morpheus.createContingencyTable(listOne,listTwo,groupingValue);return morpheus.FisherExact.fisherTest(abcd[0],abcd[1],abcd[2],abcd[3])};return f},morpheus.FisherExact.phyper=function(a,b,c,d){return Math.exp(morpheus.FisherExact.logFactorial(a+b)+morpheus.FisherExact.logFactorial(c+d)+morpheus.FisherExact.logFactorial(a+c)+morpheus.FisherExact.logFactorial(b+d)-(morpheus.FisherExact.logFactorial(a)+morpheus.FisherExact.logFactorial(b)+morpheus.FisherExact.logFactorial(c)+morpheus.FisherExact.logFactorial(d)+morpheus.FisherExact.logFactorial(a+b+c+d)))},morpheus.FisherExact.logFactorials=[0,0,.6931471805599453,1.791759469228055,3.1780538303479458,4.787491742782046,6.579251212010101,8.525161361065415,10.60460290274525,12.801827480081469,15.104412573075516,17.502307845873887,19.987214495661885,22.552163853123425,25.19122118273868,27.89927138384089,30.671860106080672,33.50507345013689,36.39544520803305,39.339884187199495,42.335616460753485,45.38013889847691,48.47118135183523,51.60667556776438,54.78472939811232,58.00360522298052,61.261701761002,64.55753862700634,67.88974313718154,71.25703896716801],morpheus.FisherExact.logFactorial=function(k){if(k>=30){var C0=.9189385332046728,C1=.08333333333333333,C3=-.002777777777777778,C5=.0007936507936507937,C7=-.0005952380952380953,r=1/k,rr=r*r;return(k+.5)*Math.log(k)-k+C0+r*(C1+rr*(C3+rr*(C5+rr*C7)))}return morpheus.FisherExact.logFactorials[k]},morpheus.FisherExact.fisherTest=function(a,b,c,d){for(var p=morpheus.FisherExact.phyper(a,b,c,d),sum=p,_a=0,n=a+b+c+d;n>=_a;_a++){var _b=a+b-_a,_c=a+c-_a,_d=b+d-_b;if(_a!==a&&_b>=0&&_c>=0&&_d>=0){var _p=morpheus.FisherExact.phyper(_a,_b,_c,_d);p>=_p&&(sum+=_p)}}return Math.min(1,sum)},morpheus.FisherExact.toString=function(){return"Fisher Exact Test"},morpheus.FoldChange=function(list1,list2){var m1=morpheus.Mean(list1),m2=morpheus.Mean(list2);return m1/m2},morpheus.FoldChange.toString=function(){return"Fold Change"},morpheus.TTest=function(list1,list2){var m1=morpheus.Mean(list1),m2=morpheus.Mean(list2),s1=Math.sqrt(morpheus.Variance(list1,m1)),s2=Math.sqrt(morpheus.Variance(list2,m2)),n1=morpheus.CountNonNaN(list1),n2=morpheus.CountNonNaN(list2);return(m1-m2)/Math.sqrt(s1*s1/n1+s2*s2/n2)},morpheus.TTest.toString=function(){return"T-Test"},morpheus.Spearman=function(list1,list2){for(var flist1=[],flist2=[],i=0,n=list1.size();n>i;i++){var v1=list1.getValue(i),v2=list2.getValue(i);isNaN(v1)||isNaN(v2)||(flist1.push(v1),flist2.push(v2))}var rank1=morpheus.Ranking(flist1),rank2=morpheus.Ranking(flist2);return morpheus.Pearson(new morpheus.Vector("",rank1.length).setArray(rank1),new morpheus.Vector("",rank2.length).setArray(rank2))},morpheus.Spearman.toString=function(){return"Spearman rank correlation"},morpheus.WeightedMean=function(weights,values){for(var numerator=0,denom=0,i=0,size=values.size();size>i;i++){var value=values.getValue(i);if(!isNaN(value)){var weight=weights.getValue(i);isNaN(weight)||(numerator+=weight*value,denom+=weight)}}return 0==denom?NaN:numerator/denom},morpheus.WeightedMean.toString=function(){return"Weighted average"},morpheus.createOneMinusMatrixValues=function(dataset){var f=function(listOne,listTwo){return 1-dataset.getValue(listOne.getIndex(),listTwo.getIndex())};return f.toString=function(){return"One minus matrix values (for a precomputed similarity matrix)"},f},morpheus.Pearson=function(listOne,listTwo){for(var sumx=0,sumxx=0,sumy=0,sumyy=0,sumxy=0,N=0,i=0,size=listOne.size();size>i;i++){var x=listOne.getValue(i),y=listTwo.getValue(i);isNaN(x)||isNaN(y)||(sumx+=x,sumxx+=x*x,sumy+=y,sumyy+=y*y,sumxy+=x*y,N++)}var numr=sumxy-sumx*sumy/N,denr=Math.sqrt((sumxx-sumx*sumx/N)*(sumyy-sumy*sumy/N));return 0==denr?1:numr/denr},morpheus.Pearson.toString=function(){return"Pearson correlation"},morpheus.Jaccard=function(listOne,listTwo){for(var orCount=0,andCount=0,i=0,size=listOne.size();size>i;i++){var xval=listOne.getValue(i),yval=listTwo.getValue(i);if(!isNaN(xval)&&!isNaN(yval)){var x=xval>0,y=yval>0;x&&y?andCount++:(x||y)&&orCount++}}return 0===orCount?1:1-andCount/orCount},morpheus.Jaccard.toString=function(){return"Jaccard distance"},morpheus.Cosine=function(listOne,listTwo){for(var sumX2=0,sumY2=0,sumXY=0,i=0,size=listOne.size();size>i;i++){var x=listOne.getValue(i),y=listTwo.getValue(i);isNaN(x)||isNaN(y)||(sumX2+=x*x,sumY2+=y*y,sumXY+=x*y)}return sumXY/Math.sqrt(sumX2*sumY2)},morpheus.Cosine.toString=function(){return"Cosine similarity"},morpheus.Euclidean=function(x,y){for(var dist=0,i=0,size=x.size();size>i;++i){var x_i=x.getValue(i),y_i=y.getValue(i);isNaN(x_i)||isNaN(y_i)||(dist+=(x_i-y_i)*(x_i-y_i))}return Math.sqrt(dist)},morpheus.Euclidean.toString=function(){return"Euclidean distance"},morpheus.OneMinusFunction=function(f){var dist=function(x,y){return 1-f(x,y)};return dist.toString=function(){var s=f.toString();return"One minus "+s[0].toLowerCase()+s.substring(1)},dist},morpheus.Dataset=function(options){morpheus.AbstractDataset.call(this,options.name,options.rows,options.columns),null==options.dataType&&(options.dataType="Float32"),this.seriesArrays.push(options.array?options.array:morpheus.Dataset.createArray(options)),this.seriesDataTypes.push(options.dataType)},morpheus.Dataset.toJson=function(dataset,options){options=options||{};for(var data=[],i=0,nrows=dataset.getRowCount();nrows>i;i++){var row=[];data.push(row);for(var j=0,ncols=dataset.getColumnCount();ncols>j;j++)row[j]=dataset.getValue(i,j)}var vectorToJson=function(vector){for(var array=[],i=0,size=vector.size();size>i;i++)array[i]=vector.getValue(i);return{name:vector.getName(),array:array}},metadataToJson=function(metadata,fields){var filter,vectors=[];fields&&(filter=new morpheus.Set,fields.forEach(function(field){filter.add(field)}));for(var i=0,count=metadata.getMetadataCount();count>i;i++){var v=metadata.get(i);filter?filter.has(v.getName())&&vectors.push(vectorToJson(v)):vectors.push(vectorToJson(v))}return vectors};return{rows:dataset.getRowCount(),columns:dataset.getColumnCount(),seriesArrays:[data],seriesNames:[dataset.getName()],rowMetadataModel:{vectors:metadataToJson(dataset.getRowMetadata(),options.rowFields)},columnMetadataModel:{vectors:metadataToJson(dataset.getColumnMetadata(),options.columnFields)}}},morpheus.Dataset.fromJson=function(options){options.array=options.seriesArrays[0];var dataset=new morpheus.Dataset(options);return dataset.seriesNames=options.seriesNames,options.rowMetadataModel&&options.rowMetadataModel.vectors.forEach(function(v){var vector=new morpheus.Vector(v.name,dataset.getRowCount());vector.array=v.array,dataset.rowMetadataModel.vectors.push(vector)}),options.columnMetadataModel&&options.columnMetadataModel.vectors.forEach(function(v){var vector=new morpheus.Vector(v.name,dataset.getColumnCount());vector.array=v.array,dataset.columnMetadataModel.vectors.push(vector)}),dataset},morpheus.Dataset.createArray=function(options){var array=[];if(null==options.dataType||"Float32"===options.dataType)for(var i=0;ii;i++)for(var j=0,columns=dataset.getColumnCount();columns>j;j++){var d=dataset.getValue(i,j,seriesIndex);isNaN(d)||(min=Math.min(min,d))}return min},morpheus.DatasetUtil.slicedView=function(dataset,rows,columns){return new morpheus.SlicedDatasetView(dataset,rows,columns)},morpheus.DatasetUtil.transposedView=function(dataset){return dataset instanceof morpheus.TransposedDatasetView?dataset.getDataset():new morpheus.TransposedDatasetView(dataset)},morpheus.DatasetUtil.max=function(dataset,seriesIndex){seriesIndex=seriesIndex||0;for(var max=-Number.MAX_VALUE,i=0,rows=dataset.getRowCount();rows>i;i++)for(var j=0,columns=dataset.getColumnCount();columns>j;j++){var d=dataset.getValue(i,j,seriesIndex);isNaN(d)||(max=Math.max(max,d))}return max},morpheus.DatasetUtil.getDatasetReader=function(ext,options){var datasetReader;return"maf"===ext?(datasetReader=new morpheus.MafFileReader,options&&options.mafGeneFilter&&datasetReader.setGeneFilter(options.mafGeneFilter)):"gct"===ext?datasetReader=new morpheus.GctReader:"gmt"===ext?datasetReader=new morpheus.GmtDatasetReader:"xlsx"===ext?datasetReader=new morpheus.XlsxDatasetReader:"segtab"===ext||"seg"===ext?(datasetReader=new morpheus.SegTabReader,options&&options.regions&&datasetReader.setRegions(options.regions)):datasetReader="txt"===ext||"tsv"===ext||"csv"===ext?new morpheus.TxtReader:new morpheus.GctReader,datasetReader},morpheus.DatasetUtil.readDatasetArray=function(options){var retDef=$.Deferred(),loadedDatasets=[],promises=[];return _.each(options.dataset,function(option,i){var p=option.dataset.file?morpheus.DatasetUtil.read(option.dataset.file,option.dataset.options):morpheus.DatasetUtil.read(option.dataset);p.index=i,p.done(function(dataset){loadedDatasets[this.index]=dataset}),p.fail(function(err){var message=["Error opening "+(option.dataset.file?morpheus.Util.getFileName(option.dataset.file):morpheus.Util.getFileName(option.dataset))+"."];err.message&&(message.push("
    Cause: "),message.push(err.message)),retDef.reject(message.join(""))}),promises.push(p)}),0===promises.length&&retDef.reject("No datasets specified."),$.when.apply($,promises).then(function(){var joined;if(loadedDatasets.length>1){joined=new morpheus.JoinedDataset(loadedDatasets[0],loadedDatasets[1],"id","id");for(var i=2;ii;i++)sourceVector.setValue(i,name)}retDef.resolve(joined)}),retDef},morpheus.DatasetUtil.annotate=function(options){var retDef=$.Deferred(),promises=[],functions=[],isColumns=options.isColumns;return _.each(options.annotations,function(ann){if(morpheus.Util.isArray(ann.file))functions.push(function(dataset){(new morpheus.OpenFileTool).annotate(ann.file,dataset,isColumns,null,ann.datasetField,ann.fileField,ann.include)});else{var result=morpheus.Util.readLines(ann.file),fileName=morpheus.Util.getFileName(ann.file),deferred=$.Deferred();promises.push(deferred),result.fail(function(message){deferred.reject(message)}),result.done(function(lines){if(morpheus.Util.endsWith(fileName,".gmt")){var sets=(new morpheus.GmtReader).parseLines(lines);functions.push(function(dataset){(new morpheus.OpenFileTool).annotate(null,dataset,isColumns,sets,ann.datasetField,ann.fileField)}),deferred.resolve()}else morpheus.Util.endsWith(fileName,".cls")?(functions.push(function(dataset){(new morpheus.OpenFileTool).annotateCls(null,dataset,fileName,isColumns,lines)}),deferred.resolve()):(functions.push(function(dataset){(new morpheus.OpenFileTool).annotate(lines,dataset,isColumns,null,ann.datasetField,ann.fileField,ann.include)}),deferred.resolve())})}}),$.when.apply($,promises).then(function(){retDef.resolve(functions)}),retDef},morpheus.DatasetUtil.read=function(fileOrUrl,options){var isFile=fileOrUrl instanceof File,isString=_.isString(fileOrUrl),ext=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', +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;i 3) { sampleType = tokens[3]; if (sampleType.length > 2) { sampleType = sampleType.substring(0, 2); - } sampleType = morpheus.TcgaUtil.SAMPLE_TYPES[sampleType]; } else { sampleType = morpheus.TcgaUtil.SAMPLE_TYPES['01']; } return { - id : id.toLowerCase(), - sampleType : sampleType + id: id.toLowerCase(), + sampleType: sampleType }; }; -morpheus.TcgaUtil.getDataset = function(options) { +morpheus.TcgaUtil.setIdAndSampleType = function (dataset) { + var idVector = dataset.getColumnMetadata().get(0); + var participantId = dataset.getColumnMetadata().add('participant_id'); + var sampleType = dataset.getColumnMetadata().add('sample_type'); + for (var i = 0, size = idVector.size(); i < size; 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 = []; var datasets = []; var returnDeferred = $.Deferred(); - function splitId(dataset) { - var idVector = dataset.getRowMetadata().get(0); - for (var i = 0, size = idVector.size(); i < size; i++) { - var id = idVector.getValue(i); - var index = id.indexOf('|'); - idVector.setValue(i, id.substring(0, index)); - } - } - function setIdAndSampleType(dataset) { - var idVector = dataset.getColumnMetadata().get(0); - var participantId = dataset.getColumnMetadata().add('participant_id'); - var sampleType = dataset.getColumnMetadata().add('sample_type'); - for (var i = 0, size = idVector.size(); i < size; i++) { - var barcode = morpheus.TcgaUtil.barcode(idVector.getValue(i)); - if (barcode.sampleType !== undefined) { - idVector.setValue(i, barcode.id + '-' + barcode.sampleType); - sampleType.setValue(i, barcode.sampleType); - } else { - idVector.setValue(i, barcode.id); - } - participantId.setValue(i, barcode.id); - } - } if (options.mrna) { // id + type var mrna = $.Deferred(); promises.push(mrna); - new morpheus.TxtReader().read(options.mrna, function(err, dataset) { + new morpheus.TxtReader().read(options.mrna, function (err, dataset) { if (err) { console.log('Error reading file:' + err); } else { datasets.push(dataset); - // splitId(dataset); - setIdAndSampleType(dataset); + morpheus.TcgaUtil.setIdAndSampleType(dataset); } mrna.resolve(); }); @@ -134,18 +122,18 @@ morpheus.TcgaUtil.getDataset = function(options) { if (options.mutation) { var mutation = $.Deferred(); promises.push(mutation); - new morpheus.MafFileReader().read(options.mutation, function(err, - dataset) { + new morpheus.MafFileReader().read(options.mutation, function (err, + dataset) { if (err) { console.log('Error reading file:' + err); } else { datasets.push(dataset); - setIdAndSampleType(dataset); + morpheus.TcgaUtil.setIdAndSampleType(dataset); } mutation.resolve(); }); var sigGenesAnnotation = morpheus.Util.readLines(options.sigGenes); - sigGenesAnnotation.done(function(lines) { + sigGenesAnnotation.done(function (lines) { sigGenesLines = lines; }); promises.push(sigGenesAnnotation); @@ -154,15 +142,15 @@ morpheus.TcgaUtil.getDataset = function(options) { var gistic = $.Deferred(); promises.push(gistic); new morpheus.GisticReader().read(options.gistic, - function(err, dataset) { - if (err) { - console.log('Error reading file:' + err); - } else { - datasets.push(dataset); - setIdAndSampleType(dataset); - } - gistic.resolve(); - }); + function (err, dataset) { + if (err) { + console.log('Error reading file:' + err); + } else { + datasets.push(dataset); + morpheus.TcgaUtil.setIdAndSampleType(dataset); + } + gistic.resolve(); + }); } if (options.gisticGene) { @@ -170,14 +158,14 @@ morpheus.TcgaUtil.getDataset = function(options) { promises.push(gisticGene); new morpheus.TxtReader({ - dataColumnStart : 3 + dataColumnStart: 3 - }).read(options.gisticGene, function(err, dataset) { + }).read(options.gisticGene, function (err, dataset) { if (err) { console.log('Error reading file:' + err); } else { datasets.push(dataset); - setIdAndSampleType(dataset); + morpheus.TcgaUtil.setIdAndSampleType(dataset); } gisticGene.resolve(); }); @@ -186,12 +174,12 @@ morpheus.TcgaUtil.getDataset = function(options) { if (options.seg) { var seg = $.Deferred(); promises.push(seg); - new morpheus.SegTabReader().read(options.seg, function(err, dataset) { + new morpheus.SegTabReader().read(options.seg, function (err, dataset) { if (err) { console.log('Error reading file:' + err); } else { datasets.push(dataset); - setIdAndSampleType(dataset); + morpheus.TcgaUtil.setIdAndSampleType(dataset); } seg.resolve(); }); @@ -201,14 +189,13 @@ morpheus.TcgaUtil.getDataset = function(options) { var rppa = $.Deferred(); promises.push(rppa); - new morpheus.TxtReader().read(options.rppa, function(err, dataset) { + new morpheus.TxtReader().read(options.rppa, function (err, dataset) { if (err) { console.log('Error reading file:' + err); } else { datasets.push(dataset); - setIdAndSampleType(dataset); + morpheus.TcgaUtil.setIdAndSampleType(dataset); } - // splitId(dataset); rppa.resolve(); }); @@ -218,13 +205,13 @@ morpheus.TcgaUtil.getDataset = function(options) { // id + type var methylation = $.Deferred(); promises.push(methylation); - new morpheus.TxtReader({}).read(options.methylation, function(err, - dataset) { + new morpheus.TxtReader({}).read(options.methylation, function (err, + dataset) { if (err) { console.log('Error reading file:' + err); } else { datasets.push(dataset); - setIdAndSampleType(dataset); + morpheus.TcgaUtil.setIdAndSampleType(dataset); } methylation.resolve(); }); @@ -233,7 +220,7 @@ morpheus.TcgaUtil.getDataset = function(options) { var mrnaClustPromise = morpheus.Util.readLines(options.mrnaClust); promises.push(mrnaClustPromise); var sampleIdToClusterId; - mrnaClustPromise.done(function(lines) { + mrnaClustPromise.done(function (lines) { // SampleName cluster silhouetteValue // SampleName cluster silhouetteValue // TCGA-OR-A5J1-01 1 0.00648776228925048 @@ -246,107 +233,107 @@ morpheus.TcgaUtil.getDataset = function(options) { for (; lineNumber < lines.length; lineNumber++) { var tokens = lines[lineNumber].split(tab); var barcode = morpheus.TcgaUtil.barcode(tokens[0]); - sampleIdToClusterId.set(barcode.id, tokens[1]); + sampleIdToClusterId.set(barcode.id + '-' + barcode.sampleType, tokens[1]); } }); var annotationCallbacks = []; var annotationDef = null; if (options.columnAnnotations) { annotationDef = morpheus.DatasetUtil.annotate({ - annotations : options.columnAnnotations, - isColumns : true + annotations: options.columnAnnotations, + isColumns: true }); promises.push(annotationDef); - annotationDef.done(function(array) { + annotationDef.done(function (array) { annotationCallbacks = array; }); } $.when.apply($, promises).then( - function() { - var datasetToReturn = null; - if (datasets.length === 1) { - var sourceName = datasets[0].getName(); - var sourceVector = datasets[0].getRowMetadata().add( - 'Source'); - for (var i = 0; i < sourceVector.size(); i++) { - sourceVector.setValue(i, sourceName); - } - datasetToReturn = datasets[0]; + function () { + var datasetToReturn = null; + if (datasets.length === 1) { + var sourceName = datasets[0].getName(); + var sourceVector = datasets[0].getRowMetadata().add( + 'Source'); + for (var i = 0; i < sourceVector.size(); i++) { + sourceVector.setValue(i, sourceName); + } + datasetToReturn = datasets[0]; - } else { - var maxIndex = 0; - var maxColumns = datasets[0].getColumnCount(); - // use dataset with most columns as the reference or - // mutation data - for (var i = 1; i < datasets.length; i++) { - if (datasets[i].getColumnCount() > maxColumns) { - maxColumns = datasets[i].getColumnCount(); - maxIndex = i; - } - if (datasets[i].getName() === 'mutations_merged.maf') { - maxColumns = Number.MAX_VALUE; - maxIndex = i; - } + } else { + var maxIndex = 0; + var maxColumns = datasets[0].getColumnCount(); + // use dataset with most columns as the reference or + // mutation data + for (var i = 1; i < datasets.length; i++) { + if (datasets[i].getColumnCount() > maxColumns) { + maxColumns = datasets[i].getColumnCount(); + maxIndex = i; } - var datasetIndices = []; - datasetIndices.push(maxIndex); - for (var i = 0; i < datasets.length; i++) { - if (i !== maxIndex) { - datasetIndices.push(i); - } + if (datasets[i].getName() === 'mutations_merged.maf') { + maxColumns = Number.MAX_VALUE; + maxIndex = i; } - - var joined = new morpheus.JoinedDataset( - datasets[datasetIndices[0]], - datasets[datasetIndices[1]], 'id', 'id'); - for (var i = 2; i < datasetIndices.length; i++) { - joined = new morpheus.JoinedDataset(joined, - datasets[datasetIndices[i]], 'id', 'id'); + } + var datasetIndices = []; + datasetIndices.push(maxIndex); + for (var i = 0; i < datasets.length; i++) { + if (i !== maxIndex) { + datasetIndices.push(i); } - datasetToReturn = joined; } - var clusterIdVector = datasetToReturn.getColumnMetadata().add( - 'mRNAseq_cluster'); - var idVector = datasetToReturn.getColumnMetadata().getByName( - 'participant_id'); - for (var j = 0, size = idVector.size(); j < size; j++) { - clusterIdVector.setValue(j, sampleIdToClusterId - .get(idVector.getValue(j))); + var joined = new morpheus.JoinedDataset( + datasets[datasetIndices[0]], + datasets[datasetIndices[1]], 'id', 'id'); + for (var i = 2; i < datasetIndices.length; i++) { + joined = new morpheus.JoinedDataset(joined, + datasets[datasetIndices[i]], 'id', 'id'); } - // view in space of mutation sample ids only - if (options.mutation) { - var sourceToIndices = morpheus.VectorUtil - .createValueToIndicesMap(datasetToReturn - .getRowMetadata().getByName('Source')); - var mutationDataset = new morpheus.SlicedDatasetView( - datasetToReturn, sourceToIndices - .get('mutations_merged.maf')); - new morpheus.OpenFileTool() - .annotate(sigGenesLines, mutationDataset, false, - null, 'id', 'gene', [ 'q' ]); - var qVector = mutationDataset.getRowMetadata().getByName( - 'q'); - var qValueVector = mutationDataset.getRowMetadata() - .getByName('q_value'); - if (qValueVector == null) { - qValueVector = mutationDataset.getRowMetadata().add( - 'q_value'); - } - for (var i = 0, size = qValueVector.size(); i < size; i++) { - qValueVector.setValue(i, qVector.getValue(i)); - } + datasetToReturn = joined; + } - mutationDataset.getRowMetadata().remove( - morpheus.MetadataUtil.indexOf(mutationDataset - .getRowMetadata(), 'q')); + var clusterIdVector = datasetToReturn.getColumnMetadata().add( + 'mRNAseq_cluster'); + var idVector = datasetToReturn.getColumnMetadata().getByName( + 'id'); + for (var j = 0, size = idVector.size(); j < size; j++) { + clusterIdVector.setValue(j, sampleIdToClusterId + .get(idVector.getValue(j))); + } + // view in space of mutation sample ids only + if (options.mutation) { + var sourceToIndices = morpheus.VectorUtil + .createValueToIndicesMap(datasetToReturn + .getRowMetadata().getByName('Source')); + var mutationDataset = new morpheus.SlicedDatasetView( + datasetToReturn, sourceToIndices + .get('mutations_merged.maf')); + new morpheus.OpenFileTool() + .annotate(sigGenesLines, mutationDataset, false, + null, 'id', 'gene', ['q']); + var qVector = mutationDataset.getRowMetadata().getByName( + 'q'); + var qValueVector = mutationDataset.getRowMetadata() + .getByName('q_value'); + if (qValueVector == null) { + qValueVector = mutationDataset.getRowMetadata().add( + 'q_value'); } - if (annotationDef) { - annotationCallbacks.forEach(function(f) { - f(datasetToReturn); - }); + for (var i = 0, size = qValueVector.size(); i < size; i++) { + qValueVector.setValue(i, qVector.getValue(i)); } - returnDeferred.resolve(datasetToReturn); - }); + + mutationDataset.getRowMetadata().remove( + morpheus.MetadataUtil.indexOf(mutationDataset + .getRowMetadata(), 'q')); + } + if (annotationDef) { + annotationCallbacks.forEach(function (f) { + f(datasetToReturn); + }); + } + returnDeferred.resolve(datasetToReturn); + }); return returnDeferred; -}; \ No newline at end of file +}; -- GitLab