1/* 3Dmol functions 2* 3* 4*/ 5 6 //protein object 7 var protein = { 8 surface: $3Dmol.SurfaceType.SAS, 9 opacity: 1, 10 min_isoval: -5, 11 max_isoval: 5, 12 colorScheme: "RWB", 13 volumedata: null 14 }; 15 16 var volumedata = null; 17 var glviewer = null; 18 var labels = []; 19 20 21 var addLabels = function() { 22 var atoms = glviewer.getModel().selectedAtoms({ 23 atom : "CA" 24 }); 25 for ( var a in atoms) { 26 var atom = atoms[a]; 27 28 var l = glviewer.addLabel(atom.resn + " " + atom.resi, { 29 inFront : true, 30 fontSize : 12, 31 position : { 32 x : atom.x, 33 y : atom.y, 34 z : atom.z 35 } 36 }); 37 atom.label = l; 38 labels.push(atom); 39 } 40 }; 41 42 var removetheLabels = function() { 43 for (var i = 0; i < labels.length; i++) { 44 var atom = labels[i] 45 glviewer.removeLabel(atom.label) 46 delete atom.label 47 } 48 //console.log(labels) 49 50 labels = [] 51 52 }; 53 54 /* removed until remove functionality works -- also see addpqr 55 var atomcallback = function(atom, viewer) { 56 if (atom.clickLabel === undefined 57 || !atom.clickLabel instanceof $3Dmol.Label) { 58 atom.clickLabel = viewer.addLabel(atom.elem + atom.serial, { 59 fontSize : 14, 60 position : { 61 x : atom.x, 62 y : atom.y, 63 z : atom.z 64 }, 65 backgroundColor: "gray" 66 }); 67 atom.clicked = true; 68 } 69 70 //toggle label style 71 else { 72 73 //if (atom.clicked) { 74 // var newstyle = atom.clickLabel.getStyle(); 75 // newstyle.backgroundColor = 0x66ccff; 76 77 // viewer.setLabelStyle(atom.clickLabel, newstyle); 78 // atom.clicked = !atom.clicked; 79 //} 80 if (atom.clicked) { 81 viewer.removeLabel(atom.clickLabel); 82 delete atom.clickLabel; 83 atom.clicked = false; 84 } 85 86 } 87 }; 88 */ 89 var glviewer; 90 $(document).ready(function() { 91 glviewer = $3Dmol.createViewer("gldiv", { 92 defaultcolors : $3Dmol.rasmolElementColors 93 }); 94 glviewer.setBackgroundColor("black"); 95 96 }); 97 98 var fileselected = function(files, func){ 99 100 101 readText(files, func); 102 103 104 }; 105 106 var addpqr = function(data){ 107 108 //moldata = data = $("#moldata_pdb_large").val(); 109 //console.log(data); //see contents of file 110 receptorModel = m = glviewer.addModel(data, "pqr"); 111 112 atoms = m.selectedAtoms({}); 113 114 /* removed until remove atom functionality is fixed 115 for ( var i in atoms) { 116 var atom = atoms[i]; 117 atom.clickable = true; 118 atom.callback = atomcallback; 119 } 120 */ 121 glviewer.mapAtomProperties($3Dmol.applyPartialCharges); 122 glviewer.zoomTo(); 123 glviewer.render(); 124 125 }; 126 127 128 var addcube = function (volumedata){ 129 //protein.volumedata = volumedata; 130 window.volumedata = new $3Dmol.VolumeData(volumedata, "cube"); 131 //volumedata = $("#volumetric_data").val(); 132 //glviewer.addIsosurface(volumedata, {isoval: -5, color:"red", smoothness: 10}) 133 //glviewer.addIsosurface(volumedata, {isoval: 5, color:"blue", smoothness: 1}) 134 135 136 glviewer.render(); 137 create_surface(); 138 }; 139 140 var backbone = function (){ 141 var atoms = glviewer.getModel().selectedAtoms({ 142 }); 143 for ( var i = 0; i < atoms.length; i++) { 144 var atom = atoms[i]; 145 if (atom.atom == "H") 146 // delete atom 147 //if (atom == "O") 148 // delete atom 149 //if (atom.atom == "CA") 150 atoms.splice(i,1); 151 } 152 } 153 154 var readText = function(input,func) { 155 156 if(input.length > 0) { 157 var file = input[0]; 158 var reader = new FileReader(); 159 reader.onload = function(evt) { 160 func(evt.target.result,file.name); 161 }; 162 reader.readAsText(file); //needs to be type Blob 163 $(input).val(''); 164 165 } 166 167 }; 168 169 var distance = function(atom1, atom2) { 170 m = glviewer.getModel(0); 171 myatoms = m.selectedAtoms({}); 172 //console.log(myatoms) 173 for ( var i in myatoms) { 174 var myatom = myatoms[i]; 175 myatom.clickable = true; 176 } 177 myatom.onclick = console.log(myatom) 178 }; 179 180 /*update surface based on selected action 181 * 0 - 182 * 1 - change surface 183 * 2 - set translucent 184 * 3 - set opaque 185 */ 186 function update_surface(action){ 187 var e = document.getElementById("selected_surface"); 188 var x = e.options[e.selectedIndex].value; 189 glviewer.removeSurface(surf); 190 switch (action){ 191 case 1: 192 if (x == 'SAS') 193 protein.surface = $3Dmol.SurfaceType.SAS; 194 else if (x == 'SES') 195 protein.surface = $3Dmol.SurfaceType.SES; 196 else if (x == 'VDW') 197 protein.surface = $3Dmol.SurfaceType.VDW; 198 break; 199 case 2: 200 protein.opacity = 0.70; 201 break; 202 case 3: 203 protein.opacity = 1; 204 break; 205 case 4: 206 protein.min_isoval = -5; 207 protein.max_isoval = 5; 208 break; 209 210 default: 211 break; 212 } 213 set_color(); 214 } 215 216 function show_colorbar(){ 217 var w = document.getElementById("selected_scheme"); 218 var y = w.options[w.selectedIndex].value; 219 //console.log(y); 220 if(y=='RWB') 221 document.getElementById("colorbar").innerHTML ="<img src=3dmol/images/rwb.png width='250'>"; 222 if(y=='RGB') 223 document.getElementById("colorbar").innerHTML ="<img src=3dmol/images/rgb.png width='250'>"; 224 225 } 226 227 function surface_vis(checkbox){ 228 //console.log(here); 229 if(checkbox.checked) 230 on_surface(); 231 else 232 glviewer.removeSurface(surf); 233 } 234 235 function surface_opacity(checkbox){ 236 //console.log(here); 237 if(checkbox.checked) 238 update_surface(3); 239 else 240 update_surface(2); 241 } 242 243 function surface_labels(checkbox){ 244 //console.log(here); 245 if(checkbox.checked){ 246 removetheLabels(glviewer); 247 glviewer.render(); 248 } 249 else{ 250 addLabels(glviewer); 251 glviewer.render(); 252 } 253 } 254 255 function set_vis(){ 256 var f = document.getElementById("selected_vis"); 257 var y = f.options[f.selectedIndex].value; 258 vis=y; 259 260 if(y=="stick"){ glviewer.setStyle({},{stick:{}}); glviewer.render();} 261 if(y=="line"){glviewer.setStyle({},{line:{}}); glviewer.render();} 262 if(y=="cross"){glviewer.setStyle({},{cross:{linewidth:5}}); glviewer.render();} 263 if(y=="sphere"){glviewer.setStyle({},{sphere:{}}); glviewer.render();} 264 if(y=="cartoon"){glviewer.setStyle({hetflag:false},{cartoon:{color: 'spectrum'}}); glviewer.render();} 265 } 266 267 function set_color(){ 268 //inefficient -- need to fix! 269 //want to set as protein attribute 270 var f = document.getElementById("selected_scheme"); 271 var y = f.options[f.selectedIndex].value; 272 protein.colorScheme=y; 273 274 if(protein.colorScheme=="RWB") 275 volscheme_to_use = new $3Dmol.Gradient.RWB(protein.min_isoval,protein.max_isoval); 276 else if(protein.colorScheme=="RGB") 277 volscheme_to_use = new $3Dmol.Gradient.ROYGB(protein.min_isoval,protein.max_isoval); 278 else if(protein.colorScheme=="BWR") 279 volscheme_to_use = new $3Dmol.Gradient.Sinebow(protein.min_isoval,protein.max_isoval); 280 281 surf = glviewer.addSurface(protein.surface, {opacity:protein.opacity, voldata: volumedata, volscheme: volscheme_to_use}); 282 } 283 284 //starts program with SAS surface 285 function create_surface(){ 286 volscheme_to_use = new $3Dmol.Gradient.RWB(protein.min_isoval,protein.max_isoval); 287 surf = glviewer.addSurface(protein.surface, {opacity:protein.opacity, voldata: volumedata, volscheme: volscheme_to_use}); 288 } 289 290 //Turn on the surface for the current selected surface 291 function on_surface(){ 292 var e = document.getElementById("selected_surface"); 293 var x = e.options[e.selectedIndex].value; 294 if (x == 'SAS') 295 protein.surface = $3Dmol.SurfaceType.SAS; 296 else if (x == 'SES') 297 protein.surface = $3Dmol.SurfaceType.SES; 298 else if (x == 'VDW') 299 protein.surface = $3Dmol.SurfaceType.VDW; 300 301 set_color(); 302 } 303 304 //change output for min_isoval range 305 function set_min_isoval(min_val) { 306 document.querySelector('#min_isoval').value = min_val; 307 protein.min_isoval = min_val; 308 update_surface(0); 309 } 310 311 //change output for max_isoval range 312 function set_max_isoval(max_val) { 313 document.querySelector('#max_isoval').value = max_val; 314 protein.max_isoval = max_val; 315 update_surface(0); 316 } 317 318 //reset min and max isovals 319 function reset_vals() { 320 set_min_isoval2(-5); 321 set_max_isoval2(5); 322 document.getElementById("min_isoval2").value = "-5"; 323 document.getElementById("max_isoval2").value = "5"; 324 update_surface(0); 325 return false; 326 } 327 328 //change output for min_isoval range, not perfect 329 function set_min_isoval2(min_val) { 330 document.getElementById("min_isoval").innerHTML = min_val; 331 protein.min_isoval = Number(min_val); 332 console.log(document.getElementById('min_isoval').value); 333 update_surface(0); 334 } 335 336 //change output for max_isoval range, not perfect 337 function set_max_isoval2(max_val) { 338 document.getElementById("max_isoval").innerHTML = max_val; 339 protein.max_isoval = Number(max_val); 340 update_surface(0); 341 } 342 343 function getpqr(jobid){ 344 var xhr = new XMLHttpRequest(); 345 //jobid = 14357857643; 346 url = "@website@tmp/"+jobid+"/"+jobid+".pqr"; 347 //url = "../3dmol/files/1fas.pqr"; 348 xhr.open("GET", url); 349 //xhr.responseType = 'blob'; 350 351 xhr.onload = function(e) { 352 if (this.status == 200) { 353 // Note: .response instead of .responseText 354 //var blob = new Blob([this.response], {type: 'text/plain'}); 355 //readText(this.response); 356 addpqr(this.response); 357 } 358 359 }; 360 xhr.send(null); 361 362 } 363 364 function getcube(jobid){ 365 var xhr = new XMLHttpRequest(); 366 xhr.open("GET", "@website@tmp/"+jobid+"/"+jobid+".cube"); 367 //xhr.open("GET", "../3dmol/files/1fas.cube"); 368 //xhr.responseType = 'blob'; 369 370 xhr.onload = function(e) { 371 if (this.status == 200) { 372 // Note: .response instead of .responseText 373 //var blob = new Blob([this.response], {type: 'text/plain'}); 374 //readText(this.response); 375 addcube(this.response); 376 } 377 378 }; 379 xhr.send(null); 380 381 } 382 383var surfaceOn = true 384function toggleSurface(){ 385 if(surfaceOn){ 386 surfaceOn = false 387 on_surface() 388 } 389 else{ 390 surfaceOn = true 391 glviewer.removeSurface(surf) 392 } 393} 394 395var surfaceOpacity = true 396function toggleOpacity(){ 397 if(surfaceOpacity){ 398 update_surface(3) 399 surfaceOpacity = false 400 } 401 else{ 402 update_surface(2) 403 surfaceOpacity = true 404 } 405} 406 407var modelLabels = false 408function toggleLabels(){ 409 if(modelLabels){ 410 removetheLabels(glviewer); 411 glviewer.render(); 412 modelLabels = false 413 } 414 else{ 415 addLabels(glviewer); 416 glviewer.render(); 417 modelLabels = true 418 } 419} 420 421