/belle2/masterclass/index.php |
---|
31,7 → 31,7 |
<!-- <script type="text/javascript" src="js/JSRootCore.js?2d&onload=startGUI""></script> --> |
<script type="text/javascript" src="https://root.cern/js/latest/scripts/JSRootCore.js?2d&onload=startGUI"></script> |
<script type="text/javascript" src="https://root.cern/js/latest/scripts/JSRootCore.js?more2d&math&onload=startGUI"></script> |
<script type = "text/javascript" language = "javascript"> |
var es; |
52,8 → 52,8 |
function startGUI() { |
// d3.select('html').style('height','100%'); |
// d3.select('body').style({'min-height':'100%', 'margin':'0px', "overflow" :"hidden"}); |
var r = document.getElementById('results'); |
r.style.display = 'none'; |
// var r = document.getElementById('results'); |
// r.style.display = 'none'; |
var r0 = document.getElementById('sbar'); |
r0.style.display = 'none'; |
60,7 → 60,55 |
} |
var cnt=0; |
function fitpanel(oFormElement) |
{ |
var xhr = new XMLHttpRequest(); |
xhr.onreadystatechange = function() { |
if(xhr.readyState == 4 && xhr.status == 200) { |
var event = JSON.parse(xhr.responseText); |
var result =event.data; |
var jsonobj = JSROOT.parse(result.message); |
var sframe = jsonobj.fName; |
var tf1 = jsonobj.fFunctions.arr[0]; |
var tformula = tf1.fFormula; |
var len = tf1.fNpar; |
// addLog('#TF1 ' +JSON.stringify(tf1, null, '\t')+ '$$$<br>'); |
mtext = '<br/>' + "Fit Function: " + tformula.fFormula+ '<br/>'; |
mtext +="Chi2/NDF: " + tf1.fChisquare.toPrecision(2) + " / "+ tf1.fNDF+ '<br/>'; |
mtext +='<table border="0" >'; |
for ( var i = 0;i <len;i++){ |
var name = tformula.fParams[i].first; |
var val = tformula.fClingParameters[i]; |
var err = tf1.fParErrors[i]; |
mtext += "<tr><td>" + name + " <td> " + val.toPrecision(4) + " <td>+-<td>" + err.toPrecision(2) + '<br/>'; |
} |
mtext +="</table><br/>"; |
var mdiv = document.getElementById('param' + sframe); |
mdiv.innerHTML = mtext; |
var r = document.getElementById('drawing'); |
if (document.getElementById(sframe) == null ){ |
r.insertAdjacentHTML('beforeend', '<div id="' + sframe +'" style="width:80%; height:80%;"></div><br/>'); |
} |
var frame = document.getElementById(sframe); |
frame.innerHTML = ''; |
JSROOT.draw(sframe, jsonobj, "hist"); |
JSROOT.draw(sframe, jsonobj, "func"); |
document.getElementById('data'+ sframe).value=result.message; |
frame.scrollIntoView(); |
} |
} |
xhr.open (oFormElement.method, oFormElement.action, true); |
var data = new FormData (oFormElement); |
xhr.send (data); |
return false; // Markus had to return true |
} |
function startTask() { |
var r = document.getElementById('results'); |
86,6 → 134,8 |
} |
function EventListener(e) { |
//addLog(JSON.stringify(e) ); |
var result = JSON.parse( e.data ); |
if(e.lastEventId == 'CLOSE') { |
104,16 → 154,36 |
showStat(result.message); |
} else { |
var jsonobj = JSROOT.parse(result.message); |
var sframe = 'rh'+ (cnt++); |
addLog('ROOT_JSON object '+ sframe ); |
//var r = document.getElementById('results'); |
var r = document.getElementById('drawing'); |
r.insertAdjacentHTML('beforeend', '<div id="' + sframe +'" style="width:60%; height:60%;"></div><br/>'); |
var sframe = jsonobj.fName; |
addLog('Histogram :'+ sframe ); |
var r = document.getElementById('results'); |
//var r = document.getElementById('drawing'); |
if (document.getElementById(sframe) == null ){ |
r.insertAdjacentHTML('beforeend', '<div id="' + sframe +'" style="width:1000px; height:600px"></div><br/>'); |
r.insertAdjacentHTML('beforeend', '<div id="fit' + sframe +'" style="display: none"></div><br/>'); |
var fit = document.getElementById('fit'+ sframe); |
mform ='<form method="post" action="th1fit.php" onsubmit="return fitpanel(this);">'; |
mform += ' <input class="mybutton" type="submit" value=" Fit "/>'; |
mform += ' Range: min=<input type="text" size="2" value="0" name="min" />'; |
mform += ' max:<input type="text" size="2" value="10" name="max" />'; |
mform += ' Function:<input type="text" size="5" value="gaus" name="fitfun" />'; |
mform += ' Initial parameters<input type="text" size="5" value="1;2;3" name="prm" />'; |
mform += ' <input id="data'+ sframe +'" type="hidden" value="'+ result.message +'" name="data" />'; |
mform += ' <input type="hidden" value="'+ sframe +'" name="name" />'; |
mform += '</form>'; |
fit.insertAdjacentHTML('beforeend', mform); |
fit.insertAdjacentHTML('beforeend', '<div id="param' + sframe +'"></div><br/>'); |
r.insertAdjacentHTML('beforeend','<input type="button" onclick="togglevisibility(\'fit'+sframe+'\');" class="mybutton" value="Show/Hide Fit Panel" /><hr/>' ); |
document.getElementById('data'+ sframe).value=result.message; |
//r.insertAdjacentHTML('beforeend', JSON.stringify(result.message)); |
} |
var frame = document.getElementById(sframe); |
//JSROOT.draw(frame, jsonobj, "hist"); |
JSROOT.draw(sframe, jsonobj, "hist"); |
//addLog('JSON :' + JSON.stringify(jsonobj)+ '<br>'); |
JSROOT.redraw(sframe, jsonobj, "hist"); |
frame.scrollIntoView(); |
} |
134,7 → 204,7 |
} |
/* |
function switchTask() { |
var div = document.getElementById('results'); |
var divs = document.getElementById('sbar'); |
152,12 → 222,24 |
} |
} |
*/ |
function togglevisibility( name ) { |
var div = document.getElementById(name); |
if (div.style.display !== 'none') { |
div.style.display = 'none'; |
} |
else { |
div.style.display = 'block'; |
} |
} |
function readSingleFile(e) { |
var div0 = document.getElementById('blocklyDiv'); |
if (div0.style.display === 'none') switchTask(); |
//if (div0.style.display === 'none') switchTask(); |
var file = e.target.files[0]; |
if (!file) { |
239,31 → 321,23 |
} |
</script> |
</head> |
<body> |
<h1>Belle II Masterclass: Define process →Analyse data →Visualise results →Save/load process locally</h1> |
<h1>Belle II Masterclass: Describe process →Run analysis →Fit results →Save/load process locally</h1> |
<!-- <input type="button" onclick="showCode();" class="mybutton" value="Show JavaScript" /> --> |
<input type="button" onclick="startTask();" class="mybutton" value="Run Analysis" /> |
<input type="button" onclick="stopTask();" class="mybutton" value="Interrupt" /> |
<input type="button" onclick="switchTask();" class="mybutton" value="Switch between Diagram and Results" /> |
<!-- <input type="button" onclick="switchTask();" class="mybutton" value="Switch between Diagram and Results" /> --> |
<input type="button" onclick="saveBlockly();" class="mybutton" value="Save Diagram" /> |
<form style="display:inline;"><label for="file-input" class="mybutton" style="">Load Diagram</label> |
<input type="file" style="visibility:hidden;" id="file-input" onClick="this.form.reset()" data-buttonText="Load Diagram"/></form> |
<br /> |
<input type="file" style="visibility:hidden;" id="file-input" onClick="this.form.reset()" data-buttonText="Load Diagram"/></form> |
<br/> |
<progress id='progressor' value="0" max='100' style="width:95%"></progress> |
<span id="percentage" style="text-align:right; display:block; margin-top:5px;">0</span> |
<p id="sbar" ></div> |
<br /> |
<div id="blocklyDiv" style="height:500px; width:95%"></div><br /> |
334,6 → 408,6 |
</script> |
<div id="drawing" style="width:800px; height:600px"></div> |
<div id="drawing"></div> |
</body> |
</html> |
/belle2/masterclass/src/Blab2.cc |
---|
205,9 → 205,12 |
} |
send_message(2, TString::Format("Number of events processed %d\n", i ),100); |
for (int i=0;i<100;i++) if (fH[i]!=0) send_message(1,TBufferJSON::ConvertToJSON(fH[i]),100 ); |
send_message(1,TBufferJSON::ConvertToJSON(fHnprt),100 ); |
send_message(1,TBufferJSON::ConvertToJSON(fHid),100 ); |
for (int i=0;i<100;i++) if (fH[i]!=0) send_message(1,TBufferJSON::ConvertToJSON(fH[i]),100 ); |
TDatime d; |
timer.Stop(); |
send_message(3, TString::Format("'%s', %d, %f, %f", d.AsSQLString(),i, timer.RealTime(), timer.CpuTime() ),100); |
/belle2/masterclass/th1fit.cc |
---|
0,0 → 1,44 |
#include <stdlib.h> |
#include <stdio.h> |
#include <TH1F.h> |
#include <TCanvas.h> |
#include <TF1.h> |
#include <TStyle.h> |
#include <TBufferJSON.h> |
//#include <TBufferXML.h> |
class Hdr{ |
public: |
int id; |
int len; |
int progress; |
}; |
void send_message(int id, TString msg, int progress){ |
static Hdr hdr; |
hdr.id = id; |
hdr.len= msg.Length(); |
hdr.progress= progress; |
fwrite(&hdr,3*sizeof(int),1,stdout); |
fwrite(msg.Data(),hdr.len,1,stdout); |
fflush(stdout); |
} |
int th1fit(Double_t *data, const char *name, const char *title, int xbins, double xmin, double xmax, double min=0, double max=1,const char *func=NULL, const char *pars=NULL){ |
TH1F *h = new TH1F(name,title,xbins, xmin,xmax); |
for (int i=0;i<xbins+2;i++) h->SetBinContent(i,data[i]); |
gStyle->SetOptFit(1111); |
TF1 *f = new TF1("f",func,min,max); |
//TCanvas *v =new TCanvas(); |
h->Fit(f,"RQ"); |
h->Draw(); |
//v->Modified(); |
//v->Update(); |
send_message(1,TBufferJSON::ConvertToJSON(h),0 ); |
return 0; |
} |
/belle2/masterclass/th1fit.php |
---|
0,0 → 1,117 |
<?php |
function send_message($id, $message, $progress) { |
$d = array('message' => $message , 'progress' => $progress); //prepare json |
$x = array('id' => $id, 'data' => $d ); |
echo json_encode($x) . PHP_EOL; |
/* |
if (PHP_SAPI !== 'cli') { |
echo PHP_EOL; |
ob_flush(); |
} |
flush(); |
*/ |
} |
function executeCmd($commandLine) { |
$pipe = popen("$commandLine" , 'r'); |
if (!$pipe) { |
print "pipe failed."; |
return ""; |
} |
$output = ''; |
$out = ''; |
while(!feof($pipe)) { |
$contents = fread($pipe, 12); |
$unpacked = unpack("l*",$contents); |
$len0 = sizeof($unpacked); |
if ($len0 > 2) { |
$id = $unpacked[1]; |
$len = $unpacked[2]; |
$progress = $unpacked[3]; |
if ($len>0){ |
$out= fread($pipe, $len); |
send_message($id,$out,$progress); |
} |
$output .=$out; |
} |
} |
pclose($pipe); |
return $output; |
} |
if (isset($_POST["min"])){ |
$min = $_POST["min"]; |
} else { |
$min = 0; |
} |
if (isset($_POST["max"])){ |
$max = $_POST["max"]; |
} else { |
$max = 10; |
} |
if (isset($_POST["fitfun"])){ |
$fitfun = $_POST["fitfun"]; |
} else { |
$fitfun = "gaus"; |
} |
if (isset($_POST["prm"])){ |
$prm = $_POST["prm"]; |
} else { |
$prm = "0;1;2"; |
} |
if (isset($_POST["name"])){ |
$name = $_POST["name"]; |
} else { |
$name = "h101"; |
} |
if (isset($_POST["data"])){ |
$data = $_POST["data"]; |
} else { |
$data = '{ "_typename" : "TH1F", "fUniqueID" : 0, "fBits" : 50331656, "fName" : "h100", "fTitle" : "Number of particles in the event", "fLineColor" : 602, "fLineStyle" : 1, "fLineWidth" : 1, "fFillColor" : 0, "fFillStyle" : 1001, "fMarkerColor" : 1, "fMarkerStyle" : 1, "fMarkerSize" : 1, "fNcells" : 52, "fXaxis" : { "_typename" : "TAxis", "fUniqueID" : 0, "fBits" : 50331648, "fName" : "xaxis", "fTitle" : "N particles", "fNdivisions" : 510, "fAxisColor" : 1, "fLabelColor" : 1, "fLabelFont" : 42, "fLabelOffset" : 0.005, "fLabelSize" : 0.035, "fTickLength" : 0.03, "fTitleOffset" : 1, "fTitleSize" : 0.035, "fTitleColor" : 1, "fTitleFont" : 42, "fNbins" : 50, "fXmin" : -0.5, "fXmax" : 49.5, "fXbins" : [], "fFirst" : 0, "fLast" : 0, "fBits2" : 0, "fTimeDisplay" : false, "fTimeFormat" : "", "fLabels" : null, "fModLabs" : null }, "fYaxis" : { "_typename" : "TAxis", "fUniqueID" : 0, "fBits" : 50331648, "fName" : "yaxis", "fTitle" : "N events", "fNdivisions" : 510, "fAxisColor" : 1, "fLabelColor" : 1, "fLabelFont" : 42, "fLabelOffset" : 0.005, "fLabelSize" : 0.035, "fTickLength" : 0.03, "fTitleOffset" : 0, "fTitleSize" : 0.035, "fTitleColor" : 1, "fTitleFont" : 42, "fNbins" : 1, "fXmin" : 0, "fXmax" : 1, "fXbins" : [], "fFirst" : 0, "fLast" : 0, "fBits2" : 0, "fTimeDisplay" : false, "fTimeFormat" : "", "fLabels" : null, "fModLabs" : null }, "fZaxis" : { "_typename" : "TAxis", "fUniqueID" : 0, "fBits" : 50331648, "fName" : "zaxis", "fTitle" : "", "fNdivisions" : 510, "fAxisColor" : 1, "fLabelColor" : 1, "fLabelFont" : 42, "fLabelOffset" : 0.005, "fLabelSize" : 0.035, "fTickLength" : 0.03, "fTitleOffset" : 1, "fTitleSize" : 0.035, "fTitleColor" : 1, "fTitleFont" : 42, "fNbins" : 1, "fXmin" : 0, "fXmax" : 1, "fXbins" : [], "fFirst" : 0, "fLast" : 0, "fBits2" : 0, "fTimeDisplay" : false, "fTimeFormat" : "", "fLabels" : null, "fModLabs" : null }, "fBarOffset" : 0, "fBarWidth" : 1000, "fEntries" : 10000, "fTsumw" : 9983, "fTsumw2" : 9983, "fTsumwx" : 175205, "fTsumwx2" : 3620667, "fMaximum" : -1111, "fMinimum" : -1111, "fNormFactor" : 0, "fContour" : [], "fSumw2" : [], "fOption" : "", "fFunctions" : { "_typename" : "TList", "name" : "TList", "arr" : [], "opt" : [] }, "fBufferSize" : 0, "fBuffer" : [], "fBinStatErrOpt" : 0, "fArray" : [0, 0, 0, 0, 86, 122, 117, 135, 176, 263, 306, 367, 412, 508, 596, 643, 618, 566, 524, 552, 503, 439, 418, 374, 333, 311, 229, 222, 188, 172, 123, 120, 92, 82, 81, 53, 47, 32, 36, 28, 27, 17, 14, 9, 10, 6, 8, 6, 4, 5, 3, 17] }'; |
} |
$json = json_decode($data, true); |
$class = $json['_typename']; |
$hname = $json['fName']; |
$htitle= $json['fTitle']; |
$xaxis = $json['fXaxis']; |
$xtitle= $xaxis['fTitle']; |
$xbins = $xaxis['fNbins']; |
$xmin = $xaxis['fXmin']; |
$xmax = $xaxis['fXmax']; |
$yaxis = $json['fYaxis']; |
$ytitle= $yaxis['fTitle']; |
$hdata=''; |
foreach( $json['fArray'] as $key => $value){ |
if($key != "0"){ |
$hdata .= ", "; |
} |
$hdata .= $value; |
} |
$cmd0 = ".L th1fit.cc+". PHP_EOL; |
$cmd0 .= "double data[]={". $hdata . "};" .PHP_EOL; |
$cmd0 .= "th1fit(data, \"$hname\",\"$htitle;$xtitle;$ytitle\", $xbins , $xmin, $xmax, $min ,$max ,\"$fitfun\");". PHP_EOL; |
if (file_exists('/opt/root/bin/thisroot.sh')){ |
$profile ='/opt/root/bin/thisroot.sh'; |
} |
$cmd ="bash -c 'source $profile ; root -b -l <<EOL" . PHP_EOL; |
$cmd .= $cmd0. PHP_EOL; |
$cmd .= "EOL'". PHP_EOL; |
executeCmd($cmd); |
//echo $cmd0; |
//echo "name=$name min=$min max=$max func=$fitfun data=$data"; |
?> |