00001
00002
00003
00006
00007 (function(){
00008
00009 if (typeof JSROOT == "object") {
00010 var e1 = new Error("JSROOT is already defined");
00011 e1.source = "JSRootCore.js";
00012 throw e1;
00013 }
00014
00015 JSROOT = {};
00016
00017 JSROOT.version = "3.1a 9/12/2014";
00018
00019 JSROOT.source_dir = function(){
00020 var scripts = document.getElementsByTagName('script');
00021
00022 for (var n in scripts) {
00023 if (scripts[n]['type'] != 'text/javascript') continue;
00024
00025 var src = scripts[n]['src'];
00026 if ((src == null) || (src.length == 0)) continue;
00027
00028 var pos = src.indexOf("scripts/JSRootCore.js");
00029 if (pos<0) continue;
00030
00031 console.log("Set JSROOT.source_dir to " + src.substr(0, pos));
00032 return src.substr(0, pos);
00033 }
00034 return "";
00035 }();
00036
00037
00038 JSROOT.clone = function(obj) {
00039 return jQuery.extend(true, {}, obj);
00040 }
00041
00042 JSROOT.id_counter = 0;
00043
00044 JSROOT.function_list = [];
00045
00046 JSROOT.BIT = function(n) { return 1 << (n); }
00047
00048
00049 JSROOT.TH1StatusBits = {
00050 kNoStats : JSROOT.BIT(9),
00051 kUserContour : JSROOT.BIT(10),
00052 kCanRebin : JSROOT.BIT(11),
00053 kLogX : JSROOT.BIT(15),
00054 kIsZoomed : JSROOT.BIT(16),
00055 kNoTitle : JSROOT.BIT(17),
00056 kIsAverage : JSROOT.BIT(18)
00057 };
00058
00059 JSROOT.EAxisBits = {
00060 kTickPlus : JSROOT.BIT(9),
00061 kTickMinus : JSROOT.BIT(10),
00062 kAxisRange : JSROOT.BIT(11),
00063 kCenterTitle : JSROOT.BIT(12),
00064 kCenterLabels : JSROOT.BIT(14),
00065 kRotateTitle : JSROOT.BIT(15),
00066 kPalette : JSROOT.BIT(16),
00067 kNoExponent : JSROOT.BIT(17),
00068 kLabelsHori : JSROOT.BIT(18),
00069 kLabelsVert : JSROOT.BIT(19),
00070 kLabelsDown : JSROOT.BIT(20),
00071 kLabelsUp : JSROOT.BIT(21),
00072 kIsInteger : JSROOT.BIT(22),
00073 kMoreLogLabels : JSROOT.BIT(23),
00074 kDecimals : JSROOT.BIT(11)
00075 };
00076
00077
00078
00079
00080
00081
00082 JSROOT.JSONR_unref = function(value, dy)
00083 {
00084 var c, i, k, ks;
00085 if (!dy) dy = [];
00086
00087 switch (typeof value) {
00088 case 'string':
00089 if ((value.length > 5) && (value.substr(0, 5) == "$ref:")) {
00090 c = parseInt(value.substr(5));
00091 if (!isNaN(c) && (c < dy.length)) {
00092 value = dy[c];
00093
00094 }
00095 }
00096 break;
00097
00098 case 'object':
00099 if (value !== null) {
00100
00101 if (Object.prototype.toString.apply(value) === '[object Array]') {
00102 for (i = 0; i < value.length; i++) {
00103 value[i] = JSROOT.JSONR_unref(value[i], dy);
00104 }
00105 } else {
00106
00107
00108 if (dy.indexOf(value) === -1) {
00109
00110 dy.push(value);
00111 }
00112
00113
00114 if (('_typename' in value) && (typeof JSROOT == "object"))
00115 JSROOT.addMethods(value);
00116
00117 ks = Object.keys(value);
00118 for (i = 0; i < ks.length; i++) {
00119 k = ks[i];
00120
00121 value[k] = JSROOT.JSONR_unref(value[k], dy);
00122 }
00123 }
00124 }
00125 break;
00126 }
00127
00128 return value;
00129 }
00130
00131 JSROOT.parse = function(arg) {
00132 if ((arg==null) || (arg=="")) return null;
00133 var obj = JSON.parse(arg);
00134 if (obj!=null) obj = JSROOT.JSONR_unref(obj)
00135 return obj;
00136 }
00137
00138 JSROOT.GetUrlOption = function(opt, url, dflt) {
00139
00140
00141
00142
00143
00144 if ((opt==null) || (typeof opt != 'string') || (opt.length==0)) return dflt;
00145
00146 if (!url) url = document.URL;
00147
00148 var pos = url.indexOf("?");
00149 if (pos<0) return null;
00150 url = url.slice(pos+1);
00151
00152 while (url.length>0) {
00153
00154 if (url==opt) return "";
00155
00156 pos = url.indexOf("&");
00157 if (pos < 0) pos = url.length;
00158
00159 if (url.indexOf(opt) == 0) {
00160 if (url.charAt(opt.length)=="&") return "";
00161
00162
00163 if (url.charAt(opt.length)=="=")
00164 return url.slice(opt.length+1, pos).replace(/%27/g, "'").replace(/%22/g, '"').replace(/%20/g, ' ').replace(/%3C/g, '<').replace(/%3E/g, '>');
00165 }
00166
00167 url = url.slice(pos+1);
00168 }
00169 return dflt;
00170 }
00171
00172 JSROOT.NewHttpRequest = function(url, kind, user_call_back) {
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184 function callback(res) {
00185 if (typeof user_call_back == 'function') user_call_back(res);
00186 }
00187
00188 var xhr = new XMLHttpRequest();
00189
00190
00191 if (window.ActiveXObject) {
00192
00193
00194 xhr.onreadystatechange = function() {
00195
00196 if (xhr.readyState != 4) return;
00197
00198 if (xhr.status != 200 && xhr.status != 206) {
00199
00200 return callback(null);
00201 }
00202
00203 if (kind == "xml") return callback(xhr.responseXML);
00204
00205 if (kind == "text") return callback(xhr.responseText);
00206
00207 if (kind == "object") return callback(JSROOT.parse(xhr.responseText));
00208
00209 if (kind == "head") return callback(xhr);
00210
00211 var filecontent = new String("");
00212 var array = new VBArray(xhr.responseBody).toArray();
00213 for (var i = 0; i < array.length; i++) {
00214 filecontent = filecontent + String.fromCharCode(array[i]);
00215 }
00216
00217 callback(filecontent);
00218 filecontent = null;
00219 }
00220
00221 xhr.open(kind == 'head' ? 'HEAD' : 'GET', url, true);
00222
00223 } else {
00224
00225 xhr.onreadystatechange = function() {
00226 if (xhr.readyState != 4) return;
00227
00228 if (xhr.status != 0 && xhr.status != 200 && xhr.status != 206) {
00229 return callback(null);
00230 }
00231 if (kind == "xml") return callback(xhr.responseXML);
00232 if (kind == "text") return callback(xhr.responseText);
00233 if (kind == "object") return callback(JSROOT.parse(xhr.responseText));
00234 if (kind == "head") return callback(xhr);
00235
00236 var HasArrayBuffer = ('ArrayBuffer' in window && 'Uint8Array' in window);
00237 var Buf, filecontent;
00238 if (HasArrayBuffer && 'mozResponse' in xhr) {
00239 Buf = xhr.mozResponse;
00240 } else if (HasArrayBuffer && xhr.mozResponseArrayBuffer) {
00241 Buf = xhr.mozResponseArrayBuffer;
00242 } else if ('responseType' in xhr) {
00243 Buf = xhr.response;
00244 } else {
00245 Buf = xhr.responseText;
00246 HasArrayBuffer = false;
00247 }
00248
00249 if (HasArrayBuffer) {
00250 filecontent = new String("");
00251 var bLen = Buf.byteLength;
00252 var u8Arr = new Uint8Array(Buf, 0, bLen);
00253 for (var i = 0; i < u8Arr.length; i++) {
00254 filecontent = filecontent + String.fromCharCode(u8Arr[i]);
00255 }
00256 delete u8Arr;
00257 } else {
00258 filecontent = Buf;
00259 }
00260
00261 callback(filecontent);
00262
00263 filecontent = null;
00264 }
00265
00266 xhr.open(kind == 'head' ? 'HEAD' : 'GET', url, true);
00267
00268 if (kind == "bin") {
00269 var HasArrayBuffer = ('ArrayBuffer' in window && 'Uint8Array' in window);
00270 if (HasArrayBuffer && 'mozResponseType' in xhr) {
00271 xhr.mozResponseType = 'arraybuffer';
00272 } else if (HasArrayBuffer && 'responseType' in xhr) {
00273 xhr.responseType = 'arraybuffer';
00274 } else {
00275
00276 xhr.overrideMimeType("text/plain; charset=x-user-defined");
00277 }
00278 }
00279 }
00280 return xhr;
00281 }
00282
00283 JSROOT.loadScript = function(urllist, callback, debugout) {
00284
00285
00286
00287
00288
00289
00290
00291
00292 function debug(str) {
00293 if (debugout)
00294 document.getElementById(debugout).innerHTML = str;
00295 else
00296 console.log(str);
00297 }
00298
00299 function completeLoad() {
00300 if ((urllist!=null) && (urllist.length>0))
00301 return JSROOT.loadScript(urllist, callback, debugout);
00302
00303 if (debugout)
00304 document.getElementById(debugout).innerHTML = "";
00305
00306 if (typeof callback == 'function') callback();
00307 }
00308
00309 if ((urllist==null) || (urllist.length==0))
00310 return completeLoad();
00311
00312 var filename = urllist;
00313 var separ = filename.indexOf(";");
00314 if (separ>0) {
00315 filename = filename.substr(0, separ);
00316 urllist = urllist.slice(separ+1);
00317 } else {
00318 urllist = "";
00319 }
00320
00321 var isrootjs = false;
00322 if (filename.indexOf("$$$")==0) {
00323 isrootjs = true;
00324 filename = filename.slice(3);
00325 }
00326 var isstyle = filename.indexOf('.css') > 0;
00327
00328 if (isstyle) {
00329 var styles = document.getElementsByTagName('link');
00330 for (var n in styles) {
00331 if ((styles[n]['type'] != 'text/css') || (styles[n]['rel'] != 'stylesheet')) continue;
00332
00333 var href = styles[n]['href'];
00334 if ((href == null) || (href.length == 0)) continue;
00335
00336 if (href.indexOf(filename)>=0) {
00337 console.log("style "+ filename + " already loaded");
00338 return completeLoad();
00339 }
00340 }
00341
00342 } else {
00343 var scripts = document.getElementsByTagName('script');
00344
00345 for (var n in scripts) {
00346 if (scripts[n]['type'] != 'text/javascript') continue;
00347
00348 var src = scripts[n]['src'];
00349 if ((src == null) || (src.length == 0)) continue;
00350
00351 if (src.indexOf(filename)>=0) {
00352
00353 return completeLoad();
00354 }
00355 }
00356 }
00357
00358 if (isrootjs && (JSROOT.source_dir!=null)) filename = JSROOT.source_dir + filename;
00359
00360 var element = null;
00361
00362 debug("loading " + filename + " ...");
00363
00364 if (isstyle) {
00365 element = document.createElement("link");
00366 element.setAttribute("rel", "stylesheet");
00367 element.setAttribute("type", "text/css");
00368 element.setAttribute("href", filename);
00369 } else {
00370 element = document.createElement("script");
00371 element.setAttribute('type', "text/javascript");
00372 element.setAttribute('src', filename);
00373 }
00374
00375 if (element.readyState) {
00376 element.onreadystatechange = function() {
00377 if (element.readyState == "loaded" || element.readyState == "complete") {
00378 element.onreadystatechange = null;
00379 completeLoad();
00380 }
00381 }
00382 } else {
00383 element.onload = function() {
00384 element.onload = null;
00385 completeLoad();
00386 }
00387 }
00388
00389 document.getElementsByTagName("head")[0].appendChild(element);
00390 }
00391
00392 JSROOT.AssertPrerequisites = function(kind, andThan, debugout) {
00393
00394
00395
00396
00397
00398
00399
00400 if (typeof kind == 'function') { andThan = kind; kind = null; }
00401
00402 if (typeof kind != 'string') kind = "2d";
00403 if (kind.charAt(kind.length-1)!=";") kind+=";";
00404
00405
00406 var allfiles = '$$$scripts/jquery.min.js';
00407
00408 if (kind.indexOf('io;')>=0)
00409 allfiles += ";$$$scripts/rawinflate.js" +
00410 ";$$$scripts/JSRootIOEvolution.js";
00411
00412 if (kind.indexOf('2d;')>=0)
00413 allfiles += ';$$$style/jquery-ui.css' +
00414 ';$$$scripts/jquery-ui.min.js' +
00415 ';$$$scripts/d3.v3.min.js' +
00416 ';$$$scripts/JSRootPainter.js' +
00417 ';$$$style/JSRootPainter.css';
00418
00419 if (kind.indexOf("3d;")>=0)
00420 allfiles += ";$$$scripts/jquery.mousewheel.js" +
00421 ";$$$scripts/three.min.js" +
00422 ";$$$scripts/helvetiker_regular.typeface.js" +
00423 ";$$$scripts/helvetiker_bold.typeface.js" +
00424 ";$$$scripts/JSRoot3DPainter.js";
00425
00426 if (kind.indexOf("simple;")>=0)
00427 allfiles += ';$$$scripts/JSRootInterface.js' +
00428 ';$$$style/JSRootInterface.css';
00429
00430 var pos = kind.indexOf("user:");
00431 if (pos>0)
00432 allfiles += ";" + kind.slice(pos+5);
00433
00434 JSROOT.loadScript(allfiles, andThan, debugout);
00435 }
00436
00437 JSROOT.BuildSimpleGUI = function(user_scripts, andThen) {
00438 if (typeof user_scripts == 'function') {
00439 andThen = user_scripts;
00440 user_scripts = null;
00441 }
00442
00443 var debugout = null;
00444
00445 var requirements = "2d;io;simple;";
00446
00447 if (document.getElementById('simpleGUI')) debugout = 'simpleGUI'; else
00448 if (document.getElementById('onlineGUI')) { debugout = 'onlineGUI'; requirements = "2d;simple;"; }
00449
00450 if (user_scripts == null)
00451 user_scripts = JSROOT.GetUrlOption("autoload");
00452
00453 if (user_scripts != null)
00454 requirements += "user:" + user_scripts + ";";
00455
00456 JSROOT.AssertPrerequisites(requirements, function() {
00457 if (typeof BuildSimpleGUI == 'function') BuildSimpleGUI();
00458 if (typeof andThen == 'function') andThen();
00459 }, debugout);
00460 }
00461
00462 JSROOT.addFormula = function(obj) {
00463 var formula = obj['fTitle'];
00464 formula = formula.replace('abs(', 'Math.abs(');
00465 formula = formula.replace('sin(', 'Math.sin(');
00466 formula = formula.replace('cos(', 'Math.cos(');
00467 var code = obj['fName'] + " = function(x) { return " + formula + " };";
00468 eval(code);
00469 var sig = obj['fName']+'(x)';
00470
00471 var pos = JSROOT.function_list.indexOf(sig);
00472 if (pos >= 0) {
00473 JSROOT.function_list.splice(pos, 1);
00474 }
00475 JSROOT.function_list.push(sig);
00476 }
00477
00478 JSROOT.Create = function(typename, target) {
00479 var obj = target;
00480 if (obj == null)
00481 obj = { _typename: typename };
00482
00483 if (typename == 'TObject')
00484 jQuery.extend(obj, { fUniqueID: 0, fBits: 0x3000008 });
00485 else
00486 if (typename == 'TNamed')
00487 jQuery.extend(obj, { fUniqueID: 0, fBits: 0x3000008, fName: "", fTitle: "" });
00488 else
00489 if (typename == 'TList')
00490 jQuery.extend(obj, { name: "TList", arr : [], opt : [] });
00491 else
00492 if (typename == 'TAttAxis') {
00493 jQuery.extend(obj, { fNdivisions: 510, fAxisColor: 1,
00494 fLabelColor: 1, fLabelFont: 42, fLabelOffset: 0.05, fLabelSize: 0.035, fTickLength: 0.03,
00495 fTitleOffset: 1, fTitleSize: 0.035, fTitleColor: 1, fTitleFont : 42 });
00496 } else
00497 if (typename == 'TAxis') {
00498 JSROOT.Create("TNamed", obj);
00499 JSROOT.Create("TAttAxis", obj);
00500 jQuery.extend(obj, { fNbins: 0, fXmin: 0, fXmax: 0, fXbins : [], fFirst: 0, fLast: 0,
00501 fBits2: 0, fTimeDisplay: false, fTimeFormat: "", fLabels: null });
00502 } else
00503 if (typename == 'TAttLine') {
00504 jQuery.extend(obj, { fLineColor: 1, fLineStyle : 1, fLineWidth : 1 });
00505 } else
00506 if (typename == 'TAttFill') {
00507 jQuery.extend(obj, { fFillColor: 0, fFillStyle : 0 } );
00508 } else
00509 if (typename == 'TAttMarker') {
00510 jQuery.extend(obj, { fMarkerColor: 1, fMarkerStyle : 1, fMarkerSize : 1. });
00511 } else
00512 if (typename == 'TBox') {
00513 JSROOT.Create("TObject", obj);
00514 JSROOT.Create("TAttLine", obj);
00515 JSROOT.Create("TAttFill", obj);
00516 jQuery.extend(obj, { fX1: 0, fY1: 0, fX2: 1, fY2: 1 });
00517 } else
00518 if (typename == 'TPave') {
00519 JSROOT.Create("TBox", obj);
00520 jQuery.extend(obj, { fX1NDC : 0., fY1NDC: 0, fX2NDC: 1, fY2NDC: 1,
00521 fBorderSize: 0, fInit: 1, fShadowColor: 1,
00522 fCornerRadius: 0, fOption: "blNDC", fName: "title" });
00523 } else
00524 if (typename == 'TAttText') {
00525 jQuery.extend(obj, { fTextAngle: 0, fTextSize: 0, fTextAlign: 22, fTextColor: 1, fTextFont: 42});
00526 } else
00527 if (typename == 'TPaveText') {
00528 JSROOT.Create("TPave", obj);
00529 JSROOT.Create("TAttText", obj);
00530 jQuery.extend(obj, { fLabel: "", fLongest: 27, fMargin: 0.05, fLines: JSROOT.Create("TList") });
00531 } else
00532 if (typename == 'TPaveStats') {
00533 JSROOT.Create("TPaveText", obj);
00534 jQuery.extend(obj, { fOptFit: 0, fOptStat: 0, fFitFormat: "", fStatFormat: "", fParent: null });
00535 } else
00536 if (typename == 'TH1') {
00537 JSROOT.Create("TNamed", obj);
00538 JSROOT.Create("TAttLine", obj);
00539 JSROOT.Create("TAttFill", obj);
00540 JSROOT.Create("TAttMarker", obj);
00541
00542 jQuery.extend(obj, {
00543 fNcells : 0,
00544 fXaxis: JSROOT.Create("TAxis"),
00545 fYaxis: JSROOT.Create("TAxis"),
00546 fZaxis: JSROOT.Create("TAxis"),
00547 fBarOffset : 0, fBarWidth : 1000, fEntries : 0.,
00548 fTsumw : 0., fTsumw2 : 0., fTsumwx : 0., fTsumwx2 : 0.,
00549 fMaximum : -1111., fMinimum : -1111, fNormFactor : 0., fContour : [],
00550 fSumw2 : [], fOption : "",
00551 fFunctions : JSROOT.Create("TList"),
00552 fBufferSize : 0, fBuffer : [], fBinStatErrOpt : 0 });
00553 } else
00554 if (typename == 'TH1I' || typename == 'TH1F' || typename == 'TH1D' || typename == 'TH1S' || typename == 'TH1C') {
00555 JSROOT.Create("TH1", obj);
00556 jQuery.extend(obj, { fN : 0, fArray: [] });
00557 } else
00558 if (typename == 'TH2') {
00559 JSROOT.Create("TH1", obj);
00560 jQuery.extend(obj, { fScalefactor: 1., fTsumwy: 0., fTsumwy2: 0, fTsumwxy : 0});
00561 } else
00562 if (typename == 'TH2I' || typename == 'TH2F' || typename == 'TH2D' || typename == 'TH2S' || typename == 'TH2C') {
00563 JSROOT.Create("TH2", obj);
00564 jQuery.extend(obj, { fN : 0, fArray: [] });
00565 } else
00566 if (typename == 'TGraph') {
00567 JSROOT.Create("TNamed", obj);
00568 JSROOT.Create("TAttLine", obj);
00569 JSROOT.Create("TAttFill", obj);
00570 JSROOT.Create("TAttMarker", obj);
00571 jQuery.extend(obj, { fFunctions: JSROOT.Create("TList"), fHistogram: JSROOT.CreateTH1(),
00572 fMaxSize: 0, fMaximum:0, fMinimum:0, fNpoints: 0, fX: [], fY: [] });
00573 }
00574
00575 JSROOT.addMethods(obj, typename);
00576 return obj;
00577 }
00578
00579
00580 JSROOT.CreateTList = function() { return JSROOT.Create("TList"); }
00581 JSROOT.CreateTAxis = function() { return JSROOT.Create("TAxis"); }
00582
00583 JSROOT.CreateTH1 = function(nbinsx) {
00584 var histo = JSROOT.Create("TH1I");
00585 jQuery.extend(histo, { fName: "dummy_histo_" + this.id_counter++, fTitle: "dummytitle" });
00586
00587 if (nbinsx!=null) {
00588 histo['fN'] = histo['fNcells'] = nbinsx+2;
00589 for (var i=0;i<histo['fNcells'];i++) histo['fArray'].push(0);
00590 jQuery.extend(histo['fXaxis'], { fNbins: nbinsx, fXmin: 0, fXmax: nbinsx });
00591 }
00592 return histo;
00593 }
00594
00595 JSROOT.CreateTH2 = function(nbinsx, nbinsy) {
00596 var histo = JSROOT.Create("TH2I");
00597 jQuery.extend(histo, { fName: "dummy_histo_" + this.id_counter++, fTitle: "dummytitle" });
00598
00599 if ((nbinsx!=null) && (nbinsy!=null)) {
00600 histo['fN'] = histo['fNcells'] = (nbinsx+2) * (nbinsy+2);
00601 for (var i=0;i<histo['fNcells'];i++) histo['fArray'].push(0);
00602 jQuery.extend(histo['fXaxis'], { fNbins: nbinsx, fXmin: 0, fXmax: nbinsx });
00603 jQuery.extend(histo['fYaxis'], { fNbins: nbinsy, fXmin: 0, fXmax: nbinsy });
00604 }
00605 return histo;
00606 }
00607
00608 JSROOT.CreateTGraph = function(npoints) {
00609 var graph = JSROOT.Create("TGraph");
00610 jQuery.extend(graph, { fBits: 0x3000408, fName: "dummy_graph_" + this.id_counter++, fTitle: "dummytitle" });
00611
00612 if (npoints>0) {
00613 graph['fMaxSize'] = graph['fNpoints'] = npoints;
00614 for (var i=0;i<npoints;i++) {
00615 graph['fX'].push(i);
00616 graph['fY'].push(i);
00617 }
00618 JSROOT.AdjustTGraphRanges(graph);
00619 }
00620
00621 return graph;
00622 }
00623
00624 JSROOT.AdjustTGraphRanges = function(graph) {
00625 if (graph['fNpoints']==0) return;
00626
00627 var minx = graph['fX'][0], maxx = minx;
00628 var miny = graph['fY'][0], maxy = miny;
00629
00630 for (var i=1;i<graph['fNpoints'];i++) {
00631 if (graph['fX'][i] < minx) minx = graph['fX'][i];
00632 if (graph['fX'][i] > maxx) maxx = graph['fX'][i];
00633 if (graph['fY'][i] < miny) miny = graph['fY'][i];
00634 if (graph['fY'][i] > maxy) maxy = graph['fY'][i];
00635 }
00636
00637 if (miny==maxy) maxy = miny + 1;
00638
00639 graph['fHistogram']['fXaxis']['fXmin'] = minx;
00640 graph['fHistogram']['fXaxis']['fXmax'] = maxx;
00641
00642 graph['fHistogram']['fYaxis']['fXmin'] = miny;
00643 graph['fHistogram']['fYaxis']['fXmax'] = maxy;
00644 }
00645
00646 JSROOT.addMethods = function(obj, obj_typename) {
00647
00648 if (('fBits' in obj) && !('TestBit' in obj)) {
00649 obj['TestBit'] = function (f) {
00650 return ((obj['fBits'] & f) != 0);
00651 };
00652 }
00653
00654 if (!obj_typename) {
00655 if (!('_typename' in obj)) return;
00656 obj_typename = obj['_typename'];
00657 }
00658
00659 var EBinErrorOpt = {
00660 kNormal : 0,
00661 kPoisson : 1,
00662 kPoisson2 : 2
00663 };
00664
00665 var EErrorType = {
00666 kERRORMEAN : 0,
00667 kERRORSPREAD : 1,
00668 kERRORSPREADI : 2,
00669 kERRORSPREADG : 3
00670 };
00671
00672 if (obj_typename.indexOf("TAxis") == 0) {
00673 obj['getFirst'] = function() {
00674 if (!this.TestBit(JSROOT.EAxisBits.kAxisRange)) return 1;
00675 return this['fFirst'];
00676 };
00677 obj['getLast'] = function() {
00678 if (!this.TestBit(JSROOT.EAxisBits.kAxisRange)) return this['fNbins'];
00679 return this['fLast'];
00680 };
00681 obj['getBinCenter'] = function(bin) {
00682
00683 var binwidth;
00684 if (!this['fN'] || bin < 1 || bin > this['fNbins']) {
00685 binwidth = (this['fXmax'] - this['fXmin']) / this['fNbins'];
00686 return this['fXmin'] + (bin-1) * binwidth + 0.5*binwidth;
00687 } else {
00688 binwidth = this['fXbins'][bin] - this['fXbins'][bin-1];
00689 return this['fXbins'][bin-1] + 0.5*binwidth;
00690 }
00691 };
00692 }
00693
00694 if (obj_typename == "TList") {
00695 obj['Clear'] = function() {
00696 this['arr'] = new Array;
00697 this['opt'] = new Array;
00698 }
00699 obj['Add'] = function(obj,opt) {
00700 this['arr'].push(obj);
00701 this['opt'].push((typeof opt=='string') ? opt : "");
00702 }
00703 }
00704
00705 if ((obj_typename == "TPaveText") || (obj_typename == "TPaveStats")) {
00706 obj['AddText'] = function(txt) {
00707 this['fLines'].Add({'fTitle' : txt, "fTextColor" : 1 });
00708 }
00709 obj['Clear'] = function() {
00710 this['fLines'].Clear();
00711 }
00712 }
00713
00714 if ((obj_typename.indexOf("TFormula") != -1) ||
00715 (obj_typename.indexOf("TF1") == 0)) {
00716 obj['evalPar'] = function(x) {
00717 var i, _function = this['fTitle'];
00718 _function = _function.replace('TMath::Exp(', 'Math.exp(');
00719 _function = _function.replace('TMath::Abs(', 'Math.abs(');
00720 _function = _function.replace('gaus(', 'JSROOT.Math.gaus(this, ' + x + ', ');
00721 _function = _function.replace('gausn(', 'JSROOT.Math.gausn(this, ' + x + ', ');
00722 _function = _function.replace('expo(', 'JSROOT.Math.expo(this, ' + x + ', ');
00723 _function = _function.replace('landau(', 'JSROOT.Math.landau(this, ' + x + ', ');
00724 _function = _function.replace('landaun(', 'JSROOT.Math.landaun(this, ' + x + ', ');
00725 _function = _function.replace('pi', 'Math.PI');
00726 for (i=0;i<this['fNpar'];++i) {
00727 while(_function.indexOf('['+i+']') != -1)
00728 _function = _function.replace('['+i+']', this['fParams'][i])
00729 }
00730 for (i=0;i<JSROOT.function_list.length;++i) {
00731 var f = JSROOT.function_list[i].substring(0, JSROOT.function_list[i].indexOf('('));
00732 if (_function.indexOf(f) != -1) {
00733 var fa = JSROOT.function_list[i].replace('(x)', '(' + x + ')');
00734 _function = _function.replace(f, fa);
00735 }
00736 }
00737
00738 _function = _function.replace(/\b(x)\b/gi, x)
00739 _function = _function.replace(/\b(sin)\b/gi, 'Math.sin')
00740 _function = _function.replace(/\b(cos)\b/gi, 'Math.cos')
00741 _function = _function.replace(/\b(tan)\b/gi, 'Math.tan')
00742 var ret = eval(_function);
00743 return ret;
00744 };
00745 }
00746 if ((obj_typename.indexOf("TGraph") == 0) || (obj_typename == "TCutG")) {
00747 obj['ComputeRange'] = function() {
00748
00749 var res = { xmin: 0, xmax: 0, ymin: 0, ymax: 0 };
00750 if (this['fNpoints'] > 0) {
00751 res.xmin = res.xmax = this['fX'][0];
00752 res.ymin = res.ymax = this['fY'][0];
00753 for (var i=1; i<this['fNpoints']; i++) {
00754 if (this['fX'][i] < res.xmin) res.xmin = this['fX'][i];
00755 if (this['fX'][i] > res.xmax) res.xmax = this['fX'][i];
00756 if (this['fY'][i] < res.ymin) res.ymin = this['fY'][i];
00757 if (this['fY'][i] > res.ymax) res.ymax = this['fY'][i];
00758 }
00759 }
00760 return res;
00761 };
00762
00763 obj['IsInside'] = function(xp,yp) {
00764 var j = this['fNpoints'] - 1 ;
00765 var x = this['fX'], y = this['fY'];
00766 var oddNodes = false;
00767
00768 for (var i=0; i<this['fNpoints']; i++) {
00769 if ((y[i]<yp && y[j]>=yp) || (y[j]<yp && y[i]>=yp)) {
00770 if (x[i]+(yp-y[i])/(y[j]-y[i])*(x[j]-x[i])<xp) {
00771 oddNodes = !oddNodes;
00772 }
00773 }
00774 j=i;
00775 }
00776
00777 return oddNodes;
00778 };
00779 }
00780 if (obj_typename.indexOf("TH1") == 0 ||
00781 obj_typename.indexOf("TH2") == 0 ||
00782 obj_typename.indexOf("TH3") == 0) {
00783 obj['getBinError'] = function(bin) {
00784
00785
00786
00787
00788 if (bin < 0) bin = 0;
00789 if (bin >= this['fNcells']) bin = this['fNcells'] - 1;
00790 if (this['fN'] && this['fSumw2'].length > 0) {
00791 var err2 = this['fSumw2'][bin];
00792 return Math.sqrt(err2);
00793 }
00794 var error2 = Math.abs(this['fArray'][bin]);
00795 return Math.sqrt(error2);
00796 };
00797 obj['getBinErrorLow'] = function(bin) {
00798
00799
00800
00801 if (this['fBinStatErrOpt'] == EBinErrorOpt.kNormal || this['fN']) return this.getBinError(bin);
00802 if (bin < 0) bin = 0;
00803 if (bin >= this['fNcells']) bin = this['fNcells'] - 1;
00804 var alpha = 1.0 - 0.682689492;
00805 if (this['fBinStatErrOpt'] == EBinErrorOpt.kPoisson2) alpha = 0.05;
00806 var c = this['fArray'][bin];
00807 var n = Math.round(c);
00808 if (n < 0) {
00809 alert("GetBinErrorLow : Histogram has negative bin content-force usage to normal errors");
00810 this['fBinStatErrOpt'] = EBinErrorOpt.kNormal;
00811 return this.getBinError(bin);
00812 }
00813 if (n == 0) return 0;
00814 return c - JSROOT.Math.gamma_quantile( alpha/2, n, 1.);
00815 };
00816 obj['getBinErrorUp'] = function(bin) {
00817
00818
00819
00820 if (this['fBinStatErrOpt'] == EBinErrorOpt.kNormal || this['fN']) return this.getBinError(bin);
00821 if (bin < 0) bin = 0;
00822 if (bin >= this['fNcells']) bin = this['fNcells'] - 1;
00823 var alpha = 1.0 - 0.682689492;
00824 if (this['fBinStatErrOpt'] == EBinErrorOpt.kPoisson2) alpha = 0.05;
00825 var c = this['fArray'][bin];
00826 var n = Math.round(c);
00827 if (n < 0) {
00828 alert("GetBinErrorLow : Histogram has negative bin content-force usage to normal errors");
00829 this['fBinStatErrOpt'] = EBinErrorOpt.kNormal;
00830 return this.getBinError(bin);
00831 }
00832
00833
00834
00835 return JSROOT.Math.gamma_quantile_c( alpha/2, n+1, 1) - c;
00836 };
00837 obj['getBinLowEdge'] = function(bin) {
00838
00839 if (this['fXaxis']['fXbins']['fN'] && bin > 0 && bin <= this['fXaxis']['fNbins'])
00840 return this['fXaxis']['fXbins']['fArray'][bin-1];
00841 var binwidth = (this['fXaxis']['fXmax'] - this['fXaxis']['fXmin']) / this['fXaxis']['fNbins'];
00842 return this['fXaxis']['fXmin'] + (bin-1) * binwidth;
00843 };
00844 obj['getBinUpEdge'] = function(bin) {
00845
00846 var binwidth;
00847 if (!this['fXaxis']['fXbins']['fN'] || bin < 1 || bin > this['fXaxis']['fNbins']) {
00848 binwidth = (this['fXaxis']['fXmax'] - this['fXaxis']['fXmin']) / this['fXaxis']['fNbins'];
00849 return this['fXaxis']['fXmin'] + bin * binwidth;
00850 } else {
00851 binwidth = this['fArray'][bin] - this['fArray'][bin-1];
00852 return this['fArray'][bin-1] + binwidth;
00853 }
00854 };
00855 obj['getBinWidth'] = function(bin) {
00856
00857 if (this['fXaxis']['fNbins'] <= 0) return 0;
00858 if (this['fXaxis']['fXbins']['fN'] <= 0)
00859 return (this['fXaxis']['fXmax'] - this['fXaxis']['fXmin']) / this['fXaxis']['fNbins'];
00860 if (bin > this['fXaxis']['fNbins']) bin = this['fXaxis']['fNbins'];
00861 if (bin < 1) bin = 1;
00862 return this['fArray'][bin] - this['fArray'][bin-1];
00863 };
00864 obj['add'] = function(h1, c1) {
00865
00866
00867
00868
00869 if (!h1 || typeof(h1) == 'undefined') {
00870 alert("Add : Attempt to add a non-existing histogram");
00871 return false;
00872 }
00873 if (!c1 || typeof(c1) == 'undefined') c1 = 1;
00874 var nbinsx = this['fXaxis']['fNbins'],
00875 nbinsy = this['fYaxis']['fNbins'],
00876 nbinsz = this['fZaxis']['fNbins'];
00877
00878 if (this['fDimension'] < 2) nbinsy = -1;
00879 if (this['fDimension'] < 3) nbinsz = -1;
00880
00881
00882 if (this['fSumw2']['fN'] == 0 && h1['fSumw2']['fN'] != 0) this.sumw2();
00883
00884
00885 if (this['fEntries'] == NaN) this['fEntries'] = 0;
00886 var entries = Math.abs( this['fEntries'] + c1 * h1['fEntries'] );
00887
00888
00889
00890 var resetStats = (c1 < 0);
00891 var s1, s2;
00892 if (!resetStats) {
00893
00894
00895 s1 = this.getStats();
00896 s2 = h1.getStats();
00897 }
00898 this['fMinimum'] = -1111;
00899 this['fMaximum'] = -1111;
00900
00901
00902 var bin, binx, biny, binz;
00903 var cu, factor = 1;
00904 if (Math.abs(h1['fNormFactor']) > 2e-308) factor = h1['fNormFactor'] / h1.getSumOfWeights();
00905 for (binz=0;binz<=nbinsz+1;binz++) {
00906 for (biny=0;biny<=nbinsy+1;biny++) {
00907 for (binx=0;binx<=nbinsx+1;binx++) {
00908 bin = binx +(nbinsx+2)*(biny + (nbinsy+2)*binz);
00909
00910 if (this.TestBit(JSROOT.TH1StatusBits.kIsAverage)
00911 && h1.TestBit(JSROOT.TH1StatusBits.kIsAverage)) {
00912 var y1 = h1.getBinContent(bin),
00913 y2 = this.getBinContent(bin),
00914 e1 = h1.getBinError(bin),
00915 e2 = this.getBinError(bin),
00916 w1 = 1, w2 = 1;
00917
00918
00919 if (e1 > 0)
00920 w1 = 1.0 / (e1 * e1);
00921 else if (h1['fSumw2']['fN']) {
00922 w1 = 1.E200;
00923 if (y1 == 0) {
00924
00925 var sf = (s2[0] != 0) ? s2[1] / s2[0] : 1;
00926 w1 = 1.0 / (sf * sf);
00927 }
00928 }
00929 if (e2 > 0)
00930 w2 = 1.0 / (e2 * e2);
00931 else if (this['fSumw2']['fN']) {
00932 w2 = 1.E200;
00933 if (y2 == 0) {
00934
00935 var sf = (s1[0] != 0) ? s1[1] / s1[0] : 1;
00936 w2 = 1.0 / (sf * sf);
00937 }
00938 }
00939 var y = (w1 * y1 + w2 * y2) / (w1 + w2);
00940 this.setBinContent(bin, y);
00941 if (this['fSumw2']['fN']) {
00942 var err2 = 1.0 / (w1 + w2);
00943 if (err2 < 1.E-200) err2 = 0;
00944 this['fSumw2']['fArray'][bin] = err2;
00945 }
00946 }
00947
00948 else {
00949 cu = c1 * factor * h1.getBinContent(bin);
00950 this['fArray'][bin] += cu;
00951 if (this['fSumw2']['fN']) {
00952 var e1 = factor * h1.getBinError(bin);
00953 this['fSumw2']['fArray'][bin] += c1 * c1 * e1 * e1;
00954 }
00955 }
00956 }
00957 }
00958 }
00959
00960 if (resetStats) {
00961
00962 this.resetStats();
00963 }
00964 else {
00965 var kNstat = 13;
00966 for (var i=0;i<kNstat;i++) {
00967 if (i == 1) s1[i] += c1 * c1 * s2[i];
00968 else s1[i] += c1 * s2[i];
00969 }
00970
00971 this['fTsumw'] = s1[0];
00972 this['fTsumw2'] = s1[1];
00973 this['fTsumwx'] = s1[2];
00974 this['fTsumwx2'] = s1[3];
00975 this['fEntries'] = entries;
00976 }
00977 return true;
00978 };
00979 obj['getBin'] = function(binx, biny, binz) {
00980
00981 var nx, ny, nz;
00982 if (this['fDimension'] < 2) {
00983 nx = this['fXaxis']['fNbins']+2;
00984 if (binx < 0) binx = 0;
00985 if (binx >= nx) binx = nx-1;
00986 return binx;
00987 }
00988 if (this['fDimension'] < 3) {
00989 nx = this['fXaxis']['fNbins']+2;
00990 if (binx < 0) binx = 0;
00991 if (binx >= nx) binx = nx-1;
00992 ny = this['fYaxis']['fNbins']+2;
00993 if (biny < 0) biny = 0;
00994 if (biny >= ny) biny = ny-1;
00995 return binx + nx*biny;
00996 }
00997 if (this['fDimension'] < 4) {
00998 nx = this['fXaxis']['fNbins']+2;
00999 if (binx < 0) binx = 0;
01000 if (binx >= nx) binx = nx-1;
01001 ny = this['fYaxis']['fNbins']+2;
01002 if (biny < 0) biny = 0;
01003 if (biny >= ny) biny = ny-1;
01004 nz = this['fZaxis']['fNbins']+2;
01005 if (binz < 0) binz = 0;
01006 if (binz >= nz) binz = nz-1;
01007 return binx + nx*(biny +ny*binz);
01008 }
01009 return -1;
01010 };
01011 obj['getBinXYZ'] = function(binglobal) {
01012
01013
01014 var binx, biny, binz;
01015 var nx = this['fXaxis']['fNbins']+2;
01016 var ny = this['fYaxis']['fNbins']+2;
01017 if (this['fDimension'] < 2) {
01018 binx = binglobal%nx;
01019 biny = -1;
01020 binz = -1;
01021 }
01022 if (this['fDimension'] < 3) {
01023 binx = binglobal%nx;
01024 biny = ((binglobal-binx)/nx)%ny;
01025 binz = -1;
01026 }
01027 if (this['fDimension'] < 4) {
01028 binx = binglobal%nx;
01029 biny = ((binglobal-binx)/nx)%ny;
01030 binz = ((binglobal-binx)/nx -biny)/ny;
01031 }
01032 return { binsx: binx, biny: biny, binz: binz };
01033 };
01034 obj['getMaximum'] = function(maxval) {
01035
01036
01037
01038
01039
01040
01041
01042
01043
01044 if (this['fMaximum'] != -1111) return this['fMaximum'];
01045 if (!maxval || typeof(maxval) == 'undefined') maxval = Number.MAX_VALUE;
01046 var bin, binx, biny, binz;
01047 var xfirst = this['fXaxis'].getFirst();
01048 xlast = this['fXaxis'].getLast(),
01049 yfirst = this['fYaxis'].getFirst(),
01050 ylast = this['fYaxis'].getLast(),
01051 zfirst = this['fZaxis'].getFirst(),
01052 zlast = this['fZaxis'].getLast();
01053 var maximum = -Number.MAX_VALUE, val;
01054 for (binz=zfirst;binz<=zlast;binz++) {
01055 for (biny=yfirst;biny<=ylast;biny++) {
01056 for (binx=xfirst;binx<=xlast;binx++) {
01057 bin = this.getBin(binx,biny,binz);
01058 val = this.getBinContent(bin);
01059 if (val > maximum && val < maxval) maximum = val;
01060 }
01061 }
01062 }
01063 return maximum;
01064 };
01065 obj['getMinimum'] = function(minval) {
01066
01067
01068
01069
01070 if (this['fMinimum'] != -1111) return this['fMinimum'];
01071 if (!minval || typeof(minval) == 'undefined') minval = -Number.MAX_VALUE;
01072 var bin, binx, biny, binz;
01073 var xfirst = this['fXaxis'].getFirst();
01074 xlast = this['fXaxis'].getLast(),
01075 yfirst = this['fYaxis'].getFirst(),
01076 ylast = this['fYaxis'].getLast(),
01077 zfirst = this['fZaxis'].getFirst(),
01078 zlast = this['fZaxis'].getLast();
01079 var minimum = Number.MAX_VALUE, val;
01080 for (binz=zfirst;binz<=zlast;binz++) {
01081 for (biny=yfirst;biny<=ylast;biny++) {
01082 for (binx=xfirst;binx<=xlast;binx++) {
01083 bin = this.getBin(binx,biny,binz);
01084 val = this.getBinContent(bin);
01085 if (val < minimum && val > minval) minimum = val;
01086 }
01087 }
01088 }
01089 return minimum;
01090 };
01091 obj['getSumOfWeights'] = function() {
01092
01093 var bin, binx, biny, binz, sum = 0;
01094 for (binz=1; binz<=this['fZaxis']['fXbins']['fN']; binz++) {
01095 for (biny=1; biny<=this['fYaxis']['fXbins']['fN']; biny++) {
01096 for (binx=1; binx<=this['fXaxis']['fXbins']['fN']; binx++) {
01097 bin = this.getBin(binx,biny,binz);
01098 sum += this.getBinContent(bin);
01099 }
01100 }
01101 }
01102 return sum;
01103 };
01104 obj['labelsInflate'] = function(ax) {
01105
01106
01107
01108 var axis = null;
01109 var achoice = ax[0].toUpperCase();
01110 if (achoice == 'X') axis = this['fXaxis'];
01111 if (achoice == 'Y') axis = this['fYaxis'];
01112 if (achoice == 'Z') axis = this['fZaxis'];
01113 if (axis == null) return;
01114
01115 var hold = JSROOT.clone(this);
01116
01117 var timedisp = axis['fTimeDisplay'];
01118 var nbxold = this['fXaxis']['fNbins'];
01119 var nbyold = this['fYaxis']['fNbins'];
01120 var nbzold = this['fZaxis']['fNbins'];
01121 var nbins = axis['fNbins'];
01122 var xmin = axis['fXmin'];
01123 var xmax = axis['fXmax'];
01124 xmax = xmin + 2 * (xmax - xmin);
01125 axis['fFirst'] = 1;
01126 axis['fLast'] = axis['fNbins'];
01127 this['fBits'] &= ~(JSROOT.EAxisBits.kAxisRange & 0x00ffffff);
01128
01129 axis['fNbins'] = 2*nbins;
01130 axis['fXmin'] = xmin;
01131 axis['fXmax'] = xmax;
01132 this['fNcells'] = -1;
01133 this['fArray'].length = -1;
01134 var errors = this['fSumw2']['fN'];
01135 if (errors) ['fSumw2'].length = this['fNcells'];
01136 axis['fTimeDisplay'] = timedisp;
01137
01138 Reset("ICE");
01139 this['fSumw2'].splice(0, this['fSumw2'].length);
01140 this['fMinimum'] = -1111;
01141 this['fMaximum'] = -1111;
01142
01143
01144 var oldEntries = this['fEntries'];
01145 var bin, ibin, bins;
01146 for (ibin = 0; ibin < this['fNcells']; ibin++) {
01147 bins = this.getBinXYZ(ibin);
01148 bin = hold.getBin(bins['binx'],bins['biny'],bins['binz']);
01149
01150 if (bins['binx'] > nbxold || bins['biny'] > nbyold || bins['binz'] > nbzold) bin = -1;
01151 if (bin > 0) {
01152 var cu = hold.getBinContent(bin);
01153 this['fArray'][bin] += cu;
01154 if (errors) this['fSumw2']['fArray'][ibin] += hold['fSumw2']['fArray'][bin];
01155 }
01156 }
01157 this['fEntries'] = oldEntries;
01158 delete hold;
01159 };
01160 obj['resetStats'] = function() {
01161
01162
01163
01164
01165 this['fTsumw'] = 0;
01166 this['fEntries'] = 1;
01167 var stats = this.getStats();
01168 this['fTsumw'] = stats[0];
01169 this['fTsumw2'] = stats[1];
01170 this['fTsumwx'] = stats[2];
01171 this['fTsumwx2'] = stats[3];
01172 this['fEntries'] = Math.abs(this['fTsumw']);
01173
01174 if (this['fSumw2']['fN'] > 0 && this['fTsumw'] > 0 && stats[1] > 0 )
01175 this['fEntries'] = stats[0] * stats[0] / stats[1];
01176 }
01177 obj['setBinContent'] = function(bin, content) {
01178
01179
01180
01181
01182
01183
01184 this['fEntries']++;
01185 this['fTsumw'] = 0;
01186 if (bin < 0) return;
01187 if (bin >= this['fNcells']-1) {
01188 if (this['fXaxis']['fTimeDisplay'] || this.TestBit(JSROOT.TH1StatusBits.kCanRebin) ) {
01189 while (bin >= this['fNcells']-1) this.labelsInflate();
01190 } else {
01191 if (bin == this['fNcells']-1) this['fArray'][bin] = content;
01192 return;
01193 }
01194 }
01195 this['fArray'][bin] = content;
01196 };
01197 obj['sumw2'] = function() {
01198
01199
01200
01201
01202
01203
01204
01205
01206
01207
01208
01209 if (this['fSumw2']['fN'] == this['fNcells']) {
01210 return;
01211 }
01212 this['fSumw2'].length = this['fNcells'];
01213 if ( this['fEntries'] > 0 ) {
01214 for (var bin=0; bin<this['fNcells']; bin++) {
01215 this['fSumw2']['fArray'][bin] = Math.abs(this.getBinContent(bin));
01216 }
01217 }
01218 };
01219 }
01220 if (obj_typename.indexOf("TH1") == 0) {
01221 obj['fDimension'] = 1;
01222 obj['getBinContent'] = function(bin) {
01223 if (bin < 0) bin = 0;
01224 if (bin >= this['fNcells']) bin = this['fNcells']-1;
01225 return this['fArray'][bin];
01226 };
01227 obj['getStats'] = function() {
01228
01229
01230
01231
01232
01233
01234
01235 var bin, binx, w, err, x, stats = new Array(0,0,0,0,0);
01236
01237
01238 if (this['fXaxis']['fLabels'] && this.TestBit(JSROOT.TH1StatusBits.kCanRebin) ) {
01239 stats[0] = this['fTsumw'];
01240 stats[1] = this['fTsumw2'];
01241 stats[2] = 0;
01242 stats[3] = 0;
01243 }
01244 else if ((this['fTsumw'] == 0 && this['fEntries'] > 0) ||
01245 this['fXaxis'].TestBit(JSROOT.EAxisBits.kAxisRange)) {
01246 for (bin=0;bin<4;bin++) stats[bin] = 0;
01247
01248 var firstBinX = this['fXaxis'].getFirst();
01249 var lastBinX = this['fXaxis'].getLast();
01250 for (binx = firstBinX; binx <= lastBinX; binx++) {
01251 x = this['fXaxis'].getBinCenter(binx);
01252 w = this.getBinContent(binx);
01253 err = Math.abs(this.getBinError(binx));
01254 stats[0] += w;
01255 stats[1] += err*err;
01256 stats[2] += w*x;
01257 stats[3] += w*x*x;
01258 }
01259 } else {
01260 stats[0] = this['fTsumw'];
01261 stats[1] = this['fTsumw2'];
01262 stats[2] = this['fTsumwx'];
01263 stats[3] = this['fTsumwx2'];
01264 }
01265 return stats;
01266 };
01267 }
01268 if (obj_typename.indexOf("TH2") == 0) {
01269 obj['fDimension'] = 2;
01270 obj['getBin'] = function(x, y) {
01271 var nx = this['fXaxis']['fNbins']+2;
01272 return (x + nx * y);
01273 };
01274 obj['getBinContent'] = function(x, y) {
01275 return this['fArray'][this.getBin(x, y)];
01276 };
01277 obj['getStats'] = function() {
01278 var bin, binx, biny, stats = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0);
01279 if ((this['fTsumw'] == 0 && this['fEntries'] > 0) || this['fXaxis'].TestBit(JSROOT.EAxisBits.kAxisRange) || this['fYaxis'].TestBit(JSROOT.EAxisBits.kAxisRange)) {
01280 var firstBinX = this['fXaxis'].getFirst();
01281 var lastBinX = this['fXaxis'].getLast();
01282 var firstBinY = this['fYaxis'].getFirst();
01283 var lastBinY = this['fYaxis'].getLast();
01284
01285 if (this['fgStatOverflows']) {
01286 if ( !this['fXaxis'].TestBit(JSROOT.EAxisBits.kAxisRange) ) {
01287 if (firstBinX == 1) firstBinX = 0;
01288 if (lastBinX == this['fXaxis']['fNbins'] ) lastBinX += 1;
01289 }
01290 if ( !this['fYaxis'].TestBit(JSROOT.EAxisBits.kAxisRange) ) {
01291 if (firstBinY == 1) firstBinY = 0;
01292 if (lastBinY == this['fYaxis']['fNbins'] ) lastBinY += 1;
01293 }
01294 }
01295 for (biny = firstBinY; biny <= lastBinY; biny++) {
01296 y = this['fYaxis'].getBinCenter(biny);
01297 for (binx = firstBinX; binx <= lastBinX; binx++) {
01298 bin = this.getBin(binx,biny);
01299 x = this['fXaxis'].getBinCenter(binx);
01300 w = this.GetBinContent(bin);
01301 err = Math.abs(this.getBinError(bin));
01302 stats[0] += w;
01303 stats[1] += err*err;
01304 stats[2] += w*x;
01305 stats[3] += w*x*x;
01306 stats[4] += w*y;
01307 stats[5] += w*y*y;
01308 stats[6] += w*x*y;
01309 }
01310 }
01311 } else {
01312 stats[0] = this['fTsumw'];
01313 stats[1] = this['fTsumw2'];
01314 stats[2] = this['fTsumwx'];
01315 stats[3] = this['fTsumwx2'];
01316 stats[4] = this['fTsumwy'];
01317 stats[5] = this['fTsumwy2'];
01318 stats[6] = this['fTsumwxy'];
01319 }
01320 return stats;
01321 };
01322 }
01323 if (obj_typename.indexOf("TH3") == 0) {
01324 obj['fDimension'] = 3;
01325 obj['getBin'] = function(x, y, z) {
01326 var nx = this['fXaxis']['fNbins']+2;
01327 if (x < 0) x = 0;
01328 if (x >= nx) x = nx-1;
01329 var ny = this['fYaxis']['fNbins']+2;
01330 if (y < 0) y = 0;
01331 if (y >= ny) y = ny-1;
01332 return (x + nx * (y + ny * z));
01333 };
01334 obj['getBinContent'] = function(x, y, z) {
01335 return this['fArray'][this.getBin(x, y, z)];
01336 };
01337 obj['getStats'] = function() {
01338 var bin, binx, biny, binz, stats = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0);
01339 if ((obj['fTsumw'] == 0 && obj['fEntries'] > 0) || obj['fXaxis'].TestBit(JSROOT.EAxisBits.kAxisRange) || obj['fYaxis'].TestBit(JSROOT.EAxisBits.kAxisRange) || obj['fZaxis'].TestBit(JSROOT.EAxisBits.kAxisRange)) {
01340 var firstBinX = obj['fXaxis'].getFirst();
01341 var lastBinX = obj['fXaxis'].getLast();
01342 var firstBinY = obj['fYaxis'].getFirst();
01343 var lastBinY = obj['fYaxis'].getLast();
01344 var firstBinZ = obj['fZaxis'].getFirst();
01345 var lastBinZ = obj['fZaxis'].getLast();
01346
01347 if (obj['fgStatOverflows']) {
01348 if ( !obj['fXaxis'].TestBit(JSROOT.EAxisBits.kAxisRange) ) {
01349 if (firstBinX == 1) firstBinX = 0;
01350 if (lastBinX == obj['fXaxis']['fNbins'] ) lastBinX += 1;
01351 }
01352 if ( !obj['fYaxis'].TestBit(JSROOT.EAxisBits.kAxisRange) ) {
01353 if (firstBinY == 1) firstBinY = 0;
01354 if (lastBinY == obj['fYaxis']['fNbins'] ) lastBinY += 1;
01355 }
01356 if ( !obj['fZaxis'].TestBit(JSROOT.EAxisBits.kAxisRange) ) {
01357 if (firstBinZ == 1) firstBinZ = 0;
01358 if (lastBinZ == obj['fZaxis']['fNbins'] ) lastBinZ += 1;
01359 }
01360 }
01361 for (binz = firstBinZ; binz <= lastBinZ; binz++) {
01362 z = obj['fZaxis'].getBinCenter(binz);
01363 for (biny = firstBinY; biny <= lastBinY; biny++) {
01364 y = obj['fYaxis'].getBinCenter(biny);
01365 for (binx = firstBinX; binx <= lastBinX; binx++) {
01366 bin = obj.getBin(binx,biny,binz);
01367 x = obj['fXaxis'].getBinCenter(binx);
01368 w = obj.GetBinContent(bin);
01369 err = Math.abs(obj.getBinError(bin));
01370 stats[0] += w;
01371 stats[1] += err*err;
01372 stats[2] += w*x;
01373 stats[3] += w*x*x;
01374 stats[4] += w*y;
01375 stats[5] += w*y*y;
01376 stats[6] += w*x*y;
01377 stats[7] += w*z;
01378 stats[8] += w*z*z;
01379 stats[9] += w*x*z;
01380 stats[10] += w*y*z;
01381 }
01382 }
01383 }
01384 } else {
01385 stats[0] = obj['fTsumw'];
01386 stats[1] = obj['fTsumw2'];
01387 stats[2] = obj['fTsumwx'];
01388 stats[3] = obj['fTsumwx2'];
01389 stats[4] = obj['fTsumwy'];
01390 stats[5] = obj['fTsumwy2'];
01391 stats[6] = obj['fTsumwxy'];
01392 stats[7] = obj['fTsumwz'];
01393 stats[8] = obj['fTsumwz2'];
01394 stats[9] = obj['fTsumwxz'];
01395 stats[10] =obj['fTsumwyz'];
01396 }
01397 return stats;
01398 };
01399 }
01400 if (obj_typename.indexOf("THStack") == 0) {
01401 obj['buildStack'] = function() {
01402
01403
01404 if ('fStack' in this) return;
01405 if (!'fHists' in this) return;
01406 var nhists = this['fHists'].arr.length;
01407 if (nhists <= 0) return;
01408 this['fStack'] = JSROOT.Create("TList");
01409 var h = JSROOT.clone(this['fHists'].arr[0]);
01410 this['fStack'].arr.push(h);
01411 for (var i=1;i<nhists;i++) {
01412 h = JSROOT.clone(this['fHists'].arr[i]);
01413 h.add(this['fStack'].arr[i-1]);
01414 this['fStack'].arr.splice(i, 1, h);
01415 }
01416 };
01417 obj['getMaximum'] = function(option) {
01418
01419
01420 var opt = option.toLowerCase();
01421 var lerr = false;
01422 if (opt.indexOf("e") != -1) lerr = true;
01423 var them = 0, themax = -1e300, c1, e1;
01424 if (!'fHists' in this) return 0;
01425 var nhists = this['fHists'].arr.length;
01426 var first, last;
01427 if (opt.indexOf("nostack") == -1) {
01428 this.buildStack();
01429 var h = this['fStack'].arr[nhists-1];
01430 themax = h.getMaximum();
01431 } else {
01432 for (var i=0;i<nhists;i++) {
01433 h = this['fHists'].arr[i];
01434 them = h.getMaximum();
01435 if (them > themax) themax = them;
01436 }
01437 }
01438 if (lerr) {
01439 for (var i=0;i<nhists;i++) {
01440 h = this['fHists'].arr[i];
01441 first = h['fXaxis'].getFirst();
01442 last = h['fXaxis'].getLast();
01443 for (var j=first; j<=last;j++) {
01444 e1 = h.getBinError(j);
01445 c1 = h.getBinContent(j);
01446 themax = Math.max(themax, c1+e1);
01447 }
01448 }
01449 }
01450 return themax;
01451 };
01452 obj['getMinimum'] = function(option, pad) {
01453
01454
01455 var opt = option.toLowerCase();
01456 var lerr = false;
01457 if (opt.indexOf("e") == -1) lerr = true;
01458 var them = 0, themin = 1e300, c1, e1;
01459 if (!'fHists' in this) return 0;
01460 var nhists = this['fHists'].arr.length;
01461 var first, last;
01462 if (opt.indexOf("nostack") == -1) {
01463 this.buildStack();
01464 var h = this['fStack'].arr[nhists-1];
01465 themin = h.getMinimum();
01466 } else {
01467 for (var i=0;i<nhists;i++) {
01468 h = this['fHists'].arr[i];
01469 them = h.getMinimum();
01470 if (them <= 0 && pad && pad['fLogy']) them = h.getMinimum(0);
01471 if (them < themin) themin = them;
01472 }
01473 }
01474 if (lerr) {
01475 for (var i=0;i<nhists;i++) {
01476 h = this['fHists'].arr[i];
01477 first = h['fXaxis'].getFirst();
01478 last = h['fXaxis'].getLast();
01479 for (var j=first;j<=last;j++) {
01480 e1 = h.getBinError(j);
01481 c1 = h.getBinContent(j);
01482 themin = Math.min(themin, c1 - e1);
01483 }
01484 }
01485 }
01486 return themin;
01487 };
01488 }
01489 if ((obj_typename.indexOf("TH1") == 0) ||
01490 (obj_typename.indexOf("TH2") == 0) ||
01491 (obj_typename.indexOf("TH3") == 0) ||
01492 (obj_typename.indexOf("TProfile") == 0)) {
01493 obj['getMean'] = function(axis) {
01494 if (axis < 1 || (axis > 3 && axis < 11) || axis > 13) return 0;
01495 var stats = this.getStats();
01496 if (stats[0] == 0) return 0;
01497 var ax = new Array(2,4,7);
01498 return stats[ax[axis-1]]/stats[0];
01499 };
01500 obj['getRMS'] = function(axis) {
01501 if (axis < 1 || (axis > 3 && axis < 11) || axis > 13) return 0;
01502 var stats = this.getStats();
01503 if (stats[0] == 0) return 0;
01504 var ax = new Array(2,4,7);
01505 var axm = ax[axis%10 - 1];
01506 var x = stats[axm]/stats[0];
01507 var rms2 = Math.abs(stats[axm+1]/stats[0] -x*x);
01508 return Math.sqrt(rms2);
01509 };
01510 }
01511 if (obj_typename.indexOf("TProfile") == 0) {
01512 obj['getBinContent'] = function(bin) {
01513 if (bin < 0 || bin >= this['fNcells']) return 0;
01514 if (this['fBinEntries'][bin] < 1e-300) return 0;
01515 if (!this['fArray']) return 0;
01516 return this['fArray'][bin]/this['fBinEntries'][bin];
01517 };
01518 obj['getBinEffectiveEntries'] = function(bin) {
01519 if (bin < 0 || bin >= this['fNcells']) return 0;
01520 var sumOfWeights = this['fBinEntries'][bin];
01521 if ( this['fBinSumw2'].length == 0 || this['fBinSumw2'].length != this['fNcells']) {
01522
01523 return sumOfWeights;
01524 }
01525 var sumOfWeightsSquare = this['fSumw2'][bin];
01526 return ( sumOfWeightsSquare > 0 ? sumOfWeights * sumOfWeights / sumOfWeightsSquare : 0 );
01527 };
01528 obj['getStats'] = function() {
01529 var bin, binx, stats = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0);
01530 if (this['fTsumw'] < 1e-300 || this['fXaxis'].TestBit(JSROOT.EAxisBits.kAxisRange)) {
01531 var firstBinX = this['fXaxis'].getFirst();
01532 var lastBinX = this['fXaxis'].getLast();
01533 for (binx = this['firstBinX']; binx <= lastBinX; binx++) {
01534 var w = onj['fBinEntries'][binx];
01535 var w2 = (this['fN'] ? this['fBinSumw2'][binx] : w);
01536 var x = fXaxis.GetBinCenter(binx);
01537 stats[0] += w;
01538 stats[1] += w2;
01539 stats[2] += w*x;
01540 stats[3] += w*x*x;
01541 stats[4] += this['fArray'][binx];
01542 stats[5] += this['fSumw2'][binx];
01543 }
01544 } else {
01545 if (this['fTsumwy'] < 1e-300 && this['fTsumwy2'] < 1e-300) {
01546
01547 for (binx=this['fXaxis'].getFirst();binx<=this['fXaxis'].getLast();binx++) {
01548 this['fTsumwy'] += this['fArray'][binx];
01549 this['fTsumwy2'] += this['fSumw2'][binx];
01550 }
01551 }
01552 stats[0] = this['fTsumw'];
01553 stats[1] = this['fTsumw2'];
01554 stats[2] = this['fTsumwx'];
01555 stats[3] = this['fTsumwx2'];
01556 stats[4] = this['fTsumwy'];
01557 stats[5] = this['fTsumwy2'];
01558 }
01559 return stats;
01560 };
01561 obj['getBinError'] = function(bin) {
01562 if (bin < 0 || bin >= this['fNcells']) return 0;
01563 var cont = this['fArray'][bin];
01564 var sum = this['fBinEntries'][bin];
01565 var err2 = this['fSumw2'][bin];
01566 var neff = this.getBinEffectiveEntries(bin);
01567 if (sum < 1e-300) return 0;
01568
01569 if (this['fErrorMode'] == EErrorType.kERRORSPREADG) {
01570 return (1.0/Math.sqrt(sum));
01571 }
01572
01573 var contsum = cont/sum;
01574 var eprim2 = Math.abs(err2/sum - contsum*contsum);
01575 var eprim = Math.sqrt(eprim2);
01576 if (this['fErrorMode'] == EErrorType.kERRORSPREADI) {
01577 if (eprim != 0) return eprim/Math.sqrt(neff);
01578
01579
01580 return (1.0/Math.sqrt(12*neff));
01581 }
01582
01583
01584 var testing = 1;
01585 if (err2 != 0 && neff < 5) testing = eprim2*sum/err2;
01586 if (this['fgApproximate'] && (testing < 1.e-4 || eprim2 < 1e-6)) {
01587 var stats = this.getStats();
01588 var ssum = stats[0];
01589
01590 var idx = 4;
01591 var scont = stats[idx];
01592 var serr2 = stats[idx+1];
01593
01594 var scontsum = scont/ssum;
01595 var seprim2 = Math.abs(serr2/ssum - scontsum*scontsum);
01596 eprim = 2*Math.sqrt(seprim2);
01597 sum = ssum;
01598 }
01599 sum = Math.abs(sum);
01600
01601 if (this['fErrorMode'] == EErrorType.kERRORSPREAD) return eprim;
01602
01603
01604 return (eprim/Math.sqrt(neff));
01605 };
01606 }
01607 };
01608
01609
01610
01611
01612 JSROOT.Math = {};
01613
01614
01615 JSROOT.Math.lgam = function( x ) {
01616 var p, q, u, w, z;
01617 var i;
01618
01619 var sgngam = 1;
01620
01621 if (x >= Number.POSITIVE_INFINITY)
01622 return(Number.POSITIVE_INFINITY);
01623
01624 if ( x < -34.0 ) {
01625 q = -x;
01626 w = this.lgam(q);
01627 p = Math.floor(q);
01628 if ( p==q )
01629 return (Number.POSITIVE_INFINITY);
01630 i = Math.round(p);
01631 if ( (i & 1) == 0 )
01632 sgngam = -1;
01633 else
01634 sgngam = 1;
01635 z = q - p;
01636 if ( z > 0.5 ) {
01637 p += 1.0;
01638 z = p - q;
01639 }
01640 z = q * Math.sin( Math.PI * z );
01641 if ( z < 1e-300 )
01642 return (Number.POSITIVE_INFINITY);
01643 z = Math.log(Math.PI) - Math.log( z ) - w;
01644 return( z );
01645 }
01646 if ( x < 13.0 ) {
01647 z = 1.0;
01648 p = 0.0;
01649 u = x;
01650 while ( u >= 3.0 ) {
01651 p -= 1.0;
01652 u = x + p;
01653 z *= u;
01654 }
01655 while ( u < 2.0 ) {
01656 if ( u < 1e-300 )
01657 return (Number.POSITIVE_INFINITY);
01658 z /= u;
01659 p += 1.0;
01660 u = x + p;
01661 }
01662 if ( z < 0.0 ) {
01663 sgngam = -1;
01664 z = -z;
01665 }
01666 else
01667 sgngam = 1;
01668 if ( u == 2.0 )
01669 return( Math.log(z) );
01670 p -= 2.0;
01671 x = x + p;
01672 p = x * this.Polynomialeval(x, B, 5 ) / this.Polynomial1eval( x, C, 6);
01673 return( Math.log(z) + p );
01674 }
01675 if ( x > kMAXLGM )
01676 return( sgngam * Number.POSITIVE_INFINITY );
01677
01678 q = ( x - 0.5 ) * Math.log(x) - x + LS2PI;
01679 if ( x > 1.0e8 )
01680 return( q );
01681
01682 p = 1.0/(x*x);
01683 if ( x >= 1000.0 )
01684 q += ((7.9365079365079365079365e-4 * p
01685 - 2.7777777777777777777778e-3) *p
01686 + 0.0833333333333333333333) / x;
01687 else
01688 q += this.Polynomialeval( p, A, 4 ) / x;
01689 return( q );
01690 };
01691
01692
01693
01694
01695
01696 JSROOT.Math.Polynomialeval = function(x, a, N) {
01697 if (N==0) return a[0];
01698 else {
01699 var pom = a[0];
01700 for (var i=1; i <= N; i++)
01701 pom = pom *x + a[i];
01702 return pom;
01703 }
01704 };
01705
01706
01707
01708
01709
01710 JSROOT.Math.Polynomial1eval = function(x, a, N) {
01711 if (N==0) return a[0];
01712 else {
01713 var pom = x + a[0];
01714 for (var i=1; i < N; i++)
01715 pom = pom *x + a[i];
01716 return pom;
01717 }
01718 };
01719
01720 JSROOT.Math.ndtri = function( y0 ) {
01721 if ( y0 <= 0.0 )
01722 return( Number.NEGATIVE_INFINITY );
01723 if ( y0 >= 1.0 )
01724 return( Number.POSITIVE_INFINITY );
01725
01726 var P0 = new Array(
01727 -5.99633501014107895267E1,
01728 9.80010754185999661536E1,
01729 -5.66762857469070293439E1,
01730 1.39312609387279679503E1,
01731 -1.23916583867381258016E0
01732 );
01733
01734 var Q0 = new Array(
01735 1.95448858338141759834E0,
01736 4.67627912898881538453E0,
01737 8.63602421390890590575E1,
01738 -2.25462687854119370527E2,
01739 2.00260212380060660359E2,
01740 -8.20372256168333339912E1,
01741 1.59056225126211695515E1,
01742 -1.18331621121330003142E0
01743 );
01744
01745 var P1 = new Array(
01746 4.05544892305962419923E0,
01747 3.15251094599893866154E1,
01748 5.71628192246421288162E1,
01749 4.40805073893200834700E1,
01750 1.46849561928858024014E1,
01751 2.18663306850790267539E0,
01752 -1.40256079171354495875E-1,
01753 -3.50424626827848203418E-2,
01754 -8.57456785154685413611E-4
01755 );
01756
01757 var Q1 = new Array(
01758 1.57799883256466749731E1,
01759 4.53907635128879210584E1,
01760 4.13172038254672030440E1,
01761 1.50425385692907503408E1,
01762 2.50464946208309415979E0,
01763 -1.42182922854787788574E-1,
01764 -3.80806407691578277194E-2,
01765 -9.33259480895457427372E-4
01766 );
01767
01768 var P2 = new Array(
01769 3.23774891776946035970E0,
01770 6.91522889068984211695E0,
01771 3.93881025292474443415E0,
01772 1.33303460815807542389E0,
01773 2.01485389549179081538E-1,
01774 1.23716634817820021358E-2,
01775 3.01581553508235416007E-4,
01776 2.65806974686737550832E-6,
01777 6.23974539184983293730E-9
01778 );
01779
01780 var Q2 = new Array(
01781 6.02427039364742014255E0,
01782 3.67983563856160859403E0,
01783 1.37702099489081330271E0,
01784 2.16236993594496635890E-1,
01785 1.34204006088543189037E-2,
01786 3.28014464682127739104E-4,
01787 2.89247864745380683936E-6,
01788 6.79019408009981274425E-9
01789 );
01790
01791 var s2pi = 2.50662827463100050242e0;
01792 var code = 1;
01793 var y = y0;
01794 var x, z, y2, x0, x1;
01795
01796 if ( y > (1.0 - 0.13533528323661269189) ) {
01797 y = 1.0 - y;
01798 code = 0;
01799 }
01800 if ( y > 0.13533528323661269189 ) {
01801 y = y - 0.5;
01802 y2 = y * y;
01803 x = y + y * (y2 * this.Polynomialeval( y2, P0, 4)/ this.Polynomial1eval( y2, Q0, 8 ));
01804 x = x * s2pi;
01805 return(x);
01806 }
01807 x = Math.sqrt( -2.0 * Math.log(y) );
01808 x0 = x - Math.log(x)/x;
01809 z = 1.0/x;
01810 if ( x < 8.0 )
01811 x1 = z * this.Polynomialeval( z, P1, 8 )/ this.Polynomial1eval( z, Q1, 8 );
01812 else
01813 x1 = z * this.Polynomialeval( z, P2, 8 )/ this.Polynomial1eval( z, Q2, 8 );
01814 x = x0 - x1;
01815 if ( code != 0 )
01816 x = -x;
01817 return( x );
01818 };
01819
01820 JSROOT.Math.igami = function(a, y0) {
01821 var x0, x1, x, yl, yh, y, d, lgm, dithresh;
01822 var i, dir;
01823 var kMACHEP = 1.11022302462515654042363166809e-16;
01824
01825
01826 if (a <= 0) {
01827 alert("igami : Wrong domain for parameter a (must be > 0)");
01828 return 0;
01829 }
01830 if (y0 <= 0) {
01831 return Number.POSITIVE_INFINITY;
01832 }
01833 if (y0 >= 1) {
01834 return 0;
01835 }
01836
01837 var kMAXNUM = Number.MAX_VALUE;
01838 x0 = kMAXNUM;
01839 yl = 0;
01840 x1 = 0;
01841 yh = 1.0;
01842 dithresh = 5.0 * kMACHEP;
01843
01844
01845 d = 1.0/(9.0*a);
01846 y = ( 1.0 - d - this.ndtri(y0) * Math.sqrt(d) );
01847 x = a * y * y * y;
01848
01849 lgm = this.lgam(a);
01850
01851 for( i=0; i<10; i++ ) {
01852 if ( x > x0 || x < x1 )
01853 break;
01854 y = igamc(a,x);
01855 if ( y < yl || y > yh )
01856 break;
01857 if ( y < y0 ) {
01858 x0 = x;
01859 yl = y;
01860 }
01861 else {
01862 x1 = x;
01863 yh = y;
01864 }
01865
01866 d = (a - 1.0) * Math.log(x) - x - lgm;
01867 if ( d < -kMAXLOG )
01868 break;
01869 d = -Math.exp(d);
01870
01871 d = (y - y0)/d;
01872 if ( Math.abs(d/x) < kMACHEP )
01873 return( x );
01874 x = x - d;
01875 }
01876
01877 d = 0.0625;
01878 if ( x0 == kMAXNUM ) {
01879 if ( x <= 0.0 )
01880 x = 1.0;
01881 while ( x0 == kMAXNUM ) {
01882 x = (1.0 + d) * x;
01883 y = igamc( a, x );
01884 if ( y < y0 ) {
01885 x0 = x;
01886 yl = y;
01887 break;
01888 }
01889 d = d + d;
01890 }
01891 }
01892 d = 0.5;
01893 dir = 0;
01894
01895 for( i=0; i<400; i++ ) {
01896 x = x1 + d * (x0 - x1);
01897 y = igamc( a, x );
01898 lgm = (x0 - x1)/(x1 + x0);
01899 if ( Math.abs(lgm) < dithresh )
01900 break;
01901 lgm = (y - y0)/y0;
01902 if ( Math.abs(lgm) < dithresh )
01903 break;
01904 if ( x <= 0.0 )
01905 break;
01906 if ( y >= y0 ) {
01907 x1 = x;
01908 yh = y;
01909 if ( dir < 0 ) {
01910 dir = 0;
01911 d = 0.5;
01912 }
01913 else if ( dir > 1 )
01914 d = 0.5 * d + 0.5;
01915 else
01916 d = (y0 - yl)/(yh - yl);
01917 dir += 1;
01918 }
01919 else {
01920 x0 = x;
01921 yl = y;
01922 if ( dir > 0 ) {
01923 dir = 0;
01924 d = 0.5;
01925 }
01926 else if ( dir < -1 )
01927 d = 0.5 * d;
01928 else
01929 d = (y0 - yl)/(yh - yl);
01930 dir -= 1;
01931 }
01932 }
01933 return( x );
01934 };
01935
01936 JSROOT.Math.gamma_quantile_c = function(z, alpha, theta) {
01937 return theta * this.igami( alpha, z);
01938 };
01939
01940 JSROOT.Math.gamma_quantile = function(z, alpha, theta) {
01941 return theta * this.igami( alpha, 1.- z);
01942 };
01943
01944 JSROOT.Math.log10 = function(n) {
01945 return Math.log(n) / Math.log(10);
01946 };
01947
01948 JSROOT.Math.landau_pdf = function(x, xi, x0) {
01949
01950
01951 if (xi <= 0) return 0;
01952 var v = (x - x0)/xi;
01953 var u, ue, us, denlan;
01954 var p1 = new Array(0.4259894875,-0.1249762550, 0.03984243700, -0.006298287635, 0.001511162253);
01955 var q1 = new Array(1.0 ,-0.3388260629, 0.09594393323, -0.01608042283, 0.003778942063);
01956 var p2 = new Array(0.1788541609, 0.1173957403, 0.01488850518, -0.001394989411, 0.0001283617211);
01957 var q2 = new Array(1.0 , 0.7428795082, 0.3153932961, 0.06694219548, 0.008790609714);
01958 var p3 = new Array(0.1788544503, 0.09359161662,0.006325387654, 0.00006611667319,-0.000002031049101);
01959 var q3 = new Array(1.0 , 0.6097809921, 0.2560616665, 0.04746722384, 0.006957301675);
01960 var p4 = new Array(0.9874054407, 118.6723273, 849.2794360, -743.7792444, 427.0262186);
01961 var q4 = new Array(1.0 , 106.8615961, 337.6496214, 2016.712389, 1597.063511);
01962 var p5 = new Array(1.003675074, 167.5702434, 4789.711289, 21217.86767, -22324.94910);
01963 var q5 = new Array(1.0 , 156.9424537, 3745.310488, 9834.698876, 66924.28357);
01964 var p6 = new Array(1.000827619, 664.9143136, 62972.92665, 475554.6998, -5743609.109);
01965 var q6 = new Array(1.0 , 651.4101098, 56974.73333, 165917.4725, -2815759.939);
01966 var a1 = new Array(0.04166666667,-0.01996527778, 0.02709538966);
01967 var a2 = new Array(-1.845568670,-4.284640743);
01968
01969 if (v < -5.5) {
01970 u = Math.exp(v+1.0);
01971 if (u < 1e-10) return 0.0;
01972 ue = Math.exp(-1/u);
01973 us = Math.sqrt(u);
01974 denlan = 0.3989422803*(ue/us)*(1+(a1[0]+(a1[1]+a1[2]*u)*u)*u);
01975 } else if(v < -1) {
01976 u = Math.exp(-v-1);
01977 denlan = Math.exp(-u)*Math.sqrt(u)*
01978 (p1[0]+(p1[1]+(p1[2]+(p1[3]+p1[4]*v)*v)*v)*v)/
01979 (q1[0]+(q1[1]+(q1[2]+(q1[3]+q1[4]*v)*v)*v)*v);
01980 } else if(v < 1) {
01981 denlan = (p2[0]+(p2[1]+(p2[2]+(p2[3]+p2[4]*v)*v)*v)*v)/
01982 (q2[0]+(q2[1]+(q2[2]+(q2[3]+q2[4]*v)*v)*v)*v);
01983 } else if(v < 5) {
01984 denlan = (p3[0]+(p3[1]+(p3[2]+(p3[3]+p3[4]*v)*v)*v)*v)/
01985 (q3[0]+(q3[1]+(q3[2]+(q3[3]+q3[4]*v)*v)*v)*v);
01986 } else if(v < 12) {
01987 u = 1/v;
01988 denlan = u*u*(p4[0]+(p4[1]+(p4[2]+(p4[3]+p4[4]*u)*u)*u)*u)/
01989 (q4[0]+(q4[1]+(q4[2]+(q4[3]+q4[4]*u)*u)*u)*u);
01990 } else if(v < 50) {
01991 u = 1/v;
01992 denlan = u*u*(p5[0]+(p5[1]+(p5[2]+(p5[3]+p5[4]*u)*u)*u)*u)/
01993 (q5[0]+(q5[1]+(q5[2]+(q5[3]+q5[4]*u)*u)*u)*u);
01994 } else if(v < 300) {
01995 u = 1/v;
01996 denlan = u*u*(p6[0]+(p6[1]+(p6[2]+(p6[3]+p6[4]*u)*u)*u)*u)/
01997 (q6[0]+(q6[1]+(q6[2]+(q6[3]+q6[4]*u)*u)*u)*u);
01998 } else {
01999 u = 1/(v-v*Math.log(v)/(v+1));
02000 denlan = u*u*(1+(a2[0]+a2[1]*u)*u);
02001 }
02002 return denlan/xi;
02003 };
02004
02005 JSROOT.Math.Landau = function(x, mpv, sigma, norm) {
02006 if (sigma <= 0) return 0;
02007 var den = JSROOT.Math.landau_pdf((x - mpv) / sigma, 1, 0);
02008 if (!norm) return den;
02009 return den/sigma;
02010 };
02011
02012 JSROOT.Math.gaus = function(f, x, i) {
02013 return f['fParams'][i+0] * Math.exp(-0.5 * Math.pow((x-f['fParams'][i+1]) / f['fParams'][i+2], 2));
02014 };
02015
02016 JSROOT.Math.gausn = function(f, x, i) {
02017 return JSROOT.Math.gaus(f, x, i)/(Math.sqrt(2 * Math.PI) * f['fParams'][i+2]);
02018 };
02019
02020 JSROOT.Math.expo = function(f, x, i) {
02021 return Math.exp(f['fParams'][i+0] + f['fParams'][i+1] * x);
02022 };
02023
02024 JSROOT.Math.landau = function(f, x, i) {
02025 return JSROOT.Math.Landau(x, f['fParams'][i+1],f['fParams'][i+2], false);
02026 };
02027
02028 JSROOT.Math.landaun = function(f, x, i) {
02029 return JSROOT.Math.Landau(x, f['fParams'][i+1],f['fParams'][i+2], true);
02030 };
02031
02032 })();
02033
02035