3 if (typeof
JSROOT !=
"object") {
4 var e1 =
new Error(
"go4.js requires JSROOT to be already loaded");
9 if (typeof
GO4 ==
"object") {
10 var e1 =
new Error(
"GO4 already defined when loading go4.js");
17 GO4.version =
"6.1.x";
20 GO4.source_dir =
function() {
21 var scripts = document.getElementsByTagName(
'script');
23 for (var n in scripts) {
24 if (scripts[n][
'type'] !=
'text/javascript')
continue;
26 var src = scripts[n][
'src'];
27 if ((src == null) || (src.length == 0))
continue;
29 var pos = src.indexOf(
"html/go4.js");
31 if ((src.indexOf(
"JSRootCore") >= 0) || (src.indexOf(
"JSRoot.core") >= 0))
continue;
32 console.log(
'Set GO4.source_dir to ' + src.substr(0, pos));
33 return src.substr(0, pos);
40 if (!BasePainter.prototype.get_main_id) {
43 BasePainter.prototype.get_main_id =
function() {
44 var elem = this.selectDom();
45 if (elem.empty())
return "";
46 var
id = elem.attr(
"id");
48 id =
"go4_element_" +
GO4.id_counter++;
55 if (!BasePainter.prototype.getItemName)
56 BasePainter.prototype.getItemName = BasePainter.prototype.GetItemName;
58 if (typeof
JSROOT.httpRequest ==
'function')
61 GO4.httpRequest =
function(url, kind, post_data) {
62 return new Promise((resolveFunc,rejectFunc) => {
63 let req =
JSROOT.NewHttpRequest(url,kind, (res) => {
65 rejectFunc(Error(`Fail to request ${url}`));
70 req.send(post_data || null);
74 GO4.ExecuteMethod =
function(item, method, options, callback) {
76 if (item.getItemName())
77 prefix = item.getItemName() +
"/";
78 prefix +=
"exe.json\?method=";
80 var fullcom = prefix + method + (options ||
"&");
82 GO4.httpRequest(fullcom,
'text')
83 .then(() => callback(
true))
84 .catch(() => callback(
false))
85 .finally(() => console.log(
'Command is completed ' + prefix + method));
90 GO4.DrawAnalysisRatemeter =
function(divid, itemname) {
92 function CreateHTML() {
93 var elem = d3.select(
'#'+divid);
95 if (elem.size() == 0)
return null;
96 if (elem.select(
".event_rate").size() > 0)
return elem;
98 var html =
"<div style='padding-top:2px'>";
99 html +=
"<img class='go4_logo' style='vertical-align:middle;margin-left:5px;margin-right:5px;' src='go4sys/icons/go4logorun4.gif' alt='logo'></img>";
100 html +=
"<label class='event_source' style='border: 1px solid gray; font-size:large; vertical-align:middle; padding-left:3px; padding-right:3px;'>file.lmd</label> ";
101 html +=
"<label class='event_rate' style='border: 1px solid gray; font-size:large; vertical-align:middle; background-color: grey'; padding-left:3px; padding-right:3px;>---</label> Ev/s ";
102 html +=
"<label class='aver_rate' style='border: 1px solid gray; font-size:large; vertical-align:middle; padding-left:3px; padding-right:3px;'>---</label> Ev/s ";
103 html +=
"<label class='run_time' style='border: 1px solid gray; font-size:large; vertical-align:middle; padding-left:3px; padding-right:3px;'>---</label> s ";
104 html +=
"<label class='total_events' style='border: 1px solid gray; font-size:large; vertical-align:middle; padding-left:3px; padding-right:3px;'>---</label> Events ";
105 html +=
"<label class='analysis_time' style='border: 1px solid gray; font-size:large; vertical-align:middle; padding-left:3px; padding-right:3px;'>time</label>";
108 elem.style(
'overflow',
'hidden')
109 .style(
'padding-left',
'5px')
110 .style(
'display',
'inline-block')
111 .style(
'white-space',
'nowrap')
115 var brlayout =
JSROOT.hpainter ?
JSROOT.hpainter.brlayout : null,
116 sz = $(
'#'+divid +
" div").height() + 4;
120 brlayout.adjustSeparators(null, sz,
true);
122 brlayout.AdjustSeparator(null, sz,
true);
126 var xreq =
false, was_running = null;
128 function UpdateRatemeter() {
131 let elem = CreateHTML();
135 GO4.httpRequest(itemname+
"/root.json.gz",
'object').then(res => {
136 elem.select(
".event_rate").style(
'background-color', res.fbRunning ?
'lightgreen' :
'red');
137 if (was_running != res.fbRunning)
138 elem.select(
".go4_logo").attr(
"src", res.fbRunning ?
'go4sys/icons/go4logorun4.gif' :
'go4sys/icons/go4logo_t.png');
140 was_running = res.fbRunning;
142 elem.select(
".event_source").text(res.fxEventSource ==
"" ?
"<source>" : res.fxEventSource);
143 elem.select(
".event_rate").text(res.fdRate.toFixed(1));
144 elem.select(
".aver_rate").text((res.fdTime > 0 ? res.fuCurrentCount / res.fdTime : 0).toFixed(1));
145 elem.select(
".run_time").text(res.fdTime.toFixed(1));
146 elem.select(
".total_events").text(res.fuCurrentCount);
147 elem.select(
".analysis_time").text(res.fxDateString ==
"" ?
"<datime>" : res.fxDateString);
149 elem.select(
".event_rate").style(
'background-color',
'grey');
157 setInterval(UpdateRatemeter, 2000);
161 GO4.MakeMsgListRequest =
function(hitem, item) {
162 var arg =
"&max=2000";
163 if (
'last-id' in item) arg+=
"&id="+item[
'last-id'];
164 return 'exe.json.gz?method=Select' + arg;
167 GO4.AfterMsgListRequest =
function(hitem, item, obj) {
171 delete item[
'last-id'];
175 if (obj._typename !=
'TList')
return;
177 obj._typename =
"TGo4MsgList";
179 if (obj.arr.length>0) {
180 var duplicate = ((
'last-id' in item) && (item[
'last-id'] == obj.arr[0].fString));
182 item[
'last-id'] = obj.arr[0].fString;
185 if (duplicate) obj.arr.length = 1;
188 if (!(
'clear' in item))
189 item[
'clear'] =
function() {
delete this[
'last-id']; }
194 GO4.MsgListPainter =
function(divid, lst) {
195 BasePainter.call(
this, divid);
196 if (this.SetDivId) this.SetDivId(divid);
201 GO4.MsgListPainter.prototype = Object.create( BasePainter.prototype );
203 GO4.MsgListPainter.prototype.redrawObject =
function(obj) {
211 GO4.MsgListPainter.prototype.RedrawObject =
GO4.MsgListPainter.prototype.redrawObject;
213 GO4.MsgListPainter.prototype.Draw =
function() {
214 if (!this.lst)
return;
216 var frame =
JSROOT._ ? this.selectDom() : this.select_main();
218 var
main = frame.select(
"div");
220 main = frame.append(
"div")
221 .style(
'max-width',
'100%')
222 .style(
'max-height',
'100%')
223 .style(
'overflow',
'auto');
225 var old = main.selectAll(
"pre");
226 var newsize = old.size() + this.lst.arr.length - 1;
230 old.select(
function(d,i) {
return i < newsize - 2000 ?
this : null; }).
remove();
232 for (var i=this.lst.arr.length-1;i>0;i--)
233 main.append(
"pre").style(
'margin',
'3px').html(this.lst.arr[i].fString);
237 GO4.DrawMsgList =
function(divid, lst, opt) {
239 var painter =
new GO4.MsgListPainter(divid, lst);
244 painter.setTopPainter();
245 return Promise.resolve(painter);
248 painter.SetDivId(divid);
249 return painter.DrawingReady();
252 GO4.drawAnalysisTerminal =
function(hpainter, itemname) {
253 var url =
"", mdi, frame;
256 url = hpainter.getOnlineItemUrl(itemname);
257 mdi = hpainter.getDisplay();
258 if (mdi) frame = mdi.findFrame(itemname,
true);
260 url = hpainter.GetOnlineItemUrl(itemname);
261 mdi = hpainter.GetDisplay();
262 if (mdi) frame = mdi.FindFrame(itemname,
true);
265 if (!url || !frame)
return null;
267 var divid = d3.select(frame).attr(
'id');
269 var h = $(
"#"+divid).height(), w = $(
"#"+divid).width();
270 if ((h<10) && (w>10)) $(
"#"+divid).height(w*0.7);
274 player.hpainter = hpainter;
275 player.itemname = itemname;
276 player.draw_ready =
true;
277 player.needscroll =
false;
279 player.LogReady =
function(p) {
280 if (p) this.log_painter = p;
281 if(this.needscroll) {
283 this.needscroll =
false;
285 this.draw_ready =
true;
289 player.cleanup =
function() {
290 if (this.log_painter) {
291 this.log_painter.cleanup();
292 delete this.log_painter;
295 clearInterval(this.interval);
296 delete this.interval;
298 BasePainter.prototype.cleanup.call(
this);
301 player.Cleanup =
function() {
302 if (this.log_painter) {
303 this.log_painter.Cleanup();
304 delete this.log_painter;
307 clearInterval(this.interval);
308 delete this.interval;
310 BasePainter.prototype.Cleanup.call(
this);
314 player.ProcessTimer =
function() {
315 var subid =
"anaterm_output_container";
316 if ($(
"#" + subid).length == 0) {
318 return JSROOT._ ? this.cleanup() : this.Cleanup();
320 if (!this.draw_ready)
return;
322 var msgitem = this.itemname.replace(
"Control/Terminal",
"Status/Log");
324 this.draw_ready =
false;
326 if (this.log_painter)
327 this.hpainter.display(msgitem,
"update:divid:" + subid).then(() => this.LogReady());
329 this.hpainter.display(msgitem,
"divid:" + subid).then(p => this.LogReady(p));
331 this.hpainter.display(msgitem,
"divid:" + subid, () => this.LogReady());
334 player.ClickCommand =
function(kind) {
336 var command = this.itemname.replace(
"Terminal",
"CmdExecute");
338 this.hpainter.executeCommand(command, null, kind). then(() => { pthis.needscroll =
true; });
340 this.hpainter.ExecuteCommand(command,
function() { pthis.needscroll =
true; }, kind);
343 player.ClickClear =
function() {
344 document.getElementById(
"anaterm_output_container").firstChild.innerHTML =
"";
347 player.ClickScroll =
function() {
349 var disp = $(
"#anaterm_output_container").children(
":first");
350 disp.scrollTop(disp[0].scrollHeight - disp.height());
354 player.fillDisplay =
function(id) {
356 this.setTopPainter();
360 this.interval = setInterval(this.ProcessTimer.bind(
this), 2000);
364 $(
id +
" .go4_clearterm")
365 .button({text:
false, icons: { primary:
"ui-icon-blank MyTermButtonStyle"}})
366 .click(this.ClickClear.bind(
this))
368 .css(
'background-image',
"url(" +
GO4.source_dir +
"icons/clear.png)");
370 $(
id +
" .go4_endterm")
371 .button({text:
false, icons: { primary:
"ui-icon-blank MyTermButtonStyle"}})
372 .click(this.ClickScroll.bind(
this))
374 .css(
'background-image',
"url(" +
GO4.source_dir +
"icons/shiftdown.png)");
376 $(
id +
" .go4_printhistos")
377 .button({text:
false, icons: { primary:
"ui-icon-blank MyTermButtonStyle"}})
378 .click(this.ClickCommand.bind(
this,
"@PrintHistograms()"))
380 .css(
'background-image',
"url(" +
GO4.source_dir +
"icons/hislist.png)");
382 $(
id +
" .go4_printcond")
383 .button({text:
false, icons: { primary:
"ui-icon-blank MyTermButtonStyle"}})
384 .click(this.ClickCommand.bind(
this,
"@PrintConditions()"))
386 .css(
'background-image',
"url(" +
GO4.source_dir +
"icons/condlist.png)");
390 $(
"#go4_anaterm_cmd_form").submit(
392 var command = pthis.itemname.replace(
"Terminal",
"CmdExecute");
393 var cmdpar = document.getElementById(
"go4_anaterm_command").value;
394 console.log(
"submit command - " + cmdpar);
396 pthis.hpainter.executeCommand(command, null, cmdpar).then(() => { pthis.needscroll =
true; });
398 pthis.hpainter.ExecuteCommand(command,
function() { pthis.needscroll =
true; }, cmdpar);
399 event.preventDefault();
402 $(
id +
" .go4_executescript")
403 .button({text:
false, icons: { primary:
"ui-icon-blank MyTermButtonStyle"}})
405 .css(
'background-image',
"url(" +
GO4.source_dir +
"icons/macro_t.png)");
408 player.CheckResize = player.checkResize =
function() {}
410 $(
"#"+divid).load(
GO4.source_dir +
"html/terminal.htm",
"", () => player.fillDisplay(divid));
418 var canvsrc =
GO4.source_dir +
'html/go4canvas.js;';
421 jsrp.addDrawFunc({ name:
"TGo4WinCond", script: canvsrc +
GO4.source_dir +
'html/condition.js', func:
'GO4.drawGo4Cond', opt:
";editor" });
422 jsrp.addDrawFunc({ name:
"TGo4PolyCond", script: canvsrc +
GO4.source_dir +
'html/condition.js', func:
'GO4.drawGo4Cond', opt:
";editor" });
423 jsrp.addDrawFunc({ name:
"TGo4ShapedCond", script: canvsrc +
GO4.source_dir +
'html/condition.js', func:
'GO4.drawGo4Cond', opt:
";editor" });
424 jsrp.addDrawFunc({ name:
"TGo4CondArray", script: canvsrc +
GO4.source_dir +
'html/condition.js', func:
'GO4.drawCondArray', opt:
";editor" });
425 jsrp.addDrawFunc({ name:
"TGo4Marker", script: canvsrc, func:
'GO4.drawGo4Marker' });
427 jsrp.addDrawFunc({ name:
"TGo4AnalysisWebStatus", script:
GO4.source_dir +
'html/analysiseditor.js', func:
'GO4.drawGo4AnalysisStatus', opt:
"editor" });
429 jsrp.addDrawFunc({ name:
"TGo4MsgList", func:
GO4.DrawMsgList });
431 jsrp.addDrawFunc({ name:
"TGo4MbsEvent", noinspect:
true });
432 jsrp.addDrawFunc({ name:
"TGo4EventElement", noinspect:
true });
int main(int argc, char **argv)
GO4 MsgListPainter prototype Draw