UNPKG

htmol

Version:

NEXT-GENERATION MOLECULAR DYNAMICS WEB VISUALIZATION

917 lines (808 loc) 72.2 kB
/* This file is part of HTMoL: Copyright (C) 2014 Dr. Mauricio Carrillo-Tripp http://tripplab.com Developers: v1.0 Leonardo Alvarez-Rivera, Francisco Javier Becerra-Toledo, Adan Vega-Ramirez v2.0 Javier Garcia-Vieyra v3.0 Omar Israel Lara-Ramirez, Eduardo González-Zavala, Emmanuel Quijas-Valades, Julio Cesar González-Vázquez v3.5 Leonardo Alvarez-Rivera */ var htmolver="v3.5" var zoom,data,MainMenu; var worker1; var sizeglob=0; var url; var totalframes=0; var totalframes1=0; var numframe=0; var trjbnd=false; var bitrate=0; var readstart=0; var readend=mxSize; var requireddata=false; var pos=0; var bndarray=true; var bndbuffer=0; var bndfinal=false; var bndknowframe=false; var bndreview=false; var sizearrayp=0; var trjauto=false; var autoload=true; var fpath; var bsip="69.69.69.69"; var bslat=69; var bslon=69; var bsCont="NA"; var bsPais="NA"; var bsCd="NA"; var bscurrentdate = new Date(); var bsdatetime = "69/69/69 69:69"; function Main() { //var prr= //"-0.008575 0.018675 0.000000 0.008375 0.018675 0.000000 -0.000100 0.022200 0.000000 0.011900 0.010200 0.000000 -0.012100 0.010200 0.000000 -0.008575 0.001725 0.000000 0.008375 0.001725 0.000000 -0.000100 -0.001800 0.000000" //; //alert(prr.replace(/[ ,]+/g, ",")); //-----------------------------------Bloque inicial para declarar el worker---------------------------------- console.log("entered main"); console.log("WebIP="+WebIP+" NodePort="+NodePort+" trjFormat="+trjFormat); if (typeof(Worker)=="undefined") { alert("HTMoL: Alert. Workers not supported"); } else { UserInfo.getInfo(function(data) { // the "data" object contains the BinaryClient info bsip=data.ip_address; bslat=data.position.latitude; bslon=data.position.longitude; bsCont=data.continent.name; bsPais=data.country.name; bsCd=data.city.name; }, function(err) { // the "err" object contains useful information in case of an error }); var bsdatetime = "" + bscurrentdate.getDate() + "/" + (bscurrentdate.getMonth()+1) + "/" + bscurrentdate.getFullYear() + " @ " + bscurrentdate.getHours() + ":" + bscurrentdate.getMinutes() + ":" + bscurrentdate.getSeconds(); //Para modificar worker1.js y evitar caché var marcaTime = parseInt(Math.random() * 1000000); worker1 = new Worker("js/worker.js?=" + marcaTime); worker1.postMessage = worker1.webkitPostMessage || worker1.postMessage; worker1.onerror= function(e){ data.innerHTML="HTMoL: "+e.message; } worker1.addEventListener("message", manejadorEventoWorker1, false); } //---------------------------------------------------------------------------------------------------------------- var main=this; this.ObjP= new Process(); //-------------------------- molecule=this.ObjP.ReadFile(PDBDIR+pdbInicial); var about="<a href='http://htmol.tripplab.com/' target='_blank' style='color:orange;font-weight: bold;'>HTMoL</a>"; // Please do not change nor remove info.innerHTML=about+htmolver+": "+pdbInicial+" ("+molecule.LstAtoms.length+" atoms)"; // info.innerHTML=molecule.LstAtoms.length+" atoms"; createBonds(this); initCamera(CzPers); // Set initial view UserSetView(molecule, 'FrontView'); //--------------------------- //AtomosSeleccionados=molecule.LstAtoms; var Container=null; var buffer = new ArrayBuffer(); this.DeleteButtons = function() { for(var i=0; i<LstBtnsChain.length;i++) { menu.removeChild(LstBtnsChain[i]); } LstBtnsChain=[]; } this.Buttons=function() { //se cargan los botones de las Cadenas for(var i=0; i<molecule.LstChain.length; i++) { var chain = molecule.LstChain[i]; var button = document.createElement('input'); button.type="button"; button.value=chain.Name; button.id=chain.Name; button.onclick=ProcesarCadena(i,button); if (button.value!="undefined") { menu.appendChild(button); LstBtnsChain.push(button); } } //se cargan las funciones para la selección por átomos for(var i=0;i < LstAtoms.length; i++) //LstAtoms se encuentra en el support.js { var op=LstAtoms[i]; var an = document.getElementById(op ); an.onclick=ByAtoms(molecule,op); } for(var i=0;i < LstAminoacid.length; i++) { var op=LstAminoacid[i]; var an = document.getElementById(op); try{ an.onclick=ByAmino(molecule,op); } catch(err) { } } for(var i in LstViews) { var op = LstViews[i]; var an = document.getElementById(op.name); an.onclick=SetView(molecule,op); } /* for(var i=0; i< LstColors.length; i++) { var op=LstColors[i]; var an = document.getElementById(op); an.onclick=ByColor(molecule,op); }*/ //para el centrado por átom var an = document.getElementById('Center'); an.onclick=CenterByAtom(); an = document.getElementById('Distance'); //afecta el picking an.onclick=Distance(); an = document.getElementById('Angle'); //afecta el picking an.onclick=Angle(); an = document.getElementById('None2'); //para borrar las anteriores, también afecta el picking an.onclick=None(); an = document.getElementById('DeleteMeasures'); //para borrar las anteriores, también afecta el picking an.onclick=DeleteMeasures(); an = document.getElementById('Axis'); an.onclick=Axis(); an = document.getElementById('None1'); an.onclick=NoAtomCenter(); } this.CleanScene=function() { console.log("CleanScene"); cleanMemory(); //se limpian los botones de la dinámica var button=document.getElementById("playpause"); var reg=document.getElementById("Rew"); var forw=document.getElementById("Forw"); button.style.display="none"; reg.style.display="none"; forw.style.display="none"; DinamicaActiva=false; coordsX=[[]]; coordsY=[[]]; coordsZ=[[]]; pos=0; numframe=0; ////////////////////////// //para limpiar los dígitos var newRotationMatrix = mat4.create(); mat4.identity(newRotationMatrix); mat4.rotate(newRotationMatrix, degToRad(0), [0, 1, 0]); //vista frontal // mat4.rotate(newRotationMatrix, degToRad(270), [0, 0, 1]); //vista frontal 0 // mat4.rotate(newRotationMatrix, degToRad(270), [0, 1, 0]); //vista frontal 0 mat4.identity(RotationMatrix); mat4.multiply(newRotationMatrix, RotationMatrix, RotationMatrix); hayseleccionado=false; ArrayIndx=[0]; var u_Array = gl.getUniformLocation(program, 'uIntArray'); gl.uniform1fv(u_Array, ArrayIndx); ArrayIndx.pop(); main.DeleteButtons(); } this.MakeModel=function(url) { main.CleanScene(); molecule=main.ObjP.ReadFile(url); // info.innerHTML="HTMoLv3.5: "+url+" ("+molecule.LstAtoms.length+" atoms)"; info.innerHTML=molecule.LstAtoms.length+" atoms"; createBonds(main); initCamera(CzPers); if (RepresentacionInicial=='SpheresBonds') { InitBufSB(); } else if(RepresentacionInicial=='Bonds') { InitBufBonds(); } else if(RepresentacionInicial=='VDW') { InitBufVDW(); } main.Buttons(); if(molecule!=null) { data.innerHTML="HTMoL3: Loading..."; window.setTimeout(function(){ if(main.ObjP.Model.Frames!=0 && main.ObjP.Model.Frames!="") { main.filerequest(); //console.log("HTMoL3: "+trjauto); trjauto=true; autoplay=false; //console.log("HTMoL3: "+trjauto); DinamicaActiva=true; } data.innerHTML=""; },100); } else{ data.innerHTML="HTMoL3: Error (Main.js). Invalid URL or Connection not available."; } } this.Parse=function(txt) // Parsing commands in the console { var comando=txt.substr(0, txt.indexOf(" ")).toLowerCase();//obtengo la primer palabra que es un comando //luego voy a obtener todo lo demás que va a ser la instrucción var lines=txt.split(" "); var inst=txt.replace(comando + ' ',''); if (comando == 'select') { EliminarSeleccion(); //alert("comando select"); //obtener todo lo demás antes del ; //alert(inst); //alert(inst.length); var numAtoms=0; //var regex = /(\d+)/g; //alert(inst.match(regex)); //alert(AtomosSeleccionados.length); if (inst=='none') { EliminarSeleccion(); } else if (inst=='all') { AtomosSeleccionados=molecule.LstAtoms; } else { //script=inst.match(regex); var arrComa = inst.split(","); //alert(arrComa.length); var allselect=false; for(var i=0; i<arrComa.length; i++) { var ele=arrComa[i]; var n=ele.indexOf("-"); var m=ele.indexOf(":") if (n>(-1)) //quiere decir que es un rango ejemplo 34-38 { //alert("rango"); var arr2=ele.split("-"); var rng1 = parseInt(arr2[0]); var rng2 = parseInt(arr2[1]); if (!isNaN(rng1) && !isNaN(rng2)) { //alert("los dos son numeros"); if (rng1>0 && rng1 <= molecule.LstAtoms.length && rng2>0 && rng2 <= molecule.LstAtoms.length) { if (rng2 < rng1) { for(var j=rng2; j<=rng1; j++) { AtomosSeleccionados.push(molecule.LstAtoms[j - 1]); } } else { for(var j=rng1; j<=rng2; j++) { AtomosSeleccionados.push(molecule.LstAtoms[j - 1]); } } } } } else if(m>(-1)) //quiere decir que es un grupo ejemplo 0:45:A { var arr3=ele.split(":"); if (arr3.length==3) //quiere decir que sì tiene bien las tres partes { //0:2:1 //N:6:2 //Voy a poner todos los casos if (arr3[0]==0) //todos los àtomos del aminoàciodo { if (arr3[1]==0) //todos los aminoácidos { if (arr3[2]==0) //todos los átomos de la molécula { allselect=true; } else //todos los atomos de una cadena { //primero checar si es un numero la cadena, entonces sera por index if (!isNaN(arr3[2])) //es un indice { if (arr3[2]>0 && arr3[2]<=molecule.LstChain.length) //entonces esta en el rango { var cha=molecule.LstChain[arr3[2]-1]; for(var j=0; j<cha.LstAminoacid.length;j++) { var amin=cha.LstAminoacid[j]; for(var z=0; z<amin.LstAtoms.length;z++) { AtomosSeleccionados.push(amin.LstAtoms[z]); } } } else { //la cadena no esta dentro del indice } } else //si no la cadena es por nombre { //tengo que buscarlo por la letra for(var j=0;j<molecule.LstChain.length; j++) { if (arr3[2]==molecule.LstChain[j].Name.replace(" ", "") ) { //procesalo y salte del for var cha=molecule.LstChain[j]; for(var k=0; k<cha.LstAminoAcid.length;k++) { var amin=cha.LstAminoAcid[k]; for(var z=0; z<amin.LstAtoms.length;z++) { AtomosSeleccionados.push(amin.LstAtoms[z]); } } break; //checar si esta bien esta instruccion } } } } } else //en esta parte quiere decir que sí se ha especificado el aminoácido { //en esta parte el aminoácido if (!isNaN(arr3[1])) //el aminoácido es un índice pero hay que buscarlo { if (arr3[2]==0) //de todas las cadenas { //para buscar el aminoacido en todas las cadenas for(var k=0; k<molecule.LstChain.length; k++) { var caden = molecule.LstChain[k]; for(var t=0; t< caden.LstAminoAcid.length; t++) { var amin = caden.LstAminoAcid[t]; //alert("length:"+amin.Number.replace(" ", "").length) //alert("length:"+arr3[1].replace(" ", "").length) if (parseInt(arr3[1]) == parseInt(amin.Number)) { for(var v=0; v<amin.LstAtoms.length; v++) { AtomosSeleccionados.push(amin.LstAtoms[v]); } break; //quiere decir que lo encontré en esa cadena } } } } else //de una cadena la cadena puede ser por indice o por letra { if (!isNaN(arr3[2])) //es un indice { //los indices en la cadena son como aparecen en la lista if (arr3[2]>0 && arr3[2] <= molecule.LstChain.length) //para saber que si esta en el rango { var cha = molecule.LstChain[arr3[2]-1]; //ya encontre la cadena //ahora busco en todos los aminoacidos de esta cadena for(var t=0; t< cha.LstAminoAcid.length; t++) { var amin = cha.LstAminoAcid[t]; //alert("length:"+amin.Number.replace(" ", "").length) //alert("length:"+arr3[1].replace(" ", "").length) if (parseInt(arr3[1]) == parseInt(amin.Number)) { for(var v=0; v<amin.LstAtoms.length; v++) { AtomosSeleccionados.push(amin.LstAtoms[v]); } break; //quiere decir que lo encontré en esa cadena } } } } else //la cadena es por letra { //tengo que buscarlo por la letra for(var j=0;j<molecule.LstChain.length; j++) { if (arr3[2]==molecule.LstChain[j].Name.replace(" ", "") ) { //procesalo y salte del for var cha=molecule.LstChain[j]; //ahora busco en todos los aminoacidos de esta cadena for(var t=0; t < cha.LstAminoAcid.length; t++) { var amin = cha.LstAminoAcid[t]; //alert("length:"+amin.Number.replace(" ", "").length) //alert("length:"+arr3[1].replace(" ", "").length) if (parseInt(arr3[1]) == parseInt(amin.Number)) { for(var v=0; v<amin.LstAtoms.length; v++) { AtomosSeleccionados.push(amin.LstAtoms[v]); } break; //quiere decir que lo encontré en esa cadena } } } } } } } else //el aminoácido es por letra, hay que buscarlo, Las letras se pueden repetir dentro de una cadena { //hay dos opciones todos los aminoacidos que tengan este nombre en una cadena //todos los aminoacidos que tengan este nombre en todas las cadenas if (arr3[2]==0) //de todas las cadenas { //para buscar el aminoacido en todas las cadenas for(var k=0; k<molecule.LstChain.length; k++) { var caden = molecule.LstChain[k]; for(var t=0; t< caden.LstAminoAcid.length; t++) { var amin = caden.LstAminoAcid[t]; //alert("length:"+amin.Number.replace(" ", "").length) //alert("length:"+arr3[1].replace(" ", "").length) if ( arr3[1].replace(" ", "") == amin.Name.replace(" ", "")) // { for(var v=0; v<amin.LstAtoms.length; v++) { AtomosSeleccionados.push(amin.LstAtoms[v]); } } } } } else { //de una cadena, la cadena puede estar dada por un indice o por una letra if (!isNaN(arr3[2])) //es un indice { //los indices en la cadena son como aparecen en la lista if (arr3[2]>0 && arr3[2] <= molecule.LstChain.length) //para saber que si esta en el rango { var cha = molecule.LstChain[arr3[2]-1]; //ya encontre la cadena //ahora busco en todos los aminoacidos de esta cadena for(var t=0; t< cha.LstAminoAcid.length; t++) { var amin = cha.LstAminoAcid[t]; //alert("length:"+amin.Number.replace(" ", "").length) //alert("length:"+arr3[1].replace(" ", "").length) if ( arr3[1].replace(" ", "") == amin.Name.replace(" ", "")) // { for(var v=0; v<amin.LstAtoms.length; v++) { AtomosSeleccionados.push(amin.LstAtoms[v]); } } } } } else //la cadena es una letra { //tengo que buscarla por la letra for(var j=0;j<molecule.LstChain.length; j++) { if (arr3[2]==molecule.LstChain[j].Name.replace(" ", "") ) { //procesalo y salte del for var cha=molecule.LstChain[j]; //ahora busco en todos los aminoacidos de esta cadena for(var t=0; t< cha.LstAminoAcid.length; t++) { var amin = cha.LstAminoAcid[t]; //alert("length:"+amin.Number.replace(" ", "").length) //alert("length:"+arr3[1].replace(" ", "").length) if ( arr3[1].replace(" ", "") == amin.Name.replace(" ", "")) // { for(var v=0; v<amin.LstAtoms.length; v++) { AtomosSeleccionados.push(amin.LstAtoms[v]); } } } } } } } } } } else ////////////////por elemento { //buscar el elemento if (arr3[1]==0) //en todos los aminoácidos { if (arr3[2]==0) //en todas las cadenas { for (var j = 0; j < molecule.LstAtoms.length; j++) { if (arr3[0] == molecule.LstAtoms[j].Element) { if (molecule.LstAtoms[j].State == 'Active') { //checar lo de Active AtomosSeleccionados.push(molecule.LstAtoms[j]); } } } } else //todos los aminoacidos de una cadena { //la cadena puede estar dada por un indice o por una letra if (!isNaN(arr3[2])) //es un indice { //los indices en la cadena son como aparecen en la lista if (arr3[2]>0 && arr3[2] <= molecule.LstChain.length) //para saber que si esta en el rango { var cha = molecule.LstChain[arr3[2]-1]; //ya encontre la cadena for(var t=0; t< cha.LstAminoAcid.length; t++) { var amin = cha.LstAminoAcid[t]; for(var v=0; v<amin.LstAtoms.length; v++) { if (arr3[0].replace(" ", "") == amin.LstAtoms[v].Element.replace(" ", "")) { if (amin.LstAtoms[v].State == 'Active') { AtomosSeleccionados.push(amin.LstAtoms[v]); } } } } } } else //la cadena está dada por una letra, primero la tengo que buscar { //tengo que buscarla por la letra for(var j=0;j<molecule.LstChain.length; j++) { if (arr3[2]==molecule.LstChain[j].Name.replace(" ", "") ) { //procesalo y salte del for var cha=molecule.LstChain[j]; //ahora busco en todos los aminoacidos de esta cadena for(var t=0; t< cha.LstAminoAcid.length; t++) { var amin = cha.LstAminoAcid[t]; for(var v=0; v<amin.LstAtoms.length; v++) { if (arr3[0].replace(" ", "") == amin.LstAtoms[v].Element.replace(" ", "")) { if (amin.LstAtoms[v].State == 'Active') { AtomosSeleccionados.push(amin.LstAtoms[v]); } } } } } } } } } else //en esta parte quiere decir que sí se ha especificado el aminoácido { //en esta parte el aminoácido if (!isNaN(arr3[1])) //el aminoácido es un índice pero hay que buscarlo { if (arr3[2]==0) //de todas las cadenas { //para buscar el aminoacido en todas las cadenas for(var k=0; k<molecule.LstChain.length; k++) { var caden = molecule.LstChain[k]; for(var t=0; t< caden.LstAminoAcid.length; t++) { var amin = caden.LstAminoAcid[t]; //alert("length:"+amin.Number.replace(" ", "").length) //alert("length:"+arr3[1].replace(" ", "").length) if (parseInt(arr3[1]) == parseInt(amin.Number)) { for(var v=0; v<amin.LstAtoms.length; v++) { if (arr3[0].replace(" ", "") == amin.LstAtoms[v].Element.replace(" ", "")) { if (amin.LstAtoms[v].State == 'Active') { AtomosSeleccionados.push(amin.LstAtoms[v]); } } } break; //quiere decir que encontré el aminoácido en esa cadena } } } } else //de una cadena la cadena puede ser por indice o por letra { if (!isNaN(arr3[2])) //es un indice { //los indices en la cadena son como aparecen en la lista if (arr3[2]>0 && arr3[2] <= molecule.LstChain.length) //para saber que si esta en el rango { var cha = molecule.LstChain[arr3[2]-1]; //ya encontre la cadena //ahora busco en todos los aminoacidos de esta cadena for(var t=0; t< cha.LstAminoAcid.length; t++) { var amin = cha.LstAminoAcid[t]; //alert("length:"+amin.Number.replace(" ", "").length) //alert("length:"+arr3[1].replace(" ", "").length) if (parseInt(arr3[1]) == parseInt(amin.Number)) { for(var v=0; v<amin.LstAtoms.length; v++) { if (arr3[0].replace(" ", "") == amin.LstAtoms[v].Element.replace(" ", "")) { if (amin.LstAtoms[v].State == 'Active') { AtomosSeleccionados.push(amin.LstAtoms[v]); } } } break; //quiere decir que lo encontré en esa cadena } } } } else //la cadena es por letra { //tengo que buscarlo por la letra for(var j=0;j<molecule.LstChain.length; j++) { if (arr3[2]==molecule.LstChain[j].Name.replace(" ", "") ) { //procesalo y salte del for var cha=molecule.LstChain[j]; //ahora busco en todos los aminoacidos de esta cadena for(var t=0; t < cha.LstAminoAcid.length; t++) { var amin = cha.LstAminoAcid[t]; //alert("length:"+amin.Number.replace(" ", "").length) //alert("length:"+arr3[1].replace(" ", "").length) if (parseInt(arr3[1]) == parseInt(amin.Number)) { for(var v=0; v<amin.LstAtoms.length; v++) { if (arr3[0].replace(" ", "") == amin.LstAtoms[v].Element.replace(" ", "")) { if (amin.LstAtoms[v].State == 'Active') { AtomosSeleccionados.push(amin.LstAtoms[v]); } } } break; //quiere decir que lo encontré en esa cadena } } } } } } } else //el aminoácido es por letra, hay que buscarlo { //hay dos opciones todos los aminoacidos que tengan este nombre en una cadena //todos los aminoacidos que tengan este nombre en todas las cadenas if (arr3[2]==0) //de todas las cadenas { //para buscar el aminoacido en todas las cadenas for(var k=0; k<molecule.LstChain.length; k++) { var caden = molecule.LstChain[k]; for(var t=0; t< caden.LstAminoAcid.length; t++) { var amin = caden.LstAminoAcid[t]; //alert("length:"+amin.Number.replace(" ", "").length) //alert("length:"+arr3[1].replace(" ", "").length) if ( arr3[1].replace(" ", "") == amin.Name.replace(" ", "")) // { for(var v=0; v<amin.LstAtoms.length; v++) { if (arr3[0].replace(" ", "") == amin.LstAtoms[v].Element.replace(" ", "")) { if (amin.LstAtoms[v].State == 'Active') { AtomosSeleccionados.push(amin.LstAtoms[v]); } } } } } } } else { //de una cadena, la cadena puede estar dada por un indice o por una letra if (!isNaN(arr3[2])) //es un indice { //los indices en la cadena son como aparecen en la lista if (arr3[2]>0 && arr3[2] <= molecule.LstChain.length) //para saber que si esta en el rango { var cha = molecule.LstChain[arr3[2]-1]; //ya encontre la cadena //ahora busco en todos los aminoacidos de esta cadena for(var t=0; t< cha.LstAminoAcid.length; t++) { var amin = cha.LstAminoAcid[t]; //alert("length:"+amin.Number.replace(" ", "").length) //alert("length:"+arr3[1].replace(" ", "").length) if ( arr3[1].replace(" ", "") == amin.Name.replace(" ", "")) // { for(var v=0; v<amin.LstAtoms.length; v++) { if (arr3[0].replace(" ", "") == amin.LstAtoms[v].Element.replace(" ", "")) { if (amin.LstAtoms[v].State == 'Active') { AtomosSeleccionados.push(amin.LstAtoms[v]); } } } } } } } else //la cadena es una letra { //tengo que buscarla por la letra for(var j=0;j<molecule.LstChain.length; j++) { if (arr3[2]==molecule.LstChain[j].Name.replace(" ", "") ) { //procesalo y salte del for var cha=molecule.LstChain[j]; //ahora busco en todos los aminoacidos de esta cadena for(var t=0; t< cha.LstAminoAcid.length; t++) { var amin = cha.LstAminoAcid[t]; //alert("length:"+amin.Number.replace(" ", "").length) //alert("length:"+arr3[1].replace(" ", "").length) if ( arr3[1].replace(" ", "") == amin.Name.replace(" ", "")) // { for(var v=0; v<amin.LstAtoms.length; v++) { if (arr3[0].replace(" ", "") == amin.LstAtoms[v].Element.replace(" ", "")) { if (amin.LstAtoms[v].State == 'Active') { AtomosSeleccionados.push(amin.LstAtoms[v]); } } } } } } } } } } } } } } else //quiere decir que es un index ejemplo 45 { AtomosSeleccionados.push(molecule.LstAtoms[ele-1]); } } /* for(var o in script) { if(o==0) { AtomosSeleccionados=molecule.LstChain[0].LstAminoAcid[script[0]-1].GetAtoms(); } else { AtomosSeleccionados=AtomosSeleccionados.concat(molecule.LstChain[0].LstAminoAcid[script[o]-1].GetAtoms());