00001
00002
00003
00006
00007 (function( factory ) {
00008 if ( typeof define === "function" && define.amd ) {
00009
00010 var jsroot = factory({});
00011
00012 var dir = jsroot.source_dir + "scripts/", ext = jsroot.source_min ? ".min" : "";
00013
00014 var paths = {
00015 'd3' : dir+'d3.v3.min',
00016 'jquery' : dir+'jquery.min',
00017 'jquery-ui' : dir+'jquery-ui.min',
00018 'jqueryui-mousewheel' : dir+'jquery.mousewheel'+ext,
00019 'jqueryui-touch-punch' : dir+'touch-punch.min',
00020 'rawinflate' : dir+'rawinflate'+ext,
00021 'MathJax' : 'https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_SVG&delayStartupUntil=configured',
00022 'saveSvgAsPng' : dir+'saveSvgAsPng'+ext,
00023 'threejs' : dir+'three'+ext,
00024 'threejs_all' : dir+'three.extra'+ext,
00025
00026 'JSRootMath' : dir+'JSRootMath'+ext,
00027 'JSRootInterface' : dir+'JSRootInterface'+ext,
00028 'JSRootIOEvolution' : dir+'JSRootIOEvolution'+ext,
00029 'JSRootPainter' : dir+'JSRootPainter'+ext,
00030 'JSRootPainter.more' : dir+'JSRootPainter.more'+ext,
00031 'JSRootPainter.jquery' : dir+'JSRootPainter.jquery'+ext,
00032 'JSRoot3DPainter' : dir+'JSRoot3DPainter'+ext,
00033 'ThreeCSG' : dir+'ThreeCSG'+ext,
00034 'JSRootGeoPainter' : dir+'JSRootGeoPainter'+ext
00035 };
00036
00037 var cfg_paths;
00038 if ((requirejs.s!==undefined) && (requirejs.s.contexts !== undefined) && ((requirejs.s.contexts._!==undefined) &&
00039 requirejs.s.contexts._.config!==undefined)) cfg_paths = requirejs.s.contexts._.config.paths;
00040 else console.warn("Require.js paths changed - please contact JSROOT developers");
00041
00042
00043 for (var module in paths)
00044 if (requirejs.defined(module) || (cfg_paths && (module in cfg_paths)))
00045 delete paths[module];
00046
00047
00048 requirejs.config({
00049 paths: paths,
00050 shim: {
00051 'jqueryui-mousewheel': { deps: ['jquery-ui'] },
00052 'jqueryui-touch-punch': { deps: ['jquery-ui'] },
00053 'threejs_all': { deps: [ 'threejs'] },
00054 'MathJax': {
00055 exports: 'MathJax',
00056 init: function () {
00057 MathJax.Hub.Config({ TeX: { extensions: ["color.js"] }});
00058 MathJax.Hub.Register.StartupHook("SVG Jax Ready",function () {
00059 var VARIANT = MathJax.OutputJax.SVG.FONTDATA.VARIANT;
00060 VARIANT["normal"].fonts.unshift("MathJax_SansSerif");
00061 VARIANT["bold"].fonts.unshift("MathJax_SansSerif-bold");
00062 VARIANT["italic"].fonts.unshift("MathJax_SansSerif");
00063 VARIANT["-tex-mathit"].fonts.unshift("MathJax_SansSerif");
00064 });
00065 MathJax.Hub.Startup.onload();
00066 return MathJax;
00067 }
00068 }
00069 }
00070 });
00071
00072
00073 define( jsroot );
00074
00075 if (!require.specified("JSRootCore"))
00076 define('JSRootCore', [], jsroot);
00077
00078 if (!require.specified("jsroot"))
00079 define('jsroot', [], jsroot);
00080
00081 } else {
00082
00083 if (typeof JSROOT != 'undefined')
00084 throw new Error("JSROOT is already defined", "JSRootCore.js");
00085
00086 JSROOT = {};
00087
00088 factory(JSROOT);
00089 }
00090 } (function(JSROOT) {
00091
00092 JSROOT.version = "4.5.0 25/04/2016";
00093
00094 JSROOT.source_dir = "";
00095 JSROOT.source_min = false;
00096 JSROOT.source_fullpath = "";
00097 JSROOT.bower_dir = "";
00098
00099 JSROOT.id_counter = 0;
00100
00101 JSROOT.touches = false;
00102 JSROOT.browser = { isOpera:false, isFirefox:true, isSafari:false, isChrome:false, isIE:false };
00103
00104 if ((typeof document !== "undefined") && (typeof window !== "undefined")) {
00105 var scripts = document.getElementsByTagName('script');
00106 for (var n = 0; n < scripts.length; ++n) {
00107 var src = scripts[n].src;
00108 if ((src===undefined) || (typeof src !== 'string')) continue;
00109
00110 var pos = src.indexOf("scripts/JSRootCore.");
00111 if (pos<0) continue;
00112
00113 JSROOT.source_dir = src.substr(0, pos);
00114 JSROOT.source_min = src.indexOf("scripts/JSRootCore.min.js") >= 0;
00115
00116 JSROOT.source_fullpath = src;
00117
00118 if ((console!==undefined) && (typeof console.log == 'function'))
00119 console.log("Set JSROOT.source_dir to " + JSROOT.source_dir + ", " + JSROOT.version);
00120 break;
00121 }
00122
00123 JSROOT.touches = ('ontouchend' in document);
00124 JSROOT.browser.isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
00125 JSROOT.browser.isFirefox = typeof InstallTrigger !== 'undefined';
00126 JSROOT.browser.isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
00127 JSROOT.browser.isChrome = !!window.chrome && !JSROOT.browser.isOpera;
00128 JSROOT.browser.isIE = false || !!document.documentMode;
00129 }
00130
00131 JSROOT.browser.isWebKit = JSROOT.browser.isChrome || JSROOT.browser.isSafari;
00132
00133
00134 JSROOT.gStyle = {
00135 Tooltip : 1,
00136 ContextMenu : true,
00137 Zooming : true,
00138 MoveResize : true,
00139 DragAndDrop : true,
00140 ToolBar : true,
00141 OptimizeDraw : 1,
00142 AutoStat : true,
00143 OptStat : 1111,
00144 OptFit : 0,
00145 FrameNDC : { fX1NDC: 0.07, fY1NDC: 0.12, fX2NDC: 0.95, fY2NDC: 0.88 },
00146 StatNDC : { fX1NDC: 0.78, fY1NDC: 0.75, fX2NDC: 0.98, fY2NDC: 0.91 },
00147 StatText : { fTextAngle: 0, fTextSize: 9, fTextAlign: 12, fTextColor: 1, fTextFont: 42 },
00148 StatFill : { fFillColor: 0, fFillStyle: 1001 },
00149 TimeOffset : 788918400000,
00150 StatFormat : "6.4g",
00151 FitFormat : "5.4g",
00152 Palette : 57,
00153 MathJax : 0,
00154 ProgressBox : true,
00155 Embed3DinSVG : 2,
00156 NoWebGL : false,
00157 EndErrorSize : 2
00158 };
00159
00160 JSROOT.BIT = function(n) { return 1 << (n); }
00161
00162
00163 JSROOT.TH1StatusBits = {
00164 kNoStats : JSROOT.BIT(9),
00165 kUserContour : JSROOT.BIT(10),
00166 kCanRebin : JSROOT.BIT(11),
00167 kLogX : JSROOT.BIT(15),
00168 kIsZoomed : JSROOT.BIT(16),
00169 kNoTitle : JSROOT.BIT(17),
00170 kIsAverage : JSROOT.BIT(18)
00171 };
00172
00173 JSROOT.EAxisBits = {
00174 kTickPlus : JSROOT.BIT(9),
00175 kTickMinus : JSROOT.BIT(10),
00176 kAxisRange : JSROOT.BIT(11),
00177 kCenterTitle : JSROOT.BIT(12),
00178 kCenterLabels : JSROOT.BIT(14),
00179 kRotateTitle : JSROOT.BIT(15),
00180 kPalette : JSROOT.BIT(16),
00181 kNoExponent : JSROOT.BIT(17),
00182 kLabelsHori : JSROOT.BIT(18),
00183 kLabelsVert : JSROOT.BIT(19),
00184 kLabelsDown : JSROOT.BIT(20),
00185 kLabelsUp : JSROOT.BIT(21),
00186 kIsInteger : JSROOT.BIT(22),
00187 kMoreLogLabels : JSROOT.BIT(23),
00188 kDecimals : JSROOT.BIT(11)
00189 };
00190
00191
00192
00193 JSROOT.console = function(value, divid) {
00194 if ((divid!=null) && (typeof divid=='string') && ((typeof document.getElementById(divid))!='undefined'))
00195 document.getElementById(divid).innerHTML = value;
00196 else
00197 if ((typeof console != 'undefined') && (typeof console.log == 'function'))
00198 console.log(value);
00199 }
00200
00201
00202
00203
00204
00205 JSROOT.JSONR_unref = function(value, dy) {
00206 var c, i, k, ks;
00207 if (!dy) dy = [];
00208
00209 switch (typeof value) {
00210 case 'string':
00211 if ((value.length > 5) && (value.substr(0, 5) == "$ref:")) {
00212 c = parseInt(value.substr(5));
00213 if (!isNaN(c) && (c < dy.length)) {
00214 value = dy[c];
00215 }
00216 }
00217 break;
00218
00219 case 'object':
00220 if (value !== null) {
00221
00222 if (Object.prototype.toString.apply(value) === '[object Array]') {
00223 for (i = 0; i < value.length; ++i) {
00224 value[i] = this.JSONR_unref(value[i], dy);
00225 }
00226 } else {
00227
00228
00229 if (dy.indexOf(value) === -1) {
00230 dy.push(value);
00231 }
00232
00233
00234 if ('_typename' in value) this.addMethods(value);
00235
00236 ks = Object.keys(value);
00237 for (i = 0; i < ks.length; ++i) {
00238 k = ks[i];
00239 value[k] = this.JSONR_unref(value[k], dy);
00240 }
00241 }
00242 }
00243 break;
00244 }
00245
00246 return value;
00247 }
00248
00249 JSROOT.debug = 0;
00250
00251
00252
00253 JSROOT.extend = function(tgt, src, map, deep_copy) {
00254 if ((src === null) || (typeof src !== 'object')) return src;
00255 if ((tgt === null) || (typeof tgt !== 'object')) tgt = {};
00256
00257 for (var k in src)
00258 tgt[k] = src[k];
00259
00260 return tgt;
00261 }
00262
00263
00264 JSROOT.clone = function(src, map) {
00265 if (src === null) return null;
00266
00267 if (!map) {
00268 map = { obj:[], clones:[] };
00269 } else {
00270 var i = map.obj.indexOf(src);
00271 if (i>=0) return map.clones[i];
00272 }
00273
00274 var proto = Object.prototype.toString.apply(src);
00275
00276
00277 if (proto === '[object Array]') {
00278 var tgt = [];
00279 map.obj.push(src);
00280 map.clones.push(tgt);
00281 for (var i = 0; i < src.length; ++i)
00282 tgt.push(JSROOT.clone(src[i], map));
00283
00284 return tgt;
00285 }
00286
00287
00288 if ((proto.indexOf('[object ') == 0) && (proto.indexOf('Array]') == proto.length-6)) {
00289 var tgt = [];
00290 map.obj.push(src);
00291 map.clones.push(tgt);
00292 for (var i = 0; i < src.length; ++i)
00293 tgt.push(src[i]);
00294
00295 return tgt;
00296 }
00297
00298 var tgt = {};
00299 map.obj.push(src);
00300 map.clones.push(tgt);
00301
00302 for (var k in src) {
00303 if (typeof src[k] === 'object')
00304 tgt[k] = JSROOT.clone(src[k], map);
00305 else
00306 tgt[k] = src[k];
00307 }
00308
00309 return tgt;
00310 }
00311
00312
00313
00314 JSROOT.clear_func = function(src, map) {
00315 if (src === null) return;
00316
00317 var proto = Object.prototype.toString.apply(src);
00318
00319 if (proto === '[object Array]') {
00320 for (var n=0;n<src.length;n++)
00321 if (typeof src[n] === 'object')
00322 JSROOT.clear_func(src[n], map);
00323 return;
00324 }
00325
00326 if ((proto.indexOf('[object ') == 0) && (proto.indexOf('Array]') == proto.length-6)) return;
00327
00328 if (!map) map = [];
00329 var nomap = (map.length == 0);
00330 if ('__clean_func__' in src) return;
00331
00332 map.push(src);
00333 src['__clean_func__'] = true;
00334
00335 for (var k in src) {
00336 if (typeof src[k] === 'object')
00337 JSROOT.clear_func(src[k], map);
00338 else
00339 if (typeof src[k] === 'function') delete src[k];
00340 }
00341
00342 if (nomap)
00343 for (var n=0;n<map.length;++n)
00344 delete map[n]['__clean_func__'];
00345 }
00346
00347
00348 JSROOT.parse = function(arg) {
00349 if ((arg==null) || (arg=="")) return null;
00350 var obj = JSON.parse(arg);
00351 if (obj!=null) obj = this.JSONR_unref(obj);
00352 return obj;
00353 }
00354
00355 JSROOT.GetUrlOption = function(opt, url, dflt) {
00356
00357
00358
00359
00360
00361 if (arguments.length < 3) dflt = null;
00362 if ((opt==null) || (typeof opt != 'string') || (opt.length==0)) return dflt;
00363
00364 if (!url) {
00365 if (typeof document === 'undefined') return dflt;
00366 url = document.URL;
00367 }
00368
00369 var pos = url.indexOf("?");
00370 if (pos<0) return dflt;
00371 url = url.slice(pos+1);
00372
00373 while (url.length>0) {
00374
00375 if (url==opt) return "";
00376
00377 pos = url.indexOf("&");
00378 if (pos < 0) pos = url.length;
00379
00380 if (url.indexOf(opt) == 0) {
00381 if (url.charAt(opt.length)=="&") return "";
00382
00383
00384 if (url.charAt(opt.length)=="=")
00385 return url.slice(opt.length+1, pos).replace(/%27/g, "'").replace(/%22/g, '"').replace(/%20/g, ' ').replace(/%3C/g, '<').replace(/%3E/g, '>').replace(/%5B/g, '[').replace(/%5D/g, ']');
00386 }
00387
00388 url = url.slice(pos+1);
00389 }
00390 return dflt;
00391 }
00392
00393 JSROOT.ParseAsArray = function(val) {
00394
00395
00396
00397
00398 var res = [];
00399
00400 if (typeof val != 'string') return res;
00401
00402 val = val.trim();
00403 if (val=="") return res;
00404
00405
00406 if ((val.length<2) || (val[0]!='[') || (val[val.length-1]!=']')) {
00407 res.push(val); return res;
00408 }
00409
00410
00411 var arr = val.substr(1, val.length-2).split(",");
00412
00413 for (var i = 0; i < arr.length; ++i) {
00414 var sub = arr[i].trim();
00415 if ((sub.length>1) && (sub[0]==sub[sub.length-1]) && ((sub[0]=='"') || (sub[0]=="'")))
00416 sub = sub.substr(1, sub.length-2);
00417 res.push(sub);
00418 }
00419 return res;
00420 }
00421
00422 JSROOT.GetUrlOptionAsArray = function(opt, url) {
00423
00424
00425
00426
00427
00428
00429
00430 var res = [];
00431
00432 while (opt.length>0) {
00433 var separ = opt.indexOf(";");
00434 var part = separ>0 ? opt.substr(0, separ) : opt;
00435 if (separ>0) opt = opt.substr(separ+1); else opt = "";
00436
00437 var val = this.GetUrlOption(part, url, null);
00438 res = res.concat(JSROOT.ParseAsArray(val));
00439 }
00440 return res;
00441 }
00442
00443 JSROOT.findFunction = function(name) {
00444 if (typeof name === 'function') return name;
00445 var func = window[name];
00446 if (typeof func == 'function') return func;
00447 var separ = name.lastIndexOf(".");
00448 if (separ<0) return null;
00449 var namespace = name.slice(0, separ);
00450 name = name.slice(separ+1);
00451 if (namespace=="JSROOT") func = this[name]; else
00452 if (namespace=="JSROOT.Painter") { if ('Painter' in this) func = this['Painter'][name]; } else
00453 if (window[namespace]) func = window[namespace][name];
00454 return (typeof func == 'function') ? func : null;
00455 }
00456
00457 JSROOT.CallBack = function(func, arg1, arg2) {
00458
00459
00460
00461
00462
00463 if (typeof func == 'string') func = JSROOT.findFunction(func);
00464
00465 if (func == null) return;
00466
00467 if (typeof func == 'function') return func(arg1,arg2);
00468
00469 if (typeof func != 'object') return;
00470
00471 if (('obj' in func) && ('func' in func) &&
00472 (typeof func.obj == 'object') && (typeof func.func == 'string') &&
00473 (typeof func.obj[func.func] == 'function')) {
00474 alert('Old-style call-back, change code for ' + func.func);
00475 return func.obj[func.func](arg1, arg2);
00476 }
00477 }
00478
00479 JSROOT.NewHttpRequest = function(url, kind, user_call_back) {
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493 var xhr = new XMLHttpRequest();
00494
00495 function callback(res) {
00496
00497 if (typeof user_call_back == 'function') user_call_back.call(xhr, res);
00498 }
00499
00500 var pthis = this;
00501
00502 if (window.ActiveXObject) {
00503
00504 xhr.onreadystatechange = function() {
00505 if (xhr.readyState != 4) return;
00506
00507 if (xhr.status != 200 && xhr.status != 206) {
00508
00509 return callback(null);
00510 }
00511
00512 if (kind == "xml") return callback(xhr.responseXML);
00513 if (kind == "text") return callback(xhr.responseText);
00514 if (kind == "object") return callback(pthis.parse(xhr.responseText));
00515 if (kind == "head") return callback(xhr);
00516
00517 if ((kind == "buf") && ('responseType' in xhr) &&
00518 (xhr.responseType == 'arraybuffer') && ('response' in xhr))
00519 return callback(xhr.response);
00520
00521 var filecontent = new String("");
00522 var array = new VBArray(xhr.responseBody).toArray();
00523 for (var i = 0; i < array.length; ++i)
00524 filecontent = filecontent + String.fromCharCode(array[i]);
00525 delete array;
00526 callback(filecontent);
00527 }
00528
00529 xhr.open(kind == 'head' ? 'HEAD' : 'GET', url, true);
00530
00531 if (kind=="buf") {
00532 if (('Uint8Array' in window) && ('responseType' in xhr))
00533 xhr.responseType = 'arraybuffer';
00534 }
00535
00536 } else {
00537
00538 xhr.onreadystatechange = function() {
00539 if (xhr.readyState != 4) return;
00540
00541 if (xhr.status != 200 && xhr.status != 206) {
00542 return callback(null);
00543 }
00544
00545 if (kind == "xml") return callback(xhr.responseXML);
00546 if (kind == "text") return callback(xhr.responseText);
00547 if (kind == "object") return callback(pthis.parse(xhr.responseText));
00548 if (kind == "head") return callback(xhr);
00549
00550
00551 if (! ('responseType' in xhr))
00552 return callback(xhr.responseText);
00553
00554 if ((kind=="bin") && ('Uint8Array' in window) && ('byteLength' in xhr.response)) {
00555
00556 var filecontent = "";
00557 var u8Arr = new Uint8Array(xhr.response, 0, xhr.response.byteLength);
00558 for (var i = 0; i < u8Arr.length; ++i)
00559 filecontent = filecontent + String.fromCharCode(u8Arr[i]);
00560 delete u8Arr;
00561
00562 return callback(filecontent);
00563 }
00564
00565 callback(xhr.response);
00566 }
00567
00568 xhr.open(kind == 'head' ? 'HEAD' : 'GET', url, true);
00569
00570 if ((kind == "bin") || (kind == "buf")) {
00571 if (('Uint8Array' in window) && ('responseType' in xhr)) {
00572 xhr.responseType = 'arraybuffer';
00573 } else {
00574
00575 xhr.overrideMimeType("text/plain; charset=x-user-defined");
00576 }
00577 }
00578
00579 }
00580 return xhr;
00581 }
00582
00583 JSROOT.loadScript = function(urllist, callback, debugout) {
00584
00585
00586
00587
00588
00589
00590
00591
00592 function completeLoad() {
00593 if (debugout)
00594 document.getElementById(debugout).innerHTML = "";
00595 else
00596 JSROOT.progress();
00597
00598 if ((urllist!=null) && (urllist.length>0))
00599 return JSROOT.loadScript(urllist, callback, debugout);
00600
00601 JSROOT.CallBack(callback);
00602 }
00603
00604 if ((urllist==null) || (urllist.length==0))
00605 return completeLoad();
00606
00607 var filename = urllist;
00608 var separ = filename.indexOf(";");
00609 if (separ>0) {
00610 filename = filename.substr(0, separ);
00611 urllist = urllist.slice(separ+1);
00612 } else {
00613 urllist = "";
00614 }
00615
00616 var isrootjs = false, isbower = false;
00617 if (filename.indexOf("$$$")===0) {
00618 isrootjs = true;
00619 filename = filename.slice(3);
00620 if ((filename.indexOf("style/")==0) && JSROOT.source_min &&
00621 (filename.lastIndexOf('.css')==filename.length-3) &&
00622 (filename.indexOf('.min.css')<0))
00623 filename = filename.slice(0, filename.length-4) + '.min.css';
00624 } else
00625 if (filename.indexOf("###")===0) {
00626 isbower = true;
00627 filename = filename.slice(3);
00628 }
00629 var isstyle = filename.indexOf('.css') > 0;
00630
00631 if (isstyle) {
00632 var styles = document.getElementsByTagName('link');
00633 for (var n = 0; n < styles.length; ++n) {
00634 if ((styles[n].type != 'text/css') || (styles[n].rel !== 'stylesheet')) continue;
00635
00636 var href = styles[n].href;
00637 if ((href == null) || (href.length == 0)) continue;
00638
00639 if (href.indexOf(filename)>=0) return completeLoad();
00640 }
00641
00642 } else {
00643 var scripts = document.getElementsByTagName('script');
00644
00645 for (var n = 0; n < scripts.length; ++n) {
00646
00647
00648 var src = scripts[n].src;
00649 if ((src == null) || (src.length == 0)) continue;
00650
00651 if ((src.indexOf(filename)>=0) && (src.indexOf("load=")<0)) {
00652
00653 return completeLoad();
00654 }
00655 }
00656 }
00657
00658 if (isrootjs && (JSROOT.source_dir!=null)) filename = JSROOT.source_dir + filename; else
00659 if (isbower && (JSROOT.bower_dir.length>0)) filename = JSROOT.bower_dir + filename;
00660
00661 var element = null;
00662
00663 if (debugout)
00664 document.getElementById(debugout).innerHTML = "loading " + filename + " ...";
00665 else
00666 JSROOT.progress("loading " + filename + " ...");
00667
00668 if (isstyle) {
00669 element = document.createElement("link");
00670 element.setAttribute("rel", "stylesheet");
00671 element.setAttribute("type", "text/css");
00672 element.setAttribute("href", filename);
00673 } else {
00674 element = document.createElement("script");
00675 element.setAttribute('type', "text/javascript");
00676 element.setAttribute('src', filename);
00677 }
00678
00679 if (element.readyState) {
00680 element.onreadystatechange = function() {
00681 if (element.readyState == "loaded" || element.readyState == "complete") {
00682 element.onreadystatechange = null;
00683 completeLoad();
00684 }
00685 }
00686 } else {
00687 element.onload = function() {
00688 element.onload = null;
00689 completeLoad();
00690 }
00691 }
00692
00693 document.getElementsByTagName("head")[0].appendChild(element);
00694 }
00695
00696 JSROOT.AssertPrerequisites = function(kind, callback, debugout) {
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706 var jsroot = JSROOT;
00707
00708 if (!('doing_assert' in jsroot)) jsroot.doing_assert = [];
00709
00710 if ((typeof kind !== 'string') || (kind == ''))
00711 return jsroot.CallBack(callback);
00712
00713 if (kind=='__next__') {
00714 if (jsroot.doing_assert.length==0) return;
00715 var req = jsroot.doing_assert[0];
00716 if ('running' in req) return;
00717 kind = req._kind;
00718 callback = req._callback;
00719 debugout = req._debug;
00720 } else {
00721 jsroot.doing_assert.push({_kind:kind, _callback:callback, _debug: debugout});
00722 if (jsroot.doing_assert.length > 1) return;
00723 }
00724
00725 jsroot.doing_assert[0]['running'] = true;
00726
00727 if (kind.charAt(kind.length-1)!=";") kind+=";";
00728
00729 var ext = jsroot.source_min ? ".min" : "";
00730
00731 var need_jquery = false, use_bower = (JSROOT.bower_dir.length>0);
00732
00733
00734 var mainfiles = "", extrafiles = "";
00735 var modules = [];
00736
00737 if (kind.indexOf('io;')>=0) {
00738 mainfiles += "$$$scripts/rawinflate" + ext + ".js;" +
00739 "$$$scripts/JSRootIOEvolution" + ext + ".js;";
00740 modules.push('JSRootIOEvolution');
00741 }
00742
00743 if (kind.indexOf('2d;')>=0) {
00744 if (!('_test_d3_' in jsroot)) {
00745 if (typeof d3 != 'undefined') {
00746 jsroot.console('Reuse existing d3.js ' + d3.version + ", required 3.4.10", debugout);
00747 jsroot['_test_d3_'] = 1;
00748 } else {
00749 mainfiles += use_bower ? '###d3/d3.min.js;' : '$$$scripts/d3.v3.min.js;';
00750 jsroot['_test_d3_'] = 2;
00751 }
00752 }
00753 modules.push('JSRootPainter');
00754 mainfiles += '$$$scripts/JSRootPainter' + ext + ".js;";
00755 extrafiles += '$$$style/JSRootPainter' + ext + '.css;';
00756 }
00757
00758 if (kind.indexOf('savepng;')>=0) {
00759 modules.push('saveSvgAsPng');
00760 mainfiles += '$$$scripts/saveSvgAsPng' + ext + ".js;";
00761 }
00762
00763 if (kind.indexOf('jq;')>=0) need_jquery = true;
00764
00765 if (kind.indexOf('math;')>=0) {
00766 mainfiles += '$$$scripts/JSRootMath' + ext + ".js;";
00767 modules.push('JSRootMath');
00768 }
00769
00770 if (kind.indexOf('more2d;')>=0) {
00771 mainfiles += '$$$scripts/JSRootPainter.more' + ext + ".js;";
00772 modules.push('JSRootPainter.more');
00773 }
00774
00775 if (kind.indexOf('jq2d;')>=0) {
00776 mainfiles += '$$$scripts/JSRootPainter.jquery' + ext + ".js;";
00777 modules.push('JSRootPainter.jquery');
00778 need_jquery = true;
00779 }
00780
00781 if ((kind.indexOf("3d;")>=0) || (kind.indexOf("geom;")>=0)) {
00782 if (use_bower)
00783 mainfiles += "###threejs/build/three.min.js;" +
00784 "###threejs/examples/js/utils/FontUtils.js;" +
00785 "###threejs/examples/js/renderers/Projector.js;" +
00786 "###threejs/examples/js/renderers/CanvasRenderer.js;" +
00787 "###threejs/examples/js/geometries/TextGeometry.js;" +
00788 "###threejs/examples/js/controls/OrbitControls.js;" +
00789 "###threejs/examples/js/controls/TransformControls.js;" +
00790 "###threejs/examples/fonts/helvetiker_regular.typeface.js";
00791 else
00792 mainfiles += "$$$scripts/three" + ext + ".js;" +
00793 "$$$scripts/three.extra" + ext + ".js;";
00794 modules.push("threejs_all");
00795 mainfiles += "$$$scripts/JSRoot3DPainter" + ext + ".js;";
00796 modules.push('JSRoot3DPainter');
00797 }
00798
00799 if (kind.indexOf("geom;")>=0) {
00800 mainfiles += "$$$scripts/ThreeCSG" + ext + ".js;" +
00801 "$$$scripts/JSRootGeoPainter" + ext + ".js;";
00802 extrafiles += "$$$style/JSRootGeoPainter" + ext + ".css;";
00803 modules.push('ThreeCSG', 'JSRootGeoPainter');
00804 }
00805
00806 if (kind.indexOf("mathjax;")>=0) {
00807 if (typeof MathJax == 'undefined') {
00808 mainfiles += (use_bower ? "###MathJax/MathJax.js" : "https://cdn.mathjax.org/mathjax/latest/MathJax.js") +
00809 "?config=TeX-AMS-MML_SVG," + jsroot.source_dir + "scripts/mathjax_config.js;";
00810 }
00811 if (JSROOT.gStyle.MathJax == 0) JSROOT.gStyle.MathJax = 1;
00812 modules.push('MathJax');
00813 }
00814
00815 if (kind.indexOf("simple;")>=0) {
00816 need_jquery = true;
00817 mainfiles += '$$$scripts/JSRootInterface' + ext + ".js;";
00818 extrafiles += '$$$style/JSRootInterface' + ext + '.css;';
00819 modules.push('JSRootInterface');
00820 }
00821
00822 if (need_jquery && (JSROOT.load_jquery==null)) {
00823 var has_jq = (typeof jQuery != 'undefined'), lst_jq = "";
00824
00825 if (has_jq)
00826 jsroot.console('Reuse existing jQuery ' + jQuery.fn.jquery + ", required 2.1.4", debugout);
00827 else
00828 lst_jq += (use_bower ? "###jquery/dist" : "$$$scripts") + "/jquery.min.js;";
00829 if (has_jq && typeof $.ui != 'undefined')
00830 jsroot.console('Reuse existing jQuery-ui ' + $.ui.version + ", required 1.11.4", debugout);
00831 else {
00832 lst_jq += (use_bower ? "###jquery-ui" : "$$$scripts") + '/jquery-ui.min.js;';
00833 extrafiles += '$$$style/jquery-ui' + ext + '.css;';
00834 }
00835
00836 if (JSROOT.touches) {
00837 lst_jq += use_bower ? '###jqueryui-touch-punch/jquery.ui.touch-punch.min.js;' : '$$$scripts/touch-punch.min.js;';
00838 modules.push('jqueryui-touch-punch');
00839 }
00840
00841 modules.splice(0,0, 'jquery', 'jquery-ui', 'jqueryui-mousewheel');
00842 mainfiles = lst_jq + mainfiles;
00843
00844 jsroot.load_jquery = true;
00845 }
00846
00847 var pos = kind.indexOf("user:");
00848 if (pos<0) pos = kind.indexOf("load:");
00849 if (pos>=0) extrafiles += kind.slice(pos+5);
00850
00851 function load_callback() {
00852 var req = jsroot.doing_assert.shift();
00853 jsroot.CallBack(req._callback);
00854 jsroot.AssertPrerequisites('__next__');
00855 }
00856
00857 if ((typeof define === "function") && define.amd && (modules.length>0)) {
00858 jsroot.console("loading " + JSON.stringify(modules) + " with require.js", debugout);
00859 require(modules, function() {
00860 jsroot.loadScript(extrafiles, load_callback, debugout);
00861 });
00862 } else {
00863 jsroot.loadScript(mainfiles + extrafiles, load_callback, debugout);
00864 }
00865 }
00866
00867
00868 JSROOT.OpenFile = function(filename, callback) {
00869 JSROOT.AssertPrerequisites("io", function() {
00870 new JSROOT.TFile(filename, callback);
00871 });
00872 }
00873
00874
00875
00876
00877 JSROOT.draw = function(divid, obj, opt) {
00878 JSROOT.AssertPrerequisites("2d", function() {
00879 JSROOT.draw(divid, obj, opt);
00880 });
00881 }
00882
00883 JSROOT.redraw = function(divid, obj, opt) {
00884 JSROOT.AssertPrerequisites("2d", function() {
00885 JSROOT.redraw(divid, obj, opt);
00886 });
00887 }
00888
00889 JSROOT.BuildSimpleGUI = function(user_scripts, andThen) {
00890 if (typeof user_scripts == 'function') {
00891 andThen = user_scripts;
00892 user_scripts = null;
00893 }
00894
00895 var debugout = null;
00896 var nobrowser = JSROOT.GetUrlOption('nobrowser')!=null;
00897 var requirements = "io;2d;";
00898
00899 if (document.getElementById('simpleGUI')) {
00900 debugout = 'simpleGUI';
00901 if ((JSROOT.GetUrlOption('json')!=null) &&
00902 (JSROOT.GetUrlOption('file')==null) &&
00903 (JSROOT.GetUrlOption('files')==null)) requirements = "2d;";
00904 } else
00905 if (document.getElementById('onlineGUI')) { debugout = 'onlineGUI'; requirements = "2d;"; } else
00906 if (document.getElementById('drawGUI')) { debugout = 'drawGUI'; requirements = "2d;"; nobrowser = true; }
00907
00908 if (user_scripts == 'check_existing_elements') {
00909 user_scripts = null;
00910 if (debugout == null) return;
00911 }
00912
00913 if (!nobrowser) requirements += 'jq2d;simple;';
00914
00915 if (user_scripts == null) user_scripts = JSROOT.GetUrlOption("autoload");
00916 if (user_scripts == null) user_scripts = JSROOT.GetUrlOption("load");
00917
00918 if (user_scripts != null)
00919 requirements += "load:" + user_scripts + ";";
00920
00921 JSROOT.AssertPrerequisites(requirements, function() {
00922 JSROOT.CallBack(JSROOT.findFunction(nobrowser ? 'JSROOT.BuildNobrowserGUI' : 'BuildSimpleGUI'));
00923 JSROOT.CallBack(andThen);
00924 }, debugout);
00925 };
00926
00927 JSROOT.Create = function(typename, target) {
00928 var obj = target;
00929 if (obj == null) obj = { _typename: typename };
00930
00931 switch (typename) {
00932 case 'TObject':
00933 JSROOT.extend(obj, { fUniqueID: 0, fBits: 0x3000008 });
00934 break;
00935 case 'TNamed':
00936 JSROOT.extend(obj, { fUniqueID: 0, fBits: 0x3000008, fName: "", fTitle: "" });
00937 break;
00938 case 'TList':
00939 case 'THashList':
00940 JSROOT.extend(obj, { name: typename, arr : [], opt : [] });
00941 break;
00942 case 'TAttAxis':
00943 JSROOT.extend(obj, { fNdivisions: 510, fAxisColor: 1,
00944 fLabelColor: 1, fLabelFont: 42, fLabelOffset: 0.005, fLabelSize: 0.035, fTickLength: 0.03,
00945 fTitleOffset: 1, fTitleSize: 0.035, fTitleColor: 1, fTitleFont : 42 });
00946 break;
00947 case 'TAxis':
00948 JSROOT.Create("TNamed", obj);
00949 JSROOT.Create("TAttAxis", obj);
00950 JSROOT.extend(obj, { fNbins: 0, fXmin: 0, fXmax: 0, fXbins : [], fFirst: 0, fLast: 0,
00951 fBits2: 0, fTimeDisplay: false, fTimeFormat: "", fLabels: null });
00952 break;
00953 case 'TAttLine':
00954 JSROOT.extend(obj, { fLineColor: 1, fLineStyle : 1, fLineWidth : 1 });
00955 break;
00956 case 'TAttFill':
00957 JSROOT.extend(obj, { fFillColor: 0, fFillStyle : 0 } );
00958 break;
00959 case 'TAttMarker':
00960 JSROOT.extend(obj, { fMarkerColor: 1, fMarkerStyle : 1, fMarkerSize : 1. });
00961 break;
00962 case 'TLine':
00963 JSROOT.Create("TObject", obj);
00964 JSROOT.Create("TAttLine", obj);
00965 JSROOT.extend(obj, { fX1: 0, fX2: 1, fY1: 0, fY2: 1 });
00966 break;
00967 case 'TBox':
00968 JSROOT.Create("TObject", obj);
00969 JSROOT.Create("TAttLine", obj);
00970 JSROOT.Create("TAttFill", obj);
00971 JSROOT.extend(obj, { fX1: 0, fX2: 1, fY1: 0, fY2: 1 });
00972 break;
00973 case 'TPave':
00974 JSROOT.Create("TBox", obj);
00975 JSROOT.extend(obj, { fX1NDC : 0., fY1NDC: 0, fX2NDC: 1, fY2NDC: 1,
00976 fBorderSize: 0, fInit: 1, fShadowColor: 1,
00977 fCornerRadius: 0, fOption: "blNDC", fName: "title" });
00978 break;
00979 case 'TAttText':
00980 JSROOT.extend(obj, { fTextAngle: 0, fTextSize: 0, fTextAlign: 22, fTextColor: 1, fTextFont: 42});
00981 break;
00982 case 'TPaveText':
00983 JSROOT.Create("TPave", obj);
00984 JSROOT.Create("TAttText", obj);
00985 JSROOT.extend(obj, { fLabel: "", fLongest: 27, fMargin: 0.05, fLines: JSROOT.Create("TList") });
00986 break;
00987 case 'TPaveStats':
00988 JSROOT.Create("TPaveText", obj);
00989 JSROOT.extend(obj, { fOptFit: 0, fOptStat: 0, fFitFormat: "", fStatFormat: "", fParent: null });
00990 break;
00991 case 'TObjString':
00992 JSROOT.Create("TObject", obj);
00993 JSROOT.extend(obj, { fString: "" });
00994 break;
00995 case 'TH1':
00996 JSROOT.Create("TNamed", obj);
00997 JSROOT.Create("TAttLine", obj);
00998 JSROOT.Create("TAttFill", obj);
00999 JSROOT.Create("TAttMarker", obj);
01000
01001 JSROOT.extend(obj, {
01002 fNcells : 0,
01003 fXaxis: JSROOT.Create("TAxis"),
01004 fYaxis: JSROOT.Create("TAxis"),
01005 fZaxis: JSROOT.Create("TAxis"),
01006 fBarOffset: 0, fBarWidth: 1000, fEntries: 0.,
01007 fTsumw: 0., fTsumw2: 0., fTsumwx: 0., fTsumwx2: 0.,
01008 fMaximum: -1111., fMinimum: -1111, fNormFactor: 0., fContour: [],
01009 fSumw2: [], fOption: "",
01010 fFunctions: JSROOT.Create("TList"),
01011 fBufferSize: 0, fBuffer: [], fBinStatErrOpt: 0 });
01012 break;
01013 case 'TH1I':
01014 case 'TH1F':
01015 case 'TH1D':
01016 case 'TH1S':
01017 case 'TH1C':
01018 JSROOT.Create("TH1", obj);
01019 obj.fArray = [];
01020 break;
01021 case 'TH2':
01022 JSROOT.Create("TH1", obj);
01023 JSROOT.extend(obj, { fScalefactor: 1., fTsumwy: 0., fTsumwy2: 0, fTsumwxy : 0});
01024 break;
01025 case 'TH2I':
01026 case 'TH2F':
01027 case 'TH2D':
01028 case 'TH2S':
01029 case 'TH2C':
01030 JSROOT.Create("TH2", obj);
01031 obj.fArray = [];
01032 break;
01033 case 'TGraph':
01034 JSROOT.Create("TNamed", obj);
01035 JSROOT.Create("TAttLine", obj);
01036 JSROOT.Create("TAttFill", obj);
01037 JSROOT.Create("TAttMarker", obj);
01038 JSROOT.extend(obj, { fFunctions: JSROOT.Create("TList"), fHistogram: null,
01039 fMaxSize: 0, fMaximum:-1111, fMinimum:-1111, fNpoints: 0, fX: [], fY: [] });
01040 break;
01041 case 'TMultiGraph':
01042 JSROOT.Create("TNamed", obj);
01043 JSROOT.extend(obj, { fFunctions: JSROOT.Create("TList"), fGraphs: JSROOT.Create("TList"),
01044 fHistogram: null, fMaximum: -1111, fMinimum: -1111 });
01045 break;
01046 case 'TGaxis':
01047 JSROOT.Create("TLine", obj);
01048 JSROOT.Create("TAttText", obj);
01049 JSROOT.extend(obj, { _fChopt: "", fFunctionName: "", fGridLength: 0,
01050 fLabelColor: 1, fLabelFont: 42, fLabelOffset: 0.005, fLabelSize: 0.035,
01051 fName: "", fNdiv: 12, fTickSize: 0.02, fTimeFormat: "",
01052 fTitle: "", fTitleOffset: 1, fTitleSize: 0.035,
01053 fWmax: 100, fWmin: 0 });
01054 break;
01055
01056 }
01057
01058 obj._typename = typename;
01059 this.addMethods(obj);
01060 return obj;
01061 }
01062
01063
01064 JSROOT.CreateTList = function() { return JSROOT.Create("TList"); }
01065 JSROOT.CreateTAxis = function() { return JSROOT.Create("TAxis"); }
01066
01067 JSROOT.CreateTH1 = function(nbinsx) {
01068
01069 var histo = JSROOT.extend(JSROOT.Create("TH1I"),
01070 { fName: "dummy_histo_" + this.id_counter++, fTitle: "dummytitle" });
01071
01072 if (nbinsx!==undefined) {
01073 histo.fNcells = nbinsx+2;
01074 for (var i=0;i<histo.fNcells;++i) histo.fArray.push(0);
01075 JSROOT.extend(histo.fXaxis, { fNbins: nbinsx, fXmin: 0, fXmax: nbinsx });
01076 }
01077 return histo;
01078 }
01079
01080 JSROOT.CreateTH2 = function(nbinsx, nbinsy) {
01081
01082 var histo = JSROOT.extend(JSROOT.Create("TH2I"),
01083 { fName: "dummy_histo_" + this.id_counter++, fTitle: "dummytitle" });
01084
01085 if ((nbinsx!==undefined) && (nbinsy!==undefined)) {
01086 histo.fNcells = (nbinsx+2) * (nbinsy+2);
01087 for (var i=0;i<histo.fNcells;++i) histo.fArray.push(0);
01088 JSROOT.extend(histo.fXaxis, { fNbins: nbinsx, fXmin: 0, fXmax: nbinsx });
01089 JSROOT.extend(histo.fYaxis, { fNbins: nbinsy, fXmin: 0, fXmax: nbinsy });
01090 }
01091 return histo;
01092 }
01093
01094 JSROOT.CreateTGraph = function(npoints, xpts, ypts) {
01095 var graph = JSROOT.extend(JSROOT.Create("TGraph"),
01096 { fBits: 0x3000408, fName: "dummy_graph_" + this.id_counter++, fTitle: "dummytitle" });
01097
01098 if (npoints>0) {
01099 graph.fMaxSize = graph.fNpoints = npoints;
01100
01101 var usex = (typeof xpts == 'object') && (xpts.length === npoints);
01102 var usey = (typeof ypts == 'object') && (ypts.length === npoints);
01103
01104 for (var i=0;i<npoints;++i) {
01105 graph.fX.push(usex ? xpts[i] : i/npoints);
01106 graph.fY.push(usey ? ypts[i] : i/npoints);
01107 }
01108 }
01109
01110 return graph;
01111 }
01112
01113 JSROOT.CreateTMultiGraph = function() {
01114 var mgraph = JSROOT.Create("TMultiGraph");
01115 for(var i=0; i<arguments.length; ++i)
01116 mgraph.fGraphs.Add(arguments[i], "");
01117 return mgraph;
01118 }
01119
01120 JSROOT.methodsCache = {};
01121
01122 JSROOT.getMethods = function(typename, obj) {
01123 var m = JSROOT.methodsCache[typename];
01124
01125 if (m !== undefined) return m;
01126
01127 m = {};
01128
01129 if ((typename=="TObject") || (typename=="TNamed") || ((obj!==undefined) && ('fBits' in obj))) {
01130 m.TestBit = function (f) { return (this.fBits & f) != 0; };
01131 m.InvertBit = function (f) { this.fBits = this.fBits ^ (f & 0xffffff); };
01132 }
01133
01134 if ((typename === 'TList') || (typename === 'THashList')) {
01135 m.Clear = function() {
01136 this.arr = [];
01137 this.opt = [];
01138 }
01139 m.Add = function(obj,opt) {
01140 this.arr.push(obj);
01141 this.opt.push((opt && typeof opt=='string') ? opt : "");
01142 }
01143 m.AddFirst = function(obj,opt) {
01144 this.arr.unshift(obj);
01145 this.opt.unshift((opt && typeof opt=='string') ? opt : "");
01146 }
01147 m.RemoveAt = function(indx) {
01148 this.arr.splice(indx, 1);
01149 this.opt.splice(indx, 1);
01150 }
01151 }
01152
01153 if ((typename === "TPaveText") || (typename === "TPaveStats")) {
01154 m.AddText = function(txt) {
01155 this.fLines.Add({ fTitle: txt, fTextColor: 1 });
01156 }
01157 m.Clear = function() {
01158 this.fLines.Clear();
01159 }
01160 }
01161
01162 if (typename.indexOf("TF1") == 0) {
01163 m.addFormula = function(obj) {
01164 if (obj==null) return;
01165 if (!('formulas' in this)) this.formulas = [];
01166 this.formulas.push(obj);
01167 }
01168
01169 m.evalPar = function(x) {
01170 if (! ('_func' in this) || (this._title !== this.fTitle)) {
01171
01172 var _func = this.fTitle;
01173
01174 if ('formulas' in this)
01175 for (var i=0;i<this.formulas.length;++i)
01176 while (_func.indexOf(this.formulas[i].fName) >= 0)
01177 _func = _func.replace(this.formulas[i].fName, this.formulas[i].fTitle);
01178 _func = _func.replace(/\b(abs)\b/g, 'TMath::Abs');
01179 _func = _func.replace('TMath::Exp(', 'Math.exp(');
01180 _func = _func.replace('TMath::Abs(', 'Math.abs(');
01181 if (typeof JSROOT.Math == 'object') {
01182 this._math = JSROOT.Math;
01183 _func = _func.replace('TMath::Prob(', 'this._math.Prob(');
01184 _func = _func.replace('gaus(', 'this._math.gaus(this, x, ');
01185 _func = _func.replace('gausn(', 'this._math.gausn(this, x, ');
01186 _func = _func.replace('expo(', 'this._math.expo(this, x, ');
01187 _func = _func.replace('landau(', 'this._math.landau(this, x, ');
01188 _func = _func.replace('landaun(', 'this._math.landaun(this, x, ');
01189 }
01190 _func = _func.replace('pi', 'Math.PI');
01191 for (var i=0;i<this.fNpar;++i)
01192 while(_func.indexOf('['+i+']') != -1)
01193 _func = _func.replace('['+i+']', this.GetParValue(i));
01194 _func = _func.replace(/\b(sin)\b/gi, 'Math.sin');
01195 _func = _func.replace(/\b(cos)\b/gi, 'Math.cos');
01196 _func = _func.replace(/\b(tan)\b/gi, 'Math.tan');
01197 _func = _func.replace(/\b(exp)\b/gi, 'Math.exp');
01198
01199 this._func = new Function("x", "return " + _func).bind(this);
01200 this._title = this.fTitle;
01201 }
01202
01203 return this._func(x);
01204 }
01205 m.GetParName = function(n) {
01206 if (('fFormula' in this) && ('fParams' in this.fFormula)) return this.fFormula.fParams[n].first;
01207 if ('fNames' in this) return this.fNames[n];
01208 return "Par"+n;
01209 }
01210 m.GetParValue = function(n) {
01211 if (('fFormula' in this) && ('fClingParameters' in this.fFormula)) return this.fFormula.fClingParameters[n];
01212 if (('fParams' in this) && (this.fParams!=null)) return this.fParams[n];
01213 return null;
01214 }
01215 }
01216
01217 if ((typename.indexOf("TGraph") == 0) || (typename == "TCutG")) {
01218
01219 m.IsInside = function(xp,yp) {
01220 var j = this.fNpoints - 1, x = this.fX, y = this.fY;
01221 var oddNodes = false;
01222
01223 for (var i=0; i<this.fNpoints; ++i) {
01224 if ((y[i]<yp && y[j]>=yp) || (y[j]<yp && y[i]>=yp)) {
01225 if (x[i]+(yp-y[i])/(y[j]-y[i])*(x[j]-x[i])<xp) {
01226 oddNodes = !oddNodes;
01227 }
01228 }
01229 j=i;
01230 }
01231
01232 return oddNodes;
01233 };
01234 }
01235
01236 if (typename.indexOf("TH1") == 0 ||
01237 typename.indexOf("TH2") == 0 ||
01238 typename.indexOf("TH3") == 0) {
01239 m.getBinError = function(bin) {
01240
01241
01242
01243
01244 if (bin >= this.fNcells) bin = this.fNcells - 1;
01245 if (bin < 0) bin = 0;
01246 if (bin < this.fSumw2.length)
01247 return Math.sqrt(this.fSumw2[bin]);
01248 return Math.sqrt(Math.abs(this.fArray[bin]));
01249 };
01250 m.setBinContent = function(bin, content) {
01251
01252 this.fEntries++;
01253 this.fTsumw = 0;
01254 if ((bin>=0) && (bin<this.fArray.length))
01255 this.fArray[bin] = content;
01256 };
01257 }
01258
01259 if (typename.indexOf("TH1") == 0) {
01260 m.getBin = function(x) { return x; }
01261 m.getBinContent = function(bin) { return this.fArray[bin]; }
01262 }
01263
01264 if (typename.indexOf("TH2") == 0) {
01265 m.getBin = function(x, y) { return (x + (this.fXaxis.fNbins+2) * y); }
01266 m.getBinContent = function(x, y) { return this.fArray[this.getBin(x, y)]; }
01267 }
01268
01269 if (typename.indexOf("TH3") == 0) {
01270 m.getBin = function(x, y, z) { return (x + (this.fXaxis.fNbins+2) * (y + (this.fYaxis.fNbins+2) * z)); }
01271 m.getBinContent = function(x, y, z) { return this.fArray[this.getBin(x, y, z)]; };
01272 }
01273
01274 if (typename.indexOf("TProfile") == 0) {
01275 m.getBin = function(x) { return x; }
01276 m.getBinContent = function(bin) {
01277 if (bin < 0 || bin >= this.fNcells) return 0;
01278 if (this.fBinEntries[bin] < 1e-300) return 0;
01279 if (!this.fArray) return 0;
01280 return this.fArray[bin]/this.fBinEntries[bin];
01281 };
01282 m.getBinEffectiveEntries = function(bin) {
01283 if (bin < 0 || bin >= this.fNcells) return 0;
01284 var sumOfWeights = this.fBinEntries[bin];
01285 if ( this.fBinSumw2 == null || this.fBinSumw2.length != this.fNcells) {
01286
01287 return sumOfWeights;
01288 }
01289 var sumOfWeightsSquare = this.fSumw2[bin];
01290 return ( sumOfWeightsSquare > 0 ? sumOfWeights * sumOfWeights / sumOfWeightsSquare : 0 );
01291 };
01292 m.getBinError = function(bin) {
01293 if (bin < 0 || bin >= this.fNcells) return 0;
01294 var cont = this.fArray[bin],
01295 sum = this.fBinEntries[bin],
01296 err2 = this.fSumw2[bin],
01297 neff = this.getBinEffectiveEntries(bin);
01298 if (sum < 1e-300) return 0;
01299 var EErrorType = { kERRORMEAN : 0, kERRORSPREAD : 1, kERRORSPREADI : 2, kERRORSPREADG : 3 };
01300
01301 if (this.fErrorMode === EErrorType.kERRORSPREADG)
01302 return 1.0/Math.sqrt(sum);
01303
01304 var contsum = cont/sum;
01305 var eprim2 = Math.abs(err2/sum - contsum*contsum);
01306 var eprim = Math.sqrt(eprim2);
01307 if (this.fErrorMode === EErrorType.kERRORSPREADI) {
01308 if (eprim != 0) return eprim/Math.sqrt(neff);
01309
01310
01311 return 1.0/Math.sqrt(12*neff);
01312 }
01313
01314
01315
01316 if (this.fErrorMode === EErrorType.kERRORSPREAD) return eprim;
01317
01318
01319 return (eprim/Math.sqrt(neff));
01320 };
01321 }
01322
01323 JSROOT.methodsCache[typename] = m;
01324 return m;
01325 };
01326
01327 JSROOT.addMethods = function(obj) {
01328 this.extend(obj, JSROOT.getMethods(obj._typename, obj));
01329 };
01330
01331 JSROOT.lastFFormat = "";
01332
01333 JSROOT.FFormat = function(value, fmt) {
01334
01335
01336
01337 if (!fmt) fmt = "6.4g";
01338
01339 JSROOT.lastFFormat = "";
01340
01341 fmt = fmt.trim();
01342 var len = fmt.length;
01343 if (len<2) return value.toFixed(4);
01344 var last = fmt.charAt(len-1);
01345 fmt = fmt.slice(0,len-1);
01346 var isexp = null;
01347 var prec = fmt.indexOf(".");
01348 if (prec<0) prec = 4; else prec = Number(fmt.slice(prec+1));
01349 if (isNaN(prec) || (prec<0) || (prec==null)) prec = 4;
01350
01351 var significance = false;
01352 if ((last=='e') || (last=='E')) { isexp = true; } else
01353 if (last=='Q') { isexp = true; significance = true; } else
01354 if ((last=='f') || (last=='F')) { isexp = false; } else
01355 if (last=='W') { isexp = false; significance = true; } else
01356 if ((last=='g') || (last=='G')) {
01357 var se = JSROOT.FFormat(value, fmt+'Q');
01358 var _fmt = JSROOT.lastFFormat;
01359 var sg = JSROOT.FFormat(value, fmt+'W');
01360
01361 if (se.length < sg.length) {
01362 JSROOT.lastFFormat = _fmt;
01363 return se;
01364 }
01365 return sg;
01366 } else {
01367 isexp = false;
01368 prec = 4;
01369 }
01370
01371 if (isexp) {
01372
01373 if (significance) prec--;
01374 if (prec<0) prec = 0;
01375
01376 JSROOT.lastFFormat = '5.'+prec+'e';
01377
01378 return value.toExponential(prec);
01379 }
01380
01381 var sg = value.toFixed(prec);
01382
01383 if (significance) {
01384
01385
01386 if ((value!=0) && (Number(sg)==0.) && (prec>0)) {
01387 prec = 20; sg = value.toFixed(prec);
01388 }
01389
01390 var l = 0;
01391 while ((l<sg.length) && (sg.charAt(l) == '0' || sg.charAt(l) == '-' || sg.charAt(l) == '.')) l++;
01392
01393 var diff = sg.length - l - prec;
01394 if (sg.indexOf(".")>l) diff--;
01395
01396 if (diff != 0) {
01397 prec-=diff;
01398 if (prec<0) prec = 0; else if (prec>20) prec = 20;
01399 sg = value.toFixed(prec);
01400 }
01401 }
01402
01403 JSROOT.lastFFormat = '5.'+prec+'f';
01404
01405 return sg;
01406 }
01407
01408 JSROOT.log10 = function(n) {
01409 return Math.log(n) / Math.log(10);
01410 }
01411
01412
01413 JSROOT.progress = function(msg) {
01414 if ((msg !== undefined) && (typeof msg=="string")) JSROOT.console(msg);
01415 }
01416
01417 JSROOT.Initialize = function() {
01418
01419 if (JSROOT.source_fullpath.length === 0) return this;
01420
01421 function window_on_load(func) {
01422 if (func!=null) {
01423 if (document.attachEvent ? document.readyState === 'complete' : document.readyState !== 'loading')
01424 func();
01425 else
01426 window.onload = func;
01427 }
01428 return JSROOT;
01429 }
01430
01431 var src = JSROOT.source_fullpath;
01432
01433 if (JSROOT.GetUrlOption('gui', src) !== null)
01434 return window_on_load( function() { JSROOT.BuildSimpleGUI(); } );
01435
01436 if ( typeof define === "function" && define.amd )
01437 return window_on_load( function() { JSROOT.BuildSimpleGUI('check_existing_elements'); } );
01438
01439 var prereq = "";
01440 if (JSROOT.GetUrlOption('io', src)!=null) prereq += "io;";
01441 if (JSROOT.GetUrlOption('2d', src)!=null) prereq += "2d;";
01442 if (JSROOT.GetUrlOption('jq2d', src)!=null) prereq += "jq2d;";
01443 if (JSROOT.GetUrlOption('more2d', src)!=null) prereq += "more2d;";
01444 if (JSROOT.GetUrlOption('geo', src)!=null) prereq += "geo;";
01445 if (JSROOT.GetUrlOption('3d', src)!=null) prereq += "3d;";
01446 if (JSROOT.GetUrlOption('math', src)!=null) prereq += "math;";
01447 if (JSROOT.GetUrlOption('mathjax', src)!=null) prereq += "mathjax;";
01448 var user = JSROOT.GetUrlOption('load', src);
01449 if ((user!=null) && (user.length>0)) prereq += "load:" + user;
01450 var onload = JSROOT.GetUrlOption('onload', src);
01451 var bower = JSROOT.GetUrlOption('bower', src);
01452 if (bower!==null) {
01453 if (bower.length>0) JSROOT.bower_dir = bower; else
01454 if (JSROOT.source_dir.indexOf("jsroot/") == JSROOT.source_dir.length - 7)
01455 JSROOT.bower_dir = JSROOT.source_dir.substr(0, JSROOT.source_dir.length - 7);
01456 if (JSROOT.bower_dir.length > 0) console.log("Set JSROOT.bower_dir to " + JSROOT.bower_dir);
01457 }
01458
01459 if ((prereq.length>0) || (onload!=null))
01460 window_on_load(function() {
01461 if (prereq.length>0) JSROOT.AssertPrerequisites(prereq, onload); else
01462 if (onload!=null) {
01463 onload = JSROOT.findFunction(onload);
01464 if (typeof onload == 'function') onload();
01465 }
01466 });
01467
01468 return this;
01469 }
01470
01471 return JSROOT.Initialize();
01472
01473 }));
01474
01476