NGL viewer min md no login
authorCezary Czaplewski <czarek@chem.univ.gda.pl>
Thu, 25 Jan 2018 23:57:58 +0000 (00:57 +0100)
committerCezary Czaplewski <czarek@chem.univ.gda.pl>
Thu, 25 Jan 2018 23:57:58 +0000 (00:57 +0100)
django_simple/todo/templates/details1.html

index 5681fd9..2577492 100644 (file)
@@ -298,7 +298,6 @@ Created {{ task.created_date  }}
                            <div class="col-md-6"> temperature for clustering</div>
                            <div class="col-md-6">{{ task.remd_cluter_temp}}</div>
                        </li>           
-                       
                        {% if task.saxs_data != "" %}                   
                        <li class="list-group-item task-item">
                            <div class="col-md-6"> wsaxs </div>
@@ -356,15 +355,26 @@ Created {{ task.created_date  }}
                          width="500"></a> </div>
                        </li>
 
-
+<!--
                        <li class="list-group-item task-item">
                          <div class="col-md-2"> Structure overlap </div>
                          <div class="col-md-10"> <img 
                          src="/myfiles/download-file/{{task.jobdirname}}/unres_overlap.png"
                          width="500"> </div>
                        </li>
-
-
+-->
+                       <li class="list-group-item task-item">
+                         <div class="col-md-2"> Structure overlap NGL viewer</div>
+                         <div class="col-md-10" id="viewport_min"
+                         style="width:500px;height:500px;"> 
+                         </div>
+                       </li>
+                        <li class="list-group-item task-item">
+               <div class="col-md-12">
+               <button id="toggleAllatom">Input structure on/off</button>
+               <button id="toggleSidechains2">Side-chains on/off</button>
+               </div>
+                        </li>
                         {% endif %}
 
                        <li class="list-group-item task-item">
@@ -400,6 +410,25 @@ Created {{ task.created_date  }}
                          
                            </div>
                            </li>
+
+{% if task.md_mdpdb %}
+                       <li class="list-group-item task-item">
+                         <div class="col-md-2"> Trajectory NGL viewer</div>
+                         <div class="col-md-10" id="viewport_traj"
+                         style="width:500px;height:500px;"> 
+                         </div>
+                       </li>
+                        <li class="list-group-item task-item">
+               <div class="col-md-6">
+<input id="clipRange" type="range" value=0 min=0 max= {% widthratio task.md_nstep task.md_ntwx 1 %} step=1 ></input><span id="clipRange_val">0</span> frame
+</div>
+<div class="col-md-6">
+<button id="toggleRunMDs">run/pause MD</button>  
+<button id="toggleSidechains1">side-chains on/off</button>                       
+</div>
+                        </li>
+
+{% endif %}
                            
                        <li class="list-group-item task-item">
                          <div class="col-md-2"> Radius of gyration based
@@ -436,7 +465,7 @@ Created {{ task.created_date  }}
                          src="/myfiles/download-file/{{task.jobdirname}}/fluct_plot.png"
                          width="500"> </div>
                        </li>
-
+<!--
                        <li class="list-group-item task-item">
                          <div class="col-md-2"> fluctuations putty on
                          starting structure</div>
@@ -447,6 +476,15 @@ Created {{ task.created_date  }}
                          src="/myfiles/download-file/{{task.jobdirname}}/fluct.png"
                          width="500"></a> </div>
                        </li>
+-->
+                       <li class="list-group-item task-item">
+                         <div class="col-md-2"> fluctuations putty on
+                         starting structure NGL viewer</div>
+                         <div class="col-md-10" id="viewport_putty"
+                         style="width:500px;height:500px;"> 
+                         </div>
+                       </li>
+
                        
                           {% endif %}
 
@@ -510,6 +548,7 @@ Created {{ task.created_date  }}
                          src="/myfiles/download-file/{{task.jobdirname}}/remd_ex.png"
                          width="500"> </div>
                        </li>
+                       
                           {% if task.saxs_data != "" %}
                        <li class="list-group-item task-item">
                          <div class="col-md-2"> P(r) of input SAXS data and
@@ -520,7 +559,6 @@ Created {{ task.created_date  }}
                        </li>
                           {% endif %}
                        
-                       
        <li class="list-group-item task-item">
        <div class="col-md-4">
         <button onclick="plusDivs(-1)">&#10094;</button> 
@@ -613,7 +651,7 @@ Created {{ task.created_date  }}
 Regular user cannot use this link.
 </h2>
 {% endif %}
-
+       
 <script src="/static/jquery.min.js"></script>
 
 <script>
@@ -627,6 +665,7 @@ $('.majorpointslegend').click(function(){
 });
 </script>
 
+{% if task.type == "remd" %}
 <script>
 var slideIndex = 1;
 showDivs(slideIndex);
@@ -646,7 +685,8 @@ function showDivs(n) {
   x[slideIndex-1].style.display = "block";
 }
 </script>
-       
+{% endif %}
+
 {% if not task.done %}
 <script>
 function worker() {
@@ -669,6 +709,196 @@ $(document).ready(function() {
 });
 </script>
 {% endif %} 
-
        
+<script src="https://unpkg.com/ngl"></script>
+{% if task.type == "min" %}
+<script>
+window.addEventListener("resize",
+     function (event) {
+     stage.handleResize();
+     },false);
+               
+var stage = new NGL.Stage("viewport_min");
+stage.setParameters( { backgroundColor: "white" } );
+Promise.all([
+  stage.loadFile( "/myfiles/download-file/{{task.jobdirname}}/file_GB000.pdb" ,{defaultRepresentation: false}) .then( function( o ){
+     o.addRepresentation( "backbone",{ color:
+       "residueindex",colorScale:["blue","cyan", "green", "yellow","orange", "red"]
+     })
+     o.addRepresentation( "licorice",{ color:
+       "residueindex",colorScale:["blue","cyan", "green", "yellow","orange","red"]
+     })    
+     return o
+  }),
+      
+  stage.loadFile("/myfiles/download-file/{{task.jobdirname}}/plik.pdb",{defaultRepresentation: false}) .then( function( o ){
+     o.addRepresentation( "backbone",{ name: "allatom", color:
+       "residueindex",colorScale:["blue","cyan", "green","yellow","orange", "red"]
+     })
+     o.addRepresentation( "line",{ name: "allatomsc", color:
+       "residueindex",colorScale:["blue","cyan", "green", "yellow","orange", "red"]
+       ,sele:"not hydrogen and sidechainAttached" 
+     })    
+     return o
+  })
+]).then(function (ol) {
+   ol[ 0 ].superpose(ol[ 1 ], false, ".CA")
+   ol[ 0 ].autoView()
+})             
+
+var allatom=true;
+var side=true;
+var toggleAll = document.getElementById( "toggleAllatom" );
+toggleAll.addEventListener( "click", function(){
+                        allatom=! allatom;                                
+                       stage.getRepresentationsByName(
+                               "allatom" ).list.forEach( function( repre ){
+                               repre.setVisibility( !repre.visible );
+                       } );
+            if (side) {
+                       stage.getRepresentationsByName(
+                               "allatomsc" ).list.forEach( function( repre ){
+                               repre.setVisibility( !repre.visible );
+                       } );
+            }
+} );
+var toggleSidechains = document.getElementById("toggleSidechains2" );
+toggleSidechains.addEventListener( "click", function(){
+          side=!side;
+          if (allatom) {
+               stage.getRepresentationsByName(
+                       "allatomsc" ).list.forEach( function( repre ){
+                               repre.setVisibility( !repre.visible );
+               } );
+                                                     
+         }
+         stage.getRepresentationsByName("licorice").list.forEach( function( repre ){
+               repre.setVisibility( !repre.visible );
+         } );
+
+} );
+</script>
+{% endif %}
+
+{% if task.type == "md" and task.md_start == "pdbstart" %}
+<script>
+window.addEventListener("resize",
+     function (event) {
+     stage.handleResize();
+     },false);
+
+var stage = new NGL.Stage("viewport_putty");
+stage.setParameters( { backgroundColor: "white" } );
+
+var tooltip = document.createElement("div")
+Object.assign(tooltip.style, {
+  display: "none",
+  position: "fixed",
+  zIndex: 10,
+  pointerEvents: "none",
+  backgroundColor: "rgba( 0, 0, 0, 0.6 )",
+  color: "lightgrey",
+  padding: "8px",
+  fontFamily: "sans-serif"
+})
+document.body.appendChild(tooltip)
+
+stage.loadFile("/myfiles/download-file/{{task.jobdirname}}/plik_bf.pdb", {defaultRepresentation: false}).then 
+       (function ( o ){
+       o.addRepresentation("tube",{ color: "bfactor" , scale: 0.25,
+       sele: "backbone",
+       radius:"bfactor",
+       colorScale:["blue","cyan", "green", "yellow","orange", "red"] });
+       o.addRepresentation("licorice",{sele:"sidechainAttached and CYS and not hydrogen"});
+       o.autoView();
+})
+
+// remove default hoverPick mouse action
+stage.mouseControls.remove("hoverPick")
+
+stage.signals.hovered.add(function (pickingProxy) {
+  if (pickingProxy && (pickingProxy.atom || pickingProxy.bond)) {
+    var atom = pickingProxy.atom || pickingProxy.closestBondAtom
+    var mp = pickingProxy.mouse.position
+    var bf= atom.bfactor.toFixed(2)
+    tooltip.innerText = atom.qualifiedName()+" Fluctuation="+ bf
+    tooltip.style.bottom = window.innerHeight - mp.y + 3 + "px"
+    tooltip.style.left = mp.x + 3 + "px"
+    tooltip.style.display = "block"
+  } else {
+    tooltip.style.display = "none"
+  }
+})
+</script>
+{% endif %}    
+
+{% if task.type == "md" and task.md_mdpdb %}
+<script>
+window.addEventListener("resize",
+     function (event) {
+     stage.handleResize();
+     },false);
+
+      var stage = new NGL.Stage("viewport_traj");
+      stage.setParameters( { backgroundColor: "white" } );
+      stage.setParameters( { cameraType: "orthographic" } ); 
+      var traj;
+      var player;
+      stage.loadFile( "/myfiles/download-file/{{task.jobdirname}}/file_MD000.pdb", { 
+       asTrajectory: true } ) .then( function( o ){
+        o.setName ("unres_md");
+        o.addRepresentation( "backbone",{ color:
+       "residueindex",colorScale:["blue","cyan", "green", "yellow","orange", "red"]
+        });
+        o.addRepresentation( "licorice",{ color:
+       "residueindex",colorScale:["blue","cyan", "green", "yellow","orange", "red"]
+        });        
+        o.autoView();
+        o.addTrajectory();
+      });
+
+            var toggleSidechains = document.getElementById( "toggleSidechains1" );
+            toggleSidechains.addEventListener( "click", function(){
+                                                       stage.getRepresentationsByName( "licorice" ).list.forEach( function( repre ){
+                                                                       repre.setVisibility( !repre.visible );
+                                                       } );
+            } );
+
+
+      function numberWithCommas(x) {
+                return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
+      }
+      var toggleRunMDs = document.getElementById( "toggleRunMDs" );
+      var isRunning = false;
+      toggleRunMDs.addEventListener( "click", function(){
+         var trajComp = stage.getComponentsByName("unres_md").list[0].trajList[0];
+         var player = new NGL.TrajectoryPlayer(trajComp.trajectory, {timeout: 10, mode: "once"});
+                               if( !isRunning ){
+                                       player.play();
+                                       isRunning = true;
+
+                    trajComp.signals.frameChanged.add(function(){
+                      var fnum=trajComp.trajectory.currentFrame;                   
+                      clipRange.value = fnum;
+                      clipRange_val.innerHTML = numberWithCommas(parseInt(clipRange.value*1));
+                    });
+
+                               }else{
+                                       player.play();
+                                       player.pause();
+                                       isRunning = false;
+                               }
+      } );      
+      var clipRange = document.getElementById( "clipRange" );
+      var clipRange_val = document.getElementById( "clipRange_val" );
+      clipRange.oninput = function( e ){
+                var trajComp = stage.getComponentsByName("unres_md").list[0].trajList[0];
+                trajComp.setFrame(e.target.value)
+                clipRange_val.innerHTML = numberWithCommas(parseInt(e.target.value*1));
+      };      
+
+</script>
+{% endif %}    
+
+
 {% endblock %}