Subversion Repositories f9daq

Rev

Rev 270 | Rev 318 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.   <meta charset="utf-8">
  5.   <title>Belle II Masterclass</title>
  6.   <link rel="stylesheet" type="text/css" href="masterclass.css">
  7.   <script src="js/blockly_compressed.js"></script>
  8.   <script src="js/blocks_compressed.js"></script>
  9.   <script src="js/javascript_compressed.js"></script>
  10.   <script src="js/en.js"></script>
  11.   <script src="js/belle2_def.js"></script>
  12.   <script src="js/belle2_gen.js"></script>  
  13.   <script src="js/workspace.js"></script>
  14.   <script src="js/FileSaver.min.js"></script>
  15.  
  16. <style>
  17. table {
  18.     border-collapse: collapse;
  19.     width: 100%;
  20. }
  21.  
  22. th, td {
  23.     padding: 0px;
  24.     text-align: right;
  25. }
  26.  
  27. tr:hover{background-color:#ffffff}
  28. </style>
  29.  
  30.   <script src="js/Blob.js"></script>
  31.  
  32.  
  33. <!-- <script type="text/javascript" src="js/JSRootCore.js?2d&onload=startGUI""></script> -->
  34.    <script type="text/javascript" src="https://root.cern/js/latest/scripts/JSRootCore.js?2d&onload=startGUI"></script>  
  35.   <script type = "text/javascript"      language = "javascript">
  36.                  
  37. var es;
  38. function addLog(message) {
  39.    var r = document.getElementById('results');
  40.    r.insertAdjacentHTML('beforeend', message +'<br/>');
  41. }
  42.  
  43. function showStat(message) {
  44.     var r = document.getElementById('sbar');
  45.     r.innerHTML = message ;
  46. }
  47.  
  48.  
  49.  
  50. function startGUI() {
  51.         // d3.select('html').style('height','100%');
  52.         // d3.select('body').style({'min-height':'100%', 'margin':'0px', "overflow" :"hidden"});
  53.         //        var r = document.getElementById('results');
  54.         //        r.style.display = 'none';
  55.         var r0 = document.getElementById('sbar');
  56.         r0.style.display = 'none';
  57.         JSROOT.gStyle.fOptFit = 1111;
  58.  
  59. }
  60.  
  61.  
  62. function fitpanel(oFormElement)
  63. {
  64.   var xhr = new XMLHttpRequest();
  65.   xhr.onreadystatechange = function() {
  66.     if(xhr.readyState == 4 && xhr.status == 200) {
  67.         var event  = JSON.parse(xhr.responseText);        
  68.         var result = event.data;
  69.         var th1    = JSROOT.parse(result.message);
  70.         var hname  = th1.fName;
  71.         var r      = document.getElementById('drawing');
  72.         if (document.getElementById(hname) == null ){
  73.           r.insertAdjacentHTML('beforeend', '<div id="' + hname +'" style="width:80%; height:80%;"></div><br/>');
  74.         }
  75.         var hframe = document.getElementById(hname);
  76.         hframe.innerHTML = '';
  77. //        https://github.com/root-project/jsroot/issues/42
  78.        
  79.         JSROOT.draw(hname, th1, "hist");
  80.         JSROOT.gStyle.fOptFit = 1111;
  81.         JSROOT.draw(hname, th1, "func");
  82.  
  83.        
  84.         document.getElementById('data'+ hname).value=result.message;
  85.         //frame.scrollIntoView();
  86.     }
  87.   }
  88.   xhr.open (oFormElement.method, oFormElement.action, true);
  89.  
  90.   var data = new FormData (oFormElement);  
  91.   xhr.send (data);
  92.  
  93.   return false; // Markus had to return true
  94. }
  95.  
  96.  
  97.  
  98. function startTask() {
  99.        
  100.         var r = document.getElementById('results');
  101.         if ( r.style.display == 'none' ) switchTask();
  102.         r.innerHTML = '';
  103.         document.getElementById('drawing').innerHTML = '';
  104.  
  105.  
  106.         Blockly.JavaScript.INFINITE_LOOP_TRAP = null;
  107.         var code = Blockly.JavaScript.workspaceToCode(workspace);
  108.             code = code.replace(/\(|\)/gi, '');
  109.                
  110.         addLog(code + '<br>');
  111.        //addLog(JSON.stringify(code)+ '<br>');
  112.         es = new EventSource('runscript.php?code='  + code  );
  113.          
  114.        //a message is received
  115.         es.addEventListener('message',EventListener);      
  116.         es.addEventListener('error', function(e) {
  117.         addLog('Error occurred');
  118.         es.close();
  119.     });
  120. }
  121.  
  122. function EventListener(e) {
  123. //addLog(JSON.stringify(e) );
  124.  
  125. var result = JSON.parse( e.data );
  126.  
  127.         if(e.lastEventId == 'CLOSE') {
  128.             addLog('Received CLOSE closing');
  129.             es.close();
  130.             var pBar = document.getElementById('progressor');
  131.             pBar.value = pBar.max; //max out the progress bar
  132.             var perc = document.getElementById('percentage');
  133.             perc.innerHTML   =  "100%";
  134.             perc.style.width = (Math.floor(pBar.clientWidth * (0.5)) + 15) + 'px';
  135.         }   else {
  136.             if(e.lastEventId == '0' ) {
  137.               addLog(result.message);
  138.             } else {
  139.               if(e.lastEventId == '2' ) {
  140.                 showStat(result.message);
  141.               } else {
  142.                 var jsonobj = JSROOT.parse(result.message);
  143.                 var sframe = jsonobj.fName;
  144.                
  145.        
  146.                 addLog('Histogram :'+ sframe );
  147.                 var r = document.getElementById('results');
  148.                 //var r = document.getElementById('drawing');
  149.                 if (document.getElementById(sframe) == null ){
  150.                   r.insertAdjacentHTML('beforeend', '<div id="' + sframe +'" style="width:1000px; height:600px"></div><br/>');
  151.                   r.insertAdjacentHTML('beforeend', '<div id="fit' + sframe +'" style="display: none"></div><br/>');
  152.                   var fit = document.getElementById('fit'+ sframe);
  153. mform ='<form method="post" action="th1fit.php" onsubmit="return fitpanel(this);">';
  154. mform += '  Function:<input type="text"  size="20"  value="gaus"    name="fitfun" /><br/>';
  155. mform += '  Range: min=<input type="text" size="2" value="0"   name="min" />';
  156. mform += '  max=<input type="text" size="2"  value="20"   name="max" /><br/>';
  157. mform += '  Initial parameters (separated by ,)<input type="text" size="20" value=""    name="prm" /><br/>';
  158. mform += '  <input id="data'+ sframe +'" type="hidden" value="'+ result.message +'" name="data" />';
  159. mform += '  <input type="hidden" value="'+ sframe +'"    name="name" />';
  160. mform += '  <input class="mybutton" type="submit" value="  Fit  "/>';
  161. mform += '</form>';
  162.                   fit.insertAdjacentHTML('beforeend', '<div id="param' + sframe +'"></div><br/>');
  163.                   fit.insertAdjacentHTML('beforeend', mform);
  164.                   r.insertAdjacentHTML('beforeend','<input type="button" onclick="togglevisibility(\'fit'+sframe+'\');"  class="mybutton" value="Show/Hide Fit Panel" /><hr/>' );
  165.                   document.getElementById('data'+ sframe).value=result.message;
  166.                   //r.insertAdjacentHTML('beforeend', JSON.stringify(result.message));
  167.                 }
  168.                 var frame = document.getElementById(sframe);
  169.        
  170.                 JSROOT.redraw(sframe, jsonobj, "hist");
  171.                
  172.  
  173.                 frame.scrollIntoView();
  174.               }
  175.             }
  176.             var pBar = document.getElementById('progressor');
  177.             pBar.value = result.progress;
  178.             var perc = document.getElementById('percentage');
  179.             perc.innerHTML   = result.progress  + "%";
  180.             perc.style.width = (Math.floor(pBar.clientWidth * (result.progress/100)) + 15) + 'px';
  181.         }
  182. }
  183.  
  184.  
  185.  
  186. function stopTask() {
  187.     es.close();
  188.     addLog('Interrupted');
  189. }
  190.  
  191.        
  192. /*
  193.     function switchTask() {
  194.     var div  = document.getElementById('results');
  195.     var divs  = document.getElementById('sbar');
  196.     var div0 = document.getElementById('blocklyDiv');
  197.  
  198.     if (div.style.display !== 'none') {
  199.         div.style.display = 'none';
  200.         divs.style.display = 'none';
  201.         div0.style.display = 'block';
  202.     }
  203.     else {
  204.         div.style.display = 'block';
  205.         divs.style.display = 'block';
  206.         div0.style.display = 'none';
  207.     }
  208.  
  209.   }
  210. */
  211.  
  212.  
  213. function togglevisibility( name ) {
  214.     var div  = document.getElementById(name);
  215.     if (div.style.display !== 'none') {
  216.         div.style.display = 'none';
  217.     }
  218.     else {
  219.         div.style.display = 'block';
  220.     }
  221. }
  222.  
  223.  
  224. function readSingleFile(e) {
  225.  
  226.   var div0 = document.getElementById('blocklyDiv');
  227.   //if (div0.style.display === 'none') switchTask();
  228.  
  229.   var file = e.target.files[0];
  230.   if (!file) {
  231.    return;
  232.   }
  233.   var reader = new FileReader();
  234.   reader.onload = function(e) {
  235.     var contents = e.target.result;
  236.     displayContents(contents);
  237.  
  238.   };
  239.   reader.readAsText(file);
  240.  
  241. }
  242.  
  243. function displayContents(contents) {
  244.  
  245. workspace.clear();
  246. var xml = Blockly.Xml.textToDom(contents);
  247. Blockly.Xml.domToWorkspace(xml, workspace);
  248.  
  249. }
  250.  
  251.  
  252. function loadDoc( url ) {
  253.   var xhttp = new XMLHttpRequest();
  254.   xhttp.onreadystatechange = function () {
  255.      if (xhttp.readyState == 4 && xhttp.status == 200) {
  256.         return xhttp.responseText;
  257.      }
  258.   }
  259.   xhttp.open("GET", url, false); // !!! should be in synchronous mode
  260.   xhttp.send();
  261.   return xhttp.onreadystatechange();
  262. }
  263.  
  264.  function showCode() {
  265.       // Generate JavaScript code and display it.
  266.       Blockly.JavaScript.INFINITE_LOOP_TRAP = null;
  267.       var code = Blockly.JavaScript.workspaceToCode(workspace);
  268.           //var code = Blockly.JSON.fromWorkspace( workspace );
  269.           //var code =  Blockly.Xml.domToPrettyText(workspace );
  270.       code = code.replace(/\(|\)/gi, '');
  271.       console.log(code);
  272.       console.log(code.length);  
  273.       alert(code);
  274.  
  275.   }
  276.  
  277.  
  278.   function saveBlockly(){
  279.     //  https://eligrey.com/blog/saving-generated-files-on-the-client-side/
  280.  
  281.     var xml = Blockly.Xml.workspaceToDom(workspace);
  282.     var txt = Blockly.Xml.domToText(xml);
  283.    
  284. //  var txt=Blockly.Xml.domToPrettyText(Blockly.Xml.workspaceToDom(Blockly.mainWorkspace)); // exports workspace as pretty xml
  285.   console.log(txt);
  286.   var blob = new Blob([txt], {type: "text/xml"});
  287.   saveAs(blob, "test.blab2");
  288.   }
  289.  
  290.   function loadBlockly(){
  291.     Blockly.Xml.domToWorkspace(Blockly.mainWorkspace,$("#hiBlocks")[0]); // loads xml from dom into workspace  
  292.   }
  293.  
  294.     function runCode() {
  295.       // Generate JavaScript code and run it.
  296.       window.LoopTrap = 1000;
  297.       Blockly.JavaScript.INFINITE_LOOP_TRAP =
  298.           'if (--window.LoopTrap == 0) throw "Infinite loop.";\n';
  299.       var code = Blockly.JavaScript.workspaceToCode(workspace);
  300.       Blockly.JavaScript.INFINITE_LOOP_TRAP = null;
  301.       try {
  302.         eval(code);
  303.       } catch (e) {
  304.         alert(e);
  305.       }
  306.     }
  307.    
  308.  
  309.   </script>
  310.                  
  311. </head>
  312. <body>
  313.   <h1>Belle II Masterclass: Describe process &rarr;Run analysis &rarr;Fit results &rarr;Save/load process locally</h1>
  314. <!--        <input type="button" onclick="showCode();"  class="mybutton" value="Show JavaScript" /> -->
  315.         <input type="button" onclick="startTask();"  class="mybutton" value="Run Analysis" />
  316.         <input type="button" onclick="stopTask();"  class="mybutton" value="Interrupt" />
  317. <!--         <input type="button" onclick="switchTask();"  class="mybutton" value="Switch between Diagram and Results" /> -->
  318.         <input type="button" onclick="saveBlockly();"  class="mybutton" value="Save Diagram" />
  319.         <form style="display:inline;"><label for="file-input" class="mybutton" style="">Load Diagram</label>
  320.         <input type="file" style="visibility:hidden;" id="file-input" onClick="this.form.reset()" data-buttonText="Load Diagram"/></form>
  321.         <br/>
  322.         <progress id='progressor' value="0" max='100' style="width:95%"></progress>  
  323.         <span id="percentage" style="text-align:right; display:block; margin-top:5px;">0</span>
  324.         <p id="sbar" ></div>     
  325.  
  326.         <br />
  327.  
  328.  <div id="blocklyDiv" style="height:500px; width:95%"></div><br />
  329.  <div id="results" style="border:1px solid #000; padding:10px; width:95%; height:80% ; overflow:auto; background:#eee;"></div>
  330.   <br />
  331.  
  332.   <script>
  333.    
  334.     document.getElementById('file-input').addEventListener('change', readSingleFile, false);
  335.  
  336. //  var toolbox = document.getElementById("toolbox");
  337.   var toolbox = loadDoc("toolbox.xml");
  338.  
  339. var options = {
  340.         toolbox : toolbox,
  341.         collapse : true,
  342.         comments : true,
  343.         disable : true,
  344.         maxBlocks : Infinity,
  345.         trashcan : true,
  346.         horizontalLayout : false,
  347.         toolboxPosition : 'start',
  348.         css : true,
  349. /*      media : '../media/', */
  350.         rtl : false,
  351.         scrollbars : true,
  352.         sounds : true,
  353.         oneBasedIndex : true,
  354.         zoom : {
  355.                 controls : true,
  356.                 wheel : true,
  357.                 startScale : 1,
  358.                 maxcale : 3,
  359.                 minScale : 0.3
  360.   },
  361.   grid:
  362.   {spacing: 20,
  363.   length: 3,
  364.   colour: '#ccc',
  365.   snap: true}
  366. };
  367.  
  368. /* Inject your workspace */
  369. var workspace = Blockly.inject('blocklyDiv', options);
  370.  
  371. /* Load Workspace Blocks from XML to workspace. Remove all code below if no blocks to load */
  372.  
  373. /* TODO: Change workspace blocks XML ID if necessary. Can export workspace blocks XML from Workspace Factory. */
  374. //var workspaceBlocks = document.getElementById("workspaceBlocks");
  375. /* Load blocks to workspace. */
  376. //    Blockly.Xml.domToWorkspace(workspaceBlocks, workspace);
  377.  
  378. <?php
  379.  
  380.  if (isset($_GET["decay"])){
  381.    $decay =  $_GET["decay"];
  382.  } else  {
  383.    $decay = "data/sample.blab2";
  384.  }
  385. // echo "var workspaceBlocks = loadDoc( \"$decay\");"
  386. /* Load blocks to workspace. */
  387.  echo "displayContents( loadDoc( \"$decay\"));"
  388.  
  389. ?>
  390.  
  391. //displayContents(workspaceBlocks);
  392.    
  393.  
  394.  
  395. </script>
  396. <div id="drawing"></div>
  397. </body>
  398. <a href="update.php">Update code</a>
  399. </html>
  400.