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