From 618c8774d50c192814f47c2ed5a1570d7a94383e Mon Sep 17 00:00:00 2001 From: Fawad Ali Date: Wed, 22 Mar 2023 16:20:39 +0100 Subject: [PATCH] chore(release): v2.14.0 --- CHANGELOG.md | 8 + docs/137.cced59b964dda1c3.js | 2 + ...2a1.js.map => 137.cced59b964dda1c3.js.map} | 2 +- docs/15.4def682f3a97b1e2.js | 2 + docs/15.4def682f3a97b1e2.js.map | 1 + ...86840b2b804.js => 172.e4469fbbca37f633.js} | 4 +- ...804.js.map => 172.e4469fbbca37f633.js.map} | 2 +- docs/230.9df4c215ca49efed.js | 2 + ...a9b.js.map => 230.9df4c215ca49efed.js.map} | 2 +- ...9de530d51ee.js => 241.4ed7b8d7fa416235.js} | 4 +- ...1ee.js.map => 241.4ed7b8d7fa416235.js.map} | 2 +- docs/260.081a22df4eb6dd7f.js | 2 + ...43e.js.map => 260.081a22df4eb6dd7f.js.map} | 2 +- ...e92b8e7a333.js => 267.7e1bf61fc32a98a5.js} | 4 +- ...333.js.map => 267.7e1bf61fc32a98a5.js.map} | 2 +- docs/274.7d4546dc06404ec9.js | 2 + ...2ea.js.map => 274.7d4546dc06404ec9.js.map} | 2 +- docs/299.262c7f127dcdf2a1.js | 2 - ...ef28756d2fc.js => 351.7dfe5ad1980ea70b.js} | 4 +- ...2fc.js.map => 351.7dfe5ad1980ea70b.js.map} | 2 +- docs/404.html | 4 +- docs/431.d3bb1ba13892743e.js | 2 - docs/460.82abbdc95d6f09e0.js | 2 - docs/471.d4fa75b0547d540a.js | 2 - docs/471.d4fa75b0547d540a.js.map | 1 - docs/476.f27d0b39c577e2e0.js | 2 + docs/476.f27d0b39c577e2e0.js.map | 1 + docs/484.5a180dbb47d3c56e.js | 2 + ...e5d.js.map => 484.5a180dbb47d3c56e.js.map} | 2 +- docs/56.0b66108b488f8216.js | 2 + docs/56.0b66108b488f8216.js.map | 1 + docs/562.13af937336895a9b.js | 2 - docs/579.8c087840c9033381.js | 2 + ...b12.js.map => 579.8c087840c9033381.js.map} | 2 +- docs/580.ce6123e31b50494f.js | 2 + ...9e0.js.map => 580.ce6123e31b50494f.js.map} | 2 +- docs/60.cc479afafde89289.js | 2 + docs/60.cc479afafde89289.js.map | 1 + ...e25e1379a18.js => 601.bdb253779e07488d.js} | 4 +- ...a18.js.map => 601.bdb253779e07488d.js.map} | 2 +- ...17338b338e15.js => 61.dbe75c5a8333bdf7.js} | 4 +- ...8e15.js.map => 61.dbe75c5a8333bdf7.js.map} | 2 +- ...1b729c76312.js => 625.b2df831fc47ab055.js} | 4 +- ...312.js.map => 625.b2df831fc47ab055.js.map} | 2 +- docs/636.6ba473b6b4c07b12.js | 2 - docs/647.f98f01d9b6ad4c05.js | 2 + ...51b.js.map => 647.f98f01d9b6ad4c05.js.map} | 2 +- docs/665.b62c24ed8ec594bf.js | 2 - docs/665.b62c24ed8ec594bf.js.map | 1 - docs/680.52fd2861264b5cb7.js | 2 + ...54f.js.map => 680.52fd2861264b5cb7.js.map} | 2 +- docs/680.7cef058bf72a659f.js | 2 - docs/680.7cef058bf72a659f.js.map | 1 - docs/7.26ceec994b6894fa.js | 2 - docs/7.26ceec994b6894fa.js.map | 1 - docs/717.92b025f5f9cba505.js | 2 - docs/717.92b025f5f9cba505.js.map | 1 - ...cc28efaa79d.js => 717.a696fd693dce2cca.js} | 4 +- ...79d.js.map => 717.a696fd693dce2cca.js.map} | 2 +- docs/726.d688e74f08d3451b.js | 2 - docs/727.68369a4ece2d6e5d.js | 2 - docs/728.960e13d793eca2ea.js | 2 - docs/765.d54816cb7021354f.js | 2 - docs/832.c41e44530d6fa14d.js | 2 + ...e9b.js.map => 832.c41e44530d6fa14d.js.map} | 2 +- ...dfe255d4b8c.js => 946.e9493c0284811601.js} | 4 +- ...b8c.js.map => 946.e9493c0284811601.js.map} | 2 +- docs/969.4da6fba206d57e9b.js | 2 - docs/99.0ba42481a501907f.js | 2 + docs/99.0ba42481a501907f.js.map | 1 + docs/api-docs/changelog.html | 2 + docs/api-docs/classes/AnimationsManager.html | 44 +- docs/api-docs/classes/Cut.html | 466 +++++++++++++++++- docs/api-docs/classes/PhoenixMenuNode.html | 18 +- docs/api-docs/classes/PhoenixMenuUI.html | 381 +++++++++++--- docs/api-docs/classes/PhoenixObjects.html | 78 ++- docs/api-docs/classes/SceneManager.html | 2 +- docs/api-docs/classes/UIManager.html | 258 +++++++--- docs/api-docs/coverage.html | 22 +- docs/api-docs/interfaces/AnimationPreset.html | 47 ++ docs/api-docs/interfaces/Configuration.html | 108 ++++ docs/api-docs/js/search/search_index.js | 4 +- docs/api-docs/miscellaneous/variables.html | 82 +++ docs/api-docs/properties.html | 2 +- docs/common.81bdd95ae5536501.js | 2 + ....js.map => common.81bdd95ae5536501.js.map} | 2 +- docs/common.d6e94f63af501d82.js | 2 - docs/index.html | 4 +- ...90c19aaee9.js => main.46d6821a25958691.js} | 6 +- ...e9.js.map => main.46d6821a25958691.js.map} | 2 +- ...d7157.js => polyfills.81a20ea3e5675c2f.js} | 4 +- ....map => polyfills.81a20ea3e5675c2f.js.map} | 2 +- docs/runtime.a0c3fb6fad382d15.js | 2 - docs/runtime.a0c3fb6fad382d15.js.map | 1 - docs/runtime.b3dbed27e02e15e9.js | 2 + docs/runtime.b3dbed27e02e15e9.js.map | 1 + lerna.json | 2 +- packages/phoenix-event-display/CHANGELOG.md | 8 + packages/phoenix-event-display/package.json | 2 +- packages/phoenix-ng/CHANGELOG.md | 8 + packages/phoenix-ng/package.json | 6 +- .../phoenix-ui-components/CHANGELOG.md | 8 + .../phoenix-ui-components/package.json | 2 +- 103 files changed, 1428 insertions(+), 308 deletions(-) create mode 100644 docs/137.cced59b964dda1c3.js rename docs/{299.262c7f127dcdf2a1.js.map => 137.cced59b964dda1c3.js.map} (99%) create mode 100644 docs/15.4def682f3a97b1e2.js create mode 100644 docs/15.4def682f3a97b1e2.js.map rename docs/{597.e38b886840b2b804.js => 172.e4469fbbca37f633.js} (98%) rename docs/{597.e38b886840b2b804.js.map => 172.e4469fbbca37f633.js.map} (99%) create mode 100644 docs/230.9df4c215ca49efed.js rename docs/{562.13af937336895a9b.js.map => 230.9df4c215ca49efed.js.map} (99%) rename docs/{879.0345d9de530d51ee.js => 241.4ed7b8d7fa416235.js} (98%) rename docs/{879.0345d9de530d51ee.js.map => 241.4ed7b8d7fa416235.js.map} (99%) create mode 100644 docs/260.081a22df4eb6dd7f.js rename docs/{431.d3bb1ba13892743e.js.map => 260.081a22df4eb6dd7f.js.map} (99%) rename docs/{142.90c84e92b8e7a333.js => 267.7e1bf61fc32a98a5.js} (99%) rename docs/{142.90c84e92b8e7a333.js.map => 267.7e1bf61fc32a98a5.js.map} (99%) create mode 100644 docs/274.7d4546dc06404ec9.js rename docs/{728.960e13d793eca2ea.js.map => 274.7d4546dc06404ec9.js.map} (99%) delete mode 100644 docs/299.262c7f127dcdf2a1.js rename docs/{554.734d0ef28756d2fc.js => 351.7dfe5ad1980ea70b.js} (95%) rename docs/{554.734d0ef28756d2fc.js.map => 351.7dfe5ad1980ea70b.js.map} (99%) delete mode 100644 docs/431.d3bb1ba13892743e.js delete mode 100644 docs/460.82abbdc95d6f09e0.js delete mode 100644 docs/471.d4fa75b0547d540a.js delete mode 100644 docs/471.d4fa75b0547d540a.js.map create mode 100644 docs/476.f27d0b39c577e2e0.js create mode 100644 docs/476.f27d0b39c577e2e0.js.map create mode 100644 docs/484.5a180dbb47d3c56e.js rename docs/{727.68369a4ece2d6e5d.js.map => 484.5a180dbb47d3c56e.js.map} (99%) create mode 100644 docs/56.0b66108b488f8216.js create mode 100644 docs/56.0b66108b488f8216.js.map delete mode 100644 docs/562.13af937336895a9b.js create mode 100644 docs/579.8c087840c9033381.js rename docs/{636.6ba473b6b4c07b12.js.map => 579.8c087840c9033381.js.map} (99%) create mode 100644 docs/580.ce6123e31b50494f.js rename docs/{460.82abbdc95d6f09e0.js.map => 580.ce6123e31b50494f.js.map} (99%) create mode 100644 docs/60.cc479afafde89289.js create mode 100644 docs/60.cc479afafde89289.js.map rename docs/{212.e5372e25e1379a18.js => 601.bdb253779e07488d.js} (92%) rename docs/{212.e5372e25e1379a18.js.map => 601.bdb253779e07488d.js.map} (99%) rename docs/{18.53db17338b338e15.js => 61.dbe75c5a8333bdf7.js} (93%) rename docs/{18.53db17338b338e15.js.map => 61.dbe75c5a8333bdf7.js.map} (99%) rename docs/{928.a46951b729c76312.js => 625.b2df831fc47ab055.js} (96%) rename docs/{928.a46951b729c76312.js.map => 625.b2df831fc47ab055.js.map} (99%) delete mode 100644 docs/636.6ba473b6b4c07b12.js create mode 100644 docs/647.f98f01d9b6ad4c05.js rename docs/{726.d688e74f08d3451b.js.map => 647.f98f01d9b6ad4c05.js.map} (99%) delete mode 100644 docs/665.b62c24ed8ec594bf.js delete mode 100644 docs/665.b62c24ed8ec594bf.js.map create mode 100644 docs/680.52fd2861264b5cb7.js rename docs/{765.d54816cb7021354f.js.map => 680.52fd2861264b5cb7.js.map} (58%) delete mode 100644 docs/680.7cef058bf72a659f.js delete mode 100644 docs/680.7cef058bf72a659f.js.map delete mode 100644 docs/7.26ceec994b6894fa.js delete mode 100644 docs/7.26ceec994b6894fa.js.map delete mode 100644 docs/717.92b025f5f9cba505.js delete mode 100644 docs/717.92b025f5f9cba505.js.map rename docs/{897.d28d5cc28efaa79d.js => 717.a696fd693dce2cca.js} (93%) rename docs/{897.d28d5cc28efaa79d.js.map => 717.a696fd693dce2cca.js.map} (99%) delete mode 100644 docs/726.d688e74f08d3451b.js delete mode 100644 docs/727.68369a4ece2d6e5d.js delete mode 100644 docs/728.960e13d793eca2ea.js delete mode 100644 docs/765.d54816cb7021354f.js create mode 100644 docs/832.c41e44530d6fa14d.js rename docs/{969.4da6fba206d57e9b.js.map => 832.c41e44530d6fa14d.js.map} (99%) rename docs/{696.b99abdfe255d4b8c.js => 946.e9493c0284811601.js} (93%) rename docs/{696.b99abdfe255d4b8c.js.map => 946.e9493c0284811601.js.map} (99%) delete mode 100644 docs/969.4da6fba206d57e9b.js create mode 100644 docs/99.0ba42481a501907f.js create mode 100644 docs/99.0ba42481a501907f.js.map create mode 100644 docs/common.81bdd95ae5536501.js rename docs/{common.d6e94f63af501d82.js.map => common.81bdd95ae5536501.js.map} (99%) delete mode 100644 docs/common.d6e94f63af501d82.js rename docs/{main.a4812090c19aaee9.js => main.46d6821a25958691.js} (56%) rename docs/{main.a4812090c19aaee9.js.map => main.46d6821a25958691.js.map} (66%) rename docs/{polyfills.c26652385dcd7157.js => polyfills.81a20ea3e5675c2f.js} (99%) rename docs/{polyfills.c26652385dcd7157.js.map => polyfills.81a20ea3e5675c2f.js.map} (99%) delete mode 100644 docs/runtime.a0c3fb6fad382d15.js delete mode 100644 docs/runtime.a0c3fb6fad382d15.js.map create mode 100644 docs/runtime.b3dbed27e02e15e9.js create mode 100644 docs/runtime.b3dbed27e02e15e9.js.map diff --git a/CHANGELOG.md b/CHANGELOG.md index d272a69d6..3aca1285e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.14.0](https://github.com/HSF/phoenix/compare/v2.13.0...v2.14.0) (2023-03-22) + +**Note:** Version bump only for package root + + + + + # [2.13.0](https://github.com/HSF/phoenix/compare/v2.12.0...v2.13.0) (2023-03-02) diff --git a/docs/137.cced59b964dda1c3.js b/docs/137.cced59b964dda1c3.js new file mode 100644 index 000000000..0d6ab9fac --- /dev/null +++ b/docs/137.cced59b964dda1c3.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[137],{8137:(p,o,r)=>{r.r(o),r.d(o,{TGraphTimePainter:()=>a});var h=r(4788),_=r(9542),m=r(3675),f=r(6458),l=r(9670),u=r(7825);class a extends f.tK{redraw(){void 0===this.step&&this.startDrawing()}decodeOptions(e){let t=new m.pc(e||"REPEAT");this.options||(this.options={}),Object.assign(this.options,{once:t.check("ONCE"),repeat:t.check("REPEAT"),first:t.check("FIRST")}),this.storeDrawOpt(e)}drawPrimitives(e){var t=this;return(0,h.Z)(function*(){e||(e=0,t._doing_primitives=!0);let i=t.getObject()?.fSteps.arr[t.step];if(i&&!(e>=i.arr.length))return(0,u.ii)(t.getDom(),i.arr[e],i.opt[e]).then(s=>(s&&(s.$grtimeid=t.selfid,s.$grstep=t.step),t.drawPrimitives(e+1)));delete t._doing_primitives})()}continueDrawing(){if(!this.options)return;let e=this.getObject();if(this.options.first)delete this.step;else if(this.wait_animation_frame){delete this.wait_animation_frame;let t=this.getPadPainter();if(!t)return void delete this.step;this.drawPrimitives().then(()=>{t.cleanPrimitives(i=>i.$grtimeid===this.selfid&&i.$grstep!==this.step),this.continueDrawing()})}else if(this.running_timeout)clearTimeout(this.running_timeout),delete this.running_timeout,this.wait_animation_frame=!0,requestAnimationFrame(()=>this.continueDrawing());else{let t=Math.max(e.fSleepTime,10);if(++this.step>e.fSteps.arr.length){if(!this.options.repeat)return void delete this.step;this.step=0,t=Math.max(5e3,5*t)}this.running_timeout=setTimeout(()=>this.continueDrawing(),t)}}startDrawing(){return this.step=0,this.drawPrimitives().then(()=>(this.continueDrawing(),this))}static draw(e,t,i){return(0,h.Z)(function*(){if(!t.fFrame)return console.error("Frame histogram not exists"),null;let s=new a(e,t);if(s.getMainPainter())return console.error("Cannot draw graph time on top of other histograms"),null;if(s.decodeOptions(i),!t.fFrame.fTitle&&t.fTitle){let n=t.fTitle.split(";");t.fFrame.fTitle=n[0],n[1]&&(t.fFrame.fXaxis.fTitle=n[1]),n[2]&&(t.fFrame.fYaxis.fTitle=n[2])}return s.selfid="grtime_"+_.internals.id_counter++,l.f.draw(e,t.fFrame,"AXIS").then(()=>(s.addToPadPrimitives(),s.startDrawing()))})()}}}}]); +//# sourceMappingURL=137.cced59b964dda1c3.js.map \ No newline at end of file diff --git a/docs/299.262c7f127dcdf2a1.js.map b/docs/137.cced59b964dda1c3.js.map similarity index 99% rename from docs/299.262c7f127dcdf2a1.js.map rename to docs/137.cced59b964dda1c3.js.map index 3c20a8d9d..1f2be1d32 100644 --- a/docs/299.262c7f127dcdf2a1.js.map +++ b/docs/137.cced59b964dda1c3.js.map @@ -1 +1 @@ -{"version":3,"file":"299.262c7f127dcdf2a1.js","mappings":"gNAaA,MAAMA,UAA0BC,KAG7BC,cACqBC,IAAdC,KAAKC,MAAoBD,KAAKE,cACrC,CAGAC,cAAcC,GAEX,IAAIC,EAAI,IAAIC,KAAYF,GAAO,UAE1BJ,KAAKO,UAASP,KAAKO,QAAU,CAAC,GAEnCC,OAAOC,OAAOT,KAAKO,QAAS,CACxBG,KAAML,EAAEM,MAAM,QACdC,OAAQP,EAAEM,MAAM,UAChBE,MAAOR,EAAEM,MAAM,WAGnBX,KAAKc,aAAaV,EACrB,CAGMW,eAAeC,GAAM,qCAEnBA,IACFA,EAAO,EACPC,EAAKC,mBAAoB,GAG5B,IAAIC,EAAMF,EAAKG,aAAaC,OAAOC,IAAIL,EAAKhB,MAE5C,GAAKkB,KAAQH,GAAQG,EAAIG,IAAIC,QAK7B,SAAOC,MAAKP,EAAKQ,SAAUN,EAAIG,IAAIN,GAAOG,EAAIf,IAAIY,IAAOU,KAAKC,IAEvDA,IACDA,EAAEC,UAAYX,EAAKY,OACnBF,EAAEG,QAAUb,EAAKhB,MAEbgB,EAAKF,eAAeC,EAAK,YAVzBC,EAAKC,iBAYZ,EAtBqB,EAuB3B,CAGAa,kBACG,IAAK/B,KAAKO,QAAS,OAEnB,IAAIyB,EAAKhC,KAAKoB,YAEd,GAAIpB,KAAKO,QAAQM,aAEPb,KAAKC,UAIf,GAAID,KAAKiC,qBAAsB,QACrBjC,KAAKiC,qBAGZ,IAAIC,EAAKlC,KAAKmC,gBACd,IAAKD,EAGF,mBADOlC,KAAKC,KAKfD,KAAKe,iBAAiBW,KAAK,KAExBQ,EAAGE,gBAAgBT,GAAeA,EAAEC,YAAc5B,KAAK6B,QAAYF,EAAEG,UAAY9B,KAAKC,MAEtFD,KAAK+B,iBAAe,EAE1B,SAAW/B,KAAKqC,gBACbC,aAAatC,KAAKqC,wBACXrC,KAAKqC,gBAEZrC,KAAKiC,sBAAuB,EAE5BM,sBAAsB,IAAMvC,KAAK+B,uBAC7B,CAEJ,IAAIS,EAAYC,KAAKC,IAAIV,EAAGW,WAAY,IAExC,KAAM3C,KAAKC,KAAO+B,EAAGX,OAAOC,IAAIC,OAC7B,KAAIvB,KAAKO,QAAQK,OAKd,mBADOZ,KAAKC,KAHZD,KAAKC,KAAO,EACZuC,EAAYC,KAAKC,IAAI,IAAM,EAAEF,EAIhC,CAGHxC,KAAKqC,gBAAkBO,WAAW,IAAM5C,KAAK+B,kBAAmBS,EACnE,CACH,CAGAtC,eACG,YAAKD,KAAO,EAELD,KAAKe,iBAAiBW,KAAK,KAC/B1B,KAAK+B,kBACE/B,MAEb,CAGA6C,YAAkBC,EAAKd,EAAI5B,GAAK,0BAC7B,IAAK4B,EAAGe,OACNC,eAAQC,MAAM,8BACP,KAGT,IAAIC,EAAU,IAAItD,EAAkBkD,EAAKd,GAEzC,GAAIkB,EAAQC,iBACTH,eAAQC,MAAM,qDACP,KAKV,GAFAC,EAAQ/C,cAAcC,IAEjB4B,EAAGe,OAAOK,QAAUpB,EAAGoB,OAAQ,CACjC,IAAI9B,EAAMU,EAAGoB,OAAOC,MAAM,KAC1BrB,EAAGe,OAAOK,OAAS9B,EAAI,GACnBA,EAAI,KAAIU,EAAGe,OAAOO,OAAOF,OAAS9B,EAAI,IACtCA,EAAI,KAAIU,EAAGe,OAAOQ,OAAOH,OAAS9B,EAAI,GAC7C,CAEA4B,SAAQrB,OAAS,UAAY2B,yBAEtBC,SAAgBX,EAAKd,EAAGe,OAAQ,QAAQrB,KAAK,KACjDwB,EAAQQ,qBACDR,EAAQhD,gBACf,EA3B0B,EA4BhC","names":["TGraphTimePainter","ObjectPainter","redraw","undefined","this","step","startDrawing","decodeOptions","opt","d","DrawOptions","options","Object","assign","once","check","repeat","first","storeDrawOpt","drawPrimitives","indx","_this","_doing_primitives","lst","getObject","fSteps","arr","length","draw","getDom","then","p","$grtimeid","selfid","$grstep","continueDrawing","gr","wait_animation_frame","pp","getPadPainter","cleanPrimitives","running_timeout","clearTimeout","requestAnimationFrame","sleeptime","Math","max","fSleepTime","setTimeout","static","dom","fFrame","console","error","painter","getMainPainter","fTitle","split","fXaxis","fYaxis","internals","TH1Painter","addToPadPrimitives"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/hist/TGraphTimePainter.mjs"],"sourcesContent":["import { internals } from '../core.mjs';\nimport { DrawOptions } from '../base/BasePainter.mjs';\nimport { ObjectPainter } from '../base/ObjectPainter.mjs';\nimport { TH1Painter } from '../hist2d/TH1Painter.mjs';\nimport { draw } from '../draw.mjs';\n\n\n/**\n * @summary Painter for TGraphTime object\n *\n * @private\n */\n\nclass TGraphTimePainter extends ObjectPainter {\n\n /** @summary Redraw object */\n redraw() {\n if (this.step === undefined) this.startDrawing();\n }\n\n /** @summary Decode drawing options */\n decodeOptions(opt) {\n\n let d = new DrawOptions(opt || 'REPEAT');\n\n if (!this.options) this.options = {};\n\n Object.assign(this.options, {\n once: d.check('ONCE'),\n repeat: d.check('REPEAT'),\n first: d.check('FIRST')\n });\n\n this.storeDrawOpt(opt);\n }\n\n /** @summary Draw primitives */\n async drawPrimitives(indx) {\n\n if (!indx) {\n indx = 0;\n this._doing_primitives = true;\n }\n\n let lst = this.getObject()?.fSteps.arr[this.step];\n\n if (!lst || (indx >= lst.arr.length)) {\n delete this._doing_primitives;\n return;\n }\n\n return draw(this.getDom(), lst.arr[indx], lst.opt[indx]).then(p => {\n\n if (p) {\n p.$grtimeid = this.selfid; // indicator that painter created by ourself\n p.$grstep = this.step; // remember step\n }\n return this.drawPrimitives(indx+1);\n\n });\n }\n\n /** @summary Continue drawing */\n continueDrawing() {\n if (!this.options) return;\n\n let gr = this.getObject();\n\n if (this.options.first) {\n // draw only single frame, cancel all others\n delete this.step;\n return;\n }\n\n if (this.wait_animation_frame) {\n delete this.wait_animation_frame;\n\n // clear pad\n let pp = this.getPadPainter();\n if (!pp) {\n // most probably, pad is cleared\n delete this.step;\n return;\n }\n\n // draw ptrimitives again\n this.drawPrimitives().then(() => {\n // clear primitives produced by previous drawing to avoid flicking\n pp.cleanPrimitives(p => { return (p.$grtimeid === this.selfid) && (p.$grstep !== this.step); });\n\n this.continueDrawing();\n });\n } else if (this.running_timeout) {\n clearTimeout(this.running_timeout);\n delete this.running_timeout;\n\n this.wait_animation_frame = true;\n // use animation frame to disable update in inactive form\n requestAnimationFrame(() => this.continueDrawing());\n } else {\n\n let sleeptime = Math.max(gr.fSleepTime, 10);\n\n if (++this.step > gr.fSteps.arr.length) {\n if (this.options.repeat) {\n this.step = 0; // start again\n sleeptime = Math.max(5000, 5*sleeptime); // increase sleep time\n } else {\n delete this.step; // clear indicator that animation running\n return;\n }\n }\n\n this.running_timeout = setTimeout(() => this.continueDrawing(), sleeptime);\n }\n }\n\n /** @ummary Start drawing of graph time */\n startDrawing() {\n this.step = 0;\n\n return this.drawPrimitives().then(() => {\n this.continueDrawing();\n return this;\n });\n }\n\n /** @summary Draw TGraphTime object */\n static async draw(dom, gr, opt) {\n if (!gr.fFrame) {\n console.error('Frame histogram not exists');\n return null;\n }\n\n let painter = new TGraphTimePainter(dom, gr);\n\n if (painter.getMainPainter()) {\n console.error('Cannot draw graph time on top of other histograms');\n return null;\n }\n\n painter.decodeOptions(opt);\n\n if (!gr.fFrame.fTitle && gr.fTitle) {\n let arr = gr.fTitle.split(\";\");\n gr.fFrame.fTitle = arr[0];\n if (arr[1]) gr.fFrame.fXaxis.fTitle = arr[1];\n if (arr[2]) gr.fFrame.fYaxis.fTitle = arr[2];\n }\n\n painter.selfid = 'grtime_' + internals.id_counter++; // use to identify primitives which should be clean\n\n return TH1Painter.draw(dom, gr.fFrame, 'AXIS').then(() => {\n painter.addToPadPrimitives();\n return painter.startDrawing();\n });\n }\n\n} // class TGraphTimePainter\n\nexport { TGraphTimePainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file +{"version":3,"file":"137.cced59b964dda1c3.js","mappings":"iNAaA,MAAMA,UAA0BC,KAG7BC,cACqBC,IAAdC,KAAKC,MAAoBD,KAAKE,cACrC,CAGAC,cAAcC,GAEX,IAAIC,EAAI,IAAIC,KAAYF,GAAO,UAE1BJ,KAAKO,UAASP,KAAKO,QAAU,CAAC,GAEnCC,OAAOC,OAAOT,KAAKO,QAAS,CACxBG,KAAML,EAAEM,MAAM,QACdC,OAAQP,EAAEM,MAAM,UAChBE,MAAOR,EAAEM,MAAM,WAGnBX,KAAKc,aAAaV,EACrB,CAGMW,eAAeC,GAAM,qCAEnBA,IACFA,EAAO,EACPC,EAAKC,mBAAoB,GAG5B,IAAIC,EAAMF,EAAKG,aAAaC,OAAOC,IAAIL,EAAKhB,MAE5C,GAAKkB,KAAQH,GAAQG,EAAIG,IAAIC,QAK7B,SAAOC,MAAKP,EAAKQ,SAAUN,EAAIG,IAAIN,GAAOG,EAAIf,IAAIY,IAAOU,KAAKC,IAEvDA,IACDA,EAAEC,UAAYX,EAAKY,OACnBF,EAAEG,QAAUb,EAAKhB,MAEbgB,EAAKF,eAAeC,EAAK,YAVzBC,EAAKC,iBAYZ,EAtBqB,EAuB3B,CAGAa,kBACG,IAAK/B,KAAKO,QAAS,OAEnB,IAAIyB,EAAKhC,KAAKoB,YAEd,GAAIpB,KAAKO,QAAQM,aAEPb,KAAKC,UAIf,GAAID,KAAKiC,qBAAsB,QACrBjC,KAAKiC,qBAGZ,IAAIC,EAAKlC,KAAKmC,gBACd,IAAKD,EAGF,mBADOlC,KAAKC,KAKfD,KAAKe,iBAAiBW,KAAK,KAExBQ,EAAGE,gBAAgBT,GAAeA,EAAEC,YAAc5B,KAAK6B,QAAYF,EAAEG,UAAY9B,KAAKC,MAEtFD,KAAK+B,iBAAe,EAE1B,SAAW/B,KAAKqC,gBACbC,aAAatC,KAAKqC,wBACXrC,KAAKqC,gBAEZrC,KAAKiC,sBAAuB,EAE5BM,sBAAsB,IAAMvC,KAAK+B,uBAC7B,CAEJ,IAAIS,EAAYC,KAAKC,IAAIV,EAAGW,WAAY,IAExC,KAAM3C,KAAKC,KAAO+B,EAAGX,OAAOC,IAAIC,OAC7B,KAAIvB,KAAKO,QAAQK,OAKd,mBADOZ,KAAKC,KAHZD,KAAKC,KAAO,EACZuC,EAAYC,KAAKC,IAAI,IAAM,EAAEF,EAIhC,CAGHxC,KAAKqC,gBAAkBO,WAAW,IAAM5C,KAAK+B,kBAAmBS,EACnE,CACH,CAGAtC,eACG,YAAKD,KAAO,EAELD,KAAKe,iBAAiBW,KAAK,KAC/B1B,KAAK+B,kBACE/B,MAEb,CAGA6C,YAAkBC,EAAKd,EAAI5B,GAAK,0BAC7B,IAAK4B,EAAGe,OACNC,eAAQC,MAAM,8BACP,KAGT,IAAIC,EAAU,IAAItD,EAAkBkD,EAAKd,GAEzC,GAAIkB,EAAQC,iBACTH,eAAQC,MAAM,qDACP,KAKV,GAFAC,EAAQ/C,cAAcC,IAEjB4B,EAAGe,OAAOK,QAAUpB,EAAGoB,OAAQ,CACjC,IAAI9B,EAAMU,EAAGoB,OAAOC,MAAM,KAC1BrB,EAAGe,OAAOK,OAAS9B,EAAI,GACnBA,EAAI,KAAIU,EAAGe,OAAOO,OAAOF,OAAS9B,EAAI,IACtCA,EAAI,KAAIU,EAAGe,OAAOQ,OAAOH,OAAS9B,EAAI,GAC7C,CAEA4B,SAAQrB,OAAS,UAAY2B,yBAEtBC,SAAgBX,EAAKd,EAAGe,OAAQ,QAAQrB,KAAK,KACjDwB,EAAQQ,qBACDR,EAAQhD,gBACf,EA3B0B,EA4BhC","names":["TGraphTimePainter","ObjectPainter","redraw","undefined","this","step","startDrawing","decodeOptions","opt","d","DrawOptions","options","Object","assign","once","check","repeat","first","storeDrawOpt","drawPrimitives","indx","_this","_doing_primitives","lst","getObject","fSteps","arr","length","draw","getDom","then","p","$grtimeid","selfid","$grstep","continueDrawing","gr","wait_animation_frame","pp","getPadPainter","cleanPrimitives","running_timeout","clearTimeout","requestAnimationFrame","sleeptime","Math","max","fSleepTime","setTimeout","static","dom","fFrame","console","error","painter","getMainPainter","fTitle","split","fXaxis","fYaxis","internals","TH1Painter","addToPadPrimitives"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/hist/TGraphTimePainter.mjs"],"sourcesContent":["import { internals } from '../core.mjs';\nimport { DrawOptions } from '../base/BasePainter.mjs';\nimport { ObjectPainter } from '../base/ObjectPainter.mjs';\nimport { TH1Painter } from '../hist2d/TH1Painter.mjs';\nimport { draw } from '../draw.mjs';\n\n\n/**\n * @summary Painter for TGraphTime object\n *\n * @private\n */\n\nclass TGraphTimePainter extends ObjectPainter {\n\n /** @summary Redraw object */\n redraw() {\n if (this.step === undefined) this.startDrawing();\n }\n\n /** @summary Decode drawing options */\n decodeOptions(opt) {\n\n let d = new DrawOptions(opt || 'REPEAT');\n\n if (!this.options) this.options = {};\n\n Object.assign(this.options, {\n once: d.check('ONCE'),\n repeat: d.check('REPEAT'),\n first: d.check('FIRST')\n });\n\n this.storeDrawOpt(opt);\n }\n\n /** @summary Draw primitives */\n async drawPrimitives(indx) {\n\n if (!indx) {\n indx = 0;\n this._doing_primitives = true;\n }\n\n let lst = this.getObject()?.fSteps.arr[this.step];\n\n if (!lst || (indx >= lst.arr.length)) {\n delete this._doing_primitives;\n return;\n }\n\n return draw(this.getDom(), lst.arr[indx], lst.opt[indx]).then(p => {\n\n if (p) {\n p.$grtimeid = this.selfid; // indicator that painter created by ourself\n p.$grstep = this.step; // remember step\n }\n return this.drawPrimitives(indx+1);\n\n });\n }\n\n /** @summary Continue drawing */\n continueDrawing() {\n if (!this.options) return;\n\n let gr = this.getObject();\n\n if (this.options.first) {\n // draw only single frame, cancel all others\n delete this.step;\n return;\n }\n\n if (this.wait_animation_frame) {\n delete this.wait_animation_frame;\n\n // clear pad\n let pp = this.getPadPainter();\n if (!pp) {\n // most probably, pad is cleared\n delete this.step;\n return;\n }\n\n // draw ptrimitives again\n this.drawPrimitives().then(() => {\n // clear primitives produced by previous drawing to avoid flicking\n pp.cleanPrimitives(p => { return (p.$grtimeid === this.selfid) && (p.$grstep !== this.step); });\n\n this.continueDrawing();\n });\n } else if (this.running_timeout) {\n clearTimeout(this.running_timeout);\n delete this.running_timeout;\n\n this.wait_animation_frame = true;\n // use animation frame to disable update in inactive form\n requestAnimationFrame(() => this.continueDrawing());\n } else {\n\n let sleeptime = Math.max(gr.fSleepTime, 10);\n\n if (++this.step > gr.fSteps.arr.length) {\n if (this.options.repeat) {\n this.step = 0; // start again\n sleeptime = Math.max(5000, 5*sleeptime); // increase sleep time\n } else {\n delete this.step; // clear indicator that animation running\n return;\n }\n }\n\n this.running_timeout = setTimeout(() => this.continueDrawing(), sleeptime);\n }\n }\n\n /** @ummary Start drawing of graph time */\n startDrawing() {\n this.step = 0;\n\n return this.drawPrimitives().then(() => {\n this.continueDrawing();\n return this;\n });\n }\n\n /** @summary Draw TGraphTime object */\n static async draw(dom, gr, opt) {\n if (!gr.fFrame) {\n console.error('Frame histogram not exists');\n return null;\n }\n\n let painter = new TGraphTimePainter(dom, gr);\n\n if (painter.getMainPainter()) {\n console.error('Cannot draw graph time on top of other histograms');\n return null;\n }\n\n painter.decodeOptions(opt);\n\n if (!gr.fFrame.fTitle && gr.fTitle) {\n let arr = gr.fTitle.split(\";\");\n gr.fFrame.fTitle = arr[0];\n if (arr[1]) gr.fFrame.fXaxis.fTitle = arr[1];\n if (arr[2]) gr.fFrame.fYaxis.fTitle = arr[2];\n }\n\n painter.selfid = 'grtime_' + internals.id_counter++; // use to identify primitives which should be clean\n\n return TH1Painter.draw(dom, gr.fFrame, 'AXIS').then(() => {\n painter.addToPadPrimitives();\n return painter.startDrawing();\n });\n }\n\n} // class TGraphTimePainter\n\nexport { TGraphTimePainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file diff --git a/docs/15.4def682f3a97b1e2.js b/docs/15.4def682f3a97b1e2.js new file mode 100644 index 000000000..4dae3a07e --- /dev/null +++ b/docs/15.4def682f3a97b1e2.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[15],{15:(w,P,g)=>{g.r(P),g.d(P,{TWebPaintingPainter:()=>b});var O=g(4788),M=g(3038),S=g(6458);class b extends S.tK{updateObject(e){return!!this.matchObjectType(e)&&(this.assignObject(e),!0)}redraw(){var e=this;return(0,O.Z)(function*(){const r=e.getObject(),n=e.getAxisToSvgFunc();if(!r?.fOper||!n)return;let h,T,a,l=0,i={},p=null,m="none",_="",o=r.fOper.split(";");const c=t=>{if(t!=m&&(p&&(p.attr("d",_),_="",p=null,m="none"),t))switch(m=t,p=e.draw_g.append("svg:path"),t){case"f":p.call(e.fillatt.func);break;case"l":p.call(e.lineatt.func).style("fill","none");break;case"m":p.call(e.markeratt.func)}},y=(t,x)=>{let f=0,s={_typename:"any"};for(let u=0;uf?d:void 0)),f=d}return s},B=t=>{for(;++t0?"L":"M")+n.x(r.fBuf[l++])+","+n.y(r.fBuf[l++]);"f"==h&&(_+="Z");continue;case"m":for(c(h),T=parseInt(o[t].slice(1)),e.markeratt.resetPos(),a=0;a1?i.fTextSize:e.getPadPainter().getPadHeight()*i.fTextSize,f=i.fTextAngle,s=o[t].slice(1),u=e.draw_g.append("svg:g");if(f>=360&&(f-=360*Math.floor(f/360)),e.startTextDrawing(i.fTextFont,x,u),"h"==h){let d="";for(a=0;aB(t))}continue;default:console.log(`unsupported operation ${h}`)}return Promise.resolve(!0)};return e.createG(),B(-1).then(()=>(c(),e))})()}static draw(e,r){return(0,O.Z)(function*(){let n=new b(e,r);return n.addToPadPrimitives(),n.redraw()})()}}}}]); +//# sourceMappingURL=15.4def682f3a97b1e2.js.map \ No newline at end of file diff --git a/docs/15.4def682f3a97b1e2.js.map b/docs/15.4def682f3a97b1e2.js.map new file mode 100644 index 000000000..39134022a --- /dev/null +++ b/docs/15.4def682f3a97b1e2.js.map @@ -0,0 +1 @@ +{"version":3,"file":"15.4def682f3a97b1e2.js","mappings":"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","names":["TWebPaintingPainter","ObjectPainter","updateObject","obj","this","matchObjectType","assignObject","redraw","_this","getObject","func","getAxisToSvgFunc","fOper","oper","npoints","n","indx","attr","lastpath","lastkind","d","arr","split","check_attributes","kind","draw_g","append","call","fillatt","lineatt","style","markeratt","read_attr","str","names","lastp","_typename","k","length","p","indexOf","parseInt","slice","undefined","process","createAttLine","force","createAttFill","createAttMarker","fTextSize","x1","x","fBuf","y1","y","x2","y2","resetPos","create","height","getPadPainter","getPadHeight","angle","fTextAngle","txt","group","Math","floor","startTextDrawing","fTextFont","res","String","fromCharCode","drawText","align","fTextAlign","rotate","text","color","getColor","fTextColor","latex","finishTextDrawing","then","console","log","Promise","resolve","createG","static","dom","painter","addToPadPrimitives"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/draw/TWebPaintingPainter.mjs"],"sourcesContent":["import { getColor } from '../base/colors.mjs';\nimport { ObjectPainter } from '../base/ObjectPainter.mjs';\n\n\n/** @summary Draw direct TVirtualX commands into SVG\n * @private */\n\nclass TWebPaintingPainter extends ObjectPainter {\n\n /** @summary Update TWebPainting object */\n updateObject(obj) {\n if (!this.matchObjectType(obj)) return false;\n this.assignObject(obj);\n return true;\n }\n\n /** @summary draw TWebPainting object */\n async redraw() {\n\n const obj = this.getObject(), func = this.getAxisToSvgFunc();\n\n if (!obj?.fOper || !func) return;\n\n let indx = 0, attr = {}, lastpath = null, lastkind = 'none', d = '',\n oper, npoints, n, arr = obj.fOper.split(';');\n\n const check_attributes = kind => {\n if (kind == lastkind) return;\n\n if (lastpath) {\n lastpath.attr('d', d); // flush previous\n d = ''; lastpath = null; lastkind = 'none';\n }\n\n if (!kind) return;\n\n lastkind = kind;\n lastpath = this.draw_g.append('svg:path');\n switch (kind) {\n case 'f': lastpath.call(this.fillatt.func); break;\n case 'l': lastpath.call(this.lineatt.func).style('fill', 'none'); break;\n case 'm': lastpath.call(this.markeratt.func); break;\n }\n }, read_attr = (str, names) => {\n let lastp = 0, obj = { _typename: 'any' };\n for (let k = 0; k < names.length; ++k) {\n let p = str.indexOf(':', lastp+1);\n obj[names[k]] = parseInt(str.slice(lastp+1, (p > lastp) ? p : undefined));\n lastp = p;\n }\n return obj;\n }, process = k => {\n while (++k < arr.length) {\n oper = arr[k][0];\n switch (oper) {\n case 'z':\n this.createAttLine({ attr: read_attr(arr[k], ['fLineColor', 'fLineStyle', 'fLineWidth']), force: true });\n check_attributes();\n continue;\n case 'y':\n this.createAttFill({ attr: read_attr(arr[k], ['fFillColor', 'fFillStyle']), force: true });\n check_attributes();\n continue;\n case 'x':\n this.createAttMarker({ attr: read_attr(arr[k], ['fMarkerColor', 'fMarkerStyle', 'fMarkerSize']), force: true });\n check_attributes();\n continue;\n case 'o':\n attr = read_attr(arr[k], ['fTextColor', 'fTextFont', 'fTextSize', 'fTextAlign', 'fTextAngle']);\n if (attr.fTextSize < 0) attr.fTextSize *= -0.001;\n check_attributes();\n continue;\n case 'r':\n case 'b': {\n\n check_attributes((oper == 'b') ? 'f' : 'l');\n\n let x1 = func.x(obj.fBuf[indx++]),\n y1 = func.y(obj.fBuf[indx++]),\n x2 = func.x(obj.fBuf[indx++]),\n y2 = func.y(obj.fBuf[indx++]);\n\n d += `M${x1},${y1}h${x2-x1}v${y2-y1}h${x1-x2}z`;\n\n continue;\n }\n case 'l':\n case 'f': {\n\n check_attributes(oper);\n\n npoints = parseInt(arr[k].slice(1));\n\n for (n = 0; n < npoints; ++n)\n d += ((n > 0) ? 'L' : 'M') +\n func.x(obj.fBuf[indx++]) + ',' + func.y(obj.fBuf[indx++]);\n\n if (oper == 'f') d+='Z';\n\n continue;\n }\n\n case 'm': {\n\n check_attributes(oper);\n\n npoints = parseInt(arr[k].slice(1));\n\n this.markeratt.resetPos();\n for (n = 0; n < npoints; ++n)\n d += this.markeratt.create(func.x(obj.fBuf[indx++]), func.y(obj.fBuf[indx++]));\n\n continue;\n }\n\n case 'h':\n case 't': {\n if (attr.fTextSize) {\n\n check_attributes();\n\n let height = (attr.fTextSize > 1) ? attr.fTextSize : this.getPadPainter().getPadHeight() * attr.fTextSize,\n angle = attr.fTextAngle,\n txt = arr[k].slice(1),\n group = this.draw_g.append('svg:g');\n\n if (angle >= 360) angle -= Math.floor(angle/360) * 360;\n\n this.startTextDrawing(attr.fTextFont, height, group);\n\n if (oper == 'h') {\n let res = '';\n for (n = 0; n < txt.length; n += 2)\n res += String.fromCharCode(parseInt(txt.slice(n,n+2), 16));\n txt = res;\n }\n\n // todo - correct support of angle\n this.drawText({ align: attr.fTextAlign,\n x: func.x(obj.fBuf[indx++]),\n y: func.y(obj.fBuf[indx++]),\n rotate: -angle,\n text: txt,\n color: getColor(attr.fTextColor),\n latex: 0, draw_g: group });\n\n return this.finishTextDrawing(group).then(() => process(k));\n }\n continue;\n }\n\n default:\n console.log(`unsupported operation ${oper}`);\n }\n };\n\n return Promise.resolve(true);\n }\n\n this.createG();\n\n return process(-1).then(() => { check_attributes(); return this; });\n }\n\n static async draw(dom, obj) {\n let painter = new TWebPaintingPainter(dom, obj);\n painter.addToPadPrimitives();\n return painter.redraw();\n }\n\n} // class TWebPaintingPainter\n\nexport { TWebPaintingPainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file diff --git a/docs/597.e38b886840b2b804.js b/docs/172.e4469fbbca37f633.js similarity index 98% rename from docs/597.e38b886840b2b804.js rename to docs/172.e4469fbbca37f633.js index b8b990d71..eff1aedf4 100644 --- a/docs/597.e38b886840b2b804.js +++ b/docs/172.e4469fbbca37f633.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[597],{8597:(A,_,c)=>{c.d(_,{n:()=>z});var y=c(5368),u=c(1773),b=c(6528);function d(f){"ROOT::Experimental::RAxisEquidistant"==f._typename||"ROOT::Experimental::RAxisLabels"==f._typename?(0===f.fInvBinWidth&&(f.$dummy=!0,f.fInvBinWidth=1,f.fNBinsNoOver=0,f.fLow=0),f.min=f.fLow,f.max=f.fLow+f.fNBinsNoOver/f.fInvBinWidth,f.GetNumBins=function(){return this.fNBinsNoOver},f.GetBinCoord=function(i){return this.fLow+i/this.fInvBinWidth},f.FindBin=function(i,e){return Math.floor((i-this.fLow)*this.fInvBinWidth+e)}):"ROOT::Experimental::RAxisIrregular"==f._typename&&(f.min=f.fBinBorders[0],f.max=f.fBinBorders[f.fBinBorders.length-1],f.GetNumBins=function(){return this.fBinBorders.length},f.GetBinCoord=function(i){let e=Math.round(i);if(e<=0)return this.fBinBorders[0];if(e>=this.fBinBorders.length)return this.fBinBorders[this.fBinBorders.length-1];if(e==i)return this.fBinBorders[e];let t=i1||t.stepy>1||t.stepz>1?function(s,o,r){return Math.floor((s-this.dx)/this.stepx)+this.nx/this.stepx*Math.floor((o-this.dy)/this.stepy)+this.nx/this.stepx*this.ny/this.stepy*Math.floor((r-this.dz)/this.stepz)}:function(s,o,r){return s-this.dx+this.nx*(o-this.dy)+this.nx*this.ny*(r-dz)},t.getBinContent=function(s,o,r){return this.fBinContent[this.getBin0(s,o,r)]},t.getBinError=function(s,o,r){return Math.sqrt(Math.abs(this.getBinContent(s,o,r)))}):2==t.fAxes.length?(d(t.fAxes[0]),d(t.fAxes[1]),t.nx=t.fIndicies[1]-t.fIndicies[0],t.dx=t.fIndicies[0]+1,t.stepx=t.fIndicies[2],t.ny=t.fIndicies[4]-t.fIndicies[3],t.dy=t.fIndicies[3]+1,t.stepy=t.fIndicies[5],t.getBin=function(s,o){return s-1+this.fAxes[0].GetNumBins()*(o-1)},t.getBin0=t.stepx>1||t.stepy>1?function(s,o){return Math.floor((s-this.dx)/this.stepx)+this.nx/this.stepx*Math.floor((o-this.dy)/this.stepy)}:function(s,o){return s-this.dx+this.nx*(o-this.dy)},t.getBinContent=function(s,o){return this.fBinContent[this.getBin0(s,o)]},t.getBinError=function(s,o){return Math.sqrt(Math.abs(this.getBinContent(s,o)))}):(d(t.fAxes[0]),t.nx=t.fIndicies[1]-t.fIndicies[0],t.dx=t.fIndicies[0]+1,t.stepx=t.fIndicies[2],t.getBin=function(s){return s-1},t.getBin0=t.stepx>1?function(s){return Math.floor((s-this.dx)/this.stepx)}:function(s){return s-this.dx},t.getBinContent=function(s){return this.fBinContent[this.getBin0(s)]},t.getBinError=function(s){return Math.sqrt(Math.abs(this.getBinContent(s)))}))):t.fAxes._2?(d(t.fAxes._0),d(t.fAxes._1),d(t.fAxes._2),t.getBin=function(s,o,r){return s-1+this.fAxes._0.GetNumBins()*(o-1)+this.fAxes._0.GetNumBins()*this.fAxes._1.GetNumBins()*(r-1)},t.getBinContent=function(s,o,r){return this.fStatistics.fBinContent[this.getBin(s,o,r)]},t.getBinError=function(s,o,r){let h=this.getBin(s,o,r);return this.fStatistics.fSumWeightsSquared?Math.sqrt(this.fStatistics.fSumWeightsSquared[h]):Math.sqrt(Math.abs(this.fStatistics.fBinContent[h]))}):t.fAxes._1?(d(t.fAxes._0),d(t.fAxes._1),t.getBin=function(s,o){return s-1+this.fAxes._0.GetNumBins()*(o-1)},t.getBinContent=function(s,o){return this.fStatistics.fBinContent[this.getBin(s,o)]},t.getBinError=function(s,o){let r=this.getBin(s,o);return this.fStatistics.fSumWeightsSquared?Math.sqrt(this.fStatistics.fSumWeightsSquared[r]):Math.sqrt(Math.abs(this.fStatistics.fBinContent[r]))}):(d(t.fAxes._0),t.getBin=function(s){return s-1},t.getBinContent=function(s){return this.fStatistics.fBinContent[s-1]},t.getBinError=function(s){return this.fStatistics.fSumWeightsSquared?Math.sqrt(this.fStatistics.fSumWeightsSquared[s-1]):Math.sqrt(Math.abs(this.fStatistics.fBinContent[s-1]))}),t}decodeOptions(){this.options||(this.options={Hist:1})}copyOptionsFrom(i){i!==this&&(this.options.Mode3D=i.options.Mode3D)}copyOptionsToOthers(){this.forEachPainter(i=>{i!==this&&(0,u.isFunc)(i.copyOptionsFrom)&&i.copyOptionsFrom(this)},"objects")}clear3DScene(){let i=this.getFramePainter();(0,u.isFunc)(i?.create3DScene)&&i.create3DScene(-1),this.mode3d=!1}cleanup(){this.clear3DScene(),delete this.options,super.cleanup()}getDimension(){return 1}scanContent(){}drawFrameAxes(){var i=this;return(0,y.Z)(function*(){let e=i.getFramePainter();return!!e&&(!i.draw_content||(i.isMainPainter()?(e.cleanupAxes(),e.xmin=e.xmax=0,e.ymin=e.ymax=0,e.zmin=e.zmax=0,e.setAxesRanges(i.getAxis("x"),i.xmin,i.xmax,i.getAxis("y"),i.ymin,i.ymax,i.getAxis("z"),i.zmin,i.zmax),e.drawAxes()):!i.options.second_x&&!i.options.second_y||(e.setAxes2Ranges(i.options.second_x,i.getAxis("x"),i.xmin,i.xmax,i.options.second_y,i.getAxis("y"),i.ymin,i.ymax),e.drawAxes2(i.options.second_x,i.options.second_y))))})()}createHistDrawAttributes(){this.createv7AttFill(),this.createv7AttLine()}updateDisplayItem(i,e){return!(!i||!e||(i.fAxes=e.fAxes,i.fIndicies=e.fIndicies,i.fBinContent=e.fBinContent,i.fContMin=e.fContMin,i.fContMinPos=e.fContMinPos,i.fContMax=e.fContMax,this.getHisto(!0),0))}updateObject(i){let e=this.getObject();if(i!==e){if(!this.matchObjectType(i))return!1;if(this.isDisplayItem())this.updateDisplayItem(e,i);else{let t=p(e),s=p(i);if(!t||!s)return!1;t.fStatistics=s.fStatistics,e.fTitle=i.fTitle}}return this.scanContent(),this.histogram_updated=!0,!0}getAxis(i){let e=this.getHisto(),t=this.getObject(),s=null;if(t&&t.fAxes)switch(i){case"x":default:s=t.fAxes[0];break;case"y":s=t.fAxes[1];break;case"z":s=t.fAxes[2]}else if(e&&e.fAxes)switch(i){case"x":default:s=e.fAxes._0;break;case"y":s=e.fAxes._1;break;case"z":s=e.fAxes._2}return s&&!s.GetBinCoord&&d(s),s}getAxisBinTip(i,e,t){let s=this.getFramePainter(),o=s[i+"_handle"],r=this.getAxis(i),h=r.GetBinCoord(e);if("labels"===o.kind)return s.axisAsText(i,h);let a=r.GetBinCoord(e+(t||1));return"time"===o.kind?s.axisAsText(i,(h+a)/2):"["+s.axisAsText(i,h)+", "+s.axisAsText(i,a)+")"}extractAxesProperties(i){if(!this.getHisto())return;this.nbinsx=this.nbinsy=this.nbinsz=0;let t=this.getAxis("x");this.nbinsx=t.GetNumBins(),this.xmin=t.min,this.xmax=t.max,!(i<2)&&(t=this.getAxis("y"),this.nbinsy=t.GetNumBins(),this.ymin=t.min,this.ymax=t.max,!(i<3)&&(t=this.getAxis("z"),this.nbinsz=t.GetNumBins(),this.zmin=t.min,this.zmax=t.max))}addInteractivity(){let i=this.isMainPainter(),e=this.options.second_x||this.options.second_y,t=i||e?this.getFramePainter():null;return!t||t.addInteractivity(!i&&e)}processItemReply(i,e){if(!this.isDisplayItem())return console.error("Get item when display normal histogram");e.reqid===this.current_item_reqid&&(null!==i&&this.updateDisplayItem(this.getObject(),i.item),e.resolveFunc(!0))}drawingBins(i){var e=this;return(0,y.Z)(function*(){let t=!1;return i&&(0,u.isStr)(i)&&0==i.indexOf("zoom")&&(i.indexOf("0")>0&&(t=!0),e.getDimension()>1&&i.indexOf("1")>0&&(t=!0),e.getDimension()>2&&i.indexOf("2")>0&&(t=!0)),!(e.isDisplayItem()&&t&&e.v7NormalMode()&&e.prepareDraw({only_indexes:!0}).incomplete)||new Promise(o=>{let r=e.v7SubmitRequest("",{_typename:"ROOT::Experimental::RHistDrawableBase::RRequest"},e.processItemReply.bind(e));r?(e.current_item_reqid=r.reqid,r.resolveFunc=o,setTimeout(e.processItemReply.bind(e,null,r),1e3)):o(!0)})})()}toggleStat(){}getSelectIndex(i,e,t){let s=0,o=this.getAxis(i),r=this["nbins"+i]||0;this.options.second_x&&"x"==i&&(i="x2"),this.options.second_y&&"y"==i&&(i="y2");let h=this.getFramePainter(),a=h?h["zoom_"+i+"min"]:0,g=h?h["zoom_"+i+"max"]:0;return a!==g&&o?(s="left"==e?o.FindBin(a,t||0):o.FindBin(g,(t||0)+.5),s<0?s=0:s>r&&(s=r)):s="left"==e?0:r,s}autoZoom(){}clickButton(i){switch(i){case"ToggleZoom":if(this.zoom_xmin!==this.zoom_xmax||this.zoom_ymin!==this.zoom_ymax||this.zoom_zmin!==this.zoom_zmax)return this.unzoom(),this.getFramePainter().zoomChangedInteractive("reset"),!0;if(this.draw_content)return this.autoZoom(),!0;break;case"ToggleLogX":this.getFramePainter().toggleAxisLog("x");break;case"ToggleLogY":this.getFramePainter().toggleAxisLog("y");break;case"ToggleLogZ":this.getFramePainter().toggleAxisLog("z");break;case"ToggleStatBox":return this.toggleStat(),!0}return!1}fillToolbar(i){let e=this.getPadPainter();e&&(e.addPadButton("auto_zoom","Toggle between unzoom and autozoom-in","ToggleZoom","Ctrl *"),e.addPadButton("arrow_right","Toggle log x","ToggleLogX","PageDown"),e.addPadButton("arrow_up","Toggle log y","ToggleLogY","PageUp"),this.getDimension()>1&&e.addPadButton("arrow_diag","Toggle log z","ToggleLogZ"),this.draw_content&&e.addPadButton("statbox","Toggle stat box","ToggleStatBox"),i||e.showPadButtons())}get3DToolTip(i){let e=this.getHisto(),t={bin:i,name:e.fName||"histo",title:e.fTitle};switch(this.getDimension()){case 1:t.ix=i+1,t.iy=1,t.value=e.getBinContent(t.ix),t.error=e.getBinError(t.ix),t.lines=this.getBinTooltips(i-1);break;case 2:t.ix=i%this.nbinsx+1,t.iy=(i-(t.ix-1))/this.nbinsx+1,t.value=e.getBinContent(t.ix,t.iy),t.error=e.getBinError(t.ix,t.iy),t.lines=this.getBinTooltips(t.ix-1,t.iy-1);break;case 3:t.ix=i%this.nbinsx+1,t.iy=(i-(t.ix-1))/this.nbinsx%this.nbinsy+1,t.iz=(i-(t.ix-1)-(t.iy-1)*this.nbinsx)/this.nbinsx/this.nbinsy+1,t.value=e.getBinContent(t.ix,t.iy,t.iz),t.error=e.getBinError(t.ix,t.iy,t.iz),t.lines=this.getBinTooltips(t.ix-1,t.iy-1,t.iz-1)}return t}createContour(i,e,t){if(!i||!e)return;t||(t={});let s=u.gStyle.fNumberContours,o=this.minbin,r=this.maxbin,h=this.minposbin;t.scatter_plot&&(s>50&&(s=50),o=this.minposbin),o===r&&(o=this.gminbin,r=this.gmaxbin,h=this.gminposbin),this.getDimension()<3&&(i.zoom_zmin!==i.zoom_zmax?(o=i.zoom_zmin,r=i.zoom_zmax):t.full_z_range&&(o=i.zmin,r=i.zmax)),e.setFullRange(i.zmin,i.zmax),e.createContour(i.logz,s,o,r,h),this.getDimension()<3&&(i.scale_zmin=e.colzmin,i.scale_zmax=e.colzmax)}changeValuesRange(i,e){let t=this.getFramePainter();if(!t)return;let s=t.isAxisZoomed(e)?"zoom_"+e:e;i.input("Enter values range for axis "+e+" like [0,100] or empty string to unzoom","["+t[s+"min"]+","+t[s+"max"]+"]").then(r=>{r=r?JSON.parse(r):[],(0,u.isObject)(r)&&2==r.length&&Number.isFinite(r[0])&&Number.isFinite(r[1])?t.zoom(e,r[0],r[1]):t.unzoom(e)})}fillContextMenu(i){i.add("header:v7histo::anyname"),this.draw_content&&(i.addchk(this.toggleStat("only-check"),"Show statbox",()=>this.toggleStat()),2==this.getDimension()&&i.add("Values range",()=>this.changeValuesRange(i,"z")),(0,u.isFunc)(this.fillHistContextMenu)&&this.fillHistContextMenu(i));let e=this.getFramePainter();if(this.options.Mode3D){i.size()>0&&i.add("separator");let t=this.getMainPainter()||this;i.addchk(t.isTooltipAllowed(),"Show tooltips",()=>t.setTooltipAllowed("toggle")),i.addchk(e.enable_highlight,"Highlight bins",()=>{e.enable_highlight=!e.enable_highlight,!e.enable_highlight&&t.highlightBin3D&&t.mode3d&&t.highlightBin3D(null)}),(0,u.isFunc)(e?.render3D)&&(i.addchk(t.options.FrontBox,"Front box",()=>{t.options.FrontBox=!t.options.FrontBox,e.render3D()}),i.addchk(t.options.BackBox,"Back box",()=>{t.options.BackBox=!t.options.BackBox,e.render3D()})),this.draw_content&&(i.addchk(!this.options.Zero,"Suppress zeros",()=>{this.options.Zero=!this.options.Zero,this.redrawPad()}),(12==this.options.Lego||14==this.options.Lego)&&this.fillPaletteMenu&&this.fillPaletteMenu(i)),(0,u.isFunc)(t.control?.reset)&&i.add("Reset camera",()=>t.control.reset())}return i.addAttributesMenu(this),this.histogram_updated&&e.zoomChangedInteractive()&&i.add("Let update zoom",()=>e.zoomChangedInteractive("reset")),!0}updatePaletteDraw(){this.isMainPainter()&&this.getPadPainter().findPainterFor(void 0,void 0,"ROOT::Experimental::RPaletteDrawable")?.drawPalette()}fillPaletteMenu(i){i.addPaletteMenu(this.options.Palette||u.settings.Palette,e=>{this.options.Palette=parseInt(e),this.redraw()})}toggleMode3D(){this.options.Mode3D=!this.options.Mode3D,this.options.Mode3D&&!this.options.Surf&&!this.options.Lego&&!this.options.Error&&(this.options.Lego=this.nbinsx>=50||this.nbinsy>=50?this.options.Color?14:13:this.options.Color?12:1,this.options.Zero=!1),this.copyOptionsToOthers(),this.interactiveRedraw("pad","drawopt")}prepareDraw(i){i||(i={rounding:!0,extra:0,middle:0}),void 0===i.extra&&(i.extra=0),void 0===i.right_extra&&(i.right_extra=i.extra),void 0===i.middle&&(i.middle=0);let h,a,g,m,l,B,e=this.getHisto(),t=this.getAxis("x"),s=this.getAxis("y"),o=this.getFramePainter(),r=this.getDimension(),n={i1:this.getSelectIndex("x","left",0-i.extra),i2:this.getSelectIndex("x","right",1+i.right_extra),j1:r<2?0:this.getSelectIndex("y","left",0-i.extra),j2:r<2?1:this.getSelectIndex("y","right",1+i.right_extra),k1:r<3?0:this.getSelectIndex("z","left",0-i.extra),k2:r<3?1:this.getSelectIndex("z","right",1+i.right_extra),stepi:1,stepj:1,stepk:1,min:0,max:0,sumz:0,xbar1:0,xbar2:1,ybar1:0,ybar2:1};if(this.isDisplayItem()&&e.fIndicies&&(n.i1e.fIndicies[1]&&(n.i2=e.fIndicies[1],n.incomplete=!0),n.stepi=e.fIndicies[2],n.stepi>1&&(n.incomplete=!0),r>1&&e.fIndicies.length>5&&(n.j1e.fIndicies[4]&&(n.j2=e.fIndicies[4],n.incomplete=!0),n.stepj=e.fIndicies[5],n.stepj>1&&(n.incomplete=!0)),r>2&&e.fIndicies.length>8&&(n.k1e.fIndicies[7]&&(n.k2=e.fIndicies[7],n.incomplete=!0),n.stepk=e.fIndicies[8],n.stepk>1&&(n.incomplete=!0))),i.only_indexes)return n;n.grx=new Array(n.i2+n.stepi+1),n.gry=new Array(n.j2+n.stepj+1),i.original&&(n.original=!0,n.origx=new Array(n.i2+1),n.origy=new Array(n.j2+1)),i.pixel_density&&(i.rounding=!0);let x=o.getGrFuncs(this.options.second_x,this.options.second_y);for(h=n.i1;h<=n.i2;++h)g=t.GetBinCoord(h+i.middle),x.logx&&g<=0?n.i1=h+1:(n.origx&&(n.origx[h]=g),n.grx[h]=x.grx(g),i.rounding&&(n.grx[h]=Math.round(n.grx[h])),i.use3d&&(n.grx[h]<-o.size_x3d&&(n.i1=h,n.grx[h]=-o.size_x3d),n.grx[h]>o.size_x3d&&(n.i2=h,n.grx[h]=o.size_x3d)));for(i.use3d&&(n.i1o.size_y3d&&(n.j2=a,n.gry[a]=o.size_y3d)));for(i.use3d&&r>1&&(n.j11&&a0&&(l0&&(null===this.minposbin||l{c.d(_,{n:()=>z});var y=c(4788),u=c(9542),b=c(3029);function d(f){"ROOT::Experimental::RAxisEquidistant"==f._typename||"ROOT::Experimental::RAxisLabels"==f._typename?(0===f.fInvBinWidth&&(f.$dummy=!0,f.fInvBinWidth=1,f.fNBinsNoOver=0,f.fLow=0),f.min=f.fLow,f.max=f.fLow+f.fNBinsNoOver/f.fInvBinWidth,f.GetNumBins=function(){return this.fNBinsNoOver},f.GetBinCoord=function(i){return this.fLow+i/this.fInvBinWidth},f.FindBin=function(i,e){return Math.floor((i-this.fLow)*this.fInvBinWidth+e)}):"ROOT::Experimental::RAxisIrregular"==f._typename&&(f.min=f.fBinBorders[0],f.max=f.fBinBorders[f.fBinBorders.length-1],f.GetNumBins=function(){return this.fBinBorders.length},f.GetBinCoord=function(i){let e=Math.round(i);if(e<=0)return this.fBinBorders[0];if(e>=this.fBinBorders.length)return this.fBinBorders[this.fBinBorders.length-1];if(e==i)return this.fBinBorders[e];let t=i1||t.stepy>1||t.stepz>1?function(s,o,r){return Math.floor((s-this.dx)/this.stepx)+this.nx/this.stepx*Math.floor((o-this.dy)/this.stepy)+this.nx/this.stepx*this.ny/this.stepy*Math.floor((r-this.dz)/this.stepz)}:function(s,o,r){return s-this.dx+this.nx*(o-this.dy)+this.nx*this.ny*(r-dz)},t.getBinContent=function(s,o,r){return this.fBinContent[this.getBin0(s,o,r)]},t.getBinError=function(s,o,r){return Math.sqrt(Math.abs(this.getBinContent(s,o,r)))}):2==t.fAxes.length?(d(t.fAxes[0]),d(t.fAxes[1]),t.nx=t.fIndicies[1]-t.fIndicies[0],t.dx=t.fIndicies[0]+1,t.stepx=t.fIndicies[2],t.ny=t.fIndicies[4]-t.fIndicies[3],t.dy=t.fIndicies[3]+1,t.stepy=t.fIndicies[5],t.getBin=function(s,o){return s-1+this.fAxes[0].GetNumBins()*(o-1)},t.getBin0=t.stepx>1||t.stepy>1?function(s,o){return Math.floor((s-this.dx)/this.stepx)+this.nx/this.stepx*Math.floor((o-this.dy)/this.stepy)}:function(s,o){return s-this.dx+this.nx*(o-this.dy)},t.getBinContent=function(s,o){return this.fBinContent[this.getBin0(s,o)]},t.getBinError=function(s,o){return Math.sqrt(Math.abs(this.getBinContent(s,o)))}):(d(t.fAxes[0]),t.nx=t.fIndicies[1]-t.fIndicies[0],t.dx=t.fIndicies[0]+1,t.stepx=t.fIndicies[2],t.getBin=function(s){return s-1},t.getBin0=t.stepx>1?function(s){return Math.floor((s-this.dx)/this.stepx)}:function(s){return s-this.dx},t.getBinContent=function(s){return this.fBinContent[this.getBin0(s)]},t.getBinError=function(s){return Math.sqrt(Math.abs(this.getBinContent(s)))}))):t.fAxes._2?(d(t.fAxes._0),d(t.fAxes._1),d(t.fAxes._2),t.getBin=function(s,o,r){return s-1+this.fAxes._0.GetNumBins()*(o-1)+this.fAxes._0.GetNumBins()*this.fAxes._1.GetNumBins()*(r-1)},t.getBinContent=function(s,o,r){return this.fStatistics.fBinContent[this.getBin(s,o,r)]},t.getBinError=function(s,o,r){let h=this.getBin(s,o,r);return this.fStatistics.fSumWeightsSquared?Math.sqrt(this.fStatistics.fSumWeightsSquared[h]):Math.sqrt(Math.abs(this.fStatistics.fBinContent[h]))}):t.fAxes._1?(d(t.fAxes._0),d(t.fAxes._1),t.getBin=function(s,o){return s-1+this.fAxes._0.GetNumBins()*(o-1)},t.getBinContent=function(s,o){return this.fStatistics.fBinContent[this.getBin(s,o)]},t.getBinError=function(s,o){let r=this.getBin(s,o);return this.fStatistics.fSumWeightsSquared?Math.sqrt(this.fStatistics.fSumWeightsSquared[r]):Math.sqrt(Math.abs(this.fStatistics.fBinContent[r]))}):(d(t.fAxes._0),t.getBin=function(s){return s-1},t.getBinContent=function(s){return this.fStatistics.fBinContent[s-1]},t.getBinError=function(s){return this.fStatistics.fSumWeightsSquared?Math.sqrt(this.fStatistics.fSumWeightsSquared[s-1]):Math.sqrt(Math.abs(this.fStatistics.fBinContent[s-1]))}),t}decodeOptions(){this.options||(this.options={Hist:1})}copyOptionsFrom(i){i!==this&&(this.options.Mode3D=i.options.Mode3D)}copyOptionsToOthers(){this.forEachPainter(i=>{i!==this&&(0,u.isFunc)(i.copyOptionsFrom)&&i.copyOptionsFrom(this)},"objects")}clear3DScene(){let i=this.getFramePainter();(0,u.isFunc)(i?.create3DScene)&&i.create3DScene(-1),this.mode3d=!1}cleanup(){this.clear3DScene(),delete this.options,super.cleanup()}getDimension(){return 1}scanContent(){}drawFrameAxes(){var i=this;return(0,y.Z)(function*(){let e=i.getFramePainter();return!!e&&(!i.draw_content||(i.isMainPainter()?(e.cleanupAxes(),e.xmin=e.xmax=0,e.ymin=e.ymax=0,e.zmin=e.zmax=0,e.setAxesRanges(i.getAxis("x"),i.xmin,i.xmax,i.getAxis("y"),i.ymin,i.ymax,i.getAxis("z"),i.zmin,i.zmax),e.drawAxes()):!i.options.second_x&&!i.options.second_y||(e.setAxes2Ranges(i.options.second_x,i.getAxis("x"),i.xmin,i.xmax,i.options.second_y,i.getAxis("y"),i.ymin,i.ymax),e.drawAxes2(i.options.second_x,i.options.second_y))))})()}createHistDrawAttributes(){this.createv7AttFill(),this.createv7AttLine()}updateDisplayItem(i,e){return!(!i||!e||(i.fAxes=e.fAxes,i.fIndicies=e.fIndicies,i.fBinContent=e.fBinContent,i.fContMin=e.fContMin,i.fContMinPos=e.fContMinPos,i.fContMax=e.fContMax,this.getHisto(!0),0))}updateObject(i){let e=this.getObject();if(i!==e){if(!this.matchObjectType(i))return!1;if(this.isDisplayItem())this.updateDisplayItem(e,i);else{let t=p(e),s=p(i);if(!t||!s)return!1;t.fStatistics=s.fStatistics,e.fTitle=i.fTitle}}return this.scanContent(),this.histogram_updated=!0,!0}getAxis(i){let e=this.getHisto(),t=this.getObject(),s=null;if(t&&t.fAxes)switch(i){case"x":default:s=t.fAxes[0];break;case"y":s=t.fAxes[1];break;case"z":s=t.fAxes[2]}else if(e&&e.fAxes)switch(i){case"x":default:s=e.fAxes._0;break;case"y":s=e.fAxes._1;break;case"z":s=e.fAxes._2}return s&&!s.GetBinCoord&&d(s),s}getAxisBinTip(i,e,t){let s=this.getFramePainter(),o=s[i+"_handle"],r=this.getAxis(i),h=r.GetBinCoord(e);if("labels"===o.kind)return s.axisAsText(i,h);let a=r.GetBinCoord(e+(t||1));return"time"===o.kind?s.axisAsText(i,(h+a)/2):"["+s.axisAsText(i,h)+", "+s.axisAsText(i,a)+")"}extractAxesProperties(i){if(!this.getHisto())return;this.nbinsx=this.nbinsy=this.nbinsz=0;let t=this.getAxis("x");this.nbinsx=t.GetNumBins(),this.xmin=t.min,this.xmax=t.max,!(i<2)&&(t=this.getAxis("y"),this.nbinsy=t.GetNumBins(),this.ymin=t.min,this.ymax=t.max,!(i<3)&&(t=this.getAxis("z"),this.nbinsz=t.GetNumBins(),this.zmin=t.min,this.zmax=t.max))}addInteractivity(){let i=this.isMainPainter(),e=this.options.second_x||this.options.second_y,t=i||e?this.getFramePainter():null;return!t||t.addInteractivity(!i&&e)}processItemReply(i,e){if(!this.isDisplayItem())return console.error("Get item when display normal histogram");e.reqid===this.current_item_reqid&&(null!==i&&this.updateDisplayItem(this.getObject(),i.item),e.resolveFunc(!0))}drawingBins(i){var e=this;return(0,y.Z)(function*(){let t=!1;return i&&(0,u.isStr)(i)&&0==i.indexOf("zoom")&&(i.indexOf("0")>0&&(t=!0),e.getDimension()>1&&i.indexOf("1")>0&&(t=!0),e.getDimension()>2&&i.indexOf("2")>0&&(t=!0)),!(e.isDisplayItem()&&t&&e.v7NormalMode()&&e.prepareDraw({only_indexes:!0}).incomplete)||new Promise(o=>{let r=e.v7SubmitRequest("",{_typename:"ROOT::Experimental::RHistDrawableBase::RRequest"},e.processItemReply.bind(e));r?(e.current_item_reqid=r.reqid,r.resolveFunc=o,setTimeout(e.processItemReply.bind(e,null,r),1e3)):o(!0)})})()}toggleStat(){}getSelectIndex(i,e,t){let s=0,o=this.getAxis(i),r=this["nbins"+i]||0;this.options.second_x&&"x"==i&&(i="x2"),this.options.second_y&&"y"==i&&(i="y2");let h=this.getFramePainter(),a=h?h["zoom_"+i+"min"]:0,g=h?h["zoom_"+i+"max"]:0;return a!==g&&o?(s="left"==e?o.FindBin(a,t||0):o.FindBin(g,(t||0)+.5),s<0?s=0:s>r&&(s=r)):s="left"==e?0:r,s}autoZoom(){}clickButton(i){switch(i){case"ToggleZoom":if(this.zoom_xmin!==this.zoom_xmax||this.zoom_ymin!==this.zoom_ymax||this.zoom_zmin!==this.zoom_zmax)return this.unzoom(),this.getFramePainter().zoomChangedInteractive("reset"),!0;if(this.draw_content)return this.autoZoom(),!0;break;case"ToggleLogX":this.getFramePainter().toggleAxisLog("x");break;case"ToggleLogY":this.getFramePainter().toggleAxisLog("y");break;case"ToggleLogZ":this.getFramePainter().toggleAxisLog("z");break;case"ToggleStatBox":return this.toggleStat(),!0}return!1}fillToolbar(i){let e=this.getPadPainter();e&&(e.addPadButton("auto_zoom","Toggle between unzoom and autozoom-in","ToggleZoom","Ctrl *"),e.addPadButton("arrow_right","Toggle log x","ToggleLogX","PageDown"),e.addPadButton("arrow_up","Toggle log y","ToggleLogY","PageUp"),this.getDimension()>1&&e.addPadButton("arrow_diag","Toggle log z","ToggleLogZ"),this.draw_content&&e.addPadButton("statbox","Toggle stat box","ToggleStatBox"),i||e.showPadButtons())}get3DToolTip(i){let e=this.getHisto(),t={bin:i,name:e.fName||"histo",title:e.fTitle};switch(this.getDimension()){case 1:t.ix=i+1,t.iy=1,t.value=e.getBinContent(t.ix),t.error=e.getBinError(t.ix),t.lines=this.getBinTooltips(i-1);break;case 2:t.ix=i%this.nbinsx+1,t.iy=(i-(t.ix-1))/this.nbinsx+1,t.value=e.getBinContent(t.ix,t.iy),t.error=e.getBinError(t.ix,t.iy),t.lines=this.getBinTooltips(t.ix-1,t.iy-1);break;case 3:t.ix=i%this.nbinsx+1,t.iy=(i-(t.ix-1))/this.nbinsx%this.nbinsy+1,t.iz=(i-(t.ix-1)-(t.iy-1)*this.nbinsx)/this.nbinsx/this.nbinsy+1,t.value=e.getBinContent(t.ix,t.iy,t.iz),t.error=e.getBinError(t.ix,t.iy,t.iz),t.lines=this.getBinTooltips(t.ix-1,t.iy-1,t.iz-1)}return t}createContour(i,e,t){if(!i||!e)return;t||(t={});let s=u.gStyle.fNumberContours,o=this.minbin,r=this.maxbin,h=this.minposbin;t.scatter_plot&&(s>50&&(s=50),o=this.minposbin),o===r&&(o=this.gminbin,r=this.gmaxbin,h=this.gminposbin),this.getDimension()<3&&(i.zoom_zmin!==i.zoom_zmax?(o=i.zoom_zmin,r=i.zoom_zmax):t.full_z_range&&(o=i.zmin,r=i.zmax)),e.setFullRange(i.zmin,i.zmax),e.createContour(i.logz,s,o,r,h),this.getDimension()<3&&(i.scale_zmin=e.colzmin,i.scale_zmax=e.colzmax)}changeValuesRange(i,e){let t=this.getFramePainter();if(!t)return;let s=t.isAxisZoomed(e)?"zoom_"+e:e;i.input("Enter values range for axis "+e+" like [0,100] or empty string to unzoom","["+t[s+"min"]+","+t[s+"max"]+"]").then(r=>{r=r?JSON.parse(r):[],(0,u.isObject)(r)&&2==r.length&&Number.isFinite(r[0])&&Number.isFinite(r[1])?t.zoom(e,r[0],r[1]):t.unzoom(e)})}fillContextMenu(i){i.add("header:v7histo::anyname"),this.draw_content&&(i.addchk(this.toggleStat("only-check"),"Show statbox",()=>this.toggleStat()),2==this.getDimension()&&i.add("Values range",()=>this.changeValuesRange(i,"z")),(0,u.isFunc)(this.fillHistContextMenu)&&this.fillHistContextMenu(i));let e=this.getFramePainter();if(this.options.Mode3D){i.size()>0&&i.add("separator");let t=this.getMainPainter()||this;i.addchk(t.isTooltipAllowed(),"Show tooltips",()=>t.setTooltipAllowed("toggle")),i.addchk(e.enable_highlight,"Highlight bins",()=>{e.enable_highlight=!e.enable_highlight,!e.enable_highlight&&t.highlightBin3D&&t.mode3d&&t.highlightBin3D(null)}),(0,u.isFunc)(e?.render3D)&&(i.addchk(t.options.FrontBox,"Front box",()=>{t.options.FrontBox=!t.options.FrontBox,e.render3D()}),i.addchk(t.options.BackBox,"Back box",()=>{t.options.BackBox=!t.options.BackBox,e.render3D()})),this.draw_content&&(i.addchk(!this.options.Zero,"Suppress zeros",()=>{this.options.Zero=!this.options.Zero,this.redrawPad()}),(12==this.options.Lego||14==this.options.Lego)&&this.fillPaletteMenu&&this.fillPaletteMenu(i)),(0,u.isFunc)(t.control?.reset)&&i.add("Reset camera",()=>t.control.reset())}return i.addAttributesMenu(this),this.histogram_updated&&e.zoomChangedInteractive()&&i.add("Let update zoom",()=>e.zoomChangedInteractive("reset")),!0}updatePaletteDraw(){this.isMainPainter()&&this.getPadPainter().findPainterFor(void 0,void 0,"ROOT::Experimental::RPaletteDrawable")?.drawPalette()}fillPaletteMenu(i){i.addPaletteMenu(this.options.Palette||u.settings.Palette,e=>{this.options.Palette=parseInt(e),this.redraw()})}toggleMode3D(){this.options.Mode3D=!this.options.Mode3D,this.options.Mode3D&&!this.options.Surf&&!this.options.Lego&&!this.options.Error&&(this.options.Lego=this.nbinsx>=50||this.nbinsy>=50?this.options.Color?14:13:this.options.Color?12:1,this.options.Zero=!1),this.copyOptionsToOthers(),this.interactiveRedraw("pad","drawopt")}prepareDraw(i){i||(i={rounding:!0,extra:0,middle:0}),void 0===i.extra&&(i.extra=0),void 0===i.right_extra&&(i.right_extra=i.extra),void 0===i.middle&&(i.middle=0);let h,a,g,m,l,B,e=this.getHisto(),t=this.getAxis("x"),s=this.getAxis("y"),o=this.getFramePainter(),r=this.getDimension(),n={i1:this.getSelectIndex("x","left",0-i.extra),i2:this.getSelectIndex("x","right",1+i.right_extra),j1:r<2?0:this.getSelectIndex("y","left",0-i.extra),j2:r<2?1:this.getSelectIndex("y","right",1+i.right_extra),k1:r<3?0:this.getSelectIndex("z","left",0-i.extra),k2:r<3?1:this.getSelectIndex("z","right",1+i.right_extra),stepi:1,stepj:1,stepk:1,min:0,max:0,sumz:0,xbar1:0,xbar2:1,ybar1:0,ybar2:1};if(this.isDisplayItem()&&e.fIndicies&&(n.i1e.fIndicies[1]&&(n.i2=e.fIndicies[1],n.incomplete=!0),n.stepi=e.fIndicies[2],n.stepi>1&&(n.incomplete=!0),r>1&&e.fIndicies.length>5&&(n.j1e.fIndicies[4]&&(n.j2=e.fIndicies[4],n.incomplete=!0),n.stepj=e.fIndicies[5],n.stepj>1&&(n.incomplete=!0)),r>2&&e.fIndicies.length>8&&(n.k1e.fIndicies[7]&&(n.k2=e.fIndicies[7],n.incomplete=!0),n.stepk=e.fIndicies[8],n.stepk>1&&(n.incomplete=!0))),i.only_indexes)return n;n.grx=new Array(n.i2+n.stepi+1),n.gry=new Array(n.j2+n.stepj+1),i.original&&(n.original=!0,n.origx=new Array(n.i2+1),n.origy=new Array(n.j2+1)),i.pixel_density&&(i.rounding=!0);let x=o.getGrFuncs(this.options.second_x,this.options.second_y);for(h=n.i1;h<=n.i2;++h)g=t.GetBinCoord(h+i.middle),x.logx&&g<=0?n.i1=h+1:(n.origx&&(n.origx[h]=g),n.grx[h]=x.grx(g),i.rounding&&(n.grx[h]=Math.round(n.grx[h])),i.use3d&&(n.grx[h]<-o.size_x3d&&(n.i1=h,n.grx[h]=-o.size_x3d),n.grx[h]>o.size_x3d&&(n.i2=h,n.grx[h]=o.size_x3d)));for(i.use3d&&(n.i1o.size_y3d&&(n.j2=a,n.gry[a]=o.size_y3d)));for(i.use3d&&r>1&&(n.j11&&a0&&(l0&&(null===this.minposbin||l= this.fBinBorders.length) return this.fBinBorders[this.fBinBorders.length - 1];\n if (indx==bin) return this.fBinBorders[indx];\n let indx2 = (bin < indx) ? indx - 1 : indx + 1;\n return this.fBinBorders[indx] * Math.abs(bin-indx2) + this.fBinBorders[indx2] * Math.abs(bin-indx);\n }\n axis.FindBin = function(x,add) {\n for (let k = 1; k < this.fBinBorders.length; ++k)\n if (x < this.fBinBorders[k]) return Math.floor(k-1+add);\n return this.fBinBorders.length - 1;\n }\n }\n\n // to support some code from ROOT6 drawing\n\n axis.GetBinCenter = function(bin) { return this.GetBinCoord(bin-0.5); }\n axis.GetBinLowEdge = function(bin) { return this.GetBinCoord(bin-1); }\n}\n\n/** @summary Returns real histogram impl\n * @private */\nfunction getHImpl(obj) {\n return (obj && obj.fHistImpl) ? obj.fHistImpl.fIO : null;\n}\n\n\n/** @summary Base painter class for RHist objects\n *\n * @private\n */\n\nclass RHistPainter extends RObjectPainter {\n\n /** @summary Constructor\n * @param {object|string} dom - DOM element for drawing or element id\n * @param {object} histo - RHist object */\n constructor(dom, histo) {\n super(dom, histo);\n this.csstype = 'hist';\n this.draw_content = true;\n this.nbinsx = 0;\n this.nbinsy = 0;\n this.accept_drops = true; // indicate that one can drop other objects like doing Draw('same')\n this.mode3d = false;\n\n // initialize histogram methods\n this.getHisto(true);\n }\n\n /** @summary Returns true if RHistDisplayItem is used */\n isDisplayItem() {\n let obj = this.getObject();\n return obj && obj.fAxes ? true : false;\n }\n\n /** @summary get histogram */\n getHisto(force) {\n let obj = this.getObject(), histo = getHImpl(obj);\n\n if (histo && (!histo.getBinContent || force)) {\n if (histo.fAxes._2) {\n assignRAxisMethods(histo.fAxes._0);\n assignRAxisMethods(histo.fAxes._1);\n assignRAxisMethods(histo.fAxes._2);\n histo.getBin = function(x, y, z) { return (x-1) + this.fAxes._0.GetNumBins()*(y-1) + this.fAxes._0.GetNumBins()*this.fAxes._1.GetNumBins()*(z-1); }\n // FIXME: all normal ROOT methods uses indx+1 logic, but RHist has no underflow/overflow bins now\n histo.getBinContent = function(x, y, z) { return this.fStatistics.fBinContent[this.getBin(x, y, z)]; }\n histo.getBinError = function(x, y, z) {\n let bin = this.getBin(x, y, z);\n if (this.fStatistics.fSumWeightsSquared)\n return Math.sqrt(this.fStatistics.fSumWeightsSquared[bin]);\n return Math.sqrt(Math.abs(this.fStatistics.fBinContent[bin]));\n }\n } else if (histo.fAxes._1) {\n assignRAxisMethods(histo.fAxes._0);\n assignRAxisMethods(histo.fAxes._1);\n histo.getBin = function(x, y) { return (x-1) + this.fAxes._0.GetNumBins()*(y-1); }\n // FIXME: all normal ROOT methods uses indx+1 logic, but RHist has no underflow/overflow bins now\n histo.getBinContent = function(x, y) { return this.fStatistics.fBinContent[this.getBin(x, y)]; }\n histo.getBinError = function(x, y) {\n let bin = this.getBin(x, y);\n if (this.fStatistics.fSumWeightsSquared)\n return Math.sqrt(this.fStatistics.fSumWeightsSquared[bin]);\n return Math.sqrt(Math.abs(this.fStatistics.fBinContent[bin]));\n }\n } else {\n assignRAxisMethods(histo.fAxes._0);\n histo.getBin = function(x) { return x-1; }\n // FIXME: all normal ROOT methods uses indx+1 logic, but RHist has no underflow/overflow bins now\n histo.getBinContent = function(x) { return this.fStatistics.fBinContent[x-1]; }\n histo.getBinError = function(x) {\n if (this.fStatistics.fSumWeightsSquared)\n return Math.sqrt(this.fStatistics.fSumWeightsSquared[x-1]);\n return Math.sqrt(Math.abs(this.fStatistics.fBinContent[x-1]));\n }\n }\n } else if (!histo && obj && obj.fAxes) {\n // case of RHistDisplayItem\n\n histo = obj;\n\n if (!histo.getBinContent || force) {\n if (histo.fAxes.length == 3) {\n assignRAxisMethods(histo.fAxes[0]);\n assignRAxisMethods(histo.fAxes[1]);\n assignRAxisMethods(histo.fAxes[2]);\n\n histo.nx = histo.fIndicies[1] - histo.fIndicies[0];\n histo.dx = histo.fIndicies[0] + 1;\n histo.stepx = histo.fIndicies[2];\n\n histo.ny = histo.fIndicies[4] - histo.fIndicies[3];\n histo.dy = histo.fIndicies[3] + 1;\n histo.stepy = histo.fIndicies[5];\n\n histo.nz = histo.fIndicies[7] - histo.fIndicies[6];\n histo.dz = histo.fIndicies[6] + 1;\n histo.stepz = histo.fIndicies[8];\n\n // this is index in original histogram\n histo.getBin = function(x, y, z) { return (x-1) + this.fAxes[0].GetNumBins()*(y-1) + this.fAxes[0].GetNumBins()*this.fAxes[1].GetNumBins()*(z-1); }\n\n // this is index in current available data\n if ((histo.stepx > 1) || (histo.stepy > 1) || (histo.stepz > 1))\n histo.getBin0 = function(x, y, z) { return Math.floor((x-this.dx)/this.stepx) + this.nx/this.stepx*Math.floor((y-this.dy)/this.stepy) + this.nx/this.stepx*this.ny/this.stepy*Math.floor((z-this.dz)/this.stepz); }\n else\n histo.getBin0 = function(x, y, z) { return (x-this.dx) + this.nx*(y-this.dy) + this.nx*this.ny*(z-dz); }\n\n histo.getBinContent = function(x, y, z) { return this.fBinContent[this.getBin0(x, y, z)]; }\n histo.getBinError = function(x, y, z) { return Math.sqrt(Math.abs(this.getBinContent(x, y, z))); }\n\n\n } else if (histo.fAxes.length == 2) {\n assignRAxisMethods(histo.fAxes[0]);\n assignRAxisMethods(histo.fAxes[1]);\n\n histo.nx = histo.fIndicies[1] - histo.fIndicies[0];\n histo.dx = histo.fIndicies[0] + 1;\n histo.stepx = histo.fIndicies[2];\n\n histo.ny = histo.fIndicies[4] - histo.fIndicies[3];\n histo.dy = histo.fIndicies[3] + 1;\n histo.stepy = histo.fIndicies[5];\n\n // this is index in original histogram\n histo.getBin = function(x, y) { return (x-1) + this.fAxes[0].GetNumBins()*(y-1); }\n\n // this is index in current available data\n if ((histo.stepx > 1) || (histo.stepy > 1))\n histo.getBin0 = function(x, y) { return Math.floor((x-this.dx)/this.stepx) + this.nx/this.stepx*Math.floor((y-this.dy)/this.stepy); }\n else\n histo.getBin0 = function(x, y) { return (x-this.dx) + this.nx*(y-this.dy); }\n\n histo.getBinContent = function(x, y) { return this.fBinContent[this.getBin0(x, y)]; }\n histo.getBinError = function(x, y) { return Math.sqrt(Math.abs(this.getBinContent(x, y))); }\n } else {\n assignRAxisMethods(histo.fAxes[0]);\n histo.nx = histo.fIndicies[1] - histo.fIndicies[0];\n histo.dx = histo.fIndicies[0] + 1;\n histo.stepx = histo.fIndicies[2];\n\n histo.getBin = function(x) { return x-1; }\n if (histo.stepx > 1)\n histo.getBin0 = function(x) { return Math.floor((x-this.dx)/this.stepx); }\n else\n histo.getBin0 = function(x) { return x-this.dx; }\n histo.getBinContent = function(x) { return this.fBinContent[this.getBin0(x)]; }\n histo.getBinError = function(x) { return Math.sqrt(Math.abs(this.getBinContent(x))); }\n }\n }\n }\n return histo;\n }\n\n /** @summary Decode options */\n decodeOptions(/*opt*/) {\n if (!this.options) this.options = { Hist : 1 };\n }\n\n /** @summary Copy draw options from other painter */\n copyOptionsFrom(src) {\n if (src === this) return;\n let o = this.options, o0 = src.options;\n o.Mode3D = o0.Mode3D;\n }\n\n /** @summary copy draw options to all other histograms in the pad*/\n copyOptionsToOthers() {\n this.forEachPainter(painter => {\n if ((painter !== this) && isFunc(painter.copyOptionsFrom))\n painter.copyOptionsFrom(this);\n }, 'objects');\n }\n\n /** @summary Clear 3d drawings - if any */\n clear3DScene() {\n let fp = this.getFramePainter();\n if (isFunc(fp?.create3DScene))\n fp.create3DScene(-1);\n this.mode3d = false;\n }\n\n /** @summary Cleanup hist painter */\n cleanup() {\n this.clear3DScene();\n\n delete this.options;\n\n super.cleanup();\n }\n\n /** @summary Returns histogram dimension */\n getDimension() { return 1; }\n\n /** @summary Scan histogram content\n * @abstract */\n scanContent(/*when_axis_changed*/) {\n // function will be called once new histogram or\n // new histogram content is assigned\n // one should find min,max,nbins, maxcontent values\n // if when_axis_changed === true specified, content will be scanned after axis zoom changed\n }\n\n /** @summary Draw axes */\n async drawFrameAxes() {\n // return true when axes was drawn\n let main = this.getFramePainter();\n if (!main)\n return false;\n\n if (!this.draw_content)\n return true;\n\n if (!this.isMainPainter()) {\n if (!this.options.second_x && !this.options.second_y)\n return true;\n\n main.setAxes2Ranges(this.options.second_x, this.getAxis('x'), this.xmin, this.xmax, this.options.second_y, this.getAxis('y'), this.ymin, this.ymax);\n return main.drawAxes2(this.options.second_x, this.options.second_y);\n }\n\n main.cleanupAxes();\n main.xmin = main.xmax = 0;\n main.ymin = main.ymax = 0;\n main.zmin = main.zmax = 0;\n main.setAxesRanges(this.getAxis('x'), this.xmin, this.xmax, this.getAxis('y'), this.ymin, this.ymax, this.getAxis('z'), this.zmin, this.zmax);\n return main.drawAxes();\n }\n\n /** @summary create attributes */\n createHistDrawAttributes() {\n this.createv7AttFill();\n this.createv7AttLine();\n }\n\n /** @summary update display item */\n updateDisplayItem(obj, src) {\n if (!obj || !src) return false;\n\n obj.fAxes = src.fAxes;\n obj.fIndicies = src.fIndicies;\n obj.fBinContent = src.fBinContent;\n obj.fContMin = src.fContMin;\n obj.fContMinPos = src.fContMinPos;\n obj.fContMax = src.fContMax;\n\n // update histogram attributes\n this.getHisto(true);\n\n return true;\n }\n\n /** @summary update histogram object */\n updateObject(obj /*, opt*/) {\n\n let origin = this.getObject();\n\n if (obj !== origin) {\n\n if (!this.matchObjectType(obj)) return false;\n\n if (this.isDisplayItem()) {\n\n this.updateDisplayItem(origin, obj);\n\n } else {\n\n let horigin = getHImpl(origin),\n hobj = getHImpl(obj);\n\n if (!horigin || !hobj) return false;\n\n // make it easy - copy statistics without axes\n horigin.fStatistics = hobj.fStatistics;\n\n origin.fTitle = obj.fTitle;\n }\n }\n\n this.scanContent();\n\n this.histogram_updated = true; // indicate that object updated\n\n return true;\n }\n\n /** @summary Get axis object */\n getAxis(name) {\n let histo = this.getHisto(), obj = this.getObject(), axis = null;\n\n if (obj && obj.fAxes) {\n switch(name) {\n case 'x': axis = obj.fAxes[0]; break;\n case 'y': axis = obj.fAxes[1]; break;\n case 'z': axis = obj.fAxes[2]; break;\n default: axis = obj.fAxes[0]; break;\n }\n } else if (histo && histo.fAxes) {\n switch(name) {\n case 'x': axis = histo.fAxes._0; break;\n case 'y': axis = histo.fAxes._1; break;\n case 'z': axis = histo.fAxes._2; break;\n default: axis = histo.fAxes._0; break;\n }\n }\n\n if (axis && !axis.GetBinCoord)\n assignRAxisMethods(axis);\n\n return axis;\n }\n\n /** @summary Get tip text for axis bin */\n getAxisBinTip(name, bin, step) {\n let pmain = this.getFramePainter(),\n handle = pmain[name+'_handle'],\n axis = this.getAxis(name),\n x1 = axis.GetBinCoord(bin);\n\n if (handle.kind === 'labels')\n return pmain.axisAsText(name, x1);\n\n let x2 = axis.GetBinCoord(bin+(step || 1));\n\n if (handle.kind === 'time')\n return pmain.axisAsText(name, (x1+x2)/2);\n\n return '[' + pmain.axisAsText(name, x1) + ', ' + pmain.axisAsText(name, x2) + ')';\n }\n\n /** @summary Extract axes ranges and bins numbers\n * @desc Also here ensured that all axes objects got their necessary methods */\n extractAxesProperties(ndim) {\n\n let histo = this.getHisto();\n if (!histo) return;\n\n this.nbinsx = this.nbinsy = this.nbinsz = 0;\n\n let axis = this.getAxis('x');\n this.nbinsx = axis.GetNumBins();\n this.xmin = axis.min;\n this.xmax = axis.max;\n\n if (ndim < 2) return;\n axis = this.getAxis('y');\n this.nbinsy = axis.GetNumBins();\n this.ymin = axis.min;\n this.ymax = axis.max;\n\n if (ndim < 3) return;\n axis = this.getAxis('z');\n this.nbinsz = axis.GetNumBins();\n this.zmin = axis.min;\n this.zmax = axis.max;\n }\n\n /** @summary Add interactive features, only main painter does it */\n addInteractivity() {\n // only first painter in list allowed to add interactive functionality to the frame\n\n let ismain = this.isMainPainter(),\n second_axis = this.options.second_x || this.options.second_y,\n fp = ismain || second_axis ? this.getFramePainter() : null;\n return fp ? fp.addInteractivity(!ismain && second_axis) : true;\n }\n\n /** @summary Process item reply */\n processItemReply(reply, req) {\n if (!this.isDisplayItem())\n return console.error('Get item when display normal histogram');\n\n if (req.reqid === this.current_item_reqid) {\n\n if (reply !== null) {\n this.updateDisplayItem(this.getObject(), reply.item);\n }\n\n req.resolveFunc(true);\n }\n }\n\n /** @summary Special method to request bins from server if existing data insufficient\n * @return {Promise} when ready */\n async drawingBins(reason) {\n\n let is_axes_zoomed = false;\n if (reason && isStr(reason) && (reason.indexOf('zoom') == 0)) {\n if (reason.indexOf('0') > 0) is_axes_zoomed = true;\n if ((this.getDimension() > 1) && (reason.indexOf('1') > 0)) is_axes_zoomed = true;\n if ((this.getDimension() > 2) && (reason.indexOf('2') > 0)) is_axes_zoomed = true;\n }\n\n if (this.isDisplayItem() && is_axes_zoomed && this.v7NormalMode()) {\n\n let handle = this.prepareDraw({ only_indexes: true });\n\n // submit request if histogram data not enough for display\n if (handle.incomplete)\n return new Promise(resolveFunc => {\n // use empty kind to always submit request\n let req = this.v7SubmitRequest('', { _typename: 'ROOT::Experimental::RHistDrawableBase::RRequest' },\n this.processItemReply.bind(this));\n if (req) {\n this.current_item_reqid = req.reqid; // ignore all previous requests, only this one will be processed\n req.resolveFunc = resolveFunc;\n setTimeout(this.processItemReply.bind(this, null, req), 1000); // after 1 s draw something that we can\n } else {\n resolveFunc(true);\n }\n });\n }\n\n return true;\n }\n\n /** @summary Toggle statbox drawing\n * @desc Not yet implemented */\n toggleStat(/*arg*/) {}\n\n /** @summary get selected index for axis */\n getSelectIndex(axis, size, add) {\n // be aware - here indexes starts from 0\n let indx = 0,\n taxis = this.getAxis(axis),\n nbins = this['nbins'+axis] || 0;\n\n if (this.options.second_x && axis == 'x') axis = 'x2';\n if (this.options.second_y && axis == 'y') axis = 'y2';\n\n let main = this.getFramePainter(),\n min = main ? main['zoom_' + axis + 'min'] : 0,\n max = main ? main['zoom_' + axis + 'max'] : 0;\n\n if ((min !== max) && taxis) {\n if (size == 'left')\n indx = taxis.FindBin(min, add || 0);\n else\n indx = taxis.FindBin(max, (add || 0) + 0.5);\n if (indx < 0) indx = 0; else if (indx>nbins) indx = nbins;\n } else {\n indx = (size == 'left') ? 0 : nbins;\n }\n\n return indx;\n }\n\n /** @summary Auto zoom into histogram non-empty range\n * @abstract */\n autoZoom() {}\n\n /** @summary Process click on histogram-defined buttons */\n clickButton(funcname) {\n // TODO: move to frame painter\n switch(funcname) {\n case 'ToggleZoom':\n if ((this.zoom_xmin !== this.zoom_xmax) || (this.zoom_ymin !== this.zoom_ymax) || (this.zoom_zmin !== this.zoom_zmax)) {\n this.unzoom();\n this.getFramePainter().zoomChangedInteractive('reset');\n return true;\n }\n if (this.draw_content) {\n this.autoZoom();\n return true;\n }\n break;\n case 'ToggleLogX': this.getFramePainter().toggleAxisLog('x'); break;\n case 'ToggleLogY': this.getFramePainter().toggleAxisLog('y'); break;\n case 'ToggleLogZ': this.getFramePainter().toggleAxisLog('z'); break;\n case 'ToggleStatBox': this.toggleStat(); return true;\n }\n return false;\n }\n\n /** @summary Fill pad toolbar with hist-related functions */\n fillToolbar(not_shown) {\n let pp = this.getPadPainter();\n if (!pp) return;\n\n pp.addPadButton('auto_zoom', 'Toggle between unzoom and autozoom-in', 'ToggleZoom', 'Ctrl *');\n pp.addPadButton('arrow_right', 'Toggle log x', 'ToggleLogX', 'PageDown');\n pp.addPadButton('arrow_up', 'Toggle log y', 'ToggleLogY', 'PageUp');\n if (this.getDimension() > 1)\n pp.addPadButton('arrow_diag', 'Toggle log z', 'ToggleLogZ');\n if (this.draw_content)\n pp.addPadButton('statbox', 'Toggle stat box', 'ToggleStatBox');\n if (!not_shown) pp.showPadButtons();\n }\n\n /** @summary get tool tips used in 3d mode */\n get3DToolTip(indx) {\n let histo = this.getHisto(),\n tip = { bin: indx, name: histo.fName || 'histo', title: histo.fTitle };\n switch (this.getDimension()) {\n case 1:\n tip.ix = indx + 1; tip.iy = 1;\n tip.value = histo.getBinContent(tip.ix);\n tip.error = histo.getBinError(tip.ix);\n tip.lines = this.getBinTooltips(indx-1);\n break;\n case 2:\n tip.ix = (indx % this.nbinsx) + 1;\n tip.iy = (indx - (tip.ix - 1)) / this.nbinsx + 1;\n tip.value = histo.getBinContent(tip.ix, tip.iy);\n tip.error = histo.getBinError(tip.ix, tip.iy);\n tip.lines = this.getBinTooltips(tip.ix-1, tip.iy-1);\n break;\n case 3:\n tip.ix = indx % this.nbinsx + 1;\n tip.iy = ((indx - (tip.ix - 1)) / this.nbinsx) % this.nbinsy + 1;\n tip.iz = (indx - (tip.ix - 1) - (tip.iy - 1) * this.nbinsx) / this.nbinsx / this.nbinsy + 1;\n tip.value = histo.getBinContent(tip.ix, tip.iy, tip.iz);\n tip.error = histo.getBinError(tip.ix, tip.iy, tip.iz);\n tip.lines = this.getBinTooltips(tip.ix-1, tip.iy-1, tip.iz-1);\n break;\n }\n\n return tip;\n }\n\n /** @summary Create contour levels for currently selected Z range */\n createContour(main, palette, args) {\n if (!main || !palette) return;\n\n if (!args) args = {};\n\n let nlevels = gStyle.fNumberContours,\n zmin = this.minbin, zmax = this.maxbin, zminpos = this.minposbin;\n\n if (args.scatter_plot) {\n if (nlevels > 50) nlevels = 50;\n zmin = this.minposbin;\n }\n\n if (zmin === zmax) { zmin = this.gminbin; zmax = this.gmaxbin; zminpos = this.gminposbin; }\n\n if (this.getDimension() < 3) {\n if (main.zoom_zmin !== main.zoom_zmax) {\n zmin = main.zoom_zmin;\n zmax = main.zoom_zmax;\n } else if (args.full_z_range) {\n zmin = main.zmin;\n zmax = main.zmax;\n }\n }\n\n palette.setFullRange(main.zmin, main.zmax);\n palette.createContour(main.logz, nlevels, zmin, zmax, zminpos);\n\n if (this.getDimension() < 3) {\n main.scale_zmin = palette.colzmin;\n main.scale_zmax = palette.colzmax;\n }\n }\n\n /** @summary Start dialog to modify range of axis where histogram values are displayed */\n changeValuesRange(menu, arg) {\n let pmain = this.getFramePainter();\n if (!pmain) return;\n let prefix = pmain.isAxisZoomed(arg) ? 'zoom_' + arg : arg,\n curr = '[' + pmain[prefix+'min'] + ',' + pmain[prefix+'max'] + ']';\n menu.input('Enter values range for axis ' + arg + ' like [0,100] or empty string to unzoom', curr).then(res => {\n res = res ? JSON.parse(res) : [];\n if (!isObject(res) || (res.length != 2) || !Number.isFinite(res[0]) || !Number.isFinite(res[1]))\n pmain.unzoom(arg);\n else\n pmain.zoom(arg, res[0], res[1]);\n });\n }\n\n /** @summary Fill histogram context menu */\n fillContextMenu(menu) {\n\n menu.add('header:v7histo::anyname');\n\n if (this.draw_content) {\n menu.addchk(this.toggleStat('only-check'), 'Show statbox', () => this.toggleStat());\n\n if (this.getDimension() == 2)\n menu.add('Values range', () => this.changeValuesRange(menu, 'z'));\n\n if (isFunc(this.fillHistContextMenu))\n this.fillHistContextMenu(menu);\n }\n\n let fp = this.getFramePainter();\n\n if (this.options.Mode3D) {\n // menu for 3D drawings\n\n if (menu.size() > 0)\n menu.add('separator');\n\n let main = this.getMainPainter() || this;\n\n menu.addchk(main.isTooltipAllowed(), 'Show tooltips', () => main.setTooltipAllowed('toggle'));\n\n menu.addchk(fp.enable_highlight, 'Highlight bins', () => {\n fp.enable_highlight = !fp.enable_highlight;\n if (!fp.enable_highlight && main.highlightBin3D && main.mode3d) main.highlightBin3D(null);\n });\n\n if (isFunc(fp?.render3D)) {\n menu.addchk(main.options.FrontBox, 'Front box', () => {\n main.options.FrontBox = !main.options.FrontBox;\n fp.render3D();\n });\n menu.addchk(main.options.BackBox, 'Back box', () => {\n main.options.BackBox = !main.options.BackBox;\n fp.render3D();\n });\n }\n\n if (this.draw_content) {\n menu.addchk(!this.options.Zero, 'Suppress zeros', () => {\n this.options.Zero = !this.options.Zero;\n this.redrawPad();\n });\n\n if ((this.options.Lego == 12) || (this.options.Lego == 14)) {\n if (this.fillPaletteMenu)\n this.fillPaletteMenu(menu);\n }\n }\n\n if (isFunc(main.control?.reset))\n menu.add('Reset camera', () => main.control.reset());\n }\n\n menu.addAttributesMenu(this);\n\n if (this.histogram_updated && fp.zoomChangedInteractive())\n menu.add('Let update zoom', () => fp.zoomChangedInteractive('reset'));\n\n return true;\n }\n\n /** @summary Update palette drawing */\n updatePaletteDraw() {\n if (this.isMainPainter())\n this.getPadPainter().findPainterFor(undefined, undefined, 'ROOT::Experimental::RPaletteDrawable')?.drawPalette();\n }\n\n /** @summary Fill menu entries for palette */\n fillPaletteMenu(menu) {\n menu.addPaletteMenu(this.options.Palette || settings.Palette, arg => {\n // TODO: rewrite for RPalette functionality\n this.options.Palette = parseInt(arg);\n this.redraw(); // redraw histogram\n });\n }\n\n /** @summary Toggle 3D drawing mode */\n toggleMode3D() {\n this.options.Mode3D = !this.options.Mode3D;\n\n if (this.options.Mode3D) {\n if (!this.options.Surf && !this.options.Lego && !this.options.Error) {\n if ((this.nbinsx>=50) || (this.nbinsy>=50))\n this.options.Lego = this.options.Color ? 14 : 13;\n else\n this.options.Lego = this.options.Color ? 12 : 1;\n\n this.options.Zero = false; // do not show zeros by default\n }\n }\n\n this.copyOptionsToOthers();\n this.interactiveRedraw('pad', 'drawopt');\n }\n\n /** @summary Calculate histogram inidicies and axes values for each visible bin */\n prepareDraw(args) {\n\n if (!args) args = { rounding: true, extra: 0, middle: 0 };\n\n if (args.extra === undefined) args.extra = 0;\n if (args.right_extra === undefined) args.right_extra = args.extra;\n if (args.middle === undefined) args.middle = 0;\n\n let histo = this.getHisto(), xaxis = this.getAxis('x'), yaxis = this.getAxis('y'),\n pmain = this.getFramePainter(),\n hdim = this.getDimension(),\n i, j, x, y, binz, binarea,\n res = {\n i1: this.getSelectIndex('x', 'left', 0 - args.extra),\n i2: this.getSelectIndex('x', 'right', 1 + args.right_extra),\n j1: (hdim < 2) ? 0 : this.getSelectIndex('y', 'left', 0 - args.extra),\n j2: (hdim < 2) ? 1 : this.getSelectIndex('y', 'right', 1 + args.right_extra),\n k1: (hdim < 3) ? 0 : this.getSelectIndex('z', 'left', 0 - args.extra),\n k2: (hdim < 3) ? 1 : this.getSelectIndex('z', 'right', 1 + args.right_extra),\n stepi: 1, stepj: 1, stepk: 1,\n min: 0, max: 0, sumz: 0, xbar1: 0, xbar2: 1, ybar1: 0, ybar2: 1\n };\n\n if (this.isDisplayItem() && histo.fIndicies) {\n if (res.i1 < histo.fIndicies[0]) { res.i1 = histo.fIndicies[0]; res.incomplete = true; }\n if (res.i2 > histo.fIndicies[1]) { res.i2 = histo.fIndicies[1]; res.incomplete = true; }\n res.stepi = histo.fIndicies[2];\n if (res.stepi > 1) res.incomplete = true;\n if ((hdim > 1) && (histo.fIndicies.length > 5)) {\n if (res.j1 < histo.fIndicies[3]) { res.j1 = histo.fIndicies[3]; res.incomplete = true; }\n if (res.j2 > histo.fIndicies[4]) { res.j2 = histo.fIndicies[4]; res.incomplete = true; }\n res.stepj = histo.fIndicies[5];\n if (res.stepj > 1) res.incomplete = true;\n }\n if ((hdim > 2) && (histo.fIndicies.length > 8)) {\n if (res.k1 < histo.fIndicies[6]) { res.k1 = histo.fIndicies[6]; res.incomplete = true; }\n if (res.k2 > histo.fIndicies[7]) { res.k2 = histo.fIndicies[7]; res.incomplete = true; }\n res.stepk = histo.fIndicies[8];\n if (res.stepk > 1) res.incomplete = true;\n }\n }\n\n if (args.only_indexes) return res;\n\n // no need for Float32Array, plain Array is 10% faster\n // reserve more places to avoid complex boundary checks\n\n res.grx = new Array(res.i2+res.stepi+1);\n res.gry = new Array(res.j2+res.stepj+1);\n\n if (args.original) {\n res.original = true;\n res.origx = new Array(res.i2+1);\n res.origy = new Array(res.j2+1);\n }\n\n if (args.pixel_density) args.rounding = true;\n\n let funcs = pmain.getGrFuncs(this.options.second_x, this.options.second_y);\n\n // calculate graphical coordinates in advance\n for (i = res.i1; i <= res.i2; ++i) {\n x = xaxis.GetBinCoord(i + args.middle);\n if (funcs.logx && (x <= 0)) { res.i1 = i+1; continue; }\n if (res.origx) res.origx[i] = x;\n res.grx[i] = funcs.grx(x);\n if (args.rounding) res.grx[i] = Math.round(res.grx[i]);\n\n if (args.use3d) {\n if (res.grx[i] < -pmain.size_x3d) { res.i1 = i; res.grx[i] = -pmain.size_x3d; }\n if (res.grx[i] > pmain.size_x3d) { res.i2 = i; res.grx[i] = pmain.size_x3d; }\n }\n }\n\n if (args.use3d) {\n if ((res.i1 < res.i2-2) && (res.grx[res.i1] == res.grx[res.i1+1])) res.i1++;\n if ((res.i1 < res.i2-2) && (res.grx[res.i2-1] == res.grx[res.i2])) res.i2--;\n }\n\n // copy last valid value to higher indicies\n while (i < res.i2 + res.stepi + 1)\n res.grx[i++] = res.grx[res.i2];\n\n if (hdim === 1) {\n res.gry[0] = funcs.gry(0);\n res.gry[1] = funcs.gry(1);\n } else\n for (j = res.j1; j <= res.j2; ++j) {\n y = yaxis.GetBinCoord(j + args.middle);\n if (funcs.logy && (y <= 0)) { res.j1 = j+1; continue; }\n if (res.origy) res.origy[j] = y;\n res.gry[j] = funcs.gry(y);\n if (args.rounding) res.gry[j] = Math.round(res.gry[j]);\n\n if (args.use3d) {\n if (res.gry[j] < -pmain.size_y3d) { res.j1 = j; res.gry[j] = -pmain.size_y3d; }\n if (res.gry[j] > pmain.size_y3d) { res.j2 = j; res.gry[j] = pmain.size_y3d; }\n }\n }\n\n if (args.use3d && (hdim > 1)) {\n if ((res.j1 < res.j2-2) && (res.gry[res.j1] == res.gry[res.j1+1])) res.j1++;\n if ((res.j1 < res.j2-2) && (res.gry[res.j2-1] == res.gry[res.j2])) res.j2--;\n }\n\n // copy last valid value to higher indicies\n while ((hdim > 1) && (j < res.j2 + res.stepj + 1))\n res.gry[j++] = res.gry[res.j2];\n\n // find min/max values in selected range\n this.maxbin = this.minbin = this.minposbin = null;\n\n for (i = res.i1; i < res.i2; i += res.stepi) {\n for (j = res.j1; j < res.j2; j += res.stepj) {\n binz = histo.getBinContent(i + 1, j + 1);\n if (!Number.isFinite(binz)) continue;\n res.sumz += binz;\n if (args.pixel_density) {\n binarea = (res.grx[i+res.stepi]-res.grx[i])*(res.gry[j]-res.gry[j+res.stepj]);\n if (binarea <= 0) continue;\n res.max = Math.max(res.max, binz);\n if ((binz > 0) && ((binz < res.min) || (res.min === 0))) res.min = binz;\n binz = binz/binarea;\n }\n if (this.maxbin === null) {\n this.maxbin = this.minbin = binz;\n } else {\n this.maxbin = Math.max(this.maxbin, binz);\n this.minbin = Math.min(this.minbin, binz);\n }\n if (binz > 0)\n if ((this.minposbin === null) || (binz < this.minposbin)) this.minposbin = binz;\n }\n }\n\n res.palette = pmain.getHistPalette();\n\n if (res.palette)\n this.createContour(pmain, res.palette, args);\n\n return res;\n }\n\n} // class RHistPainter\n\nexport { RHistPainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file +{"version":3,"file":"172.e4469fbbca37f633.js","mappings":"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","names":["assignRAxisMethods","axis","_typename","fInvBinWidth","$dummy","fNBinsNoOver","fLow","min","max","GetNumBins","this","GetBinCoord","bin","FindBin","x","add","Math","floor","fBinBorders","length","indx","round","indx2","abs","k","GetBinCenter","GetBinLowEdge","getHImpl","obj","fHistImpl","fIO","RHistPainter","RObjectPainter","constructor","dom","histo","super","csstype","draw_content","nbinsx","nbinsy","accept_drops","mode3d","getHisto","isDisplayItem","getObject","fAxes","force","getBinContent","nx","fIndicies","dx","stepx","ny","dy","stepy","nz","dz","stepz","getBin","y","z","getBin0","fBinContent","getBinError","sqrt","_2","_0","_1","fStatistics","fSumWeightsSquared","decodeOptions","options","Hist","copyOptionsFrom","src","Mode3D","copyOptionsToOthers","forEachPainter","painter","isFunc","clear3DScene","fp","getFramePainter","create3DScene","cleanup","getDimension","scanContent","drawFrameAxes","main","_this","isMainPainter","cleanupAxes","xmin","xmax","ymin","ymax","zmin","zmax","setAxesRanges","getAxis","drawAxes","second_x","second_y","setAxes2Ranges","drawAxes2","createHistDrawAttributes","createv7AttFill","createv7AttLine","updateDisplayItem","fContMin","fContMinPos","fContMax","updateObject","origin","matchObjectType","horigin","hobj","fTitle","histogram_updated","name","getAxisBinTip","step","pmain","handle","x1","kind","axisAsText","x2","extractAxesProperties","ndim","nbinsz","addInteractivity","ismain","second_axis","processItemReply","reply","req","console","error","reqid","current_item_reqid","item","resolveFunc","drawingBins","reason","is_axes_zoomed","isStr","indexOf","_this2","v7NormalMode","prepareDraw","only_indexes","incomplete","Promise","v7SubmitRequest","bind","setTimeout","toggleStat","getSelectIndex","size","taxis","nbins","autoZoom","clickButton","funcname","zoom_xmin","zoom_xmax","zoom_ymin","zoom_ymax","zoom_zmin","zoom_zmax","unzoom","zoomChangedInteractive","toggleAxisLog","fillToolbar","not_shown","pp","getPadPainter","addPadButton","showPadButtons","get3DToolTip","tip","fName","title","ix","iy","value","lines","getBinTooltips","iz","createContour","palette","args","nlevels","gStyle","minbin","maxbin","zminpos","minposbin","scatter_plot","gminbin","gmaxbin","gminposbin","full_z_range","setFullRange","logz","scale_zmin","colzmin","scale_zmax","colzmax","changeValuesRange","menu","arg","prefix","isAxisZoomed","input","then","res","JSON","parse","isObject","Number","isFinite","zoom","fillContextMenu","addchk","fillHistContextMenu","getMainPainter","isTooltipAllowed","setTooltipAllowed","enable_highlight","highlightBin3D","render3D","FrontBox","BackBox","Zero","redrawPad","Lego","fillPaletteMenu","control","reset","addAttributesMenu","updatePaletteDraw","findPainterFor","undefined","drawPalette","addPaletteMenu","Palette","settings","parseInt","redraw","toggleMode3D","Surf","Error","Color","interactiveRedraw","rounding","extra","middle","right_extra","i","j","binz","binarea","xaxis","yaxis","hdim","i1","i2","j1","j2","k1","k2","stepi","stepj","stepk","sumz","xbar1","xbar2","ybar1","ybar2","grx","Array","gry","original","origx","origy","pixel_density","funcs","getGrFuncs","logx","use3d","size_x3d","logy","size_y3d","getHistPalette"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/hist2d/RHistPainter.mjs"],"sourcesContent":["import { gStyle, settings, isObject, isFunc, isStr } from '../core.mjs';\nimport { RObjectPainter } from '../base/RObjectPainter.mjs';\n\n\n/** @summary assign methods for the RAxis objects\n * @private */\nfunction assignRAxisMethods(axis) {\n if ((axis._typename == 'ROOT::Experimental::RAxisEquidistant') || (axis._typename == 'ROOT::Experimental::RAxisLabels')) {\n if (axis.fInvBinWidth === 0) {\n axis.$dummy = true;\n axis.fInvBinWidth = 1;\n axis.fNBinsNoOver = 0;\n axis.fLow = 0;\n }\n\n axis.min = axis.fLow;\n axis.max = axis.fLow + axis.fNBinsNoOver/axis.fInvBinWidth;\n axis.GetNumBins = function() { return this.fNBinsNoOver; }\n axis.GetBinCoord = function(bin) { return this.fLow + bin/this.fInvBinWidth; }\n axis.FindBin = function(x,add) { return Math.floor((x - this.fLow)*this.fInvBinWidth + add); }\n } else if (axis._typename == 'ROOT::Experimental::RAxisIrregular') {\n axis.min = axis.fBinBorders[0];\n axis.max = axis.fBinBorders[axis.fBinBorders.length - 1];\n axis.GetNumBins = function() { return this.fBinBorders.length; }\n axis.GetBinCoord = function(bin) {\n let indx = Math.round(bin);\n if (indx <= 0) return this.fBinBorders[0];\n if (indx >= this.fBinBorders.length) return this.fBinBorders[this.fBinBorders.length - 1];\n if (indx==bin) return this.fBinBorders[indx];\n let indx2 = (bin < indx) ? indx - 1 : indx + 1;\n return this.fBinBorders[indx] * Math.abs(bin-indx2) + this.fBinBorders[indx2] * Math.abs(bin-indx);\n }\n axis.FindBin = function(x,add) {\n for (let k = 1; k < this.fBinBorders.length; ++k)\n if (x < this.fBinBorders[k]) return Math.floor(k-1+add);\n return this.fBinBorders.length - 1;\n }\n }\n\n // to support some code from ROOT6 drawing\n\n axis.GetBinCenter = function(bin) { return this.GetBinCoord(bin-0.5); }\n axis.GetBinLowEdge = function(bin) { return this.GetBinCoord(bin-1); }\n}\n\n/** @summary Returns real histogram impl\n * @private */\nfunction getHImpl(obj) {\n return (obj && obj.fHistImpl) ? obj.fHistImpl.fIO : null;\n}\n\n\n/** @summary Base painter class for RHist objects\n *\n * @private\n */\n\nclass RHistPainter extends RObjectPainter {\n\n /** @summary Constructor\n * @param {object|string} dom - DOM element for drawing or element id\n * @param {object} histo - RHist object */\n constructor(dom, histo) {\n super(dom, histo);\n this.csstype = 'hist';\n this.draw_content = true;\n this.nbinsx = 0;\n this.nbinsy = 0;\n this.accept_drops = true; // indicate that one can drop other objects like doing Draw('same')\n this.mode3d = false;\n\n // initialize histogram methods\n this.getHisto(true);\n }\n\n /** @summary Returns true if RHistDisplayItem is used */\n isDisplayItem() {\n let obj = this.getObject();\n return obj && obj.fAxes ? true : false;\n }\n\n /** @summary get histogram */\n getHisto(force) {\n let obj = this.getObject(), histo = getHImpl(obj);\n\n if (histo && (!histo.getBinContent || force)) {\n if (histo.fAxes._2) {\n assignRAxisMethods(histo.fAxes._0);\n assignRAxisMethods(histo.fAxes._1);\n assignRAxisMethods(histo.fAxes._2);\n histo.getBin = function(x, y, z) { return (x-1) + this.fAxes._0.GetNumBins()*(y-1) + this.fAxes._0.GetNumBins()*this.fAxes._1.GetNumBins()*(z-1); }\n // FIXME: all normal ROOT methods uses indx+1 logic, but RHist has no underflow/overflow bins now\n histo.getBinContent = function(x, y, z) { return this.fStatistics.fBinContent[this.getBin(x, y, z)]; }\n histo.getBinError = function(x, y, z) {\n let bin = this.getBin(x, y, z);\n if (this.fStatistics.fSumWeightsSquared)\n return Math.sqrt(this.fStatistics.fSumWeightsSquared[bin]);\n return Math.sqrt(Math.abs(this.fStatistics.fBinContent[bin]));\n }\n } else if (histo.fAxes._1) {\n assignRAxisMethods(histo.fAxes._0);\n assignRAxisMethods(histo.fAxes._1);\n histo.getBin = function(x, y) { return (x-1) + this.fAxes._0.GetNumBins()*(y-1); }\n // FIXME: all normal ROOT methods uses indx+1 logic, but RHist has no underflow/overflow bins now\n histo.getBinContent = function(x, y) { return this.fStatistics.fBinContent[this.getBin(x, y)]; }\n histo.getBinError = function(x, y) {\n let bin = this.getBin(x, y);\n if (this.fStatistics.fSumWeightsSquared)\n return Math.sqrt(this.fStatistics.fSumWeightsSquared[bin]);\n return Math.sqrt(Math.abs(this.fStatistics.fBinContent[bin]));\n }\n } else {\n assignRAxisMethods(histo.fAxes._0);\n histo.getBin = function(x) { return x-1; }\n // FIXME: all normal ROOT methods uses indx+1 logic, but RHist has no underflow/overflow bins now\n histo.getBinContent = function(x) { return this.fStatistics.fBinContent[x-1]; }\n histo.getBinError = function(x) {\n if (this.fStatistics.fSumWeightsSquared)\n return Math.sqrt(this.fStatistics.fSumWeightsSquared[x-1]);\n return Math.sqrt(Math.abs(this.fStatistics.fBinContent[x-1]));\n }\n }\n } else if (!histo && obj && obj.fAxes) {\n // case of RHistDisplayItem\n\n histo = obj;\n\n if (!histo.getBinContent || force) {\n if (histo.fAxes.length == 3) {\n assignRAxisMethods(histo.fAxes[0]);\n assignRAxisMethods(histo.fAxes[1]);\n assignRAxisMethods(histo.fAxes[2]);\n\n histo.nx = histo.fIndicies[1] - histo.fIndicies[0];\n histo.dx = histo.fIndicies[0] + 1;\n histo.stepx = histo.fIndicies[2];\n\n histo.ny = histo.fIndicies[4] - histo.fIndicies[3];\n histo.dy = histo.fIndicies[3] + 1;\n histo.stepy = histo.fIndicies[5];\n\n histo.nz = histo.fIndicies[7] - histo.fIndicies[6];\n histo.dz = histo.fIndicies[6] + 1;\n histo.stepz = histo.fIndicies[8];\n\n // this is index in original histogram\n histo.getBin = function(x, y, z) { return (x-1) + this.fAxes[0].GetNumBins()*(y-1) + this.fAxes[0].GetNumBins()*this.fAxes[1].GetNumBins()*(z-1); }\n\n // this is index in current available data\n if ((histo.stepx > 1) || (histo.stepy > 1) || (histo.stepz > 1))\n histo.getBin0 = function(x, y, z) { return Math.floor((x-this.dx)/this.stepx) + this.nx/this.stepx*Math.floor((y-this.dy)/this.stepy) + this.nx/this.stepx*this.ny/this.stepy*Math.floor((z-this.dz)/this.stepz); }\n else\n histo.getBin0 = function(x, y, z) { return (x-this.dx) + this.nx*(y-this.dy) + this.nx*this.ny*(z-dz); }\n\n histo.getBinContent = function(x, y, z) { return this.fBinContent[this.getBin0(x, y, z)]; }\n histo.getBinError = function(x, y, z) { return Math.sqrt(Math.abs(this.getBinContent(x, y, z))); }\n\n\n } else if (histo.fAxes.length == 2) {\n assignRAxisMethods(histo.fAxes[0]);\n assignRAxisMethods(histo.fAxes[1]);\n\n histo.nx = histo.fIndicies[1] - histo.fIndicies[0];\n histo.dx = histo.fIndicies[0] + 1;\n histo.stepx = histo.fIndicies[2];\n\n histo.ny = histo.fIndicies[4] - histo.fIndicies[3];\n histo.dy = histo.fIndicies[3] + 1;\n histo.stepy = histo.fIndicies[5];\n\n // this is index in original histogram\n histo.getBin = function(x, y) { return (x-1) + this.fAxes[0].GetNumBins()*(y-1); }\n\n // this is index in current available data\n if ((histo.stepx > 1) || (histo.stepy > 1))\n histo.getBin0 = function(x, y) { return Math.floor((x-this.dx)/this.stepx) + this.nx/this.stepx*Math.floor((y-this.dy)/this.stepy); }\n else\n histo.getBin0 = function(x, y) { return (x-this.dx) + this.nx*(y-this.dy); }\n\n histo.getBinContent = function(x, y) { return this.fBinContent[this.getBin0(x, y)]; }\n histo.getBinError = function(x, y) { return Math.sqrt(Math.abs(this.getBinContent(x, y))); }\n } else {\n assignRAxisMethods(histo.fAxes[0]);\n histo.nx = histo.fIndicies[1] - histo.fIndicies[0];\n histo.dx = histo.fIndicies[0] + 1;\n histo.stepx = histo.fIndicies[2];\n\n histo.getBin = function(x) { return x-1; }\n if (histo.stepx > 1)\n histo.getBin0 = function(x) { return Math.floor((x-this.dx)/this.stepx); }\n else\n histo.getBin0 = function(x) { return x-this.dx; }\n histo.getBinContent = function(x) { return this.fBinContent[this.getBin0(x)]; }\n histo.getBinError = function(x) { return Math.sqrt(Math.abs(this.getBinContent(x))); }\n }\n }\n }\n return histo;\n }\n\n /** @summary Decode options */\n decodeOptions(/*opt*/) {\n if (!this.options) this.options = { Hist : 1 };\n }\n\n /** @summary Copy draw options from other painter */\n copyOptionsFrom(src) {\n if (src === this) return;\n let o = this.options, o0 = src.options;\n o.Mode3D = o0.Mode3D;\n }\n\n /** @summary copy draw options to all other histograms in the pad*/\n copyOptionsToOthers() {\n this.forEachPainter(painter => {\n if ((painter !== this) && isFunc(painter.copyOptionsFrom))\n painter.copyOptionsFrom(this);\n }, 'objects');\n }\n\n /** @summary Clear 3d drawings - if any */\n clear3DScene() {\n let fp = this.getFramePainter();\n if (isFunc(fp?.create3DScene))\n fp.create3DScene(-1);\n this.mode3d = false;\n }\n\n /** @summary Cleanup hist painter */\n cleanup() {\n this.clear3DScene();\n\n delete this.options;\n\n super.cleanup();\n }\n\n /** @summary Returns histogram dimension */\n getDimension() { return 1; }\n\n /** @summary Scan histogram content\n * @abstract */\n scanContent(/*when_axis_changed*/) {\n // function will be called once new histogram or\n // new histogram content is assigned\n // one should find min,max,nbins, maxcontent values\n // if when_axis_changed === true specified, content will be scanned after axis zoom changed\n }\n\n /** @summary Draw axes */\n async drawFrameAxes() {\n // return true when axes was drawn\n let main = this.getFramePainter();\n if (!main)\n return false;\n\n if (!this.draw_content)\n return true;\n\n if (!this.isMainPainter()) {\n if (!this.options.second_x && !this.options.second_y)\n return true;\n\n main.setAxes2Ranges(this.options.second_x, this.getAxis('x'), this.xmin, this.xmax, this.options.second_y, this.getAxis('y'), this.ymin, this.ymax);\n return main.drawAxes2(this.options.second_x, this.options.second_y);\n }\n\n main.cleanupAxes();\n main.xmin = main.xmax = 0;\n main.ymin = main.ymax = 0;\n main.zmin = main.zmax = 0;\n main.setAxesRanges(this.getAxis('x'), this.xmin, this.xmax, this.getAxis('y'), this.ymin, this.ymax, this.getAxis('z'), this.zmin, this.zmax);\n return main.drawAxes();\n }\n\n /** @summary create attributes */\n createHistDrawAttributes() {\n this.createv7AttFill();\n this.createv7AttLine();\n }\n\n /** @summary update display item */\n updateDisplayItem(obj, src) {\n if (!obj || !src) return false;\n\n obj.fAxes = src.fAxes;\n obj.fIndicies = src.fIndicies;\n obj.fBinContent = src.fBinContent;\n obj.fContMin = src.fContMin;\n obj.fContMinPos = src.fContMinPos;\n obj.fContMax = src.fContMax;\n\n // update histogram attributes\n this.getHisto(true);\n\n return true;\n }\n\n /** @summary update histogram object */\n updateObject(obj /*, opt*/) {\n\n let origin = this.getObject();\n\n if (obj !== origin) {\n\n if (!this.matchObjectType(obj)) return false;\n\n if (this.isDisplayItem()) {\n\n this.updateDisplayItem(origin, obj);\n\n } else {\n\n let horigin = getHImpl(origin),\n hobj = getHImpl(obj);\n\n if (!horigin || !hobj) return false;\n\n // make it easy - copy statistics without axes\n horigin.fStatistics = hobj.fStatistics;\n\n origin.fTitle = obj.fTitle;\n }\n }\n\n this.scanContent();\n\n this.histogram_updated = true; // indicate that object updated\n\n return true;\n }\n\n /** @summary Get axis object */\n getAxis(name) {\n let histo = this.getHisto(), obj = this.getObject(), axis = null;\n\n if (obj && obj.fAxes) {\n switch(name) {\n case 'x': axis = obj.fAxes[0]; break;\n case 'y': axis = obj.fAxes[1]; break;\n case 'z': axis = obj.fAxes[2]; break;\n default: axis = obj.fAxes[0]; break;\n }\n } else if (histo && histo.fAxes) {\n switch(name) {\n case 'x': axis = histo.fAxes._0; break;\n case 'y': axis = histo.fAxes._1; break;\n case 'z': axis = histo.fAxes._2; break;\n default: axis = histo.fAxes._0; break;\n }\n }\n\n if (axis && !axis.GetBinCoord)\n assignRAxisMethods(axis);\n\n return axis;\n }\n\n /** @summary Get tip text for axis bin */\n getAxisBinTip(name, bin, step) {\n let pmain = this.getFramePainter(),\n handle = pmain[name+'_handle'],\n axis = this.getAxis(name),\n x1 = axis.GetBinCoord(bin);\n\n if (handle.kind === 'labels')\n return pmain.axisAsText(name, x1);\n\n let x2 = axis.GetBinCoord(bin+(step || 1));\n\n if (handle.kind === 'time')\n return pmain.axisAsText(name, (x1+x2)/2);\n\n return '[' + pmain.axisAsText(name, x1) + ', ' + pmain.axisAsText(name, x2) + ')';\n }\n\n /** @summary Extract axes ranges and bins numbers\n * @desc Also here ensured that all axes objects got their necessary methods */\n extractAxesProperties(ndim) {\n\n let histo = this.getHisto();\n if (!histo) return;\n\n this.nbinsx = this.nbinsy = this.nbinsz = 0;\n\n let axis = this.getAxis('x');\n this.nbinsx = axis.GetNumBins();\n this.xmin = axis.min;\n this.xmax = axis.max;\n\n if (ndim < 2) return;\n axis = this.getAxis('y');\n this.nbinsy = axis.GetNumBins();\n this.ymin = axis.min;\n this.ymax = axis.max;\n\n if (ndim < 3) return;\n axis = this.getAxis('z');\n this.nbinsz = axis.GetNumBins();\n this.zmin = axis.min;\n this.zmax = axis.max;\n }\n\n /** @summary Add interactive features, only main painter does it */\n addInteractivity() {\n // only first painter in list allowed to add interactive functionality to the frame\n\n let ismain = this.isMainPainter(),\n second_axis = this.options.second_x || this.options.second_y,\n fp = ismain || second_axis ? this.getFramePainter() : null;\n return fp ? fp.addInteractivity(!ismain && second_axis) : true;\n }\n\n /** @summary Process item reply */\n processItemReply(reply, req) {\n if (!this.isDisplayItem())\n return console.error('Get item when display normal histogram');\n\n if (req.reqid === this.current_item_reqid) {\n\n if (reply !== null) {\n this.updateDisplayItem(this.getObject(), reply.item);\n }\n\n req.resolveFunc(true);\n }\n }\n\n /** @summary Special method to request bins from server if existing data insufficient\n * @return {Promise} when ready */\n async drawingBins(reason) {\n\n let is_axes_zoomed = false;\n if (reason && isStr(reason) && (reason.indexOf('zoom') == 0)) {\n if (reason.indexOf('0') > 0) is_axes_zoomed = true;\n if ((this.getDimension() > 1) && (reason.indexOf('1') > 0)) is_axes_zoomed = true;\n if ((this.getDimension() > 2) && (reason.indexOf('2') > 0)) is_axes_zoomed = true;\n }\n\n if (this.isDisplayItem() && is_axes_zoomed && this.v7NormalMode()) {\n\n let handle = this.prepareDraw({ only_indexes: true });\n\n // submit request if histogram data not enough for display\n if (handle.incomplete)\n return new Promise(resolveFunc => {\n // use empty kind to always submit request\n let req = this.v7SubmitRequest('', { _typename: 'ROOT::Experimental::RHistDrawableBase::RRequest' },\n this.processItemReply.bind(this));\n if (req) {\n this.current_item_reqid = req.reqid; // ignore all previous requests, only this one will be processed\n req.resolveFunc = resolveFunc;\n setTimeout(this.processItemReply.bind(this, null, req), 1000); // after 1 s draw something that we can\n } else {\n resolveFunc(true);\n }\n });\n }\n\n return true;\n }\n\n /** @summary Toggle statbox drawing\n * @desc Not yet implemented */\n toggleStat(/*arg*/) {}\n\n /** @summary get selected index for axis */\n getSelectIndex(axis, size, add) {\n // be aware - here indexes starts from 0\n let indx = 0,\n taxis = this.getAxis(axis),\n nbins = this['nbins'+axis] || 0;\n\n if (this.options.second_x && axis == 'x') axis = 'x2';\n if (this.options.second_y && axis == 'y') axis = 'y2';\n\n let main = this.getFramePainter(),\n min = main ? main['zoom_' + axis + 'min'] : 0,\n max = main ? main['zoom_' + axis + 'max'] : 0;\n\n if ((min !== max) && taxis) {\n if (size == 'left')\n indx = taxis.FindBin(min, add || 0);\n else\n indx = taxis.FindBin(max, (add || 0) + 0.5);\n if (indx < 0) indx = 0; else if (indx>nbins) indx = nbins;\n } else {\n indx = (size == 'left') ? 0 : nbins;\n }\n\n return indx;\n }\n\n /** @summary Auto zoom into histogram non-empty range\n * @abstract */\n autoZoom() {}\n\n /** @summary Process click on histogram-defined buttons */\n clickButton(funcname) {\n // TODO: move to frame painter\n switch(funcname) {\n case 'ToggleZoom':\n if ((this.zoom_xmin !== this.zoom_xmax) || (this.zoom_ymin !== this.zoom_ymax) || (this.zoom_zmin !== this.zoom_zmax)) {\n this.unzoom();\n this.getFramePainter().zoomChangedInteractive('reset');\n return true;\n }\n if (this.draw_content) {\n this.autoZoom();\n return true;\n }\n break;\n case 'ToggleLogX': this.getFramePainter().toggleAxisLog('x'); break;\n case 'ToggleLogY': this.getFramePainter().toggleAxisLog('y'); break;\n case 'ToggleLogZ': this.getFramePainter().toggleAxisLog('z'); break;\n case 'ToggleStatBox': this.toggleStat(); return true;\n }\n return false;\n }\n\n /** @summary Fill pad toolbar with hist-related functions */\n fillToolbar(not_shown) {\n let pp = this.getPadPainter();\n if (!pp) return;\n\n pp.addPadButton('auto_zoom', 'Toggle between unzoom and autozoom-in', 'ToggleZoom', 'Ctrl *');\n pp.addPadButton('arrow_right', 'Toggle log x', 'ToggleLogX', 'PageDown');\n pp.addPadButton('arrow_up', 'Toggle log y', 'ToggleLogY', 'PageUp');\n if (this.getDimension() > 1)\n pp.addPadButton('arrow_diag', 'Toggle log z', 'ToggleLogZ');\n if (this.draw_content)\n pp.addPadButton('statbox', 'Toggle stat box', 'ToggleStatBox');\n if (!not_shown) pp.showPadButtons();\n }\n\n /** @summary get tool tips used in 3d mode */\n get3DToolTip(indx) {\n let histo = this.getHisto(),\n tip = { bin: indx, name: histo.fName || 'histo', title: histo.fTitle };\n switch (this.getDimension()) {\n case 1:\n tip.ix = indx + 1; tip.iy = 1;\n tip.value = histo.getBinContent(tip.ix);\n tip.error = histo.getBinError(tip.ix);\n tip.lines = this.getBinTooltips(indx-1);\n break;\n case 2:\n tip.ix = (indx % this.nbinsx) + 1;\n tip.iy = (indx - (tip.ix - 1)) / this.nbinsx + 1;\n tip.value = histo.getBinContent(tip.ix, tip.iy);\n tip.error = histo.getBinError(tip.ix, tip.iy);\n tip.lines = this.getBinTooltips(tip.ix-1, tip.iy-1);\n break;\n case 3:\n tip.ix = indx % this.nbinsx + 1;\n tip.iy = ((indx - (tip.ix - 1)) / this.nbinsx) % this.nbinsy + 1;\n tip.iz = (indx - (tip.ix - 1) - (tip.iy - 1) * this.nbinsx) / this.nbinsx / this.nbinsy + 1;\n tip.value = histo.getBinContent(tip.ix, tip.iy, tip.iz);\n tip.error = histo.getBinError(tip.ix, tip.iy, tip.iz);\n tip.lines = this.getBinTooltips(tip.ix-1, tip.iy-1, tip.iz-1);\n break;\n }\n\n return tip;\n }\n\n /** @summary Create contour levels for currently selected Z range */\n createContour(main, palette, args) {\n if (!main || !palette) return;\n\n if (!args) args = {};\n\n let nlevels = gStyle.fNumberContours,\n zmin = this.minbin, zmax = this.maxbin, zminpos = this.minposbin;\n\n if (args.scatter_plot) {\n if (nlevels > 50) nlevels = 50;\n zmin = this.minposbin;\n }\n\n if (zmin === zmax) { zmin = this.gminbin; zmax = this.gmaxbin; zminpos = this.gminposbin; }\n\n if (this.getDimension() < 3) {\n if (main.zoom_zmin !== main.zoom_zmax) {\n zmin = main.zoom_zmin;\n zmax = main.zoom_zmax;\n } else if (args.full_z_range) {\n zmin = main.zmin;\n zmax = main.zmax;\n }\n }\n\n palette.setFullRange(main.zmin, main.zmax);\n palette.createContour(main.logz, nlevels, zmin, zmax, zminpos);\n\n if (this.getDimension() < 3) {\n main.scale_zmin = palette.colzmin;\n main.scale_zmax = palette.colzmax;\n }\n }\n\n /** @summary Start dialog to modify range of axis where histogram values are displayed */\n changeValuesRange(menu, arg) {\n let pmain = this.getFramePainter();\n if (!pmain) return;\n let prefix = pmain.isAxisZoomed(arg) ? 'zoom_' + arg : arg,\n curr = '[' + pmain[prefix+'min'] + ',' + pmain[prefix+'max'] + ']';\n menu.input('Enter values range for axis ' + arg + ' like [0,100] or empty string to unzoom', curr).then(res => {\n res = res ? JSON.parse(res) : [];\n if (!isObject(res) || (res.length != 2) || !Number.isFinite(res[0]) || !Number.isFinite(res[1]))\n pmain.unzoom(arg);\n else\n pmain.zoom(arg, res[0], res[1]);\n });\n }\n\n /** @summary Fill histogram context menu */\n fillContextMenu(menu) {\n\n menu.add('header:v7histo::anyname');\n\n if (this.draw_content) {\n menu.addchk(this.toggleStat('only-check'), 'Show statbox', () => this.toggleStat());\n\n if (this.getDimension() == 2)\n menu.add('Values range', () => this.changeValuesRange(menu, 'z'));\n\n if (isFunc(this.fillHistContextMenu))\n this.fillHistContextMenu(menu);\n }\n\n let fp = this.getFramePainter();\n\n if (this.options.Mode3D) {\n // menu for 3D drawings\n\n if (menu.size() > 0)\n menu.add('separator');\n\n let main = this.getMainPainter() || this;\n\n menu.addchk(main.isTooltipAllowed(), 'Show tooltips', () => main.setTooltipAllowed('toggle'));\n\n menu.addchk(fp.enable_highlight, 'Highlight bins', () => {\n fp.enable_highlight = !fp.enable_highlight;\n if (!fp.enable_highlight && main.highlightBin3D && main.mode3d) main.highlightBin3D(null);\n });\n\n if (isFunc(fp?.render3D)) {\n menu.addchk(main.options.FrontBox, 'Front box', () => {\n main.options.FrontBox = !main.options.FrontBox;\n fp.render3D();\n });\n menu.addchk(main.options.BackBox, 'Back box', () => {\n main.options.BackBox = !main.options.BackBox;\n fp.render3D();\n });\n }\n\n if (this.draw_content) {\n menu.addchk(!this.options.Zero, 'Suppress zeros', () => {\n this.options.Zero = !this.options.Zero;\n this.redrawPad();\n });\n\n if ((this.options.Lego == 12) || (this.options.Lego == 14)) {\n if (this.fillPaletteMenu)\n this.fillPaletteMenu(menu);\n }\n }\n\n if (isFunc(main.control?.reset))\n menu.add('Reset camera', () => main.control.reset());\n }\n\n menu.addAttributesMenu(this);\n\n if (this.histogram_updated && fp.zoomChangedInteractive())\n menu.add('Let update zoom', () => fp.zoomChangedInteractive('reset'));\n\n return true;\n }\n\n /** @summary Update palette drawing */\n updatePaletteDraw() {\n if (this.isMainPainter())\n this.getPadPainter().findPainterFor(undefined, undefined, 'ROOT::Experimental::RPaletteDrawable')?.drawPalette();\n }\n\n /** @summary Fill menu entries for palette */\n fillPaletteMenu(menu) {\n menu.addPaletteMenu(this.options.Palette || settings.Palette, arg => {\n // TODO: rewrite for RPalette functionality\n this.options.Palette = parseInt(arg);\n this.redraw(); // redraw histogram\n });\n }\n\n /** @summary Toggle 3D drawing mode */\n toggleMode3D() {\n this.options.Mode3D = !this.options.Mode3D;\n\n if (this.options.Mode3D) {\n if (!this.options.Surf && !this.options.Lego && !this.options.Error) {\n if ((this.nbinsx>=50) || (this.nbinsy>=50))\n this.options.Lego = this.options.Color ? 14 : 13;\n else\n this.options.Lego = this.options.Color ? 12 : 1;\n\n this.options.Zero = false; // do not show zeros by default\n }\n }\n\n this.copyOptionsToOthers();\n this.interactiveRedraw('pad', 'drawopt');\n }\n\n /** @summary Calculate histogram inidicies and axes values for each visible bin */\n prepareDraw(args) {\n\n if (!args) args = { rounding: true, extra: 0, middle: 0 };\n\n if (args.extra === undefined) args.extra = 0;\n if (args.right_extra === undefined) args.right_extra = args.extra;\n if (args.middle === undefined) args.middle = 0;\n\n let histo = this.getHisto(), xaxis = this.getAxis('x'), yaxis = this.getAxis('y'),\n pmain = this.getFramePainter(),\n hdim = this.getDimension(),\n i, j, x, y, binz, binarea,\n res = {\n i1: this.getSelectIndex('x', 'left', 0 - args.extra),\n i2: this.getSelectIndex('x', 'right', 1 + args.right_extra),\n j1: (hdim < 2) ? 0 : this.getSelectIndex('y', 'left', 0 - args.extra),\n j2: (hdim < 2) ? 1 : this.getSelectIndex('y', 'right', 1 + args.right_extra),\n k1: (hdim < 3) ? 0 : this.getSelectIndex('z', 'left', 0 - args.extra),\n k2: (hdim < 3) ? 1 : this.getSelectIndex('z', 'right', 1 + args.right_extra),\n stepi: 1, stepj: 1, stepk: 1,\n min: 0, max: 0, sumz: 0, xbar1: 0, xbar2: 1, ybar1: 0, ybar2: 1\n };\n\n if (this.isDisplayItem() && histo.fIndicies) {\n if (res.i1 < histo.fIndicies[0]) { res.i1 = histo.fIndicies[0]; res.incomplete = true; }\n if (res.i2 > histo.fIndicies[1]) { res.i2 = histo.fIndicies[1]; res.incomplete = true; }\n res.stepi = histo.fIndicies[2];\n if (res.stepi > 1) res.incomplete = true;\n if ((hdim > 1) && (histo.fIndicies.length > 5)) {\n if (res.j1 < histo.fIndicies[3]) { res.j1 = histo.fIndicies[3]; res.incomplete = true; }\n if (res.j2 > histo.fIndicies[4]) { res.j2 = histo.fIndicies[4]; res.incomplete = true; }\n res.stepj = histo.fIndicies[5];\n if (res.stepj > 1) res.incomplete = true;\n }\n if ((hdim > 2) && (histo.fIndicies.length > 8)) {\n if (res.k1 < histo.fIndicies[6]) { res.k1 = histo.fIndicies[6]; res.incomplete = true; }\n if (res.k2 > histo.fIndicies[7]) { res.k2 = histo.fIndicies[7]; res.incomplete = true; }\n res.stepk = histo.fIndicies[8];\n if (res.stepk > 1) res.incomplete = true;\n }\n }\n\n if (args.only_indexes) return res;\n\n // no need for Float32Array, plain Array is 10% faster\n // reserve more places to avoid complex boundary checks\n\n res.grx = new Array(res.i2+res.stepi+1);\n res.gry = new Array(res.j2+res.stepj+1);\n\n if (args.original) {\n res.original = true;\n res.origx = new Array(res.i2+1);\n res.origy = new Array(res.j2+1);\n }\n\n if (args.pixel_density) args.rounding = true;\n\n let funcs = pmain.getGrFuncs(this.options.second_x, this.options.second_y);\n\n // calculate graphical coordinates in advance\n for (i = res.i1; i <= res.i2; ++i) {\n x = xaxis.GetBinCoord(i + args.middle);\n if (funcs.logx && (x <= 0)) { res.i1 = i+1; continue; }\n if (res.origx) res.origx[i] = x;\n res.grx[i] = funcs.grx(x);\n if (args.rounding) res.grx[i] = Math.round(res.grx[i]);\n\n if (args.use3d) {\n if (res.grx[i] < -pmain.size_x3d) { res.i1 = i; res.grx[i] = -pmain.size_x3d; }\n if (res.grx[i] > pmain.size_x3d) { res.i2 = i; res.grx[i] = pmain.size_x3d; }\n }\n }\n\n if (args.use3d) {\n if ((res.i1 < res.i2-2) && (res.grx[res.i1] == res.grx[res.i1+1])) res.i1++;\n if ((res.i1 < res.i2-2) && (res.grx[res.i2-1] == res.grx[res.i2])) res.i2--;\n }\n\n // copy last valid value to higher indicies\n while (i < res.i2 + res.stepi + 1)\n res.grx[i++] = res.grx[res.i2];\n\n if (hdim === 1) {\n res.gry[0] = funcs.gry(0);\n res.gry[1] = funcs.gry(1);\n } else\n for (j = res.j1; j <= res.j2; ++j) {\n y = yaxis.GetBinCoord(j + args.middle);\n if (funcs.logy && (y <= 0)) { res.j1 = j+1; continue; }\n if (res.origy) res.origy[j] = y;\n res.gry[j] = funcs.gry(y);\n if (args.rounding) res.gry[j] = Math.round(res.gry[j]);\n\n if (args.use3d) {\n if (res.gry[j] < -pmain.size_y3d) { res.j1 = j; res.gry[j] = -pmain.size_y3d; }\n if (res.gry[j] > pmain.size_y3d) { res.j2 = j; res.gry[j] = pmain.size_y3d; }\n }\n }\n\n if (args.use3d && (hdim > 1)) {\n if ((res.j1 < res.j2-2) && (res.gry[res.j1] == res.gry[res.j1+1])) res.j1++;\n if ((res.j1 < res.j2-2) && (res.gry[res.j2-1] == res.gry[res.j2])) res.j2--;\n }\n\n // copy last valid value to higher indicies\n while ((hdim > 1) && (j < res.j2 + res.stepj + 1))\n res.gry[j++] = res.gry[res.j2];\n\n // find min/max values in selected range\n this.maxbin = this.minbin = this.minposbin = null;\n\n for (i = res.i1; i < res.i2; i += res.stepi) {\n for (j = res.j1; j < res.j2; j += res.stepj) {\n binz = histo.getBinContent(i + 1, j + 1);\n if (!Number.isFinite(binz)) continue;\n res.sumz += binz;\n if (args.pixel_density) {\n binarea = (res.grx[i+res.stepi]-res.grx[i])*(res.gry[j]-res.gry[j+res.stepj]);\n if (binarea <= 0) continue;\n res.max = Math.max(res.max, binz);\n if ((binz > 0) && ((binz < res.min) || (res.min === 0))) res.min = binz;\n binz = binz/binarea;\n }\n if (this.maxbin === null) {\n this.maxbin = this.minbin = binz;\n } else {\n this.maxbin = Math.max(this.maxbin, binz);\n this.minbin = Math.min(this.minbin, binz);\n }\n if (binz > 0)\n if ((this.minposbin === null) || (binz < this.minposbin)) this.minposbin = binz;\n }\n }\n\n res.palette = pmain.getHistPalette();\n\n if (res.palette)\n this.createContour(pmain, res.palette, args);\n\n return res;\n }\n\n} // class RHistPainter\n\nexport { RHistPainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file diff --git a/docs/230.9df4c215ca49efed.js b/docs/230.9df4c215ca49efed.js new file mode 100644 index 000000000..052868f93 --- /dev/null +++ b/docs/230.9df4c215ca49efed.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[230],{4230:(b,T,h)=>{h.r(T),h.d(T,{TRatioPlotPainter:()=>z});var E=h(4788),p=h(9542),w=h(6458),X=h(49),L=h(4971);class z extends w.tK{setGridsRange(a,e){let l=this.getObject();if(a===e){let o=this.getPadPainter()?.findPainterFor(l.fLowerPad,"lower_pad",p.clTPad)?.getFramePainter()?.x_handle;if(!o)return;a=o.full_min,e=o.full_max}l.fGridlines.forEach(o=>{o.fX1=a,o.fX2=e})}redraw(){var a=this;return(0,E.Z)(function*(){let e=a.getObject(),l=a.getPadPainter(),o=l.findPainterFor(e.fTopPad,"top_pad",p.clTPad);o&&o.disablePadDrawing();let f=l.findPainterFor(e.fUpperPad,"upper_pad",p.clTPad),c=f?.getMainPainter(),i=f?.getFramePainter(),u=l.findPainterFor(e.fLowerPad,"lower_pad",p.clTPad),C=u?.getMainPainter(),r=u?.getFramePainter(),_=20,D=Promise.resolve(!0);if(f&&c&&i&&r&&!f._ratio_configured){f._ratio_configured=!0,c.options.Axis=0,_=c.getHisto().fYaxis.fLabelSize,_<1&&(_=Math.round(_*Math.min(f.getPadWidth(),f.getPadHeight())));let s=c.getHisto();s.fXaxis.fLabelSize=0,s.fXaxis.fTitle="",s.fYaxis.fLabelSize=_,s.fYaxis.fTitleSize=_,f.getRootPad().fTicky=1,D=f.redrawPad().then(()=>(i.o_zoom=i.zoom,i._ratio_low_fp=r,i._ratio_painter=a,i.zoom=function(P,g,n,d,t,m){return this._ratio_painter.setGridsRange(P,g),this._ratio_low_fp.o_zoom(P,g),this.o_zoom(P,g,n,d,t,m)},i.o_sizeChanged=i.sizeChanged,i.sizeChanged=function(){this.o_sizeChanged(),this._ratio_low_fp.fX1NDC=this.fX1NDC,this._ratio_low_fp.fX2NDC=this.fX2NDC,this._ratio_low_fp.o_sizeChanged()},!0))}return D.then(()=>{if(!u||!C||!r||!i||u._ratio_configured)return a;u._ratio_configured=!0,C.options.Axis=0;let s=C.getHisto();s.fXaxis.fTitle="x",s.fXaxis.fLabelSize=_,s.fXaxis.fTitleSize=_,s.fYaxis.fLabelSize=_,s.fYaxis.fTitleSize=_,u.getRootPad().fTicky=1,u.forEachPainterInPad(n=>{(0,p.isFunc)(n?.testEditable)&&n.testEditable(!1)});let g,P=[];return e.fGridlinePositions.length>0&&e.fGridlines.length{let d=!1;if(e.fGridlines.forEach(t=>{t.fY1==t.fY2&&Math.abs(t.fY1-n)<1e-6&&(d=!0)}),!d){let t=(0,p.create)(p.clTLine);t.fX1=i.scale_xmin,t.fX2=i.scale_xmax,t.fY1=t.fY2=n,t.fLineStyle=2,e.fGridlines.push(t),void 0===g&&(g=a.selectCurrentPad(e.fLowerPad.fName)),P.push((0,L.drawTLine)(a.getDom(),t))}}),Promise.all(P).then(()=>r.zoom(i.scale_xmin,i.scale_xmax)).then(()=>(r.o_zoom=r.zoom,r._ratio_up_fp=i,r._ratio_painter=a,r.zoom=function(n,d,t,m,M,O){return this._ratio_painter.setGridsRange(n,d),this._ratio_up_fp.o_zoom(n,d),this.o_zoom(n,d,t,m,M,O)},r.o_sizeChanged=r.sizeChanged,r.sizeChanged=function(){this.o_sizeChanged(),this._ratio_up_fp.fX1NDC=this.fX1NDC,this._ratio_up_fp.fX2NDC=this.fX2NDC,this._ratio_up_fp.o_sizeChanged()},a))})})()}static draw(a,e,l){return(0,E.Z)(function*(){let o=new z(a,e,l);return(0,X.ensureTCanvas)(o,!1).then(()=>o.redraw())})()}}}}]); +//# sourceMappingURL=230.9df4c215ca49efed.js.map \ No newline at end of file diff --git a/docs/562.13af937336895a9b.js.map b/docs/230.9df4c215ca49efed.js.map similarity index 99% rename from docs/562.13af937336895a9b.js.map rename to docs/230.9df4c215ca49efed.js.map index f453395ad..c6a1bbe01 100644 --- a/docs/562.13af937336895a9b.js.map +++ b/docs/230.9df4c215ca49efed.js.map @@ -1 +1 @@ -{"version":3,"file":"562.13af937336895a9b.js","mappings":"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","names":["TRatioPlotPainter","ObjectPainter","setGridsRange","xmin","xmax","ratio","this","getObject","x_handle","getPadPainter","findPainterFor","fLowerPad","clTPad","getFramePainter","full_min","full_max","fGridlines","forEach","line","fX1","fX2","redraw","_this","pp","top_p","fTopPad","disablePadDrawing","up_p","fUpperPad","up_main","getMainPainter","up_fp","low_p","low_main","low_fp","lbl_size","promise_up","Promise","resolve","_ratio_configured","options","Axis","getHisto","fYaxis","fLabelSize","Math","round","min","getPadWidth","getPadHeight","h","fXaxis","fTitle","fTitleSize","getRootPad","fTicky","redrawPad","then","o_zoom","zoom","_ratio_low_fp","_ratio_painter","ymin","ymax","zmin","zmax","o_sizeChanged","sizeChanged","fX1NDC","fX2NDC","forEachPainterInPad","objp","isFunc","testEditable","currpad","arr","fGridlinePositions","length","gridy","found","fY1","fY2","abs","create","clTLine","scale_xmin","scale_xmax","fLineStyle","push","undefined","selectCurrentPad","fName","drawTLine","getDom","all","_ratio_up_fp","static","dom","opt","painter","ensureTCanvas"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/draw/TRatioPlotPainter.mjs"],"sourcesContent":["import { create, clTPad, clTLine, isFunc } from '../core.mjs';\nimport { ObjectPainter } from '../base/ObjectPainter.mjs';\nimport { ensureTCanvas } from '../gpad/TCanvasPainter.mjs';\nimport { drawTLine } from './more.mjs';\n\n\n/**\n * @summary Painter class for TRatioPlot\n *\n * @private\n */\n\nclass TRatioPlotPainter extends ObjectPainter {\n\n /** @summary Set grids range */\n setGridsRange(xmin, xmax) {\n let ratio = this.getObject();\n if (xmin === xmax) {\n let x_handle = this.getPadPainter()?.findPainterFor(ratio.fLowerPad, 'lower_pad', clTPad)?.getFramePainter()?.x_handle;\n if (!x_handle) return;\n xmin = x_handle.full_min;\n xmax = x_handle.full_max;\n }\n\n ratio.fGridlines.forEach(line => {\n line.fX1 = xmin;\n line.fX2 = xmax;\n });\n }\n\n /** @summary Redraw TRatioPlot */\n async redraw() {\n let ratio = this.getObject(),\n pp = this.getPadPainter();\n\n let top_p = pp.findPainterFor(ratio.fTopPad, 'top_pad', clTPad);\n if (top_p) top_p.disablePadDrawing();\n\n let up_p = pp.findPainterFor(ratio.fUpperPad, 'upper_pad', clTPad),\n up_main = up_p?.getMainPainter(),\n up_fp = up_p?.getFramePainter(),\n low_p = pp.findPainterFor(ratio.fLowerPad, 'lower_pad', clTPad),\n low_main = low_p?.getMainPainter(),\n low_fp = low_p?.getFramePainter(),\n lbl_size = 20, promise_up = Promise.resolve(true);\n\n if (up_p && up_main && up_fp && low_fp && !up_p._ratio_configured) {\n up_p._ratio_configured = true;\n up_main.options.Axis = 0; // draw both axes\n\n lbl_size = up_main.getHisto().fYaxis.fLabelSize;\n if (lbl_size < 1) lbl_size = Math.round(lbl_size*Math.min(up_p.getPadWidth(), up_p.getPadHeight()));\n\n let h = up_main.getHisto();\n h.fXaxis.fLabelSize = 0; // do not draw X axis labels\n h.fXaxis.fTitle = ''; // do not draw X axis title\n h.fYaxis.fLabelSize = lbl_size;\n h.fYaxis.fTitleSize = lbl_size;\n\n up_p.getRootPad().fTicky = 1;\n\n promise_up = up_p.redrawPad().then(() => {\n up_fp.o_zoom = up_fp.zoom;\n up_fp._ratio_low_fp = low_fp;\n up_fp._ratio_painter = this;\n\n up_fp.zoom = function(xmin,xmax,ymin,ymax,zmin,zmax) {\n this._ratio_painter.setGridsRange(xmin, xmax);\n this._ratio_low_fp.o_zoom(xmin,xmax);\n return this.o_zoom(xmin,xmax,ymin,ymax,zmin,zmax);\n }\n\n up_fp.o_sizeChanged = up_fp.sizeChanged;\n up_fp.sizeChanged = function() {\n this.o_sizeChanged();\n this._ratio_low_fp.fX1NDC = this.fX1NDC;\n this._ratio_low_fp.fX2NDC = this.fX2NDC;\n this._ratio_low_fp.o_sizeChanged();\n }\n return true;\n });\n }\n\n return promise_up.then(() => {\n\n if (!low_p || !low_main || !low_fp || !up_fp || low_p._ratio_configured)\n return this;\n\n low_p._ratio_configured = true;\n low_main.options.Axis = 0; // draw both axes\n let h = low_main.getHisto();\n h.fXaxis.fTitle = 'x';\n h.fXaxis.fLabelSize = lbl_size;\n h.fXaxis.fTitleSize = lbl_size;\n h.fYaxis.fLabelSize = lbl_size;\n h.fYaxis.fTitleSize = lbl_size;\n low_p.getRootPad().fTicky = 1;\n\n low_p.forEachPainterInPad(objp => {\n if (isFunc(objp?.testEditable))\n objp.testEditable(false);\n });\n\n let arr = [], currpad;\n\n if ((ratio.fGridlinePositions.length > 0) && (ratio.fGridlines.length < ratio.fGridlinePositions.length)) {\n ratio.fGridlinePositions.forEach(gridy => {\n let found = false;\n ratio.fGridlines.forEach(line => {\n if ((line.fY1 == line.fY2) && (Math.abs(line.fY1 - gridy) < 1e-6)) found = true;\n });\n if (!found) {\n let line = create(clTLine);\n line.fX1 = up_fp.scale_xmin;\n line.fX2 = up_fp.scale_xmax;\n line.fY1 = line.fY2 = gridy;\n line.fLineStyle = 2;\n ratio.fGridlines.push(line);\n if (currpad === undefined)\n currpad = this.selectCurrentPad(ratio.fLowerPad.fName);\n arr.push(drawTLine(this.getDom(), line));\n }\n });\n }\n\n return Promise.all(arr).then(() => low_fp.zoom(up_fp.scale_xmin, up_fp.scale_xmax)).then(() => {\n\n low_fp.o_zoom = low_fp.zoom;\n low_fp._ratio_up_fp = up_fp;\n low_fp._ratio_painter = this;\n\n low_fp.zoom = function(xmin,xmax,ymin,ymax,zmin,zmax) {\n this._ratio_painter.setGridsRange(xmin, xmax);\n this._ratio_up_fp.o_zoom(xmin,xmax);\n return this.o_zoom(xmin,xmax,ymin,ymax,zmin,zmax);\n }\n\n low_fp.o_sizeChanged = low_fp.sizeChanged;\n low_fp.sizeChanged = function() {\n this.o_sizeChanged();\n this._ratio_up_fp.fX1NDC = this.fX1NDC;\n this._ratio_up_fp.fX2NDC = this.fX2NDC;\n this._ratio_up_fp.o_sizeChanged();\n }\n return this;\n });\n });\n }\n\n /** @summary Draw TRatioPlot */\n static async draw(dom, ratio, opt) {\n let painter = new TRatioPlotPainter(dom, ratio, opt);\n\n return ensureTCanvas(painter, false).then(() => painter.redraw());\n }\n\n} // class TRatioPlotPainter\n\nexport { TRatioPlotPainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file +{"version":3,"file":"230.9df4c215ca49efed.js","mappings":"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","names":["TRatioPlotPainter","ObjectPainter","setGridsRange","xmin","xmax","ratio","this","getObject","x_handle","getPadPainter","findPainterFor","fLowerPad","clTPad","getFramePainter","full_min","full_max","fGridlines","forEach","line","fX1","fX2","redraw","_this","pp","top_p","fTopPad","disablePadDrawing","up_p","fUpperPad","up_main","getMainPainter","up_fp","low_p","low_main","low_fp","lbl_size","promise_up","Promise","resolve","_ratio_configured","options","Axis","getHisto","fYaxis","fLabelSize","Math","round","min","getPadWidth","getPadHeight","h","fXaxis","fTitle","fTitleSize","getRootPad","fTicky","redrawPad","then","o_zoom","zoom","_ratio_low_fp","_ratio_painter","ymin","ymax","zmin","zmax","o_sizeChanged","sizeChanged","fX1NDC","fX2NDC","forEachPainterInPad","objp","isFunc","testEditable","currpad","arr","fGridlinePositions","length","gridy","found","fY1","fY2","abs","create","clTLine","scale_xmin","scale_xmax","fLineStyle","push","undefined","selectCurrentPad","fName","drawTLine","getDom","all","_ratio_up_fp","static","dom","opt","painter","ensureTCanvas"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/draw/TRatioPlotPainter.mjs"],"sourcesContent":["import { create, clTPad, clTLine, isFunc } from '../core.mjs';\nimport { ObjectPainter } from '../base/ObjectPainter.mjs';\nimport { ensureTCanvas } from '../gpad/TCanvasPainter.mjs';\nimport { drawTLine } from './more.mjs';\n\n\n/**\n * @summary Painter class for TRatioPlot\n *\n * @private\n */\n\nclass TRatioPlotPainter extends ObjectPainter {\n\n /** @summary Set grids range */\n setGridsRange(xmin, xmax) {\n let ratio = this.getObject();\n if (xmin === xmax) {\n let x_handle = this.getPadPainter()?.findPainterFor(ratio.fLowerPad, 'lower_pad', clTPad)?.getFramePainter()?.x_handle;\n if (!x_handle) return;\n xmin = x_handle.full_min;\n xmax = x_handle.full_max;\n }\n\n ratio.fGridlines.forEach(line => {\n line.fX1 = xmin;\n line.fX2 = xmax;\n });\n }\n\n /** @summary Redraw TRatioPlot */\n async redraw() {\n let ratio = this.getObject(),\n pp = this.getPadPainter();\n\n let top_p = pp.findPainterFor(ratio.fTopPad, 'top_pad', clTPad);\n if (top_p) top_p.disablePadDrawing();\n\n let up_p = pp.findPainterFor(ratio.fUpperPad, 'upper_pad', clTPad),\n up_main = up_p?.getMainPainter(),\n up_fp = up_p?.getFramePainter(),\n low_p = pp.findPainterFor(ratio.fLowerPad, 'lower_pad', clTPad),\n low_main = low_p?.getMainPainter(),\n low_fp = low_p?.getFramePainter(),\n lbl_size = 20, promise_up = Promise.resolve(true);\n\n if (up_p && up_main && up_fp && low_fp && !up_p._ratio_configured) {\n up_p._ratio_configured = true;\n up_main.options.Axis = 0; // draw both axes\n\n lbl_size = up_main.getHisto().fYaxis.fLabelSize;\n if (lbl_size < 1) lbl_size = Math.round(lbl_size*Math.min(up_p.getPadWidth(), up_p.getPadHeight()));\n\n let h = up_main.getHisto();\n h.fXaxis.fLabelSize = 0; // do not draw X axis labels\n h.fXaxis.fTitle = ''; // do not draw X axis title\n h.fYaxis.fLabelSize = lbl_size;\n h.fYaxis.fTitleSize = lbl_size;\n\n up_p.getRootPad().fTicky = 1;\n\n promise_up = up_p.redrawPad().then(() => {\n up_fp.o_zoom = up_fp.zoom;\n up_fp._ratio_low_fp = low_fp;\n up_fp._ratio_painter = this;\n\n up_fp.zoom = function(xmin,xmax,ymin,ymax,zmin,zmax) {\n this._ratio_painter.setGridsRange(xmin, xmax);\n this._ratio_low_fp.o_zoom(xmin,xmax);\n return this.o_zoom(xmin,xmax,ymin,ymax,zmin,zmax);\n }\n\n up_fp.o_sizeChanged = up_fp.sizeChanged;\n up_fp.sizeChanged = function() {\n this.o_sizeChanged();\n this._ratio_low_fp.fX1NDC = this.fX1NDC;\n this._ratio_low_fp.fX2NDC = this.fX2NDC;\n this._ratio_low_fp.o_sizeChanged();\n }\n return true;\n });\n }\n\n return promise_up.then(() => {\n\n if (!low_p || !low_main || !low_fp || !up_fp || low_p._ratio_configured)\n return this;\n\n low_p._ratio_configured = true;\n low_main.options.Axis = 0; // draw both axes\n let h = low_main.getHisto();\n h.fXaxis.fTitle = 'x';\n h.fXaxis.fLabelSize = lbl_size;\n h.fXaxis.fTitleSize = lbl_size;\n h.fYaxis.fLabelSize = lbl_size;\n h.fYaxis.fTitleSize = lbl_size;\n low_p.getRootPad().fTicky = 1;\n\n low_p.forEachPainterInPad(objp => {\n if (isFunc(objp?.testEditable))\n objp.testEditable(false);\n });\n\n let arr = [], currpad;\n\n if ((ratio.fGridlinePositions.length > 0) && (ratio.fGridlines.length < ratio.fGridlinePositions.length)) {\n ratio.fGridlinePositions.forEach(gridy => {\n let found = false;\n ratio.fGridlines.forEach(line => {\n if ((line.fY1 == line.fY2) && (Math.abs(line.fY1 - gridy) < 1e-6)) found = true;\n });\n if (!found) {\n let line = create(clTLine);\n line.fX1 = up_fp.scale_xmin;\n line.fX2 = up_fp.scale_xmax;\n line.fY1 = line.fY2 = gridy;\n line.fLineStyle = 2;\n ratio.fGridlines.push(line);\n if (currpad === undefined)\n currpad = this.selectCurrentPad(ratio.fLowerPad.fName);\n arr.push(drawTLine(this.getDom(), line));\n }\n });\n }\n\n return Promise.all(arr).then(() => low_fp.zoom(up_fp.scale_xmin, up_fp.scale_xmax)).then(() => {\n\n low_fp.o_zoom = low_fp.zoom;\n low_fp._ratio_up_fp = up_fp;\n low_fp._ratio_painter = this;\n\n low_fp.zoom = function(xmin,xmax,ymin,ymax,zmin,zmax) {\n this._ratio_painter.setGridsRange(xmin, xmax);\n this._ratio_up_fp.o_zoom(xmin,xmax);\n return this.o_zoom(xmin,xmax,ymin,ymax,zmin,zmax);\n }\n\n low_fp.o_sizeChanged = low_fp.sizeChanged;\n low_fp.sizeChanged = function() {\n this.o_sizeChanged();\n this._ratio_up_fp.fX1NDC = this.fX1NDC;\n this._ratio_up_fp.fX2NDC = this.fX2NDC;\n this._ratio_up_fp.o_sizeChanged();\n }\n return this;\n });\n });\n }\n\n /** @summary Draw TRatioPlot */\n static async draw(dom, ratio, opt) {\n let painter = new TRatioPlotPainter(dom, ratio, opt);\n\n return ensureTCanvas(painter, false).then(() => painter.redraw());\n }\n\n} // class TRatioPlotPainter\n\nexport { TRatioPlotPainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file diff --git a/docs/879.0345d9de530d51ee.js b/docs/241.4ed7b8d7fa416235.js similarity index 98% rename from docs/879.0345d9de530d51ee.js rename to docs/241.4ed7b8d7fa416235.js index 318c7dc85..e9660aa4b 100644 --- a/docs/879.0345d9de530d51ee.js +++ b/docs/241.4ed7b8d7fa416235.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[879],{3879:(D,Y,M)=>{M.r(Y),M.d(Y,{TGraphPainter:()=>A,clTGraphAsymmErrors:()=>C});var $=M(5368),_=M(1773),P=M(2912),w=M(5611),G=M(2454),j=M(9608),O=M(1671),L=M(9994),N=M(7222);const T=(0,_.BIT)(18),X="TGraphErrors",C="TGraphAsymmErrors",z="TGraphBentErrors",S="TGraphMultiErrors";class A extends G.tK{constructor(t,i){super(t,i),this.axes_draw=!1,this.bins=null,this.xmin=this.ymin=this.xmax=this.ymax=0,this.wheel_zoomy=!0,this.is_bent=i._typename==z,this.has_errors=i._typename==X||i._typename==S||i._typename==C||this.is_bent||i._typename.match(/^RooHist/)}redraw(){var t=this;return(0,$.Z)(function*(){let i=Promise.resolve(!0);if(t.$redraw_hist){delete t.$redraw_hist;let r=t.getMainPainter();r?.$secondary&&t.axes_draw&&(i=r.redraw())}return i.then(()=>t.drawGraph())})()}cleanup(){delete this.interactive_bin,delete this.bins,super.cleanup()}get_gme(){let t=this.getObject();return t?._typename==S?t:null}decodeOptions(t,i){(0,_.isStr)(t)&&0==t.indexOf("same ")&&(t=t.slice(5));let r=this.getObject(),s=!!this.get_gme(),n=[],l=i?!!this.getMainPainter():!this.axes_draw;this.options||(this.options={});const g=(x,e)=>{Object.assign(e,{Line:0,Curve:0,Rect:0,Mark:0,Bar:0,OutRange:0,EF:0,Fill:0,MainError:1,Ends:1,ScaleErrX:1}),s&&x.check("S=",!0)&&(e.ScaleErrX=x.partAsFloat()),x.check("L")&&(e.Line=1),x.check("F")&&(e.Fill=1),x.check("CC")&&(e.Curve=2),x.check("C")&&(e.Curve=1),x.check("*")&&(e.Mark=103),x.check("P0")&&(e.Mark=104),x.check("P")&&(e.Mark=1),x.check("B")&&(e.Bar=1,e.Errors=0),x.check("Z")&&(e.Errors=1,e.Ends=0),x.check("||")&&(e.Errors=1,e.MainError=0,e.Ends=1),x.check("[]")&&(e.Errors=1,e.MainError=0,e.Ends=2),x.check("|>")&&(e.Errors=1,e.Ends=3),x.check(">")&&(e.Errors=1,e.Ends=4),x.check("0")&&(e.Mark=1,e.Errors=1,e.OutRange=1),x.check("1")&&1==e.Bar&&(e.Bar=2),x.check("2")&&(e.Rect=1,e.Errors=0),x.check("3")&&(e.EF=1,e.Errors=0),x.check("4")&&(e.EF=2,e.Errors=0),x.check("5")&&(e.Rect=2,e.Errors=0),x.check("X")&&(e.Errors=0)};Object.assign(this.options,{Axis:"",NoOpt:0,PadStats:!1,original:t,second_x:!1,second_y:!1,individual_styles:!1}),s&&t&&(t.indexOf(";")>0?(n=t.split(";"),t=n.shift()):t.indexOf("_")>0&&(n=t.split("_"),t=n.shift()));let a=this.options,f=new w.pc(t);a.PadStats=f.check("USE_PAD_STATS");let y="";if(["USE_PAD_TITLE","LOGXY","LOGX","LOGY","LOGZ","GRIDXY","GRIDX","GRIDY","TICKXY","TICKX","TICKY"].forEach(x=>{f.check(x)&&(y+=";"+x)}),f.check("XAXIS_",!0)&&(y+=";XAXIS_"+f.part),f.check("YAXIS_",!0)&&(y+=";YAXIS_"+f.part),f.empty()&&(a.original=l?"lp":"alp",f=new w.pc(a.original)),f.check("NOOPT")&&(a.NoOpt=1),f.check("POS3D_",!0)&&(a.pos3d=f.partAsInt()-.5),a._pfc=f.check("PFC"),a._plc=f.check("PLC"),a._pmc=f.check("PMC"),f.check("A")&&(a.Axis=f.check("I")?"A":"AXIS"),f.check("X+")&&(a.Axis+="X+",a.second_x=l),f.check("Y+")&&(a.Axis+="Y+",a.second_y=l),f.check("RX")&&(a.Axis+="RX"),f.check("RY")&&(a.Axis+="RY"),s&&(a.blocks=[],a.skip_errors_x0=a.skip_errors_y0=!1,f.check("X0")&&(a.skip_errors_x0=!0),f.check("Y0")&&(a.skip_errors_y0=!0)),g(f,a),s&&f.check("S")&&(a.individual_styles=!0),void 0===a.Errors&&(a.Errors=!this.has_errors||s&&n.length?0:1),1==a.Mark&&1==r.fMarkerStyle&&(a.Mark=101),a.Line+a.Fill+a.Curve+a.Mark+a.Bar+a.EF+a.Rect+a.Errors==0&&f.empty()&&(a.Line=1),r._typename==X){let x=r.fEX.length,e=0;for(let h=0;h{r.eylow=i.fEyL[t][r.indx],r.eyhigh=i.fEyH[t][r.indx]})}createBins(){let t=this.getObject();if(!t)return;let i=0,r=t.fNpoints;t._typename===_.clTCutG&&r>3&&r--,t._typename==X?i=1:t._typename==S?i=2:(t._typename==C||t._typename==z||t._typename.match(/^RooHist/))&&(i=3),this.bins=new Array(r);for(let s=0;s0?(this.xmin=Math.min(this.xmin,n.x-n.exlow,n.x+n.exhigh),this.xmax=Math.max(this.xmax,n.x-n.exlow,n.x+n.exhigh),this.ymin=Math.min(this.ymin,n.y-n.eylow,n.y+n.eyhigh),this.ymax=Math.max(this.ymax,n.y-n.eylow,n.y+n.eyhigh)):(this.xmin=Math.min(this.xmin,n.x),this.xmax=Math.max(this.xmax,n.x),this.ymin=Math.min(this.ymin,n.y),this.ymax=Math.max(this.ymax,n.y))}}createHistogram(t,i){!t&&!i&&(t=i=!0);let r=this.xmin,s=this.xmax,n=this.ymin,l=this.ymax;r>=s&&(s=r+1),n>=l&&(l=n+1);let g=.1*(s-r),a=.1*(l-n),f=r-g,y=s+g,o=n-a,x=l+a;f<0&&r>=0&&(f=.9*r),y>0&&s<=0&&(y=0);let e=this.getObject(),h=e.fHistogram,m=o,c=x;if(h)h.fMaximum!=_.kNoZoom&&h.fMinimum!=_.kNoZoom&&(o=h.fMinimum,x=h.fMaximum);else{h=e.fHistogram=(0,_.createHistogram)("TH1F",100),h.fName=e.fName+"_h";const d=(0,_.BIT)(9);h.fBits=h.fBits|d,this._own_histogram=!0}return e.fMinimum!=_.kNoZoom&&(o=n=e.fMinimum),e.fMaximum!=_.kNoZoom&&(x=e.fMaximum),o<0&&n>=0&&(o=.9*n),h.fTitle=e.fTitle,t&&(h.fXaxis.fXmin=f,h.fXaxis.fXmax=y),i&&(h.fYaxis.fXmin=Math.min(m,o),h.fYaxis.fXmax=Math.max(c,x),h.fMinimum=o,h.fMaximum=x),h}unzoomUserRange(t,i){let r=this.getObject();if(this._own_histogram||!r)return!1;let s=r.fHistogram;return i=i&&s&&(s.fYaxis.fXmin>this.ymin||s.fYaxis.fXmaxthis.xmin||s.fXaxis.fXmax0&&!this.options.NoOpt}optimizeBins(t,i){if(this.bins.length<30&&!i)return this.bins;let r=null;if((0,_.isFunc)(i))for(let l=0;l0)&&"normal"==s.y_handle.kind&&(t.eylow||t.eyhigh)&&r.push("error y = -"+s.axisAsText("y",t.eylow)+"/+"+s.axisAsText("y",t.eyhigh));return r}get_main(){let t=this.getFramePainter();if(t&&t.grx&&t.gry)return t;let i=this.getPadPainter(),r=i?.getPadRect()||{width:800,height:600};return t={pad_layer:!0,pad:i?.getRootPad(!0),pw:r.width,ph:r.height,getFrameWidth(){return this.pw},getFrameHeight(){return this.ph},grx(s){return(s=this.pad.fLogx?s>0?Math.log10(s):this.pad.fUxmin:(s-this.pad.fX1)/(this.pad.fX2-this.pad.fX1))*this.pw},gry(s){return(1-(s=this.pad.fLogy?s>0?Math.log10(s):this.pad.fUymin:(s-this.pad.fY1)/(this.pad.fY2-this.pad.fY1)))*this.ph},revertAxis(s,n){return"x"==s?n/this.pw*(this.pad.fX2-this.pad.fX1)+this.pad.fX1:"y"==s?(1-n/this.ph)*(this.pad.fY2-this.pad.fY1)+this.pad.fY1:n},getGrFuncs(){return this}},t.pad?t:null}appendExclusion(t,i,r,s){let n=[];for(let g=r.length-1;g>=0;--g){let a=r[g],f=Math.sqrt(a.dgrx**2+a.dgry**2);a.grx+=s*a.dgry/f,a.gry-=s*a.dgrx/f,n.push(a)}let l=(0,w.Cq)(t?"Lbezier":"Lline",n);this.draw_g.append("svg:path").attr("d",i.path+l.path+"Z").call(this.fillatt.func).style("opacity",.75)}drawBins(t,i,r,s,n,l,g,a){let f=this.getObject(),y=0,o=null;if(a&&l.excl_side&&(y=l.excl_width,l.width>0&&!i.Line&&!i.Curve&&(i.Line=1)),i.EF){o=this.optimizeBins(i.EF>1?2e4:0);for(let c=0;c1?"bezier":"line",o),h=[];for(let c=o.length-1;c>=0;--c){let d=o[c];d.gry=t.gry(d.y+d.eyhigh),h.push(d)}let m=(0,w.Cq)(i.EF>1?"Lbezier":"Lline",h);r.append("svg:path").attr("d",e.path+m.path+"Z").call(g.func),a&&(this.draw_kind="lines")}if(i.Line||i.Fill){let e="";f._typename==_.clTCutG&&(i.Fill=1),i.Fill&&(e="Z",y=0),o||(o=this.optimizeBins(0));for(let d=0;d2e4){e=this.optimizeBins(1==i.Curve?2e4:0);for(let c=0;c{let m=t.grx(e.x);if(!i.Bar&&(m<0||m>s))return!0;let c=t.gry(e.y);return!i.Bar&&!i.OutRange&&(c<0||c>n)||(e.grx1=Math.round(m),e.gry1=Math.round(c),this.has_errors&&(e.grx0=Math.round(t.grx(e.x-i.ScaleErrX*e.exlow)-m),e.grx2=Math.round(t.grx(e.x+i.ScaleErrX*e.exhigh)-m),e.gry0=Math.round(t.gry(e.y-e.eylow)-c),e.gry2=Math.round(t.gry(e.y+e.eyhigh)-c),this.is_bent?(e.grdx0=Math.round(t.gry(e.y+f.fEXlowd[h])-c),e.grdx2=Math.round(t.gry(e.y+f.fEXhighd[h])-c),e.grdy0=Math.round(t.grx(e.x+f.fEYlowd[h])-m),e.grdy2=Math.round(t.grx(e.x+f.fEYhighd[h])-m)):e.grdx0=e.grdx2=e.grdy0=e.grdy2=0),!1)}),a&&(this.draw_kind="nodes"),x=r.selectAll(".grpoint").data(o).enter().append("svg:g").attr("class","grpoint").attr("transform",e=>`translate(${e.grx1},${e.gry1})`)),i.Bar){for(let m=1;m{m.bar=!0;let c=Math.round(-m.width/2),d=Math.round(m.width);return`M${c},${1!==i.Bar?0:m.gry1>e?e-m.gry1:0}h${d}v${1!==i.Bar?n>m.gry1?n-m.gry1:0:Math.abs(e-m.gry1)}h${-d}z`}).call(h.func)}if(i.Rect&&x.filter(e=>e.exlow>0&&e.exhigh>0&&e.eylow>0&&e.eyhigh>0).append("svg:path").attr("d",e=>(e.rect=!0,`M${e.grx0},${e.gry0}H${e.grx2}V${e.gry2}H${e.grx0}Z`)).call(g.func).call(2===i.Rect?l.func:()=>{}),this.error_size=0,i.Errors){let e=l.width+_.gStyle.fEndErrorSize,h=0,m=i.Ends?`m0,${e}v${-2*e}`:"",c=i.Ends?`m${e},0h${-2*e}`:"",d=m,p=m,b=c,k=c;const E=(u,F)=>{if(!i.MainError)return`M${u},${F}`;let B="M0,0";return u?B+(F?`L${u},${F}`:`H${u}`):F?B+`V${F}`:B};switch(i.Ends){case 2:h=Math.max(l.width+1,Math.round(.66*e)),d=`m${h},${e}h${-h}v${-2*e}h${h}`,p=`m${-h},${e}h${h}v${-2*e}h${-h}`,b=`m${-e},${h}v${-h}h${2*e}v${h}`,k=`m${-e},${-h}v${h}h${2*e}v${-h}`;break;case 3:e=Math.max(e,Math.round(8*f.fMarkerSize*.66)),h=Math.max(l.width+1,Math.round(.66*e)),d=`l${h},${e}v${-2*e}l${-h},${e}`,p=`l${-h},${e}v${-2*e}l${h},${e}`,b=`l${-e},${h}h${2*e}l${-e},${-h}`,k=`l${-e},${-h}h${2*e}l${-e},${h}`;break;case 4:e=Math.max(e,Math.round(8*f.fMarkerSize*.66)),h=Math.max(l.width+1,Math.round(.66*e)),d=`l${h},${e}m0,${-2*e}l${-h},${e}`,p=`l${-h},${e}m0,${-2*e}l${h},${e}`,b=`l${-e},${h}m${2*e},0l${-e},${-h}`,k=`l${-e},${-h}m${2*e},0l${-e},${h}`}this.error_size=e,e=Math.floor((l.width-1)/2);let v=x.filter(u=>u.exlow>0||u.exhigh>0||u.eylow>0||u.eyhigh>0);(i.skip_errors_x0||i.skip_errors_y0)&&(v=v.filter(u=>!(0==u.x&&i.skip_errors_x0||0==u.y&&i.skip_errors_y0))),!(0,_.isBatchMode)()&&_.settings.Tooltip&&a&&v.append("svg:path").style("fill","none").style("pointer-events","visibleFill").attr("d",u=>`M${u.grx0},${u.gry0}h${u.grx2-u.grx0}v${u.gry2-u.gry0}h${u.grx0-u.grx2}z`),v.append("svg:path").call(l.func).style("fill","none").attr("d",u=>(u.error=!0,(u.exlow>0?E(u.grx0+e,u.grdx0)+d:"")+(u.exhigh>0?E(u.grx2-e,u.grdx2)+p:"")+(u.eylow>0?E(u.grdy0,u.gry0-e)+k:"")+(u.eyhigh>0?E(u.grdy2,u.gry2+e)+b:"")))}if(i.Mark){this.createAttMarker({attr:f,style:i.Mark-100}),this.marker_size=this.markeratt.getFullSize(),this.markeratt.resetPos();let h,m,c,e="",d=!(0,_.isBatchMode)()&&_.settings.Tooltip&&(!this.markeratt.fill||this.marker_size<7)&&!x&&a,p="",b=Math.max(5,Math.round(.7*this.marker_size)),k=1e6/(this.markeratt.getMarkerLength()+7),E=1;o?this.canOptimize()&&o.length>1.5*k&&(E=Math.min(2,Math.round(o.length/k))):o=this.optimizeBins(k);for(let v=0;v-this.marker_size&&m-this.marker_size&&c`M${t.grx(e)},${t.gry(h)}L${t.grx(m)},${t.gry(c)}`,f=(i.fYq2-i.fYq1)*(t.scale_xmin-i.fXq1)/(i.fXq2-i.fXq1)+i.fYq1,y=(i.fYq2-i.fYq1)*(t.scale_xmax-i.fXq1)/(i.fXq2-i.fXq1)+i.fYq1;g=ft.scale_ymax?a(s,l,(i.fXq2-i.fXq1)*(t.scale_ymax-i.fYq1)/(i.fYq2-i.fYq1)+i.fXq1,t.scale_ymax):a(s,l,t.scale_xmax,y);let o=new O.rE({style:1,width:1,color:"black"}),x=new O.rE({style:2,width:1,color:"black"});this.draw_g.append("path").attr("d",a(r,n,s,l)).call(o.func).style("fill","none"),this.draw_g.append("path").attr("d",g).call(x.func).style("fill","none")}drawBins3D(){console.log("Load ./hist/TGraphPainter.mjs to draw graph in 3D")}drawGraph(){let t=this.get_main(),i=this.getObject();if(!t)return;if(this.options.pos3d)return this.drawBins3D(t,i);let r=!!this.get_gme(),s=t.getGrFuncs(this.options.second_x,this.options.second_y),n=t.getFrameWidth(),l=t.getFrameHeight();if(this.createG(!t.pad_layer),this.options._pfc||this.options._plc||this.options._pmc){let a=this.getMainPainter();if((0,_.isFunc)(a?.createAutoColor)){let f=a.createAutoColor();this.options._pfc&&(i.fFillColor=f,delete this.fillatt),this.options._plc&&(i.fLineColor=f,delete this.lineatt),this.options._pmc&&(i.fMarkerColor=f,delete this.markeratt),this.options._pfc=this.options._plc=this.options._pmc=!1}}this.createAttLine({attr:i,can_excl:!0}),this.createAttFill({attr:i}),this.fillatt.used=!1,this.draw_kind="none",this.marker_size=0;let g=r?this.draw_g.append("svg:g"):this.draw_g;if(this.drawBins(s,this.options,g,n,l,this.lineatt,this.fillatt,!0),"TGraphQQ"==i._typename&&this.appendQQ(s,i),r){for(let a=0;a=a)return;if(h.error||h.rect||h.marker)c={x1:Math.min(-s,h.grx0,-y),x2:Math.max(s,h.grx2,y),y1:Math.min(-s,h.gry2,-y),y2:Math.max(s,h.gry0,y)};else if(h.bar){if(c={x1:-h.width/2,x2:h.width/2,y1:0,y2:r-h.gry1},n){let b=l.gry(0);c.y1=h.gry1>b?b-h.gry1:0,c.y2=h.gry1>b?0:b-h.gry1}}else c={x1:-5,x2:5,y1:-5,y2:5};let p=t.y>=h.gry1+c.y1&&t.y<=h.gry1+c.y2;t.x>=h.grx1+c.x1&&t.x<=h.grx1+c.x2&&(p||t.nproc>1)&&(a=m,g=this,f=c,f.exact=p)}),null===g)return null;let o=(0,P.Ys)(g).datum(),x=this.getObject(),e={name:x.fName,title:x.fTitle,x:o.grx1,y:o.gry1,color1:this.lineatt.color,lines:this.getTooltips(o),rect:f,d3bin:g};return e.user_info={obj:x,name:x.fName,bin:o.indx,cont:o.y,grx:o.grx1,gry:o.gry1},this.fillatt&&this.fillatt.used&&!this.fillatt.empty()&&(e.color2=this.fillatt.getFillColor()),f.exact&&(e.exact=!0),e.menu=e.exact,e.menu_dist=3,e.bin=o,e.binindx=o.indx,e}showTooltip(t){if(!t)return void(this.draw_g&&this.draw_g.select(".tooltip_bin").remove());if(t.usepath)return this.showTooltipForPath(t);let i=(0,P.Ys)(t.d3bin).datum(),r=this.draw_g.select(".tooltip_bin");r.empty()&&(r=this.draw_g.append("svg:rect").attr("class","tooltip_bin h1bin").style("pointer-events","none")),t.changed=r.property("current_bin")!==t.d3bin,t.changed&&r.attr("x",i.grx1+t.rect.x1).attr("width",t.rect.x2-t.rect.x1).attr("y",i.gry1+t.rect.y1).attr("height",t.rect.y2-t.rect.y1).style("opacity","0.3").property("current_bin",t.d3bin)}processTooltipEvent(t){let i=this.extractTooltip(t);return(!t||!t.disabled)&&this.showTooltip(i),i}findBestBin(t){if(!this.bins)return null;let g,a,f,y,o,i="lines"==this.draw_kind,r=-1,s=null,n=1e10,l=this.get_main().getGrFuncs(this.options.second_x,this.options.second_y);for(y=0;y100&&i&&(s=null);let x=Math.max(this.lineatt.width+3,4);this.marker_size>0&&(x=Math.max(this.marker_size,x)),s&&(n=Math.sqrt((t.x-l.grx(s.x))**2+(t.y-l.gry(s.y))**2)),!i&&n>x&&(s=null),s||(r=-1);let e={bin:s,indx:r,dist:n,radius:Math.round(x)};if(!s&&i){n=1e10;const h=(b,k,E)=>k>=b&&b>=E||k<=b&&b<=E;let d,m=this.bins[0],c=l.grx(m.x),p=0;for(y=1;y1&&i.append("svg:circle").attr("cy",Math.round(t.gry2));let r=i.selectAll("circle").attr("r",t.radius).attr("cx",Math.round(t.x));t.islines?(this.options.Line||this.options.Curve?r.call(this.lineatt.func):r.style("stroke","black"),this.options.Fill?r.call(this.fillatt.func):r.style("fill","none")):r.style("stroke","black"==t.color1?"green":"black").style("fill","none")}}else i.remove()}moveEnabled(){return this.testEditable()}moveStart(t,i){this.pos_dx=this.pos_dy=0,this.move_funcs=this.get_main().getGrFuncs(this.options.second_x,this.options.second_y);let r=this.extractTooltip({x:t,y:i});r&&r.exact&&void 0!==r.binindx?(this.move_binindx=r.binindx,this.move_bin=r.bin,this.move_x0=this.move_funcs.grx(this.move_bin.x),this.move_y0=this.move_funcs.gry(this.move_bin.y)):delete this.move_binindx}moveDrag(t,i){this.pos_dx+=t,this.pos_dy+=i,void 0===this.move_binindx?this.draw_g.attr("transform",`translate(${this.pos_dx},${this.pos_dy})`):this.move_funcs&&this.move_bin&&(this.move_bin.x=this.move_funcs.revertAxis("x",this.move_x0+this.pos_dx),this.move_bin.y=this.move_funcs.revertAxis("y",this.move_y0+this.pos_dy),this.drawGraph())}moveEnd(t){let i="";if(void 0===this.move_binindx){if(this.draw_g.attr("transform",null),this.move_funcs&&this.bins&&!t){for(let r=0;r{this.testEditable("toggle"),this.drawGraph()}),t.size()>0}executeMenuCommand(t,i){if(super.executeMenuCommand(t,i))return!0;let r=this.getCanvPainter(),s=this.get_main();if("RemovePoint"==t.fName||"InsertPoint"==t.fName){if(!r||r._readonly)return!0;let n=this.extractTooltip(pnt);if("InsertPoint"==t.fName){let l=(0,_.isFunc)(s.getLastEventPos)?s.getLastEventPos():null;if(l){let g=s.getGrFuncs(this.options.second_x,this.options.second_y),a=g.revertAxis("x",l.x)??0,f=g.revertAxis("y",l.y)??0;this.submitCanvExec(`AddPoint(${a.toFixed(3)}, ${f.toFixed(3)})`,this.args_menu_id)}}else this.args_menu_id&&void 0!==n?.binindx&&this.submitCanvExec(`RemovePoint(${n.binindx})`,this.args_menu_id);return!0}return!1}updateObject(t,i){if(!this.matchObjectType(t))return!1;i&&i!=this.options.original&&this.decodeOptions(i);let r=this.getObject();if(r.fBits=t.fBits,r.fTitle=t.fTitle,r.fX=t.fX,r.fY=t.fY,r.fNpoints=t.fNpoints,r.fMinimum=t.fMinimum,r.fMaximum=t.fMaximum,this.createBins(),delete this.$redraw_hist,this.axes_draw){let s=this.createHistogram();s.fTitle=r.fTitle;let n=this.getMainPainter();n?.$secondary&&(n.updateObject(s,this.options.Axis),this.$redraw_hist=!0)}return!0}canZoomInside(t,i,r){let s=this.getObject();if(!s||t!==(this.options.pos3d?"y":"x"))return!1;for(let n=0;ni._typename==_.clTF1||i._typename==_.clTF2):null}findStat(){let t=this.getObject();if(t?.fFunctions?.arr)for(let i=0;i=(r?.fFunctions?.arr?.length||0))return i;let s=i.getPadPainter(),n=r.fFunctions.arr[t],l=r.fFunctions.opt[t];return n.$main_painter=i,s.drawObject(i.getDom(),n,l).then(()=>i.drawNextFunction(t+1))})()}drawAxisHisto(){var t=this;return(0,$.Z)(function*(){let i=t.createHistogram();return j.f.draw(t.getDom(),i,t.options.Axis)})()}static _drawGraph(t,i){return(0,$.Z)(function*(){t.decodeOptions(i,!0),t.createBins(),t.createStat(),!_.settings.DragGraphs&&!graph.TestBit(T)&&graph.InvertBit(T);let r=Promise.resolve();return(!t.getMainPainter()||t.options.second_x||t.options.second_y)&&t.options.Axis&&(r=t.drawAxisHisto().then(s=>{s&&(t.axes_draw=!0,t._own_histogram||(t.$primary=!0),s.$secondary="hist")})),r.then(()=>(t.addToPadPrimitives(),t.drawGraph())).then(()=>t.drawNextFunction(0))})()}static draw(t,i,r){return(0,$.Z)(function*(){return A._drawGraph(new A(t,i),r)})()}}}}]); -//# sourceMappingURL=879.0345d9de530d51ee.js.map \ No newline at end of file +"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[241],{8241:(D,Y,M)=>{M.r(Y),M.d(Y,{TGraphPainter:()=>A,clTGraphAsymmErrors:()=>C});var $=M(4788),_=M(9542),P=M(2253),w=M(3675),G=M(6458),j=M(9670),O=M(6367),L=M(3627),N=M(9622);const T=(0,_.BIT)(18),X="TGraphErrors",C="TGraphAsymmErrors",z="TGraphBentErrors",S="TGraphMultiErrors";class A extends G.tK{constructor(t,i){super(t,i),this.axes_draw=!1,this.bins=null,this.xmin=this.ymin=this.xmax=this.ymax=0,this.wheel_zoomy=!0,this.is_bent=i._typename==z,this.has_errors=i._typename==X||i._typename==S||i._typename==C||this.is_bent||i._typename.match(/^RooHist/)}redraw(){var t=this;return(0,$.Z)(function*(){let i=Promise.resolve(!0);if(t.$redraw_hist){delete t.$redraw_hist;let r=t.getMainPainter();r?.$secondary&&t.axes_draw&&(i=r.redraw())}return i.then(()=>t.drawGraph())})()}cleanup(){delete this.interactive_bin,delete this.bins,super.cleanup()}get_gme(){let t=this.getObject();return t?._typename==S?t:null}decodeOptions(t,i){(0,_.isStr)(t)&&0==t.indexOf("same ")&&(t=t.slice(5));let r=this.getObject(),s=!!this.get_gme(),n=[],l=i?!!this.getMainPainter():!this.axes_draw;this.options||(this.options={});const g=(x,e)=>{Object.assign(e,{Line:0,Curve:0,Rect:0,Mark:0,Bar:0,OutRange:0,EF:0,Fill:0,MainError:1,Ends:1,ScaleErrX:1}),s&&x.check("S=",!0)&&(e.ScaleErrX=x.partAsFloat()),x.check("L")&&(e.Line=1),x.check("F")&&(e.Fill=1),x.check("CC")&&(e.Curve=2),x.check("C")&&(e.Curve=1),x.check("*")&&(e.Mark=103),x.check("P0")&&(e.Mark=104),x.check("P")&&(e.Mark=1),x.check("B")&&(e.Bar=1,e.Errors=0),x.check("Z")&&(e.Errors=1,e.Ends=0),x.check("||")&&(e.Errors=1,e.MainError=0,e.Ends=1),x.check("[]")&&(e.Errors=1,e.MainError=0,e.Ends=2),x.check("|>")&&(e.Errors=1,e.Ends=3),x.check(">")&&(e.Errors=1,e.Ends=4),x.check("0")&&(e.Mark=1,e.Errors=1,e.OutRange=1),x.check("1")&&1==e.Bar&&(e.Bar=2),x.check("2")&&(e.Rect=1,e.Errors=0),x.check("3")&&(e.EF=1,e.Errors=0),x.check("4")&&(e.EF=2,e.Errors=0),x.check("5")&&(e.Rect=2,e.Errors=0),x.check("X")&&(e.Errors=0)};Object.assign(this.options,{Axis:"",NoOpt:0,PadStats:!1,original:t,second_x:!1,second_y:!1,individual_styles:!1}),s&&t&&(t.indexOf(";")>0?(n=t.split(";"),t=n.shift()):t.indexOf("_")>0&&(n=t.split("_"),t=n.shift()));let a=this.options,f=new w.pc(t);a.PadStats=f.check("USE_PAD_STATS");let y="";if(["USE_PAD_TITLE","LOGXY","LOGX","LOGY","LOGZ","GRIDXY","GRIDX","GRIDY","TICKXY","TICKX","TICKY"].forEach(x=>{f.check(x)&&(y+=";"+x)}),f.check("XAXIS_",!0)&&(y+=";XAXIS_"+f.part),f.check("YAXIS_",!0)&&(y+=";YAXIS_"+f.part),f.empty()&&(a.original=l?"lp":"alp",f=new w.pc(a.original)),f.check("NOOPT")&&(a.NoOpt=1),f.check("POS3D_",!0)&&(a.pos3d=f.partAsInt()-.5),a._pfc=f.check("PFC"),a._plc=f.check("PLC"),a._pmc=f.check("PMC"),f.check("A")&&(a.Axis=f.check("I")?"A":"AXIS"),f.check("X+")&&(a.Axis+="X+",a.second_x=l),f.check("Y+")&&(a.Axis+="Y+",a.second_y=l),f.check("RX")&&(a.Axis+="RX"),f.check("RY")&&(a.Axis+="RY"),s&&(a.blocks=[],a.skip_errors_x0=a.skip_errors_y0=!1,f.check("X0")&&(a.skip_errors_x0=!0),f.check("Y0")&&(a.skip_errors_y0=!0)),g(f,a),s&&f.check("S")&&(a.individual_styles=!0),void 0===a.Errors&&(a.Errors=!this.has_errors||s&&n.length?0:1),1==a.Mark&&1==r.fMarkerStyle&&(a.Mark=101),a.Line+a.Fill+a.Curve+a.Mark+a.Bar+a.EF+a.Rect+a.Errors==0&&f.empty()&&(a.Line=1),r._typename==X){let x=r.fEX.length,e=0;for(let h=0;h{r.eylow=i.fEyL[t][r.indx],r.eyhigh=i.fEyH[t][r.indx]})}createBins(){let t=this.getObject();if(!t)return;let i=0,r=t.fNpoints;t._typename===_.clTCutG&&r>3&&r--,t._typename==X?i=1:t._typename==S?i=2:(t._typename==C||t._typename==z||t._typename.match(/^RooHist/))&&(i=3),this.bins=new Array(r);for(let s=0;s0?(this.xmin=Math.min(this.xmin,n.x-n.exlow,n.x+n.exhigh),this.xmax=Math.max(this.xmax,n.x-n.exlow,n.x+n.exhigh),this.ymin=Math.min(this.ymin,n.y-n.eylow,n.y+n.eyhigh),this.ymax=Math.max(this.ymax,n.y-n.eylow,n.y+n.eyhigh)):(this.xmin=Math.min(this.xmin,n.x),this.xmax=Math.max(this.xmax,n.x),this.ymin=Math.min(this.ymin,n.y),this.ymax=Math.max(this.ymax,n.y))}}createHistogram(t,i){!t&&!i&&(t=i=!0);let r=this.xmin,s=this.xmax,n=this.ymin,l=this.ymax;r>=s&&(s=r+1),n>=l&&(l=n+1);let g=.1*(s-r),a=.1*(l-n),f=r-g,y=s+g,o=n-a,x=l+a;f<0&&r>=0&&(f=.9*r),y>0&&s<=0&&(y=0);let e=this.getObject(),h=e.fHistogram,m=o,c=x;if(h)h.fMaximum!=_.kNoZoom&&h.fMinimum!=_.kNoZoom&&(o=h.fMinimum,x=h.fMaximum);else{h=e.fHistogram=(0,_.createHistogram)("TH1F",100),h.fName=e.fName+"_h";const d=(0,_.BIT)(9);h.fBits=h.fBits|d,this._own_histogram=!0}return e.fMinimum!=_.kNoZoom&&(o=n=e.fMinimum),e.fMaximum!=_.kNoZoom&&(x=e.fMaximum),o<0&&n>=0&&(o=.9*n),h.fTitle=e.fTitle,t&&(h.fXaxis.fXmin=f,h.fXaxis.fXmax=y),i&&(h.fYaxis.fXmin=Math.min(m,o),h.fYaxis.fXmax=Math.max(c,x),h.fMinimum=o,h.fMaximum=x),h}unzoomUserRange(t,i){let r=this.getObject();if(this._own_histogram||!r)return!1;let s=r.fHistogram;return i=i&&s&&(s.fYaxis.fXmin>this.ymin||s.fYaxis.fXmaxthis.xmin||s.fXaxis.fXmax0&&!this.options.NoOpt}optimizeBins(t,i){if(this.bins.length<30&&!i)return this.bins;let r=null;if((0,_.isFunc)(i))for(let l=0;l0)&&"normal"==s.y_handle.kind&&(t.eylow||t.eyhigh)&&r.push("error y = -"+s.axisAsText("y",t.eylow)+"/+"+s.axisAsText("y",t.eyhigh));return r}get_main(){let t=this.getFramePainter();if(t&&t.grx&&t.gry)return t;let i=this.getPadPainter(),r=i?.getPadRect()||{width:800,height:600};return t={pad_layer:!0,pad:i?.getRootPad(!0),pw:r.width,ph:r.height,getFrameWidth(){return this.pw},getFrameHeight(){return this.ph},grx(s){return(s=this.pad.fLogx?s>0?Math.log10(s):this.pad.fUxmin:(s-this.pad.fX1)/(this.pad.fX2-this.pad.fX1))*this.pw},gry(s){return(1-(s=this.pad.fLogy?s>0?Math.log10(s):this.pad.fUymin:(s-this.pad.fY1)/(this.pad.fY2-this.pad.fY1)))*this.ph},revertAxis(s,n){return"x"==s?n/this.pw*(this.pad.fX2-this.pad.fX1)+this.pad.fX1:"y"==s?(1-n/this.ph)*(this.pad.fY2-this.pad.fY1)+this.pad.fY1:n},getGrFuncs(){return this}},t.pad?t:null}appendExclusion(t,i,r,s){let n=[];for(let g=r.length-1;g>=0;--g){let a=r[g],f=Math.sqrt(a.dgrx**2+a.dgry**2);a.grx+=s*a.dgry/f,a.gry-=s*a.dgrx/f,n.push(a)}let l=(0,w.Cq)(t?"Lbezier":"Lline",n);this.draw_g.append("svg:path").attr("d",i.path+l.path+"Z").call(this.fillatt.func).style("opacity",.75)}drawBins(t,i,r,s,n,l,g,a){let f=this.getObject(),y=0,o=null;if(a&&l.excl_side&&(y=l.excl_width,l.width>0&&!i.Line&&!i.Curve&&(i.Line=1)),i.EF){o=this.optimizeBins(i.EF>1?2e4:0);for(let c=0;c1?"bezier":"line",o),h=[];for(let c=o.length-1;c>=0;--c){let d=o[c];d.gry=t.gry(d.y+d.eyhigh),h.push(d)}let m=(0,w.Cq)(i.EF>1?"Lbezier":"Lline",h);r.append("svg:path").attr("d",e.path+m.path+"Z").call(g.func),a&&(this.draw_kind="lines")}if(i.Line||i.Fill){let e="";f._typename==_.clTCutG&&(i.Fill=1),i.Fill&&(e="Z",y=0),o||(o=this.optimizeBins(0));for(let d=0;d2e4){e=this.optimizeBins(1==i.Curve?2e4:0);for(let c=0;c{let m=t.grx(e.x);if(!i.Bar&&(m<0||m>s))return!0;let c=t.gry(e.y);return!i.Bar&&!i.OutRange&&(c<0||c>n)||(e.grx1=Math.round(m),e.gry1=Math.round(c),this.has_errors&&(e.grx0=Math.round(t.grx(e.x-i.ScaleErrX*e.exlow)-m),e.grx2=Math.round(t.grx(e.x+i.ScaleErrX*e.exhigh)-m),e.gry0=Math.round(t.gry(e.y-e.eylow)-c),e.gry2=Math.round(t.gry(e.y+e.eyhigh)-c),this.is_bent?(e.grdx0=Math.round(t.gry(e.y+f.fEXlowd[h])-c),e.grdx2=Math.round(t.gry(e.y+f.fEXhighd[h])-c),e.grdy0=Math.round(t.grx(e.x+f.fEYlowd[h])-m),e.grdy2=Math.round(t.grx(e.x+f.fEYhighd[h])-m)):e.grdx0=e.grdx2=e.grdy0=e.grdy2=0),!1)}),a&&(this.draw_kind="nodes"),x=r.selectAll(".grpoint").data(o).enter().append("svg:g").attr("class","grpoint").attr("transform",e=>`translate(${e.grx1},${e.gry1})`)),i.Bar){for(let m=1;m{m.bar=!0;let c=Math.round(-m.width/2),d=Math.round(m.width);return`M${c},${1!==i.Bar?0:m.gry1>e?e-m.gry1:0}h${d}v${1!==i.Bar?n>m.gry1?n-m.gry1:0:Math.abs(e-m.gry1)}h${-d}z`}).call(h.func)}if(i.Rect&&x.filter(e=>e.exlow>0&&e.exhigh>0&&e.eylow>0&&e.eyhigh>0).append("svg:path").attr("d",e=>(e.rect=!0,`M${e.grx0},${e.gry0}H${e.grx2}V${e.gry2}H${e.grx0}Z`)).call(g.func).call(2===i.Rect?l.func:()=>{}),this.error_size=0,i.Errors){let e=l.width+_.gStyle.fEndErrorSize,h=0,m=i.Ends?`m0,${e}v${-2*e}`:"",c=i.Ends?`m${e},0h${-2*e}`:"",d=m,p=m,b=c,k=c;const E=(u,F)=>{if(!i.MainError)return`M${u},${F}`;let B="M0,0";return u?B+(F?`L${u},${F}`:`H${u}`):F?B+`V${F}`:B};switch(i.Ends){case 2:h=Math.max(l.width+1,Math.round(.66*e)),d=`m${h},${e}h${-h}v${-2*e}h${h}`,p=`m${-h},${e}h${h}v${-2*e}h${-h}`,b=`m${-e},${h}v${-h}h${2*e}v${h}`,k=`m${-e},${-h}v${h}h${2*e}v${-h}`;break;case 3:e=Math.max(e,Math.round(8*f.fMarkerSize*.66)),h=Math.max(l.width+1,Math.round(.66*e)),d=`l${h},${e}v${-2*e}l${-h},${e}`,p=`l${-h},${e}v${-2*e}l${h},${e}`,b=`l${-e},${h}h${2*e}l${-e},${-h}`,k=`l${-e},${-h}h${2*e}l${-e},${h}`;break;case 4:e=Math.max(e,Math.round(8*f.fMarkerSize*.66)),h=Math.max(l.width+1,Math.round(.66*e)),d=`l${h},${e}m0,${-2*e}l${-h},${e}`,p=`l${-h},${e}m0,${-2*e}l${h},${e}`,b=`l${-e},${h}m${2*e},0l${-e},${-h}`,k=`l${-e},${-h}m${2*e},0l${-e},${h}`}this.error_size=e,e=Math.floor((l.width-1)/2);let v=x.filter(u=>u.exlow>0||u.exhigh>0||u.eylow>0||u.eyhigh>0);(i.skip_errors_x0||i.skip_errors_y0)&&(v=v.filter(u=>!(0==u.x&&i.skip_errors_x0||0==u.y&&i.skip_errors_y0))),!(0,_.isBatchMode)()&&_.settings.Tooltip&&a&&v.append("svg:path").style("fill","none").style("pointer-events","visibleFill").attr("d",u=>`M${u.grx0},${u.gry0}h${u.grx2-u.grx0}v${u.gry2-u.gry0}h${u.grx0-u.grx2}z`),v.append("svg:path").call(l.func).style("fill","none").attr("d",u=>(u.error=!0,(u.exlow>0?E(u.grx0+e,u.grdx0)+d:"")+(u.exhigh>0?E(u.grx2-e,u.grdx2)+p:"")+(u.eylow>0?E(u.grdy0,u.gry0-e)+k:"")+(u.eyhigh>0?E(u.grdy2,u.gry2+e)+b:"")))}if(i.Mark){this.createAttMarker({attr:f,style:i.Mark-100}),this.marker_size=this.markeratt.getFullSize(),this.markeratt.resetPos();let h,m,c,e="",d=!(0,_.isBatchMode)()&&_.settings.Tooltip&&(!this.markeratt.fill||this.marker_size<7)&&!x&&a,p="",b=Math.max(5,Math.round(.7*this.marker_size)),k=1e6/(this.markeratt.getMarkerLength()+7),E=1;o?this.canOptimize()&&o.length>1.5*k&&(E=Math.min(2,Math.round(o.length/k))):o=this.optimizeBins(k);for(let v=0;v-this.marker_size&&m-this.marker_size&&c`M${t.grx(e)},${t.gry(h)}L${t.grx(m)},${t.gry(c)}`,f=(i.fYq2-i.fYq1)*(t.scale_xmin-i.fXq1)/(i.fXq2-i.fXq1)+i.fYq1,y=(i.fYq2-i.fYq1)*(t.scale_xmax-i.fXq1)/(i.fXq2-i.fXq1)+i.fYq1;g=ft.scale_ymax?a(s,l,(i.fXq2-i.fXq1)*(t.scale_ymax-i.fYq1)/(i.fYq2-i.fYq1)+i.fXq1,t.scale_ymax):a(s,l,t.scale_xmax,y);let o=new O.rE({style:1,width:1,color:"black"}),x=new O.rE({style:2,width:1,color:"black"});this.draw_g.append("path").attr("d",a(r,n,s,l)).call(o.func).style("fill","none"),this.draw_g.append("path").attr("d",g).call(x.func).style("fill","none")}drawBins3D(){console.log("Load ./hist/TGraphPainter.mjs to draw graph in 3D")}drawGraph(){let t=this.get_main(),i=this.getObject();if(!t)return;if(this.options.pos3d)return this.drawBins3D(t,i);let r=!!this.get_gme(),s=t.getGrFuncs(this.options.second_x,this.options.second_y),n=t.getFrameWidth(),l=t.getFrameHeight();if(this.createG(!t.pad_layer),this.options._pfc||this.options._plc||this.options._pmc){let a=this.getMainPainter();if((0,_.isFunc)(a?.createAutoColor)){let f=a.createAutoColor();this.options._pfc&&(i.fFillColor=f,delete this.fillatt),this.options._plc&&(i.fLineColor=f,delete this.lineatt),this.options._pmc&&(i.fMarkerColor=f,delete this.markeratt),this.options._pfc=this.options._plc=this.options._pmc=!1}}this.createAttLine({attr:i,can_excl:!0}),this.createAttFill({attr:i}),this.fillatt.used=!1,this.draw_kind="none",this.marker_size=0;let g=r?this.draw_g.append("svg:g"):this.draw_g;if(this.drawBins(s,this.options,g,n,l,this.lineatt,this.fillatt,!0),"TGraphQQ"==i._typename&&this.appendQQ(s,i),r){for(let a=0;a=a)return;if(h.error||h.rect||h.marker)c={x1:Math.min(-s,h.grx0,-y),x2:Math.max(s,h.grx2,y),y1:Math.min(-s,h.gry2,-y),y2:Math.max(s,h.gry0,y)};else if(h.bar){if(c={x1:-h.width/2,x2:h.width/2,y1:0,y2:r-h.gry1},n){let b=l.gry(0);c.y1=h.gry1>b?b-h.gry1:0,c.y2=h.gry1>b?0:b-h.gry1}}else c={x1:-5,x2:5,y1:-5,y2:5};let p=t.y>=h.gry1+c.y1&&t.y<=h.gry1+c.y2;t.x>=h.grx1+c.x1&&t.x<=h.grx1+c.x2&&(p||t.nproc>1)&&(a=m,g=this,f=c,f.exact=p)}),null===g)return null;let o=(0,P.Ys)(g).datum(),x=this.getObject(),e={name:x.fName,title:x.fTitle,x:o.grx1,y:o.gry1,color1:this.lineatt.color,lines:this.getTooltips(o),rect:f,d3bin:g};return e.user_info={obj:x,name:x.fName,bin:o.indx,cont:o.y,grx:o.grx1,gry:o.gry1},this.fillatt&&this.fillatt.used&&!this.fillatt.empty()&&(e.color2=this.fillatt.getFillColor()),f.exact&&(e.exact=!0),e.menu=e.exact,e.menu_dist=3,e.bin=o,e.binindx=o.indx,e}showTooltip(t){if(!t)return void(this.draw_g&&this.draw_g.select(".tooltip_bin").remove());if(t.usepath)return this.showTooltipForPath(t);let i=(0,P.Ys)(t.d3bin).datum(),r=this.draw_g.select(".tooltip_bin");r.empty()&&(r=this.draw_g.append("svg:rect").attr("class","tooltip_bin h1bin").style("pointer-events","none")),t.changed=r.property("current_bin")!==t.d3bin,t.changed&&r.attr("x",i.grx1+t.rect.x1).attr("width",t.rect.x2-t.rect.x1).attr("y",i.gry1+t.rect.y1).attr("height",t.rect.y2-t.rect.y1).style("opacity","0.3").property("current_bin",t.d3bin)}processTooltipEvent(t){let i=this.extractTooltip(t);return(!t||!t.disabled)&&this.showTooltip(i),i}findBestBin(t){if(!this.bins)return null;let g,a,f,y,o,i="lines"==this.draw_kind,r=-1,s=null,n=1e10,l=this.get_main().getGrFuncs(this.options.second_x,this.options.second_y);for(y=0;y100&&i&&(s=null);let x=Math.max(this.lineatt.width+3,4);this.marker_size>0&&(x=Math.max(this.marker_size,x)),s&&(n=Math.sqrt((t.x-l.grx(s.x))**2+(t.y-l.gry(s.y))**2)),!i&&n>x&&(s=null),s||(r=-1);let e={bin:s,indx:r,dist:n,radius:Math.round(x)};if(!s&&i){n=1e10;const h=(b,k,E)=>k>=b&&b>=E||k<=b&&b<=E;let d,m=this.bins[0],c=l.grx(m.x),p=0;for(y=1;y1&&i.append("svg:circle").attr("cy",Math.round(t.gry2));let r=i.selectAll("circle").attr("r",t.radius).attr("cx",Math.round(t.x));t.islines?(this.options.Line||this.options.Curve?r.call(this.lineatt.func):r.style("stroke","black"),this.options.Fill?r.call(this.fillatt.func):r.style("fill","none")):r.style("stroke","black"==t.color1?"green":"black").style("fill","none")}}else i.remove()}moveEnabled(){return this.testEditable()}moveStart(t,i){this.pos_dx=this.pos_dy=0,this.move_funcs=this.get_main().getGrFuncs(this.options.second_x,this.options.second_y);let r=this.extractTooltip({x:t,y:i});r&&r.exact&&void 0!==r.binindx?(this.move_binindx=r.binindx,this.move_bin=r.bin,this.move_x0=this.move_funcs.grx(this.move_bin.x),this.move_y0=this.move_funcs.gry(this.move_bin.y)):delete this.move_binindx}moveDrag(t,i){this.pos_dx+=t,this.pos_dy+=i,void 0===this.move_binindx?this.draw_g.attr("transform",`translate(${this.pos_dx},${this.pos_dy})`):this.move_funcs&&this.move_bin&&(this.move_bin.x=this.move_funcs.revertAxis("x",this.move_x0+this.pos_dx),this.move_bin.y=this.move_funcs.revertAxis("y",this.move_y0+this.pos_dy),this.drawGraph())}moveEnd(t){let i="";if(void 0===this.move_binindx){if(this.draw_g.attr("transform",null),this.move_funcs&&this.bins&&!t){for(let r=0;r{this.testEditable("toggle"),this.drawGraph()}),t.size()>0}executeMenuCommand(t,i){if(super.executeMenuCommand(t,i))return!0;let r=this.getCanvPainter(),s=this.get_main();if("RemovePoint"==t.fName||"InsertPoint"==t.fName){if(!r||r._readonly)return!0;let n=this.extractTooltip(pnt);if("InsertPoint"==t.fName){let l=(0,_.isFunc)(s.getLastEventPos)?s.getLastEventPos():null;if(l){let g=s.getGrFuncs(this.options.second_x,this.options.second_y),a=g.revertAxis("x",l.x)??0,f=g.revertAxis("y",l.y)??0;this.submitCanvExec(`AddPoint(${a.toFixed(3)}, ${f.toFixed(3)})`,this.args_menu_id)}}else this.args_menu_id&&void 0!==n?.binindx&&this.submitCanvExec(`RemovePoint(${n.binindx})`,this.args_menu_id);return!0}return!1}updateObject(t,i){if(!this.matchObjectType(t))return!1;i&&i!=this.options.original&&this.decodeOptions(i);let r=this.getObject();if(r.fBits=t.fBits,r.fTitle=t.fTitle,r.fX=t.fX,r.fY=t.fY,r.fNpoints=t.fNpoints,r.fMinimum=t.fMinimum,r.fMaximum=t.fMaximum,this.createBins(),delete this.$redraw_hist,this.axes_draw){let s=this.createHistogram();s.fTitle=r.fTitle;let n=this.getMainPainter();n?.$secondary&&(n.updateObject(s,this.options.Axis),this.$redraw_hist=!0)}return!0}canZoomInside(t,i,r){let s=this.getObject();if(!s||t!==(this.options.pos3d?"y":"x"))return!1;for(let n=0;ni._typename==_.clTF1||i._typename==_.clTF2):null}findStat(){let t=this.getObject();if(t?.fFunctions?.arr)for(let i=0;i=(r?.fFunctions?.arr?.length||0))return i;let s=i.getPadPainter(),n=r.fFunctions.arr[t],l=r.fFunctions.opt[t];return n.$main_painter=i,s.drawObject(i.getDom(),n,l).then(()=>i.drawNextFunction(t+1))})()}drawAxisHisto(){var t=this;return(0,$.Z)(function*(){let i=t.createHistogram();return j.f.draw(t.getDom(),i,t.options.Axis)})()}static _drawGraph(t,i){return(0,$.Z)(function*(){t.decodeOptions(i,!0),t.createBins(),t.createStat(),!_.settings.DragGraphs&&!graph.TestBit(T)&&graph.InvertBit(T);let r=Promise.resolve();return(!t.getMainPainter()||t.options.second_x||t.options.second_y)&&t.options.Axis&&(r=t.drawAxisHisto().then(s=>{s&&(t.axes_draw=!0,t._own_histogram||(t.$primary=!0),s.$secondary="hist")})),r.then(()=>(t.addToPadPrimitives(),t.drawGraph())).then(()=>t.drawNextFunction(0))})()}static draw(t,i,r){return(0,$.Z)(function*(){return A._drawGraph(new A(t,i),r)})()}}}}]); +//# sourceMappingURL=241.4ed7b8d7fa416235.js.map \ No newline at end of file diff --git a/docs/879.0345d9de530d51ee.js.map b/docs/241.4ed7b8d7fa416235.js.map similarity index 99% rename from docs/879.0345d9de530d51ee.js.map rename to docs/241.4ed7b8d7fa416235.js.map index 30b792e5a..aa8a137e5 100644 --- a/docs/879.0345d9de530d51ee.js.map +++ b/docs/241.4ed7b8d7fa416235.js.map @@ -1 +1 @@ -{"version":3,"file":"879.0345d9de530d51ee.js","mappings":"qQAWA,MAAMA,KAAeC,OAAI,IACnBC,EAAiB,eACjBC,EAAsB,oBACtBC,EAAqB,mBACrBC,EAAsB,oBAQ5B,MAAMC,UAAsBC,KAEzBC,YAAYC,EAAKC,GACdC,MAAMF,EAAKC,GACXE,KAAKC,WAAY,EACjBD,KAAKE,KAAO,KACZF,KAAKG,KAAOH,KAAKI,KAAOJ,KAAKK,KAAOL,KAAKM,KAAO,EAChDN,KAAKO,aAAc,EACnBP,KAAKQ,QAAWV,EAAMW,WAAajB,EACnCQ,KAAKU,WAAcZ,EAAMW,WAAanB,GACnBQ,EAAMW,WAAahB,GACnBK,EAAMW,WAAalB,GACnBS,KAAKQ,SAAWV,EAAMW,UAAUE,MAAM,WAC5D,CAKMC,SAAS,qCACZ,IAAIC,EAAUC,QAAQC,SAAQ,GAE9B,GAAIC,EAAKC,aAAc,QACbD,EAAKC,aACZ,IAAIC,EAAeF,EAAKG,iBACpBD,GAAcE,YAAcJ,EAAKf,YAClCY,EAAUK,EAAaN,SAC7B,CAEA,OAAOC,EAAQQ,KAAK,IAAML,EAAKM,YAAa,EAVhC,EAWf,CAGAC,iBACUvB,KAAKwB,uBACLxB,KAAKE,KACZH,MAAMwB,SACT,CAGAE,UACG,IAAI3B,EAAQE,KAAK0B,YACjB,OAAO5B,GAAOW,WAAahB,EAAsBK,EAAQ,IAC5D,CAGA6B,cAAcC,EAAKC,IAEhB,EAAIC,SAAMF,IAAiC,GAAxBA,EAAIG,QAAQ,WAC5BH,EAAMA,EAAII,MAAM,IAEnB,IAAIlC,EAAQE,KAAK0B,YACbO,IAAWjC,KAAKyB,UAChBS,EAAa,GACbC,EAAWN,IAAe7B,KAAKmB,kBAAoBnB,KAAKC,UAEvDD,KAAKoC,UAASpC,KAAKoC,QAAU,CAAC,GAGnC,MAAMC,EAAc,CAACC,EAAGC,KACrBC,OAAOC,OAAOF,EAAK,CAAEG,KAAM,EAAGC,MAAO,EAAGC,KAAM,EAAGC,KAAM,EAAGC,IAAK,EAAGC,SAAU,EAAGC,GAAG,EAAGC,KAAM,EAAGC,UAAW,EAAGC,KAAM,EAAGC,UAAW,IAE5HnB,GAAUK,EAAEe,MAAM,MAAM,KAAOd,EAAIa,UAAYd,EAAEgB,eAEjDhB,EAAEe,MAAM,OAAMd,EAAIG,KAAO,GACzBJ,EAAEe,MAAM,OAAMd,EAAIU,KAAO,GACzBX,EAAEe,MAAM,QAAOd,EAAII,MAAQ,GAC3BL,EAAEe,MAAM,OAAMd,EAAII,MAAQ,GAC1BL,EAAEe,MAAM,OAAMd,EAAIM,KAAO,KACzBP,EAAEe,MAAM,QAAOd,EAAIM,KAAO,KAC1BP,EAAEe,MAAM,OAAMd,EAAIM,KAAO,GACzBP,EAAEe,MAAM,OAAQd,EAAIO,IAAM,EAAGP,EAAIgB,OAAS,GAC1CjB,EAAEe,MAAM,OAAQd,EAAIgB,OAAS,EAAGhB,EAAIY,KAAO,GAC3Cb,EAAEe,MAAM,QAASd,EAAIgB,OAAS,EAAGhB,EAAIW,UAAY,EAAGX,EAAIY,KAAO,GAC/Db,EAAEe,MAAM,QAASd,EAAIgB,OAAS,EAAGhB,EAAIW,UAAY,EAAGX,EAAIY,KAAO,GAC/Db,EAAEe,MAAM,QAASd,EAAIgB,OAAS,EAAGhB,EAAIY,KAAO,GAC5Cb,EAAEe,MAAM,OAAQd,EAAIgB,OAAS,EAAGhB,EAAIY,KAAO,GAC3Cb,EAAEe,MAAM,OAAQd,EAAIM,KAAO,EAAGN,EAAIgB,OAAS,EAAGhB,EAAIQ,SAAW,GAC7DT,EAAEe,MAAM,MAAuB,GAAXd,EAAIO,MAAUP,EAAIO,IAAM,GAC5CR,EAAEe,MAAM,OAAQd,EAAIK,KAAO,EAAGL,EAAIgB,OAAS,GAC3CjB,EAAEe,MAAM,OAAQd,EAAIS,GAAK,EAAGT,EAAIgB,OAAS,GACzCjB,EAAEe,MAAM,OAAQd,EAAIS,GAAK,EAAGT,EAAIgB,OAAS,GACzCjB,EAAEe,MAAM,OAAQd,EAAIK,KAAO,EAAGL,EAAIgB,OAAS,GAC3CjB,EAAEe,MAAM,OAAMd,EAAIgB,OAAS,IAGlCf,OAAOC,OAAOzC,KAAKoC,QAAS,CAAEoB,KAAM,GAAIC,MAAO,EAAGC,UAAU,EAAOC,SAAU/B,EAAKgC,UAAU,EAAOC,UAAU,EAAOC,mBAAmB,IAEnI7B,GAAUL,IACPA,EAAIG,QAAQ,KAAO,GACpBG,EAAaN,EAAImC,MAAM,KACvBnC,EAAMM,EAAW8B,SACTpC,EAAIG,QAAQ,KAAO,IAC3BG,EAAaN,EAAImC,MAAM,KACvBnC,EAAMM,EAAW8B,UAIvB,IAAIzB,EAAMvC,KAAKoC,QACXE,EAAI,IAAI2B,KAAYrC,GAGxBW,EAAImB,SAAWpB,EAAEe,MAAM,iBACvB,IAAIa,EAAO,GAkDX,GAlD2B,CAAC,gBAAiB,QAAS,OAAQ,OAAQ,OAAQ,SAAU,QAAS,QAAS,SAAU,QAAS,SACnHC,QAAQC,IAAc9B,EAAEe,MAAMe,KAAOF,GAAQ,IAAME,KACzD9B,EAAEe,MAAM,UAAU,KAAOa,GAAQ,UAAY5B,EAAE+B,MAC/C/B,EAAEe,MAAM,UAAU,KAAOa,GAAQ,UAAY5B,EAAE+B,MAE/C/B,EAAEgC,UACH/B,EAAIoB,SAAWxB,EAAW,KAAO,MACjCG,EAAI,IAAI2B,KAAY1B,EAAIoB,WAGvBrB,EAAEe,MAAM,WAAUd,EAAIkB,MAAQ,GAE9BnB,EAAEe,MAAM,UAAU,KAAOd,EAAIgC,MAAQjC,EAAEkC,YAAc,IAEzDjC,EAAIkC,KAAOnC,EAAEe,MAAM,OACnBd,EAAImC,KAAOpC,EAAEe,MAAM,OACnBd,EAAIoC,KAAOrC,EAAEe,MAAM,OAEff,EAAEe,MAAM,OAAMd,EAAIiB,KAAOlB,EAAEe,MAAM,KAAO,IAAM,QAC9Cf,EAAEe,MAAM,QAASd,EAAIiB,MAAQ,KAAMjB,EAAIqB,SAAWzB,GAClDG,EAAEe,MAAM,QAASd,EAAIiB,MAAQ,KAAMjB,EAAIsB,SAAW1B,GAClDG,EAAEe,MAAM,QAAOd,EAAIiB,MAAQ,MAC3BlB,EAAEe,MAAM,QAAOd,EAAIiB,MAAQ,MAE3BvB,IACDM,EAAIqC,OAAS,GACbrC,EAAIsC,eAAiBtC,EAAIuC,gBAAiB,EACtCxC,EAAEe,MAAM,QAAOd,EAAIsC,gBAAiB,GACpCvC,EAAEe,MAAM,QAAOd,EAAIuC,gBAAiB,IAG3CzC,EAAYC,EAAGC,GAEXN,GACGK,EAAEe,MAAM,OAAMd,EAAIuB,mBAAoB,QAK1BiB,IAAfxC,EAAIgB,SACLhB,EAAIgB,QAASvD,KAAKU,YAAgBuB,GAAWC,EAAW8C,OAAc,EAAJ,GAGpD,GAAZzC,EAAIM,MAAqC,GAAtB/C,EAAMmF,eAAoB1C,EAAIM,KAAO,KAGzDN,EAAIG,KAAOH,EAAIU,KAAOV,EAAII,MAAQJ,EAAIM,KAAON,EAAIO,IAAMP,EAAIS,GAAKT,EAAIK,KAAOL,EAAIgB,QAAU,GACtFjB,EAAEgC,UAAS/B,EAAIG,KAAO,GAGzB5C,EAAMW,WAAanB,EAAgB,CACpC,IAAI4F,EAAMpF,EAAMqF,IAAIH,OAAQI,EAAI,EAChC,QAASC,EAAI,EAAGA,EAAIH,IAAOG,EACxBD,EAAIE,KAAKC,IAAIH,EAAGtF,EAAMqF,IAAIE,GAAIvF,EAAM0F,IAAIH,IACvCD,EAAI,SACL7C,EAAIgB,OAAS,EACnB,CAEA,GAAKhB,EAAIiB,KAOEjB,EAAIiB,KAAKzB,QAAQ,KAAO,IAChCQ,EAAIiB,KAAO,QAAUjB,EAAIiB,UARb,CAIZ,IACIiC,EADKzF,KAAK0F,iBACAC,YAAW,KACpBF,GAAQA,GAAKG,aAAaC,IAAI,KAAO/F,KAAQyC,EAAIiB,KAAO,OAChE,CAIAjB,EAAIiB,MAAQU,EAEZ,QAAS4B,EAAK,EAAGA,EAAK5D,EAAW8C,SAAUc,EAAI,CAC5C,IAA4CC,EAAS,CAAC,EACtD1D,EADW,IAAI4B,KAAY/B,EAAW4D,IACpBC,GAClBA,EAAOlB,eAAiBtC,EAAIsC,eAC5BkB,EAAOjB,eAAiBvC,EAAIuC,eAC5BvC,EAAIqC,OAAOoB,KAAKD,EACnB,CACH,CAGAE,iBAAiBC,GACd,IAAKlG,KAAKE,KAAM,OAChB,IAAIiG,EAAKnG,KAAK0B,YACd1B,KAAKE,KAAKiE,QAAQiC,IACfA,EAAIC,MAASF,EAAGG,KAAKJ,GAAQE,EAAIG,MACjCH,EAAII,OAASL,EAAGM,KAAKP,GAAQE,EAAIG,KAAI,EAE3C,CAGAG,aACG,IAAIP,EAAKnG,KAAK0B,YACd,IAAKyE,EAAI,OAET,IAAIQ,EAAO,EAAGC,EAAUT,EAAGU,SACtBV,EAAG1F,YAAcqG,WAAaF,EAAU,GAAIA,IAE7CT,EAAG1F,WAAanB,EACjBqH,EAAO,EACDR,EAAG1F,WAAahB,EACtBkH,EAAO,GACDR,EAAG1F,WAAalB,GAAuB4G,EAAG1F,WAAajB,GAAsB2G,EAAG1F,UAAUE,MAAM,eACtGgG,EAAO,GAEV3G,KAAKE,KAAO,IAAI6G,MAAMH,GAEtB,QAASI,EAAI,EAAGA,EAAIJ,IAAWI,EAAG,CAC/B,IAAIZ,EAAMpG,KAAKE,KAAK8G,GAAK,CAAEC,EAAGd,EAAGe,GAAGF,GAAIG,EAAGhB,EAAGiB,GAAGJ,GAAIT,KAAMS,GAC3D,OAAOL,GACJ,KAAK,EACFP,EAAIiB,MAAQjB,EAAIkB,OAASnB,EAAGhB,IAAI6B,GAChCZ,EAAIC,MAAQD,EAAII,OAASL,EAAGX,IAAIwB,GAChC,MACH,KAAK,EACFZ,EAAIiB,MAASlB,EAAGoB,KAAKP,GACrBZ,EAAIkB,OAASnB,EAAGqB,KAAKR,GACrBZ,EAAIC,MAASF,EAAGG,KAAK,GAAGU,GACxBZ,EAAII,OAASL,EAAGM,KAAK,GAAGO,GACxB,MACH,KAAK,EACFZ,EAAIiB,MAASlB,EAAGsB,OAAOT,GACvBZ,EAAIkB,OAASnB,EAAGuB,QAAQV,GACxBZ,EAAIC,MAASF,EAAGwB,OAAOX,GACvBZ,EAAII,OAASL,EAAGyB,QAAQZ,GAIpB,IAANA,IACDhH,KAAKG,KAAOH,KAAKK,KAAO+F,EAAIa,EAC5BjH,KAAKI,KAAOJ,KAAKM,KAAO8F,EAAIe,GAG3BR,EAAO,GACR3G,KAAKG,KAAOmF,KAAKuC,IAAI7H,KAAKG,KAAMiG,EAAIa,EAAIb,EAAIiB,MAAOjB,EAAIa,EAAIb,EAAIkB,QAC/DtH,KAAKK,KAAOiF,KAAKC,IAAIvF,KAAKK,KAAM+F,EAAIa,EAAIb,EAAIiB,MAAOjB,EAAIa,EAAIb,EAAIkB,QAC/DtH,KAAKI,KAAOkF,KAAKuC,IAAI7H,KAAKI,KAAMgG,EAAIe,EAAIf,EAAIC,MAAOD,EAAIe,EAAIf,EAAII,QAC/DxG,KAAKM,KAAOgF,KAAKC,IAAIvF,KAAKM,KAAM8F,EAAIe,EAAIf,EAAIC,MAAOD,EAAIe,EAAIf,EAAII,UAE/DxG,KAAKG,KAAOmF,KAAKuC,IAAI7H,KAAKG,KAAMiG,EAAIa,GACpCjH,KAAKK,KAAOiF,KAAKC,IAAIvF,KAAKK,KAAM+F,EAAIa,GACpCjH,KAAKI,KAAOkF,KAAKuC,IAAI7H,KAAKI,KAAMgG,EAAIe,GACpCnH,KAAKM,KAAOgF,KAAKC,IAAIvF,KAAKM,KAAM8F,EAAIe,GAE1C,CACH,CAMAW,gBAAgBC,EAAOC,IACfD,IAAUC,IACZD,EAAQC,GAAQ,GAEnB,IAAI7H,EAAOH,KAAKG,KAAME,EAAOL,KAAKK,KAAMD,EAAOJ,KAAKI,KAAME,EAAON,KAAKM,KAElEH,GAAQE,IAAMA,EAAOF,EAAK,GAC1BC,GAAQE,IAAMA,EAAOF,EAAK,GAC9B,IAAI6H,EAAiB,IAAX5H,EAAKF,GAAW+H,EAAiB,IAAX5H,EAAKF,GACjC+H,EAAQhI,EAAO8H,EAAIG,EAAQ/H,EAAO4H,EAClCI,EAAUjI,EAAO8H,EAAII,EAAUhI,EAAO4H,EAErCC,EAAQ,GAAOhI,GAAQ,IAAIgI,EAAa,GAALhI,GACnCiI,EAAQ,GAAO/H,GAAQ,IAAI+H,EAAQ,GAExC,IAAItI,EAAQE,KAAK0B,YACb6G,EAAQzI,EAAM0I,WACdC,EAAWJ,EAASK,EAAWJ,EAEnC,GAAKC,EAMOA,EAAMI,UAAYC,WAAaL,EAAMM,UAAYD,YAC1DP,EAAUE,EAAMM,SAChBP,EAAUC,EAAMI,cARP,CACTJ,EAAQzI,EAAM0I,cAAaV,mBAAgB,OAAQ,KACnDS,EAAMO,MAAQhJ,EAAMgJ,MAAQ,KAC5B,MAAMC,KAAW1J,OAAI,GACrBkJ,EAAMS,MAAQT,EAAMS,MAAQD,EAC5B/I,KAAKiJ,gBAAiB,CACzB,CAKA,OAAInJ,EAAM+I,UAAYD,YAASP,EAAUjI,EAAON,EAAM+I,UAClD/I,EAAM6I,UAAYC,YAASN,EAAUxI,EAAM6I,UAC1CN,EAAU,GAAOjI,GAAQ,IAAIiI,EAAU,GAAIjI,GAEhDmI,EAAMW,OAASpJ,EAAMoJ,OAEjBnB,IACDQ,EAAMY,OAAOC,MAAQjB,EACrBI,EAAMY,OAAOE,MAAQjB,GAGpBJ,IACDO,EAAMe,OAAOF,MAAQ9D,KAAKuC,IAAIY,EAAUJ,GACxCE,EAAMe,OAAOD,MAAQ/D,KAAKC,IAAImD,EAAUJ,GACxCC,EAAMM,SAAWR,EACjBE,EAAMI,SAAWL,GAGbC,CACV,CAIAgB,gBAAgBC,EAAKC,GAClB,IAAI3J,EAAQE,KAAK0B,YACjB,GAAI1B,KAAKiJ,iBAAmBnJ,EAAO,OAAO,EAE1C,IAAIyI,EAAQzI,EAAM0I,WAIlB,OADAiB,EAAMA,GAAOlB,IAAWA,EAAMe,OAAOF,MAAQpJ,KAAKI,MAAUmI,EAAMe,OAAOD,MAAQrJ,KAAKM,UADtFkJ,EAAMA,GAAOjB,IAAWA,EAAMY,OAAOC,MAAQpJ,KAAKG,MAAUoI,EAAMY,OAAOE,MAAQrJ,KAAKK,SAEzEoJ,IAEbzJ,KAAK8H,gBAAgB0B,EAAKC,GAC1BzJ,KAAKmB,kBAAkBuI,sBAAsB,GAEtC,GACV,CAGAC,cACG,OAAQC,wBAAwB,IAAO5J,KAAKoC,QAAQqB,KACvD,CAGAoG,aAAaC,EAAQC,GAClB,GAAK/J,KAAKE,KAAK8E,OAAS,KAAQ+E,EAAa,OAAO/J,KAAKE,KAEzD,IAAI8J,EAAU,KACd,MAAIC,UAAOF,GACR,QAASG,EAAI,EAAGA,EAAIlK,KAAKE,KAAK8E,SAAUkF,EACjCH,EAAY/J,KAAKE,KAAKgK,GAAGA,GACrBF,IAASA,EAAgB,GAALE,EAAU,GAAKlK,KAAKE,KAAK8B,MAAM,EAAGkI,IAEvDF,GAASA,EAAQhE,KAAKhG,KAAKE,KAAKgK,IAQ7C,GAJKF,IAASA,EAAUhK,KAAKE,MAExB4J,IAAQA,EAAS,KAEjBE,EAAQhF,OAAS8E,IAAY9J,KAAK2J,cAAe,OAAOK,EAC7D,IAAIG,EAAO7E,KAAK8E,MAAMJ,EAAQhF,OAAS8E,GACnCK,EAAO,IAAGA,EAAO,GACrB,IAAIE,EAAU,GACd,QAASH,EAAI,EAAGA,EAAIF,EAAQhF,OAAQkF,GAAGC,EACpCE,EAAQrE,KAAKgE,EAAQE,IAExB,OAAOG,CACV,CAGAC,YAAYhI,GACT,IAA6BiI,EAAQ,GACjCC,EADQxK,KAAKyK,WACCC,WAAW1K,KAAKoC,QAAQwB,SAAU5D,KAAKoC,QAAQyB,UAC7D8G,EAAM3K,KAAKyB,UAIf,GAFA8I,EAAMvE,KAAKhG,KAAK4K,iBAEZtI,GAAKkI,EASN,QARezF,IAAXzC,EAAEiE,MACHgE,EAAMvE,KAAK,OAAS1D,EAAEiE,MACzBgE,EAAMvE,KAAK,OAASwE,EAAMK,WAAW,IAAKvI,EAAE2E,GAAI,OAASuD,EAAMK,WAAW,IAAKvI,EAAE6E,IAC7EwD,EACDJ,EAAMvE,KAAK,cAAgBwE,EAAMK,WAAW,IAAKF,EAAIpD,KAAKjF,EAAEiE,OAAS,KAAOiE,EAAMK,WAAW,IAAKF,EAAInD,KAAKlF,EAAEiE,QACvGvG,KAAKoC,QAAQmB,QAAkC,UAAvBiH,EAAMM,SAASnE,OAAsBrE,EAAE+E,OAAS/E,EAAEgF,SAChFiD,EAAMvE,KAAK,cAAgBwE,EAAMK,WAAW,IAAKvI,EAAE+E,OAAS,KAAOmD,EAAMK,WAAW,IAAKvI,EAAEgF,SAE1FqD,EACD,QAASI,EAAK,EAAGA,EAAKJ,EAAIK,YAAaD,EACpCR,EAAMvE,KAAM,UAAS+E,QAASP,EAAMK,WAAW,IAAKF,EAAIrE,KAAKyE,GAAIzI,EAAEiE,WAAWiE,EAAMK,WAAW,IAAKF,EAAIlE,KAAKsE,GAAIzI,EAAEiE,eAC7GvG,KAAKoC,QAAQmB,QAAWvD,KAAKoC,QAAQY,GAAK,IAA+B,UAAvBwH,EAAMS,SAAStE,OAAsBrE,EAAE+D,OAAS/D,EAAEkE,SAC7G+D,EAAMvE,KAAK,cAAgBwE,EAAMK,WAAW,IAAKvI,EAAE+D,OAAS,KAAOmE,EAAMK,WAAW,IAAKvI,EAAEkE,SAGjG,OAAO+D,CACV,CAIAE,WACG,IAAIS,EAAQlL,KAAKmL,kBAEjB,GAAID,GAASA,EAAME,KAAOF,EAAMG,IAAK,OAAOH,EAG5C,IAAII,EAAKtL,KAAK0F,gBACV6F,EAAOD,GAAIE,cAAgB,CAAEC,MAAO,IAAKC,OAAQ,KAErDR,SAAQ,CACJS,WAAW,EACXlG,IAAK6F,GAAI3F,YAAW,GACpBiG,GAAIL,EAAKE,MACTI,GAAIN,EAAKG,OACTI,gBAAkB,OAAO9L,KAAK4L,EAAI,EAClCG,iBAAmB,OAAO/L,KAAK6L,EAAI,EACnCT,IAAIY,GACD,OACGA,EADChM,KAAKyF,IAAIwG,MACDD,EAAQ,EAAK1G,KAAK4G,MAAMF,GAAShM,KAAKyF,IAAI0G,QAE1CH,EAAQhM,KAAKyF,IAAI2G,MAAQpM,KAAKyF,IAAI4G,IAAMrM,KAAKyF,IAAI2G,MAC9CpM,KAAK4L,EACvB,EACAP,IAAIW,GACD,OAIQ,GAHLA,EADChM,KAAKyF,IAAI6G,MACDN,EAAQ,EAAK1G,KAAK4G,MAAMF,GAAShM,KAAKyF,IAAI8G,QAE1CP,EAAQhM,KAAKyF,IAAI+G,MAAQxM,KAAKyF,IAAIgH,IAAMzM,KAAKyF,IAAI+G,OACxCxM,KAAK6L,EAC7B,EACAa,WAAWtI,EAAMuI,GACf,MAAY,KAARvI,EACMuI,EAAI3M,KAAK4L,IAAM5L,KAAKyF,IAAI4G,IAAMrM,KAAKyF,IAAI2G,KAAOpM,KAAKyF,IAAI2G,IACrD,KAARhI,GACO,EAAIuI,EAAI3M,KAAK6L,KAAO7L,KAAKyF,IAAIgH,IAAMzM,KAAKyF,IAAI+G,KAAOxM,KAAKyF,IAAI+G,IAChEG,CACT,EACAjC,aAAe,OAAO1K,IAAM,GAGzBkL,EAAMzF,IAAMyF,EAAQ,IAC9B,CAGA0B,gBAAgBC,EAAUC,EAAMC,EAAUC,GACvC,IAAIC,EAAY,GAChB,QAAS/C,EAAI6C,EAAS/H,OAAO,EAAGkF,GAAK,IAAKA,EAAG,CAC1C,IAAI9D,EAAM2G,EAAS7C,GACfgD,EAAO5H,KAAK6H,KAAK/G,EAAIgH,MAAM,EAAIhH,EAAIiH,MAAM,GAE7CjH,EAAIgF,KAAO4B,EAAW5G,EAAIiH,KAAKH,EAC/B9G,EAAIiF,KAAO2B,EAAW5G,EAAIgH,KAAKF,EAC/BD,EAAUjH,KAAKI,EAClB,CAEA,IAAIkH,KAAQC,MAAaV,EAAW,UAAY,QAASI,GAEzDjN,KAAKwN,OAAOC,OAAO,YACPC,KAAK,IAAKZ,EAAKA,KAAOQ,EAAMR,KAAO,KACnCa,KAAK3N,KAAK4N,QAAQC,MAClBC,MAAM,UAAW,IAChC,CAIAC,SAASvD,EAAOpI,EAASoL,EAAQQ,EAAGC,EAAGC,EAASN,EAASO,GACtD,IAAIrO,EAAQE,KAAK0B,YACbsL,EAAa,EAAGD,EAAW,KAO/B,GALIoB,GAAcD,EAAQE,YACvBpB,EAAakB,EAAQlB,WAChBkB,EAAQzC,MAAQ,IAAOrJ,EAAQM,OAASN,EAAQO,QAAOP,EAAQM,KAAO,IAG1EN,EAAQY,GAAI,CACb+J,EAAW/M,KAAK6J,aAAczH,EAAQY,GAAK,EAAK,IAAQ,GAGxD,QAASkH,EAAI,EAAGA,EAAI6C,EAAS/H,SAAUkF,EAAG,CACvC,IAAI9D,EAAM2G,EAAS7C,GACnB9D,EAAIgF,IAAMZ,EAAMY,IAAIhF,EAAIa,GACxBb,EAAIiF,IAAMb,EAAMa,IAAIjF,EAAIe,EAAIf,EAAIC,MACnC,CAEA,IAAIgI,KAAQd,MAAcnL,EAAQY,GAAK,EAAK,SAAW,OAAQ+J,GAC3DuB,EAAQ,GAEZ,QAASpE,EAAI6C,EAAS/H,OAAO,EAAGkF,GAAK,IAAKA,EAAG,CAC1C,IAAI9D,EAAM2G,EAAS7C,GACnB9D,EAAIiF,IAAMb,EAAMa,IAAIjF,EAAIe,EAAIf,EAAII,QAChC8H,EAAMtI,KAAKI,EACd,CAGA,IAAIkH,KAAQC,MAAcnL,EAAQY,GAAK,EAAK,UAAY,QAASsL,GAEjEd,EAAOC,OAAO,YACPC,KAAK,IAAKW,EAAMvB,KAAOQ,EAAMR,KAAO,KACpCa,KAAKC,EAAQC,MAChBM,IACDnO,KAAKuO,UAAY,QACvB,CAEA,GAAInM,EAAQM,MAAQN,EAAQa,KAAM,CAE/B,IAAIuL,EAAe,GACf1O,EAAMW,WAAaqG,YAAS1E,EAAQa,KAAO,GAE3Cb,EAAQa,OACTuL,EAAe,IACfxB,EAAa,GAGXD,IAAUA,EAAW/M,KAAK6J,aAAa,IAE5C,QAASK,EAAI,EAAGA,EAAI6C,EAAS/H,SAAUkF,EAAG,CACvC,IAAI9D,EAAM2G,EAAS7C,GACnB9D,EAAIgF,IAAMZ,EAAMY,IAAIhF,EAAIa,GACxBb,EAAIiF,IAAMb,EAAMa,IAAIjF,EAAIe,EAC3B,CAEA,IAAIR,EAAO,OACPqG,IAAYrG,GAAQ,QAExB,IAAImG,KAAOS,MAAa5G,EAAMoG,GAE1BC,GACAhN,KAAK4M,iBAAgB,EAAOE,EAAMC,EAAUC,GAEhD,IAAIyB,EAAOjB,EAAOC,OAAO,YAAYC,KAAK,IAAKZ,EAAKA,KAAO0B,GACvDpM,EAAQM,MACT+L,EAAKd,KAAKO,EAAQL,MAEjBzL,EAAQa,KACTwL,EAAKd,KAAKC,EAAQC,MAElBY,EAAKX,MAAM,OAAQ,QAElBK,IACDnO,KAAKuO,UAAY,QACvB,CAEA,GAAInM,EAAQO,MAAO,CAChB,IAAI+L,EAAY3B,EAChB,GAAuB,SAAlB/M,KAAKuO,YAA0BG,GAAgC,GAAjBtM,EAAQO,OAAgB+L,EAAU1J,OAAS,IAAS,CACpG0J,EAAY1O,KAAK6J,aAA+B,GAAjBzH,EAAQO,MAAc,IAAQ,GAC7D,QAASuH,EAAI,EAAGA,EAAIwE,EAAU1J,SAAUkF,EAAG,CACxC,IAAI9D,EAAMsI,EAAUxE,GACpB9D,EAAIgF,IAAMZ,EAAMY,IAAIhF,EAAIa,GACxBb,EAAIiF,IAAMb,EAAMa,IAAIjF,EAAIe,EAC3B,CACH,CAEA,IAAIR,EAAO,SACPqG,IAAYrG,GAAQ,QAExB,IAAImG,KAAOS,MAAa5G,EAAM+H,GAE1B1B,GACAhN,KAAK4M,iBAAgB,EAAME,EAAM4B,EAAW1B,GAEhDQ,EAAOC,OAAO,YACPC,KAAK,IAAKZ,EAAKA,MACfa,KAAKO,EAAQL,MACbC,MAAM,OAAQ,QACjBK,IACDnO,KAAKuO,UAAY,QACvB,CAEA,IAAII,EAAQ,KAgDZ,IA9CIvM,EAAQmB,QAAUnB,EAAQQ,MAAQR,EAAQU,OAE3CiK,EAAW/M,KAAK6J,aAAa,IAAM,CAAC+E,EAAIC,KAErC,IAAIzD,EAAMZ,EAAMY,IAAIwD,EAAI3H,GAGxB,IAAK7E,EAAQU,MAASsI,EAAM,GAAOA,EAAM4C,GAAK,OAAO,EAErD,IAAI3C,EAAMb,EAAMa,IAAIuD,EAAIzH,GAExB,OAAK/E,EAAQU,MAAQV,EAAQW,WAAcsI,EAAM,GAAOA,EAAM4C,KAE9DW,EAAIE,KAAOxJ,KAAKyJ,MAAM3D,GACtBwD,EAAII,KAAO1J,KAAKyJ,MAAM1D,GAElBrL,KAAKU,aACNkO,EAAIK,KAAO3J,KAAKyJ,MAAMvE,EAAMY,IAAIwD,EAAI3H,EAAI7E,EAAQgB,UAAUwL,EAAIvH,OAAS+D,GACvEwD,EAAIM,KAAO5J,KAAKyJ,MAAMvE,EAAMY,IAAIwD,EAAI3H,EAAI7E,EAAQgB,UAAUwL,EAAItH,QAAU8D,GACxEwD,EAAIO,KAAO7J,KAAKyJ,MAAMvE,EAAMa,IAAIuD,EAAIzH,EAAIyH,EAAIvI,OAASgF,GACrDuD,EAAIQ,KAAO9J,KAAKyJ,MAAMvE,EAAMa,IAAIuD,EAAIzH,EAAIyH,EAAIpI,QAAU6E,GAElDrL,KAAKQ,SACNoO,EAAIS,MAAQ/J,KAAKyJ,MAAMvE,EAAMa,IAAIuD,EAAIzH,EAAIrH,EAAMwP,QAAQT,IAAMxD,GAC7DuD,EAAIW,MAAQjK,KAAKyJ,MAAMvE,EAAMa,IAAIuD,EAAIzH,EAAIrH,EAAM0P,SAASX,IAAMxD,GAC9DuD,EAAIa,MAAQnK,KAAKyJ,MAAMvE,EAAMY,IAAIwD,EAAI3H,EAAInH,EAAM4P,QAAQb,IAAMzD,GAC7DwD,EAAIe,MAAQrK,KAAKyJ,MAAMvE,EAAMY,IAAIwD,EAAI3H,EAAInH,EAAM8P,SAASf,IAAMzD,IAE9DwD,EAAIS,MAAQT,EAAIW,MAAQX,EAAIa,MAAQb,EAAIe,MAAQ,IAI/C,KAGNxB,IACDnO,KAAKuO,UAAY,SAEpBI,EAAQnB,EAAOqC,UAAU,YACVC,KAAK/C,GACLgD,QACAtC,OAAO,SACPC,KAAK,QAAS,WACdA,KAAK,YAAapL,GAAM,aAAYA,EAAEwM,QAAQxM,EAAE0M,UAG9D5M,EAAQU,IAAK,CAEd,QAAS+L,EAAI,EAAGA,EAAI9B,EAAS/H,OAAO,IAAK6J,EACtC9B,EAAS8B,GAAGpD,MAAQnG,KAAKC,IAAI,GAAIwH,EAAS8B,EAAE,GAAGC,KAAO/B,EAAS8B,EAAE,GAAGC,MAAQ,EAAI,GAGnF,OAAQ/B,EAAS/H,QACd,KAAK,EAAG,MACR,KAAK,EAAG+H,EAAS,GAAGtB,MAAQuC,EAAE,EAAG,MACjC,KAAK,EAAGjB,EAAS,GAAGtB,MAAQsB,EAAS,GAAGtB,OAASsB,EAAS,GAAG+B,KAAK/B,EAAS,GAAG+B,MAAM,EAAG,MACvF,QACG/B,EAAS,GAAGtB,MAAQsB,EAAS,GAAGtB,MAChCsB,EAASA,EAAS/H,OAAO,GAAGyG,MAAQsB,EAASA,EAAS/H,OAAO,GAAGyG,MAGtE,IAAIuE,EAAM1K,KAAKyJ,MAAMvE,EAAMa,IAAI,IAAK4E,EAAUrC,EAE9C,GAAIO,EAAY,CACb,IAAI+B,EAAKlQ,KAAKmL,kBACVgF,EAAQD,GAAItC,UAAYsC,GAAItC,QAAQtJ,QAAU4L,EAAGtC,QAAQwC,gBAAiB,EAC1ED,IAAUvC,EAAQwC,iBACnBH,EAAU,IAAII,IAAgB,CAAEC,MAAgB,SAATH,EAAmB,EAAI,EAAGI,QAAS,OAChF,CAEA5B,EAAMlB,OAAO,YACPC,KAAK,IAAKpL,IACRA,EAAEkO,KAAM,EACR,IAAIvI,EAAK3C,KAAKyJ,OAAOzM,EAAEmJ,MAAM,GACzBgF,EAAKnL,KAAKyJ,MAAMzM,EAAEmJ,OAGtB,MAAQ,IAAGxD,KAFe,IAAhB7F,EAAQU,IAAa,EAAMR,EAAE0M,KAAOgB,EAAOA,EAAI1N,EAAE0M,KAAO,KAE3CyB,KADG,IAAhBrO,EAAQU,IAAcmL,EAAI3L,EAAE0M,KAAOf,EAAI3L,EAAE0M,KAAO,EAAK1J,KAAKoL,IAAIV,EAAM1N,EAAE0M,UAC5CyB,OAExC9C,KAAKsC,EAAQpC,KACpB,CAeA,GAbIzL,EAAQQ,MACT+L,EAAMgC,OAAOrO,GAAMA,EAAE+E,MAAQ,GAAO/E,EAAEgF,OAAS,GAAOhF,EAAE+D,MAAQ,GAAO/D,EAAEkE,OAAS,GAC/EiH,OAAO,YACPC,KAAK,IAAKpL,IACPA,EAAEiJ,MAAO,EACD,IAAGjJ,EAAE2M,QAAQ3M,EAAE6M,QAAQ7M,EAAE4M,QAAQ5M,EAAE8M,QAAQ9M,EAAE2M,UAExDtB,KAAKC,EAAQC,MACbF,KAAsB,IAAjBvL,EAAQQ,KAAasL,EAAQL,KAAO,QAG/C7N,KAAK4Q,WAAa,EAEdxO,EAAQmB,OAAQ,CAEjB,IAAIsN,EAAK3C,EAAQzC,MAAQqF,uBAAsBC,EAAK,EAChDC,EAAK5O,EAAQe,KAAQ,MAAK0N,MAAM,EAAGA,IAAO,GAC1CI,EAAK7O,EAAQe,KAAQ,IAAG0N,QAAQ,EAAGA,IAAO,GAC1CK,EAAQF,EAAIG,EAASH,EAAII,EAAOH,EAAII,EAAUJ,EAElD,MAAMK,EAAW,CAACrJ,EAAGC,KAClB,IAAK9F,EAAQc,UAAW,MAAQ,IAAG+E,KAAMC,IACzC,IAAI3F,EAAM,OACV,OAAI0F,EAAW1F,GAAO2F,EAAM,IAAGD,KAAMC,IAAQ,IAAGD,KACzCC,EAAK3F,EAAO,IAAG2F,IAAO3F,GAGhC,OAAQH,EAAQe,MACb,KAAK,EACF4N,EAAKzL,KAAKC,IAAI2I,EAAQzC,MAAM,EAAGnG,KAAKyJ,MAAS,IAAH8B,IAC1CK,EAAS,IAAGH,KAAMF,MAAOE,MAAM,EAAGF,KAAME,IACxCI,EAAU,KAAIJ,KAAMF,KAAME,MAAM,EAAGF,MAAOE,IAC1CK,EAAQ,KAAIP,KAAME,MAAOA,KAAM,EAAEF,KAAME,IACvCM,EAAW,KAAIR,MAAOE,KAAMA,KAAM,EAAEF,MAAOE,IAC3C,MACH,KAAK,EACFF,EAAKvL,KAAKC,IAAIsL,EAAIvL,KAAKyJ,MAAwB,EAAlBjP,EAAMyR,YAAc,MACjDR,EAAKzL,KAAKC,IAAI2I,EAAQzC,MAAM,EAAGnG,KAAKyJ,MAAS,IAAH8B,IAC1CK,EAAS,IAAGH,KAAMF,MAAM,EAAGA,MAAOE,KAAMF,IACxCM,EAAU,KAAIJ,KAAMF,MAAM,EAAGA,KAAME,KAAMF,IACzCO,EAAQ,KAAIP,KAAME,KAAM,EAAEF,MAAOA,MAAOE,IACxCM,EAAW,KAAIR,MAAOE,KAAM,EAAEF,MAAOA,KAAME,IAC3C,MACH,KAAK,EACFF,EAAKvL,KAAKC,IAAIsL,EAAIvL,KAAKyJ,MAAwB,EAAlBjP,EAAMyR,YAAc,MACjDR,EAAKzL,KAAKC,IAAI2I,EAAQzC,MAAM,EAAGnG,KAAKyJ,MAAS,IAAH8B,IAC1CK,EAAS,IAAGH,KAAMF,QAAQ,EAAGA,MAAOE,KAAMF,IAC1CM,EAAU,KAAIJ,KAAMF,QAAQ,EAAGA,KAAME,KAAMF,IAC3CO,EAAQ,KAAIP,KAAME,KAAM,EAAEF,QAASA,MAAOE,IAC1CM,EAAW,KAAIR,MAAOE,KAAM,EAAEF,QAASA,KAAME,IAInD/Q,KAAK4Q,WAAaC,EAElBA,EAAKvL,KAAK8E,OAAO8D,EAAQzC,MAAM,GAAG,GAElC,IAAI+F,EAAU7C,EAAMgC,OAAOrO,GAAMA,EAAE+E,MAAQ,GAAO/E,EAAEgF,OAAS,GAAOhF,EAAE+D,MAAQ,GAAO/D,EAAEkE,OAAS,IAC5FpE,EAAQyC,gBAAkBzC,EAAQ0C,kBACnC0M,EAAUA,EAAQb,OAAOrO,KAAc,GAAPA,EAAE2E,GAAY7E,EAAQyC,gBAA4B,GAAPvC,EAAE6E,GAAY/E,EAAQ0C,oBAEhG,EAAC2M,kBAAiB7H,oBAAoBuE,GACvCqD,EAAQ/D,OAAO,YACPK,MAAM,OAAQ,QACdA,MAAM,iBAAkB,eACxBJ,KAAK,IAAKpL,GAAM,IAAGA,EAAE2M,QAAQ3M,EAAE6M,QAAQ7M,EAAE4M,KAAK5M,EAAE2M,QAAQ3M,EAAE8M,KAAK9M,EAAE6M,QAAQ7M,EAAE2M,KAAK3M,EAAE4M,SAE7FsC,EAAQ/D,OAAO,YACVE,KAAKO,EAAQL,MACbC,MAAM,OAAQ,QACdJ,KAAK,IAAKpL,IACRA,EAAEoP,OAAQ,GACDpP,EAAE+E,MAAQ,EAAMiK,EAAShP,EAAE2M,KAAK4B,EAAIvO,EAAE+M,OAAS6B,EAAQ,KACvD5O,EAAEgF,OAAS,EAAKgK,EAAShP,EAAE4M,KAAK2B,EAAIvO,EAAEiN,OAAS4B,EAAS,KACxD7O,EAAE+D,MAAQ,EAAMiL,EAAShP,EAAEmN,MAAOnN,EAAE6M,KAAK0B,GAAMQ,EAAU,KACzD/O,EAAEkE,OAAS,EAAK8K,EAAShP,EAAEqN,MAAOrN,EAAE8M,KAAKyB,GAAMO,EAAO,KAEzE,CAEA,GAAIhP,EAAQS,KAAM,CAEf7C,KAAK2R,gBAAgB,CAAEjE,KAAM5N,EAAOgO,MAAO1L,EAAQS,KAAO,MAE1D7C,KAAK4R,YAAc5R,KAAK6R,UAAUC,cAElC9R,KAAK6R,UAAUE,WAEf,IAAenD,EAAKxD,EAAKC,EAArByB,EAAO,GACPkF,IAAe,EAACP,kBAAiB7H,sBAAsB5J,KAAK6R,UAAUI,MAASjS,KAAK4R,YAAc,KAAQjD,GAASR,EACnH+D,EAAe,GAAIC,EAAM7M,KAAKC,IAAI,EAAGD,KAAKyJ,MAAuB,GAAjB/O,KAAK4R,cACrDQ,EAAe,KAAWpS,KAAK6R,UAAUQ,kBAAoB,GAAIlI,EAAO,EAEvE4C,EAEI/M,KAAK2J,eAAkBoD,EAAS/H,OAAS,IAAIoN,IACnDjI,EAAO7E,KAAKuC,IAAI,EAAGvC,KAAKyJ,MAAMhC,EAAS/H,OAAOoN,KAF9CrF,EAAW/M,KAAK6J,aAAauI,GAIhC,QAASlI,EAAI,EAAGA,EAAI6C,EAAS/H,OAAQkF,GAAKC,EACvCyE,EAAM7B,EAAS7C,GACfkB,EAAMZ,EAAMY,IAAIwD,EAAI3H,GACfmE,GAAOpL,KAAK4R,aAAiBxG,EAAM4C,EAAIhO,KAAK4R,cAC9CvG,EAAMb,EAAMa,IAAIuD,EAAIzH,GACfkE,GAAOrL,KAAK4R,aAAiBvG,EAAM4C,EAAIjO,KAAK4R,cAC9C9E,GAAQ9M,KAAK6R,UAAUS,OAAOlH,EAAKC,GAC/B2G,IAAcE,GAAiB,IAAG9G,EAAI+G,KAAO9G,EAAI8G,KAAO,EAAEA,KAAO,EAAEA,MAAO,EAAGA,QAKtFrF,IACDU,EAAOC,OAAO,YACPC,KAAK,IAAKZ,GACVa,KAAK3N,KAAK6R,UAAUhE,MACZ,OAAVc,GAAsC,QAAlB3O,KAAKuO,WAAwBJ,IACnDnO,KAAKuO,UAA6B,KAAhBnM,EAAQS,KAAe,OAAS,SAEpDmP,GAAgBE,GACjB1E,EAAOC,OAAO,YACPC,KAAK,IAAKwE,GACVpE,MAAM,OAAQ,QACdA,MAAM,iBAAkB,cACrC,CACH,CAGAyE,SAAS/H,EAAO1K,GACb,IAAI0S,EAAQlN,KAAKC,IAAIiF,EAAMiI,WAAY3S,EAAM4S,MACzCC,EAAQrN,KAAKuC,IAAI2C,EAAMoI,WAAY9S,EAAM+S,MACzCC,EAAQxN,KAAKC,IAAIiF,EAAMuI,WAAYjT,EAAMkT,MACzCC,EAAQ3N,KAAKuC,IAAI2C,EAAM0I,WAAYpT,EAAMqT,MACzC7F,EAAQ,GACR8F,EAAW,CAACC,EAAGC,EAAGC,EAAGC,IAAQ,IAAGhJ,EAAMY,IAAIiI,MAAO7I,EAAMa,IAAIiI,MAAO9I,EAAMY,IAAImI,MAAO/I,EAAMa,IAAImI,KAC7FC,GAAS3T,EAAMqT,KAAOrT,EAAMkT,OAAOxI,EAAMiI,WAAW3S,EAAM4S,OAAO5S,EAAM+S,KAAK/S,EAAM4S,MAAQ5S,EAAMkT,KAChGU,GAAS5T,EAAMqT,KAAKrT,EAAMkT,OAAOxI,EAAMoI,WAAW9S,EAAM4S,OAAO5S,EAAM+S,KAAK/S,EAAM4S,MAAQ5S,EAAMkT,KAI/F1F,EAFCmG,EAAQjJ,EAAMuI,WAEPK,GADKtT,EAAM+S,KAAO/S,EAAM4S,OAAOlI,EAAMuI,WAAWjT,EAAMkT,OAAOlT,EAAMqT,KAAKrT,EAAMkT,MAAQlT,EAAM4S,KAC5ElI,EAAMuI,WAAYP,EAAOM,GAEzCM,EAAS5I,EAAMiI,WAAYgB,EAAOjB,EAAOM,GAKjDxF,GAFCoG,EAAQlJ,EAAM0I,WAENE,EAAST,EAAOM,GADZnT,EAAM+S,KAAK/S,EAAM4S,OAAOlI,EAAM0I,WAAWpT,EAAMkT,OAAOlT,EAAMqT,KAAKrT,EAAMkT,MAAQlT,EAAM4S,KAC3DlI,EAAM0I,YAEpCE,EAAST,EAAOM,EAAOzI,EAAMoI,WAAYc,GAGrD,IAAIC,EAAQ,IAAIC,KAAgB,CAAE9F,MAAO,EAAGrC,MAAO,EAAG6E,MAAO,UACzDuD,EAAQ,IAAID,KAAgB,CAAE9F,MAAO,EAAGrC,MAAO,EAAG6E,MAAO,UAE7DtQ,KAAKwN,OAAOC,OAAO,QACPC,KAAK,IAAK0F,EAASZ,EAAMM,EAAMH,EAAMM,IACrCtF,KAAKgG,EAAM9F,MACXC,MAAM,OAAQ,QAE1B9N,KAAKwN,OAAOC,OAAO,QACPC,KAAK,IAAKJ,GACVK,KAAKkG,EAAMhG,MACXC,MAAM,OAAQ,OAC7B,CAEAgG,aACGC,QAAQC,IAAI,oDACf,CAGA1S,YAEG,IAAI4J,EAAQlL,KAAKyK,WACb3K,EAAQE,KAAK0B,YACjB,IAAKwJ,EAAO,OAGZ,GAAIlL,KAAKoC,QAAQmC,MACd,OAAOvE,KAAK8T,WAAW5I,EAAOpL,GAEjC,IAAImC,IAAWjC,KAAKyB,UAChB+I,EAAQU,EAAMR,WAAW1K,KAAKoC,QAAQwB,SAAU5D,KAAKoC,QAAQyB,UAC7DmK,EAAI9C,EAAMY,gBACVmC,EAAI/C,EAAMa,iBAId,GAFA/L,KAAKiU,SAAS/I,EAAMS,WAEhB3L,KAAKoC,QAAQqC,MAAQzE,KAAKoC,QAAQsC,MAAQ1E,KAAKoC,QAAQuC,KAAM,CAC9D,IAAIuP,EAAKlU,KAAKmB,iBACd,MAAI8I,UAAOiK,GAAIC,iBAAkB,CAC9B,IAAIC,EAASF,EAAGC,kBACZnU,KAAKoC,QAAQqC,OAAQ3E,EAAMuU,WAAaD,SAAepU,KAAK4N,SAC5D5N,KAAKoC,QAAQsC,OAAQ5E,EAAMwU,WAAaF,SAAepU,KAAKkO,SAC5DlO,KAAKoC,QAAQuC,OAAQ7E,EAAMyU,aAAeH,SAAepU,KAAK6R,WAClE7R,KAAKoC,QAAQqC,KAAOzE,KAAKoC,QAAQsC,KAAO1E,KAAKoC,QAAQuC,MAAO,CAC/D,CACH,CAEA3E,KAAKwU,cAAc,CAAE9G,KAAM5N,EAAO2U,UAAU,IAC5CzU,KAAK0U,cAAc,CAAEhH,KAAM5N,IAE3BE,KAAK4N,QAAQ+G,MAAO,EAEpB3U,KAAKuO,UAAY,OACjBvO,KAAK4R,YAAc,EACnB,IAAIpE,EAASvL,EAASjC,KAAKwN,OAAOC,OAAO,SAAWzN,KAAKwN,OAOzD,GALAxN,KAAK+N,SAASvD,EAAOxK,KAAKoC,QAASoL,EAAQQ,EAAGC,EAAGjO,KAAKkO,QAASlO,KAAK4N,SAAS,GAEtD,YAAnB9N,EAAMW,WACPT,KAAKuS,SAAS/H,EAAO1K,GAEpBmC,EAAQ,CACT,QAASoD,EAAI,EAAGA,EAAIvF,EAAMkL,YAAa3F,EAAG,CACvC,IAAI6I,EAAUlO,KAAKkO,QAASN,EAAU5N,KAAK4N,QACvC5N,KAAKoC,QAAQ0B,oBACdoK,EAAU,IAAI0F,KAAgB,CAAElG,KAAM5N,EAAM8U,SAASvP,GAAIwP,KAAK,IAC9DjH,EAAU,IAAIyC,IAAgB,CAAE3C,KAAM5N,EAAMgV,SAASzP,GAAIwP,KAAK,EAAOE,IAAK/U,KAAKgV,gBAElF,IAAIC,EAAQjV,KAAKwN,OAAOC,OAAO,SAC3BrL,EAAUiD,EAAIrF,KAAKoC,QAAQwC,OAAOI,OAAShF,KAAKoC,QAAQwC,OAAOS,GAAKrF,KAAKoC,QAC7EpC,KAAKiG,iBAAiBZ,GACtBrF,KAAK+N,SAASvD,EAAOpI,EAAS6S,EAAOjH,EAAGC,EAAGC,EAASN,EACvD,CACA5N,KAAKiG,iBAAiB,EACzB,EAEA,EAAKwL,mBAAW,EACbyD,KAAelV,KAAMA,KAAKmV,eAChC,CAGAC,eAAexG,GACZ,IAAKA,EAAK,OAAO,KAEjB,GAAuB,SAAlB5O,KAAKuO,WAA4C,QAAlBvO,KAAKuO,WAA2C,QAAlBvO,KAAKuO,UACpE,OAAOvO,KAAKqV,sBAAsBzG,GAErC,GAAsB,SAAlB5O,KAAKuO,UAAsB,OAAO,KAEtC,IAAIrD,EAAQlL,KAAKyK,WACbiB,EAASR,EAAMa,iBACfuJ,EAAMtV,KAAK4Q,WACX2E,EAA+B,IAArBvV,KAAKoC,QAAQU,IACvB0H,EAAQ+K,EAASrK,EAAMR,WAAW1K,KAAKoC,QAAQwB,SAAU5D,KAAKoC,QAAQyB,UAAY,KAClF2R,EAAU,KAAMC,EAAa,KAAMC,EAAO,KAC1CC,EAAQ3V,KAAK4R,YAActM,KAAKyJ,MAAM/O,KAAK4R,YAAY,EAAI,KAAO,EAsCtE,GApCA5R,KAAKwN,OAAOqC,UAAU,YAAY+F,KAAK,WACpC,IAAItT,KAAIuT,MAAU7V,MAAM8V,QACxB,QAAU/Q,IAANzC,EAAiB,OACrB,IAIIiJ,EAJAwK,GAASnH,EAAI3H,EAAI3E,EAAEwM,OAAS,EAEhC,GADkB,IAAdF,EAAIoH,QAAaD,IAAUnH,EAAIzH,EAAI7E,EAAE0M,OAAS,GAC9C+G,GAASN,EAAY,OAIzB,GAAInT,EAAEoP,OAASpP,EAAEiJ,MAAQjJ,EAAE2T,OACxB1K,EAAO,CAAE8H,GAAI/N,KAAKuC,KAAKyN,EAAKhT,EAAE2M,MAAO0G,GAC5BpC,GAAIjO,KAAKC,IAAI+P,EAAKhT,EAAE4M,KAAMyG,GAC1BrC,GAAIhO,KAAKuC,KAAKyN,EAAKhT,EAAE8M,MAAOuG,GAC5BnC,GAAIlO,KAAKC,IAAI+P,EAAKhT,EAAE6M,KAAMwG,SAAO,GAClCrT,EAAEkO,KAGT,GAFAjF,EAAO,CAAE8H,IAAK/Q,EAAEmJ,MAAM,EAAG8H,GAAIjR,EAAEmJ,MAAM,EAAG6H,GAAI,EAAGE,GAAI9H,EAASpJ,EAAE0M,MAE1DuG,EAAQ,CACT,IAAIvF,EAAMxF,EAAMa,IAAI,GACpBE,EAAK+H,GAAMhR,EAAE0M,KAAOgB,EAAOA,EAAI1N,EAAE0M,KAAO,EACxCzD,EAAKiI,GAAMlR,EAAE0M,KAAOgB,EAAO,EAAIA,EAAI1N,EAAE0M,IACxC,OAEAzD,EAAO,CAAE8H,IAAI,EAAIE,GAAI,EAAGD,IAAI,EAAIE,GAAI,GAEvC,IACI0C,EAAUtH,EAAIzH,GAAK7E,EAAE0M,KAAOzD,EAAK+H,IAAQ1E,EAAIzH,GAAK7E,EAAE0M,KAAOzD,EAAKiI,GADtD5E,EAAI3H,GAAK3E,EAAEwM,KAAOvD,EAAK8H,IAAQzE,EAAI3H,GAAK3E,EAAEwM,KAAOvD,EAAKgI,KAGrD2C,GAAWtH,EAAIoH,MAAQ,KACnCP,EAAaM,EACbP,EAAUxV,KACV0V,EAAOnK,EACPmK,EAAKS,MAAwBD,EAEnC,GAEe,OAAZV,EAAkB,OAAO,KAE7B,IAAIlT,KAAIuT,MAAUL,GAASM,QACvB3P,EAAKnG,KAAK0B,YACVa,EAAM,CAAE6B,KAAM+B,EAAG2C,MAAOsN,MAAOjQ,EAAG+C,OAC1BjC,EAAG3E,EAAEwM,KAAM3H,EAAG7E,EAAE0M,KAChBqH,OAAQrW,KAAKkO,QAAQoC,MACrB/F,MAAOvK,KAAKsK,YAAYhI,GACxBiJ,KAAMmK,EAAMY,MAAOd,GAE9BjT,SAAIgU,UAAY,CAAEC,IAAKrQ,EAAI/B,KAAM+B,EAAG2C,MAAO1C,IAAK9D,EAAEiE,KAAMkQ,KAAMnU,EAAE6E,EAAGiE,IAAK9I,EAAEwM,KAAMzD,IAAK/I,EAAE0M,MAEpFhP,KAAK4N,SAAW5N,KAAK4N,QAAQ+G,OAAS3U,KAAK4N,QAAQtJ,UACpD/B,EAAImU,OAAS1W,KAAK4N,QAAQwC,gBAEzBsF,EAAKS,QAAO5T,EAAI4T,OAAQ,GAC5B5T,EAAIoU,KAAOpU,EAAI4T,MACf5T,EAAIqU,UAAY,EAChBrU,EAAI6D,IAAM9D,EACVC,EAAIsU,QAAUvU,EAAEiE,KAEThE,CACV,CAGAuU,YAAYC,GAET,IAAKA,EAEF,YADI/W,KAAKwN,QAAQxN,KAAKwN,OAAOwJ,OAAO,gBAAgBC,UAIvD,GAAIF,EAAKG,QAAS,OAAOlX,KAAKmX,mBAAmBJ,GAEjD,IAAIzU,KAAIuT,MAAUkB,EAAKT,OAAOR,QAC1BsB,EAASpX,KAAKwN,OAAOwJ,OAAO,gBAE5BI,EAAO9S,UACR8S,EAASpX,KAAKwN,OAAOC,OAAO,YACPC,KAAK,QAAS,qBACdI,MAAM,iBAAkB,SAEhDiJ,EAAKM,QAAUD,EAAOE,SAAS,iBAAmBP,EAAKT,MAEnDS,EAAKM,SACND,EAAO1J,KAAK,IAAKpL,EAAEwM,KAAOiI,EAAKxL,KAAK8H,IAC7B3F,KAAK,QAASqJ,EAAKxL,KAAKgI,GAAKwD,EAAKxL,KAAK8H,IACvC3F,KAAK,IAAKpL,EAAE0M,KAAO+H,EAAKxL,KAAK+H,IAC7B5F,KAAK,SAAUqJ,EAAKxL,KAAKiI,GAAKuD,EAAKxL,KAAK+H,IACxCxF,MAAM,UAAW,OACjBwJ,SAAS,cAAeP,EAAKT,MAC1C,CAGAiB,oBAAoB3I,GACjB,IAAImI,EAAO/W,KAAKoV,eAAexG,GAC/B,QAAKA,IAAQA,EAAI4I,WAAUxX,KAAK8W,YAAYC,GACrCA,CACV,CAGAU,YAAY7I,GACT,IAAK5O,KAAKE,KAAM,OAAO,KAEvB,IAKIwX,EAAMtM,EAAKC,EAAKnB,EAAG9D,EALnBuR,EAA6B,SAAlB3X,KAAKuO,UAChBqJ,GAAW,EACXC,EAAU,KACVC,EAAW,KACXtN,EAAQxK,KAAKyK,WAAWC,WAAW1K,KAAKoC,QAAQwB,SAAU5D,KAAKoC,QAAQyB,UAG3E,IAAKqG,EAAI,EAAGA,EAAIlK,KAAKE,KAAK8E,SAAUkF,EACjC9D,EAAMpG,KAAKE,KAAKgK,GAEhBkB,EAAMZ,EAAMY,IAAIhF,EAAIa,GACpBoE,EAAMb,EAAMa,IAAIjF,EAAIe,GAEpBuQ,GAAQ9I,EAAI3H,EAAEmE,IAAM,GAAKwD,EAAIzH,EAAEkE,IAAM,EAEjCqM,EAAOI,IACRA,EAAWJ,EACXG,EAAUzR,EACVwR,EAAW1N,GAKZ4N,EAAW,KAAQH,IAASE,EAAU,MAE3C,IAAIE,EAASzS,KAAKC,IAAIvF,KAAKkO,QAAQzC,MAAQ,EAAG,GAE1CzL,KAAK4R,YAAc,IAAGmG,EAASzS,KAAKC,IAAIvF,KAAK4R,YAAamG,IAE1DF,IACDC,EAAWxS,KAAK6H,MAAMyB,EAAI3H,EAAEuD,EAAMY,IAAIyM,EAAQ5Q,KAAK,GAAK2H,EAAIzH,EAAEqD,EAAMa,IAAIwM,EAAQ1Q,KAAK,KAEnFwQ,GAAYG,EAAWC,IAASF,EAAU,MAE1CA,IAASD,GAAW,GAEzB,IAAIrV,EAAM,CAAE6D,IAAKyR,EAAStR,KAAMqR,EAAUF,KAAMI,EAAUC,OAAQzS,KAAKyJ,MAAMgJ,IAE7E,IAAKF,GAAWF,EAAS,CAEtBG,EAAW,KAEX,MAAME,EAAW,CAAC/Q,EAAGoM,EAAIE,IAASF,GAAMpM,GAAOA,GAAKsM,GAAUF,GAAMpM,GAAOA,GAAKsM,EAEhF,IAAmDpE,EAA/C8I,EAAOjY,KAAKE,KAAK,GAAI+O,EAAOzE,EAAMY,IAAI6M,EAAKhR,GAAUiR,EAAO,EAChE,IAAKhO,EAAI,EAAGA,EAAIlK,KAAKE,KAAK8E,SAAUkF,EACjC9D,EAAMpG,KAAKE,KAAKgK,GAChBkB,EAAMZ,EAAMY,IAAIhF,EAAIa,GAEhB+Q,EAASpJ,EAAI3H,EAAGgI,EAAM7D,KAEvB+D,EAAO3E,EAAMa,IAAI4M,EAAK9Q,GACtBkE,EAAMb,EAAMa,IAAIjF,EAAIe,GAEhB7B,KAAKoL,IAAItF,EAAM6D,GAAQ,GAExBiJ,EAAOtJ,EAAIzH,EACXuQ,EAAOM,EAASpJ,EAAIzH,EAAGgI,EAAM9D,GAAO,EAAI/F,KAAKuC,IAAIvC,KAAKoL,IAAI9B,EAAIzH,EAAEgI,GAAO7J,KAAKoL,IAAI9B,EAAIzH,EAAEkE,MAEtF6M,EAAO/I,GAAQP,EAAI3H,EAAIgI,IAAS7D,EAAM6D,IAAS5D,EAAM8D,GACrDuI,EAAOpS,KAAKoL,IAAIwH,EAAOtJ,EAAIzH,IAG1BuQ,EAAOI,IACRA,EAAWJ,EACXnV,EAAI4V,MAAQvJ,EAAI3H,EAChB1E,EAAI6V,MAAQF,IAIlBD,EAAO7R,EACP6I,EAAO7D,EAGN0M,EAAkB,GAAPC,IACZxV,EAAI8V,SAAWP,EACfvV,EAAI+V,WAAY,EAEtB,CAEA,OAAO/V,CACV,CAIA4S,aAAaoD,GACV,IAAI/B,EAAMxW,KAAK0B,YACf,QAAK8U,KACO,UAAP+B,QAA8BxT,IAARwT,IAAwBA,GAAO/B,EAAIgC,QAAQpZ,KACnEoX,EAAIiC,UAAUrZ,IACToX,EAAIgC,QAAQpZ,GACvB,CAGAiW,sBAAsBzG,GAEnB,GAAkB,OAAd5O,KAAKE,KAAe,OAAO,KAE/B,IAAIwV,EAAO1V,KAAKyX,YAAY7I,GAE5B,IAAK8G,IAAUA,EAAKtP,MAAQsP,EAAK4C,UAAY,OAAO,KAEpD,IAAIX,EAA6B,SAAlB3X,KAAKuO,UAChBmK,EAA4B,QAAlB1Y,KAAKuO,UAEf/D,EADQxK,KAAKyK,WACCC,WAAW1K,KAAKoC,QAAQwB,SAAU5D,KAAKoC,QAAQyB,UAC7DsC,EAAKnG,KAAK0B,YACVa,EAAM,CAAE6B,KAAM+B,EAAG2C,MAAOsN,MAAOjQ,EAAG+C,OAC1BjC,EAAGyO,EAAKtP,IAAMoE,EAAMY,IAAIsK,EAAKtP,IAAIa,GAAKyO,EAAKyC,MAC3ChR,EAAGuO,EAAKtP,IAAMoE,EAAMa,IAAIqK,EAAKtP,IAAIe,GAAKuO,EAAK0C,MAC3C/B,OAAQrW,KAAKkO,QAAQoC,MACrB/F,MAAOvK,KAAKsK,YAAYoL,EAAKtP,KAC7B8Q,SAAS,GAErB3U,SAAIgU,UAAY,CAAEC,IAAKrQ,EAAI/B,KAAM+B,EAAG2C,MAAO1C,IAAK,EAAGqQ,KAAM,EAAGrL,IAAK7I,EAAI0E,EAAGoE,IAAK9I,EAAI4E,GAEjF5E,EAAImW,OAASA,EACbnW,EAAIoV,QAAUA,EAEVjC,EAAK4C,WACN/V,EAAIoU,KAAOpU,EAAI4T,OAAQ,EACvB5T,EAAIqU,UAAYlB,EAAK2C,UACb3C,EAAKtP,MACTpG,KAAKoC,QAAQY,IAAM2U,GACpBpV,EAAIyM,KAAOxE,EAAMa,IAAIqK,EAAKtP,IAAIe,EAAIuO,EAAKtP,IAAIC,OAC3C9D,EAAI6M,KAAO5E,EAAMa,IAAIqK,EAAKtP,IAAIe,EAAIuO,EAAKtP,IAAII,SAE3CjE,EAAIyM,KAAOzM,EAAI6M,KAAO5E,EAAMa,IAAIqK,EAAKtP,IAAIe,GAG5C5E,EAAIsU,QAAUnB,EAAKnP,KACnBhE,EAAI6D,IAAMsP,EAAKtP,IACf7D,EAAIwV,OAASrC,EAAKqC,OAClBxV,EAAIgU,UAAUnQ,IAAMsP,EAAKnP,KACzBhE,EAAIgU,UAAUE,KAAOf,EAAKtP,IAAIe,EAE9B5E,EAAI4T,MAAS7Q,KAAKoL,IAAI9B,EAAI3H,EAAI1E,EAAI0E,IAAMyO,EAAKqC,SACxCzS,KAAKoL,IAAI9B,EAAIzH,EAAI5E,EAAIyM,OAAS0G,EAAKqC,QAAYzS,KAAKoL,IAAI9B,EAAIzH,EAAI5E,EAAI6M,OAASsG,EAAKqC,QAEvFxV,EAAIoU,KAAOpU,EAAI4T,MACf5T,EAAIqU,UAAYtR,KAAK6H,MAAMyB,EAAI3H,EAAE1E,EAAI0E,IAAI,EAAI3B,KAAKuC,IAAIvC,KAAKoL,IAAI9B,EAAIzH,EAAE5E,EAAIyM,MAAO1J,KAAKoL,IAAI9B,EAAIzH,EAAE5E,EAAI6M,QAAQ,IAG1GpP,KAAK4N,SAAW5N,KAAK4N,QAAQ+G,OAAS3U,KAAK4N,QAAQtJ,UACpD/B,EAAImU,OAAS1W,KAAK4N,QAAQwC,gBAExBuH,IACFpV,EAAI8T,OAASrW,KAAK2Y,SAASxS,EAAGoO,cACzBhS,EAAImU,SAAQnU,EAAImU,OAASnU,EAAI8T,SAG9B9T,CACV,CAGA4U,mBAAmBJ,GAEhB,IAAI6B,EAAQ5Y,KAAKwN,OAAOwJ,OAAO,gBAE/B,GAAKD,GAASA,EAAK3Q,KAUnB,GALIwS,EAAMtU,UACPsU,EAAQ5Y,KAAKwN,OAAOC,OAAO,SAASC,KAAK,QAAS,gBAErDqJ,EAAKM,QAAUuB,EAAMtB,SAAS,iBAAmBP,EAAK3Q,IAElD2Q,EAAKM,QAIN,GAHAuB,EAAM/I,UAAU,KAAKoH,SACrB2B,EAAMtB,SAAS,cAAeP,EAAK3Q,KAE/B2Q,EAAK2B,OACNE,EAAMnL,OAAO,YACPC,KAAK,QAAQ,SACbI,MAAM,iBAAiB,QACvBA,MAAM,UAAW,OACjBJ,KAAK,IAAKpI,KAAKyJ,MAAMgI,EAAK9P,EAAI8P,EAAKgB,SACnCrK,KAAK,IAAKpI,KAAKyJ,MAAMgI,EAAK5P,EAAI4P,EAAKgB,SACnCrK,KAAK,QAAS,EAAEqJ,EAAKgB,QACrBrK,KAAK,SAAU,EAAEqJ,EAAKgB,YACxB,CACJa,EAAMnL,OAAO,cAAcC,KAAK,KAAMpI,KAAKyJ,MAAMgI,EAAK/H,OAClD1J,KAAKoL,IAAIqG,EAAK/H,KAAK+H,EAAK3H,MAAQ,GACjCwJ,EAAMnL,OAAO,cAAcC,KAAK,KAAMpI,KAAKyJ,MAAMgI,EAAK3H,OAEzD,IAAIX,EAAOmK,EAAM/I,UAAU,UACVnC,KAAK,IAAKqJ,EAAKgB,QACfrK,KAAK,KAAMpI,KAAKyJ,MAAMgI,EAAK9P,IAEvC8P,EAAKY,SAGH3X,KAAKoC,QAAQM,MAAQ1C,KAAKoC,QAAQO,MACnC8L,EAAKd,KAAK3N,KAAKkO,QAAQL,MAEvBY,EAAKX,MAAM,SAAS,SACnB9N,KAAKoC,QAAQa,KACdwL,EAAKd,KAAK3N,KAAK4N,QAAQC,MAEvBY,EAAKX,MAAM,OAAO,SATrBW,EAAKX,MAAM,SAAyB,SAAfiJ,EAAKV,OAAoB,QAAU,SAASvI,MAAM,OAAO,OAWpF,OA3CA8K,EAAM3B,QA6CZ,CAGA4B,cACG,OAAO7Y,KAAKmV,cACf,CAGA2D,UAAU7R,EAAEE,GACTnH,KAAK+Y,OAAS/Y,KAAKgZ,OAAS,EAC5BhZ,KAAKiZ,WAAajZ,KAAKyK,WAAWC,WAAW1K,KAAKoC,QAAQwB,SAAU5D,KAAKoC,QAAQyB,UACjF,IAAIkT,EAAO/W,KAAKoV,eAAe,CAACnO,IAAGE,MAC/B4P,GAAQA,EAAKZ,YAA2BpR,IAAjBgS,EAAKF,SAC7B7W,KAAKkZ,aAAenC,EAAKF,QACzB7W,KAAKmZ,SAAWpC,EAAK3Q,IACrBpG,KAAKoZ,QAAUpZ,KAAKiZ,WAAW7N,IAAIpL,KAAKmZ,SAASlS,GACjDjH,KAAKqZ,QAAUrZ,KAAKiZ,WAAW5N,IAAIrL,KAAKmZ,SAAShS,WAE1CnH,KAAKkZ,YAElB,CAGAI,SAASrR,EAAGC,GACTlI,KAAK+Y,QAAU9Q,EACfjI,KAAKgZ,QAAU9Q,OAEWnD,IAAtB/E,KAAKkZ,aACNlZ,KAAKwN,OAAOE,KAAK,YAAc,aAAY1N,KAAK+Y,UAAU/Y,KAAKgZ,WACvDhZ,KAAKiZ,YAAcjZ,KAAKmZ,WAChCnZ,KAAKmZ,SAASlS,EAAIjH,KAAKiZ,WAAWvM,WAAW,IAAK1M,KAAKoZ,QAAUpZ,KAAK+Y,QACtE/Y,KAAKmZ,SAAShS,EAAInH,KAAKiZ,WAAWvM,WAAW,IAAK1M,KAAKqZ,QAAUrZ,KAAKgZ,QACtEhZ,KAAKsB,YAEX,CAGAiY,QAAQC,GACL,IAAIC,EAAO,GAEX,QAA0B1U,IAAtB/E,KAAKkZ,cAGN,GAFAlZ,KAAKwN,OAAOE,KAAK,YAAa,MAE1B1N,KAAKiZ,YAAcjZ,KAAKE,OAASsZ,EAAa,CAC/C,QAASnU,EAAI,EAAGA,EAAIrF,KAAKE,KAAK8E,SAAUK,EAAG,CACxC,IAAIe,EAAMpG,KAAKE,KAAKmF,GACpBe,EAAIa,EAAIjH,KAAKiZ,WAAWvM,WAAW,IAAK1M,KAAKiZ,WAAW7N,IAAIhF,EAAIa,GAAKjH,KAAK+Y,QAC1E3S,EAAIe,EAAInH,KAAKiZ,WAAWvM,WAAW,IAAK1M,KAAKiZ,WAAW5N,IAAIjF,EAAIe,GAAKnH,KAAKgZ,QAC1ES,GAAS,YAAWrT,EAAIG,QAAQH,EAAIa,KAAKb,EAAIe,OAC5B,GAAZf,EAAIG,MAAcvG,KAAK0Z,gBAAgB5S,aACzC2S,GAAS,YAAWzZ,KAAK0B,YAAYmF,SAAS,KAAKT,EAAIa,KAAKb,EAAIe,OACtE,CACAnH,KAAKsB,WACR,OAEAmY,EAAQ,YAAWzZ,KAAKmZ,SAAS5S,QAAQvG,KAAKmZ,SAASlS,KAAKjH,KAAKmZ,SAAShS,OAC/C,GAAtBnH,KAAKmZ,SAAS5S,MAAcvG,KAAK0Z,gBAAgB5S,aACnD2S,GAAS,YAAWzZ,KAAK0B,YAAYmF,SAAS,KAAK7G,KAAKmZ,SAASlS,KAAKjH,KAAKmZ,SAAShS,eAChFnH,KAAKkZ,oBAGRlZ,KAAKiZ,WAERQ,IAASD,GACVxZ,KAAK2Z,eAAeF,EAC1B,CAGAG,gBAAgBjD,GACb,aAAMiD,gBAAgBjD,GAEjB3W,KAAK6Z,QACPlD,EAAKmD,OAAO9Z,KAAKmV,eAAgB,WAAY,KAAQnV,KAAKmV,aAAa,UAAWnV,KAAKsB,WAAS,GAE5FqV,EAAKoD,OAAS,CACxB,CAIAC,mBAAmBC,EAAQC,GACxB,GAAIna,MAAMia,mBAAmBC,EAAOC,GAAO,OAAO,EAElD,IAAIC,EAAOna,KAAKoa,iBAAkBlP,EAAQlL,KAAKyK,WAE/C,GAAqB,eAAhBwP,EAAOnR,OAA4C,eAAhBmR,EAAOnR,MAAyB,CACrE,IAAKqR,GAAQA,EAAKE,UAAW,OAAO,EAEpC,IAAItD,EAAO/W,KAAKoV,eAAexG,KAE/B,GAAoB,eAAhBqL,EAAOnR,MAAwB,CAChC,IAAI8F,KAAM3E,UAAOiB,EAAMoP,iBAAmBpP,EAAMoP,kBAAoB,KACpE,GAAI1L,EAAK,CACN,IAAIpE,EAAQU,EAAMR,WAAW1K,KAAKoC,QAAQwB,SAAU5D,KAAKoC,QAAQyB,UAC7D0W,EAAQ/P,EAAMkC,WAAW,IAAKkC,EAAI3H,IAAM,EACxCuT,EAAQhQ,EAAMkC,WAAW,IAAKkC,EAAIzH,IAAM,EAC5CnH,KAAK2Z,eAAgB,YAAWY,EAAME,QAAQ,OAAOD,EAAMC,QAAQ,MAAOza,KAAK0a,aAClF,CACH,MAAW1a,KAAK0a,mBAAmC3V,IAAlBgS,GAAMF,SACpC7W,KAAK2Z,eAAgB,eAAc5C,EAAKF,WAAY7W,KAAK0a,cAG5D,OAAO,CACV,CAEA,OAAO,CACV,CAGAC,aAAanE,EAAK5U,GACf,IAAK5B,KAAK0Z,gBAAgBlD,GAAM,OAAO,EAEnC5U,GAAQA,GAAO5B,KAAKoC,QAAQuB,UAC7B3D,KAAK2B,cAAcC,GAEtB,IAAI9B,EAAQE,KAAK0B,YAcjB,GAZA5B,EAAMkJ,MAAQwN,EAAIxN,MAClBlJ,EAAMoJ,OAASsN,EAAItN,OACnBpJ,EAAMoH,GAAKsP,EAAItP,GACfpH,EAAMsH,GAAKoP,EAAIpP,GACftH,EAAM+G,SAAW2P,EAAI3P,SACrB/G,EAAM+I,SAAW2N,EAAI3N,SACrB/I,EAAM6I,SAAW6N,EAAI7N,SACrB3I,KAAK0G,oBAEE1G,KAAKiB,aAGRjB,KAAKC,UAAW,CACjB,IAAIsI,EAAQvI,KAAK8H,kBACjBS,EAAMW,OAASpJ,EAAMoJ,OAErB,IAAIhI,EAAelB,KAAKmB,iBACpBD,GAAcE,aACfF,EAAayZ,aAAapS,EAAOvI,KAAKoC,QAAQoB,MAC9CxD,KAAKiB,cAAe,EAE1B,CAEA,OAAO,CACV,CAIA2Z,cAAcC,EAAKhT,EAAItC,GACpB,IAAIY,EAAKnG,KAAK0B,YACd,IAAKyE,GAAO0U,KAAU7a,KAAKoC,QAAQmC,MAAQ,IAAM,KAAO,OAAO,EAE/D,QAAS2F,EAAI,EAAGA,EAAI/D,EAAGU,WAAYqD,EAChC,GAAKrC,EAAM1B,EAAGe,GAAGgD,IAAQ/D,EAAGe,GAAGgD,GAAK3E,EAAM,OAAO,EAEpD,OAAO,CACV,CAGAuV,YAAYC,GACT,GAAiB,eAAbA,EAA2B,OAAO,EAEtC,IAAIC,EAAOhb,KAAKmL,kBAGhB,SAFK6P,GAEAhb,KAAKG,OAASH,KAAKK,MAAUL,KAAKI,OAASJ,KAAKM,OAErD0a,EAAKC,KAAKjb,KAAKG,KAAMH,KAAKK,KAAML,KAAKI,KAAMJ,KAAKM,MAEzC,GACV,CAGA4a,WACG,IAAI/U,EAAKnG,KAAK0B,YACd,OAAIyE,GAAIgV,YAAYtV,IACVM,GAAIgV,YAAYtV,IAAIuV,KAAKvN,GAASA,EAAKpN,WAAa4a,SAAWxN,EAAKpN,WAAa6a,SACpF,IACV,CAGAC,WACG,IAAIpV,EAAKnG,KAAK0B,YACd,GAAIyE,GAAIgV,YAAYtV,IACjB,QAASgJ,EAAI,EAAGA,EAAI1I,EAAGgV,WAAWtV,IAAIb,SAAU6J,EAAG,CAChD,IAAIhB,EAAO1H,EAAGgV,WAAWtV,IAAIgJ,GAC7B,GAAKhB,EAAKpN,WAAa+a,gBAAgC,SAAd3N,EAAK/E,MAAmB,OAAO+E,CAC3E,CACH,OAAO,IACV,CAGA4N,aACG,IAAI5N,EAAO7N,KAAKkb,WAChB,IAAKrN,EAAM,OAAO,KAElB,IAAI6N,EAAQ1b,KAAKub,WACjB,GAAIG,EAAO,OAAOA,EAGlB,GAAI1b,KAAKoa,kBAAkBuB,eAAiB3b,KAAKoC,QAAQsB,SAAU,OAAO,KAE1E1D,KAAK4b,cAAe,EAEpB,MAAMC,EAAK/K,SAEX4K,YAAQpJ,UAAOkJ,gBACfhZ,OAAOC,OAAOiZ,EAAO,CAAE5S,MAAQ,QAASgT,SAAU,EAAGC,QAASF,EAAGE,SAAW,IAAKC,YAAa,IAE9FN,EAAMO,OAASJ,EAAGK,OAASL,EAAGM,OAC9BT,EAAMU,OAASP,EAAGQ,OAASR,EAAGS,OAC9BZ,EAAMa,OAASV,EAAGK,OAClBR,EAAMc,OAASX,EAAGQ,OAElBX,EAAMrH,WAAawH,EAAGY,WACtBf,EAAMgB,WAAab,EAAGc,WAEtBjB,EAAMkB,WAAa,EACnBlB,EAAMmB,UAAYhB,EAAGiB,cACrBpB,EAAMqB,WAAa,GACnBrB,EAAMsB,WAAanB,EAAGoB,eACtBvB,EAAMwB,UAAYrB,EAAGsB,UAErBzB,EAAM0B,QAAQvP,EAAK/E,OAGnB9I,KAAK0B,YAAYyZ,WAAWkC,IAAI3B,GAEzBA,CACV,CAGA4B,cAAcC,EAAMC,EAAQC,GAGzB,IAAI5P,EAAO7N,KAAKkb,WAEhB,SAAKrN,GAAS4P,GAAUzd,KAAK4b,gBAE7B2B,EAAKG,YAELH,EAAKI,iBAAiB9P,EAAM4P,IAErB,EACV,CAIMG,iBAAiBrX,GAAM,qCAE1B,IAAIzG,EAAQ+d,EAAKnc,YAEjB,GAAI6E,IAASzG,GAAOqb,YAAYtV,KAAKb,QAAU,GAC5C,OAAO6Y,EAEV,IAAIvS,EAAKuS,EAAKnY,gBACVmI,EAAO/N,EAAMqb,WAAWtV,IAAIU,GAC5B3E,EAAM9B,EAAMqb,WAAWvZ,IAAI2E,GAI/BsH,SAAKiQ,cAAgBD,EAEdvS,EAAGyS,WAAWF,EAAKG,SAAUnQ,EAAMjM,GAAKP,KAAK,IAAMwc,EAAKD,iBAAiBrX,EAAK,GAAI,EAf/D,EAgB7B,CAIM0X,gBAAgB,qCACnB,IAAI1V,EAAQ2V,EAAKpW,kBACjB,OAAOqW,SAAgBD,EAAKF,SAAUzV,EAAO2V,EAAK9b,QAAQoB,KAAK,EAF5C,EAGtB,CAIA4a,kBAAwBC,EAASzc,GAAK,0BACnCyc,EAAQ1c,cAAcC,GAAK,GAC3Byc,EAAQ3X,aACR2X,EAAQ5C,cACH7R,wBAAwB9J,MAAM0Y,QAAQpZ,IACxCU,MAAM2Y,UAAUrZ,GAEnB,IAAIyB,EAAUC,QAAQC,UAEtB,QAAMsd,EAAQld,kBAAoBkd,EAAQjc,QAAQwB,UAAYya,EAAQjc,QAAQyB,WAAawa,EAAQjc,QAAQoB,OACxG3C,EAAUwd,EAAQJ,gBAAgB5c,KAAKH,IAChCA,IACDmd,EAAQpe,WAAY,EACfoe,EAAQpV,iBAAgBoV,EAAQC,UAAW,GAChDpd,EAAaE,WAAa,WAI5BP,EAAQQ,KAAK,KACjBgd,EAAQE,qBACDF,EAAQ/c,cACfD,KAAK,IAAMgd,EAAQT,iBAAiB,GAAI,EArBR,EAsBtC,CAEAQ,YAAkBve,EAAKC,EAAO8B,GAAK,0BAChC,OAAOlC,EAAc8e,WAAW,IAAI9e,EAAcG,EAAKC,GAAQ8B,EAAK,EADpC,EAEnC","names":["kNotEditable","BIT","clTGraphErrors","clTGraphAsymmErrors","clTGraphBentErrors","clTGraphMultiErrors","TGraphPainter","ObjectPainter","constructor","dom","graph","super","this","axes_draw","bins","xmin","ymin","xmax","ymax","wheel_zoomy","is_bent","_typename","has_errors","match","redraw","promise","Promise","resolve","_this","$redraw_hist","hist_painter","getMainPainter","$secondary","then","drawGraph","cleanup","interactive_bin","get_gme","getObject","decodeOptions","opt","first_time","isStr","indexOf","slice","is_gme","blocks_gme","has_main","options","decodeBlock","d","res","Object","assign","Line","Curve","Rect","Mark","Bar","OutRange","EF","Fill","MainError","Ends","ScaleErrX","check","partAsFloat","Errors","Axis","NoOpt","PadStats","original","second_x","second_y","individual_styles","split","shift","DrawOptions","hopt","forEach","name","part","empty","pos3d","partAsInt","_pfc","_plc","_pmc","blocks","skip_errors_x0","skip_errors_y0","undefined","length","fMarkerStyle","len","fEX","m","k","Math","max","fEY","pad","getPadPainter","getRootPad","fPrimitives","arr","bl","subres","push","extractGmeErrors","nblock","gr","bin","eylow","fEyL","indx","eyhigh","fEyH","createBins","kind","npoints","fNpoints","clTCutG","Array","p","x","fX","y","fY","exlow","exhigh","fExL","fExH","fEXlow","fEXhigh","fEYlow","fEYhigh","min","createHistogram","set_x","set_y","dx","dy","uxmin","uxmax","minimum","maximum","histo","fHistogram","minimum0","maximum0","fMaximum","kNoZoom","fMinimum","fName","kNoStats","fBits","_own_histogram","fTitle","fXaxis","fXmin","fXmax","fYaxis","unzoomUserRange","dox","doy","extractAxesProperties","canOptimize","settings","optimizeBins","maxpnt","filter_func","selbins","isFunc","n","step","floor","optbins","getTooltips","lines","funcs","get_main","getGrFuncs","gme","getObjectHint","axisAsText","x_handle","ny","fNYErrors","y_handle","pmain","getFramePainter","grx","gry","pp","rect","getPadRect","width","height","pad_layer","pw","ph","getFrameWidth","getFrameHeight","value","fLogx","log10","fUxmin","fX1","fX2","fLogy","fUymin","fY1","fY2","revertAxis","v","appendExclusion","is_curve","path","drawbins","excl_width","extrabins","dlen","sqrt","dgrx","dgry","path2","buildSvgPath","draw_g","append","attr","call","fillatt","func","style","drawBins","w","h","lineatt","main_block","excl_side","path1","bins2","draw_kind","close_symbol","elem","curvebins","nodes","pnt","i","grx1","round","gry1","grx0","grx2","gry0","gry2","grdx0","fEXlowd","grdx2","fEXhighd","grdy0","fEYlowd","grdy2","fEYhighd","selectAll","data","enter","yy0","usefill","fp","fpcol","getFillColor","TAttFillHandler","color","pattern","bar","dw","abs","filter","error_size","lw","gStyle","bb","vv","hh","vleft","vright","htop","hbottom","mainLine","fMarkerSize","visible","isBatchMode","error","createAttMarker","marker_size","markeratt","getFullSize","resetPos","want_tooltip","fill","hints_marker","hsz","maxnummarker","getMarkerLength","create","appendQQ","xqmin","scale_xmin","fXq1","xqmax","scale_xmax","fXq2","yqmin","scale_ymin","fYq1","yqmax","scale_ymax","fYq2","makeLine","x1","y1","x2","y2","yxmin","yxmax","latt1","TAttLineHandler","latt2","drawBins3D","console","log","createG","mp","createAutoColor","icolor","fFillColor","fLineColor","fMarkerColor","createAttLine","can_excl","createAttFill","used","fAttLine","std","fAttFill","svg","getCanvSvg","sub_g","addMoveHandler","testEditable","extractTooltip","extractTooltipForPath","esz","isbar1","findbin","best_dist2","best","msize","each","d3_select","datum","dist2","nproc","marker","matchy","exact","title","color1","d3bin","user_info","obj","cont","color2","menu","menu_dist","binindx","showTooltip","hint","select","remove","usepath","showTooltipForPath","ttrect","changed","property","processTooltipEvent","disabled","findBestBin","dist","islines","bestindx","bestbin","bestdist","radius","IsInside","bin0","posy","linex","liney","linedist","closeline","arg","TestBit","InvertBit","ismark","getColor","ttbin","moveEnabled","moveStart","pos_dx","pos_dy","move_funcs","move_binindx","move_bin","move_x0","move_y0","moveDrag","moveEnd","not_changed","exec","matchObjectType","submitCanvExec","fillContextMenu","snapid","addchk","size","executeMenuCommand","method","args","canp","getCanvPainter","_readonly","getLastEventPos","userx","usery","toFixed","args_menu_id","updateObject","canZoomInside","axis","clickButton","funcname","main","zoom","findFunc","fFunctions","find","clTF1","clTF2","findStat","clTPaveStats","createStat","stats","normal_canvas","create_stats","st","fOptStat","fOptFit","fBorderSize","fX1NDC","fStatX","fStatW","fY1NDC","fStatY","fStatH","fX2NDC","fY2NDC","fStatColor","fFillStyle","fStatStyle","fTextAngle","fTextSize","fStatFontSize","fTextAlign","fTextColor","fStatTextColor","fTextFont","fStatFont","AddText","Add","fillStatistic","stat","dostat","dofit","clearPave","fillFunctionStat","drawNextFunction","_this2","$main_painter","drawObject","getDom","drawAxisHisto","_this3","TH1Painter","static","painter","$primary","addToPadPrimitives","_drawGraph"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/hist2d/TGraphPainter.mjs"],"sourcesContent":["import { gStyle, BIT, settings, create, createHistogram, isBatchMode, isFunc, isStr,\n clTPaveStats, clTCutG, clTF1, clTF2, kNoZoom } from '../core.mjs';\nimport { select as d3_select } from '../d3.mjs';\nimport { DrawOptions, buildSvgPath } from '../base/BasePainter.mjs';\nimport { ObjectPainter } from '../base/ObjectPainter.mjs';\nimport { TH1Painter } from './TH1Painter.mjs';\nimport { TAttLineHandler } from '../base/TAttLineHandler.mjs';\nimport { TAttFillHandler } from '../base/TAttFillHandler.mjs';\nimport { addMoveHandler } from '../gui/utils.mjs';\n\n\nconst kNotEditable = BIT(18), // bit set if graph is non editable\n clTGraphErrors = 'TGraphErrors',\n clTGraphAsymmErrors = 'TGraphAsymmErrors',\n clTGraphBentErrors = 'TGraphBentErrors',\n clTGraphMultiErrors = 'TGraphMultiErrors';\n\n/**\n * @summary Painter for TGraph object.\n *\n * @private\n */\n\nclass TGraphPainter extends ObjectPainter {\n\n constructor(dom, graph) {\n super(dom, graph);\n this.axes_draw = false; // indicate if graph histogram was drawn for axes\n this.bins = null;\n this.xmin = this.ymin = this.xmax = this.ymax = 0;\n this.wheel_zoomy = true;\n this.is_bent = (graph._typename == clTGraphBentErrors);\n this.has_errors = (graph._typename == clTGraphErrors) ||\n (graph._typename == clTGraphMultiErrors) ||\n (graph._typename == clTGraphAsymmErrors) ||\n this.is_bent || graph._typename.match(/^RooHist/);\n }\n\n /** @summary Redraw graph\n * @desc may redraw histogram which was used to draw axes\n * @return {Promise} for ready */\n async redraw() {\n let promise = Promise.resolve(true);\n\n if (this.$redraw_hist) {\n delete this.$redraw_hist;\n let hist_painter = this.getMainPainter();\n if (hist_painter?.$secondary && this.axes_draw)\n promise = hist_painter.redraw();\n }\n\n return promise.then(() => this.drawGraph());\n }\n\n /** @summary Cleanup graph painter */\n cleanup() {\n delete this.interactive_bin; // break mouse handling\n delete this.bins;\n super.cleanup();\n }\n\n /** @summary Returns object if this drawing TGraphMultiErrors object */\n get_gme() {\n let graph = this.getObject();\n return graph?._typename == clTGraphMultiErrors ? graph : null;\n }\n\n /** @summary Decode options */\n decodeOptions(opt, first_time) {\n\n if (isStr(opt) && (opt.indexOf('same ') == 0))\n opt = opt.slice(5);\n\n let graph = this.getObject(),\n is_gme = !!this.get_gme(),\n blocks_gme = [],\n has_main = first_time ? !!this.getMainPainter() : !this.axes_draw;\n\n if (!this.options) this.options = {};\n\n // decode main draw options for the graph\n const decodeBlock = (d, res) => {\n Object.assign(res, { Line: 0, Curve: 0, Rect: 0, Mark: 0, Bar: 0, OutRange: 0, EF:0, Fill: 0, MainError: 1, Ends: 1, ScaleErrX: 1 });\n\n if (is_gme && d.check('S=', true)) res.ScaleErrX = d.partAsFloat();\n\n if (d.check('L')) res.Line = 1;\n if (d.check('F')) res.Fill = 1;\n if (d.check('CC')) res.Curve = 2; // draw all points without reduction\n if (d.check('C')) res.Curve = 1;\n if (d.check('*')) res.Mark = 103;\n if (d.check('P0')) res.Mark = 104;\n if (d.check('P')) res.Mark = 1;\n if (d.check('B')) { res.Bar = 1; res.Errors = 0; }\n if (d.check('Z')) { res.Errors = 1; res.Ends = 0; }\n if (d.check('||')) { res.Errors = 1; res.MainError = 0; res.Ends = 1; }\n if (d.check('[]')) { res.Errors = 1; res.MainError = 0; res.Ends = 2; }\n if (d.check('|>')) { res.Errors = 1; res.Ends = 3; }\n if (d.check('>')) { res.Errors = 1; res.Ends = 4; }\n if (d.check('0')) { res.Mark = 1; res.Errors = 1; res.OutRange = 1; }\n if (d.check('1')) { if (res.Bar == 1) res.Bar = 2; }\n if (d.check('2')) { res.Rect = 1; res.Errors = 0; }\n if (d.check('3')) { res.EF = 1; res.Errors = 0; }\n if (d.check('4')) { res.EF = 2; res.Errors = 0; }\n if (d.check('5')) { res.Rect = 2; res.Errors = 0; }\n if (d.check('X')) res.Errors = 0;\n };\n\n Object.assign(this.options, { Axis: '', NoOpt: 0, PadStats: false, original: opt, second_x: false, second_y: false, individual_styles: false });\n\n if (is_gme && opt) {\n if (opt.indexOf(';') > 0) {\n blocks_gme = opt.split(';');\n opt = blocks_gme.shift();\n } else if (opt.indexOf('_') > 0) {\n blocks_gme = opt.split('_');\n opt = blocks_gme.shift();\n }\n }\n\n let res = this.options,\n d = new DrawOptions(opt);\n\n // check pad options first\n res.PadStats = d.check('USE_PAD_STATS');\n let hopt = '', checkhopt = ['USE_PAD_TITLE', 'LOGXY', 'LOGX', 'LOGY', 'LOGZ', 'GRIDXY', 'GRIDX', 'GRIDY', 'TICKXY', 'TICKX', 'TICKY'];\n checkhopt.forEach(name => { if (d.check(name)) hopt += ';' + name; });\n if (d.check('XAXIS_', true)) hopt += ';XAXIS_' + d.part;\n if (d.check('YAXIS_', true)) hopt += ';YAXIS_' + d.part;\n\n if (d.empty()) {\n res.original = has_main ? 'lp' : 'alp';\n d = new DrawOptions(res.original);\n }\n\n if (d.check('NOOPT')) res.NoOpt = 1;\n\n if (d.check('POS3D_', true)) res.pos3d = d.partAsInt() - 0.5;\n\n res._pfc = d.check('PFC');\n res._plc = d.check('PLC');\n res._pmc = d.check('PMC');\n\n if (d.check('A')) res.Axis = d.check('I') ? 'A' : 'AXIS'; // I means invisible axis\n if (d.check('X+')) { res.Axis += 'X+'; res.second_x = has_main; }\n if (d.check('Y+')) { res.Axis += 'Y+'; res.second_y = has_main; }\n if (d.check('RX')) res.Axis += 'RX';\n if (d.check('RY')) res.Axis += 'RY';\n\n if (is_gme) {\n res.blocks = [];\n res.skip_errors_x0 = res.skip_errors_y0 = false;\n if (d.check('X0')) res.skip_errors_x0 = true;\n if (d.check('Y0')) res.skip_errors_y0 = true;\n }\n\n decodeBlock(d, res);\n\n if (is_gme) {\n if (d.check('S')) res.individual_styles = true;\n }\n\n // if (d.check('E')) res.Errors = 1; // E option only defined for TGraphPolar\n\n if (res.Errors === undefined)\n res.Errors = this.has_errors && (!is_gme || !blocks_gme.length) ? 1 : 0;\n\n // special case - one could use svg:path to draw many pixels (\n if ((res.Mark == 1) && (graph.fMarkerStyle == 1)) res.Mark = 101;\n\n // if no drawing option is selected and if opt == '' nothing is done.\n if (res.Line + res.Fill + res.Curve + res.Mark + res.Bar + res.EF + res.Rect + res.Errors == 0) {\n if (d.empty()) res.Line = 1;\n }\n\n if (graph._typename == clTGraphErrors) {\n let len = graph.fEX.length, m = 0;\n for (let k = 0; k < len; ++k)\n m = Math.max(m, graph.fEX[k], graph.fEY[k]);\n if (m < 1e-100)\n res.Errors = 0;\n }\n\n if (!res.Axis) {\n // check if axis should be drawn\n // either graph drawn directly or\n // graph is first object in list of primitives\n let pp = this.getPadPainter(),\n pad = pp?.getRootPad(true);\n if (!pad || (pad?.fPrimitives?.arr[0] === graph)) res.Axis = 'AXIS';\n } else if (res.Axis.indexOf('A') < 0) {\n res.Axis = 'AXIS,' + res.Axis;\n }\n\n res.Axis += hopt;\n\n for (let bl = 0; bl < blocks_gme.length; ++bl) {\n let subd = new DrawOptions(blocks_gme[bl]), subres = {};\n decodeBlock(subd, subres);\n subres.skip_errors_x0 = res.skip_errors_x0;\n subres.skip_errors_y0 = res.skip_errors_y0;\n res.blocks.push(subres);\n }\n }\n\n /** @summary Extract errors for TGraphMultiErrors */\n extractGmeErrors(nblock) {\n if (!this.bins) return;\n let gr = this.getObject();\n this.bins.forEach(bin => {\n bin.eylow = gr.fEyL[nblock][bin.indx];\n bin.eyhigh = gr.fEyH[nblock][bin.indx];\n });\n }\n\n /** @summary Create bins for TF1 drawing */\n createBins() {\n let gr = this.getObject();\n if (!gr) return;\n\n let kind = 0, npoints = gr.fNpoints;\n if ((gr._typename === clTCutG) && (npoints > 3)) npoints--;\n\n if (gr._typename == clTGraphErrors)\n kind = 1;\n else if (gr._typename == clTGraphMultiErrors)\n kind = 2;\n else if (gr._typename == clTGraphAsymmErrors || gr._typename == clTGraphBentErrors || gr._typename.match(/^RooHist/))\n kind = 3;\n\n this.bins = new Array(npoints);\n\n for (let p = 0; p < npoints; ++p) {\n let bin = this.bins[p] = { x: gr.fX[p], y: gr.fY[p], indx: p };\n switch(kind) {\n case 1:\n bin.exlow = bin.exhigh = gr.fEX[p];\n bin.eylow = bin.eyhigh = gr.fEY[p];\n break;\n case 2:\n bin.exlow = gr.fExL[p];\n bin.exhigh = gr.fExH[p];\n bin.eylow = gr.fEyL[0][p];\n bin.eyhigh = gr.fEyH[0][p];\n break;\n case 3:\n bin.exlow = gr.fEXlow[p];\n bin.exhigh = gr.fEXhigh[p];\n bin.eylow = gr.fEYlow[p];\n bin.eyhigh = gr.fEYhigh[p];\n break;\n }\n\n if (p === 0) {\n this.xmin = this.xmax = bin.x;\n this.ymin = this.ymax = bin.y;\n }\n\n if (kind > 0) {\n this.xmin = Math.min(this.xmin, bin.x - bin.exlow, bin.x + bin.exhigh);\n this.xmax = Math.max(this.xmax, bin.x - bin.exlow, bin.x + bin.exhigh);\n this.ymin = Math.min(this.ymin, bin.y - bin.eylow, bin.y + bin.eyhigh);\n this.ymax = Math.max(this.ymax, bin.y - bin.eylow, bin.y + bin.eyhigh);\n } else {\n this.xmin = Math.min(this.xmin, bin.x);\n this.xmax = Math.max(this.xmax, bin.x);\n this.ymin = Math.min(this.ymin, bin.y);\n this.ymax = Math.max(this.ymax, bin.y);\n }\n }\n }\n\n /** @summary Create histogram for graph\n * @desc graph bins should be created when calling this function\n * @param {boolean} [set_x] - set X axis range\n * @param {boolean} [set_y] - set Y axis range */\n createHistogram(set_x, set_y) {\n if (!set_x && !set_y)\n set_x = set_y = true;\n\n let xmin = this.xmin, xmax = this.xmax, ymin = this.ymin, ymax = this.ymax;\n\n if (xmin >= xmax) xmax = xmin+1;\n if (ymin >= ymax) ymax = ymin+1;\n let dx = (xmax-xmin)*0.1, dy = (ymax-ymin)*0.1,\n uxmin = xmin - dx, uxmax = xmax + dx,\n minimum = ymin - dy, maximum = ymax + dy;\n\n if ((uxmin < 0) && (xmin >= 0)) uxmin = xmin*0.9;\n if ((uxmax > 0) && (xmax <= 0)) uxmax = 0;\n\n let graph = this.getObject(),\n histo = graph.fHistogram,\n minimum0 = minimum, maximum0 = maximum;\n\n if (!histo) {\n histo = graph.fHistogram = createHistogram('TH1F', 100);\n histo.fName = graph.fName + '_h';\n const kNoStats = BIT(9);\n histo.fBits = histo.fBits | kNoStats;\n this._own_histogram = true;\n } else if ((histo.fMaximum != kNoZoom) && (histo.fMinimum != kNoZoom)) {\n minimum = histo.fMinimum;\n maximum = histo.fMaximum;\n }\n\n if (graph.fMinimum != kNoZoom) minimum = ymin = graph.fMinimum;\n if (graph.fMaximum != kNoZoom) maximum = graph.fMaximum;\n if ((minimum < 0) && (ymin >= 0)) minimum = 0.9*ymin;\n\n histo.fTitle = graph.fTitle;\n\n if (set_x) {\n histo.fXaxis.fXmin = uxmin;\n histo.fXaxis.fXmax = uxmax;\n }\n\n if (set_y) {\n histo.fYaxis.fXmin = Math.min(minimum0, minimum);\n histo.fYaxis.fXmax = Math.max(maximum0, maximum);\n histo.fMinimum = minimum;\n histo.fMaximum = maximum;\n }\n\n return histo;\n }\n\n /** @summary Check if user range can be unzommed\n * @desc Used when graph points covers larger range than provided histogram */\n unzoomUserRange(dox, doy /*, doz*/) {\n let graph = this.getObject();\n if (this._own_histogram || !graph) return false;\n\n let histo = graph.fHistogram;\n\n dox = dox && histo && ((histo.fXaxis.fXmin > this.xmin) || (histo.fXaxis.fXmax < this.xmax));\n doy = doy && histo && ((histo.fYaxis.fXmin > this.ymin) || (histo.fYaxis.fXmax < this.ymax));\n if (!dox && !doy) return false;\n\n this.createHistogram(dox, doy);\n this.getMainPainter()?.extractAxesProperties(1); // just to enforce ranges extraction\n\n return true;\n }\n\n /** @summary Returns true if graph drawing can be optimize */\n canOptimize() {\n return (settings.OptimizeDraw > 0) && !this.options.NoOpt;\n }\n\n /** @summary Returns optimized bins - if optimization enabled */\n optimizeBins(maxpnt, filter_func) {\n if ((this.bins.length < 30) && !filter_func) return this.bins;\n\n let selbins = null;\n if (isFunc(filter_func)) {\n for (let n = 0; n < this.bins.length; ++n) {\n if (filter_func(this.bins[n],n)) {\n if (!selbins) selbins = (n == 0) ? [] : this.bins.slice(0, n);\n } else {\n if (selbins) selbins.push(this.bins[n]);\n }\n }\n }\n if (!selbins) selbins = this.bins;\n\n if (!maxpnt) maxpnt = 500000;\n\n if ((selbins.length < maxpnt) || !this.canOptimize()) return selbins;\n let step = Math.floor(selbins.length / maxpnt);\n if (step < 2) step = 2;\n let optbins = [];\n for (let n = 0; n < selbins.length; n+=step)\n optbins.push(selbins[n]);\n\n return optbins;\n }\n\n /** @summary Returns tooltip for specified bin */\n getTooltips(d) {\n let pmain = this.get_main(), lines = [],\n funcs = pmain.getGrFuncs(this.options.second_x, this.options.second_y),\n gme = this.get_gme();\n\n lines.push(this.getObjectHint());\n\n if (d && funcs) {\n if (d.indx !== undefined)\n lines.push('p = ' + d.indx);\n lines.push('x = ' + funcs.axisAsText('x', d.x), 'y = ' + funcs.axisAsText('y', d.y));\n if (gme)\n lines.push('error x = -' + funcs.axisAsText('x', gme.fExL[d.indx]) + '/+' + funcs.axisAsText('x', gme.fExH[d.indx]));\n else if (this.options.Errors && (funcs.x_handle.kind == 'normal') && (d.exlow || d.exhigh))\n lines.push('error x = -' + funcs.axisAsText('x', d.exlow) + '/+' + funcs.axisAsText('x', d.exhigh));\n\n if (gme) {\n for (let ny = 0; ny < gme.fNYErrors; ++ny)\n lines.push(`error y${ny} = -${funcs.axisAsText('y', gme.fEyL[ny][d.indx])}/+${funcs.axisAsText('y', gme.fEyH[ny][d.indx])}`);\n } else if ((this.options.Errors || (this.options.EF > 0)) && (funcs.y_handle.kind == 'normal') && (d.eylow || d.eyhigh))\n lines.push('error y = -' + funcs.axisAsText('y', d.eylow) + '/+' + funcs.axisAsText('y', d.eyhigh));\n\n }\n return lines;\n }\n\n /** @summary Provide frame painter for graph\n * @desc If not exists, emulate its behaviour */\n get_main() {\n let pmain = this.getFramePainter();\n\n if (pmain && pmain.grx && pmain.gry) return pmain;\n\n // FIXME: check if needed, can be removed easily\n let pp = this.getPadPainter(),\n rect = pp?.getPadRect() || { width: 800, height: 600 };\n\n pmain = {\n pad_layer: true,\n pad: pp?.getRootPad(true),\n pw: rect.width,\n ph: rect.height,\n getFrameWidth() { return this.pw; },\n getFrameHeight() { return this.ph; },\n grx(value) {\n if (this.pad.fLogx)\n value = (value > 0) ? Math.log10(value) : this.pad.fUxmin;\n else\n value = (value - this.pad.fX1) / (this.pad.fX2 - this.pad.fX1);\n return value * this.pw;\n },\n gry(value) {\n if (this.pad.fLogy)\n value = (value > 0) ? Math.log10(value) : this.pad.fUymin;\n else\n value = (value - this.pad.fY1) / (this.pad.fY2 - this.pad.fY1);\n return (1 - value) * this.ph;\n },\n revertAxis(name, v) {\n if (name == 'x')\n return v / this.pw * (this.pad.fX2 - this.pad.fX1) + this.pad.fX1;\n if (name == 'y')\n return (1 - v / this.ph) * (this.pad.fY2 - this.pad.fY1) + this.pad.fY1;\n return v;\n },\n getGrFuncs() { return this; }\n }\n\n return pmain.pad ? pmain : null;\n }\n\n /** @summary append exclusion area to created path */\n appendExclusion(is_curve, path, drawbins, excl_width) {\n let extrabins = [];\n for (let n = drawbins.length-1; n >= 0; --n) {\n let bin = drawbins[n],\n dlen = Math.sqrt(bin.dgrx**2 + bin.dgry**2);\n // shift point\n bin.grx += excl_width*bin.dgry/dlen;\n bin.gry -= excl_width*bin.dgrx/dlen;\n extrabins.push(bin);\n }\n\n let path2 = buildSvgPath(is_curve ? 'Lbezier' : 'Lline', extrabins);\n\n this.draw_g.append('svg:path')\n .attr('d', path.path + path2.path + 'Z')\n .call(this.fillatt.func)\n .style('opacity', 0.75);\n }\n\n /** @summary draw TGraph bins with specified options\n * @desc Can be called several times */\n drawBins(funcs, options, draw_g, w, h, lineatt, fillatt, main_block) {\n let graph = this.getObject(),\n excl_width = 0, drawbins = null;\n\n if (main_block && lineatt.excl_side) {\n excl_width = lineatt.excl_width;\n if ((lineatt.width > 0) && !options.Line && !options.Curve) options.Line = 1;\n }\n\n if (options.EF) {\n drawbins = this.optimizeBins((options.EF > 1) ? 20000 : 0);\n\n // build lower part\n for (let n = 0; n < drawbins.length; ++n) {\n let bin = drawbins[n];\n bin.grx = funcs.grx(bin.x);\n bin.gry = funcs.gry(bin.y - bin.eylow);\n }\n\n let path1 = buildSvgPath((options.EF > 1) ? 'bezier' : 'line', drawbins),\n bins2 = [];\n\n for (let n = drawbins.length-1; n >= 0; --n) {\n let bin = drawbins[n];\n bin.gry = funcs.gry(bin.y + bin.eyhigh);\n bins2.push(bin);\n }\n\n // build upper part (in reverse direction)\n let path2 = buildSvgPath((options.EF > 1) ? 'Lbezier' : 'Lline', bins2);\n\n draw_g.append('svg:path')\n .attr('d', path1.path + path2.path + 'Z')\n .call(fillatt.func);\n if (main_block)\n this.draw_kind = 'lines';\n }\n\n if (options.Line || options.Fill) {\n\n let close_symbol = '';\n if (graph._typename == clTCutG) options.Fill = 1;\n\n if (options.Fill) {\n close_symbol = 'Z'; // always close area if we want to fill it\n excl_width = 0;\n }\n\n if (!drawbins) drawbins = this.optimizeBins(0);\n\n for (let n = 0; n < drawbins.length; ++n) {\n let bin = drawbins[n];\n bin.grx = funcs.grx(bin.x);\n bin.gry = funcs.gry(bin.y);\n }\n\n let kind = 'line'; // simple line\n if (excl_width) kind += 'calc'; // we need to calculated deltas to build exclusion points\n\n let path = buildSvgPath(kind, drawbins);\n\n if (excl_width)\n this.appendExclusion(false, path, drawbins, excl_width);\n\n let elem = draw_g.append('svg:path').attr('d', path.path + close_symbol);\n if (options.Line)\n elem.call(lineatt.func);\n\n if (options.Fill)\n elem.call(fillatt.func);\n else\n elem.style('fill', 'none');\n\n if (main_block)\n this.draw_kind = 'lines';\n }\n\n if (options.Curve) {\n let curvebins = drawbins;\n if ((this.draw_kind != 'lines') || !curvebins || ((options.Curve == 1) && (curvebins.length > 20000))) {\n curvebins = this.optimizeBins((options.Curve == 1) ? 20000 : 0);\n for (let n = 0; n < curvebins.length; ++n) {\n let bin = curvebins[n];\n bin.grx = funcs.grx(bin.x);\n bin.gry = funcs.gry(bin.y);\n }\n }\n\n let kind = 'bezier';\n if (excl_width) kind += 'calc'; // we need to calculated deltas to build exclusion points\n\n let path = buildSvgPath(kind, curvebins);\n\n if (excl_width)\n this.appendExclusion(true, path, curvebins, excl_width);\n\n draw_g.append('svg:path')\n .attr('d', path.path)\n .call(lineatt.func)\n .style('fill', 'none');\n if (main_block)\n this.draw_kind = 'lines'; // handled same way as lines\n }\n\n let nodes = null;\n\n if (options.Errors || options.Rect || options.Bar) {\n\n drawbins = this.optimizeBins(5000, (pnt,i) => {\n\n let grx = funcs.grx(pnt.x);\n\n // when drawing bars, take all points\n if (!options.Bar && ((grx < 0) || (grx > w))) return true;\n\n let gry = funcs.gry(pnt.y);\n\n if (!options.Bar && !options.OutRange && ((gry < 0) || (gry > h))) return true;\n\n pnt.grx1 = Math.round(grx);\n pnt.gry1 = Math.round(gry);\n\n if (this.has_errors) {\n pnt.grx0 = Math.round(funcs.grx(pnt.x - options.ScaleErrX*pnt.exlow) - grx);\n pnt.grx2 = Math.round(funcs.grx(pnt.x + options.ScaleErrX*pnt.exhigh) - grx);\n pnt.gry0 = Math.round(funcs.gry(pnt.y - pnt.eylow) - gry);\n pnt.gry2 = Math.round(funcs.gry(pnt.y + pnt.eyhigh) - gry);\n\n if (this.is_bent) {\n pnt.grdx0 = Math.round(funcs.gry(pnt.y + graph.fEXlowd[i]) - gry);\n pnt.grdx2 = Math.round(funcs.gry(pnt.y + graph.fEXhighd[i]) - gry);\n pnt.grdy0 = Math.round(funcs.grx(pnt.x + graph.fEYlowd[i]) - grx);\n pnt.grdy2 = Math.round(funcs.grx(pnt.x + graph.fEYhighd[i]) - grx);\n } else {\n pnt.grdx0 = pnt.grdx2 = pnt.grdy0 = pnt.grdy2 = 0;\n }\n }\n\n return false;\n });\n\n if (main_block)\n this.draw_kind = 'nodes';\n\n nodes = draw_g.selectAll('.grpoint')\n .data(drawbins)\n .enter()\n .append('svg:g')\n .attr('class', 'grpoint')\n .attr('transform', d => `translate(${d.grx1},${d.gry1})`);\n }\n\n if (options.Bar) {\n // calculate bar width\n for (let i = 1; i < drawbins.length-1; ++i)\n drawbins[i].width = Math.max(2, (drawbins[i+1].grx1 - drawbins[i-1].grx1) / 2 - 2);\n\n // first and last bins\n switch (drawbins.length) {\n case 0: break;\n case 1: drawbins[0].width = w/4; break; // pathologic case of single bin\n case 2: drawbins[0].width = drawbins[1].width = (drawbins[1].grx1-drawbins[0].grx1)/2; break;\n default:\n drawbins[0].width = drawbins[1].width;\n drawbins[drawbins.length-1].width = drawbins[drawbins.length-2].width;\n }\n\n let yy0 = Math.round(funcs.gry(0)), usefill = fillatt;\n\n if (main_block) {\n let fp = this.getFramePainter(),\n fpcol = fp?.fillatt && !fp?.fillatt.empty() ? fp.fillatt.getFillColor() : -1;\n if (fpcol === fillatt.getFillColor())\n usefill = new TAttFillHandler({ color: fpcol == 'white' ? 1 : 0, pattern: 1001 });\n }\n\n nodes.append('svg:path')\n .attr('d', d => {\n d.bar = true; // element drawn as bar\n let dx = Math.round(-d.width/2),\n dw = Math.round(d.width),\n dy = (options.Bar !== 1) ? 0 : ((d.gry1 > yy0) ? yy0-d.gry1 : 0),\n dh = (options.Bar !== 1) ? (h > d.gry1 ? h - d.gry1 : 0) : Math.abs(yy0 - d.gry1);\n return `M${dx},${dy}h${dw}v${dh}h${-dw}z`;\n })\n .call(usefill.func);\n }\n\n if (options.Rect) {\n nodes.filter(d => (d.exlow > 0) && (d.exhigh > 0) && (d.eylow > 0) && (d.eyhigh > 0))\n .append('svg:path')\n .attr('d', d => {\n d.rect = true;\n return `M${d.grx0},${d.gry0}H${d.grx2}V${d.gry2}H${d.grx0}Z`;\n })\n .call(fillatt.func)\n .call(options.Rect === 2 ? lineatt.func : () => {});\n }\n\n this.error_size = 0;\n\n if (options.Errors) {\n // to show end of error markers, use line width attribute\n let lw = lineatt.width + gStyle.fEndErrorSize, bb = 0,\n vv = options.Ends ? `m0,${lw}v${-2*lw}` : '',\n hh = options.Ends ? `m${lw},0h${-2*lw}` : '',\n vleft = vv, vright = vv, htop = hh, hbottom = hh;\n\n const mainLine = (dx,dy) => {\n if (!options.MainError) return `M${dx},${dy}`;\n let res = 'M0,0';\n if (dx) return res + (dy ? `L${dx},${dy}` : `H${dx}`);\n return dy ? res + `V${dy}` : res;\n };\n\n switch (options.Ends) {\n case 2: // option []\n bb = Math.max(lineatt.width+1, Math.round(lw*0.66));\n vleft = `m${bb},${lw}h${-bb}v${-2*lw}h${bb}`;\n vright = `m${-bb},${lw}h${bb}v${-2*lw}h${-bb}`;\n htop = `m${-lw},${bb}v${-bb}h${2*lw}v${bb}`;\n hbottom = `m${-lw},${-bb}v${bb}h${2*lw}v${-bb}`;\n break;\n case 3: // option |>\n lw = Math.max(lw, Math.round(graph.fMarkerSize*8*0.66));\n bb = Math.max(lineatt.width+1, Math.round(lw*0.66));\n vleft = `l${bb},${lw}v${-2*lw}l${-bb},${lw}`;\n vright = `l${-bb},${lw}v${-2*lw}l${bb},${lw}`;\n htop = `l${-lw},${bb}h${2*lw}l${-lw},${-bb}`;\n hbottom = `l${-lw},${-bb}h${2*lw}l${-lw},${bb}`;\n break;\n case 4: // option >\n lw = Math.max(lw, Math.round(graph.fMarkerSize*8*0.66));\n bb = Math.max(lineatt.width+1, Math.round(lw*0.66));\n vleft = `l${bb},${lw}m0,${-2*lw}l${-bb},${lw}`;\n vright = `l${-bb},${lw}m0,${-2*lw}l${bb},${lw}`;\n htop = `l${-lw},${bb}m${2*lw},0l${-lw},${-bb}`;\n hbottom = `l${-lw},${-bb}m${2*lw},0l${-lw},${bb}`;\n break;\n }\n\n this.error_size = lw;\n\n lw = Math.floor((lineatt.width-1)/2); // one should take into account half of end-cup line width\n\n let visible = nodes.filter(d => (d.exlow > 0) || (d.exhigh > 0) || (d.eylow > 0) || (d.eyhigh > 0));\n if (options.skip_errors_x0 || options.skip_errors_y0)\n visible = visible.filter(d => ((d.x != 0) || !options.skip_errors_x0) && ((d.y != 0) || !options.skip_errors_y0));\n\n if (!isBatchMode() && settings.Tooltip && main_block)\n visible.append('svg:path')\n .style('fill', 'none')\n .style('pointer-events', 'visibleFill')\n .attr('d', d => `M${d.grx0},${d.gry0}h${d.grx2-d.grx0}v${d.gry2-d.gry0}h${d.grx0-d.grx2}z`);\n\n visible.append('svg:path')\n .call(lineatt.func)\n .style('fill', 'none')\n .attr('d', d => {\n d.error = true;\n return ((d.exlow > 0) ? mainLine(d.grx0+lw, d.grdx0) + vleft : '') +\n ((d.exhigh > 0) ? mainLine(d.grx2-lw, d.grdx2) + vright : '') +\n ((d.eylow > 0) ? mainLine(d.grdy0, d.gry0-lw) + hbottom : '') +\n ((d.eyhigh > 0) ? mainLine(d.grdy2, d.gry2+lw) + htop : '');\n });\n }\n\n if (options.Mark) {\n // for tooltips use markers only if nodes were not created\n this.createAttMarker({ attr: graph, style: options.Mark - 100 });\n\n this.marker_size = this.markeratt.getFullSize();\n\n this.markeratt.resetPos();\n\n let path = '', pnt, grx, gry,\n want_tooltip = !isBatchMode() && settings.Tooltip && (!this.markeratt.fill || (this.marker_size < 7)) && !nodes && main_block,\n hints_marker = '', hsz = Math.max(5, Math.round(this.marker_size*0.7)),\n maxnummarker = 1000000 / (this.markeratt.getMarkerLength() + 7), step = 1; // let produce SVG at maximum 1MB\n\n if (!drawbins)\n drawbins = this.optimizeBins(maxnummarker);\n else if (this.canOptimize() && (drawbins.length > 1.5*maxnummarker))\n step = Math.min(2, Math.round(drawbins.length/maxnummarker));\n\n for (let n = 0; n < drawbins.length; n += step) {\n pnt = drawbins[n];\n grx = funcs.grx(pnt.x);\n if ((grx > -this.marker_size) && (grx < w + this.marker_size)) {\n gry = funcs.gry(pnt.y);\n if ((gry > -this.marker_size) && (gry < h + this.marker_size)) {\n path += this.markeratt.create(grx, gry);\n if (want_tooltip) hints_marker += `M${grx-hsz},${gry-hsz}h${2*hsz}v${2*hsz}h${-2*hsz}z`;\n }\n }\n }\n\n if (path) {\n draw_g.append('svg:path')\n .attr('d', path)\n .call(this.markeratt.func);\n if ((nodes === null) && (this.draw_kind == 'none') && main_block)\n this.draw_kind = (options.Mark == 101) ? 'path' : 'mark';\n }\n if (want_tooltip && hints_marker)\n draw_g.append('svg:path')\n .attr('d', hints_marker)\n .style('fill', 'none')\n .style('pointer-events', 'visibleFill');\n }\n }\n\n /** @summary append TGraphQQ part */\n appendQQ(funcs, graph) {\n let xqmin = Math.max(funcs.scale_xmin, graph.fXq1),\n xqmax = Math.min(funcs.scale_xmax, graph.fXq2),\n yqmin = Math.max(funcs.scale_ymin, graph.fYq1),\n yqmax = Math.min(funcs.scale_ymax, graph.fYq2),\n path2 = '',\n makeLine = (x1,y1,x2,y2) => `M${funcs.grx(x1)},${funcs.gry(y1)}L${funcs.grx(x2)},${funcs.gry(y2)}`,\n yxmin = (graph.fYq2 - graph.fYq1)*(funcs.scale_xmin-graph.fXq1)/(graph.fXq2-graph.fXq1) + graph.fYq1,\n yxmax = (graph.fYq2-graph.fYq1)*(funcs.scale_xmax-graph.fXq1)/(graph.fXq2-graph.fXq1) + graph.fYq1;\n\n if (yxmin < funcs.scale_ymin) {\n let xymin = (graph.fXq2 - graph.fXq1)*(funcs.scale_ymin-graph.fYq1)/(graph.fYq2-graph.fYq1) + graph.fXq1;\n path2 = makeLine(xymin, funcs.scale_ymin, xqmin, yqmin);\n } else {\n path2 = makeLine(funcs.scale_xmin, yxmin, xqmin, yqmin);\n }\n\n if (yxmax > funcs.scale_ymax) {\n let xymax = (graph.fXq2-graph.fXq1)*(funcs.scale_ymax-graph.fYq1)/(graph.fYq2-graph.fYq1) + graph.fXq1;\n path2 += makeLine(xqmax, yqmax, xymax, funcs.scale_ymax);\n } else {\n path2 += makeLine(xqmax, yqmax, funcs.scale_xmax, yxmax);\n }\n\n let latt1 = new TAttLineHandler({ style: 1, width: 1, color: 'black' }),\n latt2 = new TAttLineHandler({ style: 2, width: 1, color: 'black' });\n\n this.draw_g.append('path')\n .attr('d', makeLine(xqmin,yqmin,xqmax,yqmax))\n .call(latt1.func)\n .style('fill', 'none');\n\n this.draw_g.append('path')\n .attr('d', path2)\n .call(latt2.func)\n .style('fill', 'none');\n }\n\n drawBins3D(/*fp, graph*/) {\n console.log('Load ./hist/TGraphPainter.mjs to draw graph in 3D');\n }\n\n /** @summary draw TGraph */\n drawGraph() {\n\n let pmain = this.get_main(),\n graph = this.getObject();\n if (!pmain) return;\n\n // special mode for TMultiGraph 3d drawing\n if (this.options.pos3d)\n return this.drawBins3D(pmain, graph);\n\n let is_gme = !!this.get_gme(),\n funcs = pmain.getGrFuncs(this.options.second_x, this.options.second_y),\n w = pmain.getFrameWidth(),\n h = pmain.getFrameHeight();\n\n this.createG(!pmain.pad_layer);\n\n if (this.options._pfc || this.options._plc || this.options._pmc) {\n let mp = this.getMainPainter();\n if (isFunc(mp?.createAutoColor)) {\n let icolor = mp.createAutoColor();\n if (this.options._pfc) { graph.fFillColor = icolor; delete this.fillatt; }\n if (this.options._plc) { graph.fLineColor = icolor; delete this.lineatt; }\n if (this.options._pmc) { graph.fMarkerColor = icolor; delete this.markeratt; }\n this.options._pfc = this.options._plc = this.options._pmc = false;\n }\n }\n\n this.createAttLine({ attr: graph, can_excl: true });\n this.createAttFill({ attr: graph });\n\n this.fillatt.used = false; // mark used only when really used\n\n this.draw_kind = 'none'; // indicate if special svg:g were created for each bin\n this.marker_size = 0; // indicate if markers are drawn\n let draw_g = is_gme ? this.draw_g.append('svg:g') : this.draw_g;\n\n this.drawBins(funcs, this.options, draw_g, w, h, this.lineatt, this.fillatt, true);\n\n if (graph._typename == 'TGraphQQ')\n this.appendQQ(funcs, graph);\n\n if (is_gme) {\n for (let k = 0; k < graph.fNYErrors; ++k) {\n let lineatt = this.lineatt, fillatt = this.fillatt;\n if (this.options.individual_styles) {\n lineatt = new TAttLineHandler({ attr: graph.fAttLine[k], std: false });\n fillatt = new TAttFillHandler({ attr: graph.fAttFill[k], std: false, svg: this.getCanvSvg() });\n }\n let sub_g = this.draw_g.append('svg:g'),\n options = k < this.options.blocks.length ? this.options.blocks[k] : this.options;\n this.extractGmeErrors(k);\n this.drawBins(funcs, options, sub_g, w, h, lineatt, fillatt);\n }\n this.extractGmeErrors(0); // ensure that first block kept at the end\n }\n\n if (!isBatchMode())\n addMoveHandler(this, this.testEditable());\n }\n\n /** @summary Provide tooltip at specified point */\n extractTooltip(pnt) {\n if (!pnt) return null;\n\n if ((this.draw_kind == 'lines') || (this.draw_kind == 'path') || (this.draw_kind == 'mark'))\n return this.extractTooltipForPath(pnt);\n\n if (this.draw_kind != 'nodes') return null;\n\n let pmain = this.get_main(),\n height = pmain.getFrameHeight(),\n esz = this.error_size,\n isbar1 = (this.options.Bar === 1),\n funcs = isbar1 ? pmain.getGrFuncs(this.options.second_x, this.options.second_y) : null,\n findbin = null, best_dist2 = 1e10, best = null,\n msize = this.marker_size ? Math.round(this.marker_size/2 + 1.5) : 0;\n\n this.draw_g.selectAll('.grpoint').each(function() {\n let d = d3_select(this).datum();\n if (d === undefined) return;\n let dist2 = (pnt.x - d.grx1) ** 2;\n if (pnt.nproc === 1) dist2 += (pnt.y - d.gry1) ** 2;\n if (dist2 >= best_dist2) return;\n\n let rect;\n\n if (d.error || d.rect || d.marker) {\n rect = { x1: Math.min(-esz, d.grx0, -msize),\n x2: Math.max(esz, d.grx2, msize),\n y1: Math.min(-esz, d.gry2, -msize),\n y2: Math.max(esz, d.gry0, msize) };\n } else if (d.bar) {\n rect = { x1: -d.width/2, x2: d.width/2, y1: 0, y2: height - d.gry1 };\n\n if (isbar1) {\n let yy0 = funcs.gry(0);\n rect.y1 = (d.gry1 > yy0) ? yy0-d.gry1 : 0;\n rect.y2 = (d.gry1 > yy0) ? 0 : yy0-d.gry1;\n }\n } else {\n rect = { x1: -5, x2: 5, y1: -5, y2: 5 };\n }\n let matchx = (pnt.x >= d.grx1 + rect.x1) && (pnt.x <= d.grx1 + rect.x2),\n matchy = (pnt.y >= d.gry1 + rect.y1) && (pnt.y <= d.gry1 + rect.y2);\n\n if (matchx && (matchy || (pnt.nproc > 1))) {\n best_dist2 = dist2;\n findbin = this;\n best = rect;\n best.exact = /* matchx && */ matchy;\n }\n });\n\n if (findbin === null) return null;\n\n let d = d3_select(findbin).datum(),\n gr = this.getObject(),\n res = { name: gr.fName, title: gr.fTitle,\n x: d.grx1, y: d.gry1,\n color1: this.lineatt.color,\n lines: this.getTooltips(d),\n rect: best, d3bin: findbin };\n\n res.user_info = { obj: gr, name: gr.fName, bin: d.indx, cont: d.y, grx: d.grx1, gry: d.gry1 };\n\n if (this.fillatt && this.fillatt.used && !this.fillatt.empty())\n res.color2 = this.fillatt.getFillColor();\n\n if (best.exact) res.exact = true;\n res.menu = res.exact; // activate menu only when exactly locate bin\n res.menu_dist = 3; // distance always fixed\n res.bin = d;\n res.binindx = d.indx;\n\n return res;\n }\n\n /** @summary Show tooltip */\n showTooltip(hint) {\n\n if (!hint) {\n if (this.draw_g) this.draw_g.select('.tooltip_bin').remove();\n return;\n }\n\n if (hint.usepath) return this.showTooltipForPath(hint);\n\n let d = d3_select(hint.d3bin).datum(),\n ttrect = this.draw_g.select('.tooltip_bin');\n\n if (ttrect.empty())\n ttrect = this.draw_g.append('svg:rect')\n .attr('class', 'tooltip_bin h1bin')\n .style('pointer-events', 'none');\n\n hint.changed = ttrect.property('current_bin') !== hint.d3bin;\n\n if (hint.changed)\n ttrect.attr('x', d.grx1 + hint.rect.x1)\n .attr('width', hint.rect.x2 - hint.rect.x1)\n .attr('y', d.gry1 + hint.rect.y1)\n .attr('height', hint.rect.y2 - hint.rect.y1)\n .style('opacity', '0.3')\n .property('current_bin', hint.d3bin);\n }\n\n /** @summary Process tooltip event */\n processTooltipEvent(pnt) {\n let hint = this.extractTooltip(pnt);\n if (!pnt || !pnt.disabled) this.showTooltip(hint);\n return hint;\n }\n\n /** @summary Find best bin index for specified point */\n findBestBin(pnt) {\n if (!this.bins) return null;\n\n let islines = (this.draw_kind == 'lines'),\n bestindx = -1,\n bestbin = null,\n bestdist = 1e10,\n funcs = this.get_main().getGrFuncs(this.options.second_x, this.options.second_y),\n dist, grx, gry, n, bin;\n\n for (n = 0; n < this.bins.length; ++n) {\n bin = this.bins[n];\n\n grx = funcs.grx(bin.x);\n gry = funcs.gry(bin.y);\n\n dist = (pnt.x-grx)**2 + (pnt.y-gry)**2;\n\n if (dist < bestdist) {\n bestdist = dist;\n bestbin = bin;\n bestindx = n;\n }\n }\n\n // check last point\n if ((bestdist > 100) && islines) bestbin = null;\n\n let radius = Math.max(this.lineatt.width + 3, 4);\n\n if (this.marker_size > 0) radius = Math.max(this.marker_size, radius);\n\n if (bestbin)\n bestdist = Math.sqrt((pnt.x-funcs.grx(bestbin.x))**2 + (pnt.y-funcs.gry(bestbin.y))**2);\n\n if (!islines && (bestdist > radius)) bestbin = null;\n\n if (!bestbin) bestindx = -1;\n\n let res = { bin: bestbin, indx: bestindx, dist: bestdist, radius: Math.round(radius) };\n\n if (!bestbin && islines) {\n\n bestdist = 1e10;\n\n const IsInside = (x, x1, x2) => ((x1 >= x) && (x >= x2)) || ((x1 <= x) && (x <= x2));\n\n let bin0 = this.bins[0], grx0 = funcs.grx(bin0.x), gry0, posy = 0;\n for (n = 1; n < this.bins.length; ++n) {\n bin = this.bins[n];\n grx = funcs.grx(bin.x);\n\n if (IsInside(pnt.x, grx0, grx)) {\n // if inside interval, check Y distance\n gry0 = funcs.gry(bin0.y);\n gry = funcs.gry(bin.y);\n\n if (Math.abs(grx - grx0) < 1) {\n // very close x - check only y\n posy = pnt.y;\n dist = IsInside(pnt.y, gry0, gry) ? 0 : Math.min(Math.abs(pnt.y-gry0), Math.abs(pnt.y-gry));\n } else {\n posy = gry0 + (pnt.x - grx0) / (grx - grx0) * (gry - gry0);\n dist = Math.abs(posy - pnt.y);\n }\n\n if (dist < bestdist) {\n bestdist = dist;\n res.linex = pnt.x;\n res.liney = posy;\n }\n }\n\n bin0 = bin;\n grx0 = grx;\n }\n\n if (bestdist < radius*0.5) {\n res.linedist = bestdist;\n res.closeline = true;\n }\n }\n\n return res;\n }\n\n /** @summary Check editable flag for TGraph\n * @desc if arg specified changes or toggles editable flag */\n testEditable(arg) {\n let obj = this.getObject();\n if (!obj) return false;\n if ((arg == 'toggle') || ((arg !== undefined) && (!arg != obj.TestBit(kNotEditable))))\n obj.InvertBit(kNotEditable);\n return !obj.TestBit(kNotEditable);\n }\n\n /** @summary Provide tooltip at specified point for path-based drawing */\n extractTooltipForPath(pnt) {\n\n if (this.bins === null) return null;\n\n let best = this.findBestBin(pnt);\n\n if (!best || (!best.bin && !best.closeline)) return null;\n\n let islines = (this.draw_kind == 'lines'),\n ismark = (this.draw_kind == 'mark'),\n pmain = this.get_main(),\n funcs = pmain.getGrFuncs(this.options.second_x, this.options.second_y),\n gr = this.getObject(),\n res = { name: gr.fName, title: gr.fTitle,\n x: best.bin ? funcs.grx(best.bin.x) : best.linex,\n y: best.bin ? funcs.gry(best.bin.y) : best.liney,\n color1: this.lineatt.color,\n lines: this.getTooltips(best.bin),\n usepath: true };\n\n res.user_info = { obj: gr, name: gr.fName, bin: 0, cont: 0, grx: res.x, gry: res.y };\n\n res.ismark = ismark;\n res.islines = islines;\n\n if (best.closeline) {\n res.menu = res.exact = true;\n res.menu_dist = best.linedist;\n } else if (best.bin) {\n if (this.options.EF && islines) {\n res.gry1 = funcs.gry(best.bin.y - best.bin.eylow);\n res.gry2 = funcs.gry(best.bin.y + best.bin.eyhigh);\n } else {\n res.gry1 = res.gry2 = funcs.gry(best.bin.y);\n }\n\n res.binindx = best.indx;\n res.bin = best.bin;\n res.radius = best.radius;\n res.user_info.bin = best.indx;\n res.user_info.cont = best.bin.y;\n\n res.exact = (Math.abs(pnt.x - res.x) <= best.radius) &&\n ((Math.abs(pnt.y - res.gry1) <= best.radius) || (Math.abs(pnt.y - res.gry2) <= best.radius));\n\n res.menu = res.exact;\n res.menu_dist = Math.sqrt((pnt.x-res.x)**2 + Math.min(Math.abs(pnt.y-res.gry1), Math.abs(pnt.y-res.gry2))**2);\n }\n\n if (this.fillatt && this.fillatt.used && !this.fillatt.empty())\n res.color2 = this.fillatt.getFillColor();\n\n if (!islines) {\n res.color1 = this.getColor(gr.fMarkerColor);\n if (!res.color2) res.color2 = res.color1;\n }\n\n return res;\n }\n\n /** @summary Show tooltip for path drawing */\n showTooltipForPath(hint) {\n\n let ttbin = this.draw_g.select('.tooltip_bin');\n\n if (!hint || !hint.bin) {\n ttbin.remove();\n return;\n }\n\n if (ttbin.empty())\n ttbin = this.draw_g.append('svg:g').attr('class', 'tooltip_bin');\n\n hint.changed = ttbin.property('current_bin') !== hint.bin;\n\n if (hint.changed) {\n ttbin.selectAll('*').remove(); // first delete all children\n ttbin.property('current_bin', hint.bin);\n\n if (hint.ismark) {\n ttbin.append('svg:rect')\n .attr('class','h1bin')\n .style('pointer-events','none')\n .style('opacity', '0.3')\n .attr('x', Math.round(hint.x - hint.radius))\n .attr('y', Math.round(hint.y - hint.radius))\n .attr('width', 2*hint.radius)\n .attr('height', 2*hint.radius);\n } else {\n ttbin.append('svg:circle').attr('cy', Math.round(hint.gry1));\n if (Math.abs(hint.gry1-hint.gry2) > 1)\n ttbin.append('svg:circle').attr('cy', Math.round(hint.gry2));\n\n let elem = ttbin.selectAll('circle')\n .attr('r', hint.radius)\n .attr('cx', Math.round(hint.x));\n\n if (!hint.islines) {\n elem.style('stroke', hint.color1 == 'black' ? 'green' : 'black').style('fill','none');\n } else {\n if (this.options.Line || this.options.Curve)\n elem.call(this.lineatt.func);\n else\n elem.style('stroke','black');\n if (this.options.Fill)\n elem.call(this.fillatt.func);\n else\n elem.style('fill','none');\n }\n }\n }\n }\n\n /** @summary Check if graph moving is enabled */\n moveEnabled() {\n return this.testEditable();\n }\n\n /** @summary Start moving of TGraph */\n moveStart(x,y) {\n this.pos_dx = this.pos_dy = 0;\n this.move_funcs = this.get_main().getGrFuncs(this.options.second_x, this.options.second_y);\n let hint = this.extractTooltip({x, y});\n if (hint && hint.exact && (hint.binindx !== undefined)) {\n this.move_binindx = hint.binindx;\n this.move_bin = hint.bin;\n this.move_x0 = this.move_funcs.grx(this.move_bin.x);\n this.move_y0 = this.move_funcs.gry(this.move_bin.y);\n } else {\n delete this.move_binindx;\n }\n }\n\n /** @summary Perform moving */\n moveDrag(dx,dy) {\n this.pos_dx += dx;\n this.pos_dy += dy;\n\n if (this.move_binindx === undefined) {\n this.draw_g.attr('transform', `translate(${this.pos_dx},${this.pos_dy})`);\n } else if (this.move_funcs && this.move_bin) {\n this.move_bin.x = this.move_funcs.revertAxis('x', this.move_x0 + this.pos_dx);\n this.move_bin.y = this.move_funcs.revertAxis('y', this.move_y0 + this.pos_dy);\n this.drawGraph();\n }\n }\n\n /** @summary Complete moving */\n moveEnd(not_changed) {\n let exec = '';\n\n if (this.move_binindx === undefined) {\n this.draw_g.attr('transform', null);\n\n if (this.move_funcs && this.bins && !not_changed) {\n for (let k = 0; k < this.bins.length; ++k) {\n let bin = this.bins[k];\n bin.x = this.move_funcs.revertAxis('x', this.move_funcs.grx(bin.x) + this.pos_dx);\n bin.y = this.move_funcs.revertAxis('y', this.move_funcs.gry(bin.y) + this.pos_dy);\n exec += `SetPoint(${bin.indx},${bin.x},${bin.y});;`;\n if ((bin.indx == 0) && this.matchObjectType(clTCutG))\n exec += `SetPoint(${this.getObject().fNpoints-1},${bin.x},${bin.y});;`;\n }\n this.drawGraph();\n }\n } else {\n exec = `SetPoint(${this.move_bin.indx},${this.move_bin.x},${this.move_bin.y});;`;\n if ((this.move_bin.indx == 0) && this.matchObjectType(clTCutG))\n exec += `SetPoint(${this.getObject().fNpoints-1},${this.move_bin.x},${this.move_bin.y});;`;\n delete this.move_binindx;\n }\n\n delete this.move_funcs;\n\n if (exec && !not_changed)\n this.submitCanvExec(exec);\n }\n\n /** @summary Fill context menu */\n fillContextMenu(menu) {\n super.fillContextMenu(menu);\n\n if (!this.snapid)\n menu.addchk(this.testEditable(), 'Editable', () => { this.testEditable('toggle'); this.drawGraph(); });\n\n return menu.size() > 0;\n }\n\n /** @summary Execute menu command\n * @private */\n executeMenuCommand(method, args) {\n if (super.executeMenuCommand(method,args)) return true;\n\n let canp = this.getCanvPainter(), pmain = this.get_main();\n\n if ((method.fName == 'RemovePoint') || (method.fName == 'InsertPoint')) {\n if (!canp || canp._readonly) return true; // ignore function\n\n let hint = this.extractTooltip(pnt);\n\n if (method.fName == 'InsertPoint') {\n let pnt = isFunc(pmain.getLastEventPos) ? pmain.getLastEventPos() : null;\n if (pnt) {\n let funcs = pmain.getGrFuncs(this.options.second_x, this.options.second_y),\n userx = funcs.revertAxis('x', pnt.x) ?? 0,\n usery = funcs.revertAxis('y', pnt.y) ?? 0;\n this.submitCanvExec(`AddPoint(${userx.toFixed(3)}, ${usery.toFixed(3)})`, this.args_menu_id);\n }\n } else if (this.args_menu_id && (hint?.binindx !== undefined)) {\n this.submitCanvExec(`RemovePoint(${hint.binindx})`, this.args_menu_id);\n }\n\n return true; // call is processed\n }\n\n return false;\n }\n\n /** @summary Update TGraph object */\n updateObject(obj, opt) {\n if (!this.matchObjectType(obj)) return false;\n\n if (opt && (opt != this.options.original))\n this.decodeOptions(opt);\n\n let graph = this.getObject();\n // TODO: make real update of TGraph object content\n graph.fBits = obj.fBits;\n graph.fTitle = obj.fTitle;\n graph.fX = obj.fX;\n graph.fY = obj.fY;\n graph.fNpoints = obj.fNpoints;\n graph.fMinimum = obj.fMinimum;\n graph.fMaximum = obj.fMaximum;\n this.createBins();\n\n delete this.$redraw_hist;\n\n // if our own histogram was used as axis drawing, we need update histogram as well\n if (this.axes_draw) {\n let histo = this.createHistogram();\n histo.fTitle = graph.fTitle; // copy title\n\n let hist_painter = this.getMainPainter();\n if (hist_painter?.$secondary) {\n hist_painter.updateObject(histo, this.options.Axis);\n this.$redraw_hist = true;\n }\n }\n\n return true;\n }\n\n /** @summary Checks if it makes sense to zoom inside specified axis range\n * @desc allow to zoom TGraph only when at least one point in the range */\n canZoomInside(axis,min,max) {\n let gr = this.getObject();\n if (!gr || (axis !== (this.options.pos3d ? 'y' : 'x'))) return false;\n\n for (let n = 0; n < gr.fNpoints; ++n)\n if ((min < gr.fX[n]) && (gr.fX[n] < max)) return true;\n\n return false;\n }\n\n /** @summary Process click on graph-defined buttons */\n clickButton(funcname) {\n if (funcname !== 'ToggleZoom') return false;\n\n let main = this.getFramePainter();\n if (!main) return false;\n\n if ((this.xmin === this.xmax) && (this.ymin === this.ymax)) return false;\n\n main.zoom(this.xmin, this.xmax, this.ymin, this.ymax);\n\n return true;\n }\n\n /** @summary Find TF1/TF2 in TGraph list of functions */\n findFunc() {\n let gr = this.getObject();\n if (gr?.fFunctions?.arr)\n return gr?.fFunctions?.arr.find(func => (func._typename == clTF1) || (func._typename == clTF2));\n return null;\n }\n\n /** @summary Find stat box in TGraph list of functions */\n findStat() {\n let gr = this.getObject();\n if (gr?.fFunctions?.arr)\n for (let i = 0; i < gr.fFunctions.arr.length; ++i) {\n let func = gr.fFunctions.arr[i];\n if ((func._typename == clTPaveStats) && (func.fName == 'stats')) return func;\n }\n return null;\n }\n\n /** @summary Create stat box */\n createStat() {\n let func = this.findFunc();\n if (!func) return null;\n\n let stats = this.findStat();\n if (stats) return stats;\n\n // do not create stats box when drawing canvas\n if (this.getCanvPainter()?.normal_canvas || this.options.PadStats) return null;\n\n this.create_stats = true;\n\n const st = gStyle;\n\n stats = create(clTPaveStats);\n Object.assign(stats, { fName : 'stats', fOptStat: 0, fOptFit: st.fOptFit || 111, fBorderSize: 1 });\n\n stats.fX1NDC = st.fStatX - st.fStatW;\n stats.fY1NDC = st.fStatY - st.fStatH;\n stats.fX2NDC = st.fStatX;\n stats.fY2NDC = st.fStatY;\n\n stats.fFillColor = st.fStatColor;\n stats.fFillStyle = st.fStatStyle;\n\n stats.fTextAngle = 0;\n stats.fTextSize = st.fStatFontSize; // 9 ??\n stats.fTextAlign = 12;\n stats.fTextColor = st.fStatTextColor;\n stats.fTextFont = st.fStatFont;\n\n stats.AddText(func.fName);\n\n // while TF1 was found, one can be sure that stats is existing\n this.getObject().fFunctions.Add(stats);\n\n return stats;\n }\n\n /** @summary Fill statistic */\n fillStatistic(stat, dostat, dofit) {\n\n // cannot fill stats without func\n let func = this.findFunc();\n\n if (!func || !dofit || !this.create_stats) return false;\n\n stat.clearPave();\n\n stat.fillFunctionStat(func, dofit);\n\n return true;\n }\n\n /** @summary method draws next function from the functions list\n * @return {Promise} */\n async drawNextFunction(indx) {\n\n let graph = this.getObject();\n\n if (indx >= (graph?.fFunctions?.arr?.length || 0))\n return this;\n\n let pp = this.getPadPainter(),\n func = graph.fFunctions.arr[indx],\n opt = graph.fFunctions.opt[indx];\n\n // required for stats filling\n // TODO: use weak reference (via pad list of painters and any kind of string)\n func.$main_painter = this;\n\n return pp.drawObject(this.getDom(), func, opt).then(() => this.drawNextFunction(indx+1));\n }\n\n /** @summary Draw axis histogram\n * @private */\n async drawAxisHisto() {\n let histo = this.createHistogram();\n return TH1Painter.draw(this.getDom(), histo, this.options.Axis)\n }\n\n /** @summary Draw TGraph\n * @private */\n static async _drawGraph(painter, opt) {\n painter.decodeOptions(opt, true);\n painter.createBins();\n painter.createStat();\n if (!settings.DragGraphs && !graph.TestBit(kNotEditable))\n graph.InvertBit(kNotEditable);\n\n let promise = Promise.resolve();\n\n if ((!painter.getMainPainter() || painter.options.second_x || painter.options.second_y) && painter.options.Axis)\n promise = painter.drawAxisHisto().then(hist_painter => {\n if (hist_painter) {\n painter.axes_draw = true;\n if (!painter._own_histogram) painter.$primary = true;\n hist_painter.$secondary = 'hist';\n }\n });\n\n return promise.then(() => {\n painter.addToPadPrimitives();\n return painter.drawGraph();\n }).then(() => painter.drawNextFunction(0));\n }\n\n static async draw(dom, graph, opt) {\n return TGraphPainter._drawGraph(new TGraphPainter(dom, graph), opt);\n }\n\n} // class TGraphPainter\n\nexport { clTGraphAsymmErrors, TGraphPainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file +{"version":3,"file":"241.4ed7b8d7fa416235.js","mappings":"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","names":["kNotEditable","BIT","clTGraphErrors","clTGraphAsymmErrors","clTGraphBentErrors","clTGraphMultiErrors","TGraphPainter","ObjectPainter","constructor","dom","graph","super","this","axes_draw","bins","xmin","ymin","xmax","ymax","wheel_zoomy","is_bent","_typename","has_errors","match","redraw","promise","Promise","resolve","_this","$redraw_hist","hist_painter","getMainPainter","$secondary","then","drawGraph","cleanup","interactive_bin","get_gme","getObject","decodeOptions","opt","first_time","isStr","indexOf","slice","is_gme","blocks_gme","has_main","options","decodeBlock","d","res","Object","assign","Line","Curve","Rect","Mark","Bar","OutRange","EF","Fill","MainError","Ends","ScaleErrX","check","partAsFloat","Errors","Axis","NoOpt","PadStats","original","second_x","second_y","individual_styles","split","shift","DrawOptions","hopt","forEach","name","part","empty","pos3d","partAsInt","_pfc","_plc","_pmc","blocks","skip_errors_x0","skip_errors_y0","undefined","length","fMarkerStyle","len","fEX","m","k","Math","max","fEY","pad","getPadPainter","getRootPad","fPrimitives","arr","bl","subres","push","extractGmeErrors","nblock","gr","bin","eylow","fEyL","indx","eyhigh","fEyH","createBins","kind","npoints","fNpoints","clTCutG","Array","p","x","fX","y","fY","exlow","exhigh","fExL","fExH","fEXlow","fEXhigh","fEYlow","fEYhigh","min","createHistogram","set_x","set_y","dx","dy","uxmin","uxmax","minimum","maximum","histo","fHistogram","minimum0","maximum0","fMaximum","kNoZoom","fMinimum","fName","kNoStats","fBits","_own_histogram","fTitle","fXaxis","fXmin","fXmax","fYaxis","unzoomUserRange","dox","doy","extractAxesProperties","canOptimize","settings","optimizeBins","maxpnt","filter_func","selbins","isFunc","n","step","floor","optbins","getTooltips","lines","funcs","get_main","getGrFuncs","gme","getObjectHint","axisAsText","x_handle","ny","fNYErrors","y_handle","pmain","getFramePainter","grx","gry","pp","rect","getPadRect","width","height","pad_layer","pw","ph","getFrameWidth","getFrameHeight","value","fLogx","log10","fUxmin","fX1","fX2","fLogy","fUymin","fY1","fY2","revertAxis","v","appendExclusion","is_curve","path","drawbins","excl_width","extrabins","dlen","sqrt","dgrx","dgry","path2","buildSvgPath","draw_g","append","attr","call","fillatt","func","style","drawBins","w","h","lineatt","main_block","excl_side","path1","bins2","draw_kind","close_symbol","elem","curvebins","nodes","pnt","i","grx1","round","gry1","grx0","grx2","gry0","gry2","grdx0","fEXlowd","grdx2","fEXhighd","grdy0","fEYlowd","grdy2","fEYhighd","selectAll","data","enter","yy0","usefill","fp","fpcol","getFillColor","TAttFillHandler","color","pattern","bar","dw","abs","filter","error_size","lw","gStyle","bb","vv","hh","vleft","vright","htop","hbottom","mainLine","fMarkerSize","visible","isBatchMode","error","createAttMarker","marker_size","markeratt","getFullSize","resetPos","want_tooltip","fill","hints_marker","hsz","maxnummarker","getMarkerLength","create","appendQQ","xqmin","scale_xmin","fXq1","xqmax","scale_xmax","fXq2","yqmin","scale_ymin","fYq1","yqmax","scale_ymax","fYq2","makeLine","x1","y1","x2","y2","yxmin","yxmax","latt1","TAttLineHandler","latt2","drawBins3D","console","log","createG","mp","createAutoColor","icolor","fFillColor","fLineColor","fMarkerColor","createAttLine","can_excl","createAttFill","used","fAttLine","std","fAttFill","svg","getCanvSvg","sub_g","addMoveHandler","testEditable","extractTooltip","extractTooltipForPath","esz","isbar1","findbin","best_dist2","best","msize","each","d3_select","datum","dist2","nproc","marker","matchy","exact","title","color1","d3bin","user_info","obj","cont","color2","menu","menu_dist","binindx","showTooltip","hint","select","remove","usepath","showTooltipForPath","ttrect","changed","property","processTooltipEvent","disabled","findBestBin","dist","islines","bestindx","bestbin","bestdist","radius","IsInside","bin0","posy","linex","liney","linedist","closeline","arg","TestBit","InvertBit","ismark","getColor","ttbin","moveEnabled","moveStart","pos_dx","pos_dy","move_funcs","move_binindx","move_bin","move_x0","move_y0","moveDrag","moveEnd","not_changed","exec","matchObjectType","submitCanvExec","fillContextMenu","snapid","addchk","size","executeMenuCommand","method","args","canp","getCanvPainter","_readonly","getLastEventPos","userx","usery","toFixed","args_menu_id","updateObject","canZoomInside","axis","clickButton","funcname","main","zoom","findFunc","fFunctions","find","clTF1","clTF2","findStat","clTPaveStats","createStat","stats","normal_canvas","create_stats","st","fOptStat","fOptFit","fBorderSize","fX1NDC","fStatX","fStatW","fY1NDC","fStatY","fStatH","fX2NDC","fY2NDC","fStatColor","fFillStyle","fStatStyle","fTextAngle","fTextSize","fStatFontSize","fTextAlign","fTextColor","fStatTextColor","fTextFont","fStatFont","AddText","Add","fillStatistic","stat","dostat","dofit","clearPave","fillFunctionStat","drawNextFunction","_this2","$main_painter","drawObject","getDom","drawAxisHisto","_this3","TH1Painter","static","painter","$primary","addToPadPrimitives","_drawGraph"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/hist2d/TGraphPainter.mjs"],"sourcesContent":["import { gStyle, BIT, settings, create, createHistogram, isBatchMode, isFunc, isStr,\n clTPaveStats, clTCutG, clTF1, clTF2, kNoZoom } from '../core.mjs';\nimport { select as d3_select } from '../d3.mjs';\nimport { DrawOptions, buildSvgPath } from '../base/BasePainter.mjs';\nimport { ObjectPainter } from '../base/ObjectPainter.mjs';\nimport { TH1Painter } from './TH1Painter.mjs';\nimport { TAttLineHandler } from '../base/TAttLineHandler.mjs';\nimport { TAttFillHandler } from '../base/TAttFillHandler.mjs';\nimport { addMoveHandler } from '../gui/utils.mjs';\n\n\nconst kNotEditable = BIT(18), // bit set if graph is non editable\n clTGraphErrors = 'TGraphErrors',\n clTGraphAsymmErrors = 'TGraphAsymmErrors',\n clTGraphBentErrors = 'TGraphBentErrors',\n clTGraphMultiErrors = 'TGraphMultiErrors';\n\n/**\n * @summary Painter for TGraph object.\n *\n * @private\n */\n\nclass TGraphPainter extends ObjectPainter {\n\n constructor(dom, graph) {\n super(dom, graph);\n this.axes_draw = false; // indicate if graph histogram was drawn for axes\n this.bins = null;\n this.xmin = this.ymin = this.xmax = this.ymax = 0;\n this.wheel_zoomy = true;\n this.is_bent = (graph._typename == clTGraphBentErrors);\n this.has_errors = (graph._typename == clTGraphErrors) ||\n (graph._typename == clTGraphMultiErrors) ||\n (graph._typename == clTGraphAsymmErrors) ||\n this.is_bent || graph._typename.match(/^RooHist/);\n }\n\n /** @summary Redraw graph\n * @desc may redraw histogram which was used to draw axes\n * @return {Promise} for ready */\n async redraw() {\n let promise = Promise.resolve(true);\n\n if (this.$redraw_hist) {\n delete this.$redraw_hist;\n let hist_painter = this.getMainPainter();\n if (hist_painter?.$secondary && this.axes_draw)\n promise = hist_painter.redraw();\n }\n\n return promise.then(() => this.drawGraph());\n }\n\n /** @summary Cleanup graph painter */\n cleanup() {\n delete this.interactive_bin; // break mouse handling\n delete this.bins;\n super.cleanup();\n }\n\n /** @summary Returns object if this drawing TGraphMultiErrors object */\n get_gme() {\n let graph = this.getObject();\n return graph?._typename == clTGraphMultiErrors ? graph : null;\n }\n\n /** @summary Decode options */\n decodeOptions(opt, first_time) {\n\n if (isStr(opt) && (opt.indexOf('same ') == 0))\n opt = opt.slice(5);\n\n let graph = this.getObject(),\n is_gme = !!this.get_gme(),\n blocks_gme = [],\n has_main = first_time ? !!this.getMainPainter() : !this.axes_draw;\n\n if (!this.options) this.options = {};\n\n // decode main draw options for the graph\n const decodeBlock = (d, res) => {\n Object.assign(res, { Line: 0, Curve: 0, Rect: 0, Mark: 0, Bar: 0, OutRange: 0, EF:0, Fill: 0, MainError: 1, Ends: 1, ScaleErrX: 1 });\n\n if (is_gme && d.check('S=', true)) res.ScaleErrX = d.partAsFloat();\n\n if (d.check('L')) res.Line = 1;\n if (d.check('F')) res.Fill = 1;\n if (d.check('CC')) res.Curve = 2; // draw all points without reduction\n if (d.check('C')) res.Curve = 1;\n if (d.check('*')) res.Mark = 103;\n if (d.check('P0')) res.Mark = 104;\n if (d.check('P')) res.Mark = 1;\n if (d.check('B')) { res.Bar = 1; res.Errors = 0; }\n if (d.check('Z')) { res.Errors = 1; res.Ends = 0; }\n if (d.check('||')) { res.Errors = 1; res.MainError = 0; res.Ends = 1; }\n if (d.check('[]')) { res.Errors = 1; res.MainError = 0; res.Ends = 2; }\n if (d.check('|>')) { res.Errors = 1; res.Ends = 3; }\n if (d.check('>')) { res.Errors = 1; res.Ends = 4; }\n if (d.check('0')) { res.Mark = 1; res.Errors = 1; res.OutRange = 1; }\n if (d.check('1')) { if (res.Bar == 1) res.Bar = 2; }\n if (d.check('2')) { res.Rect = 1; res.Errors = 0; }\n if (d.check('3')) { res.EF = 1; res.Errors = 0; }\n if (d.check('4')) { res.EF = 2; res.Errors = 0; }\n if (d.check('5')) { res.Rect = 2; res.Errors = 0; }\n if (d.check('X')) res.Errors = 0;\n };\n\n Object.assign(this.options, { Axis: '', NoOpt: 0, PadStats: false, original: opt, second_x: false, second_y: false, individual_styles: false });\n\n if (is_gme && opt) {\n if (opt.indexOf(';') > 0) {\n blocks_gme = opt.split(';');\n opt = blocks_gme.shift();\n } else if (opt.indexOf('_') > 0) {\n blocks_gme = opt.split('_');\n opt = blocks_gme.shift();\n }\n }\n\n let res = this.options,\n d = new DrawOptions(opt);\n\n // check pad options first\n res.PadStats = d.check('USE_PAD_STATS');\n let hopt = '', checkhopt = ['USE_PAD_TITLE', 'LOGXY', 'LOGX', 'LOGY', 'LOGZ', 'GRIDXY', 'GRIDX', 'GRIDY', 'TICKXY', 'TICKX', 'TICKY'];\n checkhopt.forEach(name => { if (d.check(name)) hopt += ';' + name; });\n if (d.check('XAXIS_', true)) hopt += ';XAXIS_' + d.part;\n if (d.check('YAXIS_', true)) hopt += ';YAXIS_' + d.part;\n\n if (d.empty()) {\n res.original = has_main ? 'lp' : 'alp';\n d = new DrawOptions(res.original);\n }\n\n if (d.check('NOOPT')) res.NoOpt = 1;\n\n if (d.check('POS3D_', true)) res.pos3d = d.partAsInt() - 0.5;\n\n res._pfc = d.check('PFC');\n res._plc = d.check('PLC');\n res._pmc = d.check('PMC');\n\n if (d.check('A')) res.Axis = d.check('I') ? 'A' : 'AXIS'; // I means invisible axis\n if (d.check('X+')) { res.Axis += 'X+'; res.second_x = has_main; }\n if (d.check('Y+')) { res.Axis += 'Y+'; res.second_y = has_main; }\n if (d.check('RX')) res.Axis += 'RX';\n if (d.check('RY')) res.Axis += 'RY';\n\n if (is_gme) {\n res.blocks = [];\n res.skip_errors_x0 = res.skip_errors_y0 = false;\n if (d.check('X0')) res.skip_errors_x0 = true;\n if (d.check('Y0')) res.skip_errors_y0 = true;\n }\n\n decodeBlock(d, res);\n\n if (is_gme) {\n if (d.check('S')) res.individual_styles = true;\n }\n\n // if (d.check('E')) res.Errors = 1; // E option only defined for TGraphPolar\n\n if (res.Errors === undefined)\n res.Errors = this.has_errors && (!is_gme || !blocks_gme.length) ? 1 : 0;\n\n // special case - one could use svg:path to draw many pixels (\n if ((res.Mark == 1) && (graph.fMarkerStyle == 1)) res.Mark = 101;\n\n // if no drawing option is selected and if opt == '' nothing is done.\n if (res.Line + res.Fill + res.Curve + res.Mark + res.Bar + res.EF + res.Rect + res.Errors == 0) {\n if (d.empty()) res.Line = 1;\n }\n\n if (graph._typename == clTGraphErrors) {\n let len = graph.fEX.length, m = 0;\n for (let k = 0; k < len; ++k)\n m = Math.max(m, graph.fEX[k], graph.fEY[k]);\n if (m < 1e-100)\n res.Errors = 0;\n }\n\n if (!res.Axis) {\n // check if axis should be drawn\n // either graph drawn directly or\n // graph is first object in list of primitives\n let pp = this.getPadPainter(),\n pad = pp?.getRootPad(true);\n if (!pad || (pad?.fPrimitives?.arr[0] === graph)) res.Axis = 'AXIS';\n } else if (res.Axis.indexOf('A') < 0) {\n res.Axis = 'AXIS,' + res.Axis;\n }\n\n res.Axis += hopt;\n\n for (let bl = 0; bl < blocks_gme.length; ++bl) {\n let subd = new DrawOptions(blocks_gme[bl]), subres = {};\n decodeBlock(subd, subres);\n subres.skip_errors_x0 = res.skip_errors_x0;\n subres.skip_errors_y0 = res.skip_errors_y0;\n res.blocks.push(subres);\n }\n }\n\n /** @summary Extract errors for TGraphMultiErrors */\n extractGmeErrors(nblock) {\n if (!this.bins) return;\n let gr = this.getObject();\n this.bins.forEach(bin => {\n bin.eylow = gr.fEyL[nblock][bin.indx];\n bin.eyhigh = gr.fEyH[nblock][bin.indx];\n });\n }\n\n /** @summary Create bins for TF1 drawing */\n createBins() {\n let gr = this.getObject();\n if (!gr) return;\n\n let kind = 0, npoints = gr.fNpoints;\n if ((gr._typename === clTCutG) && (npoints > 3)) npoints--;\n\n if (gr._typename == clTGraphErrors)\n kind = 1;\n else if (gr._typename == clTGraphMultiErrors)\n kind = 2;\n else if (gr._typename == clTGraphAsymmErrors || gr._typename == clTGraphBentErrors || gr._typename.match(/^RooHist/))\n kind = 3;\n\n this.bins = new Array(npoints);\n\n for (let p = 0; p < npoints; ++p) {\n let bin = this.bins[p] = { x: gr.fX[p], y: gr.fY[p], indx: p };\n switch(kind) {\n case 1:\n bin.exlow = bin.exhigh = gr.fEX[p];\n bin.eylow = bin.eyhigh = gr.fEY[p];\n break;\n case 2:\n bin.exlow = gr.fExL[p];\n bin.exhigh = gr.fExH[p];\n bin.eylow = gr.fEyL[0][p];\n bin.eyhigh = gr.fEyH[0][p];\n break;\n case 3:\n bin.exlow = gr.fEXlow[p];\n bin.exhigh = gr.fEXhigh[p];\n bin.eylow = gr.fEYlow[p];\n bin.eyhigh = gr.fEYhigh[p];\n break;\n }\n\n if (p === 0) {\n this.xmin = this.xmax = bin.x;\n this.ymin = this.ymax = bin.y;\n }\n\n if (kind > 0) {\n this.xmin = Math.min(this.xmin, bin.x - bin.exlow, bin.x + bin.exhigh);\n this.xmax = Math.max(this.xmax, bin.x - bin.exlow, bin.x + bin.exhigh);\n this.ymin = Math.min(this.ymin, bin.y - bin.eylow, bin.y + bin.eyhigh);\n this.ymax = Math.max(this.ymax, bin.y - bin.eylow, bin.y + bin.eyhigh);\n } else {\n this.xmin = Math.min(this.xmin, bin.x);\n this.xmax = Math.max(this.xmax, bin.x);\n this.ymin = Math.min(this.ymin, bin.y);\n this.ymax = Math.max(this.ymax, bin.y);\n }\n }\n }\n\n /** @summary Create histogram for graph\n * @desc graph bins should be created when calling this function\n * @param {boolean} [set_x] - set X axis range\n * @param {boolean} [set_y] - set Y axis range */\n createHistogram(set_x, set_y) {\n if (!set_x && !set_y)\n set_x = set_y = true;\n\n let xmin = this.xmin, xmax = this.xmax, ymin = this.ymin, ymax = this.ymax;\n\n if (xmin >= xmax) xmax = xmin+1;\n if (ymin >= ymax) ymax = ymin+1;\n let dx = (xmax-xmin)*0.1, dy = (ymax-ymin)*0.1,\n uxmin = xmin - dx, uxmax = xmax + dx,\n minimum = ymin - dy, maximum = ymax + dy;\n\n if ((uxmin < 0) && (xmin >= 0)) uxmin = xmin*0.9;\n if ((uxmax > 0) && (xmax <= 0)) uxmax = 0;\n\n let graph = this.getObject(),\n histo = graph.fHistogram,\n minimum0 = minimum, maximum0 = maximum;\n\n if (!histo) {\n histo = graph.fHistogram = createHistogram('TH1F', 100);\n histo.fName = graph.fName + '_h';\n const kNoStats = BIT(9);\n histo.fBits = histo.fBits | kNoStats;\n this._own_histogram = true;\n } else if ((histo.fMaximum != kNoZoom) && (histo.fMinimum != kNoZoom)) {\n minimum = histo.fMinimum;\n maximum = histo.fMaximum;\n }\n\n if (graph.fMinimum != kNoZoom) minimum = ymin = graph.fMinimum;\n if (graph.fMaximum != kNoZoom) maximum = graph.fMaximum;\n if ((minimum < 0) && (ymin >= 0)) minimum = 0.9*ymin;\n\n histo.fTitle = graph.fTitle;\n\n if (set_x) {\n histo.fXaxis.fXmin = uxmin;\n histo.fXaxis.fXmax = uxmax;\n }\n\n if (set_y) {\n histo.fYaxis.fXmin = Math.min(minimum0, minimum);\n histo.fYaxis.fXmax = Math.max(maximum0, maximum);\n histo.fMinimum = minimum;\n histo.fMaximum = maximum;\n }\n\n return histo;\n }\n\n /** @summary Check if user range can be unzommed\n * @desc Used when graph points covers larger range than provided histogram */\n unzoomUserRange(dox, doy /*, doz*/) {\n let graph = this.getObject();\n if (this._own_histogram || !graph) return false;\n\n let histo = graph.fHistogram;\n\n dox = dox && histo && ((histo.fXaxis.fXmin > this.xmin) || (histo.fXaxis.fXmax < this.xmax));\n doy = doy && histo && ((histo.fYaxis.fXmin > this.ymin) || (histo.fYaxis.fXmax < this.ymax));\n if (!dox && !doy) return false;\n\n this.createHistogram(dox, doy);\n this.getMainPainter()?.extractAxesProperties(1); // just to enforce ranges extraction\n\n return true;\n }\n\n /** @summary Returns true if graph drawing can be optimize */\n canOptimize() {\n return (settings.OptimizeDraw > 0) && !this.options.NoOpt;\n }\n\n /** @summary Returns optimized bins - if optimization enabled */\n optimizeBins(maxpnt, filter_func) {\n if ((this.bins.length < 30) && !filter_func) return this.bins;\n\n let selbins = null;\n if (isFunc(filter_func)) {\n for (let n = 0; n < this.bins.length; ++n) {\n if (filter_func(this.bins[n],n)) {\n if (!selbins) selbins = (n == 0) ? [] : this.bins.slice(0, n);\n } else {\n if (selbins) selbins.push(this.bins[n]);\n }\n }\n }\n if (!selbins) selbins = this.bins;\n\n if (!maxpnt) maxpnt = 500000;\n\n if ((selbins.length < maxpnt) || !this.canOptimize()) return selbins;\n let step = Math.floor(selbins.length / maxpnt);\n if (step < 2) step = 2;\n let optbins = [];\n for (let n = 0; n < selbins.length; n+=step)\n optbins.push(selbins[n]);\n\n return optbins;\n }\n\n /** @summary Returns tooltip for specified bin */\n getTooltips(d) {\n let pmain = this.get_main(), lines = [],\n funcs = pmain.getGrFuncs(this.options.second_x, this.options.second_y),\n gme = this.get_gme();\n\n lines.push(this.getObjectHint());\n\n if (d && funcs) {\n if (d.indx !== undefined)\n lines.push('p = ' + d.indx);\n lines.push('x = ' + funcs.axisAsText('x', d.x), 'y = ' + funcs.axisAsText('y', d.y));\n if (gme)\n lines.push('error x = -' + funcs.axisAsText('x', gme.fExL[d.indx]) + '/+' + funcs.axisAsText('x', gme.fExH[d.indx]));\n else if (this.options.Errors && (funcs.x_handle.kind == 'normal') && (d.exlow || d.exhigh))\n lines.push('error x = -' + funcs.axisAsText('x', d.exlow) + '/+' + funcs.axisAsText('x', d.exhigh));\n\n if (gme) {\n for (let ny = 0; ny < gme.fNYErrors; ++ny)\n lines.push(`error y${ny} = -${funcs.axisAsText('y', gme.fEyL[ny][d.indx])}/+${funcs.axisAsText('y', gme.fEyH[ny][d.indx])}`);\n } else if ((this.options.Errors || (this.options.EF > 0)) && (funcs.y_handle.kind == 'normal') && (d.eylow || d.eyhigh))\n lines.push('error y = -' + funcs.axisAsText('y', d.eylow) + '/+' + funcs.axisAsText('y', d.eyhigh));\n\n }\n return lines;\n }\n\n /** @summary Provide frame painter for graph\n * @desc If not exists, emulate its behaviour */\n get_main() {\n let pmain = this.getFramePainter();\n\n if (pmain && pmain.grx && pmain.gry) return pmain;\n\n // FIXME: check if needed, can be removed easily\n let pp = this.getPadPainter(),\n rect = pp?.getPadRect() || { width: 800, height: 600 };\n\n pmain = {\n pad_layer: true,\n pad: pp?.getRootPad(true),\n pw: rect.width,\n ph: rect.height,\n getFrameWidth() { return this.pw; },\n getFrameHeight() { return this.ph; },\n grx(value) {\n if (this.pad.fLogx)\n value = (value > 0) ? Math.log10(value) : this.pad.fUxmin;\n else\n value = (value - this.pad.fX1) / (this.pad.fX2 - this.pad.fX1);\n return value * this.pw;\n },\n gry(value) {\n if (this.pad.fLogy)\n value = (value > 0) ? Math.log10(value) : this.pad.fUymin;\n else\n value = (value - this.pad.fY1) / (this.pad.fY2 - this.pad.fY1);\n return (1 - value) * this.ph;\n },\n revertAxis(name, v) {\n if (name == 'x')\n return v / this.pw * (this.pad.fX2 - this.pad.fX1) + this.pad.fX1;\n if (name == 'y')\n return (1 - v / this.ph) * (this.pad.fY2 - this.pad.fY1) + this.pad.fY1;\n return v;\n },\n getGrFuncs() { return this; }\n }\n\n return pmain.pad ? pmain : null;\n }\n\n /** @summary append exclusion area to created path */\n appendExclusion(is_curve, path, drawbins, excl_width) {\n let extrabins = [];\n for (let n = drawbins.length-1; n >= 0; --n) {\n let bin = drawbins[n],\n dlen = Math.sqrt(bin.dgrx**2 + bin.dgry**2);\n // shift point\n bin.grx += excl_width*bin.dgry/dlen;\n bin.gry -= excl_width*bin.dgrx/dlen;\n extrabins.push(bin);\n }\n\n let path2 = buildSvgPath(is_curve ? 'Lbezier' : 'Lline', extrabins);\n\n this.draw_g.append('svg:path')\n .attr('d', path.path + path2.path + 'Z')\n .call(this.fillatt.func)\n .style('opacity', 0.75);\n }\n\n /** @summary draw TGraph bins with specified options\n * @desc Can be called several times */\n drawBins(funcs, options, draw_g, w, h, lineatt, fillatt, main_block) {\n let graph = this.getObject(),\n excl_width = 0, drawbins = null;\n\n if (main_block && lineatt.excl_side) {\n excl_width = lineatt.excl_width;\n if ((lineatt.width > 0) && !options.Line && !options.Curve) options.Line = 1;\n }\n\n if (options.EF) {\n drawbins = this.optimizeBins((options.EF > 1) ? 20000 : 0);\n\n // build lower part\n for (let n = 0; n < drawbins.length; ++n) {\n let bin = drawbins[n];\n bin.grx = funcs.grx(bin.x);\n bin.gry = funcs.gry(bin.y - bin.eylow);\n }\n\n let path1 = buildSvgPath((options.EF > 1) ? 'bezier' : 'line', drawbins),\n bins2 = [];\n\n for (let n = drawbins.length-1; n >= 0; --n) {\n let bin = drawbins[n];\n bin.gry = funcs.gry(bin.y + bin.eyhigh);\n bins2.push(bin);\n }\n\n // build upper part (in reverse direction)\n let path2 = buildSvgPath((options.EF > 1) ? 'Lbezier' : 'Lline', bins2);\n\n draw_g.append('svg:path')\n .attr('d', path1.path + path2.path + 'Z')\n .call(fillatt.func);\n if (main_block)\n this.draw_kind = 'lines';\n }\n\n if (options.Line || options.Fill) {\n\n let close_symbol = '';\n if (graph._typename == clTCutG) options.Fill = 1;\n\n if (options.Fill) {\n close_symbol = 'Z'; // always close area if we want to fill it\n excl_width = 0;\n }\n\n if (!drawbins) drawbins = this.optimizeBins(0);\n\n for (let n = 0; n < drawbins.length; ++n) {\n let bin = drawbins[n];\n bin.grx = funcs.grx(bin.x);\n bin.gry = funcs.gry(bin.y);\n }\n\n let kind = 'line'; // simple line\n if (excl_width) kind += 'calc'; // we need to calculated deltas to build exclusion points\n\n let path = buildSvgPath(kind, drawbins);\n\n if (excl_width)\n this.appendExclusion(false, path, drawbins, excl_width);\n\n let elem = draw_g.append('svg:path').attr('d', path.path + close_symbol);\n if (options.Line)\n elem.call(lineatt.func);\n\n if (options.Fill)\n elem.call(fillatt.func);\n else\n elem.style('fill', 'none');\n\n if (main_block)\n this.draw_kind = 'lines';\n }\n\n if (options.Curve) {\n let curvebins = drawbins;\n if ((this.draw_kind != 'lines') || !curvebins || ((options.Curve == 1) && (curvebins.length > 20000))) {\n curvebins = this.optimizeBins((options.Curve == 1) ? 20000 : 0);\n for (let n = 0; n < curvebins.length; ++n) {\n let bin = curvebins[n];\n bin.grx = funcs.grx(bin.x);\n bin.gry = funcs.gry(bin.y);\n }\n }\n\n let kind = 'bezier';\n if (excl_width) kind += 'calc'; // we need to calculated deltas to build exclusion points\n\n let path = buildSvgPath(kind, curvebins);\n\n if (excl_width)\n this.appendExclusion(true, path, curvebins, excl_width);\n\n draw_g.append('svg:path')\n .attr('d', path.path)\n .call(lineatt.func)\n .style('fill', 'none');\n if (main_block)\n this.draw_kind = 'lines'; // handled same way as lines\n }\n\n let nodes = null;\n\n if (options.Errors || options.Rect || options.Bar) {\n\n drawbins = this.optimizeBins(5000, (pnt,i) => {\n\n let grx = funcs.grx(pnt.x);\n\n // when drawing bars, take all points\n if (!options.Bar && ((grx < 0) || (grx > w))) return true;\n\n let gry = funcs.gry(pnt.y);\n\n if (!options.Bar && !options.OutRange && ((gry < 0) || (gry > h))) return true;\n\n pnt.grx1 = Math.round(grx);\n pnt.gry1 = Math.round(gry);\n\n if (this.has_errors) {\n pnt.grx0 = Math.round(funcs.grx(pnt.x - options.ScaleErrX*pnt.exlow) - grx);\n pnt.grx2 = Math.round(funcs.grx(pnt.x + options.ScaleErrX*pnt.exhigh) - grx);\n pnt.gry0 = Math.round(funcs.gry(pnt.y - pnt.eylow) - gry);\n pnt.gry2 = Math.round(funcs.gry(pnt.y + pnt.eyhigh) - gry);\n\n if (this.is_bent) {\n pnt.grdx0 = Math.round(funcs.gry(pnt.y + graph.fEXlowd[i]) - gry);\n pnt.grdx2 = Math.round(funcs.gry(pnt.y + graph.fEXhighd[i]) - gry);\n pnt.grdy0 = Math.round(funcs.grx(pnt.x + graph.fEYlowd[i]) - grx);\n pnt.grdy2 = Math.round(funcs.grx(pnt.x + graph.fEYhighd[i]) - grx);\n } else {\n pnt.grdx0 = pnt.grdx2 = pnt.grdy0 = pnt.grdy2 = 0;\n }\n }\n\n return false;\n });\n\n if (main_block)\n this.draw_kind = 'nodes';\n\n nodes = draw_g.selectAll('.grpoint')\n .data(drawbins)\n .enter()\n .append('svg:g')\n .attr('class', 'grpoint')\n .attr('transform', d => `translate(${d.grx1},${d.gry1})`);\n }\n\n if (options.Bar) {\n // calculate bar width\n for (let i = 1; i < drawbins.length-1; ++i)\n drawbins[i].width = Math.max(2, (drawbins[i+1].grx1 - drawbins[i-1].grx1) / 2 - 2);\n\n // first and last bins\n switch (drawbins.length) {\n case 0: break;\n case 1: drawbins[0].width = w/4; break; // pathologic case of single bin\n case 2: drawbins[0].width = drawbins[1].width = (drawbins[1].grx1-drawbins[0].grx1)/2; break;\n default:\n drawbins[0].width = drawbins[1].width;\n drawbins[drawbins.length-1].width = drawbins[drawbins.length-2].width;\n }\n\n let yy0 = Math.round(funcs.gry(0)), usefill = fillatt;\n\n if (main_block) {\n let fp = this.getFramePainter(),\n fpcol = fp?.fillatt && !fp?.fillatt.empty() ? fp.fillatt.getFillColor() : -1;\n if (fpcol === fillatt.getFillColor())\n usefill = new TAttFillHandler({ color: fpcol == 'white' ? 1 : 0, pattern: 1001 });\n }\n\n nodes.append('svg:path')\n .attr('d', d => {\n d.bar = true; // element drawn as bar\n let dx = Math.round(-d.width/2),\n dw = Math.round(d.width),\n dy = (options.Bar !== 1) ? 0 : ((d.gry1 > yy0) ? yy0-d.gry1 : 0),\n dh = (options.Bar !== 1) ? (h > d.gry1 ? h - d.gry1 : 0) : Math.abs(yy0 - d.gry1);\n return `M${dx},${dy}h${dw}v${dh}h${-dw}z`;\n })\n .call(usefill.func);\n }\n\n if (options.Rect) {\n nodes.filter(d => (d.exlow > 0) && (d.exhigh > 0) && (d.eylow > 0) && (d.eyhigh > 0))\n .append('svg:path')\n .attr('d', d => {\n d.rect = true;\n return `M${d.grx0},${d.gry0}H${d.grx2}V${d.gry2}H${d.grx0}Z`;\n })\n .call(fillatt.func)\n .call(options.Rect === 2 ? lineatt.func : () => {});\n }\n\n this.error_size = 0;\n\n if (options.Errors) {\n // to show end of error markers, use line width attribute\n let lw = lineatt.width + gStyle.fEndErrorSize, bb = 0,\n vv = options.Ends ? `m0,${lw}v${-2*lw}` : '',\n hh = options.Ends ? `m${lw},0h${-2*lw}` : '',\n vleft = vv, vright = vv, htop = hh, hbottom = hh;\n\n const mainLine = (dx,dy) => {\n if (!options.MainError) return `M${dx},${dy}`;\n let res = 'M0,0';\n if (dx) return res + (dy ? `L${dx},${dy}` : `H${dx}`);\n return dy ? res + `V${dy}` : res;\n };\n\n switch (options.Ends) {\n case 2: // option []\n bb = Math.max(lineatt.width+1, Math.round(lw*0.66));\n vleft = `m${bb},${lw}h${-bb}v${-2*lw}h${bb}`;\n vright = `m${-bb},${lw}h${bb}v${-2*lw}h${-bb}`;\n htop = `m${-lw},${bb}v${-bb}h${2*lw}v${bb}`;\n hbottom = `m${-lw},${-bb}v${bb}h${2*lw}v${-bb}`;\n break;\n case 3: // option |>\n lw = Math.max(lw, Math.round(graph.fMarkerSize*8*0.66));\n bb = Math.max(lineatt.width+1, Math.round(lw*0.66));\n vleft = `l${bb},${lw}v${-2*lw}l${-bb},${lw}`;\n vright = `l${-bb},${lw}v${-2*lw}l${bb},${lw}`;\n htop = `l${-lw},${bb}h${2*lw}l${-lw},${-bb}`;\n hbottom = `l${-lw},${-bb}h${2*lw}l${-lw},${bb}`;\n break;\n case 4: // option >\n lw = Math.max(lw, Math.round(graph.fMarkerSize*8*0.66));\n bb = Math.max(lineatt.width+1, Math.round(lw*0.66));\n vleft = `l${bb},${lw}m0,${-2*lw}l${-bb},${lw}`;\n vright = `l${-bb},${lw}m0,${-2*lw}l${bb},${lw}`;\n htop = `l${-lw},${bb}m${2*lw},0l${-lw},${-bb}`;\n hbottom = `l${-lw},${-bb}m${2*lw},0l${-lw},${bb}`;\n break;\n }\n\n this.error_size = lw;\n\n lw = Math.floor((lineatt.width-1)/2); // one should take into account half of end-cup line width\n\n let visible = nodes.filter(d => (d.exlow > 0) || (d.exhigh > 0) || (d.eylow > 0) || (d.eyhigh > 0));\n if (options.skip_errors_x0 || options.skip_errors_y0)\n visible = visible.filter(d => ((d.x != 0) || !options.skip_errors_x0) && ((d.y != 0) || !options.skip_errors_y0));\n\n if (!isBatchMode() && settings.Tooltip && main_block)\n visible.append('svg:path')\n .style('fill', 'none')\n .style('pointer-events', 'visibleFill')\n .attr('d', d => `M${d.grx0},${d.gry0}h${d.grx2-d.grx0}v${d.gry2-d.gry0}h${d.grx0-d.grx2}z`);\n\n visible.append('svg:path')\n .call(lineatt.func)\n .style('fill', 'none')\n .attr('d', d => {\n d.error = true;\n return ((d.exlow > 0) ? mainLine(d.grx0+lw, d.grdx0) + vleft : '') +\n ((d.exhigh > 0) ? mainLine(d.grx2-lw, d.grdx2) + vright : '') +\n ((d.eylow > 0) ? mainLine(d.grdy0, d.gry0-lw) + hbottom : '') +\n ((d.eyhigh > 0) ? mainLine(d.grdy2, d.gry2+lw) + htop : '');\n });\n }\n\n if (options.Mark) {\n // for tooltips use markers only if nodes were not created\n this.createAttMarker({ attr: graph, style: options.Mark - 100 });\n\n this.marker_size = this.markeratt.getFullSize();\n\n this.markeratt.resetPos();\n\n let path = '', pnt, grx, gry,\n want_tooltip = !isBatchMode() && settings.Tooltip && (!this.markeratt.fill || (this.marker_size < 7)) && !nodes && main_block,\n hints_marker = '', hsz = Math.max(5, Math.round(this.marker_size*0.7)),\n maxnummarker = 1000000 / (this.markeratt.getMarkerLength() + 7), step = 1; // let produce SVG at maximum 1MB\n\n if (!drawbins)\n drawbins = this.optimizeBins(maxnummarker);\n else if (this.canOptimize() && (drawbins.length > 1.5*maxnummarker))\n step = Math.min(2, Math.round(drawbins.length/maxnummarker));\n\n for (let n = 0; n < drawbins.length; n += step) {\n pnt = drawbins[n];\n grx = funcs.grx(pnt.x);\n if ((grx > -this.marker_size) && (grx < w + this.marker_size)) {\n gry = funcs.gry(pnt.y);\n if ((gry > -this.marker_size) && (gry < h + this.marker_size)) {\n path += this.markeratt.create(grx, gry);\n if (want_tooltip) hints_marker += `M${grx-hsz},${gry-hsz}h${2*hsz}v${2*hsz}h${-2*hsz}z`;\n }\n }\n }\n\n if (path) {\n draw_g.append('svg:path')\n .attr('d', path)\n .call(this.markeratt.func);\n if ((nodes === null) && (this.draw_kind == 'none') && main_block)\n this.draw_kind = (options.Mark == 101) ? 'path' : 'mark';\n }\n if (want_tooltip && hints_marker)\n draw_g.append('svg:path')\n .attr('d', hints_marker)\n .style('fill', 'none')\n .style('pointer-events', 'visibleFill');\n }\n }\n\n /** @summary append TGraphQQ part */\n appendQQ(funcs, graph) {\n let xqmin = Math.max(funcs.scale_xmin, graph.fXq1),\n xqmax = Math.min(funcs.scale_xmax, graph.fXq2),\n yqmin = Math.max(funcs.scale_ymin, graph.fYq1),\n yqmax = Math.min(funcs.scale_ymax, graph.fYq2),\n path2 = '',\n makeLine = (x1,y1,x2,y2) => `M${funcs.grx(x1)},${funcs.gry(y1)}L${funcs.grx(x2)},${funcs.gry(y2)}`,\n yxmin = (graph.fYq2 - graph.fYq1)*(funcs.scale_xmin-graph.fXq1)/(graph.fXq2-graph.fXq1) + graph.fYq1,\n yxmax = (graph.fYq2-graph.fYq1)*(funcs.scale_xmax-graph.fXq1)/(graph.fXq2-graph.fXq1) + graph.fYq1;\n\n if (yxmin < funcs.scale_ymin) {\n let xymin = (graph.fXq2 - graph.fXq1)*(funcs.scale_ymin-graph.fYq1)/(graph.fYq2-graph.fYq1) + graph.fXq1;\n path2 = makeLine(xymin, funcs.scale_ymin, xqmin, yqmin);\n } else {\n path2 = makeLine(funcs.scale_xmin, yxmin, xqmin, yqmin);\n }\n\n if (yxmax > funcs.scale_ymax) {\n let xymax = (graph.fXq2-graph.fXq1)*(funcs.scale_ymax-graph.fYq1)/(graph.fYq2-graph.fYq1) + graph.fXq1;\n path2 += makeLine(xqmax, yqmax, xymax, funcs.scale_ymax);\n } else {\n path2 += makeLine(xqmax, yqmax, funcs.scale_xmax, yxmax);\n }\n\n let latt1 = new TAttLineHandler({ style: 1, width: 1, color: 'black' }),\n latt2 = new TAttLineHandler({ style: 2, width: 1, color: 'black' });\n\n this.draw_g.append('path')\n .attr('d', makeLine(xqmin,yqmin,xqmax,yqmax))\n .call(latt1.func)\n .style('fill', 'none');\n\n this.draw_g.append('path')\n .attr('d', path2)\n .call(latt2.func)\n .style('fill', 'none');\n }\n\n drawBins3D(/*fp, graph*/) {\n console.log('Load ./hist/TGraphPainter.mjs to draw graph in 3D');\n }\n\n /** @summary draw TGraph */\n drawGraph() {\n\n let pmain = this.get_main(),\n graph = this.getObject();\n if (!pmain) return;\n\n // special mode for TMultiGraph 3d drawing\n if (this.options.pos3d)\n return this.drawBins3D(pmain, graph);\n\n let is_gme = !!this.get_gme(),\n funcs = pmain.getGrFuncs(this.options.second_x, this.options.second_y),\n w = pmain.getFrameWidth(),\n h = pmain.getFrameHeight();\n\n this.createG(!pmain.pad_layer);\n\n if (this.options._pfc || this.options._plc || this.options._pmc) {\n let mp = this.getMainPainter();\n if (isFunc(mp?.createAutoColor)) {\n let icolor = mp.createAutoColor();\n if (this.options._pfc) { graph.fFillColor = icolor; delete this.fillatt; }\n if (this.options._plc) { graph.fLineColor = icolor; delete this.lineatt; }\n if (this.options._pmc) { graph.fMarkerColor = icolor; delete this.markeratt; }\n this.options._pfc = this.options._plc = this.options._pmc = false;\n }\n }\n\n this.createAttLine({ attr: graph, can_excl: true });\n this.createAttFill({ attr: graph });\n\n this.fillatt.used = false; // mark used only when really used\n\n this.draw_kind = 'none'; // indicate if special svg:g were created for each bin\n this.marker_size = 0; // indicate if markers are drawn\n let draw_g = is_gme ? this.draw_g.append('svg:g') : this.draw_g;\n\n this.drawBins(funcs, this.options, draw_g, w, h, this.lineatt, this.fillatt, true);\n\n if (graph._typename == 'TGraphQQ')\n this.appendQQ(funcs, graph);\n\n if (is_gme) {\n for (let k = 0; k < graph.fNYErrors; ++k) {\n let lineatt = this.lineatt, fillatt = this.fillatt;\n if (this.options.individual_styles) {\n lineatt = new TAttLineHandler({ attr: graph.fAttLine[k], std: false });\n fillatt = new TAttFillHandler({ attr: graph.fAttFill[k], std: false, svg: this.getCanvSvg() });\n }\n let sub_g = this.draw_g.append('svg:g'),\n options = k < this.options.blocks.length ? this.options.blocks[k] : this.options;\n this.extractGmeErrors(k);\n this.drawBins(funcs, options, sub_g, w, h, lineatt, fillatt);\n }\n this.extractGmeErrors(0); // ensure that first block kept at the end\n }\n\n if (!isBatchMode())\n addMoveHandler(this, this.testEditable());\n }\n\n /** @summary Provide tooltip at specified point */\n extractTooltip(pnt) {\n if (!pnt) return null;\n\n if ((this.draw_kind == 'lines') || (this.draw_kind == 'path') || (this.draw_kind == 'mark'))\n return this.extractTooltipForPath(pnt);\n\n if (this.draw_kind != 'nodes') return null;\n\n let pmain = this.get_main(),\n height = pmain.getFrameHeight(),\n esz = this.error_size,\n isbar1 = (this.options.Bar === 1),\n funcs = isbar1 ? pmain.getGrFuncs(this.options.second_x, this.options.second_y) : null,\n findbin = null, best_dist2 = 1e10, best = null,\n msize = this.marker_size ? Math.round(this.marker_size/2 + 1.5) : 0;\n\n this.draw_g.selectAll('.grpoint').each(function() {\n let d = d3_select(this).datum();\n if (d === undefined) return;\n let dist2 = (pnt.x - d.grx1) ** 2;\n if (pnt.nproc === 1) dist2 += (pnt.y - d.gry1) ** 2;\n if (dist2 >= best_dist2) return;\n\n let rect;\n\n if (d.error || d.rect || d.marker) {\n rect = { x1: Math.min(-esz, d.grx0, -msize),\n x2: Math.max(esz, d.grx2, msize),\n y1: Math.min(-esz, d.gry2, -msize),\n y2: Math.max(esz, d.gry0, msize) };\n } else if (d.bar) {\n rect = { x1: -d.width/2, x2: d.width/2, y1: 0, y2: height - d.gry1 };\n\n if (isbar1) {\n let yy0 = funcs.gry(0);\n rect.y1 = (d.gry1 > yy0) ? yy0-d.gry1 : 0;\n rect.y2 = (d.gry1 > yy0) ? 0 : yy0-d.gry1;\n }\n } else {\n rect = { x1: -5, x2: 5, y1: -5, y2: 5 };\n }\n let matchx = (pnt.x >= d.grx1 + rect.x1) && (pnt.x <= d.grx1 + rect.x2),\n matchy = (pnt.y >= d.gry1 + rect.y1) && (pnt.y <= d.gry1 + rect.y2);\n\n if (matchx && (matchy || (pnt.nproc > 1))) {\n best_dist2 = dist2;\n findbin = this;\n best = rect;\n best.exact = /* matchx && */ matchy;\n }\n });\n\n if (findbin === null) return null;\n\n let d = d3_select(findbin).datum(),\n gr = this.getObject(),\n res = { name: gr.fName, title: gr.fTitle,\n x: d.grx1, y: d.gry1,\n color1: this.lineatt.color,\n lines: this.getTooltips(d),\n rect: best, d3bin: findbin };\n\n res.user_info = { obj: gr, name: gr.fName, bin: d.indx, cont: d.y, grx: d.grx1, gry: d.gry1 };\n\n if (this.fillatt && this.fillatt.used && !this.fillatt.empty())\n res.color2 = this.fillatt.getFillColor();\n\n if (best.exact) res.exact = true;\n res.menu = res.exact; // activate menu only when exactly locate bin\n res.menu_dist = 3; // distance always fixed\n res.bin = d;\n res.binindx = d.indx;\n\n return res;\n }\n\n /** @summary Show tooltip */\n showTooltip(hint) {\n\n if (!hint) {\n if (this.draw_g) this.draw_g.select('.tooltip_bin').remove();\n return;\n }\n\n if (hint.usepath) return this.showTooltipForPath(hint);\n\n let d = d3_select(hint.d3bin).datum(),\n ttrect = this.draw_g.select('.tooltip_bin');\n\n if (ttrect.empty())\n ttrect = this.draw_g.append('svg:rect')\n .attr('class', 'tooltip_bin h1bin')\n .style('pointer-events', 'none');\n\n hint.changed = ttrect.property('current_bin') !== hint.d3bin;\n\n if (hint.changed)\n ttrect.attr('x', d.grx1 + hint.rect.x1)\n .attr('width', hint.rect.x2 - hint.rect.x1)\n .attr('y', d.gry1 + hint.rect.y1)\n .attr('height', hint.rect.y2 - hint.rect.y1)\n .style('opacity', '0.3')\n .property('current_bin', hint.d3bin);\n }\n\n /** @summary Process tooltip event */\n processTooltipEvent(pnt) {\n let hint = this.extractTooltip(pnt);\n if (!pnt || !pnt.disabled) this.showTooltip(hint);\n return hint;\n }\n\n /** @summary Find best bin index for specified point */\n findBestBin(pnt) {\n if (!this.bins) return null;\n\n let islines = (this.draw_kind == 'lines'),\n bestindx = -1,\n bestbin = null,\n bestdist = 1e10,\n funcs = this.get_main().getGrFuncs(this.options.second_x, this.options.second_y),\n dist, grx, gry, n, bin;\n\n for (n = 0; n < this.bins.length; ++n) {\n bin = this.bins[n];\n\n grx = funcs.grx(bin.x);\n gry = funcs.gry(bin.y);\n\n dist = (pnt.x-grx)**2 + (pnt.y-gry)**2;\n\n if (dist < bestdist) {\n bestdist = dist;\n bestbin = bin;\n bestindx = n;\n }\n }\n\n // check last point\n if ((bestdist > 100) && islines) bestbin = null;\n\n let radius = Math.max(this.lineatt.width + 3, 4);\n\n if (this.marker_size > 0) radius = Math.max(this.marker_size, radius);\n\n if (bestbin)\n bestdist = Math.sqrt((pnt.x-funcs.grx(bestbin.x))**2 + (pnt.y-funcs.gry(bestbin.y))**2);\n\n if (!islines && (bestdist > radius)) bestbin = null;\n\n if (!bestbin) bestindx = -1;\n\n let res = { bin: bestbin, indx: bestindx, dist: bestdist, radius: Math.round(radius) };\n\n if (!bestbin && islines) {\n\n bestdist = 1e10;\n\n const IsInside = (x, x1, x2) => ((x1 >= x) && (x >= x2)) || ((x1 <= x) && (x <= x2));\n\n let bin0 = this.bins[0], grx0 = funcs.grx(bin0.x), gry0, posy = 0;\n for (n = 1; n < this.bins.length; ++n) {\n bin = this.bins[n];\n grx = funcs.grx(bin.x);\n\n if (IsInside(pnt.x, grx0, grx)) {\n // if inside interval, check Y distance\n gry0 = funcs.gry(bin0.y);\n gry = funcs.gry(bin.y);\n\n if (Math.abs(grx - grx0) < 1) {\n // very close x - check only y\n posy = pnt.y;\n dist = IsInside(pnt.y, gry0, gry) ? 0 : Math.min(Math.abs(pnt.y-gry0), Math.abs(pnt.y-gry));\n } else {\n posy = gry0 + (pnt.x - grx0) / (grx - grx0) * (gry - gry0);\n dist = Math.abs(posy - pnt.y);\n }\n\n if (dist < bestdist) {\n bestdist = dist;\n res.linex = pnt.x;\n res.liney = posy;\n }\n }\n\n bin0 = bin;\n grx0 = grx;\n }\n\n if (bestdist < radius*0.5) {\n res.linedist = bestdist;\n res.closeline = true;\n }\n }\n\n return res;\n }\n\n /** @summary Check editable flag for TGraph\n * @desc if arg specified changes or toggles editable flag */\n testEditable(arg) {\n let obj = this.getObject();\n if (!obj) return false;\n if ((arg == 'toggle') || ((arg !== undefined) && (!arg != obj.TestBit(kNotEditable))))\n obj.InvertBit(kNotEditable);\n return !obj.TestBit(kNotEditable);\n }\n\n /** @summary Provide tooltip at specified point for path-based drawing */\n extractTooltipForPath(pnt) {\n\n if (this.bins === null) return null;\n\n let best = this.findBestBin(pnt);\n\n if (!best || (!best.bin && !best.closeline)) return null;\n\n let islines = (this.draw_kind == 'lines'),\n ismark = (this.draw_kind == 'mark'),\n pmain = this.get_main(),\n funcs = pmain.getGrFuncs(this.options.second_x, this.options.second_y),\n gr = this.getObject(),\n res = { name: gr.fName, title: gr.fTitle,\n x: best.bin ? funcs.grx(best.bin.x) : best.linex,\n y: best.bin ? funcs.gry(best.bin.y) : best.liney,\n color1: this.lineatt.color,\n lines: this.getTooltips(best.bin),\n usepath: true };\n\n res.user_info = { obj: gr, name: gr.fName, bin: 0, cont: 0, grx: res.x, gry: res.y };\n\n res.ismark = ismark;\n res.islines = islines;\n\n if (best.closeline) {\n res.menu = res.exact = true;\n res.menu_dist = best.linedist;\n } else if (best.bin) {\n if (this.options.EF && islines) {\n res.gry1 = funcs.gry(best.bin.y - best.bin.eylow);\n res.gry2 = funcs.gry(best.bin.y + best.bin.eyhigh);\n } else {\n res.gry1 = res.gry2 = funcs.gry(best.bin.y);\n }\n\n res.binindx = best.indx;\n res.bin = best.bin;\n res.radius = best.radius;\n res.user_info.bin = best.indx;\n res.user_info.cont = best.bin.y;\n\n res.exact = (Math.abs(pnt.x - res.x) <= best.radius) &&\n ((Math.abs(pnt.y - res.gry1) <= best.radius) || (Math.abs(pnt.y - res.gry2) <= best.radius));\n\n res.menu = res.exact;\n res.menu_dist = Math.sqrt((pnt.x-res.x)**2 + Math.min(Math.abs(pnt.y-res.gry1), Math.abs(pnt.y-res.gry2))**2);\n }\n\n if (this.fillatt && this.fillatt.used && !this.fillatt.empty())\n res.color2 = this.fillatt.getFillColor();\n\n if (!islines) {\n res.color1 = this.getColor(gr.fMarkerColor);\n if (!res.color2) res.color2 = res.color1;\n }\n\n return res;\n }\n\n /** @summary Show tooltip for path drawing */\n showTooltipForPath(hint) {\n\n let ttbin = this.draw_g.select('.tooltip_bin');\n\n if (!hint || !hint.bin) {\n ttbin.remove();\n return;\n }\n\n if (ttbin.empty())\n ttbin = this.draw_g.append('svg:g').attr('class', 'tooltip_bin');\n\n hint.changed = ttbin.property('current_bin') !== hint.bin;\n\n if (hint.changed) {\n ttbin.selectAll('*').remove(); // first delete all children\n ttbin.property('current_bin', hint.bin);\n\n if (hint.ismark) {\n ttbin.append('svg:rect')\n .attr('class','h1bin')\n .style('pointer-events','none')\n .style('opacity', '0.3')\n .attr('x', Math.round(hint.x - hint.radius))\n .attr('y', Math.round(hint.y - hint.radius))\n .attr('width', 2*hint.radius)\n .attr('height', 2*hint.radius);\n } else {\n ttbin.append('svg:circle').attr('cy', Math.round(hint.gry1));\n if (Math.abs(hint.gry1-hint.gry2) > 1)\n ttbin.append('svg:circle').attr('cy', Math.round(hint.gry2));\n\n let elem = ttbin.selectAll('circle')\n .attr('r', hint.radius)\n .attr('cx', Math.round(hint.x));\n\n if (!hint.islines) {\n elem.style('stroke', hint.color1 == 'black' ? 'green' : 'black').style('fill','none');\n } else {\n if (this.options.Line || this.options.Curve)\n elem.call(this.lineatt.func);\n else\n elem.style('stroke','black');\n if (this.options.Fill)\n elem.call(this.fillatt.func);\n else\n elem.style('fill','none');\n }\n }\n }\n }\n\n /** @summary Check if graph moving is enabled */\n moveEnabled() {\n return this.testEditable();\n }\n\n /** @summary Start moving of TGraph */\n moveStart(x,y) {\n this.pos_dx = this.pos_dy = 0;\n this.move_funcs = this.get_main().getGrFuncs(this.options.second_x, this.options.second_y);\n let hint = this.extractTooltip({x, y});\n if (hint && hint.exact && (hint.binindx !== undefined)) {\n this.move_binindx = hint.binindx;\n this.move_bin = hint.bin;\n this.move_x0 = this.move_funcs.grx(this.move_bin.x);\n this.move_y0 = this.move_funcs.gry(this.move_bin.y);\n } else {\n delete this.move_binindx;\n }\n }\n\n /** @summary Perform moving */\n moveDrag(dx,dy) {\n this.pos_dx += dx;\n this.pos_dy += dy;\n\n if (this.move_binindx === undefined) {\n this.draw_g.attr('transform', `translate(${this.pos_dx},${this.pos_dy})`);\n } else if (this.move_funcs && this.move_bin) {\n this.move_bin.x = this.move_funcs.revertAxis('x', this.move_x0 + this.pos_dx);\n this.move_bin.y = this.move_funcs.revertAxis('y', this.move_y0 + this.pos_dy);\n this.drawGraph();\n }\n }\n\n /** @summary Complete moving */\n moveEnd(not_changed) {\n let exec = '';\n\n if (this.move_binindx === undefined) {\n this.draw_g.attr('transform', null);\n\n if (this.move_funcs && this.bins && !not_changed) {\n for (let k = 0; k < this.bins.length; ++k) {\n let bin = this.bins[k];\n bin.x = this.move_funcs.revertAxis('x', this.move_funcs.grx(bin.x) + this.pos_dx);\n bin.y = this.move_funcs.revertAxis('y', this.move_funcs.gry(bin.y) + this.pos_dy);\n exec += `SetPoint(${bin.indx},${bin.x},${bin.y});;`;\n if ((bin.indx == 0) && this.matchObjectType(clTCutG))\n exec += `SetPoint(${this.getObject().fNpoints-1},${bin.x},${bin.y});;`;\n }\n this.drawGraph();\n }\n } else {\n exec = `SetPoint(${this.move_bin.indx},${this.move_bin.x},${this.move_bin.y});;`;\n if ((this.move_bin.indx == 0) && this.matchObjectType(clTCutG))\n exec += `SetPoint(${this.getObject().fNpoints-1},${this.move_bin.x},${this.move_bin.y});;`;\n delete this.move_binindx;\n }\n\n delete this.move_funcs;\n\n if (exec && !not_changed)\n this.submitCanvExec(exec);\n }\n\n /** @summary Fill context menu */\n fillContextMenu(menu) {\n super.fillContextMenu(menu);\n\n if (!this.snapid)\n menu.addchk(this.testEditable(), 'Editable', () => { this.testEditable('toggle'); this.drawGraph(); });\n\n return menu.size() > 0;\n }\n\n /** @summary Execute menu command\n * @private */\n executeMenuCommand(method, args) {\n if (super.executeMenuCommand(method,args)) return true;\n\n let canp = this.getCanvPainter(), pmain = this.get_main();\n\n if ((method.fName == 'RemovePoint') || (method.fName == 'InsertPoint')) {\n if (!canp || canp._readonly) return true; // ignore function\n\n let hint = this.extractTooltip(pnt);\n\n if (method.fName == 'InsertPoint') {\n let pnt = isFunc(pmain.getLastEventPos) ? pmain.getLastEventPos() : null;\n if (pnt) {\n let funcs = pmain.getGrFuncs(this.options.second_x, this.options.second_y),\n userx = funcs.revertAxis('x', pnt.x) ?? 0,\n usery = funcs.revertAxis('y', pnt.y) ?? 0;\n this.submitCanvExec(`AddPoint(${userx.toFixed(3)}, ${usery.toFixed(3)})`, this.args_menu_id);\n }\n } else if (this.args_menu_id && (hint?.binindx !== undefined)) {\n this.submitCanvExec(`RemovePoint(${hint.binindx})`, this.args_menu_id);\n }\n\n return true; // call is processed\n }\n\n return false;\n }\n\n /** @summary Update TGraph object */\n updateObject(obj, opt) {\n if (!this.matchObjectType(obj)) return false;\n\n if (opt && (opt != this.options.original))\n this.decodeOptions(opt);\n\n let graph = this.getObject();\n // TODO: make real update of TGraph object content\n graph.fBits = obj.fBits;\n graph.fTitle = obj.fTitle;\n graph.fX = obj.fX;\n graph.fY = obj.fY;\n graph.fNpoints = obj.fNpoints;\n graph.fMinimum = obj.fMinimum;\n graph.fMaximum = obj.fMaximum;\n this.createBins();\n\n delete this.$redraw_hist;\n\n // if our own histogram was used as axis drawing, we need update histogram as well\n if (this.axes_draw) {\n let histo = this.createHistogram();\n histo.fTitle = graph.fTitle; // copy title\n\n let hist_painter = this.getMainPainter();\n if (hist_painter?.$secondary) {\n hist_painter.updateObject(histo, this.options.Axis);\n this.$redraw_hist = true;\n }\n }\n\n return true;\n }\n\n /** @summary Checks if it makes sense to zoom inside specified axis range\n * @desc allow to zoom TGraph only when at least one point in the range */\n canZoomInside(axis,min,max) {\n let gr = this.getObject();\n if (!gr || (axis !== (this.options.pos3d ? 'y' : 'x'))) return false;\n\n for (let n = 0; n < gr.fNpoints; ++n)\n if ((min < gr.fX[n]) && (gr.fX[n] < max)) return true;\n\n return false;\n }\n\n /** @summary Process click on graph-defined buttons */\n clickButton(funcname) {\n if (funcname !== 'ToggleZoom') return false;\n\n let main = this.getFramePainter();\n if (!main) return false;\n\n if ((this.xmin === this.xmax) && (this.ymin === this.ymax)) return false;\n\n main.zoom(this.xmin, this.xmax, this.ymin, this.ymax);\n\n return true;\n }\n\n /** @summary Find TF1/TF2 in TGraph list of functions */\n findFunc() {\n let gr = this.getObject();\n if (gr?.fFunctions?.arr)\n return gr?.fFunctions?.arr.find(func => (func._typename == clTF1) || (func._typename == clTF2));\n return null;\n }\n\n /** @summary Find stat box in TGraph list of functions */\n findStat() {\n let gr = this.getObject();\n if (gr?.fFunctions?.arr)\n for (let i = 0; i < gr.fFunctions.arr.length; ++i) {\n let func = gr.fFunctions.arr[i];\n if ((func._typename == clTPaveStats) && (func.fName == 'stats')) return func;\n }\n return null;\n }\n\n /** @summary Create stat box */\n createStat() {\n let func = this.findFunc();\n if (!func) return null;\n\n let stats = this.findStat();\n if (stats) return stats;\n\n // do not create stats box when drawing canvas\n if (this.getCanvPainter()?.normal_canvas || this.options.PadStats) return null;\n\n this.create_stats = true;\n\n const st = gStyle;\n\n stats = create(clTPaveStats);\n Object.assign(stats, { fName : 'stats', fOptStat: 0, fOptFit: st.fOptFit || 111, fBorderSize: 1 });\n\n stats.fX1NDC = st.fStatX - st.fStatW;\n stats.fY1NDC = st.fStatY - st.fStatH;\n stats.fX2NDC = st.fStatX;\n stats.fY2NDC = st.fStatY;\n\n stats.fFillColor = st.fStatColor;\n stats.fFillStyle = st.fStatStyle;\n\n stats.fTextAngle = 0;\n stats.fTextSize = st.fStatFontSize; // 9 ??\n stats.fTextAlign = 12;\n stats.fTextColor = st.fStatTextColor;\n stats.fTextFont = st.fStatFont;\n\n stats.AddText(func.fName);\n\n // while TF1 was found, one can be sure that stats is existing\n this.getObject().fFunctions.Add(stats);\n\n return stats;\n }\n\n /** @summary Fill statistic */\n fillStatistic(stat, dostat, dofit) {\n\n // cannot fill stats without func\n let func = this.findFunc();\n\n if (!func || !dofit || !this.create_stats) return false;\n\n stat.clearPave();\n\n stat.fillFunctionStat(func, dofit);\n\n return true;\n }\n\n /** @summary method draws next function from the functions list\n * @return {Promise} */\n async drawNextFunction(indx) {\n\n let graph = this.getObject();\n\n if (indx >= (graph?.fFunctions?.arr?.length || 0))\n return this;\n\n let pp = this.getPadPainter(),\n func = graph.fFunctions.arr[indx],\n opt = graph.fFunctions.opt[indx];\n\n // required for stats filling\n // TODO: use weak reference (via pad list of painters and any kind of string)\n func.$main_painter = this;\n\n return pp.drawObject(this.getDom(), func, opt).then(() => this.drawNextFunction(indx+1));\n }\n\n /** @summary Draw axis histogram\n * @private */\n async drawAxisHisto() {\n let histo = this.createHistogram();\n return TH1Painter.draw(this.getDom(), histo, this.options.Axis)\n }\n\n /** @summary Draw TGraph\n * @private */\n static async _drawGraph(painter, opt) {\n painter.decodeOptions(opt, true);\n painter.createBins();\n painter.createStat();\n if (!settings.DragGraphs && !graph.TestBit(kNotEditable))\n graph.InvertBit(kNotEditable);\n\n let promise = Promise.resolve();\n\n if ((!painter.getMainPainter() || painter.options.second_x || painter.options.second_y) && painter.options.Axis)\n promise = painter.drawAxisHisto().then(hist_painter => {\n if (hist_painter) {\n painter.axes_draw = true;\n if (!painter._own_histogram) painter.$primary = true;\n hist_painter.$secondary = 'hist';\n }\n });\n\n return promise.then(() => {\n painter.addToPadPrimitives();\n return painter.drawGraph();\n }).then(() => painter.drawNextFunction(0));\n }\n\n static async draw(dom, graph, opt) {\n return TGraphPainter._drawGraph(new TGraphPainter(dom, graph), opt);\n }\n\n} // class TGraphPainter\n\nexport { clTGraphAsymmErrors, TGraphPainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file diff --git a/docs/260.081a22df4eb6dd7f.js b/docs/260.081a22df4eb6dd7f.js new file mode 100644 index 000000000..6f2cd3801 --- /dev/null +++ b/docs/260.081a22df4eb6dd7f.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[260],{260:(J,L,u)=>{u.r(L),u.d(L,{RPalettePainter:()=>D,drawBox:()=>K,drawLine:()=>I,drawMarker:()=>S,drawText:()=>Z});var j=u(4788),P=u(9542),f=u(2253),k=u(3029),H=u(6116),B=u(9056),W=u(4383);function Z(){let c=this.getObject(),a=this.getPadPainter(),e=this.v7EvalAttr("onFrame",!1)?a.getFramePainter():null,l=!!e&&this.v7EvalAttr("clipping",!1),t=a.getCoordinate(c.fPos,e),n=this.v7EvalFont("text",{size:12,color:"black",align:22});return this.createG(l?"main_layer":!!e&&"upper_layer"),this.startTextDrawing(n,"font"),this.drawText({x:t.x,y:t.y,text:c.fText,latex:1}),this.finishTextDrawing()}function I(){let c=this.getObject(),a=this.getPadPainter(),e=this.v7EvalAttr("onFrame",!1)?a.getFramePainter():null,l=!!e&&this.v7EvalAttr("clipping",!1),t=a.getCoordinate(c.fP1,e),n=a.getCoordinate(c.fP2,e);this.createG(l?"main_layer":!!e&&"upper_layer"),this.createv7AttLine(),this.draw_g.append("svg:path").attr("d",`M${t.x},${t.y}L${n.x},${n.y}`).call(this.lineatt.func)}function K(){let c=this.getObject(),a=this.getPadPainter(),e=this.v7EvalAttr("onFrame",!1)?a.getFramePainter():null,l=!!e&&this.v7EvalAttr("clipping",!1),t=a.getCoordinate(c.fP1,e),n=a.getCoordinate(c.fP2,e);this.createG(l?"main_layer":!!e&&"upper_layer"),this.createv7AttLine("border_"),this.createv7AttFill(),this.draw_g.append("svg:path").attr("d",`M${t.x},${t.y}H${n.x}V${n.y}H${t.x}Z`).call(this.lineatt.func).call(this.fillatt.func)}function S(){let c=this.getObject(),a=this.getPadPainter(),e=this.v7EvalAttr("onFrame",!1)?a.getFramePainter():null,l=!!e&&this.v7EvalAttr("clipping",!1),t=a.getCoordinate(c.fP,e);this.createG(l?"main_layer":!!e&&"upper_layer"),this.createv7AttMarker();let n=this.markeratt.create(t.x,t.y);n&&this.draw_g.append("svg:path").attr("d",n).call(this.markeratt.func)}class D extends k.p{getHistPalette(){let a=this.getObject(),e=a?a.fPalette:null;return e&&!e.getColor&&(0,P.addMethods)(e,"ROOT::Experimental::RPalette"),e}drawPalette(a){let e=this.getHistPalette(),l=e.getContour(),t=this.getFramePainter();if(!l)return console.log("no contour - no palette");if(!t)return console.log("no frame painter - no palette");let A,C,o,h,n=e.full_min,E=e.full_max,O=l[0],R=l[l.length-1],p=t.getFrameRect(),y=this.getPadPainter().getPadWidth(),$=this.getPadPainter().getPadHeight(),U=this.v7EvalAttr("visible",!0),s=this.v7EvalAttr("vertical",!0);if(a){o=a.width,h=a.height;let i={};s?(this.v7AttrChange(i,"margin",(a.x-p.x-p.width)/y),this.v7AttrChange(i,"width",o/y)):(this.v7AttrChange(i,"margin",(a.y-p.y-p.height)/y),this.v7AttrChange(i,"width",h/$)),this.v7SendAttrChanges(i,!1)}else{if(s){let i=this.v7EvalLength("margin",y,.02);A=Math.round(p.x+p.width+i),o=this.v7EvalLength("width",y,.05),C=p.y,h=p.height}else{let i=this.v7EvalLength("margin",$,.02);A=p.x,o=p.width,C=Math.round(p.y+p.height+i),h=this.v7EvalLength("width",$,.05)}this.draw_g.attr("transform",`translate(${A},${C})`)}let w=this.draw_g.select(".colbtns");if(w.empty()?w=this.draw_g.append("svg:g").attr("class","colbtns"):w.selectAll("*").remove(),!U)return;w.append("svg:path").attr("d",`M0,0H${o}V${h}H0Z`).style("stroke","black").style("fill","none"),(void 0===n||void 0===E)&&(n=O,E=R),s?t.z_handle.configureAxis("zaxis",n,E,O,R,!0,[h,0],-h,{reverse:!1}):t.z_handle.configureAxis("zaxis",n,E,O,R,!1,[0,o],o,{reverse:!1});for(let i=0;it.unzoom("z"))}t.z_handle.maxTickSize=Math.round(.3*o);let T=t.z_handle.drawAxis(this.draw_g,s?`translate(${o},${h})`:`translate(0,${h})`,s?-1:1);return(0,P.isBatchMode)()||a?T:T.then(()=>{if(P.settings.ContextMenu&&this.draw_g.on("contextmenu",r=>{r.stopPropagation(),r.preventDefault(),(0,W.Z)(r,this).then(d=>{d.add("header:Palette"),d.addchk(s,"Vertical",z=>{this.v7SetAttr("vertical",z),this.redrawPad()}),t.z_handle.fillAxisContextMenu(d,"z"),d.show()})}),(0,H.uI)(this,{x:A,y:C,width:o,height:h,minwidth:20,minheight:20,no_change_x:!s,no_change_y:s,redraw:r=>this.drawPalette(r)}),!P.settings.Zooming)return;let g,x,b,v,i=!1,_=0,m=0;const G=r=>{if(!i)return;if(r.preventDefault(),v=(0,f.cx)(r,this.draw_g.node()),b)return t.z_handle.processLabelsMove("move",v);m=s?Math.min(Math.max(v[1],0),h):Math.min(Math.max(v[0],0),o);let d=Math.abs(m-_);!x&&d>1&&(g.style("display",null),x=!0),s?g.attr("y",Math.min(_,m)).attr("height",d):g.attr("x",Math.min(_,m)).attr("width",d)},V=r=>{if(i)if(r.preventDefault(),(0,f.Ys)(window).on("mousemove.colzoomRect",null).on("mouseup.colzoomRect",null),g.remove(),g=null,i=!1,b)t.z_handle.processLabelsMove("stop",v);else{let d=t.z_handle.func,z=d.invert(_),M=d.invert(m);this.getFramePainter().zoom("z",Math.min(z,M),Math.max(z,M))}},Y=r=>{i||(i=!0,r.preventDefault(),r.stopPropagation(),v=(0,f.cx)(r,this.draw_g.node()),_=m=v[s?1:0],x=!1,b=!1,g=w.append("svg:rect").attr("class","zoom").attr("id","colzoomRect").style("display","none"),s?g.attr("x",0).attr("width",o).attr("y",_).attr("height",1):g.attr("x",_).attr("width",1).attr("y",0).attr("height",h),(0,f.Ys)(window).on("mousemove.colzoomRect",G).on("mouseup.colzoomRect",V,!0),setTimeout(()=>{!x&&i&&(b=t.z_handle.processLabelsMove("start",v))},500))},F=()=>{this.draw_g.selectAll(".axis_zoom, .axis_labels").on("mousedown",Y).on("dblclick",()=>t.unzoom("z")),P.settings.ZoomWheel&&this.draw_g.on("wheel",r=>{r.stopPropagation(),r.preventDefault();let d=(0,f.cx)(r,this.draw_g.node()),M=t.z_handle.analyzeWheelEvent(r,s?1-d[1]/h:d[0]/o);M.changed&&t.zoom("z",M.min,M.max)})};t.z_handle.setAfterDrawHandler(F),F()})}static draw(a,e,l){return(0,j.Z)(function*(){let t=new D(a,e,l,"palette");return(0,B.ensureRCanvas)(t,!1).then(()=>(t.createG(),t))})()}}}}]); +//# sourceMappingURL=260.081a22df4eb6dd7f.js.map \ No newline at end of file diff --git a/docs/431.d3bb1ba13892743e.js.map b/docs/260.081a22df4eb6dd7f.js.map similarity index 99% rename from docs/431.d3bb1ba13892743e.js.map rename to docs/260.081a22df4eb6dd7f.js.map index d6192bd35..e7e945e1a 100644 --- a/docs/431.d3bb1ba13892743e.js.map +++ b/docs/260.081a22df4eb6dd7f.js.map @@ -1 +1 @@ -{"version":3,"file":"431.d3bb1ba13892743e.js","mappings":"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","names":["drawText","text","this","getObject","pp","getPadPainter","onframe","v7EvalAttr","getFramePainter","clipping","p","getCoordinate","fPos","textFont","v7EvalFont","size","color","align","createG","startTextDrawing","x","y","fText","latex","finishTextDrawing","drawLine","line","p1","fP1","p2","fP2","createv7AttLine","draw_g","append","attr","call","lineatt","func","drawBox","box","createv7AttFill","fillatt","drawMarker","marker","fP","createv7AttMarker","path","markeratt","create","RPalettePainter","RObjectPainter","getHistPalette","drawable","pal","fPalette","getColor","addMethods","drawPalette","drag","palette","contour","getContour","framep","console","log","palette_x","palette_y","palette_width","palette_height","gmin","full_min","gmax","full_max","zmin","zmax","length","rect","getFrameRect","pad_width","getPadWidth","pad_height","getPadHeight","visible","vertical","width","height","changes","v7AttrChange","v7SendAttrChanges","margin","v7EvalLength","Math","round","g_btns","select","empty","selectAll","remove","style","undefined","z_handle","configureAxis","reverse","i","z0","gr","z1","col","getContourColor","r","property","d3_rgb","darker","toString","isTooltipAllowed","on","d3_select","transition","duration","toFixed","settings","unzoom","maxTickSize","promise","drawAxis","isBatchMode","then","evnt","stopPropagation","preventDefault","createMenu","menu","add","addchk","flag","v7SetAttr","redrawPad","fillAxisContextMenu","show","addDragHandler","minwidth","minheight","no_change_x","no_change_y","redraw","d","zoom_rect","zoom_rect_visible","moving_labels","last_pos","doing_zoom","sel1","sel2","moveRectSel","d3_pointer","node","processLabelsMove","min","max","sz","abs","endRectSel","window","z","invert","z2","zoom","startRectSel","setTimeout","assignHandlers","pos","item","analyzeWheelEvent","changed","setAfterDrawHandler","static","dom","opt","painter","ensureRCanvas"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/draw/v7more.mjs"],"sourcesContent":["import { addMethods, settings, isBatchMode } from '../core.mjs';\nimport { select as d3_select, rgb as d3_rgb, pointer as d3_pointer } from '../d3.mjs';\nimport { RObjectPainter } from '../base/RObjectPainter.mjs';\nimport { addDragHandler } from '../gpad/TFramePainter.mjs';\nimport { ensureRCanvas } from '../gpad/RCanvasPainter.mjs';\nimport { createMenu } from '../gui/menu.mjs';\n\n\n/** @summary draw RText object\n * @private */\nfunction drawText() {\n let text = this.getObject(),\n pp = this.getPadPainter(),\n onframe = this.v7EvalAttr('onFrame', false) ? pp.getFramePainter() : null,\n clipping = onframe ? this.v7EvalAttr('clipping', false) : false,\n p = pp.getCoordinate(text.fPos, onframe),\n textFont = this.v7EvalFont('text', { size: 12, color: 'black', align: 22 });\n\n this.createG(clipping ? 'main_layer' : (onframe ? 'upper_layer' : false));\n\n this.startTextDrawing(textFont, 'font');\n\n this.drawText({ x: p.x, y: p.y, text: text.fText, latex: 1 });\n\n return this.finishTextDrawing();\n}\n\n/** @summary draw RLine object\n * @private */\nfunction drawLine() {\n\n let line = this.getObject(),\n pp = this.getPadPainter(),\n onframe = this.v7EvalAttr('onFrame', false) ? pp.getFramePainter() : null,\n clipping = onframe ? this.v7EvalAttr('clipping', false) : false,\n p1 = pp.getCoordinate(line.fP1, onframe),\n p2 = pp.getCoordinate(line.fP2, onframe);\n\n this.createG(clipping ? 'main_layer' : (onframe ? 'upper_layer' : false));\n\n this.createv7AttLine();\n\n this.draw_g\n .append('svg:path')\n .attr('d',`M${p1.x},${p1.y}L${p2.x},${p2.y}`)\n .call(this.lineatt.func);\n}\n\n/** @summary draw RBox object\n * @private */\nfunction drawBox() {\n\n let box = this.getObject(),\n pp = this.getPadPainter(),\n onframe = this.v7EvalAttr('onFrame', false) ? pp.getFramePainter() : null,\n clipping = onframe ? this.v7EvalAttr('clipping', false) : false,\n p1 = pp.getCoordinate(box.fP1, onframe),\n p2 = pp.getCoordinate(box.fP2, onframe);\n\n this.createG(clipping ? 'main_layer' : (onframe ? 'upper_layer' : false));\n\n this.createv7AttLine('border_');\n\n this.createv7AttFill();\n\n this.draw_g\n .append('svg:path')\n .attr('d',`M${p1.x},${p1.y}H${p2.x}V${p2.y}H${p1.x}Z`)\n .call(this.lineatt.func)\n .call(this.fillatt.func);\n}\n\n/** @summary draw RMarker object\n * @private */\nfunction drawMarker() {\n let marker = this.getObject(),\n pp = this.getPadPainter(),\n onframe = this.v7EvalAttr('onFrame', false) ? pp.getFramePainter() : null,\n clipping = onframe ? this.v7EvalAttr('clipping', false) : false,\n p = pp.getCoordinate(marker.fP, onframe);\n\n this.createG(clipping ? 'main_layer' : (onframe ? 'upper_layer' : false));\n\n this.createv7AttMarker();\n\n let path = this.markeratt.create(p.x, p.y);\n\n if (path)\n this.draw_g.append('svg:path')\n .attr('d', path)\n .call(this.markeratt.func);\n}\n\n/** @summary painter for RPalette\n *\n * @private\n */\n\nclass RPalettePainter extends RObjectPainter {\n\n /** @summary get palette */\n getHistPalette() {\n let drawable = this.getObject(),\n pal = drawable ? drawable.fPalette : null;\n\n if (pal && !pal.getColor)\n addMethods(pal, 'ROOT::Experimental::RPalette');\n\n return pal;\n }\n\n /** @summary Draw palette */\n drawPalette(drag) {\n\n let palette = this.getHistPalette(),\n contour = palette.getContour(),\n framep = this.getFramePainter();\n\n if (!contour)\n return console.log('no contour - no palette');\n\n // frame painter must be there\n if (!framep)\n return console.log('no frame painter - no palette');\n\n let gmin = palette.full_min,\n gmax = palette.full_max,\n zmin = contour[0],\n zmax = contour[contour.length-1],\n rect = framep.getFrameRect(),\n pad_width = this.getPadPainter().getPadWidth(),\n pad_height = this.getPadPainter().getPadHeight(),\n visible = this.v7EvalAttr('visible', true),\n vertical = this.v7EvalAttr('vertical', true),\n palette_x, palette_y, palette_width, palette_height;\n\n if (drag) {\n palette_width = drag.width;\n palette_height = drag.height;\n\n let changes = {};\n if (vertical) {\n this.v7AttrChange(changes, 'margin', (drag.x - rect.x - rect.width) / pad_width);\n this.v7AttrChange(changes, 'width', palette_width / pad_width);\n } else {\n this.v7AttrChange(changes, 'margin', (drag.y - rect.y - rect.height) / pad_width);\n this.v7AttrChange(changes, 'width', palette_height / pad_height);\n }\n this.v7SendAttrChanges(changes, false); // do not invoke canvas update on the server\n } else {\n if (vertical) {\n let margin = this.v7EvalLength('margin', pad_width, 0.02);\n palette_x = Math.round(rect.x + rect.width + margin);\n palette_width = this.v7EvalLength('width', pad_width, 0.05);\n palette_y = rect.y;\n palette_height = rect.height;\n } else {\n let margin = this.v7EvalLength('margin', pad_height, 0.02);\n palette_x = rect.x;\n palette_width = rect.width;\n palette_y = Math.round(rect.y + rect.height + margin);\n palette_height = this.v7EvalLength('width', pad_height, 0.05);\n }\n\n // x,y,width,height attributes used for drag functionality\n this.draw_g.attr('transform',`translate(${palette_x},${palette_y})`);\n }\n\n let g_btns = this.draw_g.select('.colbtns');\n if (g_btns.empty())\n g_btns = this.draw_g.append('svg:g').attr('class', 'colbtns');\n else\n g_btns.selectAll('*').remove();\n\n if (!visible) return;\n\n g_btns.append('svg:path')\n .attr('d', `M0,0H${palette_width}V${palette_height}H0Z`)\n .style('stroke', 'black')\n .style('fill', 'none');\n\n if ((gmin === undefined) || (gmax === undefined)) { gmin = zmin; gmax = zmax; }\n\n if (vertical)\n framep.z_handle.configureAxis('zaxis', gmin, gmax, zmin, zmax, true, [palette_height, 0], -palette_height, { reverse: false });\n else\n framep.z_handle.configureAxis('zaxis', gmin, gmax, zmin, zmax, false, [0, palette_width], palette_width, { reverse: false });\n\n for (let i = 0; i < contour.length-1; ++i) {\n let z0 = Math.round(framep.z_handle.gr(contour[i])),\n z1 = Math.round(framep.z_handle.gr(contour[i+1])),\n col = palette.getContourColor((contour[i]+contour[i+1])/2);\n\n let r = g_btns.append('svg:path')\n .attr('d', vertical ? `M0,${z1}H${palette_width}V${z0}H0Z` : `M${z0},0V${palette_height}H${z1}V0Z`)\n .style('fill', col)\n .style('stroke', col)\n .property('fill0', col)\n .property('fill1', d3_rgb(col).darker(0.5).toString());\n\n if (this.isTooltipAllowed())\n r.on('mouseover', function() {\n d3_select(this).transition().duration(100).style('fill', d3_select(this).property('fill1'));\n }).on('mouseout', function() {\n d3_select(this).transition().duration(100).style('fill', d3_select(this).property('fill0'));\n }).append('svg:title').text(contour[i].toFixed(2) + ' - ' + contour[i+1].toFixed(2));\n\n if (settings.Zooming)\n r.on('dblclick', () => framep.unzoom('z'));\n }\n\n framep.z_handle.maxTickSize = Math.round(palette_width*0.3);\n\n let promise = framep.z_handle.drawAxis(this.draw_g, vertical ? `translate(${palette_width},${palette_height})` : `translate(0,${palette_height})`, vertical ? -1 : 1);\n\n if (isBatchMode() || drag)\n return promise;\n\n return promise.then(() => {\n\n if (settings.ContextMenu)\n this.draw_g.on('contextmenu', evnt => {\n evnt.stopPropagation(); // disable main context menu\n evnt.preventDefault(); // disable browser context menu\n createMenu(evnt, this).then(menu => {\n menu.add('header:Palette');\n menu.addchk(vertical, 'Vertical', flag => { this.v7SetAttr('vertical', flag); this.redrawPad(); });\n framep.z_handle.fillAxisContextMenu(menu, 'z');\n menu.show();\n });\n });\n\n addDragHandler(this, { x: palette_x, y: palette_y, width: palette_width, height: palette_height,\n minwidth: 20, minheight: 20, no_change_x: !vertical, no_change_y: vertical, redraw: d => this.drawPalette(d) });\n\n if (!settings.Zooming) return;\n\n let doing_zoom = false, sel1 = 0, sel2 = 0, zoom_rect, zoom_rect_visible, moving_labels, last_pos;\n\n const moveRectSel = evnt => {\n\n if (!doing_zoom) return;\n evnt.preventDefault();\n\n last_pos = d3_pointer(evnt, this.draw_g.node());\n\n if (moving_labels)\n return framep.z_handle.processLabelsMove('move', last_pos);\n\n if (vertical)\n sel2 = Math.min(Math.max(last_pos[1], 0), palette_height);\n else\n sel2 = Math.min(Math.max(last_pos[0], 0), palette_width);\n\n let sz = Math.abs(sel2-sel1);\n\n if (!zoom_rect_visible && (sz > 1)) {\n zoom_rect.style('display', null);\n zoom_rect_visible = true;\n }\n\n if (vertical)\n zoom_rect.attr('y', Math.min(sel1, sel2)).attr('height', sz);\n else\n zoom_rect.attr('x', Math.min(sel1, sel2)).attr('width', sz);\n }, endRectSel = evnt => {\n if (!doing_zoom) return;\n\n evnt.preventDefault();\n d3_select(window).on('mousemove.colzoomRect', null)\n .on('mouseup.colzoomRect', null);\n zoom_rect.remove();\n zoom_rect = null;\n doing_zoom = false;\n\n if (moving_labels) {\n framep.z_handle.processLabelsMove('stop', last_pos);\n } else {\n let z = framep.z_handle.func, z1 = z.invert(sel1), z2 = z.invert(sel2);\n this.getFramePainter().zoom('z', Math.min(z1, z2), Math.max(z1, z2));\n }\n }, startRectSel = evnt => {\n // ignore when touch selection is activated\n if (doing_zoom) return;\n doing_zoom = true;\n\n evnt.preventDefault();\n evnt.stopPropagation();\n\n last_pos = d3_pointer(evnt, this.draw_g.node());\n sel1 = sel2 = last_pos[vertical ? 1 : 0];\n zoom_rect_visible = false;\n moving_labels = false;\n zoom_rect = g_btns\n .append('svg:rect')\n .attr('class', 'zoom')\n .attr('id', 'colzoomRect')\n .style('display', 'none');\n if (vertical)\n zoom_rect.attr('x', 0).attr('width', palette_width).attr('y', sel1).attr('height', 1);\n else\n zoom_rect.attr('x', sel1).attr('width', 1).attr('y', 0).attr('height', palette_height);\n\n d3_select(window).on('mousemove.colzoomRect', moveRectSel)\n .on('mouseup.colzoomRect', endRectSel, true);\n\n setTimeout(() => {\n if (!zoom_rect_visible && doing_zoom)\n moving_labels = framep.z_handle.processLabelsMove('start', last_pos);\n }, 500);\n }, assignHandlers = () => {\n this.draw_g.selectAll('.axis_zoom, .axis_labels')\n .on('mousedown', startRectSel)\n .on('dblclick', () => framep.unzoom('z'));\n\n if (settings.ZoomWheel)\n this.draw_g.on('wheel', evnt => {\n evnt.stopPropagation();\n evnt.preventDefault();\n\n let pos = d3_pointer(evnt, this.draw_g.node()),\n coord = vertical ? (1 - pos[1] / palette_height) : pos[0] / palette_width;\n\n let item = framep.z_handle.analyzeWheelEvent(evnt, coord);\n if (item.changed)\n framep.zoom('z', item.min, item.max);\n });\n };\n\n framep.z_handle.setAfterDrawHandler(assignHandlers);\n\n assignHandlers();\n });\n }\n\n /** @summary draw RPalette object */\n static async draw(dom, palette, opt) {\n let painter = new RPalettePainter(dom, palette, opt, 'palette');\n return ensureRCanvas(painter, false).then(() => {\n painter.createG(); // just create container, real drawing will be done by histogram\n return painter;\n });\n }\n\n} // class RPalettePainter\n\nexport { RPalettePainter, drawText, drawLine, drawBox, drawMarker };\n"],"x_google_ignoreList":[0]} \ No newline at end of file +{"version":3,"file":"260.081a22df4eb6dd7f.js","mappings":"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","names":["drawText","text","this","getObject","pp","getPadPainter","onframe","v7EvalAttr","getFramePainter","clipping","p","getCoordinate","fPos","textFont","v7EvalFont","size","color","align","createG","startTextDrawing","x","y","fText","latex","finishTextDrawing","drawLine","line","p1","fP1","p2","fP2","createv7AttLine","draw_g","append","attr","call","lineatt","func","drawBox","box","createv7AttFill","fillatt","drawMarker","marker","fP","createv7AttMarker","path","markeratt","create","RPalettePainter","RObjectPainter","getHistPalette","drawable","pal","fPalette","getColor","addMethods","drawPalette","drag","palette","contour","getContour","framep","console","log","palette_x","palette_y","palette_width","palette_height","gmin","full_min","gmax","full_max","zmin","zmax","length","rect","getFrameRect","pad_width","getPadWidth","pad_height","getPadHeight","visible","vertical","width","height","changes","v7AttrChange","v7SendAttrChanges","margin","v7EvalLength","Math","round","g_btns","select","empty","selectAll","remove","style","undefined","z_handle","configureAxis","reverse","i","z0","gr","z1","col","getContourColor","r","property","d3_rgb","darker","toString","isTooltipAllowed","on","d3_select","transition","duration","toFixed","settings","unzoom","maxTickSize","promise","drawAxis","isBatchMode","then","evnt","stopPropagation","preventDefault","createMenu","menu","add","addchk","flag","v7SetAttr","redrawPad","fillAxisContextMenu","show","addDragHandler","minwidth","minheight","no_change_x","no_change_y","redraw","d","zoom_rect","zoom_rect_visible","moving_labels","last_pos","doing_zoom","sel1","sel2","moveRectSel","d3_pointer","node","processLabelsMove","min","max","sz","abs","endRectSel","window","z","invert","z2","zoom","startRectSel","setTimeout","assignHandlers","pos","item","analyzeWheelEvent","changed","setAfterDrawHandler","static","dom","opt","painter","ensureRCanvas"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/draw/v7more.mjs"],"sourcesContent":["import { addMethods, settings, isBatchMode } from '../core.mjs';\nimport { select as d3_select, rgb as d3_rgb, pointer as d3_pointer } from '../d3.mjs';\nimport { RObjectPainter } from '../base/RObjectPainter.mjs';\nimport { addDragHandler } from '../gpad/TFramePainter.mjs';\nimport { ensureRCanvas } from '../gpad/RCanvasPainter.mjs';\nimport { createMenu } from '../gui/menu.mjs';\n\n\n/** @summary draw RText object\n * @private */\nfunction drawText() {\n let text = this.getObject(),\n pp = this.getPadPainter(),\n onframe = this.v7EvalAttr('onFrame', false) ? pp.getFramePainter() : null,\n clipping = onframe ? this.v7EvalAttr('clipping', false) : false,\n p = pp.getCoordinate(text.fPos, onframe),\n textFont = this.v7EvalFont('text', { size: 12, color: 'black', align: 22 });\n\n this.createG(clipping ? 'main_layer' : (onframe ? 'upper_layer' : false));\n\n this.startTextDrawing(textFont, 'font');\n\n this.drawText({ x: p.x, y: p.y, text: text.fText, latex: 1 });\n\n return this.finishTextDrawing();\n}\n\n/** @summary draw RLine object\n * @private */\nfunction drawLine() {\n\n let line = this.getObject(),\n pp = this.getPadPainter(),\n onframe = this.v7EvalAttr('onFrame', false) ? pp.getFramePainter() : null,\n clipping = onframe ? this.v7EvalAttr('clipping', false) : false,\n p1 = pp.getCoordinate(line.fP1, onframe),\n p2 = pp.getCoordinate(line.fP2, onframe);\n\n this.createG(clipping ? 'main_layer' : (onframe ? 'upper_layer' : false));\n\n this.createv7AttLine();\n\n this.draw_g\n .append('svg:path')\n .attr('d',`M${p1.x},${p1.y}L${p2.x},${p2.y}`)\n .call(this.lineatt.func);\n}\n\n/** @summary draw RBox object\n * @private */\nfunction drawBox() {\n\n let box = this.getObject(),\n pp = this.getPadPainter(),\n onframe = this.v7EvalAttr('onFrame', false) ? pp.getFramePainter() : null,\n clipping = onframe ? this.v7EvalAttr('clipping', false) : false,\n p1 = pp.getCoordinate(box.fP1, onframe),\n p2 = pp.getCoordinate(box.fP2, onframe);\n\n this.createG(clipping ? 'main_layer' : (onframe ? 'upper_layer' : false));\n\n this.createv7AttLine('border_');\n\n this.createv7AttFill();\n\n this.draw_g\n .append('svg:path')\n .attr('d',`M${p1.x},${p1.y}H${p2.x}V${p2.y}H${p1.x}Z`)\n .call(this.lineatt.func)\n .call(this.fillatt.func);\n}\n\n/** @summary draw RMarker object\n * @private */\nfunction drawMarker() {\n let marker = this.getObject(),\n pp = this.getPadPainter(),\n onframe = this.v7EvalAttr('onFrame', false) ? pp.getFramePainter() : null,\n clipping = onframe ? this.v7EvalAttr('clipping', false) : false,\n p = pp.getCoordinate(marker.fP, onframe);\n\n this.createG(clipping ? 'main_layer' : (onframe ? 'upper_layer' : false));\n\n this.createv7AttMarker();\n\n let path = this.markeratt.create(p.x, p.y);\n\n if (path)\n this.draw_g.append('svg:path')\n .attr('d', path)\n .call(this.markeratt.func);\n}\n\n/** @summary painter for RPalette\n *\n * @private\n */\n\nclass RPalettePainter extends RObjectPainter {\n\n /** @summary get palette */\n getHistPalette() {\n let drawable = this.getObject(),\n pal = drawable ? drawable.fPalette : null;\n\n if (pal && !pal.getColor)\n addMethods(pal, 'ROOT::Experimental::RPalette');\n\n return pal;\n }\n\n /** @summary Draw palette */\n drawPalette(drag) {\n\n let palette = this.getHistPalette(),\n contour = palette.getContour(),\n framep = this.getFramePainter();\n\n if (!contour)\n return console.log('no contour - no palette');\n\n // frame painter must be there\n if (!framep)\n return console.log('no frame painter - no palette');\n\n let gmin = palette.full_min,\n gmax = palette.full_max,\n zmin = contour[0],\n zmax = contour[contour.length-1],\n rect = framep.getFrameRect(),\n pad_width = this.getPadPainter().getPadWidth(),\n pad_height = this.getPadPainter().getPadHeight(),\n visible = this.v7EvalAttr('visible', true),\n vertical = this.v7EvalAttr('vertical', true),\n palette_x, palette_y, palette_width, palette_height;\n\n if (drag) {\n palette_width = drag.width;\n palette_height = drag.height;\n\n let changes = {};\n if (vertical) {\n this.v7AttrChange(changes, 'margin', (drag.x - rect.x - rect.width) / pad_width);\n this.v7AttrChange(changes, 'width', palette_width / pad_width);\n } else {\n this.v7AttrChange(changes, 'margin', (drag.y - rect.y - rect.height) / pad_width);\n this.v7AttrChange(changes, 'width', palette_height / pad_height);\n }\n this.v7SendAttrChanges(changes, false); // do not invoke canvas update on the server\n } else {\n if (vertical) {\n let margin = this.v7EvalLength('margin', pad_width, 0.02);\n palette_x = Math.round(rect.x + rect.width + margin);\n palette_width = this.v7EvalLength('width', pad_width, 0.05);\n palette_y = rect.y;\n palette_height = rect.height;\n } else {\n let margin = this.v7EvalLength('margin', pad_height, 0.02);\n palette_x = rect.x;\n palette_width = rect.width;\n palette_y = Math.round(rect.y + rect.height + margin);\n palette_height = this.v7EvalLength('width', pad_height, 0.05);\n }\n\n // x,y,width,height attributes used for drag functionality\n this.draw_g.attr('transform',`translate(${palette_x},${palette_y})`);\n }\n\n let g_btns = this.draw_g.select('.colbtns');\n if (g_btns.empty())\n g_btns = this.draw_g.append('svg:g').attr('class', 'colbtns');\n else\n g_btns.selectAll('*').remove();\n\n if (!visible) return;\n\n g_btns.append('svg:path')\n .attr('d', `M0,0H${palette_width}V${palette_height}H0Z`)\n .style('stroke', 'black')\n .style('fill', 'none');\n\n if ((gmin === undefined) || (gmax === undefined)) { gmin = zmin; gmax = zmax; }\n\n if (vertical)\n framep.z_handle.configureAxis('zaxis', gmin, gmax, zmin, zmax, true, [palette_height, 0], -palette_height, { reverse: false });\n else\n framep.z_handle.configureAxis('zaxis', gmin, gmax, zmin, zmax, false, [0, palette_width], palette_width, { reverse: false });\n\n for (let i = 0; i < contour.length-1; ++i) {\n let z0 = Math.round(framep.z_handle.gr(contour[i])),\n z1 = Math.round(framep.z_handle.gr(contour[i+1])),\n col = palette.getContourColor((contour[i]+contour[i+1])/2);\n\n let r = g_btns.append('svg:path')\n .attr('d', vertical ? `M0,${z1}H${palette_width}V${z0}H0Z` : `M${z0},0V${palette_height}H${z1}V0Z`)\n .style('fill', col)\n .style('stroke', col)\n .property('fill0', col)\n .property('fill1', d3_rgb(col).darker(0.5).toString());\n\n if (this.isTooltipAllowed())\n r.on('mouseover', function() {\n d3_select(this).transition().duration(100).style('fill', d3_select(this).property('fill1'));\n }).on('mouseout', function() {\n d3_select(this).transition().duration(100).style('fill', d3_select(this).property('fill0'));\n }).append('svg:title').text(contour[i].toFixed(2) + ' - ' + contour[i+1].toFixed(2));\n\n if (settings.Zooming)\n r.on('dblclick', () => framep.unzoom('z'));\n }\n\n framep.z_handle.maxTickSize = Math.round(palette_width*0.3);\n\n let promise = framep.z_handle.drawAxis(this.draw_g, vertical ? `translate(${palette_width},${palette_height})` : `translate(0,${palette_height})`, vertical ? -1 : 1);\n\n if (isBatchMode() || drag)\n return promise;\n\n return promise.then(() => {\n\n if (settings.ContextMenu)\n this.draw_g.on('contextmenu', evnt => {\n evnt.stopPropagation(); // disable main context menu\n evnt.preventDefault(); // disable browser context menu\n createMenu(evnt, this).then(menu => {\n menu.add('header:Palette');\n menu.addchk(vertical, 'Vertical', flag => { this.v7SetAttr('vertical', flag); this.redrawPad(); });\n framep.z_handle.fillAxisContextMenu(menu, 'z');\n menu.show();\n });\n });\n\n addDragHandler(this, { x: palette_x, y: palette_y, width: palette_width, height: palette_height,\n minwidth: 20, minheight: 20, no_change_x: !vertical, no_change_y: vertical, redraw: d => this.drawPalette(d) });\n\n if (!settings.Zooming) return;\n\n let doing_zoom = false, sel1 = 0, sel2 = 0, zoom_rect, zoom_rect_visible, moving_labels, last_pos;\n\n const moveRectSel = evnt => {\n\n if (!doing_zoom) return;\n evnt.preventDefault();\n\n last_pos = d3_pointer(evnt, this.draw_g.node());\n\n if (moving_labels)\n return framep.z_handle.processLabelsMove('move', last_pos);\n\n if (vertical)\n sel2 = Math.min(Math.max(last_pos[1], 0), palette_height);\n else\n sel2 = Math.min(Math.max(last_pos[0], 0), palette_width);\n\n let sz = Math.abs(sel2-sel1);\n\n if (!zoom_rect_visible && (sz > 1)) {\n zoom_rect.style('display', null);\n zoom_rect_visible = true;\n }\n\n if (vertical)\n zoom_rect.attr('y', Math.min(sel1, sel2)).attr('height', sz);\n else\n zoom_rect.attr('x', Math.min(sel1, sel2)).attr('width', sz);\n }, endRectSel = evnt => {\n if (!doing_zoom) return;\n\n evnt.preventDefault();\n d3_select(window).on('mousemove.colzoomRect', null)\n .on('mouseup.colzoomRect', null);\n zoom_rect.remove();\n zoom_rect = null;\n doing_zoom = false;\n\n if (moving_labels) {\n framep.z_handle.processLabelsMove('stop', last_pos);\n } else {\n let z = framep.z_handle.func, z1 = z.invert(sel1), z2 = z.invert(sel2);\n this.getFramePainter().zoom('z', Math.min(z1, z2), Math.max(z1, z2));\n }\n }, startRectSel = evnt => {\n // ignore when touch selection is activated\n if (doing_zoom) return;\n doing_zoom = true;\n\n evnt.preventDefault();\n evnt.stopPropagation();\n\n last_pos = d3_pointer(evnt, this.draw_g.node());\n sel1 = sel2 = last_pos[vertical ? 1 : 0];\n zoom_rect_visible = false;\n moving_labels = false;\n zoom_rect = g_btns\n .append('svg:rect')\n .attr('class', 'zoom')\n .attr('id', 'colzoomRect')\n .style('display', 'none');\n if (vertical)\n zoom_rect.attr('x', 0).attr('width', palette_width).attr('y', sel1).attr('height', 1);\n else\n zoom_rect.attr('x', sel1).attr('width', 1).attr('y', 0).attr('height', palette_height);\n\n d3_select(window).on('mousemove.colzoomRect', moveRectSel)\n .on('mouseup.colzoomRect', endRectSel, true);\n\n setTimeout(() => {\n if (!zoom_rect_visible && doing_zoom)\n moving_labels = framep.z_handle.processLabelsMove('start', last_pos);\n }, 500);\n }, assignHandlers = () => {\n this.draw_g.selectAll('.axis_zoom, .axis_labels')\n .on('mousedown', startRectSel)\n .on('dblclick', () => framep.unzoom('z'));\n\n if (settings.ZoomWheel)\n this.draw_g.on('wheel', evnt => {\n evnt.stopPropagation();\n evnt.preventDefault();\n\n let pos = d3_pointer(evnt, this.draw_g.node()),\n coord = vertical ? (1 - pos[1] / palette_height) : pos[0] / palette_width;\n\n let item = framep.z_handle.analyzeWheelEvent(evnt, coord);\n if (item.changed)\n framep.zoom('z', item.min, item.max);\n });\n };\n\n framep.z_handle.setAfterDrawHandler(assignHandlers);\n\n assignHandlers();\n });\n }\n\n /** @summary draw RPalette object */\n static async draw(dom, palette, opt) {\n let painter = new RPalettePainter(dom, palette, opt, 'palette');\n return ensureRCanvas(painter, false).then(() => {\n painter.createG(); // just create container, real drawing will be done by histogram\n return painter;\n });\n }\n\n} // class RPalettePainter\n\nexport { RPalettePainter, drawText, drawLine, drawBox, drawMarker };\n"],"x_google_ignoreList":[0]} \ No newline at end of file diff --git a/docs/142.90c84e92b8e7a333.js b/docs/267.7e1bf61fc32a98a5.js similarity index 99% rename from docs/142.90c84e92b8e7a333.js rename to docs/267.7e1bf61fc32a98a5.js index f2e0ec22f..9c755eaa5 100644 --- a/docs/142.90c84e92b8e7a333.js +++ b/docs/267.7e1bf61fc32a98a5.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[142],{6142:(Je,re,ae)=>{function R(n,e){var t=n.__state.conversionName.toString(),i=Math.round(n.r),o=Math.round(n.g),r=Math.round(n.b),d=n.a,l=Math.round(n.h),u=n.s.toFixed(1),f=n.v.toFixed(1);if(e||"THREE_CHAR_HEX"===t||"SIX_CHAR_HEX"===t){for(var m=n.hex.toString(16);m.length<6;)m="0"+m;return"#"+m}return"CSS_RGB"===t?"rgb("+i+","+o+","+r+")":"CSS_RGBA"===t?"rgba("+i+","+o+","+r+","+d+")":"HEX"===t?"0x"+n.hex.toString(16):"RGB_ARRAY"===t?"["+i+","+o+","+r+"]":"RGBA_ARRAY"===t?"["+i+","+o+","+r+","+d+"]":"RGB_OBJ"===t?"{r:"+i+",g:"+o+",b:"+r+"}":"RGBA_OBJ"===t?"{r:"+i+",g:"+o+",b:"+r+",a:"+d+"}":"HSV_OBJ"===t?"{h:"+l+",s:"+u+",v:"+f+"}":"HSVA_OBJ"===t?"{h:"+l+",s:"+u+",v:"+f+",a:"+d+"}":"unknown format"}ae.r(re),ae.d(re,{GUI:()=>Oe,color:()=>Ee,controllers:()=>Ae,default:()=>We,dom:()=>Se,gui:()=>ke});var se=Array.prototype.forEach,N=Array.prototype.slice,s={BREAK:{},extend:function(e){return this.each(N.call(arguments,1),function(t){(this.isObject(t)?Object.keys(t):[]).forEach(function(o){this.isUndefined(t[o])||(e[o]=t[o])}.bind(this))},this),e},defaults:function(e){return this.each(N.call(arguments,1),function(t){(this.isObject(t)?Object.keys(t):[]).forEach(function(o){this.isUndefined(e[o])&&(e[o]=t[o])}.bind(this))},this),e},compose:function(){var e=N.call(arguments);return function(){for(var t=N.call(arguments),i=e.length-1;i>=0;i--)t=[e[i].apply(this,t)];return t[0]}},each:function(e,t,i){if(e)if(se&&e.forEach&&e.forEach===se)e.forEach(t,i);else if(e.length===e.length+0){var r,o=void 0;for(o=0,r=e.length;o1?s.toArray(arguments):arguments[0];return s.each(Re,function(t){if(t.litmus(e))return s.each(t.conversions,function(i,o){if(F=i.read(e),!1===G&&!1!==F)return G=F,F.conversionName=o,F.conversion=i,s.BREAK}),s.BREAK}),G},de=void 0,H={hsv_to_rgb:function(e,t,i){var o=Math.floor(e/60)%6,r=e/60-Math.floor(e/60),d=i*(1-t),l=i*(1-r*t),u=i*(1-(1-r)*t),f=[[i,u,d],[l,i,d],[d,i,u],[d,l,i],[u,d,i],[i,d,l]][o];return{r:255*f[0],g:255*f[1],b:255*f[2]}},rgb_to_hsv:function(e,t,i){var o=Math.min(e,t,i),r=Math.max(e,t,i),d=r-o,l=void 0;return 0===r?{h:NaN,s:0,v:0}:(l=e===r?(t-i)/d:t===r?2+(i-e)/d:4+(e-t)/d,(l/=6)<0&&(l+=1),{h:360*l,s:d/r,v:r/255})},rgb_to_hex:function(e,t,i){var o=this.hex_with_component(0,2,e);return o=this.hex_with_component(o,1,t),this.hex_with_component(o,0,i)},component_from_hex:function(e,t){return e>>8*t&255},hex_with_component:function(e,t,i){return i<<(de=8*t)|e&~(255<-1?e.length-e.indexOf(".")-1:0}var Q=function(n){function e(t,i,o){y(this,e);var r=S(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i)),d=o||{};return r.__min=d.min,r.__max=d.max,r.__step=d.step,r.__impliedStep=s.isUndefined(r.__step)?0===r.initialValue?1:Math.pow(10,Math.floor(Math.log(Math.abs(r.initialValue))/Math.LN10))/10:r.__step,r.__precision=fe(r.__impliedStep),r}return A(e,n),w(e,[{key:"setValue",value:function(i){var o=i;return void 0!==this.__min&&othis.__max&&(o=this.__max),void 0!==this.__step&&o%this.__step!=0&&(o=Math.round(o/this.__step)*this.__step),E(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"setValue",this).call(this,o)}},{key:"min",value:function(i){return this.__min=i,this}},{key:"max",value:function(i){return this.__max=i,this}},{key:"step",value:function(i){return this.__step=i,this.__impliedStep=i,this.__precision=fe(i),this}}]),e}(k),D=function(n){function e(t,i,o){y(this,e);var r=S(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i,o));r.__truncationSuspended=!1;var d=r,l=void 0;function f(){d.__onFinishChange&&d.__onFinishChange.call(d,d.getValue())}function c(b){var _=l-b.clientY;d.setValue(d.getValue()+_*d.__impliedStep),l=b.clientY}function p(){a.unbind(window,"mousemove",c),a.unbind(window,"mouseup",p),f()}return r.__input=document.createElement("input"),r.__input.setAttribute("type","text"),a.bind(r.__input,"change",function u(){var b=parseFloat(d.__input.value);s.isNaN(b)||d.setValue(b)}),a.bind(r.__input,"blur",function m(){f()}),a.bind(r.__input,"mousedown",function x(b){a.bind(window,"mousemove",c),a.bind(window,"mouseup",p),l=b.clientY}),a.bind(r.__input,"keydown",function(b){13===b.keyCode&&(d.__truncationSuspended=!0,this.blur(),d.__truncationSuspended=!1,f())}),r.updateDisplay(),r.domElement.appendChild(r.__input),r}return A(e,n),w(e,[{key:"updateDisplay",value:function(){return this.__input.value=this.__truncationSuspended?this.getValue():function Fe(n,e){var t=Math.pow(10,e);return Math.round(n*t)/t}(this.getValue(),this.__precision),E(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"updateDisplay",this).call(this)}}]),e}(Q);function _e(n,e,t,i,o){return i+(n-e)/(t-e)*(o-i)}var X=function(n){function e(t,i,o,r,d){y(this,e);var l=S(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i,{min:o,max:r,step:d})),u=l;function m(_){_.preventDefault();var v=u.__background.getBoundingClientRect();return u.setValue(_e(_.clientX,v.left,v.right,u.__min,u.__max)),!1}function c(){a.unbind(window,"mousemove",m),a.unbind(window,"mouseup",c),u.__onFinishChange&&u.__onFinishChange.call(u,u.getValue())}function x(_){var v=_.touches[0].clientX,O=u.__background.getBoundingClientRect();u.setValue(_e(v,O.left,O.right,u.__min,u.__max))}function b(){a.unbind(window,"touchmove",x),a.unbind(window,"touchend",b),u.__onFinishChange&&u.__onFinishChange.call(u,u.getValue())}return l.__background=document.createElement("div"),l.__foreground=document.createElement("div"),a.bind(l.__background,"mousedown",function f(_){document.activeElement.blur(),a.bind(window,"mousemove",m),a.bind(window,"mouseup",c),m(_)}),a.bind(l.__background,"touchstart",function p(_){1===_.touches.length&&(a.bind(window,"touchmove",x),a.bind(window,"touchend",b),x(_))}),a.addClass(l.__background,"slider"),a.addClass(l.__foreground,"slider-fg"),l.updateDisplay(),l.__background.appendChild(l.__foreground),l.domElement.appendChild(l.__background),l}return A(e,n),w(e,[{key:"updateDisplay",value:function(){var i=(this.getValue()-this.__min)/(this.__max-this.__min);return this.__foreground.style.width=100*i+"%",E(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"updateDisplay",this).call(this)}}]),e}(Q),q=function(n){function e(t,i,o){y(this,e);var r=S(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i)),d=r;return r.__button=document.createElement("div"),r.__button.innerHTML=void 0===o?"Fire":o,a.bind(r.__button,"click",function(l){return l.preventDefault(),d.fire(),!1}),a.addClass(r.__button,"button"),r.domElement.appendChild(r.__button),r}return A(e,n),w(e,[{key:"fire",value:function(){this.__onChange&&this.__onChange.call(this),this.getValue().call(this.object),this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue())}}]),e}(k),j=function(n){function e(t,i){y(this,e);var o=S(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i));o.__color=new g(o.getValue()),o.__temp=new g(0);var r=o;o.domElement=document.createElement("div"),a.makeSelectable(o.domElement,!1),o.__selector=document.createElement("div"),o.__selector.className="selector",o.__saturation_field=document.createElement("div"),o.__saturation_field.className="saturation-field",o.__field_knob=document.createElement("div"),o.__field_knob.className="field-knob",o.__field_knob_border="2px solid ",o.__hue_knob=document.createElement("div"),o.__hue_knob.className="hue-knob",o.__hue_field=document.createElement("div"),o.__hue_field.className="hue-field",o.__input=document.createElement("input"),o.__input.type="text",o.__input_textShadow="0 1px 1px ",a.bind(o.__input,"keydown",function(_){13===_.keyCode&&c.call(this)}),a.bind(o.__input,"blur",c),a.bind(o.__selector,"mousedown",function(){a.addClass(this,"drag").bind(window,"mouseup",function(){a.removeClass(r.__selector,"drag")})}),a.bind(o.__selector,"touchstart",function(){a.addClass(this,"drag").bind(window,"touchend",function(){a.removeClass(r.__selector,"drag")})});var d=document.createElement("div");function l(_){x(_),a.bind(window,"mousemove",x),a.bind(window,"touchmove",x),a.bind(window,"mouseup",f),a.bind(window,"touchend",f)}function u(_){b(_),a.bind(window,"mousemove",b),a.bind(window,"touchmove",b),a.bind(window,"mouseup",m),a.bind(window,"touchend",m)}function f(){a.unbind(window,"mousemove",x),a.unbind(window,"touchmove",x),a.unbind(window,"mouseup",f),a.unbind(window,"touchend",f),p()}function m(){a.unbind(window,"mousemove",b),a.unbind(window,"touchmove",b),a.unbind(window,"mouseup",m),a.unbind(window,"touchend",m),p()}function c(){var _=$(this.value);!1!==_?(r.__color.__state=_,r.setValue(r.__color.toOriginal())):this.value=r.__color.toString()}function p(){r.__onFinishChange&&r.__onFinishChange.call(r,r.__color.toOriginal())}function x(_){-1===_.type.indexOf("touch")&&_.preventDefault();var v=r.__saturation_field.getBoundingClientRect(),O=_.touches&&_.touches[0]||_,z=(O.clientX-v.left)/(v.right-v.left),U=1-(O.clientY-v.top)/(v.bottom-v.top);return U>1?U=1:U<0&&(U=0),z>1?z=1:z<0&&(z=0),r.__color.v=U,r.__color.s=z,r.setValue(r.__color.toOriginal()),!1}function b(_){-1===_.type.indexOf("touch")&&_.preventDefault();var v=r.__hue_field.getBoundingClientRect(),T=1-((_.touches&&_.touches[0]||_).clientY-v.top)/(v.bottom-v.top);return T>1?T=1:T<0&&(T=0),r.__color.h=360*T,r.setValue(r.__color.toOriginal()),!1}return s.extend(o.__selector.style,{width:"122px",height:"102px",padding:"3px",backgroundColor:"#222",boxShadow:"0px 1px 3px rgba(0,0,0,0.3)"}),s.extend(o.__field_knob.style,{position:"absolute",width:"12px",height:"12px",border:o.__field_knob_border+(o.__color.v<.5?"#fff":"#000"),boxShadow:"0px 1px 3px rgba(0,0,0,0.5)",borderRadius:"12px",zIndex:1}),s.extend(o.__hue_knob.style,{position:"absolute",width:"15px",height:"2px",borderRight:"4px solid #fff",zIndex:1}),s.extend(o.__saturation_field.style,{width:"100px",height:"100px",border:"1px solid #555",marginRight:"3px",display:"inline-block",cursor:"pointer"}),s.extend(d.style,{width:"100%",height:"100%",background:"none"}),he(d,"top","rgba(0,0,0,0)","#000"),s.extend(o.__hue_field.style,{width:"15px",height:"100px",border:"1px solid #555",cursor:"ns-resize",position:"absolute",top:"3px",right:"3px"}),function De(n){n.style.background="",n.style.cssText+="background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);",n.style.cssText+="background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",n.style.cssText+="background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",n.style.cssText+="background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",n.style.cssText+="background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);"}(o.__hue_field),s.extend(o.__input.style,{outline:"none",textAlign:"center",color:"#fff",border:0,fontWeight:"bold",textShadow:o.__input_textShadow+"rgba(0,0,0,0.7)"}),a.bind(o.__saturation_field,"mousedown",l),a.bind(o.__saturation_field,"touchstart",l),a.bind(o.__field_knob,"mousedown",l),a.bind(o.__field_knob,"touchstart",l),a.bind(o.__hue_field,"mousedown",u),a.bind(o.__hue_field,"touchstart",u),o.__saturation_field.appendChild(d),o.__selector.appendChild(o.__field_knob),o.__selector.appendChild(o.__saturation_field),o.__selector.appendChild(o.__hue_field),o.__hue_field.appendChild(o.__hue_knob),o.domElement.appendChild(o.__input),o.domElement.appendChild(o.__selector),o.updateDisplay(),o}return A(e,n),w(e,[{key:"updateDisplay",value:function(){var i=$(this.getValue());if(!1!==i){var o=!1;s.each(g.COMPONENTS,function(l){if(!s.isUndefined(i[l])&&!s.isUndefined(this.__color.__state[l])&&i[l]!==this.__color.__state[l])return o=!0,{}},this),o&&s.extend(this.__color.__state,i)}s.extend(this.__temp.__state,this.__color.__state),this.__temp.a=1;var r=this.__color.v<.5||this.__color.s>.5?255:0,d=255-r;s.extend(this.__field_knob.style,{marginLeft:100*this.__color.s-7+"px",marginTop:100*(1-this.__color.v)-7+"px",backgroundColor:this.__temp.toHexString(),border:this.__field_knob_border+"rgb("+r+","+r+","+r+")"}),this.__hue_knob.style.marginTop=100*(1-this.__color.h/360)+"px",this.__temp.s=1,this.__temp.v=1,he(this.__saturation_field,"left","#fff",this.__temp.toHexString()),this.__input.value=this.__color.toString(),s.extend(this.__input.style,{backgroundColor:this.__color.toHexString(),color:"rgb("+r+","+r+","+r+")",textShadow:this.__input_textShadow+"rgba("+d+","+d+","+d+",.7)"})}}]),e}(k),He=["-moz-","-o-","-webkit-","-ms-",""];function he(n,e,t,i){n.style.background="",s.each(He,function(o){n.style.cssText+="background: "+o+"linear-gradient("+e+", "+t+" 0%, "+i+" 100%); "})}var Ve='
\n\n Here\'s the new load parameter for your GUI\'s constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI\'s constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
\n\n
\n\n
',Ie=function(e,t){var i=e[t];return s.isArray(arguments[2])||s.isObject(arguments[2])?new ue(e,t,arguments[2]):s.isNumber(i)?s.isNumber(arguments[2])&&s.isNumber(arguments[3])?s.isNumber(arguments[4])?new X(e,t,arguments[2],arguments[3],arguments[4]):new X(e,t,arguments[2],arguments[3]):s.isNumber(arguments[4])?new D(e,t,{min:arguments[2],max:arguments[3],step:arguments[4]}):new D(e,t,{min:arguments[2],max:arguments[3]}):s.isString(i)?new ce(e,t):s.isFunction(i)?new q(e,t,""):s.isBoolean(i)?new J(e,t):null},ze=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function Me(n){setTimeout(n,1e3/60)},Ue=function(){function n(){y(this,n),this.backgroundElement=document.createElement("div"),s.extend(this.backgroundElement.style,{backgroundColor:"rgba(0,0,0,0.8)",top:0,left:0,display:"none",zIndex:"1000",opacity:0,WebkitTransition:"opacity 0.2s linear",transition:"opacity 0.2s linear"}),a.makeFullscreen(this.backgroundElement),this.backgroundElement.style.position="fixed",this.domElement=document.createElement("div"),s.extend(this.domElement.style,{position:"fixed",display:"none",zIndex:"1001",opacity:0,WebkitTransition:"-webkit-transform 0.2s ease-out, opacity 0.2s linear",transition:"transform 0.2s ease-out, opacity 0.2s linear"}),document.body.appendChild(this.backgroundElement),document.body.appendChild(this.domElement);var e=this;a.bind(this.backgroundElement,"click",function(){e.hide()})}return w(n,[{key:"show",value:function(){var t=this;this.backgroundElement.style.display="block",this.domElement.style.display="block",this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)",this.layout(),s.defer(function(){t.backgroundElement.style.opacity=1,t.domElement.style.opacity=1,t.domElement.style.webkitTransform="scale(1)"})}},{key:"hide",value:function(){var t=this,i=function o(){t.domElement.style.display="none",t.backgroundElement.style.display="none",a.unbind(t.domElement,"webkitTransitionEnd",o),a.unbind(t.domElement,"transitionend",o),a.unbind(t.domElement,"oTransitionEnd",o)};a.bind(this.domElement,"webkitTransitionEnd",i),a.bind(this.domElement,"transitionend",i),a.bind(this.domElement,"oTransitionEnd",i),this.backgroundElement.style.opacity=0,this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)"}},{key:"layout",value:function(){this.domElement.style.left=window.innerWidth/2-a.getWidth(this.domElement)/2+"px",this.domElement.style.top=window.innerHeight/2-a.getHeight(this.domElement)/2+"px"}}]),n}();!function(e,t){var i=t||document,o=document.createElement("style");o.type="text/css",o.innerHTML=e;var r=i.getElementsByTagName("head")[0];try{r.appendChild(o)}catch{}}(function Te(n){if(n&&!(typeof window>"u")){var e=document.createElement("style");return e.setAttribute("type","text/css"),e.innerHTML=n,document.head.appendChild(e),n}}(".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .cr.function .property-name{width:100%}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n"));var P="Default",V=function(){try{return!!window.localStorage}catch{return!1}}(),I=void 0,be=!0,L=void 0,Z=!1,ve=[],h=function n(e){var t=this,i=e||{};this.domElement=document.createElement("div"),this.__ul=document.createElement("ul"),this.domElement.appendChild(this.__ul),a.addClass(this.domElement,"dg"),this.__folders={},this.__controllers=[],this.__rememberedObjects=[],this.__rememberedObjectIndecesToControllers=[],this.__listening=[],i=s.defaults(i,{closeOnTop:!1,autoPlace:!0,width:n.DEFAULT_WIDTH}),i=s.defaults(i,{resizable:i.autoPlace,hideable:i.autoPlace}),s.isUndefined(i.load)?i.load={preset:P}:i.preset&&(i.load.preset=i.preset),s.isUndefined(i.parent)&&i.hideable&&ve.push(this),i.resizable=s.isUndefined(i.parent)&&i.resizable,i.autoPlace&&s.isUndefined(i.scrollable)&&(i.scrollable=!0);var o=V&&"true"===localStorage.getItem(B(0,"isLocal")),r=void 0,d=void 0;if(Object.defineProperties(this,{parent:{get:function(){return i.parent}},scrollable:{get:function(){return i.scrollable}},autoPlace:{get:function(){return i.autoPlace}},closeOnTop:{get:function(){return i.closeOnTop}},preset:{get:function(){return t.parent?t.getRoot().preset:i.load.preset},set:function(p){t.parent?t.getRoot().preset=p:i.load.preset=p,function Ye(n){for(var e=0;e1){var l=t.__li.nextElementSibling;return t.remove(),M(n,t.object,t.property,{before:l,factoryArgs:[s.toArray(arguments)]})}if(s.isArray(d)||s.isObject(d)){var u=t.__li.nextElementSibling;return t.remove(),M(n,t.object,t.property,{before:u,factoryArgs:[d]})}},name:function(d){return t.__li.firstElementChild.firstElementChild.innerHTML=d,t},listen:function(){return t.__gui.listen(t),t},remove:function(){return t.__gui.remove(t),t}}),t instanceof X){var i=new D(t.object,t.property,{min:t.__min,max:t.__max,step:t.__step});s.each(["updateDisplay","onChange","onFinishChange","step","min","max"],function(r){var d=t[r],l=i[r];t[r]=i[r]=function(){var u=Array.prototype.slice.call(arguments);return l.apply(i,u),d.apply(t,u)}}),a.addClass(e,"has-slider"),t.domElement.insertBefore(i.domElement,t.domElement.firstElementChild)}else if(t instanceof D){var o=function(d){if(s.isNumber(t.__min)&&s.isNumber(t.__max)){var l=t.__li.firstElementChild.firstElementChild.innerHTML,u=t.__gui.__listening.indexOf(t)>-1;t.remove();var f=M(n,t.object,t.property,{before:t.__li.nextElementSibling,factoryArgs:[t.__min,t.__max,t.__step]});return f.name(l),u&&f.listen(),f}return d};t.min=s.compose(o,t.min),t.max=s.compose(o,t.max)}else t instanceof J?(a.bind(e,"click",function(){a.fakeEvent(t.__checkbox,"click")}),a.bind(t.__checkbox,"click",function(r){r.stopPropagation()})):t instanceof q?(a.bind(e,"click",function(){a.fakeEvent(t.__button,"click")}),a.bind(e,"mouseover",function(){a.addClass(t.__button,"hover")}),a.bind(e,"mouseout",function(){a.removeClass(t.__button,"hover")})):t instanceof j&&(a.addClass(e,"color"),t.updateDisplay=s.compose(function(r){return e.style.borderLeftColor=t.__color.toString(),r},t.updateDisplay),t.updateDisplay());t.setValue=s.compose(function(r){return n.getRoot().__preset_select&&t.isModified()&&te(n.getRoot(),!0),r},t.setValue)}(n,u,o),n.__controllers.push(o),o}function B(n,e){return document.location.href+"."+e}function ne(n,e,t){var i=document.createElement("option");i.innerHTML=e,i.value=e,n.__preset_select.appendChild(i),t&&(n.__preset_select.selectedIndex=n.__preset_select.length-1)}function xe(n,e){e.style.display=n.useLocalStorage?"block":"none"}function Xe(n){var e=n.__save_row=document.createElement("li");a.addClass(n.domElement,"has-save"),n.__ul.insertBefore(e,n.__ul.firstChild),a.addClass(e,"save-row");var t=document.createElement("span");t.innerHTML=" ",a.addClass(t,"button gears");var i=document.createElement("span");i.innerHTML="Save",a.addClass(i,"button"),a.addClass(i,"save");var o=document.createElement("span");o.innerHTML="New",a.addClass(o,"button"),a.addClass(o,"save-as");var r=document.createElement("span");r.innerHTML="Revert",a.addClass(r,"button"),a.addClass(r,"revert");var d=n.__preset_select=document.createElement("select");if(n.load&&n.load.remembered?s.each(n.load.remembered,function(c,p){ne(n,p,p===n.preset)}):ne(n,P,!1),a.bind(d,"change",function(){for(var c=0;c0&&(e.preset=this.preset,e.remembered||(e.remembered={}),e.remembered[this.preset]=Y(this)),e.folders={},s.each(this.__folders,function(t,i){e.folders[i]=t.getSaveObject()}),e},save:function(){this.load.remembered||(this.load.remembered={}),this.load.remembered[this.preset]=Y(this),te(this,!1),this.saveToLocalStorageIfPossible()},saveAs:function(e){this.load.remembered||(this.load.remembered={},this.load.remembered[P]=Y(this,!0)),this.load.remembered[e]=Y(this),this.preset=e,ne(this,e,!0),this.saveToLocalStorageIfPossible()},revert:function(e){s.each(this.__controllers,function(t){this.getRoot().load.remembered?we(e||this.getRoot(),t):t.setValue(t.initialValue),t.__onFinishChange&&t.__onFinishChange.call(t,t.getValue())},this),s.each(this.__folders,function(t){t.revert(t)}),e||te(this.getRoot(),!1)},listen:function(e){var t=0===this.__listening.length;this.__listening.push(e),t&&Ce(this.__listening)},updateDisplay:function(){s.each(this.__controllers,function(e){e.updateDisplay()}),s.each(this.__folders,function(e){e.updateDisplay()})}});var Ee={Color:g,math:H,interpret:$},Ae={Controller:k,BooleanController:J,OptionController:ue,StringController:ce,NumberController:Q,NumberControllerBox:D,NumberControllerSlider:X,FunctionController:q,ColorController:j},Se={dom:a},ke={GUI:h},Oe=h;const We={color:Ee,controllers:Ae,dom:Se,gui:ke,GUI:h}}}]); -//# sourceMappingURL=142.90c84e92b8e7a333.js.map \ No newline at end of file +"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[267],{8267:(Je,re,ae)=>{function R(n,e){var t=n.__state.conversionName.toString(),i=Math.round(n.r),o=Math.round(n.g),r=Math.round(n.b),d=n.a,l=Math.round(n.h),u=n.s.toFixed(1),f=n.v.toFixed(1);if(e||"THREE_CHAR_HEX"===t||"SIX_CHAR_HEX"===t){for(var m=n.hex.toString(16);m.length<6;)m="0"+m;return"#"+m}return"CSS_RGB"===t?"rgb("+i+","+o+","+r+")":"CSS_RGBA"===t?"rgba("+i+","+o+","+r+","+d+")":"HEX"===t?"0x"+n.hex.toString(16):"RGB_ARRAY"===t?"["+i+","+o+","+r+"]":"RGBA_ARRAY"===t?"["+i+","+o+","+r+","+d+"]":"RGB_OBJ"===t?"{r:"+i+",g:"+o+",b:"+r+"}":"RGBA_OBJ"===t?"{r:"+i+",g:"+o+",b:"+r+",a:"+d+"}":"HSV_OBJ"===t?"{h:"+l+",s:"+u+",v:"+f+"}":"HSVA_OBJ"===t?"{h:"+l+",s:"+u+",v:"+f+",a:"+d+"}":"unknown format"}ae.r(re),ae.d(re,{GUI:()=>Oe,color:()=>Ee,controllers:()=>Ae,default:()=>We,dom:()=>Se,gui:()=>ke});var se=Array.prototype.forEach,N=Array.prototype.slice,s={BREAK:{},extend:function(e){return this.each(N.call(arguments,1),function(t){(this.isObject(t)?Object.keys(t):[]).forEach(function(o){this.isUndefined(t[o])||(e[o]=t[o])}.bind(this))},this),e},defaults:function(e){return this.each(N.call(arguments,1),function(t){(this.isObject(t)?Object.keys(t):[]).forEach(function(o){this.isUndefined(e[o])&&(e[o]=t[o])}.bind(this))},this),e},compose:function(){var e=N.call(arguments);return function(){for(var t=N.call(arguments),i=e.length-1;i>=0;i--)t=[e[i].apply(this,t)];return t[0]}},each:function(e,t,i){if(e)if(se&&e.forEach&&e.forEach===se)e.forEach(t,i);else if(e.length===e.length+0){var r,o=void 0;for(o=0,r=e.length;o1?s.toArray(arguments):arguments[0];return s.each(Re,function(t){if(t.litmus(e))return s.each(t.conversions,function(i,o){if(F=i.read(e),!1===G&&!1!==F)return G=F,F.conversionName=o,F.conversion=i,s.BREAK}),s.BREAK}),G},de=void 0,H={hsv_to_rgb:function(e,t,i){var o=Math.floor(e/60)%6,r=e/60-Math.floor(e/60),d=i*(1-t),l=i*(1-r*t),u=i*(1-(1-r)*t),f=[[i,u,d],[l,i,d],[d,i,u],[d,l,i],[u,d,i],[i,d,l]][o];return{r:255*f[0],g:255*f[1],b:255*f[2]}},rgb_to_hsv:function(e,t,i){var o=Math.min(e,t,i),r=Math.max(e,t,i),d=r-o,l=void 0;return 0===r?{h:NaN,s:0,v:0}:(l=e===r?(t-i)/d:t===r?2+(i-e)/d:4+(e-t)/d,(l/=6)<0&&(l+=1),{h:360*l,s:d/r,v:r/255})},rgb_to_hex:function(e,t,i){var o=this.hex_with_component(0,2,e);return o=this.hex_with_component(o,1,t),this.hex_with_component(o,0,i)},component_from_hex:function(e,t){return e>>8*t&255},hex_with_component:function(e,t,i){return i<<(de=8*t)|e&~(255<-1?e.length-e.indexOf(".")-1:0}var Q=function(n){function e(t,i,o){y(this,e);var r=S(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i)),d=o||{};return r.__min=d.min,r.__max=d.max,r.__step=d.step,r.__impliedStep=s.isUndefined(r.__step)?0===r.initialValue?1:Math.pow(10,Math.floor(Math.log(Math.abs(r.initialValue))/Math.LN10))/10:r.__step,r.__precision=fe(r.__impliedStep),r}return A(e,n),w(e,[{key:"setValue",value:function(i){var o=i;return void 0!==this.__min&&othis.__max&&(o=this.__max),void 0!==this.__step&&o%this.__step!=0&&(o=Math.round(o/this.__step)*this.__step),E(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"setValue",this).call(this,o)}},{key:"min",value:function(i){return this.__min=i,this}},{key:"max",value:function(i){return this.__max=i,this}},{key:"step",value:function(i){return this.__step=i,this.__impliedStep=i,this.__precision=fe(i),this}}]),e}(k),D=function(n){function e(t,i,o){y(this,e);var r=S(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i,o));r.__truncationSuspended=!1;var d=r,l=void 0;function f(){d.__onFinishChange&&d.__onFinishChange.call(d,d.getValue())}function c(b){var _=l-b.clientY;d.setValue(d.getValue()+_*d.__impliedStep),l=b.clientY}function p(){a.unbind(window,"mousemove",c),a.unbind(window,"mouseup",p),f()}return r.__input=document.createElement("input"),r.__input.setAttribute("type","text"),a.bind(r.__input,"change",function u(){var b=parseFloat(d.__input.value);s.isNaN(b)||d.setValue(b)}),a.bind(r.__input,"blur",function m(){f()}),a.bind(r.__input,"mousedown",function x(b){a.bind(window,"mousemove",c),a.bind(window,"mouseup",p),l=b.clientY}),a.bind(r.__input,"keydown",function(b){13===b.keyCode&&(d.__truncationSuspended=!0,this.blur(),d.__truncationSuspended=!1,f())}),r.updateDisplay(),r.domElement.appendChild(r.__input),r}return A(e,n),w(e,[{key:"updateDisplay",value:function(){return this.__input.value=this.__truncationSuspended?this.getValue():function Fe(n,e){var t=Math.pow(10,e);return Math.round(n*t)/t}(this.getValue(),this.__precision),E(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"updateDisplay",this).call(this)}}]),e}(Q);function _e(n,e,t,i,o){return i+(n-e)/(t-e)*(o-i)}var X=function(n){function e(t,i,o,r,d){y(this,e);var l=S(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i,{min:o,max:r,step:d})),u=l;function m(_){_.preventDefault();var v=u.__background.getBoundingClientRect();return u.setValue(_e(_.clientX,v.left,v.right,u.__min,u.__max)),!1}function c(){a.unbind(window,"mousemove",m),a.unbind(window,"mouseup",c),u.__onFinishChange&&u.__onFinishChange.call(u,u.getValue())}function x(_){var v=_.touches[0].clientX,O=u.__background.getBoundingClientRect();u.setValue(_e(v,O.left,O.right,u.__min,u.__max))}function b(){a.unbind(window,"touchmove",x),a.unbind(window,"touchend",b),u.__onFinishChange&&u.__onFinishChange.call(u,u.getValue())}return l.__background=document.createElement("div"),l.__foreground=document.createElement("div"),a.bind(l.__background,"mousedown",function f(_){document.activeElement.blur(),a.bind(window,"mousemove",m),a.bind(window,"mouseup",c),m(_)}),a.bind(l.__background,"touchstart",function p(_){1===_.touches.length&&(a.bind(window,"touchmove",x),a.bind(window,"touchend",b),x(_))}),a.addClass(l.__background,"slider"),a.addClass(l.__foreground,"slider-fg"),l.updateDisplay(),l.__background.appendChild(l.__foreground),l.domElement.appendChild(l.__background),l}return A(e,n),w(e,[{key:"updateDisplay",value:function(){var i=(this.getValue()-this.__min)/(this.__max-this.__min);return this.__foreground.style.width=100*i+"%",E(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"updateDisplay",this).call(this)}}]),e}(Q),q=function(n){function e(t,i,o){y(this,e);var r=S(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i)),d=r;return r.__button=document.createElement("div"),r.__button.innerHTML=void 0===o?"Fire":o,a.bind(r.__button,"click",function(l){return l.preventDefault(),d.fire(),!1}),a.addClass(r.__button,"button"),r.domElement.appendChild(r.__button),r}return A(e,n),w(e,[{key:"fire",value:function(){this.__onChange&&this.__onChange.call(this),this.getValue().call(this.object),this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue())}}]),e}(k),j=function(n){function e(t,i){y(this,e);var o=S(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t,i));o.__color=new g(o.getValue()),o.__temp=new g(0);var r=o;o.domElement=document.createElement("div"),a.makeSelectable(o.domElement,!1),o.__selector=document.createElement("div"),o.__selector.className="selector",o.__saturation_field=document.createElement("div"),o.__saturation_field.className="saturation-field",o.__field_knob=document.createElement("div"),o.__field_knob.className="field-knob",o.__field_knob_border="2px solid ",o.__hue_knob=document.createElement("div"),o.__hue_knob.className="hue-knob",o.__hue_field=document.createElement("div"),o.__hue_field.className="hue-field",o.__input=document.createElement("input"),o.__input.type="text",o.__input_textShadow="0 1px 1px ",a.bind(o.__input,"keydown",function(_){13===_.keyCode&&c.call(this)}),a.bind(o.__input,"blur",c),a.bind(o.__selector,"mousedown",function(){a.addClass(this,"drag").bind(window,"mouseup",function(){a.removeClass(r.__selector,"drag")})}),a.bind(o.__selector,"touchstart",function(){a.addClass(this,"drag").bind(window,"touchend",function(){a.removeClass(r.__selector,"drag")})});var d=document.createElement("div");function l(_){x(_),a.bind(window,"mousemove",x),a.bind(window,"touchmove",x),a.bind(window,"mouseup",f),a.bind(window,"touchend",f)}function u(_){b(_),a.bind(window,"mousemove",b),a.bind(window,"touchmove",b),a.bind(window,"mouseup",m),a.bind(window,"touchend",m)}function f(){a.unbind(window,"mousemove",x),a.unbind(window,"touchmove",x),a.unbind(window,"mouseup",f),a.unbind(window,"touchend",f),p()}function m(){a.unbind(window,"mousemove",b),a.unbind(window,"touchmove",b),a.unbind(window,"mouseup",m),a.unbind(window,"touchend",m),p()}function c(){var _=$(this.value);!1!==_?(r.__color.__state=_,r.setValue(r.__color.toOriginal())):this.value=r.__color.toString()}function p(){r.__onFinishChange&&r.__onFinishChange.call(r,r.__color.toOriginal())}function x(_){-1===_.type.indexOf("touch")&&_.preventDefault();var v=r.__saturation_field.getBoundingClientRect(),O=_.touches&&_.touches[0]||_,z=(O.clientX-v.left)/(v.right-v.left),U=1-(O.clientY-v.top)/(v.bottom-v.top);return U>1?U=1:U<0&&(U=0),z>1?z=1:z<0&&(z=0),r.__color.v=U,r.__color.s=z,r.setValue(r.__color.toOriginal()),!1}function b(_){-1===_.type.indexOf("touch")&&_.preventDefault();var v=r.__hue_field.getBoundingClientRect(),T=1-((_.touches&&_.touches[0]||_).clientY-v.top)/(v.bottom-v.top);return T>1?T=1:T<0&&(T=0),r.__color.h=360*T,r.setValue(r.__color.toOriginal()),!1}return s.extend(o.__selector.style,{width:"122px",height:"102px",padding:"3px",backgroundColor:"#222",boxShadow:"0px 1px 3px rgba(0,0,0,0.3)"}),s.extend(o.__field_knob.style,{position:"absolute",width:"12px",height:"12px",border:o.__field_knob_border+(o.__color.v<.5?"#fff":"#000"),boxShadow:"0px 1px 3px rgba(0,0,0,0.5)",borderRadius:"12px",zIndex:1}),s.extend(o.__hue_knob.style,{position:"absolute",width:"15px",height:"2px",borderRight:"4px solid #fff",zIndex:1}),s.extend(o.__saturation_field.style,{width:"100px",height:"100px",border:"1px solid #555",marginRight:"3px",display:"inline-block",cursor:"pointer"}),s.extend(d.style,{width:"100%",height:"100%",background:"none"}),he(d,"top","rgba(0,0,0,0)","#000"),s.extend(o.__hue_field.style,{width:"15px",height:"100px",border:"1px solid #555",cursor:"ns-resize",position:"absolute",top:"3px",right:"3px"}),function De(n){n.style.background="",n.style.cssText+="background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);",n.style.cssText+="background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",n.style.cssText+="background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",n.style.cssText+="background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",n.style.cssText+="background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);"}(o.__hue_field),s.extend(o.__input.style,{outline:"none",textAlign:"center",color:"#fff",border:0,fontWeight:"bold",textShadow:o.__input_textShadow+"rgba(0,0,0,0.7)"}),a.bind(o.__saturation_field,"mousedown",l),a.bind(o.__saturation_field,"touchstart",l),a.bind(o.__field_knob,"mousedown",l),a.bind(o.__field_knob,"touchstart",l),a.bind(o.__hue_field,"mousedown",u),a.bind(o.__hue_field,"touchstart",u),o.__saturation_field.appendChild(d),o.__selector.appendChild(o.__field_knob),o.__selector.appendChild(o.__saturation_field),o.__selector.appendChild(o.__hue_field),o.__hue_field.appendChild(o.__hue_knob),o.domElement.appendChild(o.__input),o.domElement.appendChild(o.__selector),o.updateDisplay(),o}return A(e,n),w(e,[{key:"updateDisplay",value:function(){var i=$(this.getValue());if(!1!==i){var o=!1;s.each(g.COMPONENTS,function(l){if(!s.isUndefined(i[l])&&!s.isUndefined(this.__color.__state[l])&&i[l]!==this.__color.__state[l])return o=!0,{}},this),o&&s.extend(this.__color.__state,i)}s.extend(this.__temp.__state,this.__color.__state),this.__temp.a=1;var r=this.__color.v<.5||this.__color.s>.5?255:0,d=255-r;s.extend(this.__field_knob.style,{marginLeft:100*this.__color.s-7+"px",marginTop:100*(1-this.__color.v)-7+"px",backgroundColor:this.__temp.toHexString(),border:this.__field_knob_border+"rgb("+r+","+r+","+r+")"}),this.__hue_knob.style.marginTop=100*(1-this.__color.h/360)+"px",this.__temp.s=1,this.__temp.v=1,he(this.__saturation_field,"left","#fff",this.__temp.toHexString()),this.__input.value=this.__color.toString(),s.extend(this.__input.style,{backgroundColor:this.__color.toHexString(),color:"rgb("+r+","+r+","+r+")",textShadow:this.__input_textShadow+"rgba("+d+","+d+","+d+",.7)"})}}]),e}(k),He=["-moz-","-o-","-webkit-","-ms-",""];function he(n,e,t,i){n.style.background="",s.each(He,function(o){n.style.cssText+="background: "+o+"linear-gradient("+e+", "+t+" 0%, "+i+" 100%); "})}var Ve='
\n\n Here\'s the new load parameter for your GUI\'s constructor:\n\n \n\n
\n\n Automatically save\n values to localStorage on exit.\n\n
The values saved to localStorage will\n override those passed to dat.GUI\'s constructor. This makes it\n easier to work incrementally, but localStorage is fragile,\n and your friends may not see the same values you do.\n\n
\n\n
\n\n
',Ie=function(e,t){var i=e[t];return s.isArray(arguments[2])||s.isObject(arguments[2])?new ue(e,t,arguments[2]):s.isNumber(i)?s.isNumber(arguments[2])&&s.isNumber(arguments[3])?s.isNumber(arguments[4])?new X(e,t,arguments[2],arguments[3],arguments[4]):new X(e,t,arguments[2],arguments[3]):s.isNumber(arguments[4])?new D(e,t,{min:arguments[2],max:arguments[3],step:arguments[4]}):new D(e,t,{min:arguments[2],max:arguments[3]}):s.isString(i)?new ce(e,t):s.isFunction(i)?new q(e,t,""):s.isBoolean(i)?new J(e,t):null},ze=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function Me(n){setTimeout(n,1e3/60)},Ue=function(){function n(){y(this,n),this.backgroundElement=document.createElement("div"),s.extend(this.backgroundElement.style,{backgroundColor:"rgba(0,0,0,0.8)",top:0,left:0,display:"none",zIndex:"1000",opacity:0,WebkitTransition:"opacity 0.2s linear",transition:"opacity 0.2s linear"}),a.makeFullscreen(this.backgroundElement),this.backgroundElement.style.position="fixed",this.domElement=document.createElement("div"),s.extend(this.domElement.style,{position:"fixed",display:"none",zIndex:"1001",opacity:0,WebkitTransition:"-webkit-transform 0.2s ease-out, opacity 0.2s linear",transition:"transform 0.2s ease-out, opacity 0.2s linear"}),document.body.appendChild(this.backgroundElement),document.body.appendChild(this.domElement);var e=this;a.bind(this.backgroundElement,"click",function(){e.hide()})}return w(n,[{key:"show",value:function(){var t=this;this.backgroundElement.style.display="block",this.domElement.style.display="block",this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)",this.layout(),s.defer(function(){t.backgroundElement.style.opacity=1,t.domElement.style.opacity=1,t.domElement.style.webkitTransform="scale(1)"})}},{key:"hide",value:function(){var t=this,i=function o(){t.domElement.style.display="none",t.backgroundElement.style.display="none",a.unbind(t.domElement,"webkitTransitionEnd",o),a.unbind(t.domElement,"transitionend",o),a.unbind(t.domElement,"oTransitionEnd",o)};a.bind(this.domElement,"webkitTransitionEnd",i),a.bind(this.domElement,"transitionend",i),a.bind(this.domElement,"oTransitionEnd",i),this.backgroundElement.style.opacity=0,this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)"}},{key:"layout",value:function(){this.domElement.style.left=window.innerWidth/2-a.getWidth(this.domElement)/2+"px",this.domElement.style.top=window.innerHeight/2-a.getHeight(this.domElement)/2+"px"}}]),n}();!function(e,t){var i=t||document,o=document.createElement("style");o.type="text/css",o.innerHTML=e;var r=i.getElementsByTagName("head")[0];try{r.appendChild(o)}catch{}}(function Te(n){if(n&&!(typeof window>"u")){var e=document.createElement("style");return e.setAttribute("type","text/css"),e.innerHTML=n,document.head.appendChild(e),n}}(".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .cr.function .property-name{width:100%}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n"));var P="Default",V=function(){try{return!!window.localStorage}catch{return!1}}(),I=void 0,be=!0,L=void 0,Z=!1,ve=[],h=function n(e){var t=this,i=e||{};this.domElement=document.createElement("div"),this.__ul=document.createElement("ul"),this.domElement.appendChild(this.__ul),a.addClass(this.domElement,"dg"),this.__folders={},this.__controllers=[],this.__rememberedObjects=[],this.__rememberedObjectIndecesToControllers=[],this.__listening=[],i=s.defaults(i,{closeOnTop:!1,autoPlace:!0,width:n.DEFAULT_WIDTH}),i=s.defaults(i,{resizable:i.autoPlace,hideable:i.autoPlace}),s.isUndefined(i.load)?i.load={preset:P}:i.preset&&(i.load.preset=i.preset),s.isUndefined(i.parent)&&i.hideable&&ve.push(this),i.resizable=s.isUndefined(i.parent)&&i.resizable,i.autoPlace&&s.isUndefined(i.scrollable)&&(i.scrollable=!0);var o=V&&"true"===localStorage.getItem(B(0,"isLocal")),r=void 0,d=void 0;if(Object.defineProperties(this,{parent:{get:function(){return i.parent}},scrollable:{get:function(){return i.scrollable}},autoPlace:{get:function(){return i.autoPlace}},closeOnTop:{get:function(){return i.closeOnTop}},preset:{get:function(){return t.parent?t.getRoot().preset:i.load.preset},set:function(p){t.parent?t.getRoot().preset=p:i.load.preset=p,function Ye(n){for(var e=0;e1){var l=t.__li.nextElementSibling;return t.remove(),M(n,t.object,t.property,{before:l,factoryArgs:[s.toArray(arguments)]})}if(s.isArray(d)||s.isObject(d)){var u=t.__li.nextElementSibling;return t.remove(),M(n,t.object,t.property,{before:u,factoryArgs:[d]})}},name:function(d){return t.__li.firstElementChild.firstElementChild.innerHTML=d,t},listen:function(){return t.__gui.listen(t),t},remove:function(){return t.__gui.remove(t),t}}),t instanceof X){var i=new D(t.object,t.property,{min:t.__min,max:t.__max,step:t.__step});s.each(["updateDisplay","onChange","onFinishChange","step","min","max"],function(r){var d=t[r],l=i[r];t[r]=i[r]=function(){var u=Array.prototype.slice.call(arguments);return l.apply(i,u),d.apply(t,u)}}),a.addClass(e,"has-slider"),t.domElement.insertBefore(i.domElement,t.domElement.firstElementChild)}else if(t instanceof D){var o=function(d){if(s.isNumber(t.__min)&&s.isNumber(t.__max)){var l=t.__li.firstElementChild.firstElementChild.innerHTML,u=t.__gui.__listening.indexOf(t)>-1;t.remove();var f=M(n,t.object,t.property,{before:t.__li.nextElementSibling,factoryArgs:[t.__min,t.__max,t.__step]});return f.name(l),u&&f.listen(),f}return d};t.min=s.compose(o,t.min),t.max=s.compose(o,t.max)}else t instanceof J?(a.bind(e,"click",function(){a.fakeEvent(t.__checkbox,"click")}),a.bind(t.__checkbox,"click",function(r){r.stopPropagation()})):t instanceof q?(a.bind(e,"click",function(){a.fakeEvent(t.__button,"click")}),a.bind(e,"mouseover",function(){a.addClass(t.__button,"hover")}),a.bind(e,"mouseout",function(){a.removeClass(t.__button,"hover")})):t instanceof j&&(a.addClass(e,"color"),t.updateDisplay=s.compose(function(r){return e.style.borderLeftColor=t.__color.toString(),r},t.updateDisplay),t.updateDisplay());t.setValue=s.compose(function(r){return n.getRoot().__preset_select&&t.isModified()&&te(n.getRoot(),!0),r},t.setValue)}(n,u,o),n.__controllers.push(o),o}function B(n,e){return document.location.href+"."+e}function ne(n,e,t){var i=document.createElement("option");i.innerHTML=e,i.value=e,n.__preset_select.appendChild(i),t&&(n.__preset_select.selectedIndex=n.__preset_select.length-1)}function xe(n,e){e.style.display=n.useLocalStorage?"block":"none"}function Xe(n){var e=n.__save_row=document.createElement("li");a.addClass(n.domElement,"has-save"),n.__ul.insertBefore(e,n.__ul.firstChild),a.addClass(e,"save-row");var t=document.createElement("span");t.innerHTML=" ",a.addClass(t,"button gears");var i=document.createElement("span");i.innerHTML="Save",a.addClass(i,"button"),a.addClass(i,"save");var o=document.createElement("span");o.innerHTML="New",a.addClass(o,"button"),a.addClass(o,"save-as");var r=document.createElement("span");r.innerHTML="Revert",a.addClass(r,"button"),a.addClass(r,"revert");var d=n.__preset_select=document.createElement("select");if(n.load&&n.load.remembered?s.each(n.load.remembered,function(c,p){ne(n,p,p===n.preset)}):ne(n,P,!1),a.bind(d,"change",function(){for(var c=0;c0&&(e.preset=this.preset,e.remembered||(e.remembered={}),e.remembered[this.preset]=Y(this)),e.folders={},s.each(this.__folders,function(t,i){e.folders[i]=t.getSaveObject()}),e},save:function(){this.load.remembered||(this.load.remembered={}),this.load.remembered[this.preset]=Y(this),te(this,!1),this.saveToLocalStorageIfPossible()},saveAs:function(e){this.load.remembered||(this.load.remembered={},this.load.remembered[P]=Y(this,!0)),this.load.remembered[e]=Y(this),this.preset=e,ne(this,e,!0),this.saveToLocalStorageIfPossible()},revert:function(e){s.each(this.__controllers,function(t){this.getRoot().load.remembered?we(e||this.getRoot(),t):t.setValue(t.initialValue),t.__onFinishChange&&t.__onFinishChange.call(t,t.getValue())},this),s.each(this.__folders,function(t){t.revert(t)}),e||te(this.getRoot(),!1)},listen:function(e){var t=0===this.__listening.length;this.__listening.push(e),t&&Ce(this.__listening)},updateDisplay:function(){s.each(this.__controllers,function(e){e.updateDisplay()}),s.each(this.__folders,function(e){e.updateDisplay()})}});var Ee={Color:g,math:H,interpret:$},Ae={Controller:k,BooleanController:J,OptionController:ue,StringController:ce,NumberController:Q,NumberControllerBox:D,NumberControllerSlider:X,FunctionController:q,ColorController:j},Se={dom:a},ke={GUI:h},Oe=h;const We={color:Ee,controllers:Ae,dom:Se,gui:ke,GUI:h}}}]); +//# sourceMappingURL=267.7e1bf61fc32a98a5.js.map \ No newline at end of file diff --git a/docs/142.90c84e92b8e7a333.js.map b/docs/267.7e1bf61fc32a98a5.js.map similarity index 99% rename from docs/142.90c84e92b8e7a333.js.map rename to docs/267.7e1bf61fc32a98a5.js.map index f8f549e40..edd9ec91f 100644 --- a/docs/142.90c84e92b8e7a333.js.map +++ b/docs/267.7e1bf61fc32a98a5.js.map @@ -1 +1 @@ -{"version":3,"file":"142.90c84e92b8e7a333.js","mappings":"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","names":["colorToString","color","forceCSSHex","colorFormat","__state","conversionName","toString","r","Math","round","g","b","a","h","s","toFixed","v","str","hex","length","ARR_EACH","Array","prototype","forEach","ARR_SLICE","slice","Common","BREAK","extend","target","each","call","arguments","obj","this","isObject","Object","keys","key","isUndefined","bind","defaults","compose","toCall","args","i","apply","itr","scope","l","_key","defer","fnc","setTimeout","debounce","func","threshold","callImmediately","timeout","delayed","callNow","clearTimeout","toArray","undefined","isNull","isNaN","_isNaN","_x","isArray","constructor","isNumber","isString","isBoolean","isFunction","Function","INTERPRETATIONS","litmus","conversions","THREE_CHAR_HEX","read","original","test","match","space","parseInt","write","SIX_CHAR_HEX","CSS_RGB","parseFloat","CSS_RGBA","HEX","RGB_ARRAY","RGBA_ARRAY","RGBA_OBJ","RGB_OBJ","HSVA_OBJ","HSV_OBJ","result","toReturn","interpret","family","conversion","tmpComponent","ColorMath","hsv_to_rgb","hi","floor","f","p","q","t","c","rgb_to_hsv","min","max","delta","NaN","rgb_to_hex","hex_with_component","component_from_hex","componentIndex","value","_typeof","Symbol","iterator","classCallCheck","instance","Constructor","TypeError","createClass","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","get","object","property","receiver","desc","getOwnPropertyDescriptor","parent","getPrototypeOf","getter","inherits","subClass","superClass","create","setPrototypeOf","__proto__","possibleConstructorReturn","self","ReferenceError","Color","Error","defineRGBComponent","component","componentHexIndex","recalculateRGB","set","defineHSVComponent","recalculateHSV","COMPONENTS","Controller","initialValue","domElement","document","createElement","__onChange","__onFinishChange","newValue","updateDisplay","getValue","EVENT_MAP_INV","HTMLEvents","MouseEvents","KeyboardEvents","k","e","CSS_VALUE_PIXELS","cssValueToPixels","val","dom","makeSelectable","elem","selectable","style","onselectstart","MozUserSelect","KhtmlUserSelect","unselectable","makeFullscreen","hor","vert","vertical","horizontal","position","left","right","top","bottom","fakeEvent","eventType","pars","aux","params","className","evt","createEvent","initMouseEvent","bubbles","cancelable","window","clickCount","x","clientX","y","clientY","init","initKeyboardEvent","initKeyEvent","ctrlKey","altKey","shiftKey","metaKey","keyCode","charCode","initEvent","dispatchEvent","event","newBool","addEventListener","attachEvent","unbind","removeEventListener","detachEvent","addClass","classes","split","indexOf","push","join","replace","removeClass","removeAttribute","index","splice","hasClass","RegExp","getWidth","getComputedStyle","width","getHeight","height","getOffset","el","offset","offsetParent","offsetLeft","offsetTop","isActive","activeElement","type","href","BooleanController","_Controller","_this2","_this","__prev","__checkbox","setAttribute","onChange","setValue","appendChild","checked","OptionController","opts","options","__select","map","element","opt","innerHTML","selectedIndex","StringController","__input","onBlur","blur","numDecimals","NumberController","_params","__min","__max","__step","step","__impliedStep","pow","log","abs","LN10","__precision","_v","minValue","maxValue","stepValue","NumberControllerBox","_NumberController","__truncationSuspended","prevY","onFinish","onMouseDrag","diff","onMouseUp","attempted","onMouseDown","roundToDecimal","decimals","tenTo","i1","i2","o1","o2","NumberControllerSlider","preventDefault","bgRect","__background","getBoundingClientRect","onTouchMove","touches","onTouchEnd","__foreground","onTouchStart","pct","FunctionController","text","__button","fire","ColorController","__color","__temp","__selector","__saturation_field","__field_knob","__field_knob_border","__hue_knob","__hue_field","__input_textShadow","valueField","fieldDown","setSV","fieldUpSV","fieldDownH","setH","fieldUpH","toOriginal","fieldRect","_ref","padding","backgroundColor","boxShadow","border","borderRadius","zIndex","borderRight","marginRight","display","cursor","background","linearGradient","hueGradient","cssText","outline","textAlign","fontWeight","textShadow","mismatch","flip","_flip","marginLeft","marginTop","toHexString","vendors","vendor","saveDialogContents","ControllerFactory","requestAnimationFrame$1","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","callback","CenteredDiv","backgroundElement","opacity","WebkitTransition","transition","body","hide","webkitTransform","layout","innerWidth","innerHeight","cssContent","indoc","doc","injected","head","getElementsByTagName","css","___$insertStyle","DEFAULT_DEFAULT_PRESET_NAME","SUPPORTS_LOCAL_STORAGE","localStorage","SAVE_DIALOGUE","autoPlaceVirgin","autoPlaceContainer","hideableGuis","GUI","__ul","__folders","__controllers","__rememberedObjects","__rememberedObjectIndecesToControllers","__listening","closeOnTop","autoPlace","DEFAULT_WIDTH","resizable","hideable","load","preset","scrollable","useLocalStorage","getItem","getLocalStorageHash","saveToLocalStorage","titleRow","getRoot","setPresetSelectIndex","gui","__preset_select","revert","setWidth","name","closed","CLASS_CLOSED","onResize","__closeButton","TEXT_OPEN","TEXT_CLOSED","bool","setItem","CLASS_MAIN","savedGui","JSON","parse","CLASS_CLOSE_BUTTON","CLASS_CLOSE_TOP","insertBefore","childNodes","CLASS_CLOSE_BOTTOM","titleRowName","createTextNode","addRow","CLASS_AUTO_PLACE_CONTAINER","CLASS_AUTO_PLACE","__resizeHandler","onResizeDebounced","addResizeHandle","pmouseX","drag","dragStop","CLASS_DRAG","dragStart","__resize_handle","firstElementChild","saveToLocalStorageIfPossible","stringify","getSaveObject","resetWidth","root","newDom","liBefore","li","removeListeners","markPresetModified","modified","recallSavedValue","controller","matchedIndex","controllerMap","remembered","presetMap","_add","factoryArgs","concat","before","__li","container","CLASS_CONTROLLER_ROW","augmentController","__gui","_options","nextSibling","nextElementSibling","remove","_nextSibling","_name","listen","box","method","pc","pb","returned","oldName","wasListening","newController","stopPropagation","borderLeftColor","isModified","location","addPresetOption","setSelected","showHideExplain","explain","addSaveMenu","div","__save_row","firstChild","gears","button","button2","button3","select","getElementById","localStorageCheckBox","newConstructorTextArea","which","show","focus","save","presetName","prompt","saveAs","w","getCurrentPreset","useInitialValues","savedValues","updateDisplays","controllerArray","toggleHide","CLASS_TOO_TALL","_keydownHandler","add","addColor","removeChild","destroy","subfolder","removeFolder","addFolder","newGuiParams","folders","folder","parentElement","open","close","node","offsetHeight","remember","math","controllers","dom$1","GUI$1"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/gui/dat.gui.mjs"],"sourcesContent":["/**\n * dat-gui JavaScript Controller Library\n * https://github.com/dataarts/dat.gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction ___$insertStyle(css) {\n if (!css) {\n return;\n }\n if (typeof window === 'undefined') {\n return;\n }\n\n var style = document.createElement('style');\n\n style.setAttribute('type', 'text/css');\n style.innerHTML = css;\n document.head.appendChild(style);\n\n return css;\n}\n\nfunction colorToString (color, forceCSSHex) {\n var colorFormat = color.__state.conversionName.toString();\n var r = Math.round(color.r);\n var g = Math.round(color.g);\n var b = Math.round(color.b);\n var a = color.a;\n var h = Math.round(color.h);\n var s = color.s.toFixed(1);\n var v = color.v.toFixed(1);\n if (forceCSSHex || colorFormat === 'THREE_CHAR_HEX' || colorFormat === 'SIX_CHAR_HEX') {\n var str = color.hex.toString(16);\n while (str.length < 6) {\n str = '0' + str;\n }\n return '#' + str;\n } else if (colorFormat === 'CSS_RGB') {\n return 'rgb(' + r + ',' + g + ',' + b + ')';\n } else if (colorFormat === 'CSS_RGBA') {\n return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n } else if (colorFormat === 'HEX') {\n return '0x' + color.hex.toString(16);\n } else if (colorFormat === 'RGB_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ']';\n } else if (colorFormat === 'RGBA_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ',' + a + ']';\n } else if (colorFormat === 'RGB_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + '}';\n } else if (colorFormat === 'RGBA_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}';\n } else if (colorFormat === 'HSV_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + '}';\n } else if (colorFormat === 'HSVA_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}';\n }\n return 'unknown format';\n}\n\nvar ARR_EACH = Array.prototype.forEach;\nvar ARR_SLICE = Array.prototype.slice;\nvar Common = {\n BREAK: {},\n extend: function extend(target) {\n this.each(ARR_SLICE.call(arguments, 1), function (obj) {\n var keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function (key) {\n if (!this.isUndefined(obj[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n return target;\n },\n defaults: function defaults(target) {\n this.each(ARR_SLICE.call(arguments, 1), function (obj) {\n var keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function (key) {\n if (this.isUndefined(target[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n return target;\n },\n compose: function compose() {\n var toCall = ARR_SLICE.call(arguments);\n return function () {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length - 1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n };\n },\n each: function each(obj, itr, scope) {\n if (!obj) {\n return;\n }\n if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) {\n obj.forEach(itr, scope);\n } else if (obj.length === obj.length + 0) {\n var key = void 0;\n var l = void 0;\n for (key = 0, l = obj.length; key < l; key++) {\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n } else {\n for (var _key in obj) {\n if (itr.call(scope, obj[_key], _key) === this.BREAK) {\n return;\n }\n }\n }\n },\n defer: function defer(fnc) {\n setTimeout(fnc, 0);\n },\n debounce: function debounce(func, threshold, callImmediately) {\n var timeout = void 0;\n return function () {\n var obj = this;\n var args = arguments;\n function delayed() {\n timeout = null;\n if (!callImmediately) func.apply(obj, args);\n }\n var callNow = callImmediately || !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(delayed, threshold);\n if (callNow) {\n func.apply(obj, args);\n }\n };\n },\n toArray: function toArray(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n isUndefined: function isUndefined(obj) {\n return obj === undefined;\n },\n isNull: function isNull(obj) {\n return obj === null;\n },\n isNaN: function (_isNaN) {\n function isNaN(_x) {\n return _isNaN.apply(this, arguments);\n }\n isNaN.toString = function () {\n return _isNaN.toString();\n };\n return isNaN;\n }(function (obj) {\n return isNaN(obj);\n }),\n isArray: Array.isArray || function (obj) {\n return obj.constructor === Array;\n },\n isObject: function isObject(obj) {\n return obj === Object(obj);\n },\n isNumber: function isNumber(obj) {\n return obj === obj + 0;\n },\n isString: function isString(obj) {\n return obj === obj + '';\n },\n isBoolean: function isBoolean(obj) {\n return obj === false || obj === true;\n },\n isFunction: function isFunction(obj) {\n return obj instanceof Function;\n }\n};\n\nvar INTERPRETATIONS = [\n{\n litmus: Common.isString,\n conversions: {\n THREE_CHAR_HEX: {\n read: function read(original) {\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) {\n return false;\n }\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0)\n };\n },\n write: colorToString\n },\n SIX_CHAR_HEX: {\n read: function read(original) {\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) {\n return false;\n }\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString(), 0)\n };\n },\n write: colorToString\n },\n CSS_RGB: {\n read: function read(original) {\n var test = original.match(/^rgb\\(\\s*(\\S+)\\s*,\\s*(\\S+)\\s*,\\s*(\\S+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n },\n write: colorToString\n },\n CSS_RGBA: {\n read: function read(original) {\n var test = original.match(/^rgba\\(\\s*(\\S+)\\s*,\\s*(\\S+)\\s*,\\s*(\\S+)\\s*,\\s*(\\S+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n },\n write: colorToString\n }\n }\n},\n{\n litmus: Common.isNumber,\n conversions: {\n HEX: {\n read: function read(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n };\n },\n write: function write(color) {\n return color.hex;\n }\n }\n }\n},\n{\n litmus: Common.isArray,\n conversions: {\n RGB_ARRAY: {\n read: function read(original) {\n if (original.length !== 3) {\n return false;\n }\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n write: function write(color) {\n return [color.r, color.g, color.b];\n }\n },\n RGBA_ARRAY: {\n read: function read(original) {\n if (original.length !== 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n write: function write(color) {\n return [color.r, color.g, color.b, color.a];\n }\n }\n }\n},\n{\n litmus: Common.isObject,\n conversions: {\n RGBA_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b) && Common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n };\n }\n },\n RGB_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n };\n }\n },\n HSVA_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v) && Common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n };\n }\n },\n HSV_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n };\n }\n }\n }\n}];\nvar result = void 0;\nvar toReturn = void 0;\nvar interpret = function interpret() {\n toReturn = false;\n var original = arguments.length > 1 ? Common.toArray(arguments) : arguments[0];\n Common.each(INTERPRETATIONS, function (family) {\n if (family.litmus(original)) {\n Common.each(family.conversions, function (conversion, conversionName) {\n result = conversion.read(original);\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return Common.BREAK;\n }\n });\n return Common.BREAK;\n }\n });\n return toReturn;\n};\n\nvar tmpComponent = void 0;\nvar ColorMath = {\n hsv_to_rgb: function hsv_to_rgb(h, s, v) {\n var hi = Math.floor(h / 60) % 6;\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - f * s);\n var t = v * (1.0 - (1.0 - f) * s);\n var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi];\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n },\n rgb_to_hsv: function rgb_to_hsv(r, g, b) {\n var min = Math.min(r, g, b);\n var max = Math.max(r, g, b);\n var delta = max - min;\n var h = void 0;\n var s = void 0;\n if (max !== 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n if (r === max) {\n h = (g - b) / delta;\n } else if (g === max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n rgb_to_hex: function rgb_to_hex(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n component_from_hex: function component_from_hex(hex, componentIndex) {\n return hex >> componentIndex * 8 & 0xFF;\n },\n hex_with_component: function hex_with_component(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent);\n }\n};\n\nvar _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n\n\n\n\n\n\nvar get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;\n\n if (getter === undefined) {\n return undefined;\n }\n\n return getter.call(receiver);\n }\n};\n\nvar inherits = function (subClass, superClass) {\n if (typeof superClass !== 'function' && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar possibleConstructorReturn = function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === 'object' || typeof call === 'function') ? call : self;\n};\n\nvar Color = function () {\n function Color() {\n classCallCheck(this, Color);\n this.__state = interpret.apply(this, arguments);\n if (this.__state === false) {\n throw new Error('Failed to interpret color arguments');\n }\n this.__state.a = this.__state.a || 1;\n }\n createClass(Color, [{\n key: 'toString',\n value: function toString() {\n return colorToString(this);\n }\n }, {\n key: 'toHexString',\n value: function toHexString() {\n return colorToString(this, true);\n }\n }, {\n key: 'toOriginal',\n value: function toOriginal() {\n return this.__state.conversion.write(this);\n }\n }]);\n return Color;\n}();\nfunction defineRGBComponent(target, component, componentHexIndex) {\n Object.defineProperty(target, component, {\n get: function get$$1() {\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n Color.recalculateRGB(this, component, componentHexIndex);\n return this.__state[component];\n },\n set: function set$$1(v) {\n if (this.__state.space !== 'RGB') {\n Color.recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n this.__state[component] = v;\n }\n });\n}\nfunction defineHSVComponent(target, component) {\n Object.defineProperty(target, component, {\n get: function get$$1() {\n if (this.__state.space === 'HSV') {\n return this.__state[component];\n }\n Color.recalculateHSV(this);\n return this.__state[component];\n },\n set: function set$$1(v) {\n if (this.__state.space !== 'HSV') {\n Color.recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n this.__state[component] = v;\n }\n });\n}\nColor.recalculateRGB = function (color, component, componentHexIndex) {\n if (color.__state.space === 'HEX') {\n color.__state[component] = ColorMath.component_from_hex(color.__state.hex, componentHexIndex);\n } else if (color.__state.space === 'HSV') {\n Common.extend(color.__state, ColorMath.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n } else {\n throw new Error('Corrupted color state');\n }\n};\nColor.recalculateHSV = function (color) {\n var result = ColorMath.rgb_to_hsv(color.r, color.g, color.b);\n Common.extend(color.__state, {\n s: result.s,\n v: result.v\n });\n if (!Common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (Common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n};\nColor.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a'];\ndefineRGBComponent(Color.prototype, 'r', 2);\ndefineRGBComponent(Color.prototype, 'g', 1);\ndefineRGBComponent(Color.prototype, 'b', 0);\ndefineHSVComponent(Color.prototype, 'h');\ndefineHSVComponent(Color.prototype, 's');\ndefineHSVComponent(Color.prototype, 'v');\nObject.defineProperty(Color.prototype, 'a', {\n get: function get$$1() {\n return this.__state.a;\n },\n set: function set$$1(v) {\n this.__state.a = v;\n }\n});\nObject.defineProperty(Color.prototype, 'hex', {\n get: function get$$1() {\n if (this.__state.space !== 'HEX') {\n this.__state.hex = ColorMath.rgb_to_hex(this.r, this.g, this.b);\n this.__state.space = 'HEX';\n }\n return this.__state.hex;\n },\n set: function set$$1(v) {\n this.__state.space = 'HEX';\n this.__state.hex = v;\n }\n});\n\nvar Controller = function () {\n function Controller(object, property) {\n classCallCheck(this, Controller);\n this.initialValue = object[property];\n this.domElement = document.createElement('div');\n this.object = object;\n this.property = property;\n this.__onChange = undefined;\n this.__onFinishChange = undefined;\n }\n createClass(Controller, [{\n key: 'onChange',\n value: function onChange(fnc) {\n this.__onChange = fnc;\n return this;\n }\n }, {\n key: 'onFinishChange',\n value: function onFinishChange(fnc) {\n this.__onFinishChange = fnc;\n return this;\n }\n }, {\n key: 'setValue',\n value: function setValue(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n }\n }, {\n key: 'getValue',\n value: function getValue() {\n return this.object[this.property];\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n return this;\n }\n }, {\n key: 'isModified',\n value: function isModified() {\n return this.initialValue !== this.getValue();\n }\n }]);\n return Controller;\n}();\n\nvar EVENT_MAP = {\n HTMLEvents: ['change'],\n MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'],\n KeyboardEvents: ['keydown']\n};\nvar EVENT_MAP_INV = {};\nCommon.each(EVENT_MAP, function (v, k) {\n Common.each(v, function (e) {\n EVENT_MAP_INV[e] = k;\n });\n});\nvar CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\nfunction cssValueToPixels(val) {\n if (val === '0' || Common.isUndefined(val)) {\n return 0;\n }\n var match = val.match(CSS_VALUE_PIXELS);\n if (!Common.isNull(match)) {\n return parseFloat(match[1]);\n }\n return 0;\n}\nvar dom = {\n makeSelectable: function makeSelectable(elem, selectable) {\n if (elem === undefined || elem.style === undefined) return;\n elem.onselectstart = selectable ? function () {\n return false;\n } : function () {};\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n },\n makeFullscreen: function makeFullscreen(elem, hor, vert) {\n var vertical = vert;\n var horizontal = hor;\n if (Common.isUndefined(horizontal)) {\n horizontal = true;\n }\n if (Common.isUndefined(vertical)) {\n vertical = true;\n }\n elem.style.position = 'absolute';\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n },\n fakeEvent: function fakeEvent(elem, eventType, pars, aux) {\n var params = pars || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n {\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0,\n 0,\n clientX,\n clientY,\n false, false, false, false, 0, null);\n break;\n }\n case 'KeyboardEvents':\n {\n var init = evt.initKeyboardEvent || evt.initKeyEvent;\n Common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode);\n break;\n }\n default:\n {\n evt.initEvent(eventType, params.bubbles || false, params.cancelable || true);\n break;\n }\n }\n Common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n bind: function bind(elem, event, func, newBool) {\n var bool = newBool || false;\n if (elem.addEventListener) {\n elem.addEventListener(event, func, bool);\n } else if (elem.attachEvent) {\n elem.attachEvent('on' + event, func);\n }\n return dom;\n },\n unbind: function unbind(elem, event, func, newBool) {\n var bool = newBool || false;\n if (elem.removeEventListener) {\n elem.removeEventListener(event, func, bool);\n } else if (elem.detachEvent) {\n elem.detachEvent('on' + event, func);\n }\n return dom;\n },\n addClass: function addClass(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) === -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n removeClass: function removeClass(elem, className) {\n if (className) {\n if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index !== -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n hasClass: function hasClass(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n getWidth: function getWidth(elem) {\n var style = getComputedStyle(elem);\n return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width);\n },\n getHeight: function getHeight(elem) {\n var style = getComputedStyle(elem);\n return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height);\n },\n getOffset: function getOffset(el) {\n var elem = el;\n var offset = { left: 0, top: 0 };\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n elem = elem.offsetParent;\n } while (elem);\n }\n return offset;\n },\n isActive: function isActive(elem) {\n return elem === document.activeElement && (elem.type || elem.href);\n }\n};\n\nvar BooleanController = function (_Controller) {\n inherits(BooleanController, _Controller);\n function BooleanController(object, property) {\n classCallCheck(this, BooleanController);\n var _this2 = possibleConstructorReturn(this, (BooleanController.__proto__ || Object.getPrototypeOf(BooleanController)).call(this, object, property));\n var _this = _this2;\n _this2.__prev = _this2.getValue();\n _this2.__checkbox = document.createElement('input');\n _this2.__checkbox.setAttribute('type', 'checkbox');\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n dom.bind(_this2.__checkbox, 'change', onChange, false);\n _this2.domElement.appendChild(_this2.__checkbox);\n _this2.updateDisplay();\n return _this2;\n }\n createClass(BooleanController, [{\n key: 'setValue',\n value: function setValue(v) {\n var toReturn = get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'setValue', this).call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true;\n this.__prev = true;\n } else {\n this.__checkbox.checked = false;\n this.__prev = false;\n }\n return get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return BooleanController;\n}(Controller);\n\nvar OptionController = function (_Controller) {\n inherits(OptionController, _Controller);\n function OptionController(object, property, opts) {\n classCallCheck(this, OptionController);\n var _this2 = possibleConstructorReturn(this, (OptionController.__proto__ || Object.getPrototypeOf(OptionController)).call(this, object, property));\n var options = opts;\n var _this = _this2;\n _this2.__select = document.createElement('select');\n if (Common.isArray(options)) {\n var map = {};\n Common.each(options, function (element) {\n map[element] = element;\n });\n options = map;\n }\n Common.each(options, function (value, key) {\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n });\n _this2.updateDisplay();\n dom.bind(_this2.__select, 'change', function () {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n _this2.domElement.appendChild(_this2.__select);\n return _this2;\n }\n createClass(OptionController, [{\n key: 'setValue',\n value: function setValue(v) {\n var toReturn = get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'setValue', this).call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (dom.isActive(this.__select)) return this;\n this.__select.value = this.getValue();\n return get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return OptionController;\n}(Controller);\n\nvar StringController = function (_Controller) {\n inherits(StringController, _Controller);\n function StringController(object, property) {\n classCallCheck(this, StringController);\n var _this2 = possibleConstructorReturn(this, (StringController.__proto__ || Object.getPrototypeOf(StringController)).call(this, object, property));\n var _this = _this2;\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n _this2.__input = document.createElement('input');\n _this2.__input.setAttribute('type', 'text');\n dom.bind(_this2.__input, 'keyup', onChange);\n dom.bind(_this2.__input, 'change', onChange);\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n _this2.updateDisplay();\n _this2.domElement.appendChild(_this2.__input);\n return _this2;\n }\n createClass(StringController, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return get(StringController.prototype.__proto__ || Object.getPrototypeOf(StringController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return StringController;\n}(Controller);\n\nfunction numDecimals(x) {\n var _x = x.toString();\n if (_x.indexOf('.') > -1) {\n return _x.length - _x.indexOf('.') - 1;\n }\n return 0;\n}\nvar NumberController = function (_Controller) {\n inherits(NumberController, _Controller);\n function NumberController(object, property, params) {\n classCallCheck(this, NumberController);\n var _this = possibleConstructorReturn(this, (NumberController.__proto__ || Object.getPrototypeOf(NumberController)).call(this, object, property));\n var _params = params || {};\n _this.__min = _params.min;\n _this.__max = _params.max;\n _this.__step = _params.step;\n if (Common.isUndefined(_this.__step)) {\n if (_this.initialValue === 0) {\n _this.__impliedStep = 1;\n } else {\n _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10;\n }\n } else {\n _this.__impliedStep = _this.__step;\n }\n _this.__precision = numDecimals(_this.__impliedStep);\n return _this;\n }\n createClass(NumberController, [{\n key: 'setValue',\n value: function setValue(v) {\n var _v = v;\n if (this.__min !== undefined && _v < this.__min) {\n _v = this.__min;\n } else if (this.__max !== undefined && _v > this.__max) {\n _v = this.__max;\n }\n if (this.__step !== undefined && _v % this.__step !== 0) {\n _v = Math.round(_v / this.__step) * this.__step;\n }\n return get(NumberController.prototype.__proto__ || Object.getPrototypeOf(NumberController.prototype), 'setValue', this).call(this, _v);\n }\n }, {\n key: 'min',\n value: function min(minValue) {\n this.__min = minValue;\n return this;\n }\n }, {\n key: 'max',\n value: function max(maxValue) {\n this.__max = maxValue;\n return this;\n }\n }, {\n key: 'step',\n value: function step(stepValue) {\n this.__step = stepValue;\n this.__impliedStep = stepValue;\n this.__precision = numDecimals(stepValue);\n return this;\n }\n }]);\n return NumberController;\n}(Controller);\n\nfunction roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n}\nvar NumberControllerBox = function (_NumberController) {\n inherits(NumberControllerBox, _NumberController);\n function NumberControllerBox(object, property, params) {\n classCallCheck(this, NumberControllerBox);\n var _this2 = possibleConstructorReturn(this, (NumberControllerBox.__proto__ || Object.getPrototypeOf(NumberControllerBox)).call(this, object, property, params));\n _this2.__truncationSuspended = false;\n var _this = _this2;\n var prevY = void 0;\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!Common.isNaN(attempted)) {\n _this.setValue(attempted);\n }\n }\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n function onBlur() {\n onFinish();\n }\n function onMouseDrag(e) {\n var diff = prevY - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n prevY = e.clientY;\n }\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n onFinish();\n }\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prevY = e.clientY;\n }\n _this2.__input = document.createElement('input');\n _this2.__input.setAttribute('type', 'text');\n dom.bind(_this2.__input, 'change', onChange);\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__input, 'mousedown', onMouseDown);\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n onFinish();\n }\n });\n _this2.updateDisplay();\n _this2.domElement.appendChild(_this2.__input);\n return _this2;\n }\n createClass(NumberControllerBox, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return get(NumberControllerBox.prototype.__proto__ || Object.getPrototypeOf(NumberControllerBox.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return NumberControllerBox;\n}(NumberController);\n\nfunction map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n}\nvar NumberControllerSlider = function (_NumberController) {\n inherits(NumberControllerSlider, _NumberController);\n function NumberControllerSlider(object, property, min, max, step) {\n classCallCheck(this, NumberControllerSlider);\n var _this2 = possibleConstructorReturn(this, (NumberControllerSlider.__proto__ || Object.getPrototypeOf(NumberControllerSlider)).call(this, object, property, { min: min, max: max, step: step }));\n var _this = _this2;\n _this2.__background = document.createElement('div');\n _this2.__foreground = document.createElement('div');\n dom.bind(_this2.__background, 'mousedown', onMouseDown);\n dom.bind(_this2.__background, 'touchstart', onTouchStart);\n dom.addClass(_this2.__background, 'slider');\n dom.addClass(_this2.__foreground, 'slider-fg');\n function onMouseDown(e) {\n document.activeElement.blur();\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n onMouseDrag(e);\n }\n function onMouseDrag(e) {\n e.preventDefault();\n var bgRect = _this.__background.getBoundingClientRect();\n _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max));\n return false;\n }\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n function onTouchStart(e) {\n if (e.touches.length !== 1) {\n return;\n }\n dom.bind(window, 'touchmove', onTouchMove);\n dom.bind(window, 'touchend', onTouchEnd);\n onTouchMove(e);\n }\n function onTouchMove(e) {\n var clientX = e.touches[0].clientX;\n var bgRect = _this.__background.getBoundingClientRect();\n _this.setValue(map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max));\n }\n function onTouchEnd() {\n dom.unbind(window, 'touchmove', onTouchMove);\n dom.unbind(window, 'touchend', onTouchEnd);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n _this2.updateDisplay();\n _this2.__background.appendChild(_this2.__foreground);\n _this2.domElement.appendChild(_this2.__background);\n return _this2;\n }\n createClass(NumberControllerSlider, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n var pct = (this.getValue() - this.__min) / (this.__max - this.__min);\n this.__foreground.style.width = pct * 100 + '%';\n return get(NumberControllerSlider.prototype.__proto__ || Object.getPrototypeOf(NumberControllerSlider.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return NumberControllerSlider;\n}(NumberController);\n\nvar FunctionController = function (_Controller) {\n inherits(FunctionController, _Controller);\n function FunctionController(object, property, text) {\n classCallCheck(this, FunctionController);\n var _this2 = possibleConstructorReturn(this, (FunctionController.__proto__ || Object.getPrototypeOf(FunctionController)).call(this, object, property));\n var _this = _this2;\n _this2.__button = document.createElement('div');\n _this2.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(_this2.__button, 'click', function (e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n dom.addClass(_this2.__button, 'button');\n _this2.domElement.appendChild(_this2.__button);\n return _this2;\n }\n createClass(FunctionController, [{\n key: 'fire',\n value: function fire() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n this.getValue().call(this.object);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n }\n }]);\n return FunctionController;\n}(Controller);\n\nvar ColorController = function (_Controller) {\n inherits(ColorController, _Controller);\n function ColorController(object, property) {\n classCallCheck(this, ColorController);\n var _this2 = possibleConstructorReturn(this, (ColorController.__proto__ || Object.getPrototypeOf(ColorController)).call(this, object, property));\n _this2.__color = new Color(_this2.getValue());\n _this2.__temp = new Color(0);\n var _this = _this2;\n _this2.domElement = document.createElement('div');\n dom.makeSelectable(_this2.domElement, false);\n _this2.__selector = document.createElement('div');\n _this2.__selector.className = 'selector';\n _this2.__saturation_field = document.createElement('div');\n _this2.__saturation_field.className = 'saturation-field';\n _this2.__field_knob = document.createElement('div');\n _this2.__field_knob.className = 'field-knob';\n _this2.__field_knob_border = '2px solid ';\n _this2.__hue_knob = document.createElement('div');\n _this2.__hue_knob.className = 'hue-knob';\n _this2.__hue_field = document.createElement('div');\n _this2.__hue_field.className = 'hue-field';\n _this2.__input = document.createElement('input');\n _this2.__input.type = 'text';\n _this2.__input_textShadow = '0 1px 1px ';\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n onBlur.call(this);\n }\n });\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__selector, 'mousedown', function () {\n dom.addClass(this, 'drag').bind(window, 'mouseup', function () {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n dom.bind(_this2.__selector, 'touchstart', function () {\n dom.addClass(this, 'drag').bind(window, 'touchend', function () {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n var valueField = document.createElement('div');\n Common.extend(_this2.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n Common.extend(_this2.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n Common.extend(_this2.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n Common.extend(_this2.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n Common.extend(valueField.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000');\n Common.extend(_this2.__hue_field.style, {\n width: '15px',\n height: '100px',\n border: '1px solid #555',\n cursor: 'ns-resize',\n position: 'absolute',\n top: '3px',\n right: '3px'\n });\n hueGradient(_this2.__hue_field);\n Common.extend(_this2.__input.style, {\n outline: 'none',\n textAlign: 'center',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n dom.bind(_this2.__saturation_field, 'mousedown', fieldDown);\n dom.bind(_this2.__saturation_field, 'touchstart', fieldDown);\n dom.bind(_this2.__field_knob, 'mousedown', fieldDown);\n dom.bind(_this2.__field_knob, 'touchstart', fieldDown);\n dom.bind(_this2.__hue_field, 'mousedown', fieldDownH);\n dom.bind(_this2.__hue_field, 'touchstart', fieldDownH);\n function fieldDown(e) {\n setSV(e);\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'touchmove', setSV);\n dom.bind(window, 'mouseup', fieldUpSV);\n dom.bind(window, 'touchend', fieldUpSV);\n }\n function fieldDownH(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'touchmove', setH);\n dom.bind(window, 'mouseup', fieldUpH);\n dom.bind(window, 'touchend', fieldUpH);\n }\n function fieldUpSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'touchmove', setSV);\n dom.unbind(window, 'mouseup', fieldUpSV);\n dom.unbind(window, 'touchend', fieldUpSV);\n onFinish();\n }\n function fieldUpH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'touchmove', setH);\n dom.unbind(window, 'mouseup', fieldUpH);\n dom.unbind(window, 'touchend', fieldUpH);\n onFinish();\n }\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.__color.toOriginal());\n }\n }\n _this2.__saturation_field.appendChild(valueField);\n _this2.__selector.appendChild(_this2.__field_knob);\n _this2.__selector.appendChild(_this2.__saturation_field);\n _this2.__selector.appendChild(_this2.__hue_field);\n _this2.__hue_field.appendChild(_this2.__hue_knob);\n _this2.domElement.appendChild(_this2.__input);\n _this2.domElement.appendChild(_this2.__selector);\n _this2.updateDisplay();\n function setSV(e) {\n if (e.type.indexOf('touch') === -1) {\n e.preventDefault();\n }\n var fieldRect = _this.__saturation_field.getBoundingClientRect();\n var _ref = e.touches && e.touches[0] || e,\n clientX = _ref.clientX,\n clientY = _ref.clientY;\n var s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left);\n var v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n if (v > 1) {\n v = 1;\n } else if (v < 0) {\n v = 0;\n }\n if (s > 1) {\n s = 1;\n } else if (s < 0) {\n s = 0;\n }\n _this.__color.v = v;\n _this.__color.s = s;\n _this.setValue(_this.__color.toOriginal());\n return false;\n }\n function setH(e) {\n if (e.type.indexOf('touch') === -1) {\n e.preventDefault();\n }\n var fieldRect = _this.__hue_field.getBoundingClientRect();\n var _ref2 = e.touches && e.touches[0] || e,\n clientY = _ref2.clientY;\n var h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n if (h > 1) {\n h = 1;\n } else if (h < 0) {\n h = 0;\n }\n _this.__color.h = h * 360;\n _this.setValue(_this.__color.toOriginal());\n return false;\n }\n return _this2;\n }\n createClass(ColorController, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n var i = interpret(this.getValue());\n if (i !== false) {\n var mismatch = false;\n Common.each(Color.COMPONENTS, function (component) {\n if (!Common.isUndefined(i[component]) && !Common.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {};\n }\n }, this);\n if (mismatch) {\n Common.extend(this.__color.__state, i);\n }\n }\n Common.extend(this.__temp.__state, this.__color.__state);\n this.__temp.a = 1;\n var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0;\n var _flip = 255 - flip;\n Common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toHexString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')'\n });\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px';\n this.__temp.s = 1;\n this.__temp.v = 1;\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString());\n this.__input.value = this.__color.toString();\n Common.extend(this.__input.style, {\n backgroundColor: this.__color.toHexString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip + ')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)'\n });\n }\n }]);\n return ColorController;\n}(Controller);\nvar vendors = ['-moz-', '-o-', '-webkit-', '-ms-', ''];\nfunction linearGradient(elem, x, a, b) {\n elem.style.background = '';\n Common.each(vendors, function (vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); ';\n });\n}\nfunction hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);';\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n}\n\nvar css = {\n load: function load(url, indoc) {\n var doc = indoc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function inject(cssContent, indoc) {\n var doc = indoc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = cssContent;\n var head = doc.getElementsByTagName('head')[0];\n try {\n head.appendChild(injected);\n } catch (e) {\n }\n }\n};\n\nvar saveDialogContents = \"
\\n\\n Here's the new load parameter for your GUI's constructor:\\n\\n \\n\\n
\\n\\n Automatically save\\n values to localStorage on exit.\\n\\n
The values saved to localStorage will\\n override those passed to dat.GUI's constructor. This makes it\\n easier to work incrementally, but localStorage is fragile,\\n and your friends may not see the same values you do.\\n\\n
\\n\\n
\\n\\n
\";\n\nvar ControllerFactory = function ControllerFactory(object, property) {\n var initialValue = object[property];\n if (Common.isArray(arguments[2]) || Common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n if (Common.isNumber(initialValue)) {\n if (Common.isNumber(arguments[2]) && Common.isNumber(arguments[3])) {\n if (Common.isNumber(arguments[4])) {\n return new NumberControllerSlider(object, property, arguments[2], arguments[3], arguments[4]);\n }\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n }\n if (Common.isNumber(arguments[4])) {\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3], step: arguments[4] });\n }\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n }\n if (Common.isString(initialValue)) {\n return new StringController(object, property);\n }\n if (Common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n if (Common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n return null;\n};\n\nfunction requestAnimationFrame(callback) {\n setTimeout(callback, 1000 / 60);\n}\nvar requestAnimationFrame$1 = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame;\n\nvar CenteredDiv = function () {\n function CenteredDiv() {\n classCallCheck(this, CenteredDiv);\n this.backgroundElement = document.createElement('div');\n Common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear',\n transition: 'opacity 0.2s linear'\n });\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n this.domElement = document.createElement('div');\n Common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear',\n transition: 'transform 0.2s ease-out, opacity 0.2s linear'\n });\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function () {\n _this.hide();\n });\n }\n createClass(CenteredDiv, [{\n key: 'show',\n value: function show() {\n var _this = this;\n this.backgroundElement.style.display = 'block';\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n this.layout();\n Common.defer(function () {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n }\n }, {\n key: 'hide',\n value: function hide() {\n var _this = this;\n var hide = function hide() {\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n };\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n this.backgroundElement.style.opacity = 0;\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n }\n }, {\n key: 'layout',\n value: function layout() {\n this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px';\n }\n }]);\n return CenteredDiv;\n}();\n\nvar styleSheet = ___$insertStyle(\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .cr.function .property-name{width:100%}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\");\n\ncss.inject(styleSheet);\nvar CSS_NAMESPACE = 'dg';\nvar HIDE_KEY_CODE = 72;\nvar CLOSE_BUTTON_HEIGHT = 20;\nvar DEFAULT_DEFAULT_PRESET_NAME = 'Default';\nvar SUPPORTS_LOCAL_STORAGE = function () {\n try {\n return !!window.localStorage;\n } catch (e) {\n return false;\n }\n}();\nvar SAVE_DIALOGUE = void 0;\nvar autoPlaceVirgin = true;\nvar autoPlaceContainer = void 0;\nvar hide = false;\nvar hideableGuis = [];\nvar GUI = function GUI(pars) {\n var _this = this;\n var params = pars || {};\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n dom.addClass(this.domElement, CSS_NAMESPACE);\n this.__folders = {};\n this.__controllers = [];\n this.__rememberedObjects = [];\n this.__rememberedObjectIndecesToControllers = [];\n this.__listening = [];\n params = Common.defaults(params, {\n closeOnTop: false,\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n params = Common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n if (!Common.isUndefined(params.load)) {\n if (params.preset) {\n params.load.preset = params.preset;\n }\n } else {\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n }\n if (Common.isUndefined(params.parent) && params.hideable) {\n hideableGuis.push(this);\n }\n params.resizable = Common.isUndefined(params.parent) && params.resizable;\n if (params.autoPlace && Common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n var saveToLocalStorage = void 0;\n var titleRow = void 0;\n Object.defineProperties(this,\n {\n parent: {\n get: function get$$1() {\n return params.parent;\n }\n },\n scrollable: {\n get: function get$$1() {\n return params.scrollable;\n }\n },\n autoPlace: {\n get: function get$$1() {\n return params.autoPlace;\n }\n },\n closeOnTop: {\n get: function get$$1() {\n return params.closeOnTop;\n }\n },\n preset: {\n get: function get$$1() {\n if (_this.parent) {\n return _this.getRoot().preset;\n }\n return params.load.preset;\n },\n set: function set$$1(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n },\n width: {\n get: function get$$1() {\n return params.width;\n },\n set: function set$$1(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n name: {\n get: function get$$1() {\n return params.name;\n },\n set: function set$$1(v) {\n params.name = v;\n if (titleRow) {\n titleRow.innerHTML = params.name;\n }\n }\n },\n closed: {\n get: function get$$1() {\n return params.closed;\n },\n set: function set$$1(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n this.onResize();\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n load: {\n get: function get$$1() {\n return params.load;\n }\n },\n useLocalStorage: {\n get: function get$$1() {\n return useLocalStorage;\n },\n set: function set$$1(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n useLocalStorage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n }\n });\n if (Common.isUndefined(params.parent)) {\n this.closed = params.closed || false;\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n if (SUPPORTS_LOCAL_STORAGE) {\n if (useLocalStorage) {\n _this.useLocalStorage = true;\n var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n if (savedGui) {\n params.load = JSON.parse(savedGui);\n }\n }\n }\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n if (params.closeOnTop) {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP);\n this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]);\n } else {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM);\n this.domElement.appendChild(this.__closeButton);\n }\n dom.bind(this.__closeButton, 'click', function () {\n _this.closed = !_this.closed;\n });\n } else {\n if (params.closed === undefined) {\n params.closed = true;\n }\n var titleRowName = document.createTextNode(params.name);\n dom.addClass(titleRowName, 'controller-name');\n titleRow = addRow(_this, titleRowName);\n var onClickTitle = function onClickTitle(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n dom.addClass(titleRow, 'title');\n dom.bind(titleRow, 'click', onClickTitle);\n if (!params.closed) {\n this.closed = false;\n }\n }\n if (params.autoPlace) {\n if (Common.isUndefined(params.parent)) {\n if (autoPlaceVirgin) {\n autoPlaceContainer = document.createElement('div');\n dom.addClass(autoPlaceContainer, CSS_NAMESPACE);\n dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(autoPlaceContainer);\n autoPlaceVirgin = false;\n }\n autoPlaceContainer.appendChild(this.domElement);\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n }\n if (!this.parent) {\n setWidth(_this, params.width);\n }\n }\n this.__resizeHandler = function () {\n _this.onResizeDebounced();\n };\n dom.bind(window, 'resize', this.__resizeHandler);\n dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler);\n dom.bind(this.__ul, 'transitionend', this.__resizeHandler);\n dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler);\n this.onResize();\n if (params.resizable) {\n addResizeHandle(this);\n }\n saveToLocalStorage = function saveToLocalStorage() {\n if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n };\n this.saveToLocalStorageIfPossible = saveToLocalStorage;\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n Common.defer(function () {\n root.width -= 1;\n });\n }\n if (!params.parent) {\n resetWidth();\n }\n};\nGUI.toggleHide = function () {\n hide = !hide;\n Common.each(hideableGuis, function (gui) {\n gui.domElement.style.display = hide ? 'none' : '';\n });\n};\nGUI.CLASS_AUTO_PLACE = 'a';\nGUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\nGUI.CLASS_MAIN = 'main';\nGUI.CLASS_CONTROLLER_ROW = 'cr';\nGUI.CLASS_TOO_TALL = 'taller-than-window';\nGUI.CLASS_CLOSED = 'closed';\nGUI.CLASS_CLOSE_BUTTON = 'close-button';\nGUI.CLASS_CLOSE_TOP = 'close-top';\nGUI.CLASS_CLOSE_BOTTOM = 'close-bottom';\nGUI.CLASS_DRAG = 'drag';\nGUI.DEFAULT_WIDTH = 245;\nGUI.TEXT_CLOSED = 'Close Controls';\nGUI.TEXT_OPEN = 'Open Controls';\nGUI._keydownHandler = function (e) {\n if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n};\ndom.bind(window, 'keydown', GUI._keydownHandler, false);\nCommon.extend(GUI.prototype,\n{\n add: function add(object, property) {\n return _add(this, object, property, {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n });\n },\n addColor: function addColor(object, property) {\n return _add(this, object, property, {\n color: true\n });\n },\n remove: function remove(controller) {\n this.__ul.removeChild(controller.__li);\n this.__controllers.splice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n Common.defer(function () {\n _this.onResize();\n });\n },\n destroy: function destroy() {\n if (this.parent) {\n throw new Error('Only the root GUI should be removed with .destroy(). ' + 'For subfolders, use gui.removeFolder(folder) instead.');\n }\n if (this.autoPlace) {\n autoPlaceContainer.removeChild(this.domElement);\n }\n var _this = this;\n Common.each(this.__folders, function (subfolder) {\n _this.removeFolder(subfolder);\n });\n dom.unbind(window, 'keydown', GUI._keydownHandler, false);\n removeListeners(this);\n },\n addFolder: function addFolder(name) {\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' + ' name \"' + name + '\"');\n }\n var newGuiParams = { name: name, parent: this };\n newGuiParams.autoPlace = this.autoPlace;\n if (this.load &&\n this.load.folders &&\n this.load.folders[name]) {\n newGuiParams.closed = this.load.folders[name].closed;\n newGuiParams.load = this.load.folders[name];\n }\n var gui = new GUI(newGuiParams);\n this.__folders[name] = gui;\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n },\n removeFolder: function removeFolder(folder) {\n this.__ul.removeChild(folder.domElement.parentElement);\n delete this.__folders[folder.name];\n if (this.load &&\n this.load.folders &&\n this.load.folders[folder.name]) {\n delete this.load.folders[folder.name];\n }\n removeListeners(folder);\n var _this = this;\n Common.each(folder.__folders, function (subfolder) {\n folder.removeFolder(subfolder);\n });\n Common.defer(function () {\n _this.onResize();\n });\n },\n open: function open() {\n this.closed = false;\n },\n close: function close() {\n this.closed = true;\n },\n hide: function hide() {\n this.domElement.style.display = 'none';\n },\n show: function show() {\n this.domElement.style.display = '';\n },\n onResize: function onResize() {\n var root = this.getRoot();\n if (root.scrollable) {\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n Common.each(root.__ul.childNodes, function (node) {\n if (!(root.autoPlace && node === root.__save_row)) {\n h += dom.getHeight(node);\n }\n });\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n }\n if (root.__resize_handle) {\n Common.defer(function () {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n },\n onResizeDebounced: Common.debounce(function () {\n this.onResize();\n }, 50),\n remember: function remember() {\n if (Common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogContents;\n }\n if (this.parent) {\n throw new Error('You can only call remember on a top level GUI.');\n }\n var _this = this;\n Common.each(Array.prototype.slice.call(arguments), function (object) {\n if (_this.__rememberedObjects.length === 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) === -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n if (this.autoPlace) {\n setWidth(this, this.width);\n }\n },\n getRoot: function getRoot() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n getSaveObject: function getSaveObject() {\n var toReturn = this.load;\n toReturn.closed = this.closed;\n if (this.__rememberedObjects.length > 0) {\n toReturn.preset = this.preset;\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n }\n toReturn.folders = {};\n Common.each(this.__folders, function (element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n return toReturn;\n },\n save: function save() {\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n this.saveToLocalStorageIfPossible();\n },\n saveAs: function saveAs(presetName) {\n if (!this.load.remembered) {\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n }\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n this.saveToLocalStorageIfPossible();\n },\n revert: function revert(gui) {\n Common.each(this.__controllers, function (controller) {\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n if (controller.__onFinishChange) {\n controller.__onFinishChange.call(controller, controller.getValue());\n }\n }, this);\n Common.each(this.__folders, function (folder) {\n folder.revert(folder);\n });\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n },\n listen: function listen(controller) {\n var init = this.__listening.length === 0;\n this.__listening.push(controller);\n if (init) {\n updateDisplays(this.__listening);\n }\n },\n updateDisplay: function updateDisplay() {\n Common.each(this.__controllers, function (controller) {\n controller.updateDisplay();\n });\n Common.each(this.__folders, function (folder) {\n folder.updateDisplay();\n });\n }\n});\nfunction addRow(gui, newDom, liBefore) {\n var li = document.createElement('li');\n if (newDom) {\n li.appendChild(newDom);\n }\n if (liBefore) {\n gui.__ul.insertBefore(li, liBefore);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n}\nfunction removeListeners(gui) {\n dom.unbind(window, 'resize', gui.__resizeHandler);\n if (gui.saveToLocalStorageIfPossible) {\n dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible);\n }\n}\nfunction markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n if (modified) {\n opt.innerHTML = opt.value + '*';\n } else {\n opt.innerHTML = opt.value;\n }\n}\nfunction augmentController(gui, li, controller) {\n controller.__li = li;\n controller.__gui = gui;\n Common.extend(controller, {\n options: function options(_options) {\n if (arguments.length > 1) {\n var nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n return _add(gui, controller.object, controller.property, {\n before: nextSibling,\n factoryArgs: [Common.toArray(arguments)]\n });\n }\n if (Common.isArray(_options) || Common.isObject(_options)) {\n var _nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n return _add(gui, controller.object, controller.property, {\n before: _nextSibling,\n factoryArgs: [_options]\n });\n }\n },\n name: function name(_name) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = _name;\n return controller;\n },\n listen: function listen() {\n controller.__gui.listen(controller);\n return controller;\n },\n remove: function remove() {\n controller.__gui.remove(controller);\n return controller;\n }\n });\n if (controller instanceof NumberControllerSlider) {\n var box = new NumberControllerBox(controller.object, controller.property, { min: controller.__min, max: controller.__max, step: controller.__step });\n Common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function (method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function () {\n var args = Array.prototype.slice.call(arguments);\n pb.apply(box, args);\n return pc.apply(controller, args);\n };\n });\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n } else if (controller instanceof NumberControllerBox) {\n var r = function r(returned) {\n if (Common.isNumber(controller.__min) && Common.isNumber(controller.__max)) {\n var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML;\n var wasListening = controller.__gui.__listening.indexOf(controller) > -1;\n controller.remove();\n var newController = _add(gui, controller.object, controller.property, {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n newController.name(oldName);\n if (wasListening) newController.listen();\n return newController;\n }\n return returned;\n };\n controller.min = Common.compose(r, controller.min);\n controller.max = Common.compose(r, controller.max);\n } else if (controller instanceof BooleanController) {\n dom.bind(li, 'click', function () {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n dom.bind(controller.__checkbox, 'click', function (e) {\n e.stopPropagation();\n });\n } else if (controller instanceof FunctionController) {\n dom.bind(li, 'click', function () {\n dom.fakeEvent(controller.__button, 'click');\n });\n dom.bind(li, 'mouseover', function () {\n dom.addClass(controller.__button, 'hover');\n });\n dom.bind(li, 'mouseout', function () {\n dom.removeClass(controller.__button, 'hover');\n });\n } else if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n controller.updateDisplay = Common.compose(function (val) {\n li.style.borderLeftColor = controller.__color.toString();\n return val;\n }, controller.updateDisplay);\n controller.updateDisplay();\n }\n controller.setValue = Common.compose(function (val) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return val;\n }, controller.setValue);\n}\nfunction recallSavedValue(gui, controller) {\n var root = gui.getRoot();\n var matchedIndex = root.__rememberedObjects.indexOf(controller.object);\n if (matchedIndex !== -1) {\n var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex];\n if (controllerMap === undefined) {\n controllerMap = {};\n root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap;\n }\n controllerMap[controller.property] = controller;\n if (root.load && root.load.remembered) {\n var presetMap = root.load.remembered;\n var preset = void 0;\n if (presetMap[gui.preset]) {\n preset = presetMap[gui.preset];\n } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) {\n preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME];\n } else {\n return;\n }\n if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) {\n var value = preset[matchedIndex][controller.property];\n controller.initialValue = value;\n controller.setValue(value);\n }\n }\n }\n}\nfunction _add(gui, object, property, params) {\n if (object[property] === undefined) {\n throw new Error('Object \"' + object + '\" has no property \"' + property + '\"');\n }\n var controller = void 0;\n if (params.color) {\n controller = new ColorController(object, property);\n } else {\n var factoryArgs = [object, property].concat(params.factoryArgs);\n controller = ControllerFactory.apply(gui, factoryArgs);\n }\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n recallSavedValue(gui, controller);\n dom.addClass(controller.domElement, 'c');\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n var li = addRow(gui, container, params.before);\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n } else {\n dom.addClass(li, _typeof(controller.getValue()));\n }\n augmentController(gui, li, controller);\n gui.__controllers.push(controller);\n return controller;\n}\nfunction getLocalStorageHash(gui, key) {\n return document.location.href + '.' + key;\n}\nfunction addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n}\nfunction showHideExplain(gui, explain) {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n}\nfunction addSaveMenu(gui) {\n var div = gui.__save_row = document.createElement('li');\n dom.addClass(gui.domElement, 'has-save');\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n dom.addClass(div, 'save-row');\n var gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n var select = gui.__preset_select = document.createElement('select');\n if (gui.load && gui.load.remembered) {\n Common.each(gui.load.remembered, function (value, key) {\n addPresetOption(gui, key, key === gui.preset);\n });\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n dom.bind(select, 'change', function () {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n gui.preset = this.value;\n });\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n if (SUPPORTS_LOCAL_STORAGE) {\n var explain = document.getElementById('dg-local-explain');\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n var saveLocally = document.getElementById('dg-save-locally');\n saveLocally.style.display = 'block';\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n showHideExplain(gui, explain);\n dom.bind(localStorageCheckBox, 'change', function () {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain(gui, explain);\n });\n }\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n dom.bind(newConstructorTextArea, 'keydown', function (e) {\n if (e.metaKey && (e.which === 67 || e.keyCode === 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n dom.bind(gears, 'click', function () {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n dom.bind(button, 'click', function () {\n gui.save();\n });\n dom.bind(button2, 'click', function () {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) {\n gui.saveAs(presetName);\n }\n });\n dom.bind(button3, 'click', function () {\n gui.revert();\n });\n}\nfunction addResizeHandle(gui) {\n var pmouseX = void 0;\n gui.__resize_handle = document.createElement('div');\n Common.extend(gui.__resize_handle.style, {\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n });\n function drag(e) {\n e.preventDefault();\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n return false;\n }\n function dragStop() {\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n }\n function dragStart(e) {\n e.preventDefault();\n pmouseX = e.clientX;\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n return false;\n }\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n}\nfunction setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }\n if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n}\nfunction getCurrentPreset(gui, useInitialValues) {\n var toReturn = {};\n Common.each(gui.__rememberedObjects, function (val, index) {\n var savedValues = {};\n var controllerMap = gui.__rememberedObjectIndecesToControllers[index];\n Common.each(controllerMap, function (controller, property) {\n savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n toReturn[index] = savedValues;\n });\n return toReturn;\n}\nfunction setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value === gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n}\nfunction updateDisplays(controllerArray) {\n if (controllerArray.length !== 0) {\n requestAnimationFrame$1.call(window, function () {\n updateDisplays(controllerArray);\n });\n }\n Common.each(controllerArray, function (c) {\n c.updateDisplay();\n });\n}\n\nvar color = {\n Color: Color,\n math: ColorMath,\n interpret: interpret\n};\nvar controllers = {\n Controller: Controller,\n BooleanController: BooleanController,\n OptionController: OptionController,\n StringController: StringController,\n NumberController: NumberController,\n NumberControllerBox: NumberControllerBox,\n NumberControllerSlider: NumberControllerSlider,\n FunctionController: FunctionController,\n ColorController: ColorController\n};\nvar dom$1 = { dom: dom };\nvar gui = { GUI: GUI };\nvar GUI$1 = GUI;\nvar index = {\n color: color,\n controllers: controllers,\n dom: dom$1,\n gui: gui,\n GUI: GUI$1\n};\n\nexport { color, controllers, dom$1 as dom, gui, GUI$1 as GUI };\nexport default index;\n"],"x_google_ignoreList":[0]} \ No newline at end of file +{"version":3,"file":"267.7e1bf61fc32a98a5.js","mappings":"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","names":["colorToString","color","forceCSSHex","colorFormat","__state","conversionName","toString","r","Math","round","g","b","a","h","s","toFixed","v","str","hex","length","ARR_EACH","Array","prototype","forEach","ARR_SLICE","slice","Common","BREAK","extend","target","each","call","arguments","obj","this","isObject","Object","keys","key","isUndefined","bind","defaults","compose","toCall","args","i","apply","itr","scope","l","_key","defer","fnc","setTimeout","debounce","func","threshold","callImmediately","timeout","delayed","callNow","clearTimeout","toArray","undefined","isNull","isNaN","_isNaN","_x","isArray","constructor","isNumber","isString","isBoolean","isFunction","Function","INTERPRETATIONS","litmus","conversions","THREE_CHAR_HEX","read","original","test","match","space","parseInt","write","SIX_CHAR_HEX","CSS_RGB","parseFloat","CSS_RGBA","HEX","RGB_ARRAY","RGBA_ARRAY","RGBA_OBJ","RGB_OBJ","HSVA_OBJ","HSV_OBJ","result","toReturn","interpret","family","conversion","tmpComponent","ColorMath","hsv_to_rgb","hi","floor","f","p","q","t","c","rgb_to_hsv","min","max","delta","NaN","rgb_to_hex","hex_with_component","component_from_hex","componentIndex","value","_typeof","Symbol","iterator","classCallCheck","instance","Constructor","TypeError","createClass","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","get","object","property","receiver","desc","getOwnPropertyDescriptor","parent","getPrototypeOf","getter","inherits","subClass","superClass","create","setPrototypeOf","__proto__","possibleConstructorReturn","self","ReferenceError","Color","Error","defineRGBComponent","component","componentHexIndex","recalculateRGB","set","defineHSVComponent","recalculateHSV","COMPONENTS","Controller","initialValue","domElement","document","createElement","__onChange","__onFinishChange","newValue","updateDisplay","getValue","EVENT_MAP_INV","HTMLEvents","MouseEvents","KeyboardEvents","k","e","CSS_VALUE_PIXELS","cssValueToPixels","val","dom","makeSelectable","elem","selectable","style","onselectstart","MozUserSelect","KhtmlUserSelect","unselectable","makeFullscreen","hor","vert","vertical","horizontal","position","left","right","top","bottom","fakeEvent","eventType","pars","aux","params","className","evt","createEvent","initMouseEvent","bubbles","cancelable","window","clickCount","x","clientX","y","clientY","init","initKeyboardEvent","initKeyEvent","ctrlKey","altKey","shiftKey","metaKey","keyCode","charCode","initEvent","dispatchEvent","event","newBool","addEventListener","attachEvent","unbind","removeEventListener","detachEvent","addClass","classes","split","indexOf","push","join","replace","removeClass","removeAttribute","index","splice","hasClass","RegExp","getWidth","getComputedStyle","width","getHeight","height","getOffset","el","offset","offsetParent","offsetLeft","offsetTop","isActive","activeElement","type","href","BooleanController","_Controller","_this2","_this","__prev","__checkbox","setAttribute","onChange","setValue","appendChild","checked","OptionController","opts","options","__select","map","element","opt","innerHTML","selectedIndex","StringController","__input","onBlur","blur","numDecimals","NumberController","_params","__min","__max","__step","step","__impliedStep","pow","log","abs","LN10","__precision","_v","minValue","maxValue","stepValue","NumberControllerBox","_NumberController","__truncationSuspended","prevY","onFinish","onMouseDrag","diff","onMouseUp","attempted","onMouseDown","roundToDecimal","decimals","tenTo","i1","i2","o1","o2","NumberControllerSlider","preventDefault","bgRect","__background","getBoundingClientRect","onTouchMove","touches","onTouchEnd","__foreground","onTouchStart","pct","FunctionController","text","__button","fire","ColorController","__color","__temp","__selector","__saturation_field","__field_knob","__field_knob_border","__hue_knob","__hue_field","__input_textShadow","valueField","fieldDown","setSV","fieldUpSV","fieldDownH","setH","fieldUpH","toOriginal","fieldRect","_ref","padding","backgroundColor","boxShadow","border","borderRadius","zIndex","borderRight","marginRight","display","cursor","background","linearGradient","hueGradient","cssText","outline","textAlign","fontWeight","textShadow","mismatch","flip","_flip","marginLeft","marginTop","toHexString","vendors","vendor","saveDialogContents","ControllerFactory","requestAnimationFrame$1","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","callback","CenteredDiv","backgroundElement","opacity","WebkitTransition","transition","body","hide","webkitTransform","layout","innerWidth","innerHeight","cssContent","indoc","doc","injected","head","getElementsByTagName","css","___$insertStyle","DEFAULT_DEFAULT_PRESET_NAME","SUPPORTS_LOCAL_STORAGE","localStorage","SAVE_DIALOGUE","autoPlaceVirgin","autoPlaceContainer","hideableGuis","GUI","__ul","__folders","__controllers","__rememberedObjects","__rememberedObjectIndecesToControllers","__listening","closeOnTop","autoPlace","DEFAULT_WIDTH","resizable","hideable","load","preset","scrollable","useLocalStorage","getItem","getLocalStorageHash","saveToLocalStorage","titleRow","getRoot","setPresetSelectIndex","gui","__preset_select","revert","setWidth","name","closed","CLASS_CLOSED","onResize","__closeButton","TEXT_OPEN","TEXT_CLOSED","bool","setItem","CLASS_MAIN","savedGui","JSON","parse","CLASS_CLOSE_BUTTON","CLASS_CLOSE_TOP","insertBefore","childNodes","CLASS_CLOSE_BOTTOM","titleRowName","createTextNode","addRow","CLASS_AUTO_PLACE_CONTAINER","CLASS_AUTO_PLACE","__resizeHandler","onResizeDebounced","addResizeHandle","pmouseX","drag","dragStop","CLASS_DRAG","dragStart","__resize_handle","firstElementChild","saveToLocalStorageIfPossible","stringify","getSaveObject","resetWidth","root","newDom","liBefore","li","removeListeners","markPresetModified","modified","recallSavedValue","controller","matchedIndex","controllerMap","remembered","presetMap","_add","factoryArgs","concat","before","__li","container","CLASS_CONTROLLER_ROW","augmentController","__gui","_options","nextSibling","nextElementSibling","remove","_nextSibling","_name","listen","box","method","pc","pb","returned","oldName","wasListening","newController","stopPropagation","borderLeftColor","isModified","location","addPresetOption","setSelected","showHideExplain","explain","addSaveMenu","div","__save_row","firstChild","gears","button","button2","button3","select","getElementById","localStorageCheckBox","newConstructorTextArea","which","show","focus","save","presetName","prompt","saveAs","w","getCurrentPreset","useInitialValues","savedValues","updateDisplays","controllerArray","toggleHide","CLASS_TOO_TALL","_keydownHandler","add","addColor","removeChild","destroy","subfolder","removeFolder","addFolder","newGuiParams","folders","folder","parentElement","open","close","node","offsetHeight","remember","math","controllers","dom$1","GUI$1"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/gui/dat.gui.mjs"],"sourcesContent":["/**\n * dat-gui JavaScript Controller Library\n * https://github.com/dataarts/dat.gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction ___$insertStyle(css) {\n if (!css) {\n return;\n }\n if (typeof window === 'undefined') {\n return;\n }\n\n var style = document.createElement('style');\n\n style.setAttribute('type', 'text/css');\n style.innerHTML = css;\n document.head.appendChild(style);\n\n return css;\n}\n\nfunction colorToString (color, forceCSSHex) {\n var colorFormat = color.__state.conversionName.toString();\n var r = Math.round(color.r);\n var g = Math.round(color.g);\n var b = Math.round(color.b);\n var a = color.a;\n var h = Math.round(color.h);\n var s = color.s.toFixed(1);\n var v = color.v.toFixed(1);\n if (forceCSSHex || colorFormat === 'THREE_CHAR_HEX' || colorFormat === 'SIX_CHAR_HEX') {\n var str = color.hex.toString(16);\n while (str.length < 6) {\n str = '0' + str;\n }\n return '#' + str;\n } else if (colorFormat === 'CSS_RGB') {\n return 'rgb(' + r + ',' + g + ',' + b + ')';\n } else if (colorFormat === 'CSS_RGBA') {\n return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n } else if (colorFormat === 'HEX') {\n return '0x' + color.hex.toString(16);\n } else if (colorFormat === 'RGB_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ']';\n } else if (colorFormat === 'RGBA_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ',' + a + ']';\n } else if (colorFormat === 'RGB_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + '}';\n } else if (colorFormat === 'RGBA_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}';\n } else if (colorFormat === 'HSV_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + '}';\n } else if (colorFormat === 'HSVA_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}';\n }\n return 'unknown format';\n}\n\nvar ARR_EACH = Array.prototype.forEach;\nvar ARR_SLICE = Array.prototype.slice;\nvar Common = {\n BREAK: {},\n extend: function extend(target) {\n this.each(ARR_SLICE.call(arguments, 1), function (obj) {\n var keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function (key) {\n if (!this.isUndefined(obj[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n return target;\n },\n defaults: function defaults(target) {\n this.each(ARR_SLICE.call(arguments, 1), function (obj) {\n var keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function (key) {\n if (this.isUndefined(target[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n return target;\n },\n compose: function compose() {\n var toCall = ARR_SLICE.call(arguments);\n return function () {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length - 1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n };\n },\n each: function each(obj, itr, scope) {\n if (!obj) {\n return;\n }\n if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) {\n obj.forEach(itr, scope);\n } else if (obj.length === obj.length + 0) {\n var key = void 0;\n var l = void 0;\n for (key = 0, l = obj.length; key < l; key++) {\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n } else {\n for (var _key in obj) {\n if (itr.call(scope, obj[_key], _key) === this.BREAK) {\n return;\n }\n }\n }\n },\n defer: function defer(fnc) {\n setTimeout(fnc, 0);\n },\n debounce: function debounce(func, threshold, callImmediately) {\n var timeout = void 0;\n return function () {\n var obj = this;\n var args = arguments;\n function delayed() {\n timeout = null;\n if (!callImmediately) func.apply(obj, args);\n }\n var callNow = callImmediately || !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(delayed, threshold);\n if (callNow) {\n func.apply(obj, args);\n }\n };\n },\n toArray: function toArray(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n isUndefined: function isUndefined(obj) {\n return obj === undefined;\n },\n isNull: function isNull(obj) {\n return obj === null;\n },\n isNaN: function (_isNaN) {\n function isNaN(_x) {\n return _isNaN.apply(this, arguments);\n }\n isNaN.toString = function () {\n return _isNaN.toString();\n };\n return isNaN;\n }(function (obj) {\n return isNaN(obj);\n }),\n isArray: Array.isArray || function (obj) {\n return obj.constructor === Array;\n },\n isObject: function isObject(obj) {\n return obj === Object(obj);\n },\n isNumber: function isNumber(obj) {\n return obj === obj + 0;\n },\n isString: function isString(obj) {\n return obj === obj + '';\n },\n isBoolean: function isBoolean(obj) {\n return obj === false || obj === true;\n },\n isFunction: function isFunction(obj) {\n return obj instanceof Function;\n }\n};\n\nvar INTERPRETATIONS = [\n{\n litmus: Common.isString,\n conversions: {\n THREE_CHAR_HEX: {\n read: function read(original) {\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) {\n return false;\n }\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0)\n };\n },\n write: colorToString\n },\n SIX_CHAR_HEX: {\n read: function read(original) {\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) {\n return false;\n }\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString(), 0)\n };\n },\n write: colorToString\n },\n CSS_RGB: {\n read: function read(original) {\n var test = original.match(/^rgb\\(\\s*(\\S+)\\s*,\\s*(\\S+)\\s*,\\s*(\\S+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n },\n write: colorToString\n },\n CSS_RGBA: {\n read: function read(original) {\n var test = original.match(/^rgba\\(\\s*(\\S+)\\s*,\\s*(\\S+)\\s*,\\s*(\\S+)\\s*,\\s*(\\S+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n },\n write: colorToString\n }\n }\n},\n{\n litmus: Common.isNumber,\n conversions: {\n HEX: {\n read: function read(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n };\n },\n write: function write(color) {\n return color.hex;\n }\n }\n }\n},\n{\n litmus: Common.isArray,\n conversions: {\n RGB_ARRAY: {\n read: function read(original) {\n if (original.length !== 3) {\n return false;\n }\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n write: function write(color) {\n return [color.r, color.g, color.b];\n }\n },\n RGBA_ARRAY: {\n read: function read(original) {\n if (original.length !== 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n write: function write(color) {\n return [color.r, color.g, color.b, color.a];\n }\n }\n }\n},\n{\n litmus: Common.isObject,\n conversions: {\n RGBA_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b) && Common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n };\n }\n },\n RGB_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n };\n }\n },\n HSVA_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v) && Common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n };\n }\n },\n HSV_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n };\n }\n }\n }\n}];\nvar result = void 0;\nvar toReturn = void 0;\nvar interpret = function interpret() {\n toReturn = false;\n var original = arguments.length > 1 ? Common.toArray(arguments) : arguments[0];\n Common.each(INTERPRETATIONS, function (family) {\n if (family.litmus(original)) {\n Common.each(family.conversions, function (conversion, conversionName) {\n result = conversion.read(original);\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return Common.BREAK;\n }\n });\n return Common.BREAK;\n }\n });\n return toReturn;\n};\n\nvar tmpComponent = void 0;\nvar ColorMath = {\n hsv_to_rgb: function hsv_to_rgb(h, s, v) {\n var hi = Math.floor(h / 60) % 6;\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - f * s);\n var t = v * (1.0 - (1.0 - f) * s);\n var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi];\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n },\n rgb_to_hsv: function rgb_to_hsv(r, g, b) {\n var min = Math.min(r, g, b);\n var max = Math.max(r, g, b);\n var delta = max - min;\n var h = void 0;\n var s = void 0;\n if (max !== 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n if (r === max) {\n h = (g - b) / delta;\n } else if (g === max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n rgb_to_hex: function rgb_to_hex(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n component_from_hex: function component_from_hex(hex, componentIndex) {\n return hex >> componentIndex * 8 & 0xFF;\n },\n hex_with_component: function hex_with_component(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent);\n }\n};\n\nvar _typeof = typeof Symbol === 'function' && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === 'function' && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n\n\n\n\n\n\nvar get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;\n\n if (getter === undefined) {\n return undefined;\n }\n\n return getter.call(receiver);\n }\n};\n\nvar inherits = function (subClass, superClass) {\n if (typeof superClass !== 'function' && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar possibleConstructorReturn = function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === 'object' || typeof call === 'function') ? call : self;\n};\n\nvar Color = function () {\n function Color() {\n classCallCheck(this, Color);\n this.__state = interpret.apply(this, arguments);\n if (this.__state === false) {\n throw new Error('Failed to interpret color arguments');\n }\n this.__state.a = this.__state.a || 1;\n }\n createClass(Color, [{\n key: 'toString',\n value: function toString() {\n return colorToString(this);\n }\n }, {\n key: 'toHexString',\n value: function toHexString() {\n return colorToString(this, true);\n }\n }, {\n key: 'toOriginal',\n value: function toOriginal() {\n return this.__state.conversion.write(this);\n }\n }]);\n return Color;\n}();\nfunction defineRGBComponent(target, component, componentHexIndex) {\n Object.defineProperty(target, component, {\n get: function get$$1() {\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n Color.recalculateRGB(this, component, componentHexIndex);\n return this.__state[component];\n },\n set: function set$$1(v) {\n if (this.__state.space !== 'RGB') {\n Color.recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n this.__state[component] = v;\n }\n });\n}\nfunction defineHSVComponent(target, component) {\n Object.defineProperty(target, component, {\n get: function get$$1() {\n if (this.__state.space === 'HSV') {\n return this.__state[component];\n }\n Color.recalculateHSV(this);\n return this.__state[component];\n },\n set: function set$$1(v) {\n if (this.__state.space !== 'HSV') {\n Color.recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n this.__state[component] = v;\n }\n });\n}\nColor.recalculateRGB = function (color, component, componentHexIndex) {\n if (color.__state.space === 'HEX') {\n color.__state[component] = ColorMath.component_from_hex(color.__state.hex, componentHexIndex);\n } else if (color.__state.space === 'HSV') {\n Common.extend(color.__state, ColorMath.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n } else {\n throw new Error('Corrupted color state');\n }\n};\nColor.recalculateHSV = function (color) {\n var result = ColorMath.rgb_to_hsv(color.r, color.g, color.b);\n Common.extend(color.__state, {\n s: result.s,\n v: result.v\n });\n if (!Common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (Common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n};\nColor.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a'];\ndefineRGBComponent(Color.prototype, 'r', 2);\ndefineRGBComponent(Color.prototype, 'g', 1);\ndefineRGBComponent(Color.prototype, 'b', 0);\ndefineHSVComponent(Color.prototype, 'h');\ndefineHSVComponent(Color.prototype, 's');\ndefineHSVComponent(Color.prototype, 'v');\nObject.defineProperty(Color.prototype, 'a', {\n get: function get$$1() {\n return this.__state.a;\n },\n set: function set$$1(v) {\n this.__state.a = v;\n }\n});\nObject.defineProperty(Color.prototype, 'hex', {\n get: function get$$1() {\n if (this.__state.space !== 'HEX') {\n this.__state.hex = ColorMath.rgb_to_hex(this.r, this.g, this.b);\n this.__state.space = 'HEX';\n }\n return this.__state.hex;\n },\n set: function set$$1(v) {\n this.__state.space = 'HEX';\n this.__state.hex = v;\n }\n});\n\nvar Controller = function () {\n function Controller(object, property) {\n classCallCheck(this, Controller);\n this.initialValue = object[property];\n this.domElement = document.createElement('div');\n this.object = object;\n this.property = property;\n this.__onChange = undefined;\n this.__onFinishChange = undefined;\n }\n createClass(Controller, [{\n key: 'onChange',\n value: function onChange(fnc) {\n this.__onChange = fnc;\n return this;\n }\n }, {\n key: 'onFinishChange',\n value: function onFinishChange(fnc) {\n this.__onFinishChange = fnc;\n return this;\n }\n }, {\n key: 'setValue',\n value: function setValue(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n }\n }, {\n key: 'getValue',\n value: function getValue() {\n return this.object[this.property];\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n return this;\n }\n }, {\n key: 'isModified',\n value: function isModified() {\n return this.initialValue !== this.getValue();\n }\n }]);\n return Controller;\n}();\n\nvar EVENT_MAP = {\n HTMLEvents: ['change'],\n MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'],\n KeyboardEvents: ['keydown']\n};\nvar EVENT_MAP_INV = {};\nCommon.each(EVENT_MAP, function (v, k) {\n Common.each(v, function (e) {\n EVENT_MAP_INV[e] = k;\n });\n});\nvar CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\nfunction cssValueToPixels(val) {\n if (val === '0' || Common.isUndefined(val)) {\n return 0;\n }\n var match = val.match(CSS_VALUE_PIXELS);\n if (!Common.isNull(match)) {\n return parseFloat(match[1]);\n }\n return 0;\n}\nvar dom = {\n makeSelectable: function makeSelectable(elem, selectable) {\n if (elem === undefined || elem.style === undefined) return;\n elem.onselectstart = selectable ? function () {\n return false;\n } : function () {};\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n },\n makeFullscreen: function makeFullscreen(elem, hor, vert) {\n var vertical = vert;\n var horizontal = hor;\n if (Common.isUndefined(horizontal)) {\n horizontal = true;\n }\n if (Common.isUndefined(vertical)) {\n vertical = true;\n }\n elem.style.position = 'absolute';\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n },\n fakeEvent: function fakeEvent(elem, eventType, pars, aux) {\n var params = pars || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n {\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0,\n 0,\n clientX,\n clientY,\n false, false, false, false, 0, null);\n break;\n }\n case 'KeyboardEvents':\n {\n var init = evt.initKeyboardEvent || evt.initKeyEvent;\n Common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode);\n break;\n }\n default:\n {\n evt.initEvent(eventType, params.bubbles || false, params.cancelable || true);\n break;\n }\n }\n Common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n bind: function bind(elem, event, func, newBool) {\n var bool = newBool || false;\n if (elem.addEventListener) {\n elem.addEventListener(event, func, bool);\n } else if (elem.attachEvent) {\n elem.attachEvent('on' + event, func);\n }\n return dom;\n },\n unbind: function unbind(elem, event, func, newBool) {\n var bool = newBool || false;\n if (elem.removeEventListener) {\n elem.removeEventListener(event, func, bool);\n } else if (elem.detachEvent) {\n elem.detachEvent('on' + event, func);\n }\n return dom;\n },\n addClass: function addClass(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) === -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n removeClass: function removeClass(elem, className) {\n if (className) {\n if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index !== -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n hasClass: function hasClass(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n getWidth: function getWidth(elem) {\n var style = getComputedStyle(elem);\n return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width);\n },\n getHeight: function getHeight(elem) {\n var style = getComputedStyle(elem);\n return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height);\n },\n getOffset: function getOffset(el) {\n var elem = el;\n var offset = { left: 0, top: 0 };\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n elem = elem.offsetParent;\n } while (elem);\n }\n return offset;\n },\n isActive: function isActive(elem) {\n return elem === document.activeElement && (elem.type || elem.href);\n }\n};\n\nvar BooleanController = function (_Controller) {\n inherits(BooleanController, _Controller);\n function BooleanController(object, property) {\n classCallCheck(this, BooleanController);\n var _this2 = possibleConstructorReturn(this, (BooleanController.__proto__ || Object.getPrototypeOf(BooleanController)).call(this, object, property));\n var _this = _this2;\n _this2.__prev = _this2.getValue();\n _this2.__checkbox = document.createElement('input');\n _this2.__checkbox.setAttribute('type', 'checkbox');\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n dom.bind(_this2.__checkbox, 'change', onChange, false);\n _this2.domElement.appendChild(_this2.__checkbox);\n _this2.updateDisplay();\n return _this2;\n }\n createClass(BooleanController, [{\n key: 'setValue',\n value: function setValue(v) {\n var toReturn = get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'setValue', this).call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true;\n this.__prev = true;\n } else {\n this.__checkbox.checked = false;\n this.__prev = false;\n }\n return get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return BooleanController;\n}(Controller);\n\nvar OptionController = function (_Controller) {\n inherits(OptionController, _Controller);\n function OptionController(object, property, opts) {\n classCallCheck(this, OptionController);\n var _this2 = possibleConstructorReturn(this, (OptionController.__proto__ || Object.getPrototypeOf(OptionController)).call(this, object, property));\n var options = opts;\n var _this = _this2;\n _this2.__select = document.createElement('select');\n if (Common.isArray(options)) {\n var map = {};\n Common.each(options, function (element) {\n map[element] = element;\n });\n options = map;\n }\n Common.each(options, function (value, key) {\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n });\n _this2.updateDisplay();\n dom.bind(_this2.__select, 'change', function () {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n _this2.domElement.appendChild(_this2.__select);\n return _this2;\n }\n createClass(OptionController, [{\n key: 'setValue',\n value: function setValue(v) {\n var toReturn = get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'setValue', this).call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (dom.isActive(this.__select)) return this;\n this.__select.value = this.getValue();\n return get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return OptionController;\n}(Controller);\n\nvar StringController = function (_Controller) {\n inherits(StringController, _Controller);\n function StringController(object, property) {\n classCallCheck(this, StringController);\n var _this2 = possibleConstructorReturn(this, (StringController.__proto__ || Object.getPrototypeOf(StringController)).call(this, object, property));\n var _this = _this2;\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n _this2.__input = document.createElement('input');\n _this2.__input.setAttribute('type', 'text');\n dom.bind(_this2.__input, 'keyup', onChange);\n dom.bind(_this2.__input, 'change', onChange);\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n _this2.updateDisplay();\n _this2.domElement.appendChild(_this2.__input);\n return _this2;\n }\n createClass(StringController, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return get(StringController.prototype.__proto__ || Object.getPrototypeOf(StringController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return StringController;\n}(Controller);\n\nfunction numDecimals(x) {\n var _x = x.toString();\n if (_x.indexOf('.') > -1) {\n return _x.length - _x.indexOf('.') - 1;\n }\n return 0;\n}\nvar NumberController = function (_Controller) {\n inherits(NumberController, _Controller);\n function NumberController(object, property, params) {\n classCallCheck(this, NumberController);\n var _this = possibleConstructorReturn(this, (NumberController.__proto__ || Object.getPrototypeOf(NumberController)).call(this, object, property));\n var _params = params || {};\n _this.__min = _params.min;\n _this.__max = _params.max;\n _this.__step = _params.step;\n if (Common.isUndefined(_this.__step)) {\n if (_this.initialValue === 0) {\n _this.__impliedStep = 1;\n } else {\n _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10;\n }\n } else {\n _this.__impliedStep = _this.__step;\n }\n _this.__precision = numDecimals(_this.__impliedStep);\n return _this;\n }\n createClass(NumberController, [{\n key: 'setValue',\n value: function setValue(v) {\n var _v = v;\n if (this.__min !== undefined && _v < this.__min) {\n _v = this.__min;\n } else if (this.__max !== undefined && _v > this.__max) {\n _v = this.__max;\n }\n if (this.__step !== undefined && _v % this.__step !== 0) {\n _v = Math.round(_v / this.__step) * this.__step;\n }\n return get(NumberController.prototype.__proto__ || Object.getPrototypeOf(NumberController.prototype), 'setValue', this).call(this, _v);\n }\n }, {\n key: 'min',\n value: function min(minValue) {\n this.__min = minValue;\n return this;\n }\n }, {\n key: 'max',\n value: function max(maxValue) {\n this.__max = maxValue;\n return this;\n }\n }, {\n key: 'step',\n value: function step(stepValue) {\n this.__step = stepValue;\n this.__impliedStep = stepValue;\n this.__precision = numDecimals(stepValue);\n return this;\n }\n }]);\n return NumberController;\n}(Controller);\n\nfunction roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n}\nvar NumberControllerBox = function (_NumberController) {\n inherits(NumberControllerBox, _NumberController);\n function NumberControllerBox(object, property, params) {\n classCallCheck(this, NumberControllerBox);\n var _this2 = possibleConstructorReturn(this, (NumberControllerBox.__proto__ || Object.getPrototypeOf(NumberControllerBox)).call(this, object, property, params));\n _this2.__truncationSuspended = false;\n var _this = _this2;\n var prevY = void 0;\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!Common.isNaN(attempted)) {\n _this.setValue(attempted);\n }\n }\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n function onBlur() {\n onFinish();\n }\n function onMouseDrag(e) {\n var diff = prevY - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n prevY = e.clientY;\n }\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n onFinish();\n }\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prevY = e.clientY;\n }\n _this2.__input = document.createElement('input');\n _this2.__input.setAttribute('type', 'text');\n dom.bind(_this2.__input, 'change', onChange);\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__input, 'mousedown', onMouseDown);\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n onFinish();\n }\n });\n _this2.updateDisplay();\n _this2.domElement.appendChild(_this2.__input);\n return _this2;\n }\n createClass(NumberControllerBox, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return get(NumberControllerBox.prototype.__proto__ || Object.getPrototypeOf(NumberControllerBox.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return NumberControllerBox;\n}(NumberController);\n\nfunction map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n}\nvar NumberControllerSlider = function (_NumberController) {\n inherits(NumberControllerSlider, _NumberController);\n function NumberControllerSlider(object, property, min, max, step) {\n classCallCheck(this, NumberControllerSlider);\n var _this2 = possibleConstructorReturn(this, (NumberControllerSlider.__proto__ || Object.getPrototypeOf(NumberControllerSlider)).call(this, object, property, { min: min, max: max, step: step }));\n var _this = _this2;\n _this2.__background = document.createElement('div');\n _this2.__foreground = document.createElement('div');\n dom.bind(_this2.__background, 'mousedown', onMouseDown);\n dom.bind(_this2.__background, 'touchstart', onTouchStart);\n dom.addClass(_this2.__background, 'slider');\n dom.addClass(_this2.__foreground, 'slider-fg');\n function onMouseDown(e) {\n document.activeElement.blur();\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n onMouseDrag(e);\n }\n function onMouseDrag(e) {\n e.preventDefault();\n var bgRect = _this.__background.getBoundingClientRect();\n _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max));\n return false;\n }\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n function onTouchStart(e) {\n if (e.touches.length !== 1) {\n return;\n }\n dom.bind(window, 'touchmove', onTouchMove);\n dom.bind(window, 'touchend', onTouchEnd);\n onTouchMove(e);\n }\n function onTouchMove(e) {\n var clientX = e.touches[0].clientX;\n var bgRect = _this.__background.getBoundingClientRect();\n _this.setValue(map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max));\n }\n function onTouchEnd() {\n dom.unbind(window, 'touchmove', onTouchMove);\n dom.unbind(window, 'touchend', onTouchEnd);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n _this2.updateDisplay();\n _this2.__background.appendChild(_this2.__foreground);\n _this2.domElement.appendChild(_this2.__background);\n return _this2;\n }\n createClass(NumberControllerSlider, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n var pct = (this.getValue() - this.__min) / (this.__max - this.__min);\n this.__foreground.style.width = pct * 100 + '%';\n return get(NumberControllerSlider.prototype.__proto__ || Object.getPrototypeOf(NumberControllerSlider.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return NumberControllerSlider;\n}(NumberController);\n\nvar FunctionController = function (_Controller) {\n inherits(FunctionController, _Controller);\n function FunctionController(object, property, text) {\n classCallCheck(this, FunctionController);\n var _this2 = possibleConstructorReturn(this, (FunctionController.__proto__ || Object.getPrototypeOf(FunctionController)).call(this, object, property));\n var _this = _this2;\n _this2.__button = document.createElement('div');\n _this2.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(_this2.__button, 'click', function (e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n dom.addClass(_this2.__button, 'button');\n _this2.domElement.appendChild(_this2.__button);\n return _this2;\n }\n createClass(FunctionController, [{\n key: 'fire',\n value: function fire() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n this.getValue().call(this.object);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n }\n }]);\n return FunctionController;\n}(Controller);\n\nvar ColorController = function (_Controller) {\n inherits(ColorController, _Controller);\n function ColorController(object, property) {\n classCallCheck(this, ColorController);\n var _this2 = possibleConstructorReturn(this, (ColorController.__proto__ || Object.getPrototypeOf(ColorController)).call(this, object, property));\n _this2.__color = new Color(_this2.getValue());\n _this2.__temp = new Color(0);\n var _this = _this2;\n _this2.domElement = document.createElement('div');\n dom.makeSelectable(_this2.domElement, false);\n _this2.__selector = document.createElement('div');\n _this2.__selector.className = 'selector';\n _this2.__saturation_field = document.createElement('div');\n _this2.__saturation_field.className = 'saturation-field';\n _this2.__field_knob = document.createElement('div');\n _this2.__field_knob.className = 'field-knob';\n _this2.__field_knob_border = '2px solid ';\n _this2.__hue_knob = document.createElement('div');\n _this2.__hue_knob.className = 'hue-knob';\n _this2.__hue_field = document.createElement('div');\n _this2.__hue_field.className = 'hue-field';\n _this2.__input = document.createElement('input');\n _this2.__input.type = 'text';\n _this2.__input_textShadow = '0 1px 1px ';\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n onBlur.call(this);\n }\n });\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__selector, 'mousedown', function () {\n dom.addClass(this, 'drag').bind(window, 'mouseup', function () {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n dom.bind(_this2.__selector, 'touchstart', function () {\n dom.addClass(this, 'drag').bind(window, 'touchend', function () {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n var valueField = document.createElement('div');\n Common.extend(_this2.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n Common.extend(_this2.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n Common.extend(_this2.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n Common.extend(_this2.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n Common.extend(valueField.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000');\n Common.extend(_this2.__hue_field.style, {\n width: '15px',\n height: '100px',\n border: '1px solid #555',\n cursor: 'ns-resize',\n position: 'absolute',\n top: '3px',\n right: '3px'\n });\n hueGradient(_this2.__hue_field);\n Common.extend(_this2.__input.style, {\n outline: 'none',\n textAlign: 'center',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n dom.bind(_this2.__saturation_field, 'mousedown', fieldDown);\n dom.bind(_this2.__saturation_field, 'touchstart', fieldDown);\n dom.bind(_this2.__field_knob, 'mousedown', fieldDown);\n dom.bind(_this2.__field_knob, 'touchstart', fieldDown);\n dom.bind(_this2.__hue_field, 'mousedown', fieldDownH);\n dom.bind(_this2.__hue_field, 'touchstart', fieldDownH);\n function fieldDown(e) {\n setSV(e);\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'touchmove', setSV);\n dom.bind(window, 'mouseup', fieldUpSV);\n dom.bind(window, 'touchend', fieldUpSV);\n }\n function fieldDownH(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'touchmove', setH);\n dom.bind(window, 'mouseup', fieldUpH);\n dom.bind(window, 'touchend', fieldUpH);\n }\n function fieldUpSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'touchmove', setSV);\n dom.unbind(window, 'mouseup', fieldUpSV);\n dom.unbind(window, 'touchend', fieldUpSV);\n onFinish();\n }\n function fieldUpH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'touchmove', setH);\n dom.unbind(window, 'mouseup', fieldUpH);\n dom.unbind(window, 'touchend', fieldUpH);\n onFinish();\n }\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.__color.toOriginal());\n }\n }\n _this2.__saturation_field.appendChild(valueField);\n _this2.__selector.appendChild(_this2.__field_knob);\n _this2.__selector.appendChild(_this2.__saturation_field);\n _this2.__selector.appendChild(_this2.__hue_field);\n _this2.__hue_field.appendChild(_this2.__hue_knob);\n _this2.domElement.appendChild(_this2.__input);\n _this2.domElement.appendChild(_this2.__selector);\n _this2.updateDisplay();\n function setSV(e) {\n if (e.type.indexOf('touch') === -1) {\n e.preventDefault();\n }\n var fieldRect = _this.__saturation_field.getBoundingClientRect();\n var _ref = e.touches && e.touches[0] || e,\n clientX = _ref.clientX,\n clientY = _ref.clientY;\n var s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left);\n var v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n if (v > 1) {\n v = 1;\n } else if (v < 0) {\n v = 0;\n }\n if (s > 1) {\n s = 1;\n } else if (s < 0) {\n s = 0;\n }\n _this.__color.v = v;\n _this.__color.s = s;\n _this.setValue(_this.__color.toOriginal());\n return false;\n }\n function setH(e) {\n if (e.type.indexOf('touch') === -1) {\n e.preventDefault();\n }\n var fieldRect = _this.__hue_field.getBoundingClientRect();\n var _ref2 = e.touches && e.touches[0] || e,\n clientY = _ref2.clientY;\n var h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n if (h > 1) {\n h = 1;\n } else if (h < 0) {\n h = 0;\n }\n _this.__color.h = h * 360;\n _this.setValue(_this.__color.toOriginal());\n return false;\n }\n return _this2;\n }\n createClass(ColorController, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n var i = interpret(this.getValue());\n if (i !== false) {\n var mismatch = false;\n Common.each(Color.COMPONENTS, function (component) {\n if (!Common.isUndefined(i[component]) && !Common.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {};\n }\n }, this);\n if (mismatch) {\n Common.extend(this.__color.__state, i);\n }\n }\n Common.extend(this.__temp.__state, this.__color.__state);\n this.__temp.a = 1;\n var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0;\n var _flip = 255 - flip;\n Common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toHexString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')'\n });\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px';\n this.__temp.s = 1;\n this.__temp.v = 1;\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString());\n this.__input.value = this.__color.toString();\n Common.extend(this.__input.style, {\n backgroundColor: this.__color.toHexString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip + ')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)'\n });\n }\n }]);\n return ColorController;\n}(Controller);\nvar vendors = ['-moz-', '-o-', '-webkit-', '-ms-', ''];\nfunction linearGradient(elem, x, a, b) {\n elem.style.background = '';\n Common.each(vendors, function (vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); ';\n });\n}\nfunction hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);';\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n}\n\nvar css = {\n load: function load(url, indoc) {\n var doc = indoc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function inject(cssContent, indoc) {\n var doc = indoc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = cssContent;\n var head = doc.getElementsByTagName('head')[0];\n try {\n head.appendChild(injected);\n } catch (e) {\n }\n }\n};\n\nvar saveDialogContents = \"
\\n\\n Here's the new load parameter for your GUI's constructor:\\n\\n \\n\\n
\\n\\n Automatically save\\n values to localStorage on exit.\\n\\n
The values saved to localStorage will\\n override those passed to dat.GUI's constructor. This makes it\\n easier to work incrementally, but localStorage is fragile,\\n and your friends may not see the same values you do.\\n\\n
\\n\\n
\\n\\n
\";\n\nvar ControllerFactory = function ControllerFactory(object, property) {\n var initialValue = object[property];\n if (Common.isArray(arguments[2]) || Common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n if (Common.isNumber(initialValue)) {\n if (Common.isNumber(arguments[2]) && Common.isNumber(arguments[3])) {\n if (Common.isNumber(arguments[4])) {\n return new NumberControllerSlider(object, property, arguments[2], arguments[3], arguments[4]);\n }\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n }\n if (Common.isNumber(arguments[4])) {\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3], step: arguments[4] });\n }\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n }\n if (Common.isString(initialValue)) {\n return new StringController(object, property);\n }\n if (Common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n if (Common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n return null;\n};\n\nfunction requestAnimationFrame(callback) {\n setTimeout(callback, 1000 / 60);\n}\nvar requestAnimationFrame$1 = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame;\n\nvar CenteredDiv = function () {\n function CenteredDiv() {\n classCallCheck(this, CenteredDiv);\n this.backgroundElement = document.createElement('div');\n Common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear',\n transition: 'opacity 0.2s linear'\n });\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n this.domElement = document.createElement('div');\n Common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear',\n transition: 'transform 0.2s ease-out, opacity 0.2s linear'\n });\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function () {\n _this.hide();\n });\n }\n createClass(CenteredDiv, [{\n key: 'show',\n value: function show() {\n var _this = this;\n this.backgroundElement.style.display = 'block';\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n this.layout();\n Common.defer(function () {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n }\n }, {\n key: 'hide',\n value: function hide() {\n var _this = this;\n var hide = function hide() {\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n };\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n this.backgroundElement.style.opacity = 0;\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n }\n }, {\n key: 'layout',\n value: function layout() {\n this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px';\n }\n }]);\n return CenteredDiv;\n}();\n\nvar styleSheet = ___$insertStyle(\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .cr.function .property-name{width:100%}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\");\n\ncss.inject(styleSheet);\nvar CSS_NAMESPACE = 'dg';\nvar HIDE_KEY_CODE = 72;\nvar CLOSE_BUTTON_HEIGHT = 20;\nvar DEFAULT_DEFAULT_PRESET_NAME = 'Default';\nvar SUPPORTS_LOCAL_STORAGE = function () {\n try {\n return !!window.localStorage;\n } catch (e) {\n return false;\n }\n}();\nvar SAVE_DIALOGUE = void 0;\nvar autoPlaceVirgin = true;\nvar autoPlaceContainer = void 0;\nvar hide = false;\nvar hideableGuis = [];\nvar GUI = function GUI(pars) {\n var _this = this;\n var params = pars || {};\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n dom.addClass(this.domElement, CSS_NAMESPACE);\n this.__folders = {};\n this.__controllers = [];\n this.__rememberedObjects = [];\n this.__rememberedObjectIndecesToControllers = [];\n this.__listening = [];\n params = Common.defaults(params, {\n closeOnTop: false,\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n params = Common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n if (!Common.isUndefined(params.load)) {\n if (params.preset) {\n params.load.preset = params.preset;\n }\n } else {\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n }\n if (Common.isUndefined(params.parent) && params.hideable) {\n hideableGuis.push(this);\n }\n params.resizable = Common.isUndefined(params.parent) && params.resizable;\n if (params.autoPlace && Common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n var saveToLocalStorage = void 0;\n var titleRow = void 0;\n Object.defineProperties(this,\n {\n parent: {\n get: function get$$1() {\n return params.parent;\n }\n },\n scrollable: {\n get: function get$$1() {\n return params.scrollable;\n }\n },\n autoPlace: {\n get: function get$$1() {\n return params.autoPlace;\n }\n },\n closeOnTop: {\n get: function get$$1() {\n return params.closeOnTop;\n }\n },\n preset: {\n get: function get$$1() {\n if (_this.parent) {\n return _this.getRoot().preset;\n }\n return params.load.preset;\n },\n set: function set$$1(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n },\n width: {\n get: function get$$1() {\n return params.width;\n },\n set: function set$$1(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n name: {\n get: function get$$1() {\n return params.name;\n },\n set: function set$$1(v) {\n params.name = v;\n if (titleRow) {\n titleRow.innerHTML = params.name;\n }\n }\n },\n closed: {\n get: function get$$1() {\n return params.closed;\n },\n set: function set$$1(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n this.onResize();\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n load: {\n get: function get$$1() {\n return params.load;\n }\n },\n useLocalStorage: {\n get: function get$$1() {\n return useLocalStorage;\n },\n set: function set$$1(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n useLocalStorage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n }\n });\n if (Common.isUndefined(params.parent)) {\n this.closed = params.closed || false;\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n if (SUPPORTS_LOCAL_STORAGE) {\n if (useLocalStorage) {\n _this.useLocalStorage = true;\n var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n if (savedGui) {\n params.load = JSON.parse(savedGui);\n }\n }\n }\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n if (params.closeOnTop) {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP);\n this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]);\n } else {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM);\n this.domElement.appendChild(this.__closeButton);\n }\n dom.bind(this.__closeButton, 'click', function () {\n _this.closed = !_this.closed;\n });\n } else {\n if (params.closed === undefined) {\n params.closed = true;\n }\n var titleRowName = document.createTextNode(params.name);\n dom.addClass(titleRowName, 'controller-name');\n titleRow = addRow(_this, titleRowName);\n var onClickTitle = function onClickTitle(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n dom.addClass(titleRow, 'title');\n dom.bind(titleRow, 'click', onClickTitle);\n if (!params.closed) {\n this.closed = false;\n }\n }\n if (params.autoPlace) {\n if (Common.isUndefined(params.parent)) {\n if (autoPlaceVirgin) {\n autoPlaceContainer = document.createElement('div');\n dom.addClass(autoPlaceContainer, CSS_NAMESPACE);\n dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(autoPlaceContainer);\n autoPlaceVirgin = false;\n }\n autoPlaceContainer.appendChild(this.domElement);\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n }\n if (!this.parent) {\n setWidth(_this, params.width);\n }\n }\n this.__resizeHandler = function () {\n _this.onResizeDebounced();\n };\n dom.bind(window, 'resize', this.__resizeHandler);\n dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler);\n dom.bind(this.__ul, 'transitionend', this.__resizeHandler);\n dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler);\n this.onResize();\n if (params.resizable) {\n addResizeHandle(this);\n }\n saveToLocalStorage = function saveToLocalStorage() {\n if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n };\n this.saveToLocalStorageIfPossible = saveToLocalStorage;\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n Common.defer(function () {\n root.width -= 1;\n });\n }\n if (!params.parent) {\n resetWidth();\n }\n};\nGUI.toggleHide = function () {\n hide = !hide;\n Common.each(hideableGuis, function (gui) {\n gui.domElement.style.display = hide ? 'none' : '';\n });\n};\nGUI.CLASS_AUTO_PLACE = 'a';\nGUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\nGUI.CLASS_MAIN = 'main';\nGUI.CLASS_CONTROLLER_ROW = 'cr';\nGUI.CLASS_TOO_TALL = 'taller-than-window';\nGUI.CLASS_CLOSED = 'closed';\nGUI.CLASS_CLOSE_BUTTON = 'close-button';\nGUI.CLASS_CLOSE_TOP = 'close-top';\nGUI.CLASS_CLOSE_BOTTOM = 'close-bottom';\nGUI.CLASS_DRAG = 'drag';\nGUI.DEFAULT_WIDTH = 245;\nGUI.TEXT_CLOSED = 'Close Controls';\nGUI.TEXT_OPEN = 'Open Controls';\nGUI._keydownHandler = function (e) {\n if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n};\ndom.bind(window, 'keydown', GUI._keydownHandler, false);\nCommon.extend(GUI.prototype,\n{\n add: function add(object, property) {\n return _add(this, object, property, {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n });\n },\n addColor: function addColor(object, property) {\n return _add(this, object, property, {\n color: true\n });\n },\n remove: function remove(controller) {\n this.__ul.removeChild(controller.__li);\n this.__controllers.splice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n Common.defer(function () {\n _this.onResize();\n });\n },\n destroy: function destroy() {\n if (this.parent) {\n throw new Error('Only the root GUI should be removed with .destroy(). ' + 'For subfolders, use gui.removeFolder(folder) instead.');\n }\n if (this.autoPlace) {\n autoPlaceContainer.removeChild(this.domElement);\n }\n var _this = this;\n Common.each(this.__folders, function (subfolder) {\n _this.removeFolder(subfolder);\n });\n dom.unbind(window, 'keydown', GUI._keydownHandler, false);\n removeListeners(this);\n },\n addFolder: function addFolder(name) {\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' + ' name \"' + name + '\"');\n }\n var newGuiParams = { name: name, parent: this };\n newGuiParams.autoPlace = this.autoPlace;\n if (this.load &&\n this.load.folders &&\n this.load.folders[name]) {\n newGuiParams.closed = this.load.folders[name].closed;\n newGuiParams.load = this.load.folders[name];\n }\n var gui = new GUI(newGuiParams);\n this.__folders[name] = gui;\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n },\n removeFolder: function removeFolder(folder) {\n this.__ul.removeChild(folder.domElement.parentElement);\n delete this.__folders[folder.name];\n if (this.load &&\n this.load.folders &&\n this.load.folders[folder.name]) {\n delete this.load.folders[folder.name];\n }\n removeListeners(folder);\n var _this = this;\n Common.each(folder.__folders, function (subfolder) {\n folder.removeFolder(subfolder);\n });\n Common.defer(function () {\n _this.onResize();\n });\n },\n open: function open() {\n this.closed = false;\n },\n close: function close() {\n this.closed = true;\n },\n hide: function hide() {\n this.domElement.style.display = 'none';\n },\n show: function show() {\n this.domElement.style.display = '';\n },\n onResize: function onResize() {\n var root = this.getRoot();\n if (root.scrollable) {\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n Common.each(root.__ul.childNodes, function (node) {\n if (!(root.autoPlace && node === root.__save_row)) {\n h += dom.getHeight(node);\n }\n });\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n }\n if (root.__resize_handle) {\n Common.defer(function () {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n },\n onResizeDebounced: Common.debounce(function () {\n this.onResize();\n }, 50),\n remember: function remember() {\n if (Common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogContents;\n }\n if (this.parent) {\n throw new Error('You can only call remember on a top level GUI.');\n }\n var _this = this;\n Common.each(Array.prototype.slice.call(arguments), function (object) {\n if (_this.__rememberedObjects.length === 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) === -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n if (this.autoPlace) {\n setWidth(this, this.width);\n }\n },\n getRoot: function getRoot() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n getSaveObject: function getSaveObject() {\n var toReturn = this.load;\n toReturn.closed = this.closed;\n if (this.__rememberedObjects.length > 0) {\n toReturn.preset = this.preset;\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n }\n toReturn.folders = {};\n Common.each(this.__folders, function (element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n return toReturn;\n },\n save: function save() {\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n this.saveToLocalStorageIfPossible();\n },\n saveAs: function saveAs(presetName) {\n if (!this.load.remembered) {\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n }\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n this.saveToLocalStorageIfPossible();\n },\n revert: function revert(gui) {\n Common.each(this.__controllers, function (controller) {\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n if (controller.__onFinishChange) {\n controller.__onFinishChange.call(controller, controller.getValue());\n }\n }, this);\n Common.each(this.__folders, function (folder) {\n folder.revert(folder);\n });\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n },\n listen: function listen(controller) {\n var init = this.__listening.length === 0;\n this.__listening.push(controller);\n if (init) {\n updateDisplays(this.__listening);\n }\n },\n updateDisplay: function updateDisplay() {\n Common.each(this.__controllers, function (controller) {\n controller.updateDisplay();\n });\n Common.each(this.__folders, function (folder) {\n folder.updateDisplay();\n });\n }\n});\nfunction addRow(gui, newDom, liBefore) {\n var li = document.createElement('li');\n if (newDom) {\n li.appendChild(newDom);\n }\n if (liBefore) {\n gui.__ul.insertBefore(li, liBefore);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n}\nfunction removeListeners(gui) {\n dom.unbind(window, 'resize', gui.__resizeHandler);\n if (gui.saveToLocalStorageIfPossible) {\n dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible);\n }\n}\nfunction markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n if (modified) {\n opt.innerHTML = opt.value + '*';\n } else {\n opt.innerHTML = opt.value;\n }\n}\nfunction augmentController(gui, li, controller) {\n controller.__li = li;\n controller.__gui = gui;\n Common.extend(controller, {\n options: function options(_options) {\n if (arguments.length > 1) {\n var nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n return _add(gui, controller.object, controller.property, {\n before: nextSibling,\n factoryArgs: [Common.toArray(arguments)]\n });\n }\n if (Common.isArray(_options) || Common.isObject(_options)) {\n var _nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n return _add(gui, controller.object, controller.property, {\n before: _nextSibling,\n factoryArgs: [_options]\n });\n }\n },\n name: function name(_name) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = _name;\n return controller;\n },\n listen: function listen() {\n controller.__gui.listen(controller);\n return controller;\n },\n remove: function remove() {\n controller.__gui.remove(controller);\n return controller;\n }\n });\n if (controller instanceof NumberControllerSlider) {\n var box = new NumberControllerBox(controller.object, controller.property, { min: controller.__min, max: controller.__max, step: controller.__step });\n Common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function (method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function () {\n var args = Array.prototype.slice.call(arguments);\n pb.apply(box, args);\n return pc.apply(controller, args);\n };\n });\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n } else if (controller instanceof NumberControllerBox) {\n var r = function r(returned) {\n if (Common.isNumber(controller.__min) && Common.isNumber(controller.__max)) {\n var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML;\n var wasListening = controller.__gui.__listening.indexOf(controller) > -1;\n controller.remove();\n var newController = _add(gui, controller.object, controller.property, {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n newController.name(oldName);\n if (wasListening) newController.listen();\n return newController;\n }\n return returned;\n };\n controller.min = Common.compose(r, controller.min);\n controller.max = Common.compose(r, controller.max);\n } else if (controller instanceof BooleanController) {\n dom.bind(li, 'click', function () {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n dom.bind(controller.__checkbox, 'click', function (e) {\n e.stopPropagation();\n });\n } else if (controller instanceof FunctionController) {\n dom.bind(li, 'click', function () {\n dom.fakeEvent(controller.__button, 'click');\n });\n dom.bind(li, 'mouseover', function () {\n dom.addClass(controller.__button, 'hover');\n });\n dom.bind(li, 'mouseout', function () {\n dom.removeClass(controller.__button, 'hover');\n });\n } else if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n controller.updateDisplay = Common.compose(function (val) {\n li.style.borderLeftColor = controller.__color.toString();\n return val;\n }, controller.updateDisplay);\n controller.updateDisplay();\n }\n controller.setValue = Common.compose(function (val) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return val;\n }, controller.setValue);\n}\nfunction recallSavedValue(gui, controller) {\n var root = gui.getRoot();\n var matchedIndex = root.__rememberedObjects.indexOf(controller.object);\n if (matchedIndex !== -1) {\n var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex];\n if (controllerMap === undefined) {\n controllerMap = {};\n root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap;\n }\n controllerMap[controller.property] = controller;\n if (root.load && root.load.remembered) {\n var presetMap = root.load.remembered;\n var preset = void 0;\n if (presetMap[gui.preset]) {\n preset = presetMap[gui.preset];\n } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) {\n preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME];\n } else {\n return;\n }\n if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) {\n var value = preset[matchedIndex][controller.property];\n controller.initialValue = value;\n controller.setValue(value);\n }\n }\n }\n}\nfunction _add(gui, object, property, params) {\n if (object[property] === undefined) {\n throw new Error('Object \"' + object + '\" has no property \"' + property + '\"');\n }\n var controller = void 0;\n if (params.color) {\n controller = new ColorController(object, property);\n } else {\n var factoryArgs = [object, property].concat(params.factoryArgs);\n controller = ControllerFactory.apply(gui, factoryArgs);\n }\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n recallSavedValue(gui, controller);\n dom.addClass(controller.domElement, 'c');\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n var li = addRow(gui, container, params.before);\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n } else {\n dom.addClass(li, _typeof(controller.getValue()));\n }\n augmentController(gui, li, controller);\n gui.__controllers.push(controller);\n return controller;\n}\nfunction getLocalStorageHash(gui, key) {\n return document.location.href + '.' + key;\n}\nfunction addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n}\nfunction showHideExplain(gui, explain) {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n}\nfunction addSaveMenu(gui) {\n var div = gui.__save_row = document.createElement('li');\n dom.addClass(gui.domElement, 'has-save');\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n dom.addClass(div, 'save-row');\n var gears = document.createElement('span');\n gears.innerHTML = ' ';\n dom.addClass(gears, 'button gears');\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n var select = gui.__preset_select = document.createElement('select');\n if (gui.load && gui.load.remembered) {\n Common.each(gui.load.remembered, function (value, key) {\n addPresetOption(gui, key, key === gui.preset);\n });\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n dom.bind(select, 'change', function () {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n gui.preset = this.value;\n });\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n if (SUPPORTS_LOCAL_STORAGE) {\n var explain = document.getElementById('dg-local-explain');\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n var saveLocally = document.getElementById('dg-save-locally');\n saveLocally.style.display = 'block';\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n showHideExplain(gui, explain);\n dom.bind(localStorageCheckBox, 'change', function () {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain(gui, explain);\n });\n }\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n dom.bind(newConstructorTextArea, 'keydown', function (e) {\n if (e.metaKey && (e.which === 67 || e.keyCode === 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n dom.bind(gears, 'click', function () {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n dom.bind(button, 'click', function () {\n gui.save();\n });\n dom.bind(button2, 'click', function () {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) {\n gui.saveAs(presetName);\n }\n });\n dom.bind(button3, 'click', function () {\n gui.revert();\n });\n}\nfunction addResizeHandle(gui) {\n var pmouseX = void 0;\n gui.__resize_handle = document.createElement('div');\n Common.extend(gui.__resize_handle.style, {\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n });\n function drag(e) {\n e.preventDefault();\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n return false;\n }\n function dragStop() {\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n }\n function dragStart(e) {\n e.preventDefault();\n pmouseX = e.clientX;\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n return false;\n }\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n}\nfunction setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }\n if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n}\nfunction getCurrentPreset(gui, useInitialValues) {\n var toReturn = {};\n Common.each(gui.__rememberedObjects, function (val, index) {\n var savedValues = {};\n var controllerMap = gui.__rememberedObjectIndecesToControllers[index];\n Common.each(controllerMap, function (controller, property) {\n savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n toReturn[index] = savedValues;\n });\n return toReturn;\n}\nfunction setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value === gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n}\nfunction updateDisplays(controllerArray) {\n if (controllerArray.length !== 0) {\n requestAnimationFrame$1.call(window, function () {\n updateDisplays(controllerArray);\n });\n }\n Common.each(controllerArray, function (c) {\n c.updateDisplay();\n });\n}\n\nvar color = {\n Color: Color,\n math: ColorMath,\n interpret: interpret\n};\nvar controllers = {\n Controller: Controller,\n BooleanController: BooleanController,\n OptionController: OptionController,\n StringController: StringController,\n NumberController: NumberController,\n NumberControllerBox: NumberControllerBox,\n NumberControllerSlider: NumberControllerSlider,\n FunctionController: FunctionController,\n ColorController: ColorController\n};\nvar dom$1 = { dom: dom };\nvar gui = { GUI: GUI };\nvar GUI$1 = GUI;\nvar index = {\n color: color,\n controllers: controllers,\n dom: dom$1,\n gui: gui,\n GUI: GUI$1\n};\n\nexport { color, controllers, dom$1 as dom, gui, GUI$1 as GUI };\nexport default index;\n"],"x_google_ignoreList":[0]} \ No newline at end of file diff --git a/docs/274.7d4546dc06404ec9.js b/docs/274.7d4546dc06404ec9.js new file mode 100644 index 000000000..e1692f06b --- /dev/null +++ b/docs/274.7d4546dc06404ec9.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[274],{6274:(b,y,p)=>{p.r(y),p.d(y,{TGraphPolarPainter:()=>M,TGraphPolargramPainter:()=>x});var P=p(4788),g=p(9542),u=p(2253),w=p(3675),_=p(6458),E=p(6367),T=p(49),v=p(6116);class x extends _.tK{constructor(t,e){super(t,e),this.$polargram=!0,this.zoom_rmin=this.zoom_rmax=0}translate(t,e,a){let i=this.r(e),r=i/this.szx*this.szy,s={x:i*Math.cos(-t-this.angle),y:r*Math.sin(-t-this.angle),rx:i,ry:r};return a||(s.x=Math.round(s.x),s.y=Math.round(s.y),s.rx=Math.round(s.rx),s.ry=Math.round(s.ry)),s}format(t){return t===Math.round(t)?t.toString():this.ndig>10?t.toExponential(4):t.toFixed(this.ndig>0?this.ndig:0)}axisAsText(t,e){return"r"==t?e===Math.round(e)?e.toString():this.ndig>10?e.toExponential(4):e.toFixed(this.ndig+2):(e*=180/Math.PI)===Math.round(e)?e.toString():e.toFixed(1)}getFrameRect(){let t=this.getPadPainter(),e=t.getRootPad(!0),a=t.getPadWidth(),i=t.getPadHeight(),r={};return e?(r.szx=Math.round(Math.max(.1,.5-Math.max(e.fLeftMargin,e.fRightMargin))*a),r.szy=Math.round(Math.max(.1,.5-Math.max(e.fBottomMargin,e.fTopMargin))*i)):(r.szx=Math.round(.5*a),r.szy=Math.round(.5*i)),r.width=2*r.szx,r.height=2*r.szy,r.x=Math.round(a/2-r.szx),r.y=Math.round(i/2-r.szy),r.hint_delta_x=r.szx,r.hint_delta_y=r.szy,r.transform=`translate(${r.x},${r.y})`,r}mouseEvent(t,e){let i=this.getLayerSvg("primitives_layer").select(".interactive_ellipse");if(i.empty())return;let r=null;if("leave"!==t){let s=(0,u.cx)(e,i.node());r={x:s[0],y:s[1],touch:!1}}this.processFrameTooltipEvent(r)}mouseWheel(t){t.stopPropagation(),t.preventDefault(),this.processFrameTooltipEvent(null);let e=this.getObject();if(!e)return;let a=t.wheelDelta?-t.wheelDelta:t.deltaY||t.detail;if(!a)return;a=a<0?-.2:.2;let i=this.scale_rmin,r=this.scale_rmax;r+=a*(r-i),(ie.fRwrmax)&&(i=r=0),(this.zoom_rmin!=i||this.zoom_rmax!=r)&&(this.zoom_rmin=i,this.zoom_rmax=r,this.redrawPad())}redraw(){if(!this.isMainPainter())return;let t=this.getObject(),e=this.getPadPainter().getFrameRect();this.createG(),this.draw_g.attr("transform",`translate(${Math.round(e.x+e.width/2)},${Math.round(e.y+e.height/2)})`),this.szx=e.szx,this.szy=e.szy,this.scale_rmin=t.fRwrmin,this.scale_rmax=t.fRwrmax,this.zoom_rmin!=this.zoom_rmax&&(this.scale_rmin=this.zoom_rmin,this.scale_rmax=this.zoom_rmax),this.r=(0,u.BY)().domain([this.scale_rmin,this.scale_rmax]).range([0,this.szx]),this.angle=t.fAxisAngle||0;let a=this.r.ticks(5),i=Math.floor(t.fNdivRad%1e4/100);this.createAttLine({attr:t}),this.gridatt||(this.gridatt=new E.rE({color:t.fLineColor,style:2,width:1}));let r=Math.abs(t.fRwrmax-t.fRwrmin);this.ndig=r<=0?-3:Math.round(Math.log10(a.length/r));let s=[],l=0;for(;l=0){if(++this.ndig>10)break;s=[],l=0}else s.push(n),l++}let f=!1;a[a.length-1]1&&(nthis.scale_rmax)break;d=this.r(z),h=d/this.szx*this.szy,this.draw_g.append("ellipse").attr("cx",0).attr("cy",0).attr("rx",Math.round(d)).attr("ry",Math.round(h)).style("fill","none").call(this.gridatt.func)}}}let o=t.fNdivPol%100;return 8!==o&&3!==o&&(o=8),this.finishTextDrawing().then(()=>{let n=Math.round(t.fPolarTextSize*this.szy*2);this.startTextDrawing(t.fPolarLabelFont,n),s=8==o?["0","#frac{#pi}{4}","#frac{#pi}{2}","#frac{3#pi}{4}","#pi","#frac{5#pi}{4}","#frac{3#pi}{2}","#frac{7#pi}{4}"]:["0","#frac{2#pi}{3}","#frac{4#pi}{3}"];let d=[12,11,21,31,32,33,23,13];for(let h=0;h{if(i=Math.floor(t.fNdivPol%1e4/100),i>1)for(let h=0;hthis.mouseEvent("enter",h)).on("mousemove",h=>this.mouseEvent("move",h)).on("mouseleave",h=>this.mouseEvent("leave",h))),d.attr("rx",this.szx).attr("ry",this.szy),(0,u.Ys)(d.node().parentNode).attr("transform",this.draw_g.attr("transform")),g.settings.Zooming&&g.settings.ZoomWheel&&d.on("wheel",h=>this.mouseWheel(h))})}static draw(t,e){return(0,P.Z)(function*(){let a=(0,_.SO)(t);if(a){if(a.getObject()===e)return a;throw Error("Cannot superimpose TGraphPolargram with any other drawings")}let i=new x(t,e);return(0,T.ensureTCanvas)(i,!1).then(()=>(i.setAsMainPainter(),i.redraw())).then(()=>i)})()}}class M extends _.tK{redraw(){this.drawGraphPolar()}decodeOptions(t){let e=new w.pc(t||"L");this.options||(this.options={}),Object.assign(this.options,{mark:e.check("P"),err:e.check("E"),fill:e.check("F"),line:e.check("L"),curve:e.check("C")}),this.storeDrawOpt(t)}drawGraphPolar(){let t=this.getObject(),e=this.getMainPainter();if(!t||!e?.$polargram)return;this.options.mark&&this.createAttMarker({attr:t}),(this.options.err||this.options.line||this.options.curve)&&this.createAttLine({attr:t}),this.options.fill&&this.createAttFill({attr:t}),this.createG(),this.draw_g.attr("transform",e.draw_g.attr("transform"));let a="",i="",r="",s=[];for(let l=0;le.scale_rmax)continue;if(this.options.err){let o=e.translate(t.fX[l],t.fY[l]-t.fEY[l]),n=e.translate(t.fX[l],t.fY[l]+t.fEY[l]);i+=`M${o.x},${o.y}L${n.x},${n.y}`,o=e.translate(t.fX[l]+t.fEX[l],t.fY[l]),n=e.translate(t.fX[l]-t.fEX[l],t.fY[l]),i+=`M${o.x},${o.y}A${n.rx},${n.ry},0,0,1,${n.x},${n.y}`}let f=e.translate(t.fX[l],t.fY[l]);this.options.mark&&(a+=this.markeratt.create(f.x,f.y)),(this.options.line||this.options.fill)&&(r+=(r?"L":"M")+f.x+","+f.y),this.options.curve&&(f.grx=f.x,f.gry=f.y,s.push(f))}this.options.fill&&r&&this.draw_g.append("svg:path").attr("d",r+"Z").call(this.fillatt.func),this.options.line&&r&&this.draw_g.append("svg:path").attr("d",r).style("fill","none").call(this.lineatt.func),this.options.curve&&s.length&&this.draw_g.append("svg:path").attr("d",(0,w.Cq)("bezier",s).path).style("fill","none").call(this.lineatt.func),i&&this.draw_g.append("svg:path").attr("d",i).style("fill","none").call(this.lineatt.func),a&&this.draw_g.append("svg:path").attr("d",a).call(this.markeratt.func)}createPolargram(){let t=(0,g.create)("TGraphPolargram"),e=this.getObject(),a=e.fY[0]||0,i=a;for(let r=0;rl)return null;let f={name:this.getObject().fName,title:this.getObject().fTitle,x:s.x,y:s.y,color1:this.markeratt&&this.markeratt.used?this.markeratt.color:this.lineatt.color,exact:Math.sqrt(i)<4,lines:[this.getObjectHint()],binindx:r,menu_dist:l,radius:l};return f.lines.push("r = "+a.axisAsText("r",e.fY[r])),f.lines.push("phi = "+a.axisAsText("phi",e.fX[r])),e.fEY&&e.fEY[r]&&f.lines.push("error r = "+a.axisAsText("r",e.fEY[r])),e.fEX&&e.fEX[r]&&f.lines.push("error phi = "+a.axisAsText("phi",e.fEX[r])),f}showTooltip(t){if(!this.draw_g)return;let e=this.draw_g.select(".tooltip_bin");t?(e.empty()&&(e=this.draw_g.append("svg:ellipse").attr("class","tooltip_bin").style("pointer-events","none")),t.changed=e.property("current_bin")!==t.binindx,t.changed&&e.attr("cx",t.x).attr("cy",t.y).attr("rx",Math.round(t.radius)).attr("ry",Math.round(t.radius)).style("fill","none").style("stroke",t.color1).property("current_bin",t.binindx)):e.remove()}processTooltipEvent(t){let e=this.extractTooltip(t);return(!t||!t.disabled)&&this.showTooltip(e),e}static draw(t,e,a){return(0,P.Z)(function*(){let i=new M(t,e);i.decodeOptions(a);let r=i.getMainPainter();if(r&&!r.$polargram)return console.error("Cannot superimpose TGraphPolar with plain histograms"),null;let s=Promise.resolve(null);return r||(e.fPolargram||(e.fPolargram=i.createPolargram()),s=x.draw(t,e.fPolargram)),s.then(()=>(i.addToPadPrimitives(),i.drawGraphPolar(),i))})()}}}}]); +//# sourceMappingURL=274.7d4546dc06404ec9.js.map \ No newline at end of file diff --git a/docs/728.960e13d793eca2ea.js.map b/docs/274.7d4546dc06404ec9.js.map similarity index 99% rename from docs/728.960e13d793eca2ea.js.map rename to docs/274.7d4546dc06404ec9.js.map index 0b51f089b..03cd42cf1 100644 --- a/docs/728.960e13d793eca2ea.js.map +++ b/docs/274.7d4546dc06404ec9.js.map @@ -1 +1 @@ -{"version":3,"file":"728.960e13d793eca2ea.js","mappings":"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","names":["TGraphPolargramPainter","ObjectPainter","constructor","dom","polargram","super","this","$polargram","zoom_rmin","zoom_rmax","translate","angle","radius","keep_float","_rx","r","_ry","szx","szy","pos","x","Math","cos","y","sin","rx","ry","round","format","toString","ndig","toExponential","toFixed","axisAsText","axis","value","PI","getFrameRect","pp","getPadPainter","pad","getRootPad","w","getPadWidth","h","getPadHeight","rect","max","fLeftMargin","fRightMargin","fBottomMargin","fTopMargin","width","height","hint_delta_x","hint_delta_y","transform","mouseEvent","kind","evnt","interactive","getLayerSvg","select","empty","pnt","d3_pointer","node","touch","processFrameTooltipEvent","mouseWheel","stopPropagation","preventDefault","polar","getObject","delta","wheelDelta","deltaY","detail","rmin","scale_rmin","rmax","scale_rmax","fRwrmin","fRwrmax","redrawPad","redraw","isMainPainter","createG","draw_g","attr","scaleLinear","domain","range","fAxisAngle","ticks","nminor","floor","fNdivRad","createAttLine","gridatt","TAttLineHandler","color","fLineColor","style","abs","log10","length","lbls","indx","lbl","indexOf","push","exclude_last","startTextDrawing","fRadialLabelFont","fRadialTextSize","n","append","call","lineatt","func","drawText","align","text","getColor","fRadialLabelColor","latex","dr","nn","gridr","nmajor","fNdivPol","finishTextDrawing","then","fontsize","fPolarTextSize","fPolarLabelFont","aligns","aindx","fPolarLabelColor","isBatchMode","TooltipHandler","layer","classed","on","d3_select","parentNode","settings","static","main","getElementMainPainter","Error","painter","ensureTCanvas","setAsMainPainter","TGraphPolarPainter","drawGraphPolar","decodeOptions","opt","d","DrawOptions","options","Object","assign","mark","check","err","fill","line","curve","storeDrawOpt","graph","getMainPainter","createAttMarker","createAttFill","mpath","epath","lpath","bins","fNpoints","fY","pos1","fX","fEY","pos2","fEX","markeratt","create","grx","gry","fillatt","buildSvgPath","path","createPolargram","gr","min","extractTooltip","best_dist2","bestindx","bestpos","dist2","match_distance","used","getFullSize","sqrt","res","name","fName","title","fTitle","color1","exact","lines","getObjectHint","binindx","menu_dist","showTooltip","hint","ttcircle","changed","property","remove","processTooltipEvent","disabled","console","error","pr","Promise","resolve","fPolargram","draw","addToPadPrimitives"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/draw/TGraphPolarPainter.mjs"],"sourcesContent":["import { settings, create, isBatchMode } from '../core.mjs';\nimport { scaleLinear, select as d3_select, pointer as d3_pointer } from '../d3.mjs';\nimport { DrawOptions, buildSvgPath } from '../base/BasePainter.mjs';\nimport { ObjectPainter, getElementMainPainter } from '../base/ObjectPainter.mjs';\nimport { TAttLineHandler } from '../base/TAttLineHandler.mjs';\nimport { ensureTCanvas } from '../gpad/TCanvasPainter.mjs';\nimport { TooltipHandler } from '../gpad/TFramePainter.mjs';\n\n\n/**\n * @summary Painter for TGraphPolargram objects.\n *\n * @private */\n\nclass TGraphPolargramPainter extends ObjectPainter {\n\n /** @summary Create painter\n * @param {object|string} dom - DOM element for drawing or element id\n * @param {object} polargram - object to draw */\n constructor(dom, polargram) {\n super(dom, polargram);\n this.$polargram = true; // indicate that this is polargram\n this.zoom_rmin = this.zoom_rmax = 0;\n }\n\n /** @summary Translate coordinates */\n translate(angle, radius, keep_float) {\n let _rx = this.r(radius), _ry = _rx/this.szx*this.szy,\n pos = {\n x: _rx * Math.cos(-angle - this.angle),\n y: _ry * Math.sin(-angle - this.angle),\n rx: _rx,\n ry: _ry\n };\n\n if (!keep_float) {\n pos.x = Math.round(pos.x);\n pos.y = Math.round(pos.y);\n pos.rx = Math.round(pos.rx);\n pos.ry = Math.round(pos.ry);\n }\n return pos;\n }\n\n /** @summary format label for radius ticks */\n format(radius) {\n\n if (radius === Math.round(radius)) return radius.toString();\n if (this.ndig > 10) return radius.toExponential(4);\n\n return radius.toFixed((this.ndig > 0) ? this.ndig : 0);\n }\n\n /** @summary Convert axis values to text */\n axisAsText(axis, value) {\n\n if (axis == 'r') {\n if (value === Math.round(value)) return value.toString();\n if (this.ndig>10) return value.toExponential(4);\n return value.toFixed(this.ndig+2);\n }\n\n value *= 180/Math.PI;\n return (value === Math.round(value)) ? value.toString() : value.toFixed(1);\n }\n\n /** @summary Returns coordinate of frame - without using frame itself */\n getFrameRect() {\n let pp = this.getPadPainter(),\n pad = pp.getRootPad(true),\n w = pp.getPadWidth(),\n h = pp.getPadHeight(),\n rect = {};\n\n if (pad) {\n rect.szx = Math.round(Math.max(0.1, 0.5 - Math.max(pad.fLeftMargin, pad.fRightMargin))*w);\n rect.szy = Math.round(Math.max(0.1, 0.5 - Math.max(pad.fBottomMargin, pad.fTopMargin))*h);\n } else {\n rect.szx = Math.round(0.5*w);\n rect.szy = Math.round(0.5*h);\n }\n\n rect.width = 2*rect.szx;\n rect.height = 2*rect.szy;\n rect.x = Math.round(w/2 - rect.szx);\n rect.y = Math.round(h/2 - rect.szy);\n\n rect.hint_delta_x = rect.szx;\n rect.hint_delta_y = rect.szy;\n\n rect.transform = `translate(${rect.x},${rect.y})`;\n\n return rect;\n }\n\n /** @summary Process mouse event */\n mouseEvent(kind, evnt) {\n let layer = this.getLayerSvg('primitives_layer'),\n interactive = layer.select('.interactive_ellipse');\n if (interactive.empty()) return;\n\n let pnt = null;\n\n if (kind !== 'leave') {\n let pos = d3_pointer(evnt, interactive.node());\n pnt = { x: pos[0], y: pos[1], touch: false };\n }\n\n this.processFrameTooltipEvent(pnt);\n }\n\n /** @summary Process mouse wheel event */\n mouseWheel(evnt) {\n evnt.stopPropagation();\n evnt.preventDefault();\n\n this.processFrameTooltipEvent(null); // remove all tooltips\n\n let polar = this.getObject();\n\n if (!polar) return;\n\n let delta = evnt.wheelDelta ? -evnt.wheelDelta : (evnt.deltaY || evnt.detail);\n if (!delta) return;\n\n delta = (delta < 0) ? -0.2 : 0.2;\n\n let rmin = this.scale_rmin, rmax = this.scale_rmax, range = rmax - rmin;\n\n // rmin -= delta*range;\n rmax += delta*range;\n\n if ((rminpolar.fRwrmax)) rmin = rmax = 0;\n\n if ((this.zoom_rmin != rmin) || (this.zoom_rmax != rmax)) {\n this.zoom_rmin = rmin;\n this.zoom_rmax = rmax;\n this.redrawPad();\n }\n }\n\n /** @summary Redraw polargram */\n redraw() {\n if (!this.isMainPainter()) return;\n\n let polar = this.getObject(),\n rect = this.getPadPainter().getFrameRect();\n\n this.createG();\n\n this.draw_g.attr('transform', `translate(${Math.round(rect.x + rect.width/2)},${Math.round(rect.y + rect.height/2)})`);\n this.szx = rect.szx;\n this.szy = rect.szy;\n\n this.scale_rmin = polar.fRwrmin;\n this.scale_rmax = polar.fRwrmax;\n if (this.zoom_rmin != this.zoom_rmax) {\n this.scale_rmin = this.zoom_rmin;\n this.scale_rmax = this.zoom_rmax;\n }\n\n this.r = scaleLinear().domain([this.scale_rmin, this.scale_rmax]).range([ 0, this.szx ]);\n this.angle = polar.fAxisAngle || 0;\n\n let ticks = this.r.ticks(5),\n nminor = Math.floor((polar.fNdivRad % 10000) / 100);\n\n this.createAttLine({ attr: polar });\n if (!this.gridatt) this.gridatt = new TAttLineHandler({ color: polar.fLineColor, style: 2, width: 1 });\n\n let range = Math.abs(polar.fRwrmax - polar.fRwrmin);\n this.ndig = (range <= 0) ? -3 : Math.round(Math.log10(ticks.length / range));\n\n // verify that all radius labels are unique\n let lbls = [], indx = 0;\n while (indx= 0) {\n if (++this.ndig>10) break;\n lbls = []; indx = 0; continue;\n }\n lbls.push(lbl);\n indx++;\n }\n\n let exclude_last = false;\n\n if ((ticks[ticks.length-1] < polar.fRwrmax) && (this.zoom_rmin == this.zoom_rmax)) {\n ticks.push(polar.fRwrmax);\n exclude_last = true;\n }\n\n this.startTextDrawing(polar.fRadialLabelFont, Math.round(polar.fRadialTextSize * this.szy * 2));\n\n for (let n = 0; n < ticks.length; ++n) {\n let rx = this.r(ticks[n]), ry = rx/this.szx*this.szy;\n this.draw_g.append('ellipse')\n .attr('cx',0)\n .attr('cy',0)\n .attr('rx',Math.round(rx))\n .attr('ry',Math.round(ry))\n .style('fill', 'none')\n .call(this.lineatt.func);\n\n if ((n < ticks.length-1) || !exclude_last)\n this.drawText({ align: 23, x: Math.round(rx), y: Math.round(polar.fRadialTextSize * this.szy * 0.5),\n text: this.format(ticks[n]), color: this.getColor(polar.fRadialLabelColor), latex: 0 });\n\n if ((nminor>1) && ((n < ticks.length-1) || !exclude_last)) {\n let dr = (ticks[1] - ticks[0]) / nminor;\n for (let nn = 1; nn < nminor; ++nn) {\n let gridr = ticks[n] + dr*nn;\n if (gridr > this.scale_rmax) break;\n rx = this.r(gridr); ry = rx/this.szx*this.szy;\n this.draw_g.append('ellipse')\n .attr('cx',0)\n .attr('cy',0)\n .attr('rx',Math.round(rx))\n .attr('ry',Math.round(ry))\n .style('fill', 'none')\n .call(this.gridatt.func);\n }\n }\n }\n\n let nmajor = polar.fNdivPol % 100;\n if ((nmajor !== 8) && (nmajor !== 3)) nmajor = 8;\n\n return this.finishTextDrawing().then(() => {\n\n let fontsize = Math.round(polar.fPolarTextSize * this.szy * 2);\n this.startTextDrawing(polar.fPolarLabelFont, fontsize);\n\n lbls = (nmajor==8) ? ['0', '#frac{#pi}{4}', '#frac{#pi}{2}', '#frac{3#pi}{4}', '#pi', '#frac{5#pi}{4}', '#frac{3#pi}{2}', '#frac{7#pi}{4}'] : ['0', '#frac{2#pi}{3}', '#frac{4#pi}{3}'];\n let aligns = [12, 11, 21, 31, 32, 33, 23, 13];\n\n for (let n = 0; n < nmajor; ++n) {\n let angle = -n*2*Math.PI/nmajor - this.angle;\n this.draw_g.append('svg:path')\n .attr('d',`M0,0L${Math.round(this.szx*Math.cos(angle))},${Math.round(this.szy*Math.sin(angle))}`)\n .call(this.lineatt.func);\n\n let aindx = Math.round(16 -angle/Math.PI*4) % 8; // index in align table, here absolute angle is important\n\n this.drawText({ align: aligns[aindx],\n x: Math.round((this.szx+fontsize)*Math.cos(angle)),\n y: Math.round((this.szy + fontsize/this.szx*this.szy)*(Math.sin(angle))),\n text: lbls[n],\n color: this.getColor(polar.fPolarLabelColor), latex: 1 });\n }\n\n return this.finishTextDrawing();\n }).then(() => {\n\n nminor = Math.floor((polar.fNdivPol % 10000) / 100);\n\n if (nminor > 1)\n for (let n = 0; n < nmajor*nminor; ++n) {\n if (n % nminor === 0) continue;\n let angle = -n*2*Math.PI/nmajor/nminor - this.angle;\n this.draw_g.append('svg:path')\n .attr('d',`M0,0L${Math.round(this.szx*Math.cos(angle))},${Math.round(this.szy*Math.sin(angle))}`)\n .call(this.gridatt.func);\n }\n\n if (isBatchMode()) return;\n\n TooltipHandler.assign(this);\n\n let layer = this.getLayerSvg('primitives_layer'),\n interactive = layer.select('.interactive_ellipse');\n\n if (interactive.empty())\n interactive = layer.append('g')\n .classed('most_upper_primitives', true)\n .append('ellipse')\n .classed('interactive_ellipse', true)\n .attr('cx', 0)\n .attr('cy', 0)\n .style('fill', 'none')\n .style('pointer-events', 'visibleFill')\n .on('mouseenter', evnt => this.mouseEvent('enter', evnt))\n .on('mousemove', evnt => this.mouseEvent('move', evnt))\n .on('mouseleave', evnt => this.mouseEvent('leave', evnt));\n\n interactive.attr('rx', this.szx).attr('ry', this.szy);\n\n d3_select(interactive.node().parentNode).attr('transform', this.draw_g.attr('transform'));\n\n if (settings.Zooming && settings.ZoomWheel)\n interactive.on('wheel', evnt => this.mouseWheel(evnt));\n });\n }\n\n /** @summary Draw TGraphPolargram */\n static async draw(dom, polargram /*, opt*/) {\n\n let main = getElementMainPainter(dom);\n if (main) {\n if (main.getObject() === polargram)\n return main;\n throw Error('Cannot superimpose TGraphPolargram with any other drawings');\n }\n\n let painter = new TGraphPolargramPainter(dom, polargram);\n return ensureTCanvas(painter, false).then(() => {\n painter.setAsMainPainter();\n return painter.redraw();\n }).then(() => painter);\n }\n\n} // class TGraphPolargramPainter\n\n\n/**\n * @summary Painter for TGraphPolar objects.\n *\n * @private\n */\n\nclass TGraphPolarPainter extends ObjectPainter {\n\n /** @summary Redraw TGraphPolar */\n redraw() {\n this.drawGraphPolar();\n }\n\n /** @summary Decode options for drawing TGraphPolar */\n decodeOptions(opt) {\n\n let d = new DrawOptions(opt || 'L');\n\n if (!this.options) this.options = {};\n\n Object.assign(this.options, {\n mark: d.check('P'),\n err: d.check('E'),\n fill: d.check('F'),\n line: d.check('L'),\n curve: d.check('C')\n });\n\n this.storeDrawOpt(opt);\n }\n\n /** @summary Drawing TGraphPolar */\n drawGraphPolar() {\n let graph = this.getObject(),\n main = this.getMainPainter();\n\n if (!graph || !main?.$polargram) return;\n\n if (this.options.mark) this.createAttMarker({ attr: graph });\n if (this.options.err || this.options.line || this.options.curve) this.createAttLine({ attr: graph });\n if (this.options.fill) this.createAttFill({ attr: graph });\n\n this.createG();\n\n this.draw_g.attr('transform', main.draw_g.attr('transform'));\n\n let mpath = '', epath = '', lpath = '', bins = [];\n\n for (let n = 0; n < graph.fNpoints; ++n) {\n\n if (graph.fY[n] > main.scale_rmax) continue;\n\n if (this.options.err) {\n let pos1 = main.translate(graph.fX[n], graph.fY[n] - graph.fEY[n]),\n pos2 = main.translate(graph.fX[n], graph.fY[n] + graph.fEY[n]);\n epath += `M${pos1.x},${pos1.y}L${pos2.x},${pos2.y}`;\n\n pos1 = main.translate(graph.fX[n] + graph.fEX[n], graph.fY[n]);\n pos2 = main.translate(graph.fX[n] - graph.fEX[n], graph.fY[n]);\n\n epath += `M${pos1.x},${pos1.y}A${pos2.rx},${pos2.ry},0,0,1,${pos2.x},${pos2.y}`;\n }\n\n let pos = main.translate(graph.fX[n], graph.fY[n]);\n\n if (this.options.mark) {\n mpath += this.markeratt.create(pos.x, pos.y);\n }\n\n if (this.options.line || this.options.fill) {\n lpath += (lpath ? 'L' : 'M') + pos.x + ',' + pos.y;\n }\n\n if (this.options.curve) {\n pos.grx = pos.x;\n pos.gry = pos.y;\n bins.push(pos);\n }\n }\n\n if (this.options.fill && lpath)\n this.draw_g.append('svg:path')\n .attr('d', lpath + 'Z')\n .call(this.fillatt.func);\n\n if (this.options.line && lpath)\n this.draw_g.append('svg:path')\n .attr('d', lpath)\n .style('fill', 'none')\n .call(this.lineatt.func);\n\n if (this.options.curve && bins.length)\n this.draw_g.append('svg:path')\n .attr('d', buildSvgPath('bezier', bins).path)\n .style('fill', 'none')\n .call(this.lineatt.func);\n\n if (epath)\n this.draw_g.append('svg:path')\n .attr('d', epath)\n .style('fill','none')\n .call(this.lineatt.func);\n\n if (mpath)\n this.draw_g.append('svg:path')\n .attr('d', mpath)\n .call(this.markeratt.func);\n }\n\n /** @summary Create polargram object */\n createPolargram() {\n let polargram = create('TGraphPolargram'),\n gr = this.getObject();\n\n let rmin = gr.fY[0] || 0, rmax = rmin;\n for (let n = 0; n < gr.fNpoints; ++n) {\n rmin = Math.min(rmin, gr.fY[n] - gr.fEY[n]);\n rmax = Math.max(rmax, gr.fY[n] + gr.fEY[n]);\n }\n\n polargram.fRwrmin = rmin - (rmax-rmin)*0.1;\n polargram.fRwrmax = rmax + (rmax-rmin)*0.1;\n\n return polargram;\n }\n\n /** @summary Provide tooltip at specified point */\n extractTooltip(pnt) {\n if (!pnt) return null;\n\n let graph = this.getObject(),\n main = this.getMainPainter(),\n best_dist2 = 1e10, bestindx = -1, bestpos = null;\n\n for (let n = 0; n < graph.fNpoints; ++n) {\n let pos = main.translate(graph.fX[n], graph.fY[n]),\n dist2 = (pos.x-pnt.x)**2 + (pos.y-pnt.y)**2;\n if (dist2 < best_dist2) { best_dist2 = dist2; bestindx = n; bestpos = pos; }\n }\n\n let match_distance = 5;\n if (this.markeratt && this.markeratt.used) match_distance = this.markeratt.getFullSize();\n\n if (Math.sqrt(best_dist2) > match_distance) return null;\n\n let res = { name: this.getObject().fName, title: this.getObject().fTitle,\n x: bestpos.x, y: bestpos.y,\n color1: this.markeratt && this.markeratt.used ? this.markeratt.color : this.lineatt.color,\n exact: Math.sqrt(best_dist2) < 4,\n lines: [ this.getObjectHint() ],\n binindx: bestindx,\n menu_dist: match_distance,\n radius: match_distance\n };\n\n res.lines.push('r = ' + main.axisAsText('r', graph.fY[bestindx]));\n res.lines.push('phi = ' + main.axisAsText('phi',graph.fX[bestindx]));\n\n if (graph.fEY && graph.fEY[bestindx])\n res.lines.push('error r = ' + main.axisAsText('r', graph.fEY[bestindx]));\n\n if (graph.fEX && graph.fEX[bestindx])\n res.lines.push('error phi = ' + main.axisAsText('phi', graph.fEX[bestindx]));\n\n return res;\n }\n\n /** @summary Show tooltip */\n showTooltip(hint) {\n\n if (!this.draw_g) return;\n\n let ttcircle = this.draw_g.select('.tooltip_bin');\n\n if (!hint) {\n ttcircle.remove();\n return;\n }\n\n if (ttcircle.empty())\n ttcircle = this.draw_g.append('svg:ellipse')\n .attr('class','tooltip_bin')\n .style('pointer-events','none');\n\n hint.changed = ttcircle.property('current_bin') !== hint.binindx;\n\n if (hint.changed)\n ttcircle.attr('cx', hint.x)\n .attr('cy', hint.y)\n .attr('rx', Math.round(hint.radius))\n .attr('ry', Math.round(hint.radius))\n .style('fill', 'none')\n .style('stroke', hint.color1)\n .property('current_bin', hint.binindx);\n }\n\n /** @summary Process tooltip event */\n processTooltipEvent(pnt) {\n let hint = this.extractTooltip(pnt);\n if (!pnt || !pnt.disabled) this.showTooltip(hint);\n return hint;\n }\n\n /** @summary Draw TGraphPolar */\n static async draw(dom, graph, opt) {\n let painter = new TGraphPolarPainter(dom, graph);\n painter.decodeOptions(opt);\n\n let main = painter.getMainPainter();\n if (main && !main.$polargram) {\n console.error('Cannot superimpose TGraphPolar with plain histograms');\n return null;\n }\n\n let pr = Promise.resolve(null);\n if (!main) {\n if (!graph.fPolargram)\n graph.fPolargram = painter.createPolargram();\n pr = TGraphPolargramPainter.draw(dom, graph.fPolargram);\n }\n\n return pr.then(() => {\n painter.addToPadPrimitives();\n painter.drawGraphPolar();\n return painter;\n });\n }\n\n} // class TGraphPolarPainter\n\nexport { TGraphPolargramPainter, TGraphPolarPainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file +{"version":3,"file":"274.7d4546dc06404ec9.js","mappings":"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","names":["TGraphPolargramPainter","ObjectPainter","constructor","dom","polargram","super","this","$polargram","zoom_rmin","zoom_rmax","translate","angle","radius","keep_float","_rx","r","_ry","szx","szy","pos","x","Math","cos","y","sin","rx","ry","round","format","toString","ndig","toExponential","toFixed","axisAsText","axis","value","PI","getFrameRect","pp","getPadPainter","pad","getRootPad","w","getPadWidth","h","getPadHeight","rect","max","fLeftMargin","fRightMargin","fBottomMargin","fTopMargin","width","height","hint_delta_x","hint_delta_y","transform","mouseEvent","kind","evnt","interactive","getLayerSvg","select","empty","pnt","d3_pointer","node","touch","processFrameTooltipEvent","mouseWheel","stopPropagation","preventDefault","polar","getObject","delta","wheelDelta","deltaY","detail","rmin","scale_rmin","rmax","scale_rmax","fRwrmin","fRwrmax","redrawPad","redraw","isMainPainter","createG","draw_g","attr","scaleLinear","domain","range","fAxisAngle","ticks","nminor","floor","fNdivRad","createAttLine","gridatt","TAttLineHandler","color","fLineColor","style","abs","log10","length","lbls","indx","lbl","indexOf","push","exclude_last","startTextDrawing","fRadialLabelFont","fRadialTextSize","n","append","call","lineatt","func","drawText","align","text","getColor","fRadialLabelColor","latex","dr","nn","gridr","nmajor","fNdivPol","finishTextDrawing","then","fontsize","fPolarTextSize","fPolarLabelFont","aligns","aindx","fPolarLabelColor","isBatchMode","TooltipHandler","layer","classed","on","d3_select","parentNode","settings","static","main","getElementMainPainter","Error","painter","ensureTCanvas","setAsMainPainter","TGraphPolarPainter","drawGraphPolar","decodeOptions","opt","d","DrawOptions","options","Object","assign","mark","check","err","fill","line","curve","storeDrawOpt","graph","getMainPainter","createAttMarker","createAttFill","mpath","epath","lpath","bins","fNpoints","fY","pos1","fX","fEY","pos2","fEX","markeratt","create","grx","gry","fillatt","buildSvgPath","path","createPolargram","gr","min","extractTooltip","best_dist2","bestindx","bestpos","dist2","match_distance","used","getFullSize","sqrt","res","name","fName","title","fTitle","color1","exact","lines","getObjectHint","binindx","menu_dist","showTooltip","hint","ttcircle","changed","property","remove","processTooltipEvent","disabled","console","error","pr","Promise","resolve","fPolargram","draw","addToPadPrimitives"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/draw/TGraphPolarPainter.mjs"],"sourcesContent":["import { settings, create, isBatchMode } from '../core.mjs';\nimport { scaleLinear, select as d3_select, pointer as d3_pointer } from '../d3.mjs';\nimport { DrawOptions, buildSvgPath } from '../base/BasePainter.mjs';\nimport { ObjectPainter, getElementMainPainter } from '../base/ObjectPainter.mjs';\nimport { TAttLineHandler } from '../base/TAttLineHandler.mjs';\nimport { ensureTCanvas } from '../gpad/TCanvasPainter.mjs';\nimport { TooltipHandler } from '../gpad/TFramePainter.mjs';\n\n\n/**\n * @summary Painter for TGraphPolargram objects.\n *\n * @private */\n\nclass TGraphPolargramPainter extends ObjectPainter {\n\n /** @summary Create painter\n * @param {object|string} dom - DOM element for drawing or element id\n * @param {object} polargram - object to draw */\n constructor(dom, polargram) {\n super(dom, polargram);\n this.$polargram = true; // indicate that this is polargram\n this.zoom_rmin = this.zoom_rmax = 0;\n }\n\n /** @summary Translate coordinates */\n translate(angle, radius, keep_float) {\n let _rx = this.r(radius), _ry = _rx/this.szx*this.szy,\n pos = {\n x: _rx * Math.cos(-angle - this.angle),\n y: _ry * Math.sin(-angle - this.angle),\n rx: _rx,\n ry: _ry\n };\n\n if (!keep_float) {\n pos.x = Math.round(pos.x);\n pos.y = Math.round(pos.y);\n pos.rx = Math.round(pos.rx);\n pos.ry = Math.round(pos.ry);\n }\n return pos;\n }\n\n /** @summary format label for radius ticks */\n format(radius) {\n\n if (radius === Math.round(radius)) return radius.toString();\n if (this.ndig > 10) return radius.toExponential(4);\n\n return radius.toFixed((this.ndig > 0) ? this.ndig : 0);\n }\n\n /** @summary Convert axis values to text */\n axisAsText(axis, value) {\n\n if (axis == 'r') {\n if (value === Math.round(value)) return value.toString();\n if (this.ndig>10) return value.toExponential(4);\n return value.toFixed(this.ndig+2);\n }\n\n value *= 180/Math.PI;\n return (value === Math.round(value)) ? value.toString() : value.toFixed(1);\n }\n\n /** @summary Returns coordinate of frame - without using frame itself */\n getFrameRect() {\n let pp = this.getPadPainter(),\n pad = pp.getRootPad(true),\n w = pp.getPadWidth(),\n h = pp.getPadHeight(),\n rect = {};\n\n if (pad) {\n rect.szx = Math.round(Math.max(0.1, 0.5 - Math.max(pad.fLeftMargin, pad.fRightMargin))*w);\n rect.szy = Math.round(Math.max(0.1, 0.5 - Math.max(pad.fBottomMargin, pad.fTopMargin))*h);\n } else {\n rect.szx = Math.round(0.5*w);\n rect.szy = Math.round(0.5*h);\n }\n\n rect.width = 2*rect.szx;\n rect.height = 2*rect.szy;\n rect.x = Math.round(w/2 - rect.szx);\n rect.y = Math.round(h/2 - rect.szy);\n\n rect.hint_delta_x = rect.szx;\n rect.hint_delta_y = rect.szy;\n\n rect.transform = `translate(${rect.x},${rect.y})`;\n\n return rect;\n }\n\n /** @summary Process mouse event */\n mouseEvent(kind, evnt) {\n let layer = this.getLayerSvg('primitives_layer'),\n interactive = layer.select('.interactive_ellipse');\n if (interactive.empty()) return;\n\n let pnt = null;\n\n if (kind !== 'leave') {\n let pos = d3_pointer(evnt, interactive.node());\n pnt = { x: pos[0], y: pos[1], touch: false };\n }\n\n this.processFrameTooltipEvent(pnt);\n }\n\n /** @summary Process mouse wheel event */\n mouseWheel(evnt) {\n evnt.stopPropagation();\n evnt.preventDefault();\n\n this.processFrameTooltipEvent(null); // remove all tooltips\n\n let polar = this.getObject();\n\n if (!polar) return;\n\n let delta = evnt.wheelDelta ? -evnt.wheelDelta : (evnt.deltaY || evnt.detail);\n if (!delta) return;\n\n delta = (delta < 0) ? -0.2 : 0.2;\n\n let rmin = this.scale_rmin, rmax = this.scale_rmax, range = rmax - rmin;\n\n // rmin -= delta*range;\n rmax += delta*range;\n\n if ((rminpolar.fRwrmax)) rmin = rmax = 0;\n\n if ((this.zoom_rmin != rmin) || (this.zoom_rmax != rmax)) {\n this.zoom_rmin = rmin;\n this.zoom_rmax = rmax;\n this.redrawPad();\n }\n }\n\n /** @summary Redraw polargram */\n redraw() {\n if (!this.isMainPainter()) return;\n\n let polar = this.getObject(),\n rect = this.getPadPainter().getFrameRect();\n\n this.createG();\n\n this.draw_g.attr('transform', `translate(${Math.round(rect.x + rect.width/2)},${Math.round(rect.y + rect.height/2)})`);\n this.szx = rect.szx;\n this.szy = rect.szy;\n\n this.scale_rmin = polar.fRwrmin;\n this.scale_rmax = polar.fRwrmax;\n if (this.zoom_rmin != this.zoom_rmax) {\n this.scale_rmin = this.zoom_rmin;\n this.scale_rmax = this.zoom_rmax;\n }\n\n this.r = scaleLinear().domain([this.scale_rmin, this.scale_rmax]).range([ 0, this.szx ]);\n this.angle = polar.fAxisAngle || 0;\n\n let ticks = this.r.ticks(5),\n nminor = Math.floor((polar.fNdivRad % 10000) / 100);\n\n this.createAttLine({ attr: polar });\n if (!this.gridatt) this.gridatt = new TAttLineHandler({ color: polar.fLineColor, style: 2, width: 1 });\n\n let range = Math.abs(polar.fRwrmax - polar.fRwrmin);\n this.ndig = (range <= 0) ? -3 : Math.round(Math.log10(ticks.length / range));\n\n // verify that all radius labels are unique\n let lbls = [], indx = 0;\n while (indx= 0) {\n if (++this.ndig>10) break;\n lbls = []; indx = 0; continue;\n }\n lbls.push(lbl);\n indx++;\n }\n\n let exclude_last = false;\n\n if ((ticks[ticks.length-1] < polar.fRwrmax) && (this.zoom_rmin == this.zoom_rmax)) {\n ticks.push(polar.fRwrmax);\n exclude_last = true;\n }\n\n this.startTextDrawing(polar.fRadialLabelFont, Math.round(polar.fRadialTextSize * this.szy * 2));\n\n for (let n = 0; n < ticks.length; ++n) {\n let rx = this.r(ticks[n]), ry = rx/this.szx*this.szy;\n this.draw_g.append('ellipse')\n .attr('cx',0)\n .attr('cy',0)\n .attr('rx',Math.round(rx))\n .attr('ry',Math.round(ry))\n .style('fill', 'none')\n .call(this.lineatt.func);\n\n if ((n < ticks.length-1) || !exclude_last)\n this.drawText({ align: 23, x: Math.round(rx), y: Math.round(polar.fRadialTextSize * this.szy * 0.5),\n text: this.format(ticks[n]), color: this.getColor(polar.fRadialLabelColor), latex: 0 });\n\n if ((nminor>1) && ((n < ticks.length-1) || !exclude_last)) {\n let dr = (ticks[1] - ticks[0]) / nminor;\n for (let nn = 1; nn < nminor; ++nn) {\n let gridr = ticks[n] + dr*nn;\n if (gridr > this.scale_rmax) break;\n rx = this.r(gridr); ry = rx/this.szx*this.szy;\n this.draw_g.append('ellipse')\n .attr('cx',0)\n .attr('cy',0)\n .attr('rx',Math.round(rx))\n .attr('ry',Math.round(ry))\n .style('fill', 'none')\n .call(this.gridatt.func);\n }\n }\n }\n\n let nmajor = polar.fNdivPol % 100;\n if ((nmajor !== 8) && (nmajor !== 3)) nmajor = 8;\n\n return this.finishTextDrawing().then(() => {\n\n let fontsize = Math.round(polar.fPolarTextSize * this.szy * 2);\n this.startTextDrawing(polar.fPolarLabelFont, fontsize);\n\n lbls = (nmajor==8) ? ['0', '#frac{#pi}{4}', '#frac{#pi}{2}', '#frac{3#pi}{4}', '#pi', '#frac{5#pi}{4}', '#frac{3#pi}{2}', '#frac{7#pi}{4}'] : ['0', '#frac{2#pi}{3}', '#frac{4#pi}{3}'];\n let aligns = [12, 11, 21, 31, 32, 33, 23, 13];\n\n for (let n = 0; n < nmajor; ++n) {\n let angle = -n*2*Math.PI/nmajor - this.angle;\n this.draw_g.append('svg:path')\n .attr('d',`M0,0L${Math.round(this.szx*Math.cos(angle))},${Math.round(this.szy*Math.sin(angle))}`)\n .call(this.lineatt.func);\n\n let aindx = Math.round(16 -angle/Math.PI*4) % 8; // index in align table, here absolute angle is important\n\n this.drawText({ align: aligns[aindx],\n x: Math.round((this.szx+fontsize)*Math.cos(angle)),\n y: Math.round((this.szy + fontsize/this.szx*this.szy)*(Math.sin(angle))),\n text: lbls[n],\n color: this.getColor(polar.fPolarLabelColor), latex: 1 });\n }\n\n return this.finishTextDrawing();\n }).then(() => {\n\n nminor = Math.floor((polar.fNdivPol % 10000) / 100);\n\n if (nminor > 1)\n for (let n = 0; n < nmajor*nminor; ++n) {\n if (n % nminor === 0) continue;\n let angle = -n*2*Math.PI/nmajor/nminor - this.angle;\n this.draw_g.append('svg:path')\n .attr('d',`M0,0L${Math.round(this.szx*Math.cos(angle))},${Math.round(this.szy*Math.sin(angle))}`)\n .call(this.gridatt.func);\n }\n\n if (isBatchMode()) return;\n\n TooltipHandler.assign(this);\n\n let layer = this.getLayerSvg('primitives_layer'),\n interactive = layer.select('.interactive_ellipse');\n\n if (interactive.empty())\n interactive = layer.append('g')\n .classed('most_upper_primitives', true)\n .append('ellipse')\n .classed('interactive_ellipse', true)\n .attr('cx', 0)\n .attr('cy', 0)\n .style('fill', 'none')\n .style('pointer-events', 'visibleFill')\n .on('mouseenter', evnt => this.mouseEvent('enter', evnt))\n .on('mousemove', evnt => this.mouseEvent('move', evnt))\n .on('mouseleave', evnt => this.mouseEvent('leave', evnt));\n\n interactive.attr('rx', this.szx).attr('ry', this.szy);\n\n d3_select(interactive.node().parentNode).attr('transform', this.draw_g.attr('transform'));\n\n if (settings.Zooming && settings.ZoomWheel)\n interactive.on('wheel', evnt => this.mouseWheel(evnt));\n });\n }\n\n /** @summary Draw TGraphPolargram */\n static async draw(dom, polargram /*, opt*/) {\n\n let main = getElementMainPainter(dom);\n if (main) {\n if (main.getObject() === polargram)\n return main;\n throw Error('Cannot superimpose TGraphPolargram with any other drawings');\n }\n\n let painter = new TGraphPolargramPainter(dom, polargram);\n return ensureTCanvas(painter, false).then(() => {\n painter.setAsMainPainter();\n return painter.redraw();\n }).then(() => painter);\n }\n\n} // class TGraphPolargramPainter\n\n\n/**\n * @summary Painter for TGraphPolar objects.\n *\n * @private\n */\n\nclass TGraphPolarPainter extends ObjectPainter {\n\n /** @summary Redraw TGraphPolar */\n redraw() {\n this.drawGraphPolar();\n }\n\n /** @summary Decode options for drawing TGraphPolar */\n decodeOptions(opt) {\n\n let d = new DrawOptions(opt || 'L');\n\n if (!this.options) this.options = {};\n\n Object.assign(this.options, {\n mark: d.check('P'),\n err: d.check('E'),\n fill: d.check('F'),\n line: d.check('L'),\n curve: d.check('C')\n });\n\n this.storeDrawOpt(opt);\n }\n\n /** @summary Drawing TGraphPolar */\n drawGraphPolar() {\n let graph = this.getObject(),\n main = this.getMainPainter();\n\n if (!graph || !main?.$polargram) return;\n\n if (this.options.mark) this.createAttMarker({ attr: graph });\n if (this.options.err || this.options.line || this.options.curve) this.createAttLine({ attr: graph });\n if (this.options.fill) this.createAttFill({ attr: graph });\n\n this.createG();\n\n this.draw_g.attr('transform', main.draw_g.attr('transform'));\n\n let mpath = '', epath = '', lpath = '', bins = [];\n\n for (let n = 0; n < graph.fNpoints; ++n) {\n\n if (graph.fY[n] > main.scale_rmax) continue;\n\n if (this.options.err) {\n let pos1 = main.translate(graph.fX[n], graph.fY[n] - graph.fEY[n]),\n pos2 = main.translate(graph.fX[n], graph.fY[n] + graph.fEY[n]);\n epath += `M${pos1.x},${pos1.y}L${pos2.x},${pos2.y}`;\n\n pos1 = main.translate(graph.fX[n] + graph.fEX[n], graph.fY[n]);\n pos2 = main.translate(graph.fX[n] - graph.fEX[n], graph.fY[n]);\n\n epath += `M${pos1.x},${pos1.y}A${pos2.rx},${pos2.ry},0,0,1,${pos2.x},${pos2.y}`;\n }\n\n let pos = main.translate(graph.fX[n], graph.fY[n]);\n\n if (this.options.mark) {\n mpath += this.markeratt.create(pos.x, pos.y);\n }\n\n if (this.options.line || this.options.fill) {\n lpath += (lpath ? 'L' : 'M') + pos.x + ',' + pos.y;\n }\n\n if (this.options.curve) {\n pos.grx = pos.x;\n pos.gry = pos.y;\n bins.push(pos);\n }\n }\n\n if (this.options.fill && lpath)\n this.draw_g.append('svg:path')\n .attr('d', lpath + 'Z')\n .call(this.fillatt.func);\n\n if (this.options.line && lpath)\n this.draw_g.append('svg:path')\n .attr('d', lpath)\n .style('fill', 'none')\n .call(this.lineatt.func);\n\n if (this.options.curve && bins.length)\n this.draw_g.append('svg:path')\n .attr('d', buildSvgPath('bezier', bins).path)\n .style('fill', 'none')\n .call(this.lineatt.func);\n\n if (epath)\n this.draw_g.append('svg:path')\n .attr('d', epath)\n .style('fill','none')\n .call(this.lineatt.func);\n\n if (mpath)\n this.draw_g.append('svg:path')\n .attr('d', mpath)\n .call(this.markeratt.func);\n }\n\n /** @summary Create polargram object */\n createPolargram() {\n let polargram = create('TGraphPolargram'),\n gr = this.getObject();\n\n let rmin = gr.fY[0] || 0, rmax = rmin;\n for (let n = 0; n < gr.fNpoints; ++n) {\n rmin = Math.min(rmin, gr.fY[n] - gr.fEY[n]);\n rmax = Math.max(rmax, gr.fY[n] + gr.fEY[n]);\n }\n\n polargram.fRwrmin = rmin - (rmax-rmin)*0.1;\n polargram.fRwrmax = rmax + (rmax-rmin)*0.1;\n\n return polargram;\n }\n\n /** @summary Provide tooltip at specified point */\n extractTooltip(pnt) {\n if (!pnt) return null;\n\n let graph = this.getObject(),\n main = this.getMainPainter(),\n best_dist2 = 1e10, bestindx = -1, bestpos = null;\n\n for (let n = 0; n < graph.fNpoints; ++n) {\n let pos = main.translate(graph.fX[n], graph.fY[n]),\n dist2 = (pos.x-pnt.x)**2 + (pos.y-pnt.y)**2;\n if (dist2 < best_dist2) { best_dist2 = dist2; bestindx = n; bestpos = pos; }\n }\n\n let match_distance = 5;\n if (this.markeratt && this.markeratt.used) match_distance = this.markeratt.getFullSize();\n\n if (Math.sqrt(best_dist2) > match_distance) return null;\n\n let res = { name: this.getObject().fName, title: this.getObject().fTitle,\n x: bestpos.x, y: bestpos.y,\n color1: this.markeratt && this.markeratt.used ? this.markeratt.color : this.lineatt.color,\n exact: Math.sqrt(best_dist2) < 4,\n lines: [ this.getObjectHint() ],\n binindx: bestindx,\n menu_dist: match_distance,\n radius: match_distance\n };\n\n res.lines.push('r = ' + main.axisAsText('r', graph.fY[bestindx]));\n res.lines.push('phi = ' + main.axisAsText('phi',graph.fX[bestindx]));\n\n if (graph.fEY && graph.fEY[bestindx])\n res.lines.push('error r = ' + main.axisAsText('r', graph.fEY[bestindx]));\n\n if (graph.fEX && graph.fEX[bestindx])\n res.lines.push('error phi = ' + main.axisAsText('phi', graph.fEX[bestindx]));\n\n return res;\n }\n\n /** @summary Show tooltip */\n showTooltip(hint) {\n\n if (!this.draw_g) return;\n\n let ttcircle = this.draw_g.select('.tooltip_bin');\n\n if (!hint) {\n ttcircle.remove();\n return;\n }\n\n if (ttcircle.empty())\n ttcircle = this.draw_g.append('svg:ellipse')\n .attr('class','tooltip_bin')\n .style('pointer-events','none');\n\n hint.changed = ttcircle.property('current_bin') !== hint.binindx;\n\n if (hint.changed)\n ttcircle.attr('cx', hint.x)\n .attr('cy', hint.y)\n .attr('rx', Math.round(hint.radius))\n .attr('ry', Math.round(hint.radius))\n .style('fill', 'none')\n .style('stroke', hint.color1)\n .property('current_bin', hint.binindx);\n }\n\n /** @summary Process tooltip event */\n processTooltipEvent(pnt) {\n let hint = this.extractTooltip(pnt);\n if (!pnt || !pnt.disabled) this.showTooltip(hint);\n return hint;\n }\n\n /** @summary Draw TGraphPolar */\n static async draw(dom, graph, opt) {\n let painter = new TGraphPolarPainter(dom, graph);\n painter.decodeOptions(opt);\n\n let main = painter.getMainPainter();\n if (main && !main.$polargram) {\n console.error('Cannot superimpose TGraphPolar with plain histograms');\n return null;\n }\n\n let pr = Promise.resolve(null);\n if (!main) {\n if (!graph.fPolargram)\n graph.fPolargram = painter.createPolargram();\n pr = TGraphPolargramPainter.draw(dom, graph.fPolargram);\n }\n\n return pr.then(() => {\n painter.addToPadPrimitives();\n painter.drawGraphPolar();\n return painter;\n });\n }\n\n} // class TGraphPolarPainter\n\nexport { TGraphPolargramPainter, TGraphPolarPainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file diff --git a/docs/299.262c7f127dcdf2a1.js b/docs/299.262c7f127dcdf2a1.js deleted file mode 100644 index d37d42136..000000000 --- a/docs/299.262c7f127dcdf2a1.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[299],{1299:(p,o,r)=>{r.r(o),r.d(o,{TGraphTimePainter:()=>a});var h=r(5368),_=r(1773),m=r(5611),f=r(2454),l=r(9608),u=r(554);class a extends f.tK{redraw(){void 0===this.step&&this.startDrawing()}decodeOptions(e){let t=new m.pc(e||"REPEAT");this.options||(this.options={}),Object.assign(this.options,{once:t.check("ONCE"),repeat:t.check("REPEAT"),first:t.check("FIRST")}),this.storeDrawOpt(e)}drawPrimitives(e){var t=this;return(0,h.Z)(function*(){e||(e=0,t._doing_primitives=!0);let i=t.getObject()?.fSteps.arr[t.step];if(i&&!(e>=i.arr.length))return(0,u.ii)(t.getDom(),i.arr[e],i.opt[e]).then(s=>(s&&(s.$grtimeid=t.selfid,s.$grstep=t.step),t.drawPrimitives(e+1)));delete t._doing_primitives})()}continueDrawing(){if(!this.options)return;let e=this.getObject();if(this.options.first)delete this.step;else if(this.wait_animation_frame){delete this.wait_animation_frame;let t=this.getPadPainter();if(!t)return void delete this.step;this.drawPrimitives().then(()=>{t.cleanPrimitives(i=>i.$grtimeid===this.selfid&&i.$grstep!==this.step),this.continueDrawing()})}else if(this.running_timeout)clearTimeout(this.running_timeout),delete this.running_timeout,this.wait_animation_frame=!0,requestAnimationFrame(()=>this.continueDrawing());else{let t=Math.max(e.fSleepTime,10);if(++this.step>e.fSteps.arr.length){if(!this.options.repeat)return void delete this.step;this.step=0,t=Math.max(5e3,5*t)}this.running_timeout=setTimeout(()=>this.continueDrawing(),t)}}startDrawing(){return this.step=0,this.drawPrimitives().then(()=>(this.continueDrawing(),this))}static draw(e,t,i){return(0,h.Z)(function*(){if(!t.fFrame)return console.error("Frame histogram not exists"),null;let s=new a(e,t);if(s.getMainPainter())return console.error("Cannot draw graph time on top of other histograms"),null;if(s.decodeOptions(i),!t.fFrame.fTitle&&t.fTitle){let n=t.fTitle.split(";");t.fFrame.fTitle=n[0],n[1]&&(t.fFrame.fXaxis.fTitle=n[1]),n[2]&&(t.fFrame.fYaxis.fTitle=n[2])}return s.selfid="grtime_"+_.internals.id_counter++,l.f.draw(e,t.fFrame,"AXIS").then(()=>(s.addToPadPrimitives(),s.startDrawing()))})()}}}}]); -//# sourceMappingURL=299.262c7f127dcdf2a1.js.map \ No newline at end of file diff --git a/docs/554.734d0ef28756d2fc.js b/docs/351.7dfe5ad1980ea70b.js similarity index 95% rename from docs/554.734d0ef28756d2fc.js rename to docs/351.7dfe5ad1980ea70b.js index 0af43624f..7d19860fa 100644 --- a/docs/554.734d0ef28756d2fc.js +++ b/docs/351.7dfe5ad1980ea70b.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[554],{3554:(H,Y,T)=>{T.r(Y),T.d(Y,{TGraph2DPainter:()=>w});var j=T(5368),Z=T(1773),v=T(1515),A=T(5611),L=T(2454),b=T(9615),F=T(5759),k=T(6772);class w extends L.tK{decodeOptions(i,a){let t=new A.pc(i);this.options||(this.options={});let e=this.options;e.Color=t.check("COL"),e.Line=t.check("LINE"),e.Error=t.check("ERR")&&(this.matchObjectType("TGraph2DErrors")||this.matchObjectType("TGraph2DAsymmErrors")),e.Circles=t.check("P0"),e.Markers=t.check("P"),!e.Markers&&!e.Error&&!e.Circles&&!e.Line&&(1==a.fMarkerSize&&1==a.fMarkerStyle?e.Circles=!0:e.Markers=!0),e.Markers||(e.Color=!1),this.storeDrawOpt(i)}createHistogram(){let i=this.getObject(),a=this.matchObjectType("TGraph2DAsymmErrors"),t=i.fX[0],e=t,n=i.fY[0],_=n,c=i.fZ[0],x=c;for(let s=0;s=e&&(e=t+1),n>=_&&(_=n+1),c>=x&&(x=c+1);let p=.02*(e-t),d=.02*(_-n),X=.02*(x-c),g=t-p,u=e+p,C=n-d,E=_+d,z=c-X,O=x+X;g<0&&t>=0&&(g=.98*t),u>0&&e<=0&&(u=0),C<0&&n>=0&&(C=.98*n),E>0&&_<=0&&(E=0),z<0&&c>=0&&(z=.98*c),O>0&&x<=0&&(O=0);let P=this.getObject();P.fMinimum!=Z.kNoZoom&&(z=P.fMinimum),P.fMaximum!=Z.kNoZoom&&(O=P.fMaximum);let M=(0,Z.createHistogram)("TH2I",10,10);M.fName=P.fName+"_h",M.fTitle=P.fTitle,M.fXaxis.fXmin=g,M.fXaxis.fXmax=u,M.fYaxis.fXmin=C,M.fYaxis.fXmax=E,M.fZaxis.fXmin=z,M.fZaxis.fXmax=O,M.fMinimum=z,M.fMaximum=O;let f=(0,Z.BIT)(9);return M.fBits=M.fBits|f,M}graph2DTooltip(i){if(!Number.isInteger(i.index))return console.error(`intersect.index not provided, three.js version ${v.UZH}`),null;let a=Math.floor(i.index/this.nvertex);if(a<0||a>=this.index.length)return null;let t=p=>p*p;a=this.index[a];let e=this.painter,n=this.graph,_=e.grx(n.fX[a]),c=e.gry(n.fY[a]),x=e.grz(n.fZ[a]);if(this.check_next&&a+1{let C=0;for(let E=0;Et.scale_xmax||e.fY[E]t.scale_ymax||e.fZ[E]=u||++C;return C};if(Z.settings.OptimizeDraw>0&&!t.webgl){let g=_(t.scale_zmin,t.scale_zmax),u=5e4;g>u&&(n=Math.floor(g/u),n<=2&&(n=2))}let c=new b.M(e),x=null,p=[t.scale_zmin,t.scale_zmax],d=t.size_x3d/100*c.getFullSize(),X=[];i.options.Circles&&(d=.06*t.size_x3d),t.usesvg&&(d*=.3),i.options.Color&&(p=a.getContourLevels(),x=a.getHistPalette());for(let g=0;g=C)continue;let E=Math.floor(_(u,C)/n),z=null,O=0,P=new Int32Array(E),M=0,f=null,s=!1,m=null,o=0,h=0;(i.options.Markers||i.options.Circles)&&(z=new k.B_(E,t.webgl,d/3)),i.options.Error&&(f=new Float32Array(6*E*3),s=i.matchObjectType("TGraph2DAsymmErrors")),i.options.Line&&(m=new Float32Array(6*(E-1)));for(let r=0;rt.scale_xmax||e.fY[r]t.scale_ymax||e.fZ[r]=C||n>1&&(O=(O+1)%n,0!==O))continue;P[M++]=r;let y=t.grx(e.fX[r]),l=t.gry(e.fY[r]),D=t.grz(e.fZ[r]);z&&z.addPoint(y,l,D),f&&(f[o]=t.grx(e.fX[r]-(s?e.fEXlow[r]:e.fEX[r])),f[o+1]=l,f[o+2]=D,f[o+3]=t.grx(e.fX[r]+(s?e.fEXhigh[r]:e.fEX[r])),f[o+4]=l,f[o+5]=D,o+=6,f[o]=y,f[o+1]=t.gry(e.fY[r]-(s?e.fEYlow[r]:e.fEY[r])),f[o+2]=D,f[o+3]=y,f[o+4]=t.gry(e.fY[r]+(s?e.fEYhigh[r]:e.fEY[r])),f[o+5]=D,o+=6,f[o]=y,f[o+1]=l,f[o+2]=t.grz(e.fZ[r]-(s?e.fEZlow[r]:e.fEZ[r])),f[o+3]=y,f[o+4]=l,f[o+5]=t.grz(e.fZ[r]+(s?e.fEZhigh[r]:e.fEZ[r])),o+=6),m&&(h>=6&&(m[h]=m[h-3],m[h+1]=m[h-2],m[h+2]=m[h-1],h+=3),m[h]=y,m[h+1]=l,m[h+2]=D,h+=3)}if(m&&h>3&&m.length==h){let r=i.getColor(e.fLineColor),y=new v.nls({color:new v.Ilk(r),linewidth:e.fLineWidth}),l=(0,k.Qy)(m,y);t.toplevel.add(l),l.graph=e,l.index=P,l.painter=t,l.scale0=.7*d,l.tip_name=i.getObjectHint(),l.tip_color=3===e.fMarkerColor?16711680:65280,l.nvertex=2,l.check_next=!0,l.tooltip=i.graph2DTooltip}if(f){let r=i.getColor(e.fLineColor),y=new v.nls({color:new v.Ilk(r),linewidth:e.fLineWidth}),l=(0,k.Qy)(f,y);t.toplevel.add(l),l.graph=e,l.index=P,l.painter=t,l.scale0=.7*d,l.tip_name=i.getObjectHint(),l.tip_color=3===e.fMarkerColor?16711680:65280,l.nvertex=6,l.tooltip=i.graph2DTooltip}if(z){let r="blue";i.options.Circles||(r=x?x.calcColor(g,p.length):i.getColor(e.fMarkerColor));let y=z.createPoints({color:r,style:i.options.Circles?4:e.fMarkerStyle}).then(l=>{l.graph=e,l.painter=t,l.tip_color=3===e.fMarkerColor?16711680:65280,l.scale0=.3*d,l.index=P,l.tip_name=i.getObjectHint(),l.tooltip=i.graph2DTooltip,t.toplevel.add(l)});X.push(y)}}return Promise.all(X).then(()=>(t.render3D(100),i))})()}static draw(i,a,t){return(0,j.Z)(function*(){let e=new w(i,a);e.decodeOptions(t,a);let n=Promise.resolve(!0);return e.getMainPainter()||(a.fHistogram||(a.fHistogram=e.createHistogram()),n=F.TH2Painter.draw(i,a.fHistogram,"lego;axis"),e.ownhisto=!0),n.then(()=>(e.addToPadPrimitives(),e.redraw()))})()}}}}]); -//# sourceMappingURL=554.734d0ef28756d2fc.js.map \ No newline at end of file +"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[351],{7351:(H,Y,T)=>{T.r(Y),T.d(Y,{TGraph2DPainter:()=>w});var j=T(4788),Z=T(9542),v=T(9900),A=T(3675),L=T(6458),b=T(6417),F=T(8189),k=T(1968);class w extends L.tK{decodeOptions(i,a){let t=new A.pc(i);this.options||(this.options={});let e=this.options;e.Color=t.check("COL"),e.Line=t.check("LINE"),e.Error=t.check("ERR")&&(this.matchObjectType("TGraph2DErrors")||this.matchObjectType("TGraph2DAsymmErrors")),e.Circles=t.check("P0"),e.Markers=t.check("P"),!e.Markers&&!e.Error&&!e.Circles&&!e.Line&&(1==a.fMarkerSize&&1==a.fMarkerStyle?e.Circles=!0:e.Markers=!0),e.Markers||(e.Color=!1),this.storeDrawOpt(i)}createHistogram(){let i=this.getObject(),a=this.matchObjectType("TGraph2DAsymmErrors"),t=i.fX[0],e=t,n=i.fY[0],_=n,c=i.fZ[0],x=c;for(let s=0;s=e&&(e=t+1),n>=_&&(_=n+1),c>=x&&(x=c+1);let p=.02*(e-t),d=.02*(_-n),X=.02*(x-c),g=t-p,u=e+p,C=n-d,E=_+d,z=c-X,O=x+X;g<0&&t>=0&&(g=.98*t),u>0&&e<=0&&(u=0),C<0&&n>=0&&(C=.98*n),E>0&&_<=0&&(E=0),z<0&&c>=0&&(z=.98*c),O>0&&x<=0&&(O=0);let P=this.getObject();P.fMinimum!=Z.kNoZoom&&(z=P.fMinimum),P.fMaximum!=Z.kNoZoom&&(O=P.fMaximum);let M=(0,Z.createHistogram)("TH2I",10,10);M.fName=P.fName+"_h",M.fTitle=P.fTitle,M.fXaxis.fXmin=g,M.fXaxis.fXmax=u,M.fYaxis.fXmin=C,M.fYaxis.fXmax=E,M.fZaxis.fXmin=z,M.fZaxis.fXmax=O,M.fMinimum=z,M.fMaximum=O;let f=(0,Z.BIT)(9);return M.fBits=M.fBits|f,M}graph2DTooltip(i){if(!Number.isInteger(i.index))return console.error(`intersect.index not provided, three.js version ${v.UZH}`),null;let a=Math.floor(i.index/this.nvertex);if(a<0||a>=this.index.length)return null;let t=p=>p*p;a=this.index[a];let e=this.painter,n=this.graph,_=e.grx(n.fX[a]),c=e.gry(n.fY[a]),x=e.grz(n.fZ[a]);if(this.check_next&&a+1{let C=0;for(let E=0;Et.scale_xmax||e.fY[E]t.scale_ymax||e.fZ[E]=u||++C;return C};if(Z.settings.OptimizeDraw>0&&!t.webgl){let g=_(t.scale_zmin,t.scale_zmax),u=5e4;g>u&&(n=Math.floor(g/u),n<=2&&(n=2))}let c=new b.M(e),x=null,p=[t.scale_zmin,t.scale_zmax],d=t.size_x3d/100*c.getFullSize(),X=[];i.options.Circles&&(d=.06*t.size_x3d),t.usesvg&&(d*=.3),i.options.Color&&(p=a.getContourLevels(),x=a.getHistPalette());for(let g=0;g=C)continue;let E=Math.floor(_(u,C)/n),z=null,O=0,P=new Int32Array(E),M=0,f=null,s=!1,m=null,o=0,h=0;(i.options.Markers||i.options.Circles)&&(z=new k.B_(E,t.webgl,d/3)),i.options.Error&&(f=new Float32Array(6*E*3),s=i.matchObjectType("TGraph2DAsymmErrors")),i.options.Line&&(m=new Float32Array(6*(E-1)));for(let r=0;rt.scale_xmax||e.fY[r]t.scale_ymax||e.fZ[r]=C||n>1&&(O=(O+1)%n,0!==O))continue;P[M++]=r;let y=t.grx(e.fX[r]),l=t.gry(e.fY[r]),D=t.grz(e.fZ[r]);z&&z.addPoint(y,l,D),f&&(f[o]=t.grx(e.fX[r]-(s?e.fEXlow[r]:e.fEX[r])),f[o+1]=l,f[o+2]=D,f[o+3]=t.grx(e.fX[r]+(s?e.fEXhigh[r]:e.fEX[r])),f[o+4]=l,f[o+5]=D,o+=6,f[o]=y,f[o+1]=t.gry(e.fY[r]-(s?e.fEYlow[r]:e.fEY[r])),f[o+2]=D,f[o+3]=y,f[o+4]=t.gry(e.fY[r]+(s?e.fEYhigh[r]:e.fEY[r])),f[o+5]=D,o+=6,f[o]=y,f[o+1]=l,f[o+2]=t.grz(e.fZ[r]-(s?e.fEZlow[r]:e.fEZ[r])),f[o+3]=y,f[o+4]=l,f[o+5]=t.grz(e.fZ[r]+(s?e.fEZhigh[r]:e.fEZ[r])),o+=6),m&&(h>=6&&(m[h]=m[h-3],m[h+1]=m[h-2],m[h+2]=m[h-1],h+=3),m[h]=y,m[h+1]=l,m[h+2]=D,h+=3)}if(m&&h>3&&m.length==h){let r=i.getColor(e.fLineColor),y=new v.nls({color:new v.Ilk(r),linewidth:e.fLineWidth}),l=(0,k.Qy)(m,y);t.toplevel.add(l),l.graph=e,l.index=P,l.painter=t,l.scale0=.7*d,l.tip_name=i.getObjectHint(),l.tip_color=3===e.fMarkerColor?16711680:65280,l.nvertex=2,l.check_next=!0,l.tooltip=i.graph2DTooltip}if(f){let r=i.getColor(e.fLineColor),y=new v.nls({color:new v.Ilk(r),linewidth:e.fLineWidth}),l=(0,k.Qy)(f,y);t.toplevel.add(l),l.graph=e,l.index=P,l.painter=t,l.scale0=.7*d,l.tip_name=i.getObjectHint(),l.tip_color=3===e.fMarkerColor?16711680:65280,l.nvertex=6,l.tooltip=i.graph2DTooltip}if(z){let r="blue";i.options.Circles||(r=x?x.calcColor(g,p.length):i.getColor(e.fMarkerColor));let y=z.createPoints({color:r,style:i.options.Circles?4:e.fMarkerStyle}).then(l=>{l.graph=e,l.painter=t,l.tip_color=3===e.fMarkerColor?16711680:65280,l.scale0=.3*d,l.index=P,l.tip_name=i.getObjectHint(),l.tooltip=i.graph2DTooltip,t.toplevel.add(l)});X.push(y)}}return Promise.all(X).then(()=>(t.render3D(100),i))})()}static draw(i,a,t){return(0,j.Z)(function*(){let e=new w(i,a);e.decodeOptions(t,a);let n=Promise.resolve(!0);return e.getMainPainter()||(a.fHistogram||(a.fHistogram=e.createHistogram()),n=F.TH2Painter.draw(i,a.fHistogram,"lego;axis"),e.ownhisto=!0),n.then(()=>(e.addToPadPrimitives(),e.redraw()))})()}}}}]); +//# sourceMappingURL=351.7dfe5ad1980ea70b.js.map \ No newline at end of file diff --git a/docs/554.734d0ef28756d2fc.js.map b/docs/351.7dfe5ad1980ea70b.js.map similarity index 99% rename from docs/554.734d0ef28756d2fc.js.map rename to docs/351.7dfe5ad1980ea70b.js.map index 82ed8402c..290e1c66e 100644 --- a/docs/554.734d0ef28756d2fc.js.map +++ b/docs/351.7dfe5ad1980ea70b.js.map @@ -1 +1 @@ -{"version":3,"file":"554.734d0ef28756d2fc.js","mappings":"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","names":["TGraph2DPainter","ObjectPainter","decodeOptions","opt","gr","d","DrawOptions","this","options","res","Color","check","Line","Error","matchObjectType","Circles","Markers","fMarkerSize","fMarkerStyle","storeDrawOpt","createHistogram","getObject","asymm","xmin","fX","xmax","ymin","fY","ymax","zmin","fZ","zmax","p","fNpoints","x","y","z","Math","min","fEXlow","fEX","max","fEXhigh","fEYlow","fEY","fEYhigh","fEZlow","fEZ","fEZhigh","dx","dy","dz","uxmin","uxmax","uymin","uymax","uzmin","uzmax","graph","fMinimum","kNoZoom","fMaximum","histo","fName","fTitle","fXaxis","fXmin","fXmax","fYaxis","fZaxis","kNoStats","BIT","fBits","graph2DTooltip","intersect","Number","isInteger","index","console","error","REVISION","indx","floor","nvertex","length","sqr","v","painter","grx","gry","grz","check_next","point","grx1","gry1","grz1","x1","scale0","x2","y1","y2","z1","z2","color","tip_color","lines","tip_name","axisAsText","redraw","main","_this","getMainPainter","fp","getFramePainter","step","mode3d","countSelected","cnt","i","scale_xmin","scale_xmax","scale_ymin","scale_ymax","settings","webgl","numselected","scale_zmin","scale_zmax","sizelimit","markeratt","TAttMarkerHandler","palette","levels","scale","size_x3d","getFullSize","promises","usesvg","getContourLevels","getHistPalette","lvl","lvl_zmin","lvl_zmax","size","pnts","select","Int32Array","icnt","err","line","ierr","iline","PointsCreator","Float32Array","addPoint","lcolor","getColor","fLineColor","material","LineBasicMaterial","linewidth","fLineWidth","linemesh","createLineSegments","toplevel","add","getObjectHint","fMarkerColor","tooltip","errmesh","fcolor","calcColor","pr","createPoints","style","then","mesh","push","Promise","all","render3D","static","dom","promise","resolve","fHistogram","TH2Painter","ownhisto","addToPadPrimitives"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/hist/TGraph2DPainter.mjs"],"sourcesContent":["import { BIT, settings, createHistogram, kNoZoom } from '../core.mjs';\nimport { REVISION, Color, LineBasicMaterial } from '../three.mjs';\nimport { DrawOptions } from '../base/BasePainter.mjs';\nimport { ObjectPainter } from '../base/ObjectPainter.mjs';\nimport { TAttMarkerHandler } from '../base/TAttMarkerHandler.mjs';\nimport { TH2Painter } from './TH2Painter.mjs';\nimport { createLineSegments, PointsCreator } from '../base/base3d.mjs';\n\n/**\n * @summary Painter for TGraph2D classes\n * @private\n */\n\nclass TGraph2DPainter extends ObjectPainter {\n\n /** @summary Decode options string */\n decodeOptions(opt, gr) {\n let d = new DrawOptions(opt);\n\n if (!this.options)\n this.options = {};\n\n let res = this.options;\n\n res.Color = d.check('COL');\n res.Line = d.check('LINE');\n res.Error = d.check('ERR') && (this.matchObjectType('TGraph2DErrors') || this.matchObjectType('TGraph2DAsymmErrors'));\n res.Circles = d.check('P0');\n res.Markers = d.check('P');\n\n if (!res.Markers && !res.Error && !res.Circles && !res.Line) {\n if ((gr.fMarkerSize == 1) && (gr.fMarkerStyle == 1))\n res.Circles = true;\n else\n res.Markers = true;\n }\n if (!res.Markers) res.Color = false;\n\n this.storeDrawOpt(opt);\n }\n\n /** @summary Create histogram for axes drawing */\n createHistogram() {\n let gr = this.getObject(),\n asymm = this.matchObjectType('TGraph2DAsymmErrors'),\n xmin = gr.fX[0], xmax = xmin,\n ymin = gr.fY[0], ymax = ymin,\n zmin = gr.fZ[0], zmax = zmin;\n\n for (let p = 0; p < gr.fNpoints;++p) {\n\n let x = gr.fX[p], y = gr.fY[p], z = gr.fZ[p];\n\n if (this.options.Error) {\n xmin = Math.min(xmin, x - (asymm ? gr.fEXlow[p] : gr.fEX[p]));\n xmax = Math.max(xmax, x + (asymm ? gr.fEXhigh[p] : gr.fEX[p]));\n ymin = Math.min(ymin, y - (asymm ? gr.fEYlow[p] : gr.fEY[p]));\n ymax = Math.max(ymax, y + (asymm ? gr.fEYhigh[p] : gr.fEY[p]));\n zmin = Math.min(zmin, z - (asymm ? gr.fEZlow[p] : gr.fEZ[p]));\n zmax = Math.max(zmax, z + (asymm ? gr.fEZhigh[p] : gr.fEZ[p]));\n } else {\n xmin = Math.min(xmin, x);\n xmax = Math.max(xmax, x);\n ymin = Math.min(ymin, y);\n ymax = Math.max(ymax, y);\n zmin = Math.min(zmin, z);\n zmax = Math.max(zmax, z);\n }\n }\n\n if (xmin >= xmax) xmax = xmin+1;\n if (ymin >= ymax) ymax = ymin+1;\n if (zmin >= zmax) zmax = zmin+1;\n let dx = (xmax-xmin)*0.02, dy = (ymax-ymin)*0.02, dz = (zmax-zmin)*0.02,\n uxmin = xmin - dx, uxmax = xmax + dx,\n uymin = ymin - dy, uymax = ymax + dy,\n uzmin = zmin - dz, uzmax = zmax + dz;\n\n if ((uxmin < 0) && (xmin >= 0)) uxmin = xmin*0.98;\n if ((uxmax > 0) && (xmax <= 0)) uxmax = 0;\n\n if ((uymin < 0) && (ymin >= 0)) uymin = ymin*0.98;\n if ((uymax > 0) && (ymax <= 0)) uymax = 0;\n\n if ((uzmin < 0) && (zmin >= 0)) uzmin = zmin*0.98;\n if ((uzmax > 0) && (zmax <= 0)) uzmax = 0;\n\n let graph = this.getObject();\n\n if (graph.fMinimum != kNoZoom) uzmin = graph.fMinimum;\n if (graph.fMaximum != kNoZoom) uzmax = graph.fMaximum;\n\n let histo = createHistogram('TH2I', 10, 10);\n histo.fName = graph.fName + '_h';\n histo.fTitle = graph.fTitle;\n histo.fXaxis.fXmin = uxmin;\n histo.fXaxis.fXmax = uxmax;\n histo.fYaxis.fXmin = uymin;\n histo.fYaxis.fXmax = uymax;\n histo.fZaxis.fXmin = uzmin;\n histo.fZaxis.fXmax = uzmax;\n histo.fMinimum = uzmin;\n histo.fMaximum = uzmax;\n let kNoStats = BIT(9);\n histo.fBits = histo.fBits | kNoStats;\n return histo;\n }\n\n /** @summary Function handles tooltips in the mesh */\n graph2DTooltip(intersect) {\n if (!Number.isInteger(intersect.index)) {\n console.error(`intersect.index not provided, three.js version ${REVISION}`);\n return null;\n }\n\n let indx = Math.floor(intersect.index / this.nvertex);\n if ((indx < 0) || (indx >= this.index.length)) return null;\n let sqr = v => v*v;\n\n indx = this.index[indx];\n\n let p = this.painter, gr = this.graph,\n grx = p.grx(gr.fX[indx]),\n gry = p.gry(gr.fY[indx]),\n grz = p.grz(gr.fZ[indx]);\n\n if (this.check_next && indx+1 {\n let cnt = 0;\n for (let i = 0; i < graph.fNpoints; ++i) {\n if ((graph.fX[i] < fp.scale_xmin) || (graph.fX[i] > fp.scale_xmax) ||\n (graph.fY[i] < fp.scale_ymin) || (graph.fY[i] > fp.scale_ymax) ||\n (graph.fZ[i] < zmin) || (graph.fZ[i] >= zmax)) continue;\n\n ++cnt;\n }\n return cnt;\n };\n\n // try to define scale-down factor\n if ((settings.OptimizeDraw > 0) && !fp.webgl) {\n let numselected = countSelected(fp.scale_zmin, fp.scale_zmax),\n sizelimit = 50000;\n\n if (numselected > sizelimit) {\n step = Math.floor(numselected / sizelimit);\n if (step <= 2) step = 2;\n }\n }\n\n let markeratt = new TAttMarkerHandler(graph),\n palette = null,\n levels = [fp.scale_zmin, fp.scale_zmax],\n scale = fp.size_x3d / 100 * markeratt.getFullSize(),\n promises = [];\n\n if (this.options.Circles) scale = 0.06*fp.size_x3d;\n\n if (fp.usesvg) scale *= 0.3;\n\n if (this.options.Color) {\n levels = main.getContourLevels();\n palette = main.getHistPalette();\n }\n\n for (let lvl = 0; lvl < levels.length-1; ++lvl) {\n\n let lvl_zmin = Math.max(levels[lvl], fp.scale_zmin),\n lvl_zmax = Math.min(levels[lvl+1], fp.scale_zmax);\n\n if (lvl_zmin >= lvl_zmax) continue;\n\n let size = Math.floor(countSelected(lvl_zmin, lvl_zmax) / step),\n pnts = null, select = 0,\n index = new Int32Array(size), icnt = 0,\n err = null, asymm = false, line = null, ierr = 0, iline = 0;\n\n if (this.options.Markers || this.options.Circles)\n pnts = new PointsCreator(size, fp.webgl, scale/3);\n\n if (this.options.Error) {\n err = new Float32Array(size*6*3);\n asymm = this.matchObjectType('TGraph2DAsymmErrors');\n }\n\n if (this.options.Line)\n line = new Float32Array((size-1)*6);\n\n for (let i = 0; i < graph.fNpoints; ++i) {\n if ((graph.fX[i] < fp.scale_xmin) || (graph.fX[i] > fp.scale_xmax) ||\n (graph.fY[i] < fp.scale_ymin) || (graph.fY[i] > fp.scale_ymax) ||\n (graph.fZ[i] < lvl_zmin) || (graph.fZ[i] >= lvl_zmax)) continue;\n\n if (step > 1) {\n select = (select+1) % step;\n if (select !== 0) continue;\n }\n\n index[icnt++] = i; // remember point index for tooltip\n\n let x = fp.grx(graph.fX[i]),\n y = fp.gry(graph.fY[i]),\n z = fp.grz(graph.fZ[i]);\n\n if (pnts) pnts.addPoint(x,y,z);\n\n if (err) {\n err[ierr] = fp.grx(graph.fX[i] - (asymm ? graph.fEXlow[i] : graph.fEX[i]));\n err[ierr+1] = y;\n err[ierr+2] = z;\n err[ierr+3] = fp.grx(graph.fX[i] + (asymm ? graph.fEXhigh[i] : graph.fEX[i]));\n err[ierr+4] = y;\n err[ierr+5] = z;\n ierr+=6;\n err[ierr] = x;\n err[ierr+1] = fp.gry(graph.fY[i] - (asymm ? graph.fEYlow[i] : graph.fEY[i]));\n err[ierr+2] = z;\n err[ierr+3] = x;\n err[ierr+4] = fp.gry(graph.fY[i] + (asymm ? graph.fEYhigh[i] : graph.fEY[i]));\n err[ierr+5] = z;\n ierr+=6;\n err[ierr] = x;\n err[ierr+1] = y;\n err[ierr+2] = fp.grz(graph.fZ[i] - (asymm ? graph.fEZlow[i] : graph.fEZ[i]));\n err[ierr+3] = x;\n err[ierr+4] = y;\n err[ierr+5] = fp.grz(graph.fZ[i] + (asymm ? graph.fEZhigh[i] : graph.fEZ[i]));\n ierr+=6;\n }\n\n if (line) {\n if (iline>=6) {\n line[iline] = line[iline-3];\n line[iline+1] = line[iline-2];\n line[iline+2] = line[iline-1];\n iline+=3;\n }\n line[iline] = x;\n line[iline+1] = y;\n line[iline+2] = z;\n iline+=3;\n }\n }\n\n if (line && (iline > 3) && (line.length == iline)) {\n let lcolor = this.getColor(graph.fLineColor),\n material = new LineBasicMaterial({ color: new Color(lcolor), linewidth: graph.fLineWidth }),\n linemesh = createLineSegments(line, material);\n fp.toplevel.add(linemesh);\n\n linemesh.graph = graph;\n linemesh.index = index;\n linemesh.painter = fp;\n linemesh.scale0 = 0.7*scale;\n linemesh.tip_name = this.getObjectHint();\n linemesh.tip_color = (graph.fMarkerColor === 3) ? 0xFF0000 : 0x00FF00;\n linemesh.nvertex = 2;\n linemesh.check_next = true;\n\n linemesh.tooltip = this.graph2DTooltip;\n }\n\n if (err) {\n let lcolor = this.getColor(graph.fLineColor),\n material = new LineBasicMaterial({ color: new Color(lcolor), linewidth: graph.fLineWidth }),\n errmesh = createLineSegments(err, material);\n fp.toplevel.add(errmesh);\n\n errmesh.graph = graph;\n errmesh.index = index;\n errmesh.painter = fp;\n errmesh.scale0 = 0.7*scale;\n errmesh.tip_name = this.getObjectHint();\n errmesh.tip_color = (graph.fMarkerColor === 3) ? 0xFF0000 : 0x00FF00;\n errmesh.nvertex = 6;\n\n errmesh.tooltip = this.graph2DTooltip;\n }\n\n if (pnts) {\n let fcolor = 'blue';\n\n if (!this.options.Circles)\n fcolor = palette ? palette.calcColor(lvl, levels.length)\n : this.getColor(graph.fMarkerColor);\n\n let pr = pnts.createPoints({ color: fcolor, style: this.options.Circles ? 4 : graph.fMarkerStyle }).then(mesh => {\n mesh.graph = graph;\n mesh.painter = fp;\n mesh.tip_color = (graph.fMarkerColor === 3) ? 0xFF0000 : 0x00FF00;\n mesh.scale0 = 0.3*scale;\n mesh.index = index;\n\n mesh.tip_name = this.getObjectHint();\n mesh.tooltip = this.graph2DTooltip;\n fp.toplevel.add(mesh);\n });\n\n promises.push(pr);\n }\n }\n\n return Promise.all(promises).then(() => {\n fp.render3D(100);\n return this;\n });\n }\n\n /** @summary draw TGraph2D object */\n static async draw(dom, gr, opt) {\n let painter = new TGraph2DPainter(dom, gr);\n painter.decodeOptions(opt, gr);\n\n let promise = Promise.resolve(true);\n\n if (!painter.getMainPainter()) {\n if (!gr.fHistogram)\n gr.fHistogram = painter.createHistogram();\n promise = TH2Painter.draw(dom, gr.fHistogram, 'lego;axis');\n painter.ownhisto = true;\n }\n\n return promise.then(() => {\n painter.addToPadPrimitives();\n return painter.redraw();\n });\n }\n\n} // class TGraph2DPainter\n\nexport { TGraph2DPainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file +{"version":3,"file":"351.7dfe5ad1980ea70b.js","mappings":"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","names":["TGraph2DPainter","ObjectPainter","decodeOptions","opt","gr","d","DrawOptions","this","options","res","Color","check","Line","Error","matchObjectType","Circles","Markers","fMarkerSize","fMarkerStyle","storeDrawOpt","createHistogram","getObject","asymm","xmin","fX","xmax","ymin","fY","ymax","zmin","fZ","zmax","p","fNpoints","x","y","z","Math","min","fEXlow","fEX","max","fEXhigh","fEYlow","fEY","fEYhigh","fEZlow","fEZ","fEZhigh","dx","dy","dz","uxmin","uxmax","uymin","uymax","uzmin","uzmax","graph","fMinimum","kNoZoom","fMaximum","histo","fName","fTitle","fXaxis","fXmin","fXmax","fYaxis","fZaxis","kNoStats","BIT","fBits","graph2DTooltip","intersect","Number","isInteger","index","console","error","REVISION","indx","floor","nvertex","length","sqr","v","painter","grx","gry","grz","check_next","point","grx1","gry1","grz1","x1","scale0","x2","y1","y2","z1","z2","color","tip_color","lines","tip_name","axisAsText","redraw","main","_this","getMainPainter","fp","getFramePainter","step","mode3d","countSelected","cnt","i","scale_xmin","scale_xmax","scale_ymin","scale_ymax","settings","webgl","numselected","scale_zmin","scale_zmax","sizelimit","markeratt","TAttMarkerHandler","palette","levels","scale","size_x3d","getFullSize","promises","usesvg","getContourLevels","getHistPalette","lvl","lvl_zmin","lvl_zmax","size","pnts","select","Int32Array","icnt","err","line","ierr","iline","PointsCreator","Float32Array","addPoint","lcolor","getColor","fLineColor","material","LineBasicMaterial","linewidth","fLineWidth","linemesh","createLineSegments","toplevel","add","getObjectHint","fMarkerColor","tooltip","errmesh","fcolor","calcColor","pr","createPoints","style","then","mesh","push","Promise","all","render3D","static","dom","promise","resolve","fHistogram","TH2Painter","ownhisto","addToPadPrimitives"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/hist/TGraph2DPainter.mjs"],"sourcesContent":["import { BIT, settings, createHistogram, kNoZoom } from '../core.mjs';\nimport { REVISION, Color, LineBasicMaterial } from '../three.mjs';\nimport { DrawOptions } from '../base/BasePainter.mjs';\nimport { ObjectPainter } from '../base/ObjectPainter.mjs';\nimport { TAttMarkerHandler } from '../base/TAttMarkerHandler.mjs';\nimport { TH2Painter } from './TH2Painter.mjs';\nimport { createLineSegments, PointsCreator } from '../base/base3d.mjs';\n\n/**\n * @summary Painter for TGraph2D classes\n * @private\n */\n\nclass TGraph2DPainter extends ObjectPainter {\n\n /** @summary Decode options string */\n decodeOptions(opt, gr) {\n let d = new DrawOptions(opt);\n\n if (!this.options)\n this.options = {};\n\n let res = this.options;\n\n res.Color = d.check('COL');\n res.Line = d.check('LINE');\n res.Error = d.check('ERR') && (this.matchObjectType('TGraph2DErrors') || this.matchObjectType('TGraph2DAsymmErrors'));\n res.Circles = d.check('P0');\n res.Markers = d.check('P');\n\n if (!res.Markers && !res.Error && !res.Circles && !res.Line) {\n if ((gr.fMarkerSize == 1) && (gr.fMarkerStyle == 1))\n res.Circles = true;\n else\n res.Markers = true;\n }\n if (!res.Markers) res.Color = false;\n\n this.storeDrawOpt(opt);\n }\n\n /** @summary Create histogram for axes drawing */\n createHistogram() {\n let gr = this.getObject(),\n asymm = this.matchObjectType('TGraph2DAsymmErrors'),\n xmin = gr.fX[0], xmax = xmin,\n ymin = gr.fY[0], ymax = ymin,\n zmin = gr.fZ[0], zmax = zmin;\n\n for (let p = 0; p < gr.fNpoints;++p) {\n\n let x = gr.fX[p], y = gr.fY[p], z = gr.fZ[p];\n\n if (this.options.Error) {\n xmin = Math.min(xmin, x - (asymm ? gr.fEXlow[p] : gr.fEX[p]));\n xmax = Math.max(xmax, x + (asymm ? gr.fEXhigh[p] : gr.fEX[p]));\n ymin = Math.min(ymin, y - (asymm ? gr.fEYlow[p] : gr.fEY[p]));\n ymax = Math.max(ymax, y + (asymm ? gr.fEYhigh[p] : gr.fEY[p]));\n zmin = Math.min(zmin, z - (asymm ? gr.fEZlow[p] : gr.fEZ[p]));\n zmax = Math.max(zmax, z + (asymm ? gr.fEZhigh[p] : gr.fEZ[p]));\n } else {\n xmin = Math.min(xmin, x);\n xmax = Math.max(xmax, x);\n ymin = Math.min(ymin, y);\n ymax = Math.max(ymax, y);\n zmin = Math.min(zmin, z);\n zmax = Math.max(zmax, z);\n }\n }\n\n if (xmin >= xmax) xmax = xmin+1;\n if (ymin >= ymax) ymax = ymin+1;\n if (zmin >= zmax) zmax = zmin+1;\n let dx = (xmax-xmin)*0.02, dy = (ymax-ymin)*0.02, dz = (zmax-zmin)*0.02,\n uxmin = xmin - dx, uxmax = xmax + dx,\n uymin = ymin - dy, uymax = ymax + dy,\n uzmin = zmin - dz, uzmax = zmax + dz;\n\n if ((uxmin < 0) && (xmin >= 0)) uxmin = xmin*0.98;\n if ((uxmax > 0) && (xmax <= 0)) uxmax = 0;\n\n if ((uymin < 0) && (ymin >= 0)) uymin = ymin*0.98;\n if ((uymax > 0) && (ymax <= 0)) uymax = 0;\n\n if ((uzmin < 0) && (zmin >= 0)) uzmin = zmin*0.98;\n if ((uzmax > 0) && (zmax <= 0)) uzmax = 0;\n\n let graph = this.getObject();\n\n if (graph.fMinimum != kNoZoom) uzmin = graph.fMinimum;\n if (graph.fMaximum != kNoZoom) uzmax = graph.fMaximum;\n\n let histo = createHistogram('TH2I', 10, 10);\n histo.fName = graph.fName + '_h';\n histo.fTitle = graph.fTitle;\n histo.fXaxis.fXmin = uxmin;\n histo.fXaxis.fXmax = uxmax;\n histo.fYaxis.fXmin = uymin;\n histo.fYaxis.fXmax = uymax;\n histo.fZaxis.fXmin = uzmin;\n histo.fZaxis.fXmax = uzmax;\n histo.fMinimum = uzmin;\n histo.fMaximum = uzmax;\n let kNoStats = BIT(9);\n histo.fBits = histo.fBits | kNoStats;\n return histo;\n }\n\n /** @summary Function handles tooltips in the mesh */\n graph2DTooltip(intersect) {\n if (!Number.isInteger(intersect.index)) {\n console.error(`intersect.index not provided, three.js version ${REVISION}`);\n return null;\n }\n\n let indx = Math.floor(intersect.index / this.nvertex);\n if ((indx < 0) || (indx >= this.index.length)) return null;\n let sqr = v => v*v;\n\n indx = this.index[indx];\n\n let p = this.painter, gr = this.graph,\n grx = p.grx(gr.fX[indx]),\n gry = p.gry(gr.fY[indx]),\n grz = p.grz(gr.fZ[indx]);\n\n if (this.check_next && indx+1 {\n let cnt = 0;\n for (let i = 0; i < graph.fNpoints; ++i) {\n if ((graph.fX[i] < fp.scale_xmin) || (graph.fX[i] > fp.scale_xmax) ||\n (graph.fY[i] < fp.scale_ymin) || (graph.fY[i] > fp.scale_ymax) ||\n (graph.fZ[i] < zmin) || (graph.fZ[i] >= zmax)) continue;\n\n ++cnt;\n }\n return cnt;\n };\n\n // try to define scale-down factor\n if ((settings.OptimizeDraw > 0) && !fp.webgl) {\n let numselected = countSelected(fp.scale_zmin, fp.scale_zmax),\n sizelimit = 50000;\n\n if (numselected > sizelimit) {\n step = Math.floor(numselected / sizelimit);\n if (step <= 2) step = 2;\n }\n }\n\n let markeratt = new TAttMarkerHandler(graph),\n palette = null,\n levels = [fp.scale_zmin, fp.scale_zmax],\n scale = fp.size_x3d / 100 * markeratt.getFullSize(),\n promises = [];\n\n if (this.options.Circles) scale = 0.06*fp.size_x3d;\n\n if (fp.usesvg) scale *= 0.3;\n\n if (this.options.Color) {\n levels = main.getContourLevels();\n palette = main.getHistPalette();\n }\n\n for (let lvl = 0; lvl < levels.length-1; ++lvl) {\n\n let lvl_zmin = Math.max(levels[lvl], fp.scale_zmin),\n lvl_zmax = Math.min(levels[lvl+1], fp.scale_zmax);\n\n if (lvl_zmin >= lvl_zmax) continue;\n\n let size = Math.floor(countSelected(lvl_zmin, lvl_zmax) / step),\n pnts = null, select = 0,\n index = new Int32Array(size), icnt = 0,\n err = null, asymm = false, line = null, ierr = 0, iline = 0;\n\n if (this.options.Markers || this.options.Circles)\n pnts = new PointsCreator(size, fp.webgl, scale/3);\n\n if (this.options.Error) {\n err = new Float32Array(size*6*3);\n asymm = this.matchObjectType('TGraph2DAsymmErrors');\n }\n\n if (this.options.Line)\n line = new Float32Array((size-1)*6);\n\n for (let i = 0; i < graph.fNpoints; ++i) {\n if ((graph.fX[i] < fp.scale_xmin) || (graph.fX[i] > fp.scale_xmax) ||\n (graph.fY[i] < fp.scale_ymin) || (graph.fY[i] > fp.scale_ymax) ||\n (graph.fZ[i] < lvl_zmin) || (graph.fZ[i] >= lvl_zmax)) continue;\n\n if (step > 1) {\n select = (select+1) % step;\n if (select !== 0) continue;\n }\n\n index[icnt++] = i; // remember point index for tooltip\n\n let x = fp.grx(graph.fX[i]),\n y = fp.gry(graph.fY[i]),\n z = fp.grz(graph.fZ[i]);\n\n if (pnts) pnts.addPoint(x,y,z);\n\n if (err) {\n err[ierr] = fp.grx(graph.fX[i] - (asymm ? graph.fEXlow[i] : graph.fEX[i]));\n err[ierr+1] = y;\n err[ierr+2] = z;\n err[ierr+3] = fp.grx(graph.fX[i] + (asymm ? graph.fEXhigh[i] : graph.fEX[i]));\n err[ierr+4] = y;\n err[ierr+5] = z;\n ierr+=6;\n err[ierr] = x;\n err[ierr+1] = fp.gry(graph.fY[i] - (asymm ? graph.fEYlow[i] : graph.fEY[i]));\n err[ierr+2] = z;\n err[ierr+3] = x;\n err[ierr+4] = fp.gry(graph.fY[i] + (asymm ? graph.fEYhigh[i] : graph.fEY[i]));\n err[ierr+5] = z;\n ierr+=6;\n err[ierr] = x;\n err[ierr+1] = y;\n err[ierr+2] = fp.grz(graph.fZ[i] - (asymm ? graph.fEZlow[i] : graph.fEZ[i]));\n err[ierr+3] = x;\n err[ierr+4] = y;\n err[ierr+5] = fp.grz(graph.fZ[i] + (asymm ? graph.fEZhigh[i] : graph.fEZ[i]));\n ierr+=6;\n }\n\n if (line) {\n if (iline>=6) {\n line[iline] = line[iline-3];\n line[iline+1] = line[iline-2];\n line[iline+2] = line[iline-1];\n iline+=3;\n }\n line[iline] = x;\n line[iline+1] = y;\n line[iline+2] = z;\n iline+=3;\n }\n }\n\n if (line && (iline > 3) && (line.length == iline)) {\n let lcolor = this.getColor(graph.fLineColor),\n material = new LineBasicMaterial({ color: new Color(lcolor), linewidth: graph.fLineWidth }),\n linemesh = createLineSegments(line, material);\n fp.toplevel.add(linemesh);\n\n linemesh.graph = graph;\n linemesh.index = index;\n linemesh.painter = fp;\n linemesh.scale0 = 0.7*scale;\n linemesh.tip_name = this.getObjectHint();\n linemesh.tip_color = (graph.fMarkerColor === 3) ? 0xFF0000 : 0x00FF00;\n linemesh.nvertex = 2;\n linemesh.check_next = true;\n\n linemesh.tooltip = this.graph2DTooltip;\n }\n\n if (err) {\n let lcolor = this.getColor(graph.fLineColor),\n material = new LineBasicMaterial({ color: new Color(lcolor), linewidth: graph.fLineWidth }),\n errmesh = createLineSegments(err, material);\n fp.toplevel.add(errmesh);\n\n errmesh.graph = graph;\n errmesh.index = index;\n errmesh.painter = fp;\n errmesh.scale0 = 0.7*scale;\n errmesh.tip_name = this.getObjectHint();\n errmesh.tip_color = (graph.fMarkerColor === 3) ? 0xFF0000 : 0x00FF00;\n errmesh.nvertex = 6;\n\n errmesh.tooltip = this.graph2DTooltip;\n }\n\n if (pnts) {\n let fcolor = 'blue';\n\n if (!this.options.Circles)\n fcolor = palette ? palette.calcColor(lvl, levels.length)\n : this.getColor(graph.fMarkerColor);\n\n let pr = pnts.createPoints({ color: fcolor, style: this.options.Circles ? 4 : graph.fMarkerStyle }).then(mesh => {\n mesh.graph = graph;\n mesh.painter = fp;\n mesh.tip_color = (graph.fMarkerColor === 3) ? 0xFF0000 : 0x00FF00;\n mesh.scale0 = 0.3*scale;\n mesh.index = index;\n\n mesh.tip_name = this.getObjectHint();\n mesh.tooltip = this.graph2DTooltip;\n fp.toplevel.add(mesh);\n });\n\n promises.push(pr);\n }\n }\n\n return Promise.all(promises).then(() => {\n fp.render3D(100);\n return this;\n });\n }\n\n /** @summary draw TGraph2D object */\n static async draw(dom, gr, opt) {\n let painter = new TGraph2DPainter(dom, gr);\n painter.decodeOptions(opt, gr);\n\n let promise = Promise.resolve(true);\n\n if (!painter.getMainPainter()) {\n if (!gr.fHistogram)\n gr.fHistogram = painter.createHistogram();\n promise = TH2Painter.draw(dom, gr.fHistogram, 'lego;axis');\n painter.ownhisto = true;\n }\n\n return promise.then(() => {\n painter.addToPadPrimitives();\n return painter.redraw();\n });\n }\n\n} // class TGraph2DPainter\n\nexport { TGraph2DPainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file diff --git a/docs/404.html b/docs/404.html index dc60f8e08..2e447d9e6 100644 --- a/docs/404.html +++ b/docs/404.html @@ -22,12 +22,12 @@ - + - + \ No newline at end of file diff --git a/docs/431.d3bb1ba13892743e.js b/docs/431.d3bb1ba13892743e.js deleted file mode 100644 index 1d441d9db..000000000 --- a/docs/431.d3bb1ba13892743e.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[431],{2431:(J,L,u)=>{u.r(L),u.d(L,{RPalettePainter:()=>D,drawBox:()=>K,drawLine:()=>I,drawMarker:()=>S,drawText:()=>Z});var j=u(5368),P=u(1773),f=u(2912),k=u(6528),H=u(2989),B=u(6717),W=u(7428);function Z(){let c=this.getObject(),a=this.getPadPainter(),e=this.v7EvalAttr("onFrame",!1)?a.getFramePainter():null,l=!!e&&this.v7EvalAttr("clipping",!1),t=a.getCoordinate(c.fPos,e),n=this.v7EvalFont("text",{size:12,color:"black",align:22});return this.createG(l?"main_layer":!!e&&"upper_layer"),this.startTextDrawing(n,"font"),this.drawText({x:t.x,y:t.y,text:c.fText,latex:1}),this.finishTextDrawing()}function I(){let c=this.getObject(),a=this.getPadPainter(),e=this.v7EvalAttr("onFrame",!1)?a.getFramePainter():null,l=!!e&&this.v7EvalAttr("clipping",!1),t=a.getCoordinate(c.fP1,e),n=a.getCoordinate(c.fP2,e);this.createG(l?"main_layer":!!e&&"upper_layer"),this.createv7AttLine(),this.draw_g.append("svg:path").attr("d",`M${t.x},${t.y}L${n.x},${n.y}`).call(this.lineatt.func)}function K(){let c=this.getObject(),a=this.getPadPainter(),e=this.v7EvalAttr("onFrame",!1)?a.getFramePainter():null,l=!!e&&this.v7EvalAttr("clipping",!1),t=a.getCoordinate(c.fP1,e),n=a.getCoordinate(c.fP2,e);this.createG(l?"main_layer":!!e&&"upper_layer"),this.createv7AttLine("border_"),this.createv7AttFill(),this.draw_g.append("svg:path").attr("d",`M${t.x},${t.y}H${n.x}V${n.y}H${t.x}Z`).call(this.lineatt.func).call(this.fillatt.func)}function S(){let c=this.getObject(),a=this.getPadPainter(),e=this.v7EvalAttr("onFrame",!1)?a.getFramePainter():null,l=!!e&&this.v7EvalAttr("clipping",!1),t=a.getCoordinate(c.fP,e);this.createG(l?"main_layer":!!e&&"upper_layer"),this.createv7AttMarker();let n=this.markeratt.create(t.x,t.y);n&&this.draw_g.append("svg:path").attr("d",n).call(this.markeratt.func)}class D extends k.p{getHistPalette(){let a=this.getObject(),e=a?a.fPalette:null;return e&&!e.getColor&&(0,P.addMethods)(e,"ROOT::Experimental::RPalette"),e}drawPalette(a){let e=this.getHistPalette(),l=e.getContour(),t=this.getFramePainter();if(!l)return console.log("no contour - no palette");if(!t)return console.log("no frame painter - no palette");let A,C,o,h,n=e.full_min,E=e.full_max,O=l[0],R=l[l.length-1],p=t.getFrameRect(),y=this.getPadPainter().getPadWidth(),$=this.getPadPainter().getPadHeight(),U=this.v7EvalAttr("visible",!0),s=this.v7EvalAttr("vertical",!0);if(a){o=a.width,h=a.height;let i={};s?(this.v7AttrChange(i,"margin",(a.x-p.x-p.width)/y),this.v7AttrChange(i,"width",o/y)):(this.v7AttrChange(i,"margin",(a.y-p.y-p.height)/y),this.v7AttrChange(i,"width",h/$)),this.v7SendAttrChanges(i,!1)}else{if(s){let i=this.v7EvalLength("margin",y,.02);A=Math.round(p.x+p.width+i),o=this.v7EvalLength("width",y,.05),C=p.y,h=p.height}else{let i=this.v7EvalLength("margin",$,.02);A=p.x,o=p.width,C=Math.round(p.y+p.height+i),h=this.v7EvalLength("width",$,.05)}this.draw_g.attr("transform",`translate(${A},${C})`)}let w=this.draw_g.select(".colbtns");if(w.empty()?w=this.draw_g.append("svg:g").attr("class","colbtns"):w.selectAll("*").remove(),!U)return;w.append("svg:path").attr("d",`M0,0H${o}V${h}H0Z`).style("stroke","black").style("fill","none"),(void 0===n||void 0===E)&&(n=O,E=R),s?t.z_handle.configureAxis("zaxis",n,E,O,R,!0,[h,0],-h,{reverse:!1}):t.z_handle.configureAxis("zaxis",n,E,O,R,!1,[0,o],o,{reverse:!1});for(let i=0;it.unzoom("z"))}t.z_handle.maxTickSize=Math.round(.3*o);let T=t.z_handle.drawAxis(this.draw_g,s?`translate(${o},${h})`:`translate(0,${h})`,s?-1:1);return(0,P.isBatchMode)()||a?T:T.then(()=>{if(P.settings.ContextMenu&&this.draw_g.on("contextmenu",r=>{r.stopPropagation(),r.preventDefault(),(0,W.Z)(r,this).then(d=>{d.add("header:Palette"),d.addchk(s,"Vertical",z=>{this.v7SetAttr("vertical",z),this.redrawPad()}),t.z_handle.fillAxisContextMenu(d,"z"),d.show()})}),(0,H.uI)(this,{x:A,y:C,width:o,height:h,minwidth:20,minheight:20,no_change_x:!s,no_change_y:s,redraw:r=>this.drawPalette(r)}),!P.settings.Zooming)return;let g,x,b,v,i=!1,_=0,m=0;const G=r=>{if(!i)return;if(r.preventDefault(),v=(0,f.cx)(r,this.draw_g.node()),b)return t.z_handle.processLabelsMove("move",v);m=s?Math.min(Math.max(v[1],0),h):Math.min(Math.max(v[0],0),o);let d=Math.abs(m-_);!x&&d>1&&(g.style("display",null),x=!0),s?g.attr("y",Math.min(_,m)).attr("height",d):g.attr("x",Math.min(_,m)).attr("width",d)},V=r=>{if(i)if(r.preventDefault(),(0,f.Ys)(window).on("mousemove.colzoomRect",null).on("mouseup.colzoomRect",null),g.remove(),g=null,i=!1,b)t.z_handle.processLabelsMove("stop",v);else{let d=t.z_handle.func,z=d.invert(_),M=d.invert(m);this.getFramePainter().zoom("z",Math.min(z,M),Math.max(z,M))}},Y=r=>{i||(i=!0,r.preventDefault(),r.stopPropagation(),v=(0,f.cx)(r,this.draw_g.node()),_=m=v[s?1:0],x=!1,b=!1,g=w.append("svg:rect").attr("class","zoom").attr("id","colzoomRect").style("display","none"),s?g.attr("x",0).attr("width",o).attr("y",_).attr("height",1):g.attr("x",_).attr("width",1).attr("y",0).attr("height",h),(0,f.Ys)(window).on("mousemove.colzoomRect",G).on("mouseup.colzoomRect",V,!0),setTimeout(()=>{!x&&i&&(b=t.z_handle.processLabelsMove("start",v))},500))},F=()=>{this.draw_g.selectAll(".axis_zoom, .axis_labels").on("mousedown",Y).on("dblclick",()=>t.unzoom("z")),P.settings.ZoomWheel&&this.draw_g.on("wheel",r=>{r.stopPropagation(),r.preventDefault();let d=(0,f.cx)(r,this.draw_g.node()),M=t.z_handle.analyzeWheelEvent(r,s?1-d[1]/h:d[0]/o);M.changed&&t.zoom("z",M.min,M.max)})};t.z_handle.setAfterDrawHandler(F),F()})}static draw(a,e,l){return(0,j.Z)(function*(){let t=new D(a,e,l,"palette");return(0,B.ensureRCanvas)(t,!1).then(()=>(t.createG(),t))})()}}}}]); -//# sourceMappingURL=431.d3bb1ba13892743e.js.map \ No newline at end of file diff --git a/docs/460.82abbdc95d6f09e0.js b/docs/460.82abbdc95d6f09e0.js deleted file mode 100644 index d70592e9e..000000000 --- a/docs/460.82abbdc95d6f09e0.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[460],{1460:(N,v,l)=>{l.r(v),l.d(v,{drawLeafPlayer:()=>S,drawTree:()=>U,drawTreePlayer:()=>P,drawTreePlayerKey:()=>k});var x=l(5368),n=l(1773),R=l(2912),y=l(1227),_=l(1260),O=l(5611),f=l(2454),$=l(7320),B=l(5759),M=l(6462),A=l(3767),K=l(3083),c=l(7222);function b(i,t,e){return T.apply(this,arguments)}function T(){return(T=(0,x.Z)(function*(i,t,e){let s=t?._typename;return s&&(0,n.isStr)(s)?0==s.indexOf(n.clTH1)?$.TH1Painter.draw(i,t,e):0==s.indexOf(n.clTH2)?B.TH2Painter.draw(i,t,e):0==s.indexOf(n.clTH3)?M.TH3Painter.draw(i,t,e):0==s.indexOf(n.clTGraph)?A.o.draw(i,t,e):s==n.clTPolyMarker3D&&t.$hist?M.TH3Painter.draw(i,t.$hist,e).then(()=>{let r=new f.tK(i,t,e);return r.addToPadPrimitives(),r.redraw=K.Y,r.redraw()}):Promise.reject(Error(`Object of type ${s} cannot be draw with TTree`)):Promise.reject(Error("Object without type cannot be draw with TTree"))})).apply(this,arguments)}function I(i,t){return g.apply(this,arguments)}function g(){return(g=(0,x.Z)(function*(i,t){if(t||this.last_pr){if(this.dump||this.testio){if(!t)return;if((0,n.isBatchMode)()){let s=new O.be(this.drawid);return s.selectDom().property("_json_object_",i),s}if((0,n.isFunc)(n.internals.drawInspector))return n.internals.drawInspector(this.drawid,i);let e=(0,n.create)(n.clTObjString);return e.fString=(0,n.toJSON)(i,2),(0,f.VE)(this.drawid,e)}return this.last_pr||(this.last_pr=Promise.resolve(!0)),this.last_pr.then(()=>(this.last_pr=this.obj_painter?this.obj_painter.redrawObject(i).then(()=>this.obj_painter):b(this.drawid,i).then(e=>(this.obj_painter=e,t||(this.last_pr=null),e)),t?this.last_pr:null))}})).apply(this,arguments)}function C(i){return i.draw_first=!0,i.configureOnline=function(t,e,s,r,a){this.setItemName(t,"",this),this.url=e,this.root_version=r,this.askey=s,this.draw_expr=a},i.configureTree=function(t){this.local_tree=t},i.showExtraButtons=function(t){let e=this.selectDom(),s=this.local_tree?this.local_tree.fEntries:0;e.select(".treedraw_more").remove(),e.select(".treedraw_buttons").node().innerHTML+=`Cut: Opt: Num: First: `,e.select(".treedraw_exe").on("click",()=>this.performDraw()),e.select(".treedraw_cut").property("value",t?.parse_cut||"").on("change",()=>this.performDraw()),e.select(".treedraw_opt").property("value",t?.drawopt||"").on("change",()=>this.performDraw()),e.select(".treedraw_number").attr("value",t?.numentries||""),e.select(".treedraw_first").attr("value",t?.firstentry||""),e.select(".treedraw_clear").on("click",()=>(0,f.Eq)(this.drawid))},i.showPlayer=function(t){let e=this.selectDom();this.drawid="jsroot_tree_player_"+n.internals.id_counter+++"_draw";let s=t?.parse_cut||t?.numentries||t?.firstentry;e.html(`
Expr:

`),this.setTopPainter(),this.local_tree&&e.select(".treedraw_buttons").attr("title","Tree draw player for: "+this.local_tree.fName),e.select(".treedraw_exe").on("click",()=>this.performDraw()),e.select(".treedraw_varexp").attr("value",t?.parse_expr||this.draw_expr||"px:py").on("change",()=>this.performDraw()),e.select(".treedraw_varexp_info").attr("title","Example of valid draw expressions:\n px - 1-dim draw\n px:py - 2-dim draw\n px:py:pz - 3-dim draw\n px+py:px-py - use any expressions\n px:py>>Graph - create and draw TGraph\n px:py>>dump - dump extracted variables\n px:py>>h(50,-5,5,50,-5,5) - custom histogram\n px:py;hbins:100 - custom number of bins"),s?this.showExtraButtons(t):e.select(".treedraw_more").on("click",()=>this.showExtraButtons(t)),this.checkResize(),(0,c.MG)(this)},i.getValue=function(t){const e=this.selectDom().select(t);if(e.empty())return;const s=e.property("value");return void 0!==s?s:e.attr("value")},i.performLocalDraw=function(){if(!this.local_tree)return;const t=this.selectDom(),e={expr:this.getValue(".treedraw_varexp")};t.select(".treedraw_more").empty()&&(e.cut=this.getValue(".treedraw_cut"),e.cut||delete e.cut,e.drawopt=this.getValue(".treedraw_opt"),"dump"===e.drawopt&&(e.dump=!0,e.drawopt=""),e.drawopt||delete e.drawopt,e.numentries=parseInt(this.getValue(".treedraw_number")),Number.isInteger(e.numentries)||delete e.numentries,e.firstentry=parseInt(this.getValue(".treedraw_first")),Number.isInteger(e.firstentry)||delete e.firstentry),(0,f.Eq)(this.drawid),e.drawid=this.drawid,e.progress=I.bind(e),(0,_.treeDraw)(this.local_tree,e).then(s=>e.progress(s,!0))},i.getDrawOpt=function(){let t="player",e=this.getValue(".treedraw_varexp");return e&&(t+=":"+e),t},i.performDraw=function(){if(this.local_tree)return this.performLocalDraw();let t=this.selectDom(),e=this.url+"/exe.json.gz?compact=3&method=Draw",s=this.getValue(".treedraw_varexp"),r="h_tree_draw",a="",o=s.indexOf(">>");if(o<0)s+=">>"+r;else{r=s.slice(o+2),"+"==r[0]&&(r=r.slice(1));let u=r.indexOf("(");u>0&&(r=r.slice(0,u))}if(t.select(".treedraw_more").empty()){let u=this.getValue(".treedraw_cut"),h=this.getValue(".treedraw_number"),p=this.getValue(".treedraw_first");a=this.getValue(".treedraw_opt"),e+=`&prototype="const char*,const char*,Option_t*,Long64_t,Long64_t"&varexp="${s}"&selection="${u}"`,""==h&&(h=this.root_version>=394499?"TTree::kMaxEntries":"1000000000"),""==p&&(p="0"),e+=`&option="${a}"&nentries=${h}&firstentry=${p}`}else e+=`&prototype="Option_t*"&opt="${s}"`;e+="&_ret_object_="+r;const d=()=>{(0,n.httpRequest)(e,"object").then(u=>{(0,f.Eq)(this.drawid),b(this.drawid,u,a)})};this.draw_expr=s,this.askey?(this.askey=!1,(0,n.httpRequest)(this.url+"/root.json.gz?compact=3","text").then(d)):d()},i.checkResize=function(){(0,f.SI)(this.drawid)},i}function P(i,t,e,s){let r=i.findItem(t),a=i.getTopOnlineItem(r),o="",d=0;if(!r||!a)return null;if(s){for(o=r._name;r&&!r._ttree;)r=r._parent;if(!r)return null;t=i.itemFullName(r)}let u=i.getOnlineItemUrl(t);if(!u)return null;let h=a._root_version||400129,p=i.getDisplay();if(!p)return null;let L=p.findFrame(t,!0);if(!L)return null;let V=(0,R.Ys)(L).attr("id"),w=new O.be(V);if(r._childs&&!s)for(let E=0;E0&&(o+=":"),o+=m._name)}return C(w),w.configureOnline(t,u,e,h,o),w.showPlayer(),w}function k(i,t){return P(i,t,!0)}function S(i,t){return P(i,t,!1,!0)}function U(i,t,e){return D.apply(this,arguments)}function D(){return(D=(0,x.Z)(function*(i,t,e){let a,o,s=t,r=e;if(t._typename==_.clTBranchFunc?(r={expr:`.${t.func}()`,branch:t.branch},e&&0==e.indexOf("dump")?r.expr+=">>"+e:e&&(r.expr+=e),s=t.branch.$tree):t.$branch?(r={expr:`.${t.fName}${e||""}`,branch:t.$branch},(r.branch.fType===_.kClonesNode||r.branch.fType===_.kSTLNode)&&(r.expr=e,r.direct_branch=!0),s=t.$branch.$tree):t.$tree?(!e&&t.fStreamerType&&t.fStreamerType!==y.kt&&t.fStreamerType>=y.C5&&t.fStreamerType<=y.R1&&(e="dump"),r={expr:e,branch:t},s=t.$tree):(r||(r="player"),(0,n.isStr)(r)&&(r={expr:r})),!s)throw Error("No TTree object available for TTree::Draw");if((0,n.isStr)(r.expr)){let d=r.expr.indexOf("player");0==d?(r.player=!0,r.expr=r.expr.slice(6),":"==r.expr[0]&&(r.expr=r.expr.slice(1))):d>=0&&d==r.expr.length-6&&(r.player=!0,r.expr=r.expr.slice(0,d),d>0&&";"==r.expr[d-1]&&(r.expr=r.expr.slice(0,d-1)))}if(r.player?(a=new f.tK(i,t,e),C(a),a.configureTree(s),a.showPlayer(r),r.drawid=a.drawid):r.drawid=i,r.progress=I.bind(r),"testio"===r.expr)r.testio=!0,r.showProgress=c.Ae,o=(0,_.treeIOTest)(s,r);else{if(!r.expr&&!r.branch)return a;o=(0,_.treeDraw)(s,r)}return o.then(d=>r.progress(d,!0))})).apply(this,arguments)}_.TDrawSelector.prototype.ShowProgress=function(i){if(typeof document>"u"||(0,n.isBatchMode)())return;if(void 0===i||!Number.isFinite(i))return(0,c.Ae)();if(this.last_progress!==i){let a=i-this.last_progress;this.aver_diff||(this.aver_diff=a),this.aver_diff=.3*a+.7*this.aver_diff}let t=0;this.aver_diff<=0?t=0:this.aver_diff<1e-4?t=3:this.aver_diff<.001?t=2:this.aver_diff<.01&&(t=1);let e=document.createElement("p"),s=document.createTextNode("TTree draw "+(100*i).toFixed(t)+" % "),r=this;e.appendChild(s),e.title="Click on element to break drawing",e.onclick=function(){if(++r._break<3)return e.title="Tree draw will break after next I/O operation",s.nodeValue="Breaking ... ";r.Abort(),(0,c.Ae)()},(0,c.Ae)(e),this.last_progress=i}}}]); -//# sourceMappingURL=460.82abbdc95d6f09e0.js.map \ No newline at end of file diff --git a/docs/471.d4fa75b0547d540a.js b/docs/471.d4fa75b0547d540a.js deleted file mode 100644 index f5f21a97c..000000000 --- a/docs/471.d4fa75b0547d540a.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[471],{7471:(w,P,g)=>{g.r(P),g.d(P,{TWebPaintingPainter:()=>b});var O=g(5368),M=g(263),S=g(2454);class b extends S.tK{updateObject(e){return!!this.matchObjectType(e)&&(this.assignObject(e),!0)}redraw(){var e=this;return(0,O.Z)(function*(){const r=e.getObject(),n=e.getAxisToSvgFunc();if(!r?.fOper||!n)return;let h,T,a,l=0,i={},p=null,m="none",_="",o=r.fOper.split(";");const c=t=>{if(t!=m&&(p&&(p.attr("d",_),_="",p=null,m="none"),t))switch(m=t,p=e.draw_g.append("svg:path"),t){case"f":p.call(e.fillatt.func);break;case"l":p.call(e.lineatt.func).style("fill","none");break;case"m":p.call(e.markeratt.func)}},y=(t,x)=>{let f=0,s={_typename:"any"};for(let u=0;uf?d:void 0)),f=d}return s},B=t=>{for(;++t0?"L":"M")+n.x(r.fBuf[l++])+","+n.y(r.fBuf[l++]);"f"==h&&(_+="Z");continue;case"m":for(c(h),T=parseInt(o[t].slice(1)),e.markeratt.resetPos(),a=0;a1?i.fTextSize:e.getPadPainter().getPadHeight()*i.fTextSize,f=i.fTextAngle,s=o[t].slice(1),u=e.draw_g.append("svg:g");if(f>=360&&(f-=360*Math.floor(f/360)),e.startTextDrawing(i.fTextFont,x,u),"h"==h){let d="";for(a=0;aB(t))}continue;default:console.log(`unsupported operation ${h}`)}return Promise.resolve(!0)};return e.createG(),B(-1).then(()=>(c(),e))})()}static draw(e,r){return(0,O.Z)(function*(){let n=new b(e,r);return n.addToPadPrimitives(),n.redraw()})()}}}}]); -//# sourceMappingURL=471.d4fa75b0547d540a.js.map \ No newline at end of file diff --git a/docs/471.d4fa75b0547d540a.js.map b/docs/471.d4fa75b0547d540a.js.map deleted file mode 100644 index 779594bb3..000000000 --- a/docs/471.d4fa75b0547d540a.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"471.d4fa75b0547d540a.js","mappings":"oLAOA,MAAMA,UAA4BC,KAG/BC,aAAaC,GACV,QAAKC,KAAKC,gBAAgBF,KAC1BC,KAAKE,aAAaH,IACX,EACV,CAGMI,SAAS,qCAEZ,MAAMJ,EAAMK,EAAKC,YAAaC,EAAOF,EAAKG,mBAE1C,IAAKR,GAAKS,QAAUF,EAAM,OAE1B,IACIG,EAAMC,EAASC,EADfC,EAAO,EAAGC,EAAO,CAAC,EAAGC,EAAW,KAAMC,EAAW,OAAQC,EAAI,GAC3CC,EAAMlB,EAAIS,MAAMU,MAAM,KAE5C,MAAMC,EAAmBC,IACtB,GAAIA,GAAQL,IAERD,IACDA,EAASD,KAAK,IAAKG,GACnBA,EAAI,GAAIF,EAAW,KAAMC,EAAW,QAGlCK,GAIL,OAFAL,EAAWK,EACXN,EAAWV,EAAKiB,OAAOC,OAAO,YACtBF,GACL,IAAK,IAAKN,EAASS,KAAKnB,EAAKoB,QAAQlB,MAAO,MAC5C,IAAK,IAAKQ,EAASS,KAAKnB,EAAKqB,QAAQnB,MAAMoB,MAAM,OAAQ,QAAS,MAClE,IAAK,IAAKZ,EAASS,KAAKnB,EAAKuB,UAAUrB,MAAa,EAEvDsB,EAAY,CAACC,EAAKC,KAClB,IAAIC,EAAQ,EAAGhC,EAAM,CAAEiC,UAAW,OAClC,QAASC,EAAI,EAAGA,EAAIH,EAAMI,SAAUD,EAAG,CACpC,IAAIE,EAAIN,EAAIO,QAAQ,IAAKL,EAAM,GAC/BhC,EAAI+B,EAAMG,IAAMI,SAASR,EAAIS,MAAMP,EAAM,EAAII,EAAIJ,EAASI,OAAII,IAC9DR,EAAQI,CACX,CACA,OAAOpC,GACPyC,EAAUP,IACV,OAASA,EAAIhB,EAAIiB,QAEd,OADAzB,EAAOQ,EAAIgB,GAAG,GACNxB,GACL,IAAK,IACFL,EAAKqC,cAAc,CAAE5B,KAAMe,EAAUX,EAAIgB,GAAI,CAAC,aAAc,aAAc,eAAgBS,OAAO,IACjGvB,IACA,SACH,IAAK,IACFf,EAAKuC,cAAc,CAAE9B,KAAMe,EAAUX,EAAIgB,GAAI,CAAC,aAAc,eAAgBS,OAAO,IACnFvB,IACA,SACH,IAAK,IACFf,EAAKwC,gBAAgB,CAAE/B,KAAMe,EAAUX,EAAIgB,GAAI,CAAC,eAAgB,eAAgB,gBAAiBS,OAAO,IACxGvB,IACA,SACH,IAAK,IACFN,EAAOe,EAAUX,EAAIgB,GAAI,CAAC,aAAc,YAAa,YAAa,aAAc,eAC5EpB,EAAKgC,UAAY,IAAGhC,EAAKgC,YAAa,MAC1C1B,IACA,SACH,IAAK,IACL,IAAK,IAAK,CAEPA,EAA0B,KAARV,EAAe,IAAM,KAEvC,IAAIqC,EAAKxC,EAAKyC,EAAEhD,EAAIiD,KAAKpC,MACrBqC,EAAK3C,EAAK4C,EAAEnD,EAAIiD,KAAKpC,MACrBuC,EAAK7C,EAAKyC,EAAEhD,EAAIiD,KAAKpC,MACrBwC,EAAK9C,EAAK4C,EAAEnD,EAAIiD,KAAKpC,MAEzBI,GAAM,IAAG8B,KAAMG,KAAME,EAAGL,KAAMM,EAAGH,KAAMH,EAAGK,KAE1C,QACH,CACA,IAAK,IACL,IAAK,IAMF,IAJAhC,EAAiBV,GAEjBC,EAAU2B,SAASpB,EAAIgB,GAAGK,MAAM,IAE3B3B,EAAI,EAAGA,EAAID,IAAWC,EACxBK,IAAOL,EAAI,EAAK,IAAM,KAChBL,EAAKyC,EAAEhD,EAAIiD,KAAKpC,MAAW,IAAMN,EAAK4C,EAAEnD,EAAIiD,KAAKpC,MAE9C,KAARH,IAAaO,GAAG,KAEpB,SAGH,IAAK,IAOF,IALAG,EAAiBV,GAEjBC,EAAU2B,SAASpB,EAAIgB,GAAGK,MAAM,IAEhClC,EAAKuB,UAAU0B,WACV1C,EAAI,EAAGA,EAAID,IAAWC,EACxBK,GAAKZ,EAAKuB,UAAU2B,OAAOhD,EAAKyC,EAAEhD,EAAIiD,KAAKpC,MAAUN,EAAK4C,EAAEnD,EAAIiD,KAAKpC,OAExE,SAGH,IAAK,IACL,IAAK,IACF,GAAIC,EAAKgC,UAAW,CAEjB1B,IAEA,IAAIoC,EAAU1C,EAAKgC,UAAY,EAAKhC,EAAKgC,UAAYzC,EAAKoD,gBAAgBC,eAAiB5C,EAAKgC,UAC5Fa,EAAQ7C,EAAK8C,WACbC,EAAM3C,EAAIgB,GAAGK,MAAM,GACnBuB,EAAQzD,EAAKiB,OAAOC,OAAO,SAM/B,GAJIoC,GAAS,MAAKA,GAAiC,IAAxBI,KAAKC,MAAML,EAAM,MAE5CtD,EAAK4D,iBAAiBnD,EAAKoD,UAAWV,EAAQM,GAElC,KAARpD,EAAa,CACd,IAAIyD,EAAM,GACV,IAAKvD,EAAI,EAAGA,EAAIiD,EAAI1B,OAAQvB,GAAK,EAC9BuD,GAAOC,OAAOC,aAAa/B,SAASuB,EAAItB,MAAM3B,EAAEA,EAAE,GAAI,KACzDiD,EAAMM,CACT,CAGA,SAAKG,SAAS,CAAEC,MAAOzD,EAAK0D,WACZxB,EAAGzC,EAAKyC,EAAEhD,EAAIiD,KAAKpC,MACnBsC,EAAG5C,EAAK4C,EAAEnD,EAAIiD,KAAKpC,MACnB4D,QAASd,EACTe,KAAMb,EACNc,SAAOC,MAAS9D,EAAK+D,YACrBC,MAAO,EAAGxD,OAAQwC,IAE3BzD,EAAK0E,kBAAkBjB,GAAOkB,KAAK,IAAMvC,EAAQP,GAC3D,CACA,SAGH,QACG+C,QAAQC,IAAK,yBAAwBxE,KAI9C,OAAOyE,QAAQC,SAAQ,EAAI,EAG9B,SAAKC,UAEE5C,GAAQ,GAAIuC,KAAK,KAAQ5D,IAA2Bf,GAAS,EAhJxD,EAiJf,CAEAiF,YAAkBC,EAAKvF,GAAK,0BACzB,IAAIwF,EAAU,IAAI3F,EAAoB0F,EAAKvF,GAC3CwF,SAAQC,qBACDD,EAAQpF,QAAS,EAHC,EAI5B","names":["TWebPaintingPainter","ObjectPainter","updateObject","obj","this","matchObjectType","assignObject","redraw","_this","getObject","func","getAxisToSvgFunc","fOper","oper","npoints","n","indx","attr","lastpath","lastkind","d","arr","split","check_attributes","kind","draw_g","append","call","fillatt","lineatt","style","markeratt","read_attr","str","names","lastp","_typename","k","length","p","indexOf","parseInt","slice","undefined","process","createAttLine","force","createAttFill","createAttMarker","fTextSize","x1","x","fBuf","y1","y","x2","y2","resetPos","create","height","getPadPainter","getPadHeight","angle","fTextAngle","txt","group","Math","floor","startTextDrawing","fTextFont","res","String","fromCharCode","drawText","align","fTextAlign","rotate","text","color","getColor","fTextColor","latex","finishTextDrawing","then","console","log","Promise","resolve","createG","static","dom","painter","addToPadPrimitives"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/draw/TWebPaintingPainter.mjs"],"sourcesContent":["import { getColor } from '../base/colors.mjs';\nimport { ObjectPainter } from '../base/ObjectPainter.mjs';\n\n\n/** @summary Draw direct TVirtualX commands into SVG\n * @private */\n\nclass TWebPaintingPainter extends ObjectPainter {\n\n /** @summary Update TWebPainting object */\n updateObject(obj) {\n if (!this.matchObjectType(obj)) return false;\n this.assignObject(obj);\n return true;\n }\n\n /** @summary draw TWebPainting object */\n async redraw() {\n\n const obj = this.getObject(), func = this.getAxisToSvgFunc();\n\n if (!obj?.fOper || !func) return;\n\n let indx = 0, attr = {}, lastpath = null, lastkind = 'none', d = '',\n oper, npoints, n, arr = obj.fOper.split(';');\n\n const check_attributes = kind => {\n if (kind == lastkind) return;\n\n if (lastpath) {\n lastpath.attr('d', d); // flush previous\n d = ''; lastpath = null; lastkind = 'none';\n }\n\n if (!kind) return;\n\n lastkind = kind;\n lastpath = this.draw_g.append('svg:path');\n switch (kind) {\n case 'f': lastpath.call(this.fillatt.func); break;\n case 'l': lastpath.call(this.lineatt.func).style('fill', 'none'); break;\n case 'm': lastpath.call(this.markeratt.func); break;\n }\n }, read_attr = (str, names) => {\n let lastp = 0, obj = { _typename: 'any' };\n for (let k = 0; k < names.length; ++k) {\n let p = str.indexOf(':', lastp+1);\n obj[names[k]] = parseInt(str.slice(lastp+1, (p > lastp) ? p : undefined));\n lastp = p;\n }\n return obj;\n }, process = k => {\n while (++k < arr.length) {\n oper = arr[k][0];\n switch (oper) {\n case 'z':\n this.createAttLine({ attr: read_attr(arr[k], ['fLineColor', 'fLineStyle', 'fLineWidth']), force: true });\n check_attributes();\n continue;\n case 'y':\n this.createAttFill({ attr: read_attr(arr[k], ['fFillColor', 'fFillStyle']), force: true });\n check_attributes();\n continue;\n case 'x':\n this.createAttMarker({ attr: read_attr(arr[k], ['fMarkerColor', 'fMarkerStyle', 'fMarkerSize']), force: true });\n check_attributes();\n continue;\n case 'o':\n attr = read_attr(arr[k], ['fTextColor', 'fTextFont', 'fTextSize', 'fTextAlign', 'fTextAngle']);\n if (attr.fTextSize < 0) attr.fTextSize *= -0.001;\n check_attributes();\n continue;\n case 'r':\n case 'b': {\n\n check_attributes((oper == 'b') ? 'f' : 'l');\n\n let x1 = func.x(obj.fBuf[indx++]),\n y1 = func.y(obj.fBuf[indx++]),\n x2 = func.x(obj.fBuf[indx++]),\n y2 = func.y(obj.fBuf[indx++]);\n\n d += `M${x1},${y1}h${x2-x1}v${y2-y1}h${x1-x2}z`;\n\n continue;\n }\n case 'l':\n case 'f': {\n\n check_attributes(oper);\n\n npoints = parseInt(arr[k].slice(1));\n\n for (n = 0; n < npoints; ++n)\n d += ((n > 0) ? 'L' : 'M') +\n func.x(obj.fBuf[indx++]) + ',' + func.y(obj.fBuf[indx++]);\n\n if (oper == 'f') d+='Z';\n\n continue;\n }\n\n case 'm': {\n\n check_attributes(oper);\n\n npoints = parseInt(arr[k].slice(1));\n\n this.markeratt.resetPos();\n for (n = 0; n < npoints; ++n)\n d += this.markeratt.create(func.x(obj.fBuf[indx++]), func.y(obj.fBuf[indx++]));\n\n continue;\n }\n\n case 'h':\n case 't': {\n if (attr.fTextSize) {\n\n check_attributes();\n\n let height = (attr.fTextSize > 1) ? attr.fTextSize : this.getPadPainter().getPadHeight() * attr.fTextSize,\n angle = attr.fTextAngle,\n txt = arr[k].slice(1),\n group = this.draw_g.append('svg:g');\n\n if (angle >= 360) angle -= Math.floor(angle/360) * 360;\n\n this.startTextDrawing(attr.fTextFont, height, group);\n\n if (oper == 'h') {\n let res = '';\n for (n = 0; n < txt.length; n += 2)\n res += String.fromCharCode(parseInt(txt.slice(n,n+2), 16));\n txt = res;\n }\n\n // todo - correct support of angle\n this.drawText({ align: attr.fTextAlign,\n x: func.x(obj.fBuf[indx++]),\n y: func.y(obj.fBuf[indx++]),\n rotate: -angle,\n text: txt,\n color: getColor(attr.fTextColor),\n latex: 0, draw_g: group });\n\n return this.finishTextDrawing(group).then(() => process(k));\n }\n continue;\n }\n\n default:\n console.log(`unsupported operation ${oper}`);\n }\n };\n\n return Promise.resolve(true);\n }\n\n this.createG();\n\n return process(-1).then(() => { check_attributes(); return this; });\n }\n\n static async draw(dom, obj) {\n let painter = new TWebPaintingPainter(dom, obj);\n painter.addToPadPrimitives();\n return painter.redraw();\n }\n\n} // class TWebPaintingPainter\n\nexport { TWebPaintingPainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file diff --git a/docs/476.f27d0b39c577e2e0.js b/docs/476.f27d0b39c577e2e0.js new file mode 100644 index 000000000..fb40f47b4 --- /dev/null +++ b/docs/476.f27d0b39c577e2e0.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[476],{6476:(bt,ot,A)=>{A.r(ot),A.d(ot,{RH2Painter:()=>J});var H=A(4788),F=A(9542),st=A(2253),at=A(6367),it=A(3675),xt=A(8172),ct=A(9056);class W extends xt.n{constructor(t,i){super(t,i),this.wheel_zoomy=!0}cleanup(){delete this.tt_handle,super.cleanup()}getDimension(){return 2}toggleProjection(t,i){if("Projections"==t&&(t=""),(0,F.isStr)(t)&&t.length>1&&(i=parseInt(t.slice(1)),t=t[0]),i||(i=1),t&&this.is_projection==t){if(this.projection_width!==i)return void(this.projection_width=i);t=""}delete this.proj_hist;let e=this.is_projection===t?"":t;this.is_projection="",this.projection_width=i,this.provideSpecialDrawArea(e).then(()=>(this.is_projection=e,this.redrawProjection()))}redrawProjection(){}executeMenuCommand(t,i){return!!super.executeMenuCommand(t,i)||("SetShowProjectionX"==t.fName||"SetShowProjectionY"==t.fName)&&(this.toggleProjection(t.fName[17],i&&parseInt(i)?parseInt(i):1),!0)}fillHistContextMenu(t){t.add("sub:Projections",()=>this.toggleProjection());let i=this.is_projection||"";i&&(i+=this.projection_width);let e=["X1","X2","X3","X5","X10","Y1","Y2","Y3","Y5","Y10"];for(let o=0;othis.toggleProjection(l));t.add("endsub:"),t.add("Auto zoom-in",()=>this.autoZoom());let r=this.getSupportedDrawOptions();t.addDrawMenu("Draw with",r,o=>{if("inspect"===o)return this.showInspector();this.decodeOptions(o),this.interactiveRedraw("pad","drawopt")}),this.options.Color&&this.fillPaletteMenu(t)}clickButton(t){if(super.clickButton(t))return!0;switch(t){case"ToggleColor":this.toggleColor();break;case"Toggle3D":this.toggleMode3D();break;default:return!1}return!0}fillToolbar(){super.fillToolbar(!0);let t=this.getPadPainter();t&&(t.addPadButton("th2color","Toggle color","ToggleColor"),t.addPadButton("th2colorz","Toggle color palette","ToggleColorZ"),t.addPadButton("th2draw3d","Toggle 3D mode","Toggle3D"),t.showPadButtons())}toggleColor(){this.options.Mode3D?(this.options.Mode3D=!1,this.options.Color=!0):this.options.Color=!this.options.Color,this.redraw()}autoZoom(){let o,l,t=this.getSelectIndex("x","left",-1),i=this.getSelectIndex("x","right",1),e=this.getSelectIndex("y","left",-1),r=this.getSelectIndex("y","right",1),u=this.getHisto(),f=this.getAxis("x"),w=this.getAxis("y");if(t==i||e==r)return;let x=u.getBinContent(t+1,e+1);for(o=t;o0)return;let h=i,n=t,a=r,c=e;for(o=t;ox&&(o=n&&(n=o+1),l=c&&(c=l+1));let g,m,d,y,s=!1;return h===n-1&&h>t+1&&ne+1&&ct||ne||c0?r.fContMinPos:null,this.gmaxbin=r.fContMax;else for(this.gminbin=this.gmaxbin=r.getBinContent(1,1),this.gminposbin=null,i=0;ithis.gmaxbin&&(this.gmaxbin=o),o>0&&(null===this.gminposbin||this.gminposbin>o)&&(this.gminposbin=o)}this.zmin=this.gminbin,this.zmax=this.gmaxbin,null===this.gminposbin&&(this.gminposbin=1e-4*this.gmaxbin),this.draw_content=!(this.options.Axis>0)&&this.gmaxbin>0}countStat(t){let f,w,x,h,n,y,s,i=this.getHisto(),e=0,r=0,o=0,l=0,u=0,a={name:"histo",entries:0,integral:0,meanx:0,meany:0,rmsx:0,rmsy:0,matrix:[0,0,0,0,0,0,0,0,0],xmax:0,ymax:0,wmax:null},c=this.getSelectIndex("x","left"),g=this.getSelectIndex("x","right"),m=this.getSelectIndex("y","left"),d=this.getSelectIndex("y","right"),M=this.getAxis("x"),b=this.getAxis("y");for(y=1;y<=this.nbinsx;++y)for(f=y<=c+1?0:y>g+1?2:1,x=M.GetBinCoord(y-.5),s=1;s<=this.nbinsy;++s)w=s<=m+1?0:s>d+1?2:1,h=b.GetBinCoord(s-.5),n=i.getBinContent(y,s),a.entries+=n,a.matrix[3*w+f]+=n,1==f&&1==w&&(t&&!t(x,h)||((null===a.wmax||n>a.wmax)&&(a.wmax=n,a.xmax=x,a.ymax=h),e+=n,r+=x*n,o+=h*n,l+=x**2*n,u+=h**2*n));return Math.abs(e)>1e-300&&(a.meanx=r/e,a.meany=o/e,a.rmsx=Math.sqrt(Math.abs(l/e-a.meanx**2)),a.rmsy=Math.sqrt(Math.abs(u/e-a.meany**2))),null===a.wmax&&(a.wmax=0),a.integral=e,a}fillStatistic(t,i){let e=this.countStat(),r=Math.floor(i%10),o=Math.floor(i/10)%10,l=Math.floor(i/100)%10,u=Math.floor(i/1e3)%10,f=Math.floor(i/1e4)%10,w=Math.floor(i/1e5)%10,x=Math.floor(i/1e6)%10,h=Math.floor(i/1e7)%10,n=Math.floor(i/1e8)%10;if(t.clearStat(),r>0&&t.addText(e.name),o>0&&t.addText("Entries = "+t.format(e.entries,"entries")),l>0&&(t.addText("Mean x = "+t.format(e.meanx)),t.addText("Mean y = "+t.format(e.meany))),u>0&&(t.addText("Std Dev x = "+t.format(e.rmsx)),t.addText("Std Dev y = "+t.format(e.rmsy))),x>0&&t.addText("Integral = "+t.format(e.matrix[4],"entries")),h>0&&(t.addText("Skewness x = "),t.addText("Skewness y = ")),n>0&&t.addText("Kurt = "),f>0||w>0){let a=e.matrix;t.addText(a[6].toFixed(0)+" | "+a[7].toFixed(0)+" | "+a[7].toFixed(0)),t.addText(a[3].toFixed(0)+" | "+a[4].toFixed(0)+" | "+a[5].toFixed(0)),t.addText(a[0].toFixed(0)+" | "+a[1].toFixed(0)+" | "+a[2].toFixed(0))}return!0}drawBinsColor(){const t=this.getHisto(),i=this.prepareDraw(),e=i.stepi,r=i.stepj,o=[];let u,f,w,x,h,n,a,c,g,m;const d=()=>{m.path+=`h${a}v${m.y2-m.y}h${-a}z`,m.dy=0,m=null};for(x=i.i1;x{y&&this.draw_g.append("svg:path").style("fill",i.palette.getColor(s)).attr("d",y.path)}),this.updatePaletteDraw(),i}buildContour(t,i,e,r){let n,a,g,b,_,B,C,j,p,P,k,Z,T,lt,I,o=this.getHisto(),l=2004,f=new Float32Array(2*l),w=new Float32Array(2*l),x=new Int32Array(2*l),h=0,c=[],m=0,d=[0,0,0,0],y=[0,0,0,0],s=[0,0,0,0],M=[0,0,0,0],Q=t.stepi,E=t.stepj;function pt(G){for(let v=0;vs[j]&&(C=j),C++,h=1,p=1;p<=4;p++)j=C%4+1,P=ht(s[C-1],M[C-1],d[C-1],y[C-1],s[j-1],M[j-1],d[j-1],y[j-1]),h+=2*P,C=j;for(C=s[0]<=s[1]?0:1,j=s[2]<=s[3]?2:3,s[C]>s[j]&&(C=j),C++,h=2,p=1;p<=4;p++)j=1==C?4:C-1,P=ht(s[C-1],M[C-1],d[C-1],y[C-1],s[j-1],M[j-1],d[j-1],y[j-1]),h+=2*P,C=j;for(k=0,p=1;p<=h-5;p+=2)for(;x[p-1]!=x[p];){for(Z=f[p],T=w[p],lt=x[p],I=p;I<=h-5;I+=2)f[I]=f[I+2],w[I]=w[I+2],x[I]=x[I+2];if(f[h-3]=Z,w[h-3]=T,x[h-3]=lt,k>2e3)break;k++}if(k>2e3)continue;for(p=1;p<=h-2;p+=2)n=x[p-1],n>=0&&n=0){rt=n;break}for(B=0,n=rt-1;n>=0;n--)et[B]=n,B++;for(n=rt;n0&&v[b+1]===X[D]&&$[b+1]===L[D]&&(D--,X[D]=v[b],L[D]=$[b],v[b]=v[b+1]=R,$[b]=$[b+1]=O,U++);if(0==U)break}for(D+1=0&&r(G,X,L,D,z,n),S=0,b=2;b{let m,d,y,s,g="";for(let M=n;M<=a;++M){if(f?(d=f(x[M],h[M]),d.x=Math.round(t.grx(d.x)),d.y=Math.round(t.gry(d.y))):d={x:Math.round(x[M]),y:Math.round(h[M])},g)if(M==a&&y&&d.x==y.x&&d.y==y.y){if(!s)return"";g+="z",c=!1}else d.x!=m.x&&d.y!=m.y?(g+="l"+(d.x-m.x)+","+(d.y-m.y),s=!0):d.x!=m.x?(g+="h"+(d.x-m.x),s=!0):d.y!=m.y&&(g+="v"+(d.y-m.y),s=!0);else g="M"+d.x+","+d.y,y=d;m=d}return c&&(g+="z"),g};if(14===this.options.Contour){let x=`M0,0h${i}v${e}h${-i}z`;if(this.options.Proj){let h=r.stepj,n=parseInt((r.j2-r.j1)/h),a=new Float32Array(2*n),c=new Float32Array(2*n);for(let g=0;g{let d,g=l.getColor(x),m=g;switch(this.options.Contour){case 1:case 14:break;case 11:m="none",d=new at.rE({color:g});break;case 12:m="none",d=new at.rE({color:1,style:x%5+1,width:1});break;case 13:m="none",d=this.lineatt}let y=w(h,n,a,c,"none"!=m);if(!y)return;let s=this.draw_g.append("svg:path").attr("class","th2_contour").attr("d",y).style("fill",m);d&&s.call(d.func)}),r.hide_only_zeros=!0,r}createPolyBin(){return""}drawBinsText(t){let e,r,o,l,u,f,w,x,h,n,i=this.getHisto();null===t&&(t=this.prepareDraw({rounding:!1}));let a=this.v7EvalFont("text",{size:20,color:"black",align:22}),c=0,g=this.draw_g.append("svg:g").attr("class","th2_text"),m=t.stepi,d=t.stepj;for(this.options.BarOffset&&(c=this.options.BarOffset),this.startTextDrawing(a,"font",g),e=t.i1;e(t.hide_only_zeros=!0,t))}drawBinsArrow(){let e,r,l,u,f,w,x,h,n,a,c,g,m,d,y,t=this.getHisto(),i="",o=1e-30,s=this.prepareDraw({rounding:!1}),M=(s.grx[s.i2]-s.grx[s.i1])/(s.i2-s.i1+1-.03)/2,b=(s.gry[s.j2]-s.gry[s.j1])/(s.j2-s.j1+1-.03)/2,_=s.stepi,B=s.stepj;const C=(j,p)=>j?p?`l${j},${p}`:`h${j}`:p?`v${p}`:"";for(let j=0;j<2;++j)for(e=s.i1;e=s.i2-_?t.getBinContent(e+1,r+1)-t.getBinContent(e+1-_,r+1):.5*(t.getBinContent(e+1+_,r+1)-t.getBinContent(e+1-_,r+1)),u=r===s.j1?t.getBinContent(e+1,r+1+B)-t.getBinContent(e+1,r+1):r>=s.j2-B?t.getBinContent(e+1,r+1)-t.getBinContent(e+1,r+1-B):.5*(t.getBinContent(e+1,r+1+B)-t.getBinContent(e+1,r+1-B)),0===j?o=Math.max(o,Math.abs(l),Math.abs(u)):(f=(s.grx[e]+s.grx[e+_])/2,w=(s.gry[r]+s.gry[r+B])/2,x=M*l/o,h=b*u/o,n=f-x,a=f+x,c=w-h,g=w+h,l=Math.round(a-n),u=Math.round(g-c),(0!==l||0!==u)&&(i+="M"+Math.round(n)+","+Math.round(c)+C(l,u),(Math.abs(l)>5||Math.abs(u)>5)&&(m=Math.sqrt(2/(l**2+u**2)),d=Math.round(m*(l+u)),y=Math.round(m*(l-u)),(d||y)&&(i+=`m${-d},${y}`+C(d,-y)+C(-y,-d)))));return this.draw_g.append("svg:path").attr("d",i).style("fill","none").call(this.lineatt.func),s}drawBinsBox(){let t=this.getHisto(),i=this.prepareDraw({rounding:!1}),e=this.getFramePainter();e.maxbin===e.minbin&&(e.maxbin=this.gmaxbin,e.minbin=this.gminbin,e.minposbin=this.gminposbin),e.maxbin===e.minbin&&(e.minbin=Math.min(0,e.maxbin-1));let l,u,f,w,c,g,m,d,y,s,M,b,r=Math.max(Math.abs(e.maxbin),Math.abs(e.minbin)),o=Math.max(0,e.minbin),x="",h="",n="",a="",_=!1,B=0,C=i.stepi,j=i.stepj;if(e.logz&&r>0){_=!0;let p=Math.log(r);B=o>0?Math.log(o):e.minposbin>=1&&e.minposbin<100?Math.log(.7):e.minposbin>0?Math.log(.7*e.minposbin):p-10,B>=p&&(B=p-10),b=1/(p-B)}else b=1/(r-o);for(l=i.i1;l0?Math.log(w)-B:0:w-o,c=.5*(c<0?1:1-Math.sqrt(c*b)),c<0&&(c=0),s=i.grx[l+C]-i.grx[l],M=i.gry[u]-i.gry[u+j],g=c*s,m=c*M,d=Math.round(i.grx[l]+g),y=Math.round(i.gry[u+j]+m),s=Math.max(Math.round(s-2*g),1),M=Math.max(Math.round(M-2*m),1),x+=`M${d},${y}v${M}h${s}v${-M}z`,f<0&&10===this.options.BoxStyle&&(h+=`M${d},${y}l${s},${M}M${d+s},${y}l${-s},${M}`),11===this.options.BoxStyle&&s>5&&M>5)){let p=Math.round(.1*s),P=Math.round(.1*M),k=`M${d},${y}h${s}l${-p},${P}h${2*p-s}v${M-2*P}l${-p},${P}z`,Z=`M${d+s},${y+M}v${-M}l${-p},${P}v${M-2*P}h${2*p-s}l${-p},${P}z`;f<0?(a+=k,n+=Z):(n+=k,a+=Z)}if(x){let p=this.draw_g.append("svg:path").attr("d",x).call(this.fillatt.func);11!==this.options.BoxStyle&&this.fillatt.empty()&&p.call(this.lineatt.func)}if(n&&this.fillatt.hasColor()&&this.draw_g.append("svg:path").attr("d",n).call(this.fillatt.func).style("fill",(0,st.B8)(this.fillatt.color).brighter(.5).formatHex()),a&&this.draw_g.append("svg:path").attr("d",a).call(this.fillatt.func).style("fill",this.fillatt.hasColor()?(0,st.B8)(this.fillatt.color).darker(.5).formatHex():"red"),h){let p=this.draw_g.append("svg:path").attr("d",h).style("fill","none");this.lineatt.empty()||p.call(this.lineatt.func)}return i}drawBinsScatter(){let f,w,x,h,n,a,c,g,t=this.getHisto(),i=this.prepareDraw({rounding:!0,pixel_density:!0,scatter_plot:!0}),e=[],r=[],o=[],l=[],u=[],m=1,d=this.options.ScatCoef*(this.gmaxbin>2e3?2e3/this.gmaxbin:1),y=i.stepi,s=i.stepj,M=new it.q9(i.sumz);if(d*i.sumz<1e5){this.createv7AttMarker(),this.markeratt.resetPos();let j,p,C="";for(h=i.i1;h.7&&(m=.7/this.maxbin),h=i.i1;h0&&(_=b.insert("svg:defs",":first-child")),this.createv7AttMarker();let B=i.palette.getContour();for(f=0;f0&&(o=t.drawBinsContour(r,e.width,e.height)),t.options.Text&&(l=t.drawBinsText(o)),!o&&!l&&(o=t.drawBinsColor()),l||(l=Promise.resolve(o)),l.then(u=>(t.tt_handle=u,t))})()}getBinTooltips(t,i){let e=[],r=this.getHisto(),o=r.getBinContent(t+1,i+1),l=1,u=1;this.isDisplayItem()&&(l=r.stepx||1,u=r.stepy||1),e.push(this.getObjectHint()||"histo<2>"),e.push("x = "+this.getAxisBinTip("x",t,l),"y = "+this.getAxisBinTip("y",i,u)),e.push(`bin = ${t+1}, ${i+1}`),r.$baseh&&(o-=r.$baseh.getBinContent(t+1,i+1));let f="entries = "+(l>1||u>1?"~":"");return o===Math.round(o)?e.push(f+o):e.push(f+(0,it.Ee)(o,F.gStyle.fStatFormat)),e}getPolyBinTooltips(){return[]}processTooltipEvent(t){if(!t||!this.draw_content||!this.draw_g||!this.tt_handle||this.options.Proj)return this.draw_g&&this.draw_g.select(".tooltip_bin").remove(),null;let i=this.getHisto(),e=this.tt_handle,r=this.draw_g.select(".tooltip_bin");if(e.poly)return null;let o,l,u=0,f=null;for(o=e.i1;o=e.grx[o]&&t.x<=e.grx[o+1]);++o);for(l=e.j1;l=e.gry[l+1]&&t.y<=e.gry[l]);++l);if(o1){let s=(this.projection_width-1)/2;a+s>=e.j2?(a=Math.min(Math.round(a+s),e.j2),n=Math.max(a-this.projection_width,e.j1)):(n=Math.max(Math.round(n-s),e.j1),a=Math.min(n+this.projection_width,e.j2))}m=e.gry[a],d=e.gry[n],y=777*n+333*a}else if("Y"==this.is_projection){if(m=0,d=this.getFramePainter().getFrameHeight(),this.projection_width>1){let s=(this.projection_width-1)/2;h+s>=e.i2?(h=Math.min(Math.round(h+s),e.i2),x=Math.max(h-this.projection_width,e.i1)):(x=Math.max(Math.round(x-s),e.i1),h=Math.min(x+this.projection_width,e.i2))}c=e.grx[x],g=e.grx[h],y=777*x+333*h}w.changed=r.property("current_bin")!==y,w.changed&&r.attr("x",c).attr("width",g-c).attr("y",m).attr("height",d-m).style("opacity","0.7").property("current_bin",y),this.is_projection&&w.changed&&this.redrawProjection(x,h,n,a)}return w.changed&&(w.user_info={obj:i,name:"histo",bin:i.getBin(o+1,l+1),cont:u,binx:o+1,biny:l+1,grx:t.x,gry:t.y}),w}canZoomInside(t,i,e){if("z"==t)return!0;let r=this.getAxis(t);return r.FindBin(e,.5)-r.FindBin(i,0)>1}draw2D(t){var i=this;return(0,H.Z)(function*(){return i.clear3DScene(),i.drawFrameAxes().then(e=>!!e&&i.drawingBins(t)).then(e=>{if(e)return i.draw2DBins().then(()=>i.addInteractivity())}).then(()=>i)})()}draw3D(t){var i=this;return(0,H.Z)(function*(){return console.log("3D drawing is disabled, load ./hist/RH1Painter.mjs"),i.draw2D(t)})()}callDrawFunc(t){var i=this;return(0,H.Z)(function*(){let e=i.getFramePainter();return e&&e.mode3d!==i.options.Mode3D&&!i.isMainPainter()&&(i.options.Mode3D=e.mode3d),i.options.Mode3D?i.draw3D(t):i.draw2D(t)})()}redraw(t){var i=this;return(0,H.Z)(function*(){return i.callDrawFunc(t)})()}static _draw(t){return(0,H.Z)(function*(){return(0,ct.ensureRCanvas)(t).then(()=>{t.setAsMainPainter(),t.options={Hist:!1,Error:!1,Zero:!1,Mark:!1,Line:!1,Fill:!1,Lego:0,Surf:0,Text:!0,TextAngle:0,TextKind:"",BaseLine:!1,Mode3D:!1,AutoColor:0,Color:!1,Scat:!1,ScatCoef:1,Box:!1,BoxStyle:0,Arrow:!1,Contour:0,Proj:0,BarOffset:0,BarWidth:1,minimum:F.kNoZoom,maximum:F.kNoZoom};let i=t.v7EvalAttr("kind",""),e=t.v7EvalAttr("sub",0),r=t.options;switch(r.Text=t.v7EvalAttr("drawtext",!1),i){case"lego":r.Lego=e>0?10+e:12,r.Mode3D=!0;break;case"surf":r.Surf=e>0?10+e:1,r.Mode3D=!0;break;case"box":r.Box=!0,r.BoxStyle=10+e;break;case"err":r.Error=!0,r.Mode3D=!0;break;case"cont":r.Contour=e>0?10+e:1;break;case"arr":r.Arrow=!0;break;case"scat":r.Scat=!0;break;case"col":r.Color=!0;break;default:r.Text||(r.Color=!0)}return t._show_empty_bins=!1,t.scanContent(),t.callDrawFunc()})})()}static draw(t,i,e){return(0,H.Z)(function*(){return W._draw(new W(t,i),e)})()}}var mt=A(9850),K=A(7238);class J extends W{draw3DBins(){if(this.draw_content){if(this.options.Surf)return(0,K.c5)(this,!0);if(this.options.Error)return(0,K.me)(this,!0);if(this.options.Contour)return(0,K.ME)(this,!0,!0);(0,K.UR)(this,!0),this.updatePaletteDraw()}}draw3D(t){this.mode3d=!0;let i=this.getFramePainter(),e=this.isMainPainter(),r=Promise.resolve(this);if("resize"==t)return e&&i.resize3D()&&i.render3D(),r;let o=1+2*F.gStyle.fHistTopMargin;return this.zmin=i.logz?.3*this.gminposbin:this.gminbin,this.zmax=this.gmaxbin,this.options.minimum!==F.kNoZoom&&(this.zmin=this.options.minimum),this.options.maximum!==F.kNoZoom&&(this.zmax=this.options.maximum,o=1),i.logz&&this.zmin<=0&&(this.zmin=1e-5*this.zmax),this.deleteAttr(),e&&((0,K.g_)(i),r=i.create3DScene(this.options.Render3D).then(()=>{i.setAxesRanges(this.getAxis("x"),this.xmin,this.xmax,this.getAxis("y"),this.ymin,this.ymax,null,this.zmin,this.zmax),i.set3DOptions(this.options),i.drawXYZ(i.toplevel,mt.C,{zmult:o,zoom:F.settings.Zooming,ndim:2,draw:!0,v7:!0})})),i.mode3d?r.then(()=>this.drawingBins(t)).then(()=>{let l=this.getFramePainter();return this.draw3DBins(),l.render3D(),l.addKeysHandler(),this}):r}static draw(t,i,e){return(0,H.Z)(function*(){return J._draw(new J(t,i),e)})()}}}}]); +//# sourceMappingURL=476.f27d0b39c577e2e0.js.map \ No newline at end of file diff --git a/docs/476.f27d0b39c577e2e0.js.map b/docs/476.f27d0b39c577e2e0.js.map new file mode 100644 index 000000000..5623f8e62 --- /dev/null +++ b/docs/476.f27d0b39c577e2e0.js.map @@ -0,0 +1 @@ +{"version":3,"file":"476.f27d0b39c577e2e0.js","mappings":"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","names":["RH2Painter","RHistPainter","constructor","dom","histo","super","this","wheel_zoomy","cleanup","tt_handle","getDimension","toggleProjection","kind","width","isStr","length","parseInt","slice","is_projection","projection_width","proj_hist","new_proj","provideSpecialDrawArea","then","redrawProjection","executeMenuCommand","method","args","fName","fillHistContextMenu","menu","add","kinds","k","addchk","arg","autoZoom","opts","getSupportedDrawOptions","addDrawMenu","showInspector","decodeOptions","interactiveRedraw","options","Color","fillPaletteMenu","clickButton","funcname","toggleColor","toggleMode3D","fillToolbar","pp","getPadPainter","addPadButton","showPadButtons","Mode3D","redraw","i","j","i1","getSelectIndex","i2","j1","j2","getHisto","xaxis","getAxis","yaxis","min","getBinContent","Math","ileft","iright","jleft","jright","xmin","xmax","ymin","ymax","isany","GetBinCoord","getFramePainter","zoom","scanContent","when_axis_changed","nbinsx","nbinsy","extractAxesProperties","isDisplayItem","gminbin","fContMin","gminposbin","fContMinPos","gmaxbin","fContMax","bin_content","zmin","zmax","draw_content","Axis","countStat","cond","xside","yside","xx","yy","zz","xi","yi","stat_sum0","stat_sumx1","stat_sumy1","stat_sumx2","stat_sumy2","res","name","entries","integral","meanx","meany","rmsx","rmsy","matrix","wmax","xleft","xright","yleft","yright","abs","sqrt","fillStatistic","stat","dostat","data","print_name","floor","print_entries","print_mean","print_rms","print_under","print_over","print_integral","print_skew","print_kurt","clearStat","addText","format","m","toFixed","drawBinsColor","handle","prepareDraw","di","stepi","dj","stepj","colindx","cmd1","cmd2","binz","dx","dy","entry","last_entry","flush_last_entry","path","y2","y","grx","palette","getContourIndex","Zero","_show_empty_bins","gry","undefined","x","forEach","draw_g","append","style","getColor","attr","updatePaletteDraw","buildContour","levels","contour_func","ipoly","poly","np","n","ix","ljfill","count","xsave","ysave","itars","jx","kMAXCONTOUR","xarr","Float32Array","yarr","itarr","Int32Array","lj","polys","npmax","zc","ir","BinarySearch","kk","PaintContourLine","elev1","icont1","x1","y1","elev2","icont2","x2","xlen","pdif","diff","elev","vert","tlen","tdif","ii","maxii","icount","arrx","original","origx","arry","origy","createTPolyLine","fLastPoint","fN","fX","round","fY","max","polysort","first","xp","yp","iminus","iplus","nadd","istart","drawBinsContour","funcs","frame_w","frame_h","rounding","extra","Proj","main","getHistPalette","getContour","func","getProjectionFunc","BuildPath","do_close","last","pnt","cmd","Contour","dd","sz","xd","yd","lineatt","icol","fillcolor","TAttLineHandler","color","elem","call","hide_only_zeros","createPolyBin","drawBinsText","binw","binh","text","height","textFont","v7EvalFont","size","align","text_offset","text_g","BarOffset","startTextDrawing","toString","floatToString","gStyle","angle","drawText","latex","finishTextDrawing","drawBinsArrow","xc","yc","dxn","dyn","anr","si","co","dn","scale_x","scale_y","makeLine","loop","drawBinsBox","maxbin","minbin","minposbin","absz","zdiff","dgrx","dgry","ww","hh","xyfactor","absmax","absmin","cross","btn1","btn2","uselogz","logmin","logz","logmax","log","BoxStyle","pww","phh","side1","side2","fillatt","empty","hasColor","d3_rgb","brighter","formatHex","darker","drawBinsScatter","cw","ch","pixel_density","scatter_plot","colPaths","currx","curry","cell_w","cell_h","factor","scale","ScatCoef","rnd","TRandom","sumz","createv7AttMarker","markeratt","resetPos","npix","create","random","layer","getFrameSvg","select","defs","insert","cntr","pattern_class","pattern","internals","selectAll","remove","draw2DBins","_this","removeG","createHistDrawAttributes","createG","pmain","rect","getFrameRect","getGrFuncs","second_x","second_y","pr","Scat","Box","Arrow","Text","Promise","resolve","h","getBinTooltips","lines","stepx","stepy","push","getObjectHint","getAxisBinTip","$baseh","lbl","getPolyBinTooltips","processTooltipEvent","ttrect","title","fTitle","color1","color2","getFillColorAlt","exact","disabled","changed","binid","getFrameWidth","getFrameHeight","property","user_info","obj","bin","getBin","cont","binx","biny","canZoomInside","axis","FindBin","draw2D","reason","clear3DScene","_this2","drawFrameAxes","drawingBins","addInteractivity","draw3D","console","_this3","callDrawFunc","_this4","mode3d","isMainPainter","_this5","static","painter","ensureRCanvas","setAsMainPainter","Hist","Error","Mark","Line","Fill","Lego","Surf","TextAngle","TextKind","BaseLine","AutoColor","BarWidth","minimum","kNoZoom","maximum","v7EvalAttr","sub","o","opt","_draw","RH2Painter2D","draw3DBins","drawBinsSurf3D","drawBinsError3D","drawBinsContour3D","drawBinsLego","is_main","resize3D","render3D","zmult","deleteAttr","assignFrame3DMethods","create3DScene","Render3D","setAxesRanges","set3DOptions","drawXYZ","toplevel","RAxisPainter","settings","ndim","draw","v7","addKeysHandler"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/hist2d/RH2Painter.mjs","../node_modules/jsroot/modules/hist/RH2Painter.mjs"],"sourcesContent":["import { gStyle, internals, isStr, createTPolyLine, kNoZoom } from '../core.mjs';\nimport { rgb as d3_rgb } from '../d3.mjs';\nimport { TAttLineHandler } from '../base/TAttLineHandler.mjs';\nimport { floatToString, TRandom } from '../base/BasePainter.mjs';\nimport { RHistPainter } from './RHistPainter.mjs';\nimport { ensureRCanvas } from '../gpad/RCanvasPainter.mjs';\n\n/**\n * @summary Painter for RH2 classes\n *\n * @private\n */\n\nclass RH2Painter extends RHistPainter {\n\n /** @summary constructor\n * @param {object|string} dom - DOM element or id\n * @param {object} histo - histogram object */\n constructor(dom, histo) {\n super(dom, histo);\n this.wheel_zoomy = true;\n }\n\n /** @summary Cleanup painter */\n cleanup() {\n delete this.tt_handle;\n super.cleanup();\n }\n\n /** @summary Returns histogram dimension */\n getDimension() { return 2; }\n\n /** @summary Toggle projection */\n toggleProjection(kind, width) {\n\n if (kind == 'Projections') kind = '';\n\n if (isStr(kind) && (kind.length > 1)) {\n width = parseInt(kind.slice(1));\n kind = kind[0];\n }\n\n if (!width) width = 1;\n\n if (kind && (this.is_projection==kind)) {\n if (this.projection_width === width) {\n kind = '';\n } else {\n this.projection_width = width;\n return;\n }\n }\n\n delete this.proj_hist;\n\n let new_proj = (this.is_projection === kind) ? '' : kind;\n this.is_projection = ''; // disable projection redraw until callback\n this.projection_width = width;\n\n this.provideSpecialDrawArea(new_proj).then(() => { this.is_projection = new_proj; return this.redrawProjection(); });\n }\n\n /** @summary Readraw projections */\n redrawProjection(/* ii1, ii2 , jj1, jj2*/) {\n // do nothing for the moment\n\n if (!this.is_projection) return;\n }\n\n /** @summary Execute menu command */\n executeMenuCommand(method, args) {\n if (super.executeMenuCommand(method, args)) return true;\n\n if ((method.fName == 'SetShowProjectionX') || (method.fName == 'SetShowProjectionY')) {\n this.toggleProjection(method.fName[17], args && parseInt(args) ? parseInt(args) : 1);\n return true;\n }\n\n return false;\n }\n\n /** @summary Fill histogram context menu */\n fillHistContextMenu(menu) {\n menu.add('sub:Projections', () => this.toggleProjection());\n let kind = this.is_projection || '';\n if (kind) kind += this.projection_width;\n let kinds = ['X1', 'X2', 'X3', 'X5', 'X10', 'Y1', 'Y2', 'Y3', 'Y5', 'Y10'];\n for (let k = 0; k < kinds.length; ++k)\n menu.addchk(kind == kinds[k], kinds[k], kinds[k], arg => this.toggleProjection(arg));\n menu.add('endsub:');\n\n menu.add('Auto zoom-in', () => this.autoZoom());\n\n let opts = this.getSupportedDrawOptions();\n\n menu.addDrawMenu('Draw with', opts, arg => {\n if (arg === 'inspect')\n return this.showInspector();\n this.decodeOptions(arg);\n this.interactiveRedraw('pad', 'drawopt');\n });\n\n if (this.options.Color)\n this.fillPaletteMenu(menu);\n }\n\n /** @summary Process click on histogram-defined buttons */\n clickButton(funcname) {\n if (super.clickButton(funcname)) return true;\n\n switch(funcname) {\n case 'ToggleColor': this.toggleColor(); break;\n case 'Toggle3D': this.toggleMode3D(); break;\n default: return false;\n }\n\n // all methods here should not be processed further\n return true;\n }\n\n /** @summary Fill pad toolbar with RH2-related functions */\n fillToolbar() {\n super.fillToolbar(true);\n\n let pp = this.getPadPainter();\n if (!pp) return;\n\n pp.addPadButton('th2color', 'Toggle color', 'ToggleColor');\n pp.addPadButton('th2colorz', 'Toggle color palette', 'ToggleColorZ');\n pp.addPadButton('th2draw3d', 'Toggle 3D mode', 'Toggle3D');\n pp.showPadButtons();\n }\n\n /** @summary Toggle color drawing mode */\n toggleColor() {\n\n if (this.options.Mode3D) {\n this.options.Mode3D = false;\n this.options.Color = true;\n } else {\n this.options.Color = !this.options.Color;\n }\n\n this.redraw();\n }\n\n /** @summary Perform automatic zoom inside non-zero region of histogram */\n autoZoom() {\n let i1 = this.getSelectIndex('x', 'left', -1),\n i2 = this.getSelectIndex('x', 'right', 1),\n j1 = this.getSelectIndex('y', 'left', -1),\n j2 = this.getSelectIndex('y', 'right', 1),\n i,j, histo = this.getHisto(), xaxis = this.getAxis('x'), yaxis = this.getAxis('y');\n\n if ((i1 == i2) || (j1 == j2)) return;\n\n // first find minimum\n let min = histo.getBinContent(i1 + 1, j1 + 1);\n for (i = i1; i < i2; ++i)\n for (j = j1; j < j2; ++j)\n min = Math.min(min, histo.getBinContent(i+1, j+1));\n if (min > 0) return; // if all points positive, no chance for autoscale\n\n let ileft = i2, iright = i1, jleft = j2, jright = j1;\n\n for (i = i1; i < i2; ++i)\n for (j = j1; j < j2; ++j)\n if (histo.getBinContent(i + 1, j + 1) > min) {\n if (i < ileft) ileft = i;\n if (i >= iright) iright = i + 1;\n if (j < jleft) jleft = j;\n if (j >= jright) jright = j + 1;\n }\n\n let xmin, xmax, ymin, ymax, isany = false;\n\n if ((ileft === iright-1) && (ileft > i1+1) && (iright < i2-1)) { ileft--; iright++; }\n if ((jleft === jright-1) && (jleft > j1+1) && (jright < j2-1)) { jleft--; jright++; }\n\n if ((ileft > i1 || iright < i2) && (ileft < iright - 1)) {\n xmin = xaxis.GetBinCoord(ileft);\n xmax = xaxis.GetBinCoord(iright);\n isany = true;\n }\n\n if ((jleft > j1 || jright < j2) && (jleft < jright - 1)) {\n ymin = yaxis.GetBinCoord(jleft);\n ymax = yaxis.GetBinCoord(jright);\n isany = true;\n }\n\n if (isany)\n return this.getFramePainter().zoom(xmin, xmax, ymin, ymax);\n }\n\n /** @summary Scan content of 2-dim histogram */\n scanContent(when_axis_changed) {\n\n // no need to rescan histogram while result does not depend from axis selection\n if (when_axis_changed && this.nbinsx && this.nbinsy) return;\n\n let i, j, histo = this.getHisto();\n\n this.extractAxesProperties(2);\n\n if (this.isDisplayItem()) {\n // take min/max values from the display item\n this.gminbin = histo.fContMin;\n this.gminposbin = histo.fContMinPos > 0 ? histo.fContMinPos : null;\n this.gmaxbin = histo.fContMax;\n } else {\n // global min/max, used at the moment in 3D drawing\n this.gminbin = this.gmaxbin = histo.getBinContent(1, 1);\n this.gminposbin = null;\n for (i = 0; i < this.nbinsx; ++i) {\n for (j = 0; j < this.nbinsy; ++j) {\n let bin_content = histo.getBinContent(i+1, j+1);\n if (bin_content < this.gminbin) this.gminbin = bin_content; else\n if (bin_content > this.gmaxbin) this.gmaxbin = bin_content;\n if (bin_content > 0)\n if ((this.gminposbin === null) || (this.gminposbin > bin_content)) this.gminposbin = bin_content;\n }\n }\n }\n\n this.zmin = this.gminbin;\n this.zmax = this.gmaxbin;\n\n // this value used for logz scale drawing\n if (this.gminposbin === null) this.gminposbin = this.gmaxbin*1e-4;\n\n if (this.options.Axis > 0) { // Paint histogram axis only\n this.draw_content = false;\n } else {\n this.draw_content = this.gmaxbin > 0;\n }\n }\n\n /** @summary Count statistic */\n countStat(cond) {\n let histo = this.getHisto(),\n stat_sum0 = 0, stat_sumx1 = 0, stat_sumy1 = 0,\n stat_sumx2 = 0, stat_sumy2 = 0,\n xside, yside, xx, yy, zz,\n res = { name: 'histo', entries: 0, integral: 0, meanx: 0, meany: 0, rmsx: 0, rmsy: 0, matrix: [0,0,0,0,0,0,0,0,0], xmax: 0, ymax:0, wmax: null };\n\n let xleft = this.getSelectIndex('x', 'left'),\n xright = this.getSelectIndex('x', 'right'),\n yleft = this.getSelectIndex('y', 'left'),\n yright = this.getSelectIndex('y', 'right'),\n xi, yi, xaxis = this.getAxis('x'), yaxis = this.getAxis('y');\n\n // TODO: account underflow/overflow bins, now stored in different array and only by histogram itself\n for (xi = 1; xi <= this.nbinsx; ++xi) {\n xside = (xi <= xleft+1) ? 0 : (xi > xright+1 ? 2 : 1);\n xx = xaxis.GetBinCoord(xi - 0.5);\n\n for (yi = 1; yi <= this.nbinsy; ++yi) {\n yside = (yi <= yleft+1) ? 0 : (yi > yright+1 ? 2 : 1);\n yy = yaxis.GetBinCoord(yi - 0.5);\n\n zz = histo.getBinContent(xi, yi);\n\n res.entries += zz;\n\n res.matrix[yside * 3 + xside] += zz;\n\n if ((xside != 1) || (yside != 1)) continue;\n\n if (cond && !cond(xx,yy)) continue;\n\n if ((res.wmax === null) || (zz > res.wmax)) { res.wmax = zz; res.xmax = xx; res.ymax = yy; }\n\n stat_sum0 += zz;\n stat_sumx1 += xx * zz;\n stat_sumy1 += yy * zz;\n stat_sumx2 += xx**2 * zz;\n stat_sumy2 += yy**2 * zz;\n }\n }\n\n if (Math.abs(stat_sum0) > 1e-300) {\n res.meanx = stat_sumx1 / stat_sum0;\n res.meany = stat_sumy1 / stat_sum0;\n res.rmsx = Math.sqrt(Math.abs(stat_sumx2 / stat_sum0 - res.meanx**2));\n res.rmsy = Math.sqrt(Math.abs(stat_sumy2 / stat_sum0 - res.meany**2));\n }\n\n if (res.wmax === null) res.wmax = 0;\n res.integral = stat_sum0;\n return res;\n }\n\n /** @summary Fill statistic into statbox */\n fillStatistic(stat, dostat /*, dofit*/) {\n\n let data = this.countStat(),\n print_name = Math.floor(dostat % 10),\n print_entries = Math.floor(dostat / 10) % 10,\n print_mean = Math.floor(dostat / 100) % 10,\n print_rms = Math.floor(dostat / 1000) % 10,\n print_under = Math.floor(dostat / 10000) % 10,\n print_over = Math.floor(dostat / 100000) % 10,\n print_integral = Math.floor(dostat / 1000000) % 10,\n print_skew = Math.floor(dostat / 10000000) % 10,\n print_kurt = Math.floor(dostat / 100000000) % 10;\n\n stat.clearStat();\n\n if (print_name > 0)\n stat.addText(data.name);\n\n if (print_entries > 0)\n stat.addText('Entries = ' + stat.format(data.entries,'entries'));\n\n if (print_mean > 0) {\n stat.addText('Mean x = ' + stat.format(data.meanx));\n stat.addText('Mean y = ' + stat.format(data.meany));\n }\n\n if (print_rms > 0) {\n stat.addText('Std Dev x = ' + stat.format(data.rmsx));\n stat.addText('Std Dev y = ' + stat.format(data.rmsy));\n }\n\n if (print_integral > 0)\n stat.addText('Integral = ' + stat.format(data.matrix[4], 'entries'));\n\n if (print_skew > 0) {\n stat.addText('Skewness x = ');\n stat.addText('Skewness y = ');\n }\n\n if (print_kurt > 0)\n stat.addText('Kurt = ');\n\n if ((print_under > 0) || (print_over > 0)) {\n let m = data.matrix;\n\n stat.addText('' + m[6].toFixed(0) + ' | ' + m[7].toFixed(0) + ' | ' + m[7].toFixed(0));\n stat.addText('' + m[3].toFixed(0) + ' | ' + m[4].toFixed(0) + ' | ' + m[5].toFixed(0));\n stat.addText('' + m[0].toFixed(0) + ' | ' + m[1].toFixed(0) + ' | ' + m[2].toFixed(0));\n }\n\n return true;\n }\n\n /** @summary Draw histogram bins as color */\n drawBinsColor() {\n const histo = this.getHisto(),\n handle = this.prepareDraw(),\n di = handle.stepi, dj = handle.stepj,\n entries = [],\n can_merge = true;\n let colindx, cmd1, cmd2, i, j, binz, dx, dy, entry, last_entry;\n\n const flush_last_entry = () => {\n last_entry.path += `h${dx}v${last_entry.y2-last_entry.y}h${-dx}z`;\n last_entry.dy = 0;\n last_entry = null;\n };\n\n // now start build\n for (i = handle.i1; i < handle.i2; i += di) {\n dx = (handle.grx[i+di] - handle.grx[i]) || 1;\n\n for (j = handle.j1; j < handle.j2; j += dj) {\n binz = histo.getBinContent(i+1, j+1);\n colindx = handle.palette.getContourIndex(binz);\n if (binz === 0) {\n if (!this.options.Zero)\n colindx = null;\n else if ((colindx === null) && this._show_empty_bins)\n colindx = 0;\n }\n if (colindx === null) {\n if (last_entry) flush_last_entry();\n continue;\n }\n\n cmd1 = `M${handle.grx[i]},${handle.gry[j]}`;\n\n dy = (handle.gry[j+dj] - handle.gry[j]) || -1;\n\n entry = entries[colindx];\n\n if (entry === undefined) {\n entry = entries[colindx] = { path: cmd1 };\n } else if (can_merge && (entry === last_entry)) {\n entry.y2 = handle.gry[j] + dy;\n continue;\n } else {\n cmd2 = `m${handle.grx[i]-entry.x},${handle.gry[j]-entry.y}`;\n entry.path += (cmd2.length < cmd1.length) ? cmd2 : cmd1;\n }\n if (last_entry) flush_last_entry();\n entry.x = handle.grx[i];\n entry.y = handle.gry[j];\n if (can_merge) {\n entry.y2 = handle.gry[j] + dy;\n last_entry = entry;\n } else {\n entry.path += `h${dx}v${dy}h${-dx}z`;\n }\n }\n if (last_entry) flush_last_entry();\n }\n\n entries.forEach((entry,colindx) => {\n if (entry)\n this.draw_g\n .append('svg:path')\n .style('fill', handle.palette.getColor(colindx))\n .attr('d', entry.path);\n });\n\n this.updatePaletteDraw();\n\n return handle;\n }\n\n /** @summary Build histogram contour lines */\n buildContour(handle, levels, palette, contour_func) {\n let histo = this.getHisto(),\n kMAXCONTOUR = 2004,\n kMAXCOUNT = 2000,\n // arguments used in the PaintContourLine\n xarr = new Float32Array(2*kMAXCONTOUR),\n yarr = new Float32Array(2*kMAXCONTOUR),\n itarr = new Int32Array(2*kMAXCONTOUR),\n lj = 0, ipoly, poly, polys = [], np, npmax = 0,\n x = [0.,0.,0.,0.], y = [0.,0.,0.,0.], zc = [0.,0.,0.,0.], ir = [0,0,0,0],\n i, j, k, n, m, ix, ljfill, count,\n xsave, ysave, itars, jx,\n di = handle.stepi, dj = handle.stepj;\n\n function BinarySearch(zc) {\n for (let kk=0;kk zc[m]) n = m;\n n++;\n lj=1;\n for (ix=1;ix<=4;ix++) {\n m = n%4 + 1;\n ljfill = PaintContourLine(zc[n-1],ir[n-1],x[n-1],y[n-1],\n zc[m-1],ir[m-1],x[m-1],y[m-1]);\n lj += 2*ljfill;\n n = m;\n }\n\n if (zc[0] <= zc[1]) n = 0; else n = 1;\n if (zc[2] <= zc[3]) m = 2; else m = 3;\n if (zc[n] > zc[m]) n = m;\n n++;\n lj=2;\n for (ix=1;ix<=4;ix++) {\n if (n == 1) m = 4;\n else m = n-1;\n ljfill = PaintContourLine(zc[n-1],ir[n-1],x[n-1],y[n-1],\n zc[m-1],ir[m-1],x[m-1],y[m-1]);\n lj += 2*ljfill;\n n = m;\n }\n // Re-order endpoints\n\n count = 0;\n for (ix=1; ix<=lj-5; ix +=2) {\n //count = 0;\n while (itarr[ix-1] != itarr[ix]) {\n xsave = xarr[ix];\n ysave = yarr[ix];\n itars = itarr[ix];\n for (jx=ix; jx<=lj-5; jx +=2) {\n xarr[jx] = xarr[jx+2];\n yarr[jx] = yarr[jx+2];\n itarr[jx] = itarr[jx+2];\n }\n xarr[lj-3] = xsave;\n yarr[lj-3] = ysave;\n itarr[lj-3] = itars;\n if (count > kMAXCOUNT) break;\n count++;\n }\n }\n\n if (count > kMAXCOUNT) continue;\n\n for (ix=1; ix<=lj-2; ix +=2) {\n\n ipoly = itarr[ix-1];\n\n if ((ipoly >= 0) && (ipoly < levels.length)) {\n poly = polys[ipoly];\n if (!poly)\n poly = polys[ipoly] = createTPolyLine(kMAXCONTOUR*4, true);\n\n np = poly.fLastPoint;\n if (np < poly.fN-2) {\n poly.fX[np+1] = Math.round(xarr[ix-1]); poly.fY[np+1] = Math.round(yarr[ix-1]);\n poly.fX[np+2] = Math.round(xarr[ix]); poly.fY[np+2] = Math.round(yarr[ix]);\n poly.fLastPoint = np+2;\n npmax = Math.max(npmax, poly.fLastPoint+1);\n } else {\n // console.log(`reject point ${poly.fLastPoint}`);\n }\n }\n }\n } // end of if (ir[0]\n } // end of j\n } // end of i\n\n let polysort = new Int32Array(levels.length), first = 0;\n // find first positive contour\n for (ipoly=0;ipoly= 0) { first = ipoly; break; }\n }\n //store negative contours from 0 to minimum, then all positive contours\n k = 0;\n for (ipoly = first - 1; ipoly >= 0; ipoly--) { polysort[k] = ipoly; k++; }\n for (ipoly = first; ipoly < levels.length; ipoly++) { polysort[k] = ipoly; k++; }\n\n let xp = new Float32Array(2*npmax),\n yp = new Float32Array(2*npmax);\n\n for (k=0;k 0) && (xx[i+1] === xp[iminus]) && (yy[i+1] === yp[iminus])) {\n iminus--;\n xp[iminus] = xx[i]; yp[iminus] = yy[i];\n xx[i] = xx[i+1] = xmin;\n yy[i] = yy[i+1] = ymin;\n nadd++;\n }\n }\n if (nadd == 0) break;\n }\n\n if ((iminus+1 < iplus) && (iminus >= 0))\n contour_func(colindx, xp, yp, iminus, iplus, ipoly);\n\n istart = 0;\n for (i=2;i {\n let cmd = '', last, pnt, first, isany;\n for (let i = iminus; i <= iplus; ++i) {\n if (func) {\n pnt = func(xp[i], yp[i]);\n pnt.x = Math.round(funcs.grx(pnt.x));\n pnt.y = Math.round(funcs.gry(pnt.y));\n } else {\n pnt = { x: Math.round(xp[i]), y: Math.round(yp[i]) };\n }\n if (!cmd) {\n cmd = 'M' + pnt.x + ',' + pnt.y; first = pnt;\n } else if ((i == iplus) && first && (pnt.x == first.x) && (pnt.y == first.y)) {\n if (!isany) return ''; // all same points\n cmd += 'z'; do_close = false;\n } else if ((pnt.x != last.x) && (pnt.y != last.y)) {\n cmd += 'l' + (pnt.x - last.x) + ',' + (pnt.y - last.y); isany = true;\n } else if (pnt.x != last.x) {\n cmd += 'h' + (pnt.x - last.x); isany = true;\n } else if (pnt.y != last.y) {\n cmd += 'v' + (pnt.y - last.y); isany = true;\n }\n last = pnt;\n }\n if (do_close) cmd += 'z';\n return cmd;\n };\n\n if (this.options.Contour === 14) {\n let dd = `M0,0h${frame_w}v${frame_h}h${-frame_w}z`;\n if (this.options.Proj) {\n let dj = handle.stepj, sz = parseInt((handle.j2 - handle.j1)/dj),\n xd = new Float32Array(sz*2), yd = new Float32Array(sz*2);\n for (let i=0;i {\n let icol = palette.getColor(colindx),\n fillcolor = icol, lineatt;\n\n switch (this.options.Contour) {\n case 1: break;\n case 11: fillcolor = 'none'; lineatt = new TAttLineHandler({ color: icol }); break;\n case 12: fillcolor = 'none'; lineatt = new TAttLineHandler({ color:1, style: (colindx%5 + 1), width: 1 }); break;\n case 13: fillcolor = 'none'; lineatt = this.lineatt; break;\n case 14: break;\n }\n\n let dd = BuildPath(xp, yp, iminus, iplus, fillcolor != 'none');\n if (!dd) return;\n\n let elem = this.draw_g\n .append('svg:path')\n .attr('class','th2_contour')\n .attr('d', dd)\n .style('fill', fillcolor);\n\n if (lineatt)\n elem.call(lineatt.func);\n }\n );\n\n handle.hide_only_zeros = true; // text drawing suppress only zeros\n\n return handle;\n }\n\n /** @summary Create polybin */\n createPolyBin() {\n // see how TH2Painter is implemented\n return '';\n }\n\n /** @summary Draw RH2 bins as text */\n drawBinsText(handle) {\n let histo = this.getHisto(),\n i, j, binz, binw, binh, text, x, y, width, height;\n\n if (handle === null) handle = this.prepareDraw({ rounding: false });\n\n let textFont = this.v7EvalFont('text', { size: 20, color: 'black', align: 22 }),\n text_offset = 0,\n text_g = this.draw_g.append('svg:g').attr('class','th2_text'),\n di = handle.stepi, dj = handle.stepj,\n profile2d = false;\n\n if (this.options.BarOffset) text_offset = this.options.BarOffset;\n\n this.startTextDrawing(textFont, 'font', text_g);\n\n for (i = handle.i1; i < handle.i2; i += di)\n for (j = handle.j1; j < handle.j2; j += dj) {\n binz = histo.getBinContent(i+1, j+1);\n if ((binz === 0) && !this._show_empty_bins) continue;\n\n binw = handle.grx[i+di] - handle.grx[i];\n binh = handle.gry[j] - handle.gry[j+dj];\n\n if (profile2d)\n binz = histo.getBinEntries(i+1, j+1);\n\n text = (binz === Math.round(binz)) ? binz.toString() :\n floatToString(binz, gStyle.fPaintTextFormat);\n\n if (textFont.angle) {\n x = Math.round(handle.grx[i] + binw*0.5);\n y = Math.round(handle.gry[j+dj] + binh*(0.5 + text_offset));\n width = height = 0;\n } else {\n x = Math.round(handle.grx[i] + binw*0.1);\n y = Math.round(handle.gry[j+dj] + binh*(0.1 + text_offset));\n width = Math.round(binw*0.8);\n height = Math.round(binh*0.8);\n }\n\n this.drawText({ align: 22, x, y, width, height, text, latex: 0, draw_g: text_g });\n }\n\n return this.finishTextDrawing(text_g, true).then(() => {\n\n handle.hide_only_zeros = true; // text drawing suppress only zeros\n\n return handle;\n });\n }\n\n /** @summary Draw RH2 bins as arrows */\n drawBinsArrow() {\n let histo = this.getHisto(), cmd = '',\n i,j, dn = 1e-30, dx, dy, xc,yc,\n dxn,dyn,x1,x2,y1,y2, anr,si,co,\n handle = this.prepareDraw({ rounding: false }),\n scale_x = (handle.grx[handle.i2] - handle.grx[handle.i1])/(handle.i2 - handle.i1 + 1-0.03)/2,\n scale_y = (handle.gry[handle.j2] - handle.gry[handle.j1])/(handle.j2 - handle.j1 + 1-0.03)/2,\n di = handle.stepi, dj = handle.stepj;\n\n const makeLine = (dx, dy) => {\n if (dx)\n return dy ? `l${dx},${dy}` : `h${dx}`;\n return dy ? `v${dy}` : '';\n };\n\n for (let loop = 0; loop < 2; ++loop)\n for (i = handle.i1; i < handle.i2; i += di)\n for (j = handle.j1; j < handle.j2; j += dj) {\n\n if (i === handle.i1) {\n dx = histo.getBinContent(i+1+di, j+1) - histo.getBinContent(i+1, j+1);\n } else if (i >= handle.i2-di) {\n dx = histo.getBinContent(i+1, j+1) - histo.getBinContent(i+1-di, j+1);\n } else {\n dx = 0.5*(histo.getBinContent(i+1+di, j+1) - histo.getBinContent(i+1-di, j+1));\n }\n if (j === handle.j1) {\n dy = histo.getBinContent(i+1, j+1+dj) - histo.getBinContent(i+1, j+1);\n } else if (j >= handle.j2-dj) {\n dy = histo.getBinContent(i+1, j+1) - histo.getBinContent(i+1, j+1-dj);\n } else {\n dy = 0.5*(histo.getBinContent(i+1, j+1+dj) - histo.getBinContent(i+1, j+1-dj));\n }\n\n if (loop === 0) {\n dn = Math.max(dn, Math.abs(dx), Math.abs(dy));\n } else {\n xc = (handle.grx[i] + handle.grx[i+di])/2;\n yc = (handle.gry[j] + handle.gry[j+dj])/2;\n dxn = scale_x*dx/dn;\n dyn = scale_y*dy/dn;\n x1 = xc - dxn;\n x2 = xc + dxn;\n y1 = yc - dyn;\n y2 = yc + dyn;\n dx = Math.round(x2-x1);\n dy = Math.round(y2-y1);\n\n if ((dx !== 0) || (dy !== 0)) {\n cmd += 'M'+Math.round(x1)+','+Math.round(y1) + makeLine(dx,dy);;\n\n if (Math.abs(dx) > 5 || Math.abs(dy) > 5) {\n anr = Math.sqrt(2/(dx**2 + dy**2));\n si = Math.round(anr*(dx + dy));\n co = Math.round(anr*(dx - dy));\n if (si || co)\n cmd += `m${-si},${co}` + makeLine(si,-co) + makeLine(-co,-si);;\n }\n }\n }\n }\n\n this.draw_g\n .append('svg:path')\n .attr('d', cmd)\n .style('fill', 'none')\n .call(this.lineatt.func);\n\n return handle;\n }\n\n /** @summary Draw RH2 bins as boxes */\n drawBinsBox() {\n\n let histo = this.getHisto(),\n handle = this.prepareDraw({ rounding: false }),\n main = this.getFramePainter();\n\n if (main.maxbin === main.minbin) {\n main.maxbin = this.gmaxbin;\n main.minbin = this.gminbin;\n main.minposbin = this.gminposbin;\n }\n if (main.maxbin === main.minbin)\n main.minbin = Math.min(0, main.maxbin-1);\n\n let absmax = Math.max(Math.abs(main.maxbin), Math.abs(main.minbin)),\n absmin = Math.max(0, main.minbin),\n i, j, binz, absz, res = '', cross = '', btn1 = '', btn2 = '',\n zdiff, dgrx, dgry, xx, yy, ww, hh,\n xyfactor, uselogz = false, logmin = 0,\n di = handle.stepi, dj = handle.stepj;\n\n if (main.logz && (absmax > 0)) {\n uselogz = true;\n let logmax = Math.log(absmax);\n if (absmin > 0)\n logmin = Math.log(absmin);\n else if ((main.minposbin >= 1) && (main.minposbin < 100))\n logmin = Math.log(0.7);\n else\n logmin = (main.minposbin > 0) ? Math.log(0.7*main.minposbin) : logmax - 10;\n if (logmin >= logmax) logmin = logmax - 10;\n xyfactor = 1. / (logmax - logmin);\n } else {\n xyfactor = 1. / (absmax - absmin);\n }\n\n // now start build\n for (i = handle.i1; i < handle.i2; i += di) {\n for (j = handle.j1; j < handle.j2; j += dj) {\n binz = histo.getBinContent(i + 1, j + 1);\n absz = Math.abs(binz);\n if ((absz === 0) || (absz < absmin)) continue;\n\n zdiff = uselogz ? ((absz > 0) ? Math.log(absz) - logmin : 0) : (absz - absmin);\n // area of the box should be proportional to absolute bin content\n zdiff = 0.5 * ((zdiff < 0) ? 1 : (1 - Math.sqrt(zdiff * xyfactor)));\n // avoid oversized bins\n if (zdiff < 0) zdiff = 0;\n\n ww = handle.grx[i+di] - handle.grx[i];\n hh = handle.gry[j] - handle.gry[j+dj];\n\n dgrx = zdiff * ww;\n dgry = zdiff * hh;\n\n xx = Math.round(handle.grx[i] + dgrx);\n yy = Math.round(handle.gry[j+dj] + dgry);\n\n ww = Math.max(Math.round(ww - 2*dgrx), 1);\n hh = Math.max(Math.round(hh - 2*dgry), 1);\n\n res += `M${xx},${yy}v${hh}h${ww}v${-hh}z`;\n\n if ((binz < 0) && (this.options.BoxStyle === 10))\n cross += `M${xx},${yy}l${ww},${hh}M${xx+ww},${yy}l${-ww},${hh}`;\n\n if ((this.options.BoxStyle === 11) && (ww>5) && (hh>5)) {\n let pww = Math.round(ww*0.1),\n phh = Math.round(hh*0.1),\n side1 = `M${xx},${yy}h${ww}l${-pww},${phh}h${2*pww-ww}v${hh-2*phh}l${-pww},${phh}z`,\n side2 = `M${xx+ww},${yy+hh}v${-hh}l${-pww},${phh}v${hh-2*phh}h${2*pww-ww}l${-pww},${phh}z`;\n if (binz < 0) { btn2 += side1; btn1 += side2; }\n else { btn1 += side1; btn2 += side2; }\n }\n }\n }\n\n if (res) {\n let elem = this.draw_g\n .append('svg:path')\n .attr('d', res)\n .call(this.fillatt.func);\n if ((this.options.BoxStyle !== 11) && this.fillatt.empty())\n elem.call(this.lineatt.func);\n }\n\n if (btn1 && this.fillatt.hasColor())\n this.draw_g.append('svg:path')\n .attr('d', btn1)\n .call(this.fillatt.func)\n .style('fill', d3_rgb(this.fillatt.color).brighter(0.5).formatHex());\n\n if (btn2)\n this.draw_g.append('svg:path')\n .attr('d', btn2)\n .call(this.fillatt.func)\n .style('fill', !this.fillatt.hasColor() ? 'red' : d3_rgb(this.fillatt.color).darker(0.5).formatHex());\n\n if (cross) {\n let elem = this.draw_g.append('svg:path')\n .attr('d', cross)\n .style('fill', 'none');\n if (!this.lineatt.empty())\n elem.call(this.lineatt.func);\n }\n\n return handle;\n }\n\n /** @summary Draw RH2 bins as scatter plot */\n drawBinsScatter() {\n let histo = this.getHisto(),\n handle = this.prepareDraw({ rounding: true, pixel_density: true, scatter_plot: true }),\n colPaths = [], currx = [], curry = [], cell_w = [], cell_h = [],\n colindx, cmd1, cmd2, i, j, binz, cw, ch, factor = 1.,\n scale = this.options.ScatCoef * ((this.gmaxbin) > 2000 ? 2000. / this.gmaxbin : 1.),\n di = handle.stepi, dj = handle.stepj;\n\n let rnd = new TRandom(handle.sumz);\n\n if (scale*handle.sumz < 1e5) {\n // one can use direct drawing of scatter plot without any patterns\n\n this.createv7AttMarker();\n\n this.markeratt.resetPos();\n\n let path = '', k, npix;\n for (i = handle.i1; i < handle.i2; i += di) {\n cw = handle.grx[i+di] - handle.grx[i];\n for (j = handle.j1; j < handle.j2; j += dj) {\n ch = handle.gry[j] - handle.gry[j+dj];\n binz = histo.getBinContent(i + 1, j + 1);\n\n npix = Math.round(scale*binz);\n if (npix <= 0) continue;\n\n for (k = 0; k < npix; ++k)\n path += this.markeratt.create(\n Math.round(handle.grx[i] + cw * rnd.random()),\n Math.round(handle.gry[j+1] + ch * rnd.random()));\n }\n }\n\n this.draw_g\n .append('svg:path')\n .attr('d', path)\n .call(this.markeratt.func);\n\n return handle;\n }\n\n // limit filling factor, do not try to produce as many points as filled area;\n if (this.maxbin > 0.7) factor = 0.7/this.maxbin;\n\n // let nlevels = Math.round(handle.max - handle.min);\n\n // now start build\n for (i = handle.i1; i < handle.i2; i += di) {\n for (j = handle.j1; j < handle.j2; j += dj) {\n binz = histo.getBinContent(i + 1, j + 1);\n if ((binz <= 0) || (binz < this.minbin)) continue;\n\n cw = handle.grx[i+di] - handle.grx[i];\n ch = handle.gry[j] - handle.gry[j+dj];\n if (cw*ch <= 0) continue;\n\n colindx = handle.palette.getContourIndex(binz/cw/ch);\n if (colindx < 0) continue;\n\n cmd1 = `M${handle.grx[i]},${handle.gry[j+dj]}`;\n if (colPaths[colindx] === undefined) {\n colPaths[colindx] = cmd1;\n cell_w[colindx] = cw;\n cell_h[colindx] = ch;\n } else{\n cmd2 = `m${handle.grx[i]-currx[colindx]},${handle.gry[j+dj] - curry[colindx]}`;\n colPaths[colindx] += (cmd2.length < cmd1.length) ? cmd2 : cmd1;\n cell_w[colindx] = Math.max(cell_w[colindx], cw);\n cell_h[colindx] = Math.max(cell_h[colindx], ch);\n }\n\n currx[colindx] = handle.grx[i];\n curry[colindx] = handle.gry[j+dj];\n\n colPaths[colindx] += `v${ch}h${cw}v${-ch}z`;\n }\n }\n\n let layer = this.getFrameSvg().select('.main_layer'),\n defs = layer.select('def');\n if (defs.empty() && (colPaths.length > 0))\n defs = layer.insert('svg:defs', ':first-child');\n\n this.createv7AttMarker();\n\n let cntr = handle.palette.getContour();\n\n for (colindx = 0; colindx < colPaths.length; ++colindx)\n if ((colPaths[colindx] !== undefined) && (colindx 0)\n handle = this.drawBinsContour(funcs, rect.width, rect.height);\n\n if (this.options.Text)\n pr = this.drawBinsText(handle);\n\n if (!handle && !pr)\n handle = this.drawBinsColor();\n\n if (!pr) pr = Promise.resolve(handle);\n\n return pr.then(h => {\n this.tt_handle = h;\n return this;\n });\n }\n\n /** @summary Provide text information (tooltips) for histogram bin */\n getBinTooltips(i, j) {\n let lines = [],\n histo = this.getHisto(),\n binz = histo.getBinContent(i+1,j+1),\n di = 1, dj = 1;\n\n if (this.isDisplayItem()) {\n di = histo.stepx || 1;\n dj = histo.stepy || 1;\n }\n\n lines.push(this.getObjectHint() || 'histo<2>');\n lines.push('x = ' + this.getAxisBinTip('x', i, di),\n 'y = ' + this.getAxisBinTip('y', j, dj));\n\n lines.push(`bin = ${i+1}, ${j+1}`);\n\n if (histo.$baseh) binz -= histo.$baseh.getBinContent(i+1,j+1);\n\n let lbl = 'entries = ' + ((di > 1) || (dj > 1) ? '~' : '');\n\n if (binz === Math.round(binz))\n lines.push(lbl + binz);\n else\n lines.push(lbl + floatToString(binz, gStyle.fStatFormat));\n\n return lines;\n }\n\n /** @summary Provide text information (tooltips) for poly bin */\n getPolyBinTooltips() {\n // see how TH2Painter is implemented\n return [];\n }\n\n /** @summary Process tooltip event */\n processTooltipEvent(pnt) {\n if (!pnt || !this.draw_content || !this.draw_g || !this.tt_handle || this.options.Proj) {\n if (this.draw_g)\n this.draw_g.select('.tooltip_bin').remove();\n return null;\n }\n\n let histo = this.getHisto(),\n h = this.tt_handle,\n ttrect = this.draw_g.select('.tooltip_bin');\n\n if (h.poly) {\n // process tooltips from TH2Poly - see TH2Painter\n return null;\n }\n\n let i, j, binz = 0, colindx = null;\n\n // search bins position\n for (i = h.i1; i < h.i2; ++i)\n if ((pnt.x>=h.grx[i]) && (pnt.x<=h.grx[i+1])) break;\n\n for (j = h.j1; j < h.j2; ++j)\n if ((pnt.y>=h.gry[j+1]) && (pnt.y<=h.gry[j])) break;\n\n if ((i < h.i2) && (j < h.j2)) {\n binz = histo.getBinContent(i+1,j+1);\n if (this.is_projection) {\n colindx = 0; // just to avoid hide\n } else if (h.hide_only_zeros) {\n colindx = (binz === 0) && !this._show_empty_bins ? null : 0;\n } else {\n colindx = h.palette.getContourIndex(binz);\n if ((colindx === null) && (binz === 0) && this._show_empty_bins) colindx = 0;\n }\n }\n\n if (colindx === null) {\n ttrect.remove();\n return null;\n }\n\n let res = { name: 'histo', title: histo.fTitle || 'title',\n x: pnt.x, y: pnt.y,\n color1: this.lineatt ? this.lineatt.color : 'green',\n color2: this.fillatt ? this.fillatt.getFillColorAlt('blue') : 'blue',\n lines: this.getBinTooltips(i, j), exact: true, menu: true };\n\n if (this.options.Color) res.color2 = h.palette.getColor(colindx);\n\n if (pnt.disabled && !this.is_projection) {\n ttrect.remove();\n res.changed = true;\n } else {\n if (ttrect.empty())\n ttrect = this.draw_g.append('svg:rect')\n .attr('class','tooltip_bin h1bin')\n .style('pointer-events','none');\n\n let i1 = i, i2 = i+1,\n j1 = j, j2 = j+1,\n x1 = h.grx[i1], x2 = h.grx[i2],\n y1 = h.gry[j2], y2 = h.gry[j1],\n binid = i*10000 + j;\n\n if (this.is_projection == 'X') {\n x1 = 0; x2 = this.getFramePainter().getFrameWidth();\n if (this.projection_width > 1) {\n let dd = (this.projection_width-1)/2;\n if (j2+dd >= h.j2) { j2 = Math.min(Math.round(j2+dd), h.j2); j1 = Math.max(j2 - this.projection_width, h.j1); }\n else { j1 = Math.max(Math.round(j1-dd), h.j1); j2 = Math.min(j1 + this.projection_width, h.j2); }\n }\n y1 = h.gry[j2]; y2 = h.gry[j1];\n binid = j1*777 + j2*333;\n } else if (this.is_projection == 'Y') {\n y1 = 0; y2 = this.getFramePainter().getFrameHeight();\n if (this.projection_width > 1) {\n let dd = (this.projection_width-1)/2;\n if (i2+dd >= h.i2) { i2 = Math.min(Math.round(i2+dd), h.i2); i1 = Math.max(i2 - this.projection_width, h.i1); }\n else { i1 = Math.max(Math.round(i1-dd), h.i1); i2 = Math.min(i1 + this.projection_width, h.i2); }\n }\n x1 = h.grx[i1], x2 = h.grx[i2],\n binid = i1*777 + i2*333;\n }\n\n res.changed = ttrect.property('current_bin') !== binid;\n\n if (res.changed)\n ttrect.attr('x', x1)\n .attr('width', x2 - x1)\n .attr('y', y1)\n .attr('height', y2 - y1)\n .style('opacity', '0.7')\n .property('current_bin', binid);\n\n if (this.is_projection && res.changed)\n this.redrawProjection(i1, i2, j1, j2);\n }\n\n if (res.changed)\n res.user_info = { obj: histo, name: 'histo',\n bin: histo.getBin(i+1, j+1), cont: binz, binx: i+1, biny: j+1,\n grx: pnt.x, gry: pnt.y };\n\n return res;\n }\n\n /** @summary Checks if it makes sense to zoom inside specified axis range */\n canZoomInside(axis,min,max) {\n if (axis == 'z') return true;\n let obj = this.getAxis(axis);\n return obj.FindBin(max,0.5) - obj.FindBin(min,0) > 1;\n }\n\n /** @summary Performs 2D drawing of histogram\n * @return {Promise} when ready */\n async draw2D(reason) {\n this.clear3DScene();\n\n return this.drawFrameAxes().then(res => {\n return res ? this.drawingBins(reason) : false;\n }).then(res => {\n if (res) return this.draw2DBins().then(() => this.addInteractivity());\n }).then(() => this);\n }\n\n /** @summary Performs 3D drawing of histogram\n * @return {Promise} when ready */\n async draw3D(reason) {\n console.log('3D drawing is disabled, load ./hist/RH1Painter.mjs');\n return this.draw2D(reason);\n }\n\n /** @summary Call drawing function depending from 3D mode */\n async callDrawFunc(reason) {\n let main = this.getFramePainter();\n\n if (main && (main.mode3d !== this.options.Mode3D) && !this.isMainPainter())\n this.options.Mode3D = main.mode3d;\n\n return this.options.Mode3D ? this.draw3D(reason) : this.draw2D(reason);\n }\n\n /** @summary Redraw histogram */\n async redraw(reason) {\n return this.callDrawFunc(reason);\n }\n\n /** @summary Draw histogram using painter instance\n * @private */\n static async _draw(painter /*, opt*/) {\n return ensureRCanvas(painter).then(() => {\n\n painter.setAsMainPainter();\n\n painter.options = { Hist: false, Error: false, Zero: false, Mark: false,\n Line: false, Fill: false, Lego: 0, Surf: 0,\n Text: true, TextAngle: 0, TextKind: '',\n BaseLine: false, Mode3D: false, AutoColor: 0,\n Color: false, Scat: false, ScatCoef: 1, Box: false, BoxStyle: 0, Arrow: false, Contour: 0, Proj: 0,\n BarOffset: 0., BarWidth: 1., minimum: kNoZoom, maximum: kNoZoom };\n\n let kind = painter.v7EvalAttr('kind', ''),\n sub = painter.v7EvalAttr('sub', 0),\n o = painter.options;\n\n o.Text = painter.v7EvalAttr('drawtext', false);\n\n switch(kind) {\n case 'lego': o.Lego = sub > 0 ? 10+sub : 12; o.Mode3D = true; break;\n case 'surf': o.Surf = sub > 0 ? 10+sub : 1; o.Mode3D = true; break;\n case 'box': o.Box = true; o.BoxStyle = 10 + sub; break;\n case 'err': o.Error = true; o.Mode3D = true; break;\n case 'cont': o.Contour = sub > 0 ? 10+sub : 1; break;\n case 'arr': o.Arrow = true; break;\n case 'scat': o.Scat = true; break;\n case 'col': o.Color = true; break;\n default: if (!o.Text) o.Color = true;\n }\n\n // here we deciding how histogram will look like and how will be shown\n // painter.decodeOptions(opt);\n\n painter._show_empty_bins = false;\n\n painter.scanContent();\n\n return painter.callDrawFunc();\n });\n }\n\n /** @summary draw RH2 object */\n static async draw(dom, obj, opt) {\n // create painter and add it to canvas\n return RH2Painter._draw(new RH2Painter(dom, obj), opt);\n }\n\n} // class RH2Painter\n\n\nexport { RH2Painter };\n","import { settings, gStyle, kNoZoom } from '../core.mjs';\nimport { RH2Painter as RH2Painter2D } from '../hist2d/RH2Painter.mjs';\nimport { RAxisPainter } from '../gpad/RAxisPainter.mjs';\nimport { assignFrame3DMethods, drawBinsLego, drawBinsError3D, drawBinsContour3D, drawBinsSurf3D } from './hist3d.mjs';\n\n\nclass RH2Painter extends RH2Painter2D {\n\n /** Draw histogram bins in 3D, using provided draw options */\n draw3DBins() {\n\n if (!this.draw_content) return;\n\n if (this.options.Surf)\n return drawBinsSurf3D(this, true);\n\n if (this.options.Error)\n return drawBinsError3D(this, true);\n\n if (this.options.Contour)\n return drawBinsContour3D(this, true, true);\n\n drawBinsLego(this, true);\n this.updatePaletteDraw();\n }\n\n draw3D(reason) {\n\n this.mode3d = true;\n\n let main = this.getFramePainter(), // who makes axis drawing\n is_main = this.isMainPainter(), // is main histogram\n pr = Promise.resolve(this);\n\n if (reason == 'resize') {\n if (is_main && main.resize3D()) main.render3D();\n\n return pr;\n }\n\n let zmult = 1 + 2*gStyle.fHistTopMargin;\n\n this.zmin = main.logz ? this.gminposbin * 0.3 : this.gminbin;\n this.zmax = this.gmaxbin;\n if (this.options.minimum !== kNoZoom) this.zmin = this.options.minimum;\n if (this.options.maximum !== kNoZoom) { this.zmax = this.options.maximum; zmult = 1; }\n if (main.logz && (this.zmin <= 0)) this.zmin = this.zmax * 1e-5;\n\n this.deleteAttr();\n\n if (is_main) {\n assignFrame3DMethods(main);\n pr = main.create3DScene(this.options.Render3D).then(() => {\n main.setAxesRanges(this.getAxis('x'), this.xmin, this.xmax, this.getAxis('y'), this.ymin, this.ymax, null, this.zmin, this.zmax);\n main.set3DOptions(this.options);\n main.drawXYZ(main.toplevel, RAxisPainter, { zmult, zoom: settings.Zooming, ndim: 2, draw: true, v7: true });\n });\n }\n\n if (!main.mode3d)\n return pr;\n\n return pr.then(() => this.drawingBins(reason)).then(() => {\n // called when bins received from server, must be reentrant\n let main = this.getFramePainter();\n\n this.draw3DBins();\n main.render3D();\n main.addKeysHandler();\n\n return this;\n });\n }\n\n /** @summary draw RH2 object */\n static async draw(dom, obj, opt) {\n // create painter and add it to canvas\n return RH2Painter._draw(new RH2Painter(dom, obj), opt);\n }\n\n} // class RH2Painter\n\nexport { RH2Painter };\n"],"x_google_ignoreList":[0,1]} \ No newline at end of file diff --git a/docs/484.5a180dbb47d3c56e.js b/docs/484.5a180dbb47d3c56e.js new file mode 100644 index 000000000..4827cacba --- /dev/null +++ b/docs/484.5a180dbb47d3c56e.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[484],{1484:(E,g,m)=>{m.r(g),m.d(g,{TSplinePainter:()=>x});var M=m(4788),p=m(9542),u=m(3675),P=m(6458),X=m(629);class x extends P.tK{updateObject(t,i){let e=this.getObject();return e._typename==t._typename&&(e!==t&&Object.assign(e,t),void 0!==i&&this.decodeOptions(i),!0)}eval(t,i){let e=i-t.fX;return"TSplinePoly3"==t._typename?t.fY+e*(t.fB+e*(t.fC+e*t.fD)):"TSplinePoly5"==t._typename?t.fY+e*(t.fB+e*(t.fC+e*(t.fD+e*(t.fE+e*t.fF)))):t.fY+e}findX(t){let i=this.getObject(),e=0,n=i.fNp-1;if(t<=i.fXmin)return 0;if(t>=i.fXmax)return n;if(i.fKstep)e=Math.round((t-i.fXmin)/i.fDelta),ti.fPoly[e+1].fX&&++e;else for(;n-e>1;){let a=Math.round((e+n)/2);t>i.fPoly[a].fX?e=a:n=a}return e}createDummyHisto(){let t=0,i=1,e=0,n=1,a=this.getObject();a?.fPoly&&(t=i=a.fPoly[0].fX,e=n=a.fPoly[0].fY,a.fPoly.forEach(l=>{t=Math.min(l.fX,t),i=Math.max(l.fX,i),e=Math.min(l.fY,e),n=Math.max(l.fY,n)}),n>0&&(n*=1+p.gStyle.fHistTopMargin),e<0&&(e*=1+p.gStyle.fHistTopMargin));let s=(0,p.create)("TH1I");return s.fName=a.fName+"_hist",s.fTitle=a.fTitle,s.fXaxis.fXmin=t,s.fXaxis.fXmax=i,s.fYaxis.fXmin=e,s.fYaxis.fXmax=n,s}processTooltipEvent(t){let s,l,i=!1,e=this.getObject(),a=this.getFramePainter()?.getGrFuncs(this.options.second_x,this.options.second_y),r=null,o=0;if(null!==t&&e&&a?(s=a.revertAxis("x",t.x),o=this.findX(s),r=e.fPoly[o],l=this.eval(r,s),oe.fXmax)&&(i=!0))):i=!0,i)return this.draw_g&&this.draw_g.select(".tooltip_bin").remove(),null;let h=this.draw_g.select(".tooltip_bin"),c=this.lineatt.width+3;h.empty()&&(h=this.draw_g.append("svg:circle").attr("class","tooltip_bin").style("pointer-events","none").attr("r",c).style("fill","none").call(this.lineatt.func));let f={name:this.getObject().fName,title:this.getObject().fTitle,x:a.grx(s),y:a.gry(l),color1:this.lineatt.color,lines:[],exact:null!==r||Math.abs(a.gry(l)-t.y)-this.knot_size&&o-this.knot_size&&h(n.addToPadPrimitives(),n.redraw(),n))})()}}}}]); +//# sourceMappingURL=484.5a180dbb47d3c56e.js.map \ No newline at end of file diff --git a/docs/727.68369a4ece2d6e5d.js.map b/docs/484.5a180dbb47d3c56e.js.map similarity index 99% rename from docs/727.68369a4ece2d6e5d.js.map rename to docs/484.5a180dbb47d3c56e.js.map index 7440977d8..079668211 100644 --- a/docs/727.68369a4ece2d6e5d.js.map +++ b/docs/484.5a180dbb47d3c56e.js.map @@ -1 +1 @@ -{"version":3,"file":"727.68369a4ece2d6e5d.js","mappings":"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","names":["TSplinePainter","ObjectPainter","updateObject","obj","opt","spline","this","getObject","_typename","Object","assign","undefined","decodeOptions","eval","knot","x","dx","fX","fY","fB","fC","fD","fE","fF","findX","klow","khig","fNp","fXmin","fXmax","fKstep","Math","round","fDelta","fPoly","max","khalf","createDummyHisto","xmin","xmax","ymin","ymax","forEach","min","gStyle","histo","create","fName","fTitle","fXaxis","fYaxis","processTooltipEvent","pnt","xx","yy","cleanup","funcs","getFramePainter","getGrFuncs","options","second_x","second_y","indx","revertAxis","fN","abs","grx","knot_size","draw_g","select","remove","gbin","radius","lineatt","width","empty","append","attr","style","call","func","res","name","title","y","gry","color1","color","lines","exact","changed","property","menu","menu_dist","sqrt","getObjectHint","push","axisAsText","floatToString","redraw","pmain","w","getFrameWidth","h","getFrameHeight","createG","createAttLine","Line","Curve","npx","fNpx","scale_xmin","scale_xmax","bins","logx","log","n","exp","h0","hmin","path","buildSvgPath","Mark","createAttMarker","markeratt","resetPos","getFullSize","length","canZoomInside","axis","d","DrawOptions","has_main","getMainPainter","Same","check","Hopt","storeDrawOpt","static","dom","painter","promise","Promise","resolve","no_main","console","warn","TH1Painter","then","addToPadPrimitives"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/draw/TSplinePainter.mjs"],"sourcesContent":["import { gStyle, create } from '../core.mjs';\nimport { DrawOptions, floatToString, buildSvgPath } from '../base/BasePainter.mjs';\nimport { ObjectPainter } from '../base/ObjectPainter.mjs';\nimport { TH1Painter } from '../hist/TH1Painter.mjs';\n\n\n/**\n * @summary Painter for TSpline objects.\n *\n * @private\n */\n\nclass TSplinePainter extends ObjectPainter {\n\n /** @summary Update TSpline object\n * @private */\n updateObject(obj, opt) {\n let spline = this.getObject();\n\n if (spline._typename != obj._typename) return false;\n\n if (spline !== obj) Object.assign(spline, obj);\n\n if (opt !== undefined) this.decodeOptions(opt);\n\n return true;\n }\n\n /** @summary Evaluate spline at given position\n * @private */\n eval(knot, x) {\n let dx = x - knot.fX;\n\n if (knot._typename == 'TSplinePoly3')\n return knot.fY + dx*(knot.fB + dx*(knot.fC + dx*knot.fD));\n\n if (knot._typename == 'TSplinePoly5')\n return knot.fY + dx*(knot.fB + dx*(knot.fC + dx*(knot.fD + dx*(knot.fE + dx*knot.fF))));\n\n return knot.fY + dx;\n }\n\n /** @summary Find idex for x value\n * @private */\n findX(x) {\n let spline = this.getObject(),\n klow = 0, khig = spline.fNp - 1;\n\n if (x <= spline.fXmin) return 0;\n if (x >= spline.fXmax) return khig;\n\n if(spline.fKstep) {\n // Equidistant knots, use histogramming\n klow = Math.round((x - spline.fXmin)/spline.fDelta);\n // Correction for rounding errors\n if (x < spline.fPoly[klow].fX) {\n klow = Math.max(klow-1,0);\n } else if (klow < khig) {\n if (x > spline.fPoly[klow+1].fX) ++klow;\n }\n } else {\n // Non equidistant knots, binary search\n while(khig - klow > 1) {\n let khalf = Math.round((klow + khig)/2);\n if(x > spline.fPoly[khalf].fX) klow = khalf;\n else khig = khalf;\n }\n }\n return klow;\n }\n\n /** @summary Create histogram for axes drawing\n * @private */\n createDummyHisto() {\n\n let xmin = 0, xmax = 1, ymin = 0, ymax = 1,\n spline = this.getObject();\n\n if (spline?.fPoly) {\n\n xmin = xmax = spline.fPoly[0].fX;\n ymin = ymax = spline.fPoly[0].fY;\n\n spline.fPoly.forEach(knot => {\n xmin = Math.min(knot.fX, xmin);\n xmax = Math.max(knot.fX, xmax);\n ymin = Math.min(knot.fY, ymin);\n ymax = Math.max(knot.fY, ymax);\n });\n\n if (ymax > 0.0) ymax *= (1 + gStyle.fHistTopMargin);\n if (ymin < 0.0) ymin *= (1 + gStyle.fHistTopMargin);\n }\n\n let histo = create('TH1I');\n\n histo.fName = spline.fName + '_hist';\n histo.fTitle = spline.fTitle;\n\n histo.fXaxis.fXmin = xmin;\n histo.fXaxis.fXmax = xmax;\n histo.fYaxis.fXmin = ymin;\n histo.fYaxis.fXmax = ymax;\n\n return histo;\n }\n\n /** @summary Process tooltip event\n * @private */\n processTooltipEvent(pnt) {\n\n let cleanup = false,\n spline = this.getObject(),\n main = this.getFramePainter(),\n funcs = main?.getGrFuncs(this.options.second_x, this.options.second_y),\n xx, yy, knot = null, indx = 0;\n\n if ((pnt === null) || !spline || !funcs) {\n cleanup = true;\n } else {\n xx = funcs.revertAxis('x', pnt.x);\n indx = this.findX(xx);\n knot = spline.fPoly[indx];\n yy = this.eval(knot, xx);\n\n if ((indx < spline.fN-1) && (Math.abs(spline.fPoly[indx+1].fX-xx) < Math.abs(xx-knot.fX))) knot = spline.fPoly[++indx];\n\n if (Math.abs(funcs.grx(knot.fX) - pnt.x) < 0.5*this.knot_size) {\n xx = knot.fX; yy = knot.fY;\n } else {\n knot = null;\n if ((xx < spline.fXmin) || (xx > spline.fXmax)) cleanup = true;\n }\n }\n\n if (cleanup) {\n if (this.draw_g)\n this.draw_g.select('.tooltip_bin').remove();\n return null;\n }\n\n let gbin = this.draw_g.select('.tooltip_bin'),\n radius = this.lineatt.width + 3;\n\n if (gbin.empty())\n gbin = this.draw_g.append('svg:circle')\n .attr('class', 'tooltip_bin')\n .style('pointer-events','none')\n .attr('r', radius)\n .style('fill', 'none')\n .call(this.lineatt.func);\n\n let res = { name: this.getObject().fName,\n title: this.getObject().fTitle,\n x: funcs.grx(xx),\n y: funcs.gry(yy),\n color1: this.lineatt.color,\n lines: [],\n exact: (knot !== null) || (Math.abs(funcs.gry(yy) - pnt.y) < radius) };\n\n res.changed = gbin.property('current_xx') !== xx;\n res.menu = res.exact;\n res.menu_dist = Math.sqrt((res.x-pnt.x)**2 + (res.y-pnt.y)**2);\n\n if (res.changed)\n gbin.attr('cx', Math.round(res.x))\n .attr('cy', Math.round(res.y))\n .property('current_xx', xx);\n\n let name = this.getObjectHint();\n if (name) res.lines.push(name);\n res.lines.push('x = ' + funcs.axisAsText('x', xx));\n res.lines.push('y = ' + funcs.axisAsText('y', yy));\n if (knot !== null) {\n res.lines.push('knot = ' + indx);\n res.lines.push('B = ' + floatToString(knot.fB, gStyle.fStatFormat));\n res.lines.push('C = ' + floatToString(knot.fC, gStyle.fStatFormat));\n res.lines.push('D = ' + floatToString(knot.fD, gStyle.fStatFormat));\n if ((knot.fE !== undefined) && (knot.fF !== undefined)) {\n res.lines.push('E = ' + floatToString(knot.fE, gStyle.fStatFormat));\n res.lines.push('F = ' + floatToString(knot.fF, gStyle.fStatFormat));\n }\n }\n\n return res;\n }\n\n /** @summary Redraw object\n * @private */\n redraw() {\n\n let spline = this.getObject(),\n pmain = this.getFramePainter(),\n funcs = pmain?.getGrFuncs(this.options.second_x, this.options.second_y),\n w = pmain.getFrameWidth(),\n h = pmain.getFrameHeight();\n\n this.createG(true);\n\n this.knot_size = 5; // used in tooltip handling\n\n this.createAttLine({ attr: spline });\n\n if (this.options.Line || this.options.Curve) {\n\n let npx = Math.max(10, spline.fNpx),\n xmin = Math.max(pmain.scale_xmin, spline.fXmin),\n xmax = Math.min(pmain.scale_xmax, spline.fXmax),\n indx = this.findX(xmin),\n bins = []; // index of current knot\n\n if (pmain.logx) {\n xmin = Math.log(xmin);\n xmax = Math.log(xmax);\n }\n\n for (let n = 0; n < npx; ++n) {\n let x = xmin + (xmax-xmin)/npx*(n-1);\n if (pmain.logx) x = Math.exp(x);\n\n while ((indx < spline.fNp-1) && (x > spline.fPoly[indx+1].fX)) ++indx;\n\n let y = this.eval(spline.fPoly[indx], x);\n\n bins.push({ x, y, grx: funcs.grx(x), gry: funcs.gry(y) });\n }\n\n let h0 = h; // use maximal frame height for filling\n if ((pmain.hmin !== undefined) && (pmain.hmin >= 0)) {\n h0 = Math.round(funcs.gry(0));\n if ((h0 > h) || (h0 < 0)) h0 = h;\n }\n\n let path = buildSvgPath('bezier', bins, h0, 2);\n\n this.draw_g.append('svg:path')\n .attr('class', 'line')\n .attr('d', path.path)\n .style('fill', 'none')\n .call(this.lineatt.func);\n }\n\n if (this.options.Mark) {\n\n // for tooltips use markers only if nodes where not created\n let path = '';\n\n this.createAttMarker({ attr: spline });\n\n this.markeratt.resetPos();\n\n this.knot_size = this.markeratt.getFullSize();\n\n for (let n = 0; n < spline.fPoly.length; n++) {\n let knot = spline.fPoly[n],\n grx = funcs.grx(knot.fX);\n if ((grx > -this.knot_size) && (grx < w + this.knot_size)) {\n let gry = funcs.gry(knot.fY);\n if ((gry > -this.knot_size) && (gry < h + this.knot_size)) {\n path += this.markeratt.create(grx, gry);\n }\n }\n }\n\n if (path)\n this.draw_g.append('svg:path')\n .attr('d', path)\n .call(this.markeratt.func);\n }\n }\n\n /** @summary Checks if it makes sense to zoom inside specified axis range */\n canZoomInside(axis/*,min,max*/) {\n if (axis !== 'x') return false;\n\n let spline = this.getObject();\n if (!spline) return false;\n\n // if function calculated, one always could zoom inside\n return true;\n }\n\n /** @summary Decode options for TSpline drawing */\n decodeOptions(opt) {\n let d = new DrawOptions(opt);\n\n if (!this.options) this.options = {};\n\n let has_main = !!this.getMainPainter();\n\n Object.assign(this.options, {\n Same: d.check('SAME'),\n Line: d.check('L'),\n Curve: d.check('C'),\n Mark: d.check('P'),\n Hopt: 'AXIS',\n second_x: false,\n second_y: false\n });\n\n if (!this.options.Line && !this.options.Curve && !this.options.Mark)\n this.options.Curve = true;\n\n if (d.check('X+')) { this.options.Hopt += 'X+'; this.options.second_x = has_main; }\n if (d.check('Y+')) { this.options.Hopt += 'Y+'; this.options.second_y = has_main; }\n\n this.storeDrawOpt(opt);\n }\n\n /** @summary Draw TSpline */\n static async draw(dom, spline, opt) {\n let painter = new TSplinePainter(dom, spline);\n painter.decodeOptions(opt);\n\n let promise = Promise.resolve(), no_main = !painter.getMainPainter();\n if (no_main || painter.options.second_x || painter.options.second_y) {\n if (painter.options.Same && no_main) {\n console.warn('TSpline painter requires histogram to be drawn');\n return null;\n }\n let histo = painter.createDummyHisto();\n promise = TH1Painter.draw(dom, histo, painter.options.Hopt);\n }\n\n return promise.then(() => {\n painter.addToPadPrimitives();\n painter.redraw();\n return painter;\n });\n }\n\n} // class TSplinePainter\n\nexport { TSplinePainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file +{"version":3,"file":"484.5a180dbb47d3c56e.js","mappings":"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","names":["TSplinePainter","ObjectPainter","updateObject","obj","opt","spline","this","getObject","_typename","Object","assign","undefined","decodeOptions","eval","knot","x","dx","fX","fY","fB","fC","fD","fE","fF","findX","klow","khig","fNp","fXmin","fXmax","fKstep","Math","round","fDelta","fPoly","max","khalf","createDummyHisto","xmin","xmax","ymin","ymax","forEach","min","gStyle","histo","create","fName","fTitle","fXaxis","fYaxis","processTooltipEvent","pnt","xx","yy","cleanup","funcs","getFramePainter","getGrFuncs","options","second_x","second_y","indx","revertAxis","fN","abs","grx","knot_size","draw_g","select","remove","gbin","radius","lineatt","width","empty","append","attr","style","call","func","res","name","title","y","gry","color1","color","lines","exact","changed","property","menu","menu_dist","sqrt","getObjectHint","push","axisAsText","floatToString","redraw","pmain","w","getFrameWidth","h","getFrameHeight","createG","createAttLine","Line","Curve","npx","fNpx","scale_xmin","scale_xmax","bins","logx","log","n","exp","h0","hmin","path","buildSvgPath","Mark","createAttMarker","markeratt","resetPos","getFullSize","length","canZoomInside","axis","d","DrawOptions","has_main","getMainPainter","Same","check","Hopt","storeDrawOpt","static","dom","painter","promise","Promise","resolve","no_main","console","warn","TH1Painter","then","addToPadPrimitives"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/draw/TSplinePainter.mjs"],"sourcesContent":["import { gStyle, create } from '../core.mjs';\nimport { DrawOptions, floatToString, buildSvgPath } from '../base/BasePainter.mjs';\nimport { ObjectPainter } from '../base/ObjectPainter.mjs';\nimport { TH1Painter } from '../hist/TH1Painter.mjs';\n\n\n/**\n * @summary Painter for TSpline objects.\n *\n * @private\n */\n\nclass TSplinePainter extends ObjectPainter {\n\n /** @summary Update TSpline object\n * @private */\n updateObject(obj, opt) {\n let spline = this.getObject();\n\n if (spline._typename != obj._typename) return false;\n\n if (spline !== obj) Object.assign(spline, obj);\n\n if (opt !== undefined) this.decodeOptions(opt);\n\n return true;\n }\n\n /** @summary Evaluate spline at given position\n * @private */\n eval(knot, x) {\n let dx = x - knot.fX;\n\n if (knot._typename == 'TSplinePoly3')\n return knot.fY + dx*(knot.fB + dx*(knot.fC + dx*knot.fD));\n\n if (knot._typename == 'TSplinePoly5')\n return knot.fY + dx*(knot.fB + dx*(knot.fC + dx*(knot.fD + dx*(knot.fE + dx*knot.fF))));\n\n return knot.fY + dx;\n }\n\n /** @summary Find idex for x value\n * @private */\n findX(x) {\n let spline = this.getObject(),\n klow = 0, khig = spline.fNp - 1;\n\n if (x <= spline.fXmin) return 0;\n if (x >= spline.fXmax) return khig;\n\n if(spline.fKstep) {\n // Equidistant knots, use histogramming\n klow = Math.round((x - spline.fXmin)/spline.fDelta);\n // Correction for rounding errors\n if (x < spline.fPoly[klow].fX) {\n klow = Math.max(klow-1,0);\n } else if (klow < khig) {\n if (x > spline.fPoly[klow+1].fX) ++klow;\n }\n } else {\n // Non equidistant knots, binary search\n while(khig - klow > 1) {\n let khalf = Math.round((klow + khig)/2);\n if(x > spline.fPoly[khalf].fX) klow = khalf;\n else khig = khalf;\n }\n }\n return klow;\n }\n\n /** @summary Create histogram for axes drawing\n * @private */\n createDummyHisto() {\n\n let xmin = 0, xmax = 1, ymin = 0, ymax = 1,\n spline = this.getObject();\n\n if (spline?.fPoly) {\n\n xmin = xmax = spline.fPoly[0].fX;\n ymin = ymax = spline.fPoly[0].fY;\n\n spline.fPoly.forEach(knot => {\n xmin = Math.min(knot.fX, xmin);\n xmax = Math.max(knot.fX, xmax);\n ymin = Math.min(knot.fY, ymin);\n ymax = Math.max(knot.fY, ymax);\n });\n\n if (ymax > 0.0) ymax *= (1 + gStyle.fHistTopMargin);\n if (ymin < 0.0) ymin *= (1 + gStyle.fHistTopMargin);\n }\n\n let histo = create('TH1I');\n\n histo.fName = spline.fName + '_hist';\n histo.fTitle = spline.fTitle;\n\n histo.fXaxis.fXmin = xmin;\n histo.fXaxis.fXmax = xmax;\n histo.fYaxis.fXmin = ymin;\n histo.fYaxis.fXmax = ymax;\n\n return histo;\n }\n\n /** @summary Process tooltip event\n * @private */\n processTooltipEvent(pnt) {\n\n let cleanup = false,\n spline = this.getObject(),\n main = this.getFramePainter(),\n funcs = main?.getGrFuncs(this.options.second_x, this.options.second_y),\n xx, yy, knot = null, indx = 0;\n\n if ((pnt === null) || !spline || !funcs) {\n cleanup = true;\n } else {\n xx = funcs.revertAxis('x', pnt.x);\n indx = this.findX(xx);\n knot = spline.fPoly[indx];\n yy = this.eval(knot, xx);\n\n if ((indx < spline.fN-1) && (Math.abs(spline.fPoly[indx+1].fX-xx) < Math.abs(xx-knot.fX))) knot = spline.fPoly[++indx];\n\n if (Math.abs(funcs.grx(knot.fX) - pnt.x) < 0.5*this.knot_size) {\n xx = knot.fX; yy = knot.fY;\n } else {\n knot = null;\n if ((xx < spline.fXmin) || (xx > spline.fXmax)) cleanup = true;\n }\n }\n\n if (cleanup) {\n if (this.draw_g)\n this.draw_g.select('.tooltip_bin').remove();\n return null;\n }\n\n let gbin = this.draw_g.select('.tooltip_bin'),\n radius = this.lineatt.width + 3;\n\n if (gbin.empty())\n gbin = this.draw_g.append('svg:circle')\n .attr('class', 'tooltip_bin')\n .style('pointer-events','none')\n .attr('r', radius)\n .style('fill', 'none')\n .call(this.lineatt.func);\n\n let res = { name: this.getObject().fName,\n title: this.getObject().fTitle,\n x: funcs.grx(xx),\n y: funcs.gry(yy),\n color1: this.lineatt.color,\n lines: [],\n exact: (knot !== null) || (Math.abs(funcs.gry(yy) - pnt.y) < radius) };\n\n res.changed = gbin.property('current_xx') !== xx;\n res.menu = res.exact;\n res.menu_dist = Math.sqrt((res.x-pnt.x)**2 + (res.y-pnt.y)**2);\n\n if (res.changed)\n gbin.attr('cx', Math.round(res.x))\n .attr('cy', Math.round(res.y))\n .property('current_xx', xx);\n\n let name = this.getObjectHint();\n if (name) res.lines.push(name);\n res.lines.push('x = ' + funcs.axisAsText('x', xx));\n res.lines.push('y = ' + funcs.axisAsText('y', yy));\n if (knot !== null) {\n res.lines.push('knot = ' + indx);\n res.lines.push('B = ' + floatToString(knot.fB, gStyle.fStatFormat));\n res.lines.push('C = ' + floatToString(knot.fC, gStyle.fStatFormat));\n res.lines.push('D = ' + floatToString(knot.fD, gStyle.fStatFormat));\n if ((knot.fE !== undefined) && (knot.fF !== undefined)) {\n res.lines.push('E = ' + floatToString(knot.fE, gStyle.fStatFormat));\n res.lines.push('F = ' + floatToString(knot.fF, gStyle.fStatFormat));\n }\n }\n\n return res;\n }\n\n /** @summary Redraw object\n * @private */\n redraw() {\n\n let spline = this.getObject(),\n pmain = this.getFramePainter(),\n funcs = pmain?.getGrFuncs(this.options.second_x, this.options.second_y),\n w = pmain.getFrameWidth(),\n h = pmain.getFrameHeight();\n\n this.createG(true);\n\n this.knot_size = 5; // used in tooltip handling\n\n this.createAttLine({ attr: spline });\n\n if (this.options.Line || this.options.Curve) {\n\n let npx = Math.max(10, spline.fNpx),\n xmin = Math.max(pmain.scale_xmin, spline.fXmin),\n xmax = Math.min(pmain.scale_xmax, spline.fXmax),\n indx = this.findX(xmin),\n bins = []; // index of current knot\n\n if (pmain.logx) {\n xmin = Math.log(xmin);\n xmax = Math.log(xmax);\n }\n\n for (let n = 0; n < npx; ++n) {\n let x = xmin + (xmax-xmin)/npx*(n-1);\n if (pmain.logx) x = Math.exp(x);\n\n while ((indx < spline.fNp-1) && (x > spline.fPoly[indx+1].fX)) ++indx;\n\n let y = this.eval(spline.fPoly[indx], x);\n\n bins.push({ x, y, grx: funcs.grx(x), gry: funcs.gry(y) });\n }\n\n let h0 = h; // use maximal frame height for filling\n if ((pmain.hmin !== undefined) && (pmain.hmin >= 0)) {\n h0 = Math.round(funcs.gry(0));\n if ((h0 > h) || (h0 < 0)) h0 = h;\n }\n\n let path = buildSvgPath('bezier', bins, h0, 2);\n\n this.draw_g.append('svg:path')\n .attr('class', 'line')\n .attr('d', path.path)\n .style('fill', 'none')\n .call(this.lineatt.func);\n }\n\n if (this.options.Mark) {\n\n // for tooltips use markers only if nodes where not created\n let path = '';\n\n this.createAttMarker({ attr: spline });\n\n this.markeratt.resetPos();\n\n this.knot_size = this.markeratt.getFullSize();\n\n for (let n = 0; n < spline.fPoly.length; n++) {\n let knot = spline.fPoly[n],\n grx = funcs.grx(knot.fX);\n if ((grx > -this.knot_size) && (grx < w + this.knot_size)) {\n let gry = funcs.gry(knot.fY);\n if ((gry > -this.knot_size) && (gry < h + this.knot_size)) {\n path += this.markeratt.create(grx, gry);\n }\n }\n }\n\n if (path)\n this.draw_g.append('svg:path')\n .attr('d', path)\n .call(this.markeratt.func);\n }\n }\n\n /** @summary Checks if it makes sense to zoom inside specified axis range */\n canZoomInside(axis/*,min,max*/) {\n if (axis !== 'x') return false;\n\n let spline = this.getObject();\n if (!spline) return false;\n\n // if function calculated, one always could zoom inside\n return true;\n }\n\n /** @summary Decode options for TSpline drawing */\n decodeOptions(opt) {\n let d = new DrawOptions(opt);\n\n if (!this.options) this.options = {};\n\n let has_main = !!this.getMainPainter();\n\n Object.assign(this.options, {\n Same: d.check('SAME'),\n Line: d.check('L'),\n Curve: d.check('C'),\n Mark: d.check('P'),\n Hopt: 'AXIS',\n second_x: false,\n second_y: false\n });\n\n if (!this.options.Line && !this.options.Curve && !this.options.Mark)\n this.options.Curve = true;\n\n if (d.check('X+')) { this.options.Hopt += 'X+'; this.options.second_x = has_main; }\n if (d.check('Y+')) { this.options.Hopt += 'Y+'; this.options.second_y = has_main; }\n\n this.storeDrawOpt(opt);\n }\n\n /** @summary Draw TSpline */\n static async draw(dom, spline, opt) {\n let painter = new TSplinePainter(dom, spline);\n painter.decodeOptions(opt);\n\n let promise = Promise.resolve(), no_main = !painter.getMainPainter();\n if (no_main || painter.options.second_x || painter.options.second_y) {\n if (painter.options.Same && no_main) {\n console.warn('TSpline painter requires histogram to be drawn');\n return null;\n }\n let histo = painter.createDummyHisto();\n promise = TH1Painter.draw(dom, histo, painter.options.Hopt);\n }\n\n return promise.then(() => {\n painter.addToPadPrimitives();\n painter.redraw();\n return painter;\n });\n }\n\n} // class TSplinePainter\n\nexport { TSplinePainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file diff --git a/docs/56.0b66108b488f8216.js b/docs/56.0b66108b488f8216.js new file mode 100644 index 000000000..26d0a65fe --- /dev/null +++ b/docs/56.0b66108b488f8216.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[56],{3029:(et,J,T)=>{T.d(J,{p:()=>Z});var F=T(9542),f=T(4953),W=T(6458);class Z extends W.tK{constructor(m,b,h,c){super(m,b,h),this.csstype=c}v7EvalAttr(m,b){let h=this.getObject();if(!h)return b;this.cssprefix&&(m=this.cssprefix+m);const c=o=>{if(void 0===b)return o;let l=typeof b,d=typeof o;return l==d?o:"boolean"==l?"string"==d?""!=o&&"0"!=o&&"no"!=o&&"off"!=o:!!o:"number"==l&&"string"==d?parseFloat(o):o};if(h.fAttr&&h.fAttr.m){let o=h.fAttr.m[m];if(o)return c(o.v)}if(this.rstyle&&this.rstyle.fBlocks){let o=this.rstyle.fBlocks;for(let l=0;l=d.length)break;if("-"==d[v]||"+"==d[v]){if(p)return console.log("Fail to parse RPadLength "+c),h;p="-"==d[v]?-1:1,v++;continue}for(v>0&&(d=d.slice(v),v=0);v="0"&&d[v]<="9"||"."==d[v]);)v++;let w=parseFloat(d.slice(0,v));if(!Number.isFinite(w))return console.log("Fail to parse RPadLength "+c),Math.round(h*b);d=d.slice(v),v=0,p||(p=1),d&&"%"==d[0]?(d=d.slice(1),o+=p*w*.01):d.length>1&&"p"==d[0]&&"x"==d[1]?(d=d.slice(2),l+=p*w):o+=p*w,p=0}return Math.round(o*b+l)}v7EvalColor(m,b){let h=this.v7EvalAttr(m,"");if(!h||!(0,F.isStr)(h))return b;if("auto"==h){let c=this.getPadPainter();if(void 0!==c?._auto_color_cnt){let o=c.getHistPalette(),l=c._auto_color_cnt++,d=c._num_primitives-1;d<2&&(d=2),h=o?o.getColorOrdinal(l%d/d):"blue",this._auto_colors||(this._auto_colors={}),this._auto_colors[m]=h}else this._auto_colors&&this._auto_colors[m]?h=this._auto_colors[m]:(console.error(`Autocolor ${m} not defined yet - please check code`),h="")}else if("["==h[0]){let c=parseFloat(h.slice(1,h.length-1));if(h="black",Number.isFinite(c)){let l=this.getPadPainter()?.getHistPalette();l&&(h=l.getColorOrdinal(c))}}return h}v7EvalFont(m,b,h){b?"number"==typeof b&&(b={size:b}):b={};let c=this.getPadPainter(),o=c?._dfltRFont||{fFamily:"Arial",fStyle:"",fWeight:""},l=this.v7EvalAttr(m+"_size",b.size||12),d=this.v7EvalAttr(m+"_angle",0),p=this.v7EvalAttr(m+"_align",b.align||"none"),v=this.v7EvalColor(m+"_color",b.color||"none"),w=this.v7EvalAttr(m+"_font_family",o.fFamily||"Arial"),M=this.v7EvalAttr(m+"_font_style",o.fStyle||""),D=this.v7EvalAttr(m+"_font_weight",o.fWeight||"");(0,F.isStr)(l)&&(l=parseFloat(l)),(!Number.isFinite(l)||l<=0)&&(l=12),h||(h=c?.getPadHeight()||100);let z=new f.G(null,l,h,w,M,D);return d&&z.setAngle(360-d),"none"!==p&&z.setAlign(p),"none"!==v&&z.setColor(v),z}createv7AttFill(m){(!m||!(0,F.isStr)(m))&&(m="fill_");let b=this.v7EvalColor(m+"color",""),h=this.v7EvalAttr(m+"style",0);this.createAttFill({pattern:h,color:b,color_as_svg:!0})}createv7AttLine(m){(!m||!(0,F.isStr)(m))&&(m="line_");let b=this.v7EvalColor(m+"color","black"),h=this.v7EvalAttr(m+"width",1),c=this.v7EvalAttr(m+"style",1),o=this.v7EvalAttr(m+"pattern");this.createAttLine({color:b,width:h,style:c,pattern:o}),"border_"==m&&this.lineatt.setBorder(this.v7EvalAttr(m+"rx",0),this.v7EvalAttr(m+"ry",0))}createv7AttMarker(m){(!m||!(0,F.isStr)(m))&&(m="marker_");let b=this.v7EvalColor(m+"color","black"),h=this.v7EvalAttr(m+"size",.01),c=this.v7EvalAttr(m+"style",1),o=1;h<1&&(o=this.getPadPainter()?.getPadHeight()||100),this.createAttMarker({color:b,size:h,style:c,refsize:o})}v7AttrChange(m,b,h,c){if(!this.snapid)return!1;m._typename||(m._typename="ROOT::Experimental::RChangeAttrRequest",m.ids=[],m.names=[],m.values=[],m.update=!0),this.cssprefix&&(b=this.cssprefix+b),m.ids.push(this.snapid),m.names.push(b);let o=null;if(null==h&&(c||(c="none"),"none"!==c&&console.error(`Trying to set ${c} for none value`)),!c)switch(typeof h){case"number":c="double";break;case"boolean":c="boolean"}switch(o={_typename:"ROOT::Experimental::RAttrMap::"},c){case"none":o._typename+="NoValue_t";break;case"boolean":o._typename+="BoolValue_t",o.v=!!h;break;case"int":o._typename+="IntValue_t",o.v=parseInt(h);break;case"double":o._typename+="DoubleValue_t",o.v=parseFloat(h);break;default:o._typename+="StringValue_t",o.v=(0,F.isStr)(h)?h:JSON.stringify(h)}return m.values.push(o),!0}v7SendAttrChanges(m,b){let h=this.getCanvPainter();h&&m?._typename&&(void 0!==b&&(m.update=!!b),h.v7SubmitRequest("",m))}v7SubmitRequest(m,b,h){let c=this.getCanvPainter();return(0,F.isFunc)(c?.submitDrawableRequest)?this.snapid?c.submitDrawableRequest(m,b,this,h):(this._pending_request={kind:m,req:b,method:h},b):null}assignSnapId(m){if(this.snapid=m,this.snapid&&this._pending_request){let b=this._pending_request;this.v7SubmitRequest(b.kind,b.req,b.method),delete this._pending_request}}v7CommMode(){let m=this.getCanvPainter();return m&&m.submitDrawableRequest&&m._websocket?1:3}v7NormalMode(){return 1==this.v7CommMode()}v7OfflineMode(){return 3==this.v7CommMode()}}},9850:(et,J,T)=>{T.d(J,{C:()=>m});var F=T(4788),f=T(9542),W=T(2253),B=T(6030),K=T(4383),Z=T(6116),V=T(3029);class m extends V.p{constructor(h,c,o,l){super(h,l?c.getObject():c,"",l?c.csstype:"axis"),Object.assign(this,B.KB),this.initAxisPainter(),this.axis=o,l?(this.embedded=!0,this.cssprefix=l,this.rstyle=c.rstyle):this.cssprefix="axis_"}cleanup(){delete this.axis,delete this.axis_g,this.cleanupAxisPainter(),super.cleanup()}getAxisType(){return"RAttrAxis"}configureZAxis(h,c){this.name=h,this.kind="normal",this.log=!1;let o=this.v7EvalAttr("log",0);o&&(this.log=!0,this.logbase=10,Math.abs(o-Math.exp(1))<.1?this.logbase=Math.exp(1):o>1.9&&(this.logbase=Math.round(o))),c.logz=this.log}configureAxis(h,c,o,l,d,p,v,w,M){M||(M={}),this.name=h,this.full_min=c,this.full_max=o,this.kind="normal",this.vertical=p,this.log=!1;let D=this.v7EvalAttr("log",0),z=this.v7EvalAttr("symlog",0);if(this.reverse=M.reverse||!1,this.v7EvalAttr("time")){this.kind="time",this.timeoffset=0;let P=this.v7EvalAttr("timeOffset");void 0!==P&&(P=parseFloat(P),Number.isFinite(P)&&(this.timeoffset=1e3*P))}else this.axis&&this.axis.fLabelsIndex?(this.kind="labels",delete this.own_labels):this.kind=M.labels?"labels":"normal";"time"==this.kind?this.func=(0,W.Xf)().domain([this.convertDate(l),this.convertDate(d)]):z&&z>0?(this.symlog=z,this.func=(0,W.eh)().constant(z).domain([l,d])):D?(d<=0&&(d=1),(l<=0||l>=d)&&(l=1e-4*d),this.log=!0,this.logbase=10,Math.abs(D-Math.exp(1))<.1?this.logbase=Math.exp(1):D>1.9&&(this.logbase=Math.round(D)),this.func=(0,W.p2)().base(this.logbase).domain([l,d])):this.func=(0,W.BY)().domain([l,d]),this.scale_min=l,this.scale_max=d,this.gr_range=w||1e3;let A=v||[0,this.gr_range];this.axis_shift=A[1]-this.gr_range,this.func.range(this.reverse?[A[1],A[0]]:A),this.gr="time"==this.kind?P=>this.func(this.convertDate(P)):this.log?P=>P20&&(this.nticks=20);let j=Math.abs(this.gr_range)||100;if("time"==this.kind){this.nticks>8&&(this.nticks=8);let P=this.scale_max-this.scale_min,I=this.v7EvalAttr("timeFormat",""),Y=(0,B.ai)(P/j,!1);(!I||P<.1*(this.full_max-this.full_min))&&(I=(0,B.ai)(P/this.nticks,!0)),this.tfunc1=this.tfunc2=(0,W.i$)(I),Y!==I&&(this.tfunc2=(0,W.i$)(Y)),this.format=this.formatTime}else if(this.log)this.nticks2>1&&(this.nticks*=this.nticks2,this.nticks2=1),this.noexp=this.v7EvalAttr("noexp",!1),this.scale_max<300&&this.scale_min>.3&&10==this.logbase&&(this.noexp=!0),this.moreloglabels=this.v7EvalAttr("moreloglbls",!1),this.format=this.formatLog;else if("labels"==this.kind){this.nticks=50;let P=this.scale_max-this.scale_min;this.nticks>P&&(this.nticks=Math.round(P)),this.nticks2=1,this.format=this.formatLabels}else this.order=0,this.ndig=0,this.format=this.formatNormal}getScaleMin(){return this.func?this.func.domain()[0]:0}getScaleMax(){return this.func?this.func.domain()[1]:0}formatLabels(h){let c=Math.round(h);if(this.axis&&this.axis.fLabelsIndex){if(c<0||c>=this.axis.fNBinsNoOver)return null;for(let o=0;o=0&&cthis.scale_min+v&&p.unshift(this.scale_min),p[p.length-1]1&&(!this.log||10===this.logbase)){d.minor=d.middle=this.produceTicks(d.major.length,this.nticks2);let p=Math.abs(this.func.range()[1]-this.func.range()[0]);d.middle.length<=d.major.length||d.middle.length>p/3.5?d.minor=d.middle=d.major:this.nticks3>1&&!this.log&&(d.minor=this.produceTicks(d.middle.length,this.nticks3),(d.minor.length<=d.middle.length||d.minor.length>p/1.7)&&(d.minor=d.middle))}if(d.reset=function(){this.nminor=this.nmiddle=this.nmajor=0},d.next=function(p){return!(this.nminor>=this.minor.length||(this.tick=this.minor[this.nminor++],this.grpos=this.func(this.tick),p&&(this.grpos=Math.round(this.grpos)),this.kind=3,this.nmiddle=this.major.length?null:this.func(this.major[this.nmajor])},this.order=0,this.ndig=0,"normal"==this.kind&&!this.log&&d.major.length>0){let p=0,v=0,w=!1;if(!c){let A=Math.max(Math.abs(d.major[0]),Math.abs(d.major[d.major.length-1])),O=Math.min(Math.abs(d.major[0]),Math.abs(d.major[d.major.length-1])),j=A>0?3*Math.round(Math.log10(A)/3):0,P=O>0?3*Math.round(Math.log10(O)/3):0;w=A<2e4,(A||O)&&(p=Math.max(j,P)+3,v=Math.min(j,P)-3)}let M=0,D=this.ndig,z=1e10;for(let A=v;A<=p;A+=3){if(w&&3===A)continue;this.order=A,this.ndig=0;let O=[],j=0,P=0;for(;j11)break;O=[],j=0,P=0}}!A&&this.ndig<4&&(P-=2*d.major.length+3),P{z.sourceEvent.preventDefault(),z.sourceEvent.stopPropagation();let A=h.node().getBBox(),O=this.vertical?A.height:A.width;p=l=h.property("shift_x"),v=d=h.property("shift_y"),M="center"==this.titlePos?1:"left"==this.titlePos?0:2,w=[0,this.gr_range/2,this.gr_range];let j=this.vertical?-O:O,P=this.isReverseAxis()?2:0;"middle"==this.title_align?(w[P]+=j/2,w[2-P]-=j/2):"begin"==this.title_align^this.isTitleRotated()?(w[1]-=j/2,w[2-P]-=j):(w[P]+=j,w[1]+=j/2),w[M]=this.vertical?d:l,o=h.append("rect").classed("zoom",!0).attr("x",A.x).attr("y",A.y).attr("width",A.width).attr("height",A.height).style("cursor","move")}).on("drag",z=>{if(!o)return;z.sourceEvent.preventDefault(),z.sourceEvent.stopPropagation(),l+=z.dx,d+=z.dy;let A,O,j=this.vertical?d:l,P=0;for(let I=1;I<3;++I)Math.abs(j-w[I]){if(!o)return;z.sourceEvent.preventDefault(),z.sourceEvent.stopPropagation();let A=h.property("basepos")||0;h.property("shift_x",p).property("shift_y",v),this.titleOffset=(this.vertical?A-p:v-A)*c,this.titlePos=1==M?"center":0==M?"left":"right",this.changeAxisAttr(0,"title_position",this.titlePos,"title_offset",this.titleOffset/this.scalingSize),o.remove(),o=null}),h.style("cursor","move").call(D)}isInsideGrRange(h,c,o){return c||(c=0),void 0===o&&(o=c),this.gr_range<0?h>=this.gr_range-o&&h<=c:h>=-c&&h<=this.gr_range+o}getGrRange(h){return h||(h=0),this.gr_range<0?this.gr_range-h:this.gr_range+h}isReverseAxis(){return!this.vertical!=this.getGrRange()>0}drawMainLine(h){let c="";if(this.endingSize&&this.endingStyle){let o=this.gr_range>0?-this.endingSize:this.endingSize,l=Math.round(.7*o);o=Math.round(o),c=this.vertical?`l${l},${o}M0,${this.gr_range}l${-l},${o}`:`l${o},${l}M${this.gr_range},0l${o},${-l}`}h.append("svg:path").attr("d","M0,0"+(this.vertical?"v":"h")+this.gr_range+c).call(this.lineatt.func).style("fill",c?"none":null)}drawTicks(h,c,o){o&&(this.ticks=[]),this.handle.reset();let l="",d=0;for("both"==this.ticksSide&&(c=1,d=1);this.handle.next(!0);){let w=Math.round(this.ticksSize/4),M=0;this.handle.kind<3&&(w=Math.round(this.ticksSize/2));let D=this.handle.grpos-this.axis_shift;(this.startingSize||this.endingSize)&&!this.isInsideGrRange(D,-Math.abs(this.startingSize),-Math.abs(this.endingSize))||(1==this.handle.kind&&(("labels"==this.kind||null!==this.format(this.handle.tick,!0))&&(w=this.ticksSize),o&&this.ticks.push(D)),d>0?M=-w:c<0?(M=-w,w=0):M=0,l+=this.vertical?`M${w},${D}H${M}`:`M${D},${-w}V${-M}`)}l&&h.append("svg:path").attr("d",l).style("stroke",this.ticksColor||this.lineatt.color).style("stroke-width",this.ticksWidth&&1!=this.ticksWidth?this.ticksWidth:null);let p=Math.round(.25*this.ticksSize),v=Math.round(1.25*this.ticksSize);return{"-1":c>0||d?v:p,1:c<0||d?v:p}}drawLabels(h,c,o){var l=this;return(0,F.Z)(function*(){let d=l.isCenteredLabels(),p=0!=l.labelsFont.angle,v=1,w=0,M=!1,D=h.append("svg:g").attr("class","axis_labels").property("side",c),z=l.handle.lbl_pos||l.handle.major,A=0,O=0;function j(N){A=Math.max(A,this.result_width),O=Math.max(O,this.result_height);let X=this.result_width;if(X&&(!N.vertical&&!p||N.vertical&&p)&&!N.log){let U=.45*this.gap_before+.45*this.gap_after;this.gap_before?this.gap_after||(U=.9*this.gap_before):U=.9*this.gap_after,v=Math.min(v,U/X)}v>1e-4&&v<.8&&!N.vertical&&!p&&w>5&&c>0&&(M=!0);let G=v*(M?3:1);G>1e-4&&G<1&&N.scaleTextDrawing(1/G,D)}let P=0,I=Math.round((l.vertical?-c:c)*l.labelsOffset),Y=Math.round((l.vertical?-c:c)*o[c]);I&&D.attr("transform",l.vertical?`translate(${I})`:`translate(0,${I})`),D.property("fix_offset",I),l.startTextDrawing(l.labelsFont,"font",D);for(let N=0;N0?Math.abs(Math.round(G-l.func(z[N-1]))):0,U.gap_after=N{if(M&&D.selectAll("text").each(function(){let N=(0,W.Ys)(this),X=N.attr("transform");N.attr("transform",X+" rotate(25)").style("text-anchor","start")}),l.vertical)o[c]+=Math.round(p?1.2*O:A+.4*l.labelsFont.size)-c*I;else{let N=M?A*Math.sin(.1388888888888889*Math.PI)+O*(Math.cos(.1388888888888889*Math.PI)+.2):0;o[c]+=Math.round(Math.max(p?A+.4*l.labelsFont.size:1.2*O,1.2*l.labelsFont.size,N))+I}return o})})()}addZoomingRect(h,c,o){if(f.settings.Zooming&&!this.disable_zooming&&!(0,f.isBatchMode)()){let l=Math.max(o[c],10),d=this.vertical?`v${this.gr_range}h${-c*l}v${-this.gr_range}`:`h${this.gr_range}v${c*l}h${-this.gr_range}`;h.append("svg:path").attr("d",`M0,0${d}z`).attr("class","axis_zoom").style("opacity","0").style("cursor","crosshair")}}isTitleRotated(){return this.titleFont&&this.titleFont.angle!=(this.vertical?270:0)}drawTitle(h,c,o){var l=this;return(0,F.Z)(function*(){if(!l.fTitle)return l;let d=h.append("svg:g").attr("class","axis_title"),p=0,v=0,w=0,M=l.isTitleRotated();return l.startTextDrawing(l.titleFont,"font",d),l.title_align=l.titleCenter?"middle":l.titleOpposite^(l.isReverseAxis()||M)?"begin":"end",l.vertical?(w=Math.round(-c*o[c]),p=w+Math.round(-c*l.titleOffset),v=Math.round(l.titleCenter?l.gr_range/2:l.titleOpposite?0:l.gr_range),l.drawText({align:[l.title_align,c<0^M?"top":"bottom"],text:l.fTitle,draw_g:d})):(p=Math.round(l.titleCenter?l.gr_range/2:l.titleOpposite?0:l.gr_range),w=Math.round(c*o[c]),v=w+Math.round(c*l.titleOffset),l.drawText({align:[l.title_align,c>0^M?"top":"bottom"],text:l.fTitle,draw_g:d})),d.attr("transform",`translate(${p},${v})`).property("basepos",w).property("shift_x",p).property("shift_y",v),l.addTitleDrag(d,c),l.finishTextDrawing(d)})()}extractDrawAttributes(h){let c=this.getPadPainter(),o=c?.getPadRect()||{width:10,height:10};this.scalingSize=h||(this.vertical?o.width:o.height),this.createv7AttLine("line_"),this.optionUnlab=this.v7EvalAttr("labels_hide",!1),this.endingStyle=this.v7EvalAttr("ending_style",""),this.endingSize=Math.round(this.v7EvalLength("ending_size",this.scalingSize,this.endingStyle?.02:0)),this.startingSize=Math.round(this.v7EvalLength("starting_size",this.scalingSize,0)),this.ticksSize=this.v7EvalLength("ticks_size",this.scalingSize,.02),this.ticksSide=this.v7EvalAttr("ticks_side","normal"),this.ticksColor=this.v7EvalColor("ticks_color",""),this.ticksWidth=this.v7EvalAttr("ticks_width",1),h&&this.ticksSize<0&&(this.ticksSize=-this.ticksSize),this.fTitle=this.v7EvalAttr("title_value",""),this.fTitle?(this.titleFont=this.v7EvalFont("title",{size:.03},h||c?.getPadHeight()||10),this.titleFont.roundAngle(180,this.vertical?270:0),this.titleOffset=this.v7EvalLength("title_offset",this.scalingSize,0),this.titlePos=this.v7EvalAttr("title_position","right"),this.titleCenter="center"==this.titlePos,this.titleOpposite="left"==this.titlePos):(delete this.titleFont,delete this.titleOffset,delete this.titlePos),this.labelsFont=this.v7EvalFont("labels",{size:h?.05:.03}),this.labelsFont.roundAngle(180),this.labelsFont.angle&&(this.labelsFont.angle=270),this.labelsOffset=this.v7EvalLength("labels_offset",this.scalingSize,0),h&&(this.ticksSize=.5*this.labelsFont.size),this.maxTickSize&&this.ticksSize>this.maxTickSize&&(this.ticksSize=this.maxTickSize)}drawAxis(h,c,o){var l=this;return(0,F.Z)(function*(){let d=h;void 0===o&&(o=1),l.standalone||(d=h.select("."+l.name+"_container"),d.empty()?d=h.append("svg:g").attr("class",l.name+"_container"):d.selectAll("*").remove()),d.attr("transform",c||null),l.extractDrawAttributes(),l.axis_g=d,l.side=o,"invert"==l.ticksSide&&(o=-o),l.standalone&&l.drawMainLine(d),l.handle=l.createTicks(!1,!1,!1,!1);let M=l.drawTicks(d,o,!0);return(l.optionUnlab?Promise.resolve(M):l.drawLabels(d,o,M)).then(z=>(l.addZoomingRect(d,l.standalone?o:l.side,z),l.drawTitle(d,o,z)))})()}setAfterDrawHandler(h){this._afterDrawAgain=h}drawAxisAgain(){if(!this.axis_g||!this.side)return;this.axis_g.selectAll("*").remove(),this.extractDrawAttributes();let h=this.side;"invert"==this.ticksSide&&(h=-h),this.standalone&&this.drawMainLine(this.axis_g);let c=this.drawTicks(this.axis_g,h,!1);return(this.optionUnlab?Promise.resolve(c):this.drawLabels(this.axis_g,h,c)).then(l=>(this.addZoomingRect(this.axis_g,this.standalone?h:this.side,l),this.drawTitle(this.axis_g,h,l))).then(()=>{(0,f.isFunc)(this._afterDrawAgain)&&this._afterDrawAgain()})}drawAxisOtherPlace(h,c,o,l){let d=h.select("."+this.name+"_container2");d.empty()?d=h.append("svg:g").attr("class",this.name+"_container2"):d.selectAll("*").remove(),d.attr("transform",c||null),"invert"==this.ticksSide&&(o=-o);let p=this.drawTicks(d,o,!1);return(this.optionUnlab||l?Promise.resolve(p):this.drawLabels(d,o,p)).then(w=>(this.addZoomingRect(d,o,w),!0))}zoomStandalone(h,c){this.changeAxisAttr(1,"zoomMin",h,"zoomMax",c)}redraw(){let h=this.getObject(),c=this.getPadPainter(),o=c.getCoordinate(h.fPos),l=c.getPadLength(h.fVertical,h.fLength),d=this.v7EvalAttr("reverse",!1),p=h.fLabels.length,v=p>0?0:this.v7EvalAttr("min",0),w=p>0?p:this.v7EvalAttr("max",100);h.fVertical&&(l-=c.getPadHeight());let M=this.v7EvalAttr("zoomMin"),D=this.v7EvalAttr("zoomMax");M===D&&(M=v,D=w),this.configureAxis("axis",v,w,M,D,h.fVertical,void 0,l,{reverse:d,labels:p>0}),this.createG(),this.standalone=!0;let z=this.drawAxis(this.draw_g,`translate(${o.x},${o.y})`);return(0,f.isBatchMode)()?z:z.then(()=>{f.settings.ContextMenu&&this.draw_g.on("contextmenu",A=>{A.stopPropagation(),A.preventDefault(),(0,K.Z)(A,this).then(O=>{O.add("header:RAxisDrawable"),O.add("Unzoom",()=>this.zoomStandalone()),this.fillAxisContextMenu(O,""),O.show()})}),(0,Z.uI)(this,{x:o.x,y:o.y,width:this.vertical?10:l,height:this.vertical?l:10,only_move:!0,redraw:A=>this.positionChanged(A)}),this.draw_g.on("dblclick",()=>this.zoomStandalone()),f.settings.ZoomWheel&&this.draw_g.on("wheel",A=>{A.stopPropagation(),A.preventDefault();let O=(0,W.cx)(A,this.draw_g.node()),P=this.analyzeWheelEvent(A,this.vertical?1-O[1]/l:O[0]/l);P.changed&&this.zoomStandalone(P.min,P.max)})})}positionChanged(h){let c=this.getObject(),o=this.getPadPainter().getPadRect(),l=h.x/o.width,d=1-h.y/o.height;c.fPos.fHoriz.fArr=[l],c.fPos.fVert.fArr=[d],this.submitCanvExec(`SetPos({${l.toFixed(4)},${d.toFixed(4)}})`)}changeAxisAttr(h){let c={},o=1;for(;othis.getFramePainter().unzoom(c)),h.add("sub:Log scale",()=>this.changeAxisLog("toggle")),h.addchk(!this.log&&!this.symlog,"linear",0,o=>this.changeAxisLog(o)),h.addchk(this.log&&!this.symlog&&10==this.logbase,"log10",()=>this.changeAxisLog(10)),h.addchk(this.log&&!this.symlog&&2==this.logbase,"log2",()=>this.changeAxisLog(2)),h.addchk(this.log&&!this.symlog&&Math.abs(this.logbase-Math.exp(1))<.1,"ln",()=>this.changeAxisLog(Math.exp(1))),h.addchk(!this.log&&this.symlog,"symlog",0,()=>h.input("set symlog constant",this.symlog||10,"float").then(o=>this.changeAxisAttr(2,"symlog",o))),h.add("endsub:"),h.add("Divisions",()=>h.input("Set axis devisions",this.v7EvalAttr("ndiv",508),"int").then(o=>this.changeAxisAttr(2,"ndiv",o))),h.add("sub:Ticks"),h.addRColorMenu("color",this.ticksColor,o=>this.changeAxisAttr(1,"ticks_color",o)),h.addSizeMenu("size",0,.05,.01,this.ticksSize/this.scalingSize,o=>this.changeAxisAttr(1,"ticks_size",o)),h.addSelectMenu("side",["normal","invert","both"],this.ticksSide,o=>this.changeAxisAttr(1,"ticks_side",o)),h.add("endsub:"),!this.optionUnlab&&this.labelsFont&&(h.add("sub:Labels"),h.addSizeMenu("offset",-.05,.05,.01,this.labelsOffset/this.scalingSize,o=>this.changeAxisAttr(1,"labels_offset",o)),h.addRAttrTextItems(this.labelsFont,{noangle:1,noalign:1},o=>this.changeAxisAttr(1,"labels_"+o.name,o.value)),h.addchk(this.labelsFont.angle,"rotate",o=>this.changeAxisAttr(1,"labels_angle",o?180:0)),h.add("endsub:")),h.add("sub:Title",()=>h.input("Enter axis title",this.fTitle).then(o=>this.changeAxisAttr(1,"title_value",o))),this.fTitle&&(h.addSizeMenu("offset",-.05,.05,.01,this.titleOffset/this.scalingSize,o=>this.changeAxisAttr(1,"title_offset",o)),h.addSelectMenu("position",["left","center","right"],this.titlePos,o=>this.changeAxisAttr(1,"title_position",o)),h.addchk(this.isTitleRotated(),"rotate",o=>this.changeAxisAttr(1,"title_angle",o?180:0)),h.addRAttrTextItems(this.titleFont,{noangle:1,noalign:1},o=>this.changeAxisAttr(1,"title_"+o.name,o.value))),h.add("endsub:"),!0}}},9056:(et,J,T)=>{T.r(J),T.d(J,{RCanvasPainter:()=>j,RObjectPainter:()=>V.p,RPadPainter:()=>w,drawRAxis:()=>G,drawRFont:()=>X,drawRFrame:()=>U,drawRFrameTitle:()=>N,drawRPadSnapshot:()=>P,ensureRCanvas:()=>I});var F=T(4788),f=T(9542),W=T(2253),B=T(9622),K=T(2487),Z=T(6458),V=T(3029),m=T(9850),b=T(6367),h=T(6030),c=T(6116);class o extends V.p{constructor(t,e){super(t,e,"","frame"),this.mode3d=!1,this.xmin=this.xmax=0,this.ymin=this.ymax=0,this.axes_drawn=!1,this.keys_handler=null,this.projection=0,this.v7_frame=!0}getFramePainter(){return this}is_root6(){return!1}setFrameActive(t){this.enabledKeys=!(!t||!f.settings.HandleKeys),this.control&&(this.control.enableKeys=this.enabledKeys)}setLastEventPos(t){this.fLastEventPnt=t}getLastEventPos(){return this.fLastEventPnt}updateAttributes(t){if(void 0===this.fX1NDC||t&&!this.modified_NDC){let e=this.getPadPainter().getPadRect();this.fX1NDC=this.v7EvalLength("margins_left",e.width,f.settings.FrameNDC.fX1NDC)/e.width,this.fY1NDC=this.v7EvalLength("margins_bottom",e.height,f.settings.FrameNDC.fY1NDC)/e.height,this.fX2NDC=1-this.v7EvalLength("margins_right",e.width,1-f.settings.FrameNDC.fX2NDC)/e.width,this.fY2NDC=1-this.v7EvalLength("margins_top",e.height,1-f.settings.FrameNDC.fY2NDC)/e.height}this.fillatt||this.createv7AttFill(),this.createv7AttLine("border_")}getProjectionFunc(){switch(this.projection){case 1:return(t,e)=>{const i=Math.PI/180,s=t/2*i,r=e*i,a=Math.sqrt(2),n=2*a/Math.PI,u=Math.cos(r),g=Math.sqrt(1+u*Math.cos(s));return{x:u*Math.sin(s)*2*a/g/n/i,y:Math.sin(r)*a/g/n/i}};case 2:return(t,e)=>({x:t,y:Math.log(Math.tan((Math.PI/2+e/180*Math.PI)/2))});case 3:return(t,e)=>({x:t*Math.cos(e/180*Math.PI),y:e});case 4:return(t,e)=>({x:t*(2*Math.cos(2*e/180*Math.PI/3)-1),y:180*Math.sin(e/180*Math.PI/3)})}}recalculateRange(t){this.projection=t||0,2==this.projection&&(this.scale_ymin<=-90||this.scale_ymax>=90)&&(console.warn(`Mercator Projection: latitude out of range ${this.scale_ymin} ${this.scale_ymax}`),this.projection=0);let e=this.getProjectionFunc();if(!e)return;let i=[e(this.scale_xmin,this.scale_ymin),e(this.scale_xmin,this.scale_ymax),e(this.scale_xmax,this.scale_ymax),e(this.scale_xmax,this.scale_ymin)];this.scale_xmin<0&&this.scale_xmax>0&&(i.push(e(0,this.scale_ymin)),i.push(e(0,this.scale_ymax))),this.scale_ymin<0&&this.scale_ymax>0&&(i.push(e(this.scale_xmin,0)),i.push(e(this.scale_xmax,0))),this.original_xmin=this.scale_xmin,this.original_xmax=this.scale_xmax,this.original_ymin=this.scale_ymin,this.original_ymax=this.scale_ymax,this.scale_xmin=this.scale_xmax=i[0].x,this.scale_ymin=this.scale_ymax=i[0].y;for(let s=1;s0?this.getColor(f.gStyle.fGridColor):"black";if(this.x_handle&&(this.x_handle.draw_grid=s),this.x_handle&&this.x_handle.draw_grid){let u="";for(let g=0;g0?this.scale_ymax=Math.exp(1.1*Math.log(this.scale_ymax)):this.scale_ymax+=.1*(this.scale_ymax-this.scale_ymin)),this.zoom_ymin==this.zoom_ymax&&t.zoom_ymin!=t.zoom_ymax&&!this.zoomChangedInteractive("y")&&(this.zoom_ymin=t.zoom_ymin,this.zoom_ymax=t.zoom_ymax),this.zoom_xmin!=this.zoom_xmax&&(this.scale_xmin=this.zoom_xmin,this.scale_xmax=this.zoom_xmax),this.zoom_ymin!=this.zoom_ymax&&(this.scale_ymin=this.zoom_ymin,this.scale_ymax=this.zoom_ymax);let s=this.xaxis,r=this.yaxis;s?._typename!=f.clTAxis&&(s=(0,f.create)(f.clTAxis)),r?._typename!=f.clTAxis&&(r=(0,f.create)(f.clTAxis)),this.x_handle=new h.z4(this.getDom(),s,!0),this.x_handle.setPadName(this.getPadName()),this.x_handle.optionUnlab=this.v7EvalAttr("x_labels_hide",!1),this.x_handle.configureAxis("xaxis",this.xmin,this.xmax,this.scale_xmin,this.scale_xmax,this.swap_xy,this.swap_xy?[0,i]:[0,e],{reverse:this.reverse_x,log:this.swap_xy?this.logy:this.logx,symlog:this.swap_xy?t.symlog_y:t.symlog_x,logcheckmin:this.swap_xy,logminfactor:1e-4}),this.x_handle.assignFrameMembers(this,"x"),this.y_handle=new h.z4(this.getDom(),r,!0),this.y_handle.setPadName(this.getPadName()),this.y_handle.optionUnlab=this.v7EvalAttr("y_labels_hide",!1),this.y_handle.configureAxis("yaxis",this.ymin,this.ymax,this.scale_ymin,this.scale_ymax,!this.swap_xy,this.swap_xy?[0,e]:[0,i],{reverse:this.reverse_y,log:this.swap_xy?this.logx:this.logy,symlog:this.swap_xy?t.symlog_x:t.symlog_y,logcheckmin:t.ndim<2||this.swap_xy,log_min_nz:t.ymin_nz&&t.ymin_nz<.01*this.ymax?.3*t.ymin_nz:0,logminfactor:3e-4}),this.y_handle.assignFrameMembers(this,"y")}hasDrawnAxes(t,e){return!t&&!e&&this.axes_drawn}drawAxes(){var t=this;return(0,F.Z)(function*(){if(t.axes_drawn||t.xmin==t.xmax||t.ymin==t.ymax)return t.axes_drawn;let e=t.v7EvalAttr("ticksX",1),i=t.v7EvalAttr("ticksY",1),s=1,r=1;t.v7EvalAttr("swapX",!1)&&(s=-1),t.v7EvalAttr("swapY",!1)&&(r=-1);let a=t.getFrameWidth(),n=t.getFrameHeight();t.v6axes||(t.cleanupAxes(),t.swap_xy=!1,t.zoom_xmin!=t.zoom_xmax?(t.scale_xmin=t.zoom_xmin,t.scale_xmax=t.zoom_xmax):(t.scale_xmin=t.xmin,t.scale_xmax=t.xmax),t.zoom_ymin!=t.zoom_ymax?(t.scale_ymin=t.zoom_ymin,t.scale_ymax=t.zoom_ymax):(t.scale_ymin=t.ymin,t.scale_ymax=t.ymax),t.recalculateRange(0),t.x_handle=new m.C(t.getDom(),t,t.xaxis,"x_"),t.x_handle.setPadName(t.getPadName()),t.x_handle.snapid=t.snapid,t.x_handle.draw_swapside=s<0,t.x_handle.draw_ticks=e,t.y_handle=new m.C(t.getDom(),t,t.yaxis,"y_"),t.y_handle.setPadName(t.getPadName()),t.y_handle.snapid=t.snapid,t.y_handle.draw_swapside=r<0,t.y_handle.draw_ticks=i,t.z_handle=new m.C(t.getDom(),t,t.zaxis,"z_"),t.z_handle.setPadName(t.getPadName()),t.z_handle.snapid=t.snapid,t.x_handle.configureAxis("xaxis",t.xmin,t.xmax,t.scale_xmin,t.scale_xmax,!1,[0,a],a,{reverse:!1}),t.x_handle.assignFrameMembers(t,"x"),t.y_handle.configureAxis("yaxis",t.ymin,t.ymax,t.scale_ymin,t.scale_ymax,!0,[n,0],-n,{reverse:!1}),t.y_handle.assignFrameMembers(t,"y"),t.z_handle.configureZAxis("zaxis",t));let u=t.getFrameSvg().select(".axis_layer");t.x_handle.has_obstacle=!1;let k,g=t.swap_xy?t.y_handle:t.x_handle,x=t.swap_xy?t.x_handle:t.y_handle;if(t.getPadPainter()?._fast_drawing)k=Promise.resolve(!0);else if(t.v6axes){let S=!1,R=!1,E=!1;g.disable_ticks=e<=0,x.disable_ticks=i<=0;let C=g.drawAxis(u,a,n,g.invert_side?void 0:`translate(0,${n})`,e>1?-n:0,R,void 0,!1),q=x.drawAxis(u,a,n,x.invert_side?`translate(${a})`:void 0,i>1?a:0,E,x.invert_side?0:t._frame_x,S);k=Promise.all([C,q]).then(()=>t.drawGrids())}else{let S=[];e>0&&S.push(g.drawAxis(u,s>0?`translate(0,${n})`:"",s)),i>0&&S.push(x.drawAxis(u,r>0?`translate(0,${n})`:`translate(${a},${n})`,r)),k=Promise.all(S).then(()=>(S=[],e>1&&S.push(g.drawAxisOtherPlace(u,s<0?`translate(0,${n})`:"",-s,2==e)),i>1&&S.push(x.drawAxisOtherPlace(u,r<0?`translate(0,${n})`:`translate(${a},${n})`,-r,2==i)),Promise.all(S))).then(()=>t.drawGrids())}return k.then(()=>(t.axes_drawn=!0,!0))})()}drawAxes2(t,e){let a,n,i=this.getFrameWidth(),s=this.getFrameHeight(),r=this.getFrameSvg().select(".axis_layer");return t&&(this.zoom_x2min!=this.zoom_x2max?(this.scale_x2min=this.zoom_x2min,this.scale_x2max=this.zoom_x2max):(this.scale_x2min=this.x2min,this.scale_x2max=this.x2max),this.x2_handle=new m.C(this.getDom(),this,this.x2axis,"x2_"),this.x2_handle.setPadName(this.getPadName()),this.x2_handle.snapid=this.snapid,this.x2_handle.configureAxis("x2axis",this.x2min,this.x2max,this.scale_x2min,this.scale_x2max,!1,[0,i],i,{reverse:!1}),this.x2_handle.assignFrameMembers(this,"x2"),a=this.x2_handle.drawAxis(r,"",-1)),e&&(this.zoom_y2min!=this.zoom_y2max?(this.scale_y2min=this.zoom_y2min,this.scale_y2max=this.zoom_y2max):(this.scale_y2min=this.y2min,this.scale_y2max=this.y2max),this.y2_handle=new m.C(this.getDom(),this,this.y2axis,"y2_"),this.y2_handle.setPadName(this.getPadName()),this.y2_handle.snapid=this.snapid,this.y2_handle.configureAxis("y2axis",this.y2min,this.y2max,this.scale_y2min,this.scale_y2max,!0,[s,0],-s,{reverse:!1}),this.y2_handle.assignFrameMembers(this,"y2"),n=this.y2_handle.drawAxis(r,`translate(${i},${s})`,-1)),Promise.all([a,n])}getGrFuncs(t,e){let i=t&&this.grx2,s=e&&this.gry2;return i||s?{use_x2:i,grx:i?this.grx2:this.grx,x_handle:i?this.x2_handle:this.x_handle,logx:i?this.x2_handle.log:this.x_handle.log,scale_xmin:i?this.scale_x2min:this.scale_xmin,scale_xmax:i?this.scale_x2max:this.scale_xmax,use_y2:s,gry:s?this.gry2:this.gry,y_handle:s?this.y2_handle:this.y_handle,logy:s?this.y2_handle.log:this.y_handle.log,scale_ymin:s?this.scale_y2min:this.scale_ymin,scale_ymax:s?this.scale_y2max:this.scale_ymax,swap_xy:this.swap_xy,fp:this,revertAxis(r,a){return"x"==r&&this.use_x2&&(r="x2"),"y"==r&&this.use_y2&&(r="y2"),this.fp.revertAxis(r,a)},axisAsText(r,a){return"x"==r&&this.use_x2&&(r="x2"),"y"==r&&this.use_y2&&(r="y2"),this.fp.axisAsText(r,a)}}:this}sizeChanged(){let t={};this.v7AttrChange(t,"margins_left",this.fX1NDC),this.v7AttrChange(t,"margins_bottom",this.fY1NDC),this.v7AttrChange(t,"margins_right",1-this.fX2NDC),this.v7AttrChange(t,"margins_top",1-this.fY2NDC),this.v7SendAttrChanges(t,!1),this.redrawPad()}cleanXY(){let t=(e,i)=>{this[e]&&(this[e].cleanup(),delete this[e]),delete this[i]};t("x_handle","grx"),t("y_handle","gry"),t("z_handle","grz"),t("x2_handle","grx2"),t("y2_handle","gry2"),delete this.v6axes}cleanupAxes(){this.cleanXY(),this.draw_g&&(this.draw_g.select(".grid_layer").selectAll("*").remove(),this.draw_g.select(".axis_layer").selectAll("*").remove()),this.axes_drawn=!1}cleanFrameDrawings(){(0,f.isFunc)(this.create3DScene)&&this.create3DScene(-1),this.cleanupAxes();let t=e=>{this[e+"min"]=this[e+"max"]=0,this[`zoom_${e}min`]=this[`zoom_${e}max`]=0,this[`scale_${e}min`]=this[`scale_${e}max`]=0};t("x"),t("y"),t("z"),t("x2"),t("y2"),this.draw_g&&(this.draw_g.select(".main_layer").selectAll("*").remove(),this.draw_g.select(".upper_layer").selectAll("*").remove())}cleanup(){this.cleanFrameDrawings(),this.draw_g&&(this.draw_g.selectAll("*").remove(),this.draw_g.on("mousedown",null).on("dblclick",null).on("wheel",null).on("contextmenu",null).property("interactive_set",null)),this.keys_handler&&(window.removeEventListener("keydown",this.keys_handler,!1),this.keys_handler=null),delete this.enabledKeys,delete this.self_drawaxes,delete this.xaxis,delete this.yaxis,delete this.zaxis,delete this.x2axis,delete this.y2axis,delete this.draw_g,delete this._click_handler,delete this._dblclick_handler;let t=this.getPadPainter();t?.frame_painter_ref===this&&delete t.frame_painter_ref,super.cleanup()}redraw(){let t=this.getPadPainter();t&&(t.frame_painter_ref=this),this.updateAttributes();let g,x,y,e=t?.getPadRect()??{width:10,height:10},i=Math.round(e.width*this.fX1NDC),s=Math.round(e.width*(this.fX2NDC-this.fX1NDC)),r=Math.round(e.height*(1-this.fY2NDC)),a=Math.round(e.height*(this.fY2NDC-this.fY1NDC)),n=!1,u=!1;if(t?.options&&(t.options.RotateFrame&&(n=!0),t.options.FixFrame&&(u=!0)),n?(g=`rotate(-90,${i},${r}) translate(${i-a},${r})`,[s,a]=[a,s]):g=`translate(${i},${r})`,this._frame_x=i,this._frame_y=r,this._frame_width=s,this._frame_height=a,this._frame_rotate=n,this._frame_fixpos=u,this.mode3d)return this;this.draw_g=this.getFrameSvg(),this.draw_g.empty()?(this.draw_g=this.getLayerSvg("primitives_layer").append("svg:g").attr("class","root_frame"),(0,f.isBatchMode)()||this.draw_g.append("svg:title").text(""),x=this.draw_g.append("svg:rect"),this.draw_g.append("svg:g").attr("class","grid_layer"),y=this.draw_g.append("svg:svg").attr("class","main_layer").attr("x",0).attr("y",0).attr("overflow","hidden"),this.draw_g.append("svg:g").attr("class","axis_layer"),this.draw_g.append("svg:g").attr("class","upper_layer")):(x=this.draw_g.select("rect"),y=this.draw_g.select(".main_layer")),this.axes_drawn=!1,this.draw_g.attr("transform",g),x.attr("x",0).attr("y",0).attr("width",s).attr("height",a).attr("rx",this.lineatt.rx||null).attr("ry",this.lineatt.ry||null).call(this.fillatt.func).call(this.lineatt.func),y.attr("width",s).attr("height",a).attr("viewBox",`0 0 ${s} ${a}`);let k=Promise.resolve(!0);return this.v7EvalAttr("drawAxes")&&(this.self_drawaxes=!0,this.setAxesRanges(),k=this.drawAxes().then(()=>this.addInteractivity())),k.then(()=>((0,f.isBatchMode)()||(x.style("pointer-events","visibleFill"),c.J9.assign(this),this.addBasicInteractivity()),this))}getFrameWidth(){return this._frame_width||0}getFrameHeight(){return this._frame_height||0}getFrameRect(){return{x:this._frame_x||0,y:this._frame_y||0,width:this.getFrameWidth(),height:this.getFrameHeight(),transform:this.draw_g?this.draw_g.attr("transform"):"",hint_delta_x:0,hint_delta_y:0}}getHistPalette(){return this.getPadPainter().getHistPalette()}configureUserClickHandler(t){this._click_handler=(0,f.isFunc)(t)?t:null}configureUserDblclickHandler(t){this._dblclick_handler=(0,f.isFunc)(t)?t:null}zoom(t,e,i,s,r,a){var n=this;return(0,F.Z)(function*(){if(n.projection)return!1;"x"===t?(t=e,e=i,i=void 0):"y"===t?(s=i,i=e,t=e=void 0):"z"===t&&(r=e,a=i,t=e=i=void 0);let u=t!==e,g=i!==s,x=r!==a,y=!1,k=!1,S=!1;if(u){let $=0;t<=n.xmin&&(t=n.xmin,$++),e>=n.xmax&&(e=n.xmax,$++),2===$&&(u=!1,y=!0)}else y=t===e&&0===t;if(g){let $=0;i<=n.ymin&&(i=n.ymin,$++),s>=n.ymax&&(s=n.ymax,$++),2===$&&(g=!1,k=!0)}else k=i===s&&0===i;if(x){let $=0;r<=n.zmin&&(r=n.zmin,$++),a>=n.zmax&&(a=n.zmax,$++),2===$&&(x=!1,S=!0)}else S=r===a&&0===r;let R=!1,E="",C="",q="",H=!1,L={_typename:"ROOT::Experimental::RFrame::RUserRanges",values:[0,0,0,0,0,0],flags:[!1,!1,!1,!1,!1,!1]};const Q=($,tt)=>{!tt&&!(0,f.isFunc)($.canZoomInside)||(H=!0,u&&(tt||$.canZoomInside("x",t,e))&&(n.zoom_xmin=t,n.zoom_xmax=e,R=!0,E="0",u=!1,L.values[0]=t,L.values[1]=e,L.flags[0]=L.flags[1]=!0),g&&(tt||$.canZoomInside("y",i,s))&&(n.zoom_ymin=i,n.zoom_ymax=s,R=!0,C="1",g=!1,L.values[2]=i,L.values[3]=s,L.flags[2]=L.flags[3]=!0),x&&(tt||$.canZoomInside("z",r,a))&&(n.zoom_zmin=r,n.zoom_zmax=a,R=!0,q="2",x=!1,L.values[4]=r,L.values[5]=a,L.flags[4]=L.flags[5]=!0))};return(u||g||x)&&n.forEachPainter($=>Q($)),!H&&n.self_drawaxes&&Q(null,!0),(y||k||S)&&(y&&(n.zoom_xmin!==n.zoom_xmax&&(R=!0,E="0"),n.zoom_xmin=n.zoom_xmax=0,L.values[0]=L.values[1]=-1),k&&(n.zoom_ymin!==n.zoom_ymax&&(R=!0,C="1"),n.zoom_ymin=n.zoom_ymax=0,L.values[2]=L.values[3]=-1),S&&(n.zoom_zmin!==n.zoom_zmax&&(R=!0,q="2"),n.zoom_zmin=n.zoom_zmax=0,L.values[4]=L.values[5]=-1)),!!R&&(n.v7NormalMode()&&n.v7SubmitRequest("zoom",{_typename:"ROOT::Experimental::RFrame::RZoomRequest",ranges:L}),n.interactiveRedraw("pad","zoom"+E+C+q).then(()=>!0))})()}zoomSingle(t,e,i){var s=this;return(0,F.Z)(function*(){let a=["x","y","z","x2","y2"].indexOf(t);if(s.projection||!s[t+"_handle"]||a<0)return!1;let n=e!==i,u=!1;if(n){let S=0;e<=s[t+"min"]&&(e=s[t+"min"],S++),i>=s[t+"max"]&&(i=s[t+"max"],S++),2===S&&(n=!1,u=!0)}else u=e===i&&0===e;let g=!1,x=!1,y={_typename:"ROOT::Experimental::RFrame::RUserRanges",values:[0,0,0,0,0,0,0,0,0,0],flags:[!1,!1,!1,!1,!1,!1,!1,!1,!1,!1]},k=(S,R)=>{!R&&!(0,f.isFunc)(S?.canZoomInside)||(x=!0,n&&(R||S.canZoomInside(t[0],e,i))&&(s["zoom_"+t+"min"]=e,s["zoom_"+t+"max"]=i,g=!0,n=!1,y.values[2*a]=e,y.values[2*a+1]=i,y.flags[2*a]=y.flags[2*a+1]=!0))};return n&&s.forEachPainter(S=>k(S)),!x&&s.self_drawaxes&&k(null,!0),u&&(s[`zoom_${t}min`]!==s[`zoom_${t}max`]&&(g=!0),s[`zoom_${t}min`]=s[`zoom_${t}max`]=0,y.values[2*a]=y.values[2*a+1]=-1),!!g&&(s.v7NormalMode()&&s.v7SubmitRequest("zoom",{_typename:"ROOT::Experimental::RFrame::RZoomRequest",ranges:y}),s.interactiveRedraw("pad","zoom"+a).then(()=>!0))})()}isAxisZoomed(t){return this["zoom_"+t+"min"]!==this["zoom_"+t+"max"]}unzoom(t,e,i){var s=this;return(0,F.Z)(function*(){return"all"==t?s.unzoom("x2").then(()=>s.unzoom("y2")).then(()=>s.unzoom("xyz")):"x2"==t||"y2"==t?s.zoomSingle(t,0,0).then(r=>(r&&s.zoomChangedInteractive(t,"unzoom"),r)):(typeof t>"u"?t=e=i=!0:(0,f.isStr)(t)&&(i=t.indexOf("z")>=0,e=t.indexOf("y")>=0,t=t.indexOf("x")>=0),s.zoom(t?0:void 0,t?0:void 0,e?0:void 0,e?0:void 0,i?0:void 0,i?0:void 0).then(r=>(r&&t&&s.zoomChangedInteractive("x","unzoom"),r&&e&&s.zoomChangedInteractive("y","unzoom"),r&&i&&s.zoomChangedInteractive("z","unzoom"),r)))})()}zoomChangedInteractive(t,e){if("reset"==t)return void(this.zoom_changed_x=this.zoom_changed_y=this.zoom_changed_z=void 0);if(!t||"any"==t)return this.zoom_changed_x||this.zoom_changed_y||this.zoom_changed_z;if("x"!==t&&"y"!==t&&"z"!==t)return;let i="zoom_changed_"+t;if(void 0===e)return this[i];"unzoom"!==e?e&&(this[i]=!0):this[i]=void 0===this[i]}fillObjectOfflineMenu(t,e){"x"!=e&&"y"!=e||t.add("Unzoom",()=>this.unzoom(e))}changeFrameAttr(t,e){let i={};this.v7AttrChange(i,t,e),this.v7SetAttr(t,e),this.v7SendAttrChanges(i,!1),this.redrawPad()}fillContextMenu(t,e){if("x"==e||"y"==e||"x2"==e||"y2"==e){let s=this[e+"_handle"];return!!s&&(t.add("header: "+e.toUpperCase()+" axis"),s.fillAxisContextMenu(t,e))}let i=0==t.size();return t.add(i?"header:Frame":"separator"),this.zoom_xmin!==this.zoom_xmax&&t.add("Unzoom X",()=>this.unzoom("x")),this.zoom_ymin!==this.zoom_ymax&&t.add("Unzoom Y",()=>this.unzoom("y")),this.zoom_zmin!==this.zoom_zmax&&t.add("Unzoom Z",()=>this.unzoom("z")),this.zoom_x2min!==this.zoom_x2max&&t.add("Unzoom X2",()=>this.unzoom("x2")),this.zoom_y2min!==this.zoom_y2max&&t.add("Unzoom Y2",()=>this.unzoom("y2")),t.add("Unzoom all",()=>this.unzoom("all")),t.add("separator"),t.addchk(this.isTooltipAllowed(),"Show tooltips",()=>this.setTooltipAllowed("toggle")),this.x_handle&&t.addchk(this.x_handle.draw_grid,"Grid x",s=>this.changeFrameAttr("gridX",s)),this.y_handle&&t.addchk(this.y_handle.draw_grid,"Grid y",s=>this.changeFrameAttr("gridY",s)),this.x_handle&&!this.x2_handle&&t.addchk(this.x_handle.draw_swapside,"Swap x",s=>this.changeFrameAttr("swapX",s)),this.y_handle&&!this.y2_handle&&t.addchk(this.y_handle.draw_swapside,"Swap y",s=>this.changeFrameAttr("swapY",s)),this.x_handle&&!this.x2_handle&&(t.add("sub:Ticks x"),t.addchk(0==this.x_handle.draw_ticks,"off",()=>this.changeFrameAttr("ticksX",0)),t.addchk(1==this.x_handle.draw_ticks,"normal",()=>this.changeFrameAttr("ticksX",1)),t.addchk(2==this.x_handle.draw_ticks,"ticks on both sides",()=>this.changeFrameAttr("ticksX",2)),t.addchk(3==this.x_handle.draw_ticks,"labels on both sides",()=>this.changeFrameAttr("ticksX",3)),t.add("endsub:")),this.y_handle&&!this.y2_handle&&(t.add("sub:Ticks y"),t.addchk(0==this.y_handle.draw_ticks,"off",()=>this.changeFrameAttr("ticksY",0)),t.addchk(1==this.y_handle.draw_ticks,"normal",()=>this.changeFrameAttr("ticksY",1)),t.addchk(2==this.y_handle.draw_ticks,"ticks on both sides",()=>this.changeFrameAttr("ticksY",2)),t.addchk(3==this.y_handle.draw_ticks,"labels on both sides",()=>this.changeFrameAttr("ticksY",3)),t.add("endsub:")),t.addAttributesMenu(this,i?"":"Frame "),t.add("separator"),t.add("Save as frame.png",()=>this.getPadPainter().saveAs("png","frame","frame.png")),t.add("Save as frame.svg",()=>this.getPadPainter().saveAs("svg","frame","frame.svg")),!0}revertAxis(t,e){let i=this[t+"_handle"];return i?i.revertPoint(e):0}showAxisStatus(t,e){let s=t,a=(0,W.cx)(e,this.getFrameSvg().node()),n="x"==t?0:1;this.swap_xy&&(n=1-n);let u=this.revertAxis(t,a[n]);this.showObjectStatus(s,"axis",t+" : "+this.axisAsText(t,u),Math.round(a[0])+","+Math.round(a[1]))}addKeysHandler(){(0,f.isBatchMode)()||(c.J9.assign(this),this.addFrameKeysHandler())}addInteractivity(t){return!(!(0,f.isBatchMode)()&&(f.settings.Zooming||f.settings.ContextMenu))||(c.J9.assign(this),this.addFrameInteractivity(t))}setRootPadRange(){}toggleAxisLog(t){let e=this[t+"_handle"];e&&e.changeAxisLog("toggle")}}var l=T(3038),d=T(3675),p=T(4383),v=T(3834);class w extends V.p{constructor(t,e,i){super(t,e,"","pad"),this.pad=e,this.iscan=i,this.this_pad_name="",!this.iscan&&null!==e&&(this.this_pad_name=e.fObjectID?"pad"+e.fObjectID:"ppp"+f.internals.id_counter++),this.painters=[],this.has_canvas=!0,this.forEachPainter=this.forEachPainterInPad}isRoot6(){return!1}svg_this_pad(){return this.getPadSvg(this.this_pad_name)}getMainPainter(){return this.main_painter_ref||null}setMainPainter(t,e){(!this.main_painter_ref||e)&&(this.main_painter_ref=t)}cleanup(){this._doing_draw&&console.error("pad drawing is not completed when cleanup is called"),this.painters.forEach(e=>e.cleanup());let t=this.svg_this_pad();t.empty()||(t.property("pad_painter",null),this.iscan||t.remove()),delete this.main_painter_ref,delete this.frame_painter_ref,delete this.pads_cache,delete this._pad_x,delete this._pad_y,delete this._pad_width,delete this._pad_height,delete this._doing_draw,delete this._dfltRFont,this.painters=[],this.pad=null,this.draw_object=null,this.pad_frame=null,this.this_pad_name=void 0,this.has_canvas=!1,(0,Z.O5)({pp:this,active:!1}),super.cleanup()}getFramePainter(){return this.frame_painter_ref}getPadWidth(){return this._pad_width||0}getPadHeight(){return this._pad_height||0}getPadRect(){return{x:this._pad_x||0,y:this._pad_y||0,width:this.getPadWidth(),height:this.getPadHeight()}}getFrameRect(){let t=this.getFramePainter();if(t)return t.getFrameRect();let e=this.getPadWidth(),i=this.getPadHeight(),s={};return s.szx=Math.round(.5*e),s.szy=Math.round(.5*i),s.width=2*s.szx,s.height=2*s.szy,s.x=Math.round(e/2-s.szx),s.y=Math.round(i/2-s.szy),s.hint_delta_x=s.szx,s.hint_delta_y=s.szy,s.transform=`translate(${s.x},${s.y})`,s}getRootPad(t){return void 0!==t&&t?null:this.pad}cleanPrimitives(t){if((0,f.isFunc)(t))for(let e=this.painters.length-1;e>=0;--e)t(this.painters[e])&&(this.painters[e].cleanup(),this.painters.splice(e,1))}findPainterFor(t,e,i){return this.painters.find(s=>{let r=s.getObject();if(r){if(t&&r===t)return!0;if((e||i)&&(!e||r.fName===e)&&(!i||r._typename===i))return!0}})}getHistPalette(){let t=this.findPainterFor(void 0,void 0,"ROOT::Experimental::RPaletteDrawable");return t?t.getHistPalette():(this.fDfltPalette||(this.fDfltPalette={_typename:"ROOT::Experimental::RPalette",fColors:[{fOrdinal:0,fColor:{fColor:"rgb(53, 42, 135)"}},{fOrdinal:.125,fColor:{fColor:"rgb(15, 92, 221)"}},{fOrdinal:.25,fColor:{fColor:"rgb(20, 129, 214)"}},{fOrdinal:.375,fColor:{fColor:"rgb(6, 164, 202)"}},{fOrdinal:.5,fColor:{fColor:"rgb(46, 183, 164)"}},{fOrdinal:.625,fColor:{fColor:"rgb(135, 191, 119)"}},{fOrdinal:.75,fColor:{fColor:"rgb(209, 187, 89)"}},{fOrdinal:.875,fColor:{fColor:"rgb(254, 200, 50)"}},{fOrdinal:1,fColor:{fColor:"rgb(249, 251, 14)"}}],fInterpolate:!0,fNormalized:!0},(0,f.addMethods)(this.fDfltPalette,"ROOT::Experimental::RPalette")),this.fDfltPalette)}getNumPainters(){return this.painters.length}forEachPainterInPad(t,e){e||(e="all"),"objects"!=e&&t(this);for(let i=0;i0){if(this._fixed_size)return t>1;if(s=this.getCanvSvg(),s.empty()||(i=s.property("height_factor"),a=this.testMainResize(t,null,i),!a.changed))return!1;(0,f.isBatchMode)()||(n=this.getLayerSvg("btns_layer",this.this_pad_name)),u=s.select(".canvas_fillrect")}else{let g=this.selectDom();"static"==g.style("position")&&g.style("position","relative"),s=g.append("svg").attr("class","jsroot root_canvas").property("pad_painter",this).property("current_pad","").property("redraw_by_resize",!1),this.setTopPainter(),!(0,f.isBatchMode)()&&!this.online_canvas&&s.append("svg:title").text("ROOT canvas"),u=s.append("svg:path").attr("class","canvas_fillrect"),(0,f.isBatchMode)()||u.style("pointer-events","visibleFill").on("dblclick",x=>this.enlargePad(x)).on("click",()=>this.selectObjectPainter(this,null)).on("mouseenter",()=>this.showObjectStatus()).on("contextmenu",f.settings.ContextMenu?x=>this.padContextMenu(x):null),s.append("svg:g").attr("class","primitives_layer"),s.append("svg:g").attr("class","info_layer"),(0,f.isBatchMode)()||(n=s.append("svg:g").attr("class","btns_layer").property("leftside","left"==f.settings.ToolBarSide).property("vertical",f.settings.ToolBarVert)),i=.66,this.pad&&this.pad.fWinSize[0]&&this.pad.fWinSize[1]&&(i=this.pad.fWinSize[1]/this.pad.fWinSize[0],(i<.1||i>10)&&(i=.66)),this._fixed_size?(g.style("overflow","auto"),a={width:this.pad.fWinSize[0],height:this.pad.fWinSize[1]},(!a.width||!a.height)&&(a=(0,d.Yo)(g))):a=this.testMainResize(2,e,i)}return this.createAttFill({pattern:1001,color:0}),a.width<=5||a.height<=5?(s.style("display","none"),console.warn(`Hide canvas while geometry too small w=${a.width} h=${a.height}`),a.width=200,a.height=100):s.style("display",null),this._fixed_size?s.attr("x",0).attr("y",0).attr("width",a.width).attr("height",a.height).style("position","absolute"):s.attr("x",0).attr("y",0).style("width","100%").style("height","100%").style("position","absolute").style("left",0).style("top",0).style("right",0).style("bottom",0),s.style("filter",f.settings.DarkMode?"invert(100%)":null),s.attr("viewBox",`0 0 ${a.width} ${a.height}`).attr("preserveAspectRatio","none").property("height_factor",i).property("draw_x",0).property("draw_y",0).property("draw_width",a.width).property("draw_height",a.height),this._pad_x=0,this._pad_y=0,this._pad_width=a.width,this._pad_height=a.height,u.attr("d",`M0,0H${a.width}V${a.height}H0Z`).call(this.fillatt.func),this._fast_drawing=f.settings.SmallPad&&(a.width{E.getObject()==a&&(n=!0)},"pads"),n&&(u=s,g=r,x=y=0)),t?(k=this.svg_this_pad(),S=k.select(".root_pad_border"),(0,f.isBatchMode)()||(R=this.getLayerSvg("btns_layer",this.this_pad_name))):(k=e.select(".primitives_layer").append("svg:svg").classed("__root_pad_"+this.this_pad_name,!0).attr("pad",this.this_pad_name).property("pad_painter",this),(0,f.isBatchMode)()||k.append("svg:title").text("ROOT subpad"),S=k.append("svg:path").attr("class","root_pad_border"),k.append("svg:g").attr("class","primitives_layer"),(0,f.isBatchMode)()||(R=k.append("svg:g").attr("class","btns_layer").property("leftside","left"!=f.settings.ToolBarSide).property("vertical",f.settings.ToolBarVert)),f.settings.ContextMenu&&S.on("contextmenu",E=>this.padContextMenu(E)),(0,f.isBatchMode)()||S.style("pointer-events","visibleFill").on("dblclick",E=>this.enlargePad(E)).on("click",()=>this.selectObjectPainter(this,null)).on("mouseenter",()=>this.showObjectStatus())),this.createAttFill({attr:this.pad}),this.createAttLine({attr:this.pad,color0:0==this.pad.fBorderMode?"none":""}),k.style("display",n?null:"none").attr("viewBox",`0 0 ${u} ${g}`).attr("preserveAspectRatio","none").attr("x",x).attr("y",y).attr("width",u).attr("height",g).property("draw_x",x).property("draw_y",y).property("draw_width",u).property("draw_height",g),this._pad_x=x,this._pad_y=y,this._pad_width=u,this._pad_height=g,S.attr("d",`M0,0H${u}V${g}H0Z`).call(this.fillatt.func).call(this.lineatt.func),this._fast_drawing=f.settings.SmallPad&&(u"ROOT::Experimental::RPadDisplayItem"!=e._typename))}syncDraw(t){let e={kind:t||"redraw"};return void 0===this._doing_draw?(this._doing_draw=[e],Promise.resolve(!0)):!(!0!==e.kind&&this._doing_draw.findIndex((i,s)=>s>0&&i.kind==e.kind)>0)&&(this._doing_draw.push(e),new Promise(i=>{e.func=i}))}confirmDraw(){if(void 0===this._doing_draw)return console.warn("failure, should not happen");if(this._doing_draw.shift(),0==this._doing_draw.length)delete this._doing_draw;else{let t=this._doing_draw[0];t.func&&(t.func(),delete t.func)}}drawObject(){return(0,F.Z)(function*(){return console.log("Not possible to draw object without loading of draw.mjs"),null})()}drawPrimitives(t){var e=this;return(0,F.Z)(function*(){if(void 0===t)return e.iscan&&(e._start_tm=(new Date).getTime()),e._num_primitives=e.pad&&e.pad.fPrimitives?e.pad.fPrimitives.length:0,e.syncDraw(!0).then(()=>e.drawPrimitives(0));if(e.pad&&!(t>=e._num_primitives))return e.drawObject(e.getDom(),e.pad.fPrimitives[t],"").then(i=>((0,f.isObject)(i)&&(i._primitive=!0),e.drawPrimitives(t+1)));if(e.confirmDraw(),e._start_tm){let i=(new Date).getTime()-e._start_tm;i>3e3&&console.log(`Canvas drawing took ${(.001*i).toFixed(2)}s`),delete e._start_tm}})()}processPadTooltipEvent(t){let e=[],i=[];return null!==this.painters&&this.painters.forEach(s=>{(0,f.isFunc)(s.processTooltipEvent)&&e.push(s)}),t&&(t.nproc=e.length),e.forEach(s=>{let r=s.processTooltipEvent(t);r||(r={user_info:null}),i.push(r),t&&t.painters&&(r.painter=s)}),i}changeDarkMode(t){this.getCanvSvg().style("filter",t??f.settings.DarkMode?"invert(100%)":null)}fillContextMenu(t){t.add(this.iscan?"header: RCanvas":"header: RPad"),t.addchk(this.isTooltipAllowed(),"Show tooltips",()=>this.setTooltipAllowed("toggle")),this._websocket||(t.addAttributesMenu(this),this.iscan&&t.addSettingsMenu(!1,!1,i=>{"dark"==i&&this.changeDarkMode()})),t.add("separator"),(0,f.isFunc)(this.hasMenuBar)&&(0,f.isFunc)(this.actiavteMenuBar)&&t.addchk(this.hasMenuBar(),"Menu bar",i=>this.actiavteMenuBar(i)),(0,f.isFunc)(this.hasEventStatus)&&(0,f.isFunc)(this.activateStatusBar)&&t.addchk(this.hasEventStatus(),"Event status",()=>this.activateStatusBar("toggle")),(this.enlargeMain()||this.has_canvas&&this.hasObjectsToDraw())&&t.addchk("on"==this.enlargeMain("state"),"Enlarge "+(this.iscan?"canvas":"pad"),()=>this.enlargePad());let e=this.this_pad_name||(this.iscan?"canvas":"pad");return t.add(`Save as ${e}.png`,e+".png",i=>this.saveAs("png",!1,i)),t.add(`Save as ${e}.svg`,e+".svg",i=>this.saveAs("svg",!1,i)),!0}padContextMenu(t){if(t.stopPropagation){let e=(0,W.cx)(t,this.svg_this_pad().node());if(2==e.length&&e[0]>=0&&e[0]<10&&e[1]>=0&&e[1]<10)return;t.stopPropagation(),t.preventDefault(),this.getFramePainter()?.setLastEventPos()}(0,p.Z)(t,this).then(e=>(this.fillContextMenu(e),this.fillObjectExecMenu(e))).then(e=>e.show())}redrawPad(t){var e=this;return(0,F.Z)(function*(){let i=e.syncDraw(t);if(!1===i)return console.log("Prevent RPad redrawing"),!1;let s=!0,r=a=>{for(;ar(a))}return!0};return i.then(()=>(e.iscan?e.createCanvasSvg(2):s=e.createPadSvg(!0),r(0))).then(()=>((0,Z.X8)()===e&&e.getCanvPainter()?.producePadEvent("padredraw",e),e.confirmDraw(),!0))})()}redraw(t){return this.redrawPad(t)}needRedrawByResize(){let t=this.svg_this_pad();if(!t.empty()&&t.property("can3d")===f.constants.Embed3D.Overlay)return!0;for(let e=0;e!s||a>=this.painters.length?(this.confirmDraw(),s):(0,f.getPromise)(this.painters[a].redraw(e?"redraw":"resize")).then(()=>r(a+1));return i.then(()=>(s=this.createCanvasSvg(e?2:1,t),r(0)))}updateObject(t){return!!t&&(this.pad.fStyle=t.fStyle,this.pad.fAttr=t.fAttr,this.iscan?(this.pad.fTitle=t.fTitle,this.pad.fWinSize=t.fWinSize):(this.pad.fPos=t.fPos,this.pad.fSize=t.fSize),!0)}addObjectPainter(t,e,i){t&&e&&e[i]&&void 0===t.snapid&&(this.painters.indexOf(t)<0&&this.painters.push(t),t.assignSnapId(e[i].fObjectID),t.rstyle||(t.rstyle=e[i].fStyle||this.rstyle))}extractTObjectProp(t){if(t.fColIndex&&t.fColValue){let r=this.root_colors||(0,l._V)();for(let a=0;a{let n=e.v7EvalColor(a,"");n&&(i[r]=(0,l.hI)(n,this.root_colors))};void 0!==i.fLineColor&&void 0!==i.fLineWidth&&void 0!==i.fLineStyle&&(s("fLineColor","line_color"),i.fLineWidth=e.v7EvalAttr("line_width",i.fLineWidth),i.fLineStyle=e.v7EvalAttr("line_style",i.fLineStyle)),void 0!==i.fFillColor&&void 0!==i.fFillStyle&&(s("fFillColor","fill_color"),i.fFillStyle=e.v7EvalAttr("fill_style",i.fFillStyle)),void 0!==i.fMarkerColor&&void 0!==i.fMarkerStyle&&void 0!==i.fMarkerSize&&(s("fMarkerColor","marker_color"),i.fMarkerStyle=e.v7EvalAttr("marker_style",i.fMarkerStyle),i.fMarkerSize=e.v7EvalAttr("marker_size",i.fMarkerSize)),void 0!==i.fTextColor&&void 0!==i.fTextAlign&&void 0!==i.fTextAngle&&void 0!==i.fTextSize&&(s("fTextColor","text_color"),i.fTextAlign=e.v7EvalAttr("text_align",i.fTextAlign),i.fTextAngle=e.v7EvalAttr("text_angle",i.fTextAngle),i.fTextSize=e.v7EvalAttr("text_size",i.fTextSize))}drawNextSnap(t,e){var i=this;return(0,F.Z)(function*(){if(void 0===e&&(e=-1,i._snaps_map={},i._num_primitives=t?t.length:0,i._auto_color_cnt=0),delete i.next_rstyle,++e,!t||e>=t.length)return delete i._snaps_map,delete i._auto_color_cnt,i;let s=t[e],r=s.fObjectID,a=i._snaps_map[r],n=null;if(a?a++:a=1,i._snaps_map[r]=a,s.fDummy)return i.drawNextSnap(t,e);for(let u=0;u(i.addObjectPainter(g,t,e),i.drawNextSnap(t,e)));let u;return"ROOT::Experimental::TObjectDisplayItem"===s._typename&&i.extractTObjectProp(s),n.updateObject(s.fDrawable||s.fObject||s,s.fOption||"",!0)&&(u=n.redraw()),(0,f.getPromise)(u).then(()=>i.drawNextSnap(t,e))}if("ROOT::Experimental::RPadDisplayItem"==s._typename){let u=s,g=new w(i.getDom(),u,!1);g.decodeOptions(""),g.addToPadPrimitives(i.this_pad_name),g.assignSnapId(s.fObjectID),g.rstyle=s.fStyle,g.createPadSvg(),s.fPrimitives&&s.fPrimitives.length>0&&g.addPadButtons();let x=g.selectCurrentPad(g.this_pad_name);return g.drawNextSnap(s.fPrimitives).then(()=>(g.selectCurrentPad(x),i.drawNextSnap(t,e)))}if(i.next_rstyle=t[e].fStyle||i.rstyle,"ROOT::Experimental::TObjectDisplayItem"===s._typename){const u={kNone:0,kObject:1,kColors:4,kStyle:5,kPalette:6};if(s.fKind==u.kStyle)return Object.assign(f.gStyle,s.fObject),i.drawNextSnap(t,e);if(s.fKind==u.kColors){let g=[],x=s.fObject.arr;for(let y=0;y0&&(g[parseInt(k.slice(0,S))]=k.slice(S+1))}return i.root_colors=g,i.drawNextSnap(t,e)}if(s.fKind==u.kPalette){let g=s.fObject.arr,x=[];for(let y=0;yi.drawNextSnap(t,e-1));i.extractTObjectProp(s)}return i.drawObject(i.getDom(),s.fDrawable||s.fObject||s,s.fOption||"").then(u=>(i.addObjectPainter(u,t,e),i.drawNextSnap(t,e)))})()}findSnap(t,e){function i(s){return!(!s||!(0,f.isStr)(s))&&(s==t||e&&s.length>t.length&&s.indexOf(t)==s.length-t.length)}if(i(this.snapid))return this;if(!this.painters)return null;for(let s=0;s{n&&u.fObjectID===n.snapid&&(n=null,i=!0)}),n&&(e.painters.splice(a--,1),n.cleanup(),s=!0,e.main_painter_ref===n&&delete e.main_painter_ref))}if(s&&delete e.pads_cache,!i){let a=e.getFramePainter();a?.is_root6()&&(a=null);for(let n=0;n(e.selectCurrentPad(r),(0,Z.X8)()===e&&e.getCanvPainter()?.producePadEvent("padredraw",e),e))})()}createImage(t){var e=this;return(0,F.Z)(function*(){return"pdf"==t?(0,f.btoa_func)("dummy PDF file"):"png"==t||"jpeg"==t||"svg"==t?e.produceImage(!0,t).then(i=>{if(!i||"svg"==t)return i;let s=i.indexOf("base64,");return s>0?i.slice(s+7):""}):""})()}itemContextMenu(t){let e=this.svg_this_pad().node().getBoundingClientRect(),i={clientX:e.left+10,clientY:e.top+10};if("pad"==t)return setTimeout(()=>this.padContextMenu(i),50);let r,s=null;switch(t){case"xaxis":case"yaxis":case"zaxis":s=this.getMainPainter(),r=t[0];break;case"frame":s=this.getFramePainter();break;default:{let a=parseInt(t);Number.isInteger(a)&&(s=this.painters[a])}}(0,f.isFunc)(s?.fillContextMenu)&&(0,p.Z)(i,s).then(a=>{s.fillContextMenu(a,r)&&s.fillObjectExecMenu(a,r).then(()=>setTimeout(()=>a.show(),50))})}saveAs(t,e,i){i||(i=(this.this_pad_name||(this.iscan?"canvas":"pad"))+"."+t),this.produceImage(e,t).then(s=>{if(!s)return console.error(`Fail to produce image ${i}`);(0,B.yH)(i,"svg"!=t?s:"data:image/svg+xml;charset=utf-8,"+encodeURIComponent(s))})}findActivePad(){return null}produceImage(t,e){var i=this;return(0,F.Z)(function*(){let s="frame"===t,r=s?i.getFrameSvg(i.this_pad_name):t?i.getCanvSvg():i.svg_this_pad(),a=t&&!s?i.getCanvPainter():i,n=[];if(r.empty())return"";s||a.forEachPainterInPad(E=>{let C={prnt:E.svg_this_pad()};n.push(C);let q=E.getLayerSvg("btns_layer",i.this_pad_name);C.btns_node=q.node(),C.btns_node&&(C.btns_prnt=C.btns_node.parentNode,C.btns_next=C.btns_node.nextSibling,q.remove());let H=E.getFramePainter();if(!H||!(0,f.isFunc)(H.render3D)||!(0,f.isFunc)(H.access3dKind))return;let L=H.access3dKind();if(L!==f.constants.Embed3D.Overlay&&L!==f.constants.Embed3D.Embed)return;let Q=H.getSizeFor3d(f.constants.Embed3D.Embed),$=H.renderer.domElement;H.render3D(0);let tt=$.toDataURL("image/png");L===f.constants.Embed3D.Embed&&(C.foreign=C.prnt.select("."+Q.clname),C.foreign.remove());let it=H.getFrameSvg();C.frame_node=it.node(),C.frame_node&&(C.frame_next=C.frame_node.nextSibling,it.remove()),C.img=C.prnt.insert("image",".primitives_layer").attr("x",Q.x).attr("y",Q.y).attr("width",$.width).attr("height",$.height).attr("href",tt)},"pads");const g=()=>{for(let E=0;E${r.node().innerHTML}`;if(f.internals.processSvgWorkarounds&&(k=f.internals.processSvgWorkarounds(k)),k=(0,d.ln)(k),"svg"==e)return g(),k;let R=new Image;return new Promise(E=>{R.onload=function(){let C=document.createElement("canvas");C.width=R.width,C.height=R.height,C.getContext("2d").drawImage(R,0,0),g(),E(C.toDataURL("image/"+e))},R.onerror=function(C){console.log(`IMAGE ERROR ${C}`),g(),E(null)},R.src="data:image/svg+xml;base64,"+(0,f.btoa_func)((E=>(E=(E=encodeURIComponent(E)).replace(/%([0-9A-F]{2})/g,function(C,q){let H=String.fromCharCode("0x"+q);return"%"===H?"%25":H}),decodeURIComponent(E)))(''+k))})})()}clickPadButton(t,e){if("CanvasSnapShot"==t)return this.saveAs("png",!0);if("enlargePad"==t)return this.enlargePad();if("PadSnapShot"==t)return this.saveAs("png",!1);if("PadContextMenus"==t){if(e&&(e.preventDefault(),e.stopPropagation()),(0,p.W)())return;return void(0,p.Z)(e,this).then(s=>{s.add("header:Menus"),s.add(this.iscan?"Canvas":"Pad","pad",this.itemContextMenu),this.getFramePainter()&&s.add("Frame","frame",this.itemContextMenu);let r=this.getMainPainter();if(r&&(s.add("X axis","xaxis",this.itemContextMenu),s.add("Y axis","yaxis",this.itemContextMenu),(0,f.isFunc)(r.getDimension)&&r.getDimension()>1&&s.add("Z axis","zaxis",this.itemContextMenu)),this.painters?.length){s.add("separator");let a=[];for(let n=0;n=0)continue;let g=u._typename?u._typename+"::":"";u.fName&&(g+=u.fName),g||(g="item"+n),s.add(g,n,this.itemContextMenu)}}s.show()})}let i=!1;for(let s=0;sy(r||(r=i?i.getFrameRect():this.getPadRect()),r);if(i){let y=n(2),k=t?"gry":"grx";void 0!==y&&i[k]&&(a=i[k](y))}void 0===a&&(a=t?u().height:0);let g=n(0,0);return a+=s*n(1,0),g&&(a+=s*(t?u().height:u().width)*g),Math.round(a)}getCoordinate(t,e){return{x:this.getPadLength(!1,t.fHoriz,e),y:this.getPadLength(!0,t.fVert,e)}}decodeOptions(t){let e=this.getObject();if(!e)return;let i=new d.pc(t);this.options||(this.options={}),Object.assign(this.options,{GlobalColors:!0,LocalColors:!1,IgnorePalette:!1,RotateFrame:!1,FixFrame:!1}),(i.check("NOCOLORS")||i.check("NOCOL"))&&(this.options.GlobalColors=this.options.LocalColors=!1),(i.check("LCOLORS")||i.check("LCOL"))&&(this.options.GlobalColors=!1,this.options.LocalColors=!0),(i.check("NOPALETTE")||i.check("NOPAL"))&&(this.options.IgnorePalette=!0),i.check("ROTATE")&&(this.options.RotateFrame=!0),i.check("FIXFRAME")&&(this.options.FixFrame=!0),i.check("WHITE")&&(e.fFillColor=0),i.check("LOGX")&&(e.fLogx=1),i.check("LOGY")&&(e.fLogy=1),i.check("LOGZ")&&(e.fLogz=1),i.check("LOG")&&(e.fLogx=e.fLogy=e.fLogz=1),i.check("GRIDX")&&(e.fGridx=1),i.check("GRIDY")&&(e.fGridy=1),i.check("GRID")&&(e.fGridx=e.fGridy=1),i.check("TICKX")&&(e.fTickx=1),i.check("TICKY")&&(e.fTicky=1),i.check("TICK")&&(e.fTickx=e.fTicky=1)}static draw(t,e,i){return(0,F.Z)(function*(){let s=new w(t,e,!1);s.decodeOptions(i),s.getCanvSvg().empty()?(s.has_canvas=!1,s.this_pad_name="",s.setTopPainter()):s.addToPadPrimitives(s.pad_name),s.createPadSvg(),s.matchObjectType(f.clTPad)&&(!s.has_canvas||s.hasObjectsToDraw())&&s.addPadButtons();let r=s.has_canvas?s.selectCurrentPad(s.this_pad_name):void 0;return(0,Z.O5)({pp:s,active:!1}),s.drawPrimitives().then(()=>(s.showPadButtons(),s.selectCurrentPad(r),s))})()}}class M{constructor(t,e,i){this.path=t,this.connid=null,this.req=null,this.raw=e,this.args=i,this.nextRequest("","connect")}nextRequest(t,e){let i=this.path,s="buf",r=null;if("connect"===e)i+=this.raw?"?raw_connect":"?txt_connect",this.args&&(i+="&"+this.args),console.log(`longpoll connect ${i} raw = ${this.raw}`),this.connid="connect";else if("close"===e){if(null===this.connid||"close"===this.connid)return;i+=`?connection=${this.connid}&close`,this.connid="close",s="text;sync"}else{if(null===this.connid||"number"!=typeof this.connid)return void(f.browser.qt5||console.error("No connection"));i+="?connection="+this.connid,"dummy"===e&&(i+="&dummy")}t&&(this.raw?i+="&post="+(0,f.btoa_func)(t):(s="postbuf",r=t)),(0,f.createHttpRequest)(i,s,function(a){if(this.handle.req===this&&(this.handle.req=null),null===a)return this.handle.processRequest(null);if(this.handle.raw){let n="",u=0,g=new Uint8Array(a),x=g.length;if(x<4)return f.browser.qt5||console.error(`longpoll got short message in raw mode ${x}`),this.handle.processRequest(null);for(;u<4;)n+=String.fromCharCode(g[u++]);if("txt:"!=n){for(n="";u>"==n?-1111:n),x>"==a?-1111:a)}},function(){this.handle.processRequest(null,"error")},!0).then(a=>{a.handle=this,this.req||(this.req=a),a.send(r)})}processRequest(t,e){if(null===t)return(0,f.isFunc)(this.onerror)&&this.onerror("receive data with connid "+(this.connid||"---")),"error"==e&&(0,f.isFunc)(this.onclose)&&this.onclose("force_close"),void(this.connid=null);-1111===t&&(t="");let i=5;if("connect"===this.connid){if(!t)return this.connid=null,void((0,f.isFunc)(this.onerror)&&this.onerror("connection rejected"));this.connid=parseInt(t),i=100,console.log(`Get new longpoll connection with id ${this.connid}`),(0,f.isFunc)(this.onopen)&&this.onopen()}else{if("close"===this.connid)return void((0,f.isFunc)(this.onclose)&&this.onclose());(0,f.isFunc)(this.onmessage)&&t&&this.onmessage({data:t,offset:e})}this.req||setTimeout(()=>{this.req||this.nextRequest("","dummy")},i)}send(t){this.nextRequest(t)}close(){this.nextRequest("","close")}}class D{constructor(t){this.receiver=t,this.protocol=[],this.cnt=0,(0,f.httpRequest)("protocol.json","text").then(e=>this.getProtocol(e))}getProtocol(t){t&&(this.protocol=JSON.parse(t),(0,f.isFunc)(this.onopen)&&this.onopen(),this.nextOperation())}send(){"send"==this.protocol[this.cnt]&&(this.cnt++,setTimeout(()=>this.nextOperation(),10))}close(){}nextOperation(){if(this.wait_for_file)return;let t=this.protocol[this.cnt];t&&"send"!=t&&(this.wait_for_file=!0,this.cnt++,(0,f.httpRequest)(t,t.indexOf(".bin")>0?"buf":"text").then(e=>{this.wait_for_file=!1,e&&(this.receiver.provideData&&this.receiver.provideData(1,e,0),setTimeout(()=>this.nextOperation(),10))}))}}class z{constructor(t,e){this.kind=t,this.state=0,this.credits=e||10,this.cansend=this.credits,this.ackn=this.credits}getUserArgs(t){return t&&(0,f.isStr)(t)?(0,f.isObject)(this.user_args)?this.user_args[t]:void 0:this.user_args}setUserArgs(t){this.user_args=t}setReceiver(t){this.receiver=t}cleanup(){delete this.receiver,this.close(!0)}invokeReceiver(t,e,i,s){if(this.receiver&&(0,f.isFunc)(this.receiver[e])&&this.receiver[e](this,i,s),t&&this.channels){let r=Object.keys(this.channels);for(let a=0;a1&&this.channels){const r=this.channels[t];if(r)return r.provideData(1,e,i)}const s=i&&i<0;if(!(s||this.msgqueue&&this.msgqueue.length))return this.invokeReceiver(!1,"onWebsocketMsg",e,i);this.msgqueue||(this.msgqueue=[]),s&&(i=void 0),this.msgqueue.push({ready:!0,msg:e,len:i})}reserveQueueItem(){this.msgqueue||(this.msgqueue=[]);let t={ready:!1,msg:null,len:0};return this.msgqueue.push(t),t}markQueueItemDone(t,e,i){t.ready=!0,t.msg=e,t.len=i,this.processQueue()}processQueue(){if(!this._loop_msgqueue&&this.msgqueue){for(this._loop_msgqueue=!0;this.msgqueue.length>0&&this.msgqueue[0].ready;){let t=this.msgqueue.shift();this.invokeReceiver(!1,"onWebsocketMsg",t.msg,t.len)}0==this.msgqueue.length&&delete this.msgqueue,delete this._loop_msgqueue}}close(t){if(this.master)return this.master.send("CLOSECH="+this.channelid,0),delete this.master.channels[this.channelid],void delete this.master;this.timerid&&(clearTimeout(this.timerid),delete this.timerid),this._websocket&&this.state>0&&(this.state=t?-1:0,this._websocket.onclose=null,this._websocket.close(),delete this._websocket)}canSend(t){return this.cansend>=(t||1)}getRelCanSend(){return this.credits?this.cansend/this.credits:1}send(t,e){if(this.master)return this.master.send(t,this.channelid);if(!this._websocket||this.state<=0)return!1;Number.isInteger(e)||(e=1),this.cansend<=0&&console.error(`should be queued before sending cansend: ${this.cansend}`);let i=`${this.ackn}:${this.cansend}:${e}:`;return this.ackn=0,this.cansend--,this._websocket.send(i+t),("websocket"===this.kind||"longpoll"===this.kind)&&(this.timerid&&clearTimeout(this.timerid),this.timerid=setTimeout(()=>this.keepAlive(),1e4)),!0}inject(t,e,i){if(!i)return setTimeout(this.inject.bind(this,t,e,!0),0);if(void 0===e&&(e=1),Array.isArray(t)){for(let s=0;s{if(0!=this.state)return;r||console.log(`try connect window again ${(new Date).toString()}`),this._websocket&&(this._websocket.close(),delete this._websocket),t||((t=window.location.href)&&t.indexOf("#")>0&&(t=t.slice(0,t.indexOf("#"))),t&&t.lastIndexOf("/")>0&&(t=t.slice(0,t.lastIndexOf("/")+1))),this.href=t,e++,r&&console.log(`Opening web socket at ${t}`),e>2&&(0,B.Ae)(`Trying to connect ${t}`);let a=t;"file"==this.kind?(a+="root.filedump",this._websocket=new D(this),console.log(`configure protocol log ${a}`)):"websocket"===this.kind&&r?(a=a.replace("http://","ws://").replace("https://","wss://")+"root.websocket",i&&(a+="?"+i),console.log(`configure websocket ${a}`),this._websocket=new WebSocket(a)):(a+="root.longpoll",console.log(`configure longpoll ${a}`),this._websocket=new M(a,"rawlongpoll"===this.kind,i)),this._websocket&&(this._websocket.onopen=()=>{e>2&&(0,B.Ae)(),this.state=1,this.send("READY="+(this.key||""),0),this.invokeReceiver(!1,"onWebsocketOpened")},this._websocket.onmessage=n=>{let u=n.data;if(this.next_binary){let R=this.next_binary;if(delete this.next_binary,u instanceof Blob){let E=new FileReader,C=this.reserveQueueItem();E.onload=q=>this.markQueueItemDone(C,q.target.result,0),E.readAsArrayBuffer(u,n.offset||0)}else this.provideData(R,u,n.offset||0);return}if(!(0,f.isStr)(u))return console.log("unsupported message kind: "+typeof u);let g=u.indexOf(":"),x=parseInt(u.slice(0,g)),y=u.indexOf(":",g+1),k=u.indexOf(":",y+1),S=parseInt(u.slice(y+1,k));if(this.ackn++,this.cansend+=x,u=u.slice(k+1),0==S){if(console.log(`GET chid=0 message ${u}`),"CLOSE"==u)this.close(!0),this.invokeReceiver(!0,"onWebsocketClosed");else if(0==u.indexOf("NEW_KEY=")){let R=u.slice(8);this.close(!0),typeof sessionStorage<"u"&&sessionStorage.setItem("RWebWindow_Key",R),location.reload(!0)}}else"$$binary$$"==u?this.next_binary=S:"$$nullbinary$$"==u?this.provideData(S,new ArrayBuffer(0),0):this.provideData(S,u);this.ackn>7&&this.send("READY",0)},this._websocket.onclose=n=>{delete this._websocket,(this.state>0||"force_close"===n)&&(console.log("websocket closed"),this.state=0,this.invokeReceiver(!0,"onWebsocketClosed"))},this._websocket.onerror=n=>{console.log(`websocket error ${n} state ${this.state}`),this.state>0&&(this.invokeReceiver(!0,"onWebsocketError",n),this.state=0)},(0,f.isBatchMode)()||setTimeout(s,3e3))};s(!0)}askReload(){this.send("GENERATE_KEY",0)}addReloadKeyHandler(){"file"!=this.kind&&window.addEventListener("keydown",t=>{("R"==t.key||"r"==t.key)&&t.ctrlKey&&(t.stopPropagation(),t.preventDefault(),console.log("Prevent Ctrl-R propogation - ask reload RWebWindow!"),this.askReload())})}}class j extends w{constructor(t,e){super(t,e,!0),this._websocket=null,this.tooltip_allowed=f.settings.Tooltip,this.v7canvas=!0}cleanup(){delete this._websocket,delete this._submreq,this._changed_layout&&this.setLayoutKind("simple"),delete this._changed_layout,super.cleanup()}getLayoutKind(){let t=this.selectDom("origin");return(t.empty()?"":t.property("layout"))||"simple"}setLayoutKind(t,e){let i=this.selectDom("origin");i.empty()||(t||(t="simple"),i.property("layout",t),i.property("layout_selector","simple"!=t&&e?e:null),this._changed_layout="simple"!==t)}changeLayout(t,e){var i=this;return(0,F.Z)(function*(){if(i.getLayoutKind()==t)return!0;let r=i.selectDom("origin"),a=r.select(".side_panel"),n=i.selectDom(),u=[];for(;n.node().firstChild;)u.push(n.node().removeChild(n.node().firstChild));if(a.empty()||(0,Z.Eq)(a.node()),i.setLayoutKind("simple"),r.html(""),"simple"==t){n=r;for(let g=0;g{console.log("save",t,i.length),this.sendWebsocket("SAVE:"+t+":"+i)})}sendSaveCommand(t){this.sendWebsocket("PRODUCE:"+t)}sendWebsocket(t){return!!this._websocket?.canSend()&&(this._websocket.send(t),!0)}closeWebsocket(t){this._websocket&&(this._websocket.close(t),this._websocket.cleanup(),delete this._websocket)}useWebsocket(t){this.closeWebsocket(),this._websocket=t,this._websocket.setReceiver(this),this._websocket.connect()}onWebsocketOpened(){}onWebsocketClosed(){this.embed_canvas||(0,B.Hw)()}onWebsocketMsg(t,e){if(console.log("GET_MSG "+e.slice(0,30)),"CLOSE"==e)this.onWebsocketClosed(),this.closeWebsocket(!0);else if("SNAP:"==e.slice(0,5)){let i=(e=e.slice(5)).indexOf(":"),s=e.slice(0,i),r=(0,f.parse)(e.slice(i+1));this.syncDraw(!0).then(()=>this.redrawPadSnap(r)).then(()=>{t.send("SNAPDONE:"+s),this.confirmDraw()})}else if("JSON"==e.slice(0,4)){let i=(0,f.parse)(e.slice(4));this.redrawObject(i)}else if("REPL_REQ:"==e.slice(0,9))this.processDrawableReply(e.slice(9));else if("CMD:"==e.slice(0,4)){let i=(e=e.slice(4)).indexOf(":"),s=e.slice(0,i),r=e.slice(i+1),a="REPLY:"+s+":";if("SVG"==r||"PNG"==r||"JPEG"==r)this.createImage(r.toLowerCase()).then(n=>t.send(a+n));else if(0==r.indexOf("ADDPANEL:")){let n=r.slice(9);if((0,f.isFunc)(this.showUI5Panel)){let u=new z(t.kind);u.setReceiver({cpainter:this,onWebsocketOpened(){},onWebsocketMsg(x,y){let k=0==y.indexOf("SHOWPANEL:")?y.slice(10):"";this.cpainter.showUI5Panel(k,x).then(S=>t.send(a+(S?"true":"false")))},onWebsocketClosed(){t.send(a+"false")},onWebsocketError(){t.send(a+"false")}});let g=t.href;if(0==n.indexOf("../")){let x=g.lastIndexOf("/",g.length-2);g=g.slice(0,x)+n.slice(2)}else g+=n;u.connect(g)}else t.send(a+"false")}else console.log("Unrecognized command "+r),t.send(a)}else if("DXPROJ:"==e.slice(0,7)||"DYPROJ:"==e.slice(0,7)){let i=e[1],s=(0,f.parse)(e.slice(7));this.drawProjection(i,s)}else if("SHOW:"==e.slice(0,5)){let i=e.slice(5),s="1"==i[i.length-1];this.showSection(i.slice(0,i.length-2),s)}else console.log(`unrecognized msg len: ${e.length} msg: ${e.slice(0,30)}`)}submitDrawableRequest(t,e,i,s){if(!(this._websocket&&e&&e._typename&&i.snapid&&(0,f.isStr)(i.snapid)))return null;if(t&&s){i._requests||(i._requests={});let a=i._requests[t];if(a){let n=(new Date).getTime();if(!a._tm||n-a._tm<5e3)return a._nextreq=e,!1;delete i._requests[t]}i._requests[t]=e}e.id=i.snapid,s?(this._nextreqid||(this._nextreqid=1),e.reqid=this._nextreqid++):e.reqid=0;let r=JSON.stringify(e);return e.reqid&&(e._kind=t,e._painter=i,e._method=s,e._tm=(new Date).getTime(),this._submreq||(this._submreq={}),this._submreq[e.reqid]=e),this.sendWebsocket("REQ:"+r),e}submitMenuRequest(t,e,i){var s=this;return(0,F.Z)(function*(){return new Promise(r=>{s.submitDrawableRequest("",{_typename:"ROOT::Experimental::RDrawableMenuRequest",menukind:e||"",menureqid:i},t,r)})})()}submitExec(t,e,i){if(this._websocket){if(i&&(0,f.isStr)(i)){let s=i.length;if(s>2&&i.indexOf("#x")==s-2?i="x":s>2&&i.indexOf("#y")==s-2?i="y":s>2&&i.indexOf("#z")==s-2&&(i="z"),"x"!=i&&"y"!=i&&"z"!=i)return console.log(`not recoginzed subelem ${i} in SubmitExec`);e=i+"axis#"+e}this.submitDrawableRequest("",{_typename:"ROOT::Experimental::RDrawableExecRequest",exec:e},t)}}processDrawableReply(t){let e=(0,f.parse)(t);if(!e||!e.reqid||!this._submreq)return!1;let i=this._submreq[e.reqid];if(!i)return!1;delete this._submreq[e.reqid],i._kind&&i._painter?._requests&&i._painter._requests[i._kind]===i&&delete i._painter._requests[i._kind],i._method&&i._method(e,i),i._nextreq&&!i._painter._requests[i._kind]&&this.submitDrawableRequest(i._kind,i._nextreq,i._painter,i._method)}showSection(t,e){var i=this;return(0,F.Z)(function*(){switch(t){case"Menu":case"StatusBar":case"Editor":case"ToolBar":break;case"ToolTips":i.setTooltipAllowed(e)}return!0})()}processChanges(t,e,i){if(this._websocket&&this._websocket.canSend(2)&&(0,f.isStr)(t))switch(e||(e=this),t){case"sbits":console.log("Status bits in RCanvas are changed - that to do?");break;case"frame":case"zoom":console.log("Frame moved or zoom is changed - that to do?");break;case"pave_moved":console.log("TPave is moved inside RCanvas - that to do?");break;default:"exec:"==t.slice(0,5)&&e?.snapid?this.submitExec(e,t.slice(5),i):console.log("UNPROCESSED CHANGES",t)}}clickPadButton(t,e){return"ToggleGed"==t?this.activateGed(this,null,"toggle"):"ToggleStatus"==t?this.activateStatusBar("toggle"):void super.clickPadButton(t,e)}hasEventStatus(){if(this.testUI5())return!1;if(this.brlayout)return this.brlayout.hasStatus();let t=(0,K.nh)();return!!t&&t.hasStatusLine()}activateStatusBar(t){this.testUI5()||(this.brlayout?this.brlayout.createStatusLine(23,t):(0,K.nh)()?.createStatusLine(23,t),this.processChanges("sbits",this))}showCanvasStatus(...t){this.testUI5()||(this.brlayout||(0,K.nh)()?.brlayout)?.showStatus(...t)}hasGed(){return!this.testUI5()&&(this.brlayout?.hasContent()??!1)}removeGed(){this.testUI5()||(this.registerForPadEvents(null),this.ged_view&&(this.ged_view.getController().cleanupGed(),this.ged_view.destroy(),delete this.ged_view),this.brlayout?.deleteContent(!0),this.processChanges("sbits",this))}getUi5PanelData(){return{jsroot:{settings:f.settings,create:f.create,parse:f.parse,toJSON:f.toJSON,loadScript:f.loadScript,EAxisBits:Z.VO,getColorExec:B.Aq}}}activateGed(t,e,i){var s=this;return(0,F.Z)(function*(){if(s.testUI5()||!s.brlayout)return!1;if(s.brlayout.hasContent())return"toggle"===i||!1===i?s.removeGed():t?.getPadPainter()?.selectObjectPainter(t),!0;if(!1===i)return!1;let r=s.brlayout.createBrowserBtns();return B.KL.createSVG(r,B.KL.diamand,15,"toggle fix-pos mode").style("margin","3px").on("click",()=>s.brlayout.toggleKind("fix")),B.KL.createSVG(r,B.KL.circle,15,"toggle float mode").style("margin","3px").on("click",()=>s.brlayout.toggleKind("float")),B.KL.createSVG(r,B.KL.cross,15,"delete GED").style("margin","3px").on("click",()=>s.removeGed()),s.brlayout.setBrowserContent("
Loading GED ...
"),s.brlayout.setBrowserTitle("GED"),s.brlayout.toggleBrowserKind(e||"float"),new Promise(a=>{B.OA.then(n=>{(0,W.Ys)("#ged_placeholder").text(""),n.ui.define(["sap/ui/model/json/JSONModel","sap/ui/core/mvc/XMLView"],(u,g)=>{let x=new u({handle:null});g.create({viewName:"rootui5.canv.view.Ged",viewData:s.getUi5PanelData("Ged")}).then(y=>{y.setModel(x),y.placeAt("ged_placeholder"),s.ged_view=y,s.registerForPadEvents(y.getController().padEventsReceiver.bind(y.getController())),t?.getPadPainter()?.selectObjectPainter(t),s.processChanges("sbits",s),a(!0)})})})})})()}produceJSON(){return console.error("RCanvasPainter.produceJSON not yet implemented"),""}static draw(t,e){return(0,F.Z)(function*(){let i=!e;i&&(e=(0,f.create)("ROOT::Experimental::RCanvas"));let s=new j(t,e);return s.normal_canvas=!i,s.createCanvasSvg(0),(0,Z.O5)({pp:s,active:!1}),s.drawPrimitives().then(()=>(s.addPadButtons(),s.showPadButtons(),s))})()}}function P(_,t){let e=new j(_,null);return e.normal_canvas=!1,e.batch_mode=(0,f.isBatchMode)(),e.syncDraw(!0).then(()=>e.redrawPadSnap(t)).then(()=>(e.confirmDraw(),e.showPadButtons(),e))}function I(_,t){return Y.apply(this,arguments)}function Y(){return(Y=(0,F.Z)(function*(_,t){return _?(_.getCanvSvg().empty()?j.draw(_.getDom(),null):Promise.resolve(!0)).then(()=>{if(!1!==t&&_.getFrameSvg().select(".main_layer").empty())return o.draw(_.getDom(),null,(0,f.isStr)(t)?t:"")}).then(()=>(_.addToPadPrimitives(),_)):Promise.reject(Error("Painter not provided in ensureRCanvas"))})).apply(this,arguments)}function N(_,t){let e=this.getFramePainter();if(!e)return console.log("no frame painter - no title");let i=e.getFrameRect(),s=i.x,r=i.y,a=i.width,n=this.getPadPainter().getPadHeight(),u=this.getObject(),g=this.v7EvalLength("margin",n,.02),x=a,y=this.v7EvalLength("height",n,.05),k=this.v7EvalFont("text",{size:.07,color:"black",align:22});if("drag"==_){y=t.height,g=r-t.y-t.height;let R={};this.v7AttrChange(R,"margin",g/n),this.v7AttrChange(R,"height",y/n),this.v7SendAttrChanges(R,!1)}this.createG(),this.draw_g.attr("transform",`translate(${s},${Math.round(r-g-y)})`);let S={x:x/2,y:y/2,text:u.fText,latex:1};return this.startTextDrawing(k,"font"),this.drawText(S),this.finishTextDrawing().then(()=>{(0,f.isBatchMode)()||(0,c.uI)(this,{x:s,y:Math.round(r-g-y),width:x,height:y,minwidth:20,minheight:20,no_change_x:!0,redraw:R=>this.redraw("drag",R)})})}function X(){let _=this.getObject(),t=this.getCanvSvg(),e=t.select(".canvas_defs"),i="custom_font_"+_.fFamily+_.fWeight+_.fStyle;e.empty()&&(e=t.insert("svg:defs",":first-child").attr("class","canvas_defs"));let s=e.select("."+i);return s.empty()&&(s=e.append("style").attr("type","text/css").attr("class",i)),s.text(`@font-face { font-family: "${_.fFamily}"; font-weight: ${_.fWeight?_.fWeight:"normal"}; font-style: ${_.fStyle?_.fStyle:"normal"}; src: ${_.fSrc}; }`),_.fDefault&&(this.getPadPainter()._dfltRFont=_),!0}function G(_,t,e){let i=new m.C(_,t,e);return i.disable_zooming=!0,I(i,!1).then(()=>i.redraw()).then(()=>i)}function U(_,t,e){let i=new o(_,t);return"3d"==e&&(i.mode3d=!0),I(i,!1).then(()=>i.redraw())}(0,f.registerMethods)("ROOT::Experimental::RPalette",{extractRColor:_=>_.fColor||"black",getColor(_){return this.palette[_]},getContourIndex(_){let s,t=this.fContour,e=0,i=t.length-1;if(_=t[i])return i-1;if(this.fCustomContour){for(;e_?i=s:e=s;return e}return Math.floor((_-t[0])/(t[i-1]-t[0])*(i-1))},getContourColor(_){let t=this.getContourIndex(_);return t<0?"":this.getColor(t)},getContour(){return this.fContour&&this.fContour.length>1?this.fContour:null},deleteContour(){delete this.fContour},calcColor(_,t,e){let i=e.fOrdinal-t.fOrdinal,s=e.fOrdinal-_,r=_-t.fOrdinal;if(!this.fInterpolate||i<=0)return s1&&(_=1);let t,e=this.fColors[0];for(let i=0;i_)return this.calcColor(_,t,e)}return this.extractRColor(e.fColor)},setFullRange(_,t){this.full_min=_,this.full_max=t},createContour(_,t,e,i,s){if(this.fContour=[],delete this.fCustomContour,this.colzmin=e,this.colzmax=i,_){this.colzmax<=0&&(this.colzmax=1),this.colzmin<=0&&(this.colzmin=void 0===s||s<=0?1e-4*this.colzmax:s<3||s>100?.3*s:1),this.colzmin>=this.colzmax&&(this.colzmin=1e-4*this.colzmax);let r=Math.log(this.colzmin)/Math.log(10),n=(Math.log(this.colzmax)/Math.log(10)-r)/t;this.fContour.push(this.colzmin);for(let u=1;u {\n if (dflt === undefined) return res;\n let typ1 = typeof dflt, typ2 = typeof res;\n if (typ1 == typ2) return res;\n if (typ1 == 'boolean') {\n if (typ2 == 'string') return (res != '') && (res != '0') && (res != 'no') && (res != 'off');\n return !!res;\n }\n if ((typ1 == 'number') && (typ2 == 'string'))\n return parseFloat(res);\n return res;\n };\n\n if (obj.fAttr && obj.fAttr.m) {\n let value = obj.fAttr.m[name];\n if (value) return type_check(value.v); // found value direct in attributes\n }\n\n if (this.rstyle && this.rstyle.fBlocks) {\n let blks = this.rstyle.fBlocks;\n for (let k = 0; k < blks.length; ++k) {\n let block = blks[k],\n match = (this.csstype && (block.selector == this.csstype)) ||\n (obj.fId && (block.selector == ('#' + obj.fId))) ||\n (obj.fCssClass && (block.selector == ('.' + obj.fCssClass)));\n\n if (match && block.map && block.map.m) {\n let value = block.map.m[name.toLowerCase()];\n if (value) return type_check(value.v);\n }\n }\n }\n\n return dflt;\n }\n\n /** @summary Set v7 attributes value */\n v7SetAttr(name, value) {\n let obj = this.getObject();\n if (this.cssprefix) name = this.cssprefix + name;\n\n if (obj && obj.fAttr && obj.fAttr.m)\n obj.fAttr.m[name] = { v: value };\n }\n\n /** @summary Decode pad length from string, return pixel value */\n v7EvalLength(name, sizepx, dflt) {\n if (sizepx <= 0) sizepx = 1;\n\n let value = this.v7EvalAttr(name);\n\n if (value === undefined)\n return Math.round(dflt*sizepx);\n\n if (typeof value == 'number')\n return Math.round(value*sizepx);\n\n if (value === null)\n return 0;\n\n let norm = 0, px = 0, val = value, operand = 0, pos = 0;\n\n while (val) {\n // skip empty spaces\n while ((pos < val.length) && ((val[pos] == ' ') || (val[pos] == '\\t')))\n ++pos;\n\n if (pos >= val.length)\n break;\n\n if ((val[pos] == '-') || (val[pos] == '+')) {\n if (operand) {\n console.log('Fail to parse RPadLength ' + value);\n return dflt;\n }\n operand = (val[pos] == '-') ? -1 : 1;\n pos++;\n continue;\n }\n\n if (pos > 0) { val = val.slice(pos); pos = 0; }\n\n while ((pos < val.length) && (((val[pos] >= '0') && (val[pos] <= '9')) || (val[pos] == '.'))) pos++;\n\n let v = parseFloat(val.slice(0, pos));\n if (!Number.isFinite(v)) {\n console.log('Fail to parse RPadLength ' + value);\n return Math.round(dflt*sizepx);\n }\n\n val = val.slice(pos);\n pos = 0;\n if (!operand) operand = 1;\n if (val && (val[0] == '%')) {\n val = val.slice(1);\n norm += operand*v*0.01;\n } else if ((val.length > 1) && (val[0] == 'p') && (val[1] == 'x')) {\n val = val.slice(2);\n px += operand*v;\n } else {\n norm += operand*v;\n }\n\n operand = 0;\n }\n\n return Math.round(norm*sizepx + px);\n }\n\n /** @summary Evaluate RColor using attribute storage and configured RStyle */\n v7EvalColor(name, dflt) {\n let val = this.v7EvalAttr(name, '');\n if (!val || !isStr(val)) return dflt;\n\n if (val == 'auto') {\n let pp = this.getPadPainter();\n if (pp?._auto_color_cnt !== undefined) {\n let pal = pp.getHistPalette(),\n cnt = pp._auto_color_cnt++,\n num = pp._num_primitives - 1;\n if (num < 2) num = 2;\n val = pal ? pal.getColorOrdinal((cnt % num) / num) : 'blue';\n if (!this._auto_colors) this._auto_colors = {};\n this._auto_colors[name] = val;\n } else if (this._auto_colors && this._auto_colors[name]) {\n val = this._auto_colors[name];\n } else {\n console.error(`Autocolor ${name} not defined yet - please check code`);\n val = '';\n }\n } else if (val[0] == '[') {\n let ordinal = parseFloat(val.slice(1, val.length-1));\n val = 'black';\n if (Number.isFinite(ordinal)) {\n let pp = this.getPadPainter(),\n pal = pp?.getHistPalette();\n if (pal) val = pal.getColorOrdinal(ordinal);\n }\n }\n return val;\n }\n\n /** @summary Evaluate RAttrText properties\n * @return {Object} FontHandler, can be used directly for the text drawing */\n v7EvalFont(name, dflts, fontScale) {\n\n if (!dflts) dflts = {}; else\n if (typeof dflts == 'number') dflts = { size: dflts };\n\n let pp = this.getPadPainter(),\n rfont = pp?._dfltRFont || { fFamily: 'Arial', fStyle: '', fWeight: '' },\n text_size = this.v7EvalAttr(name + '_size', dflts.size || 12),\n text_angle = this.v7EvalAttr(name + '_angle', 0),\n text_align = this.v7EvalAttr(name + '_align', dflts.align || 'none'),\n text_color = this.v7EvalColor(name + '_color', dflts.color || 'none'),\n font_family = this.v7EvalAttr(name + '_font_family', rfont.fFamily || 'Arial'),\n font_style = this.v7EvalAttr(name + '_font_style', rfont.fStyle || ''),\n font_weight = this.v7EvalAttr(name + '_font_weight', rfont.fWeight || '');\n\n if (isStr(text_size)) text_size = parseFloat(text_size);\n if (!Number.isFinite(text_size) || (text_size <= 0)) text_size = 12;\n if (!fontScale) fontScale = pp?.getPadHeight() || 100;\n\n let handler = new FontHandler(null, text_size, fontScale, font_family, font_style, font_weight);\n\n if (text_angle) handler.setAngle(360 - text_angle);\n if (text_align !== 'none') handler.setAlign(text_align);\n if (text_color !== 'none') handler.setColor(text_color);\n\n return handler;\n }\n\n /** @summary Create this.fillatt object based on v7 fill attributes */\n createv7AttFill(prefix) {\n if (!prefix || !isStr(prefix)) prefix = 'fill_';\n\n let color = this.v7EvalColor(prefix + 'color', ''),\n pattern = this.v7EvalAttr(prefix + 'style', 0);\n\n this.createAttFill({ pattern, color, color_as_svg: true });\n }\n\n /** @summary Create this.lineatt object based on v7 line attributes */\n createv7AttLine(prefix) {\n if (!prefix || !isStr(prefix)) prefix = 'line_';\n\n let color = this.v7EvalColor(prefix + 'color', 'black'),\n width = this.v7EvalAttr(prefix + 'width', 1),\n style = this.v7EvalAttr(prefix + 'style', 1),\n pattern = this.v7EvalAttr(prefix + 'pattern');\n\n this.createAttLine({ color, width, style, pattern });\n\n if (prefix == 'border_')\n this.lineatt.setBorder(this.v7EvalAttr(prefix + 'rx', 0), this.v7EvalAttr(prefix + 'ry', 0));\n }\n\n /** @summary Create this.markeratt object based on v7 attributes */\n createv7AttMarker(prefix) {\n if (!prefix || !isStr(prefix)) prefix = 'marker_';\n\n let color = this.v7EvalColor(prefix + 'color', 'black'),\n size = this.v7EvalAttr(prefix + 'size', 0.01),\n style = this.v7EvalAttr(prefix + 'style', 1),\n refsize = 1;\n if (size < 1) {\n let pp = this.getPadPainter();\n refsize = pp?.getPadHeight() || 100;\n }\n\n this.createAttMarker({ color, size, style, refsize });\n }\n\n /** @summary Create RChangeAttr, which can be applied on the server side\n * @private */\n v7AttrChange(req, name, value, kind) {\n if (!this.snapid)\n return false;\n\n if (!req._typename) {\n req._typename = 'ROOT::Experimental::RChangeAttrRequest';\n req.ids = [];\n req.names = [];\n req.values = [];\n req.update = true;\n }\n\n if (this.cssprefix) name = this.cssprefix + name;\n req.ids.push(this.snapid);\n req.names.push(name);\n let obj = null;\n\n if ((value === null) || (value === undefined)) {\n if (!kind) kind = 'none';\n if (kind !== 'none') console.error(`Trying to set ${kind} for none value`);\n }\n\n if (!kind)\n switch(typeof value) {\n case 'number': kind = 'double'; break;\n case 'boolean': kind = 'boolean'; break;\n }\n\n obj = { _typename: 'ROOT::Experimental::RAttrMap::' };\n switch(kind) {\n case 'none': obj._typename += 'NoValue_t'; break;\n case 'boolean': obj._typename += 'BoolValue_t'; obj.v = value ? true : false; break;\n case 'int': obj._typename += 'IntValue_t'; obj.v = parseInt(value); break;\n case 'double': obj._typename += 'DoubleValue_t'; obj.v = parseFloat(value); break;\n default: obj._typename += 'StringValue_t'; obj.v = isStr(value) ? value : JSON.stringify(value); break;\n }\n\n req.values.push(obj);\n return true;\n }\n\n /** @summary Sends accumulated attribute changes to server */\n v7SendAttrChanges(req, do_update) {\n let canp = this.getCanvPainter();\n if (canp && req?._typename) {\n if (do_update !== undefined)\n req.update = do_update ? true : false;\n canp.v7SubmitRequest('', req);\n }\n }\n\n /** @summary Submit request to server-side drawable\n * @param kind defines request kind, only single request a time can be submitted\n * @param req is object derived from DrawableRequest, including correct _typename\n * @param method is method of painter object which will be called when getting reply */\n v7SubmitRequest(kind, req, method) {\n let canp = this.getCanvPainter();\n if (!isFunc(canp?.submitDrawableRequest)) return null;\n\n // special situation when snapid not yet assigned - just keep ref until snapid is there\n // maybe keep full list - for now not clear if really needed\n if (!this.snapid) {\n this._pending_request = { kind, req, method };\n return req;\n }\n\n return canp.submitDrawableRequest(kind, req, this, method);\n }\n\n /** @summary Assign snapid to the painter\n * @desc Overwrite default method */\n assignSnapId(id) {\n this.snapid = id;\n if (this.snapid && this._pending_request) {\n let p = this._pending_request;\n this.v7SubmitRequest(p.kind, p.req, p.method);\n delete this._pending_request;\n }\n }\n\n /** @summary Return communication mode with the server\n * @desc\n * kOffline means no server there,\n * kLessTraffic advise not to send commands if offline functionality available\n * kNormal is standard functionality with RCanvas on server side */\n v7CommMode() {\n let canp = this.getCanvPainter();\n if (!canp || !canp.submitDrawableRequest || !canp._websocket)\n return kOffline;\n\n return kNormal;\n }\n\n v7NormalMode() { return this.v7CommMode() == kNormal; }\n\n v7OfflineMode() { return this.v7CommMode() == kOffline; }\n\n} // class RObjectPainter\n\nexport { RObjectPainter };\n","import { settings, isBatchMode, isFunc } from '../core.mjs';\nimport { select as d3_select, pointer as d3_pointer,\n drag as d3_drag, timeFormat as d3_timeFormat,\n scaleTime as d3_scaleTime, scaleSymlog as d3_scaleSymlog,\n scaleLog as d3_scaleLog, scaleLinear as d3_scaleLinear } from '../d3.mjs';\nimport { AxisPainterMethods, chooseTimeFormat } from './TAxisPainter.mjs';\nimport { createMenu } from '../gui/menu.mjs';\nimport { addDragHandler } from './TFramePainter.mjs';\nimport { RObjectPainter } from '../base/RObjectPainter.mjs';\n\n\n/**\n * @summary Axis painter for v7\n *\n * @private\n */\n\nclass RAxisPainter extends RObjectPainter {\n\n /** @summary constructor */\n constructor(dom, arg1, axis, cssprefix) {\n let drawable = cssprefix ? arg1.getObject() : arg1;\n super(dom, drawable, '', cssprefix ? arg1.csstype : 'axis');\n Object.assign(this, AxisPainterMethods);\n this.initAxisPainter();\n\n this.axis = axis;\n if (cssprefix) { // drawing from the frame\n this.embedded = true; // indicate that painter embedded into the histo painter\n //this.csstype = arg1.csstype; // for the moment only via frame one can set axis attributes\n this.cssprefix = cssprefix;\n this.rstyle = arg1.rstyle;\n } else {\n // this.csstype = 'axis';\n this.cssprefix = 'axis_';\n }\n }\n\n /** @summary cleanup painter */\n cleanup() {\n delete this.axis;\n delete this.axis_g;\n this.cleanupAxisPainter();\n super.cleanup();\n }\n\n /** @summary Use in GED to identify kind of axis */\n getAxisType() { return 'RAttrAxis'; }\n\n /** @summary Configure only base parameters, later same handle will be used for drawing */\n configureZAxis(name, fp) {\n this.name = name;\n this.kind = 'normal';\n this.log = false;\n let _log = this.v7EvalAttr('log', 0);\n if (_log) {\n this.log = true;\n this.logbase = 10;\n if (Math.abs(_log - Math.exp(1)) < 0.1)\n this.logbase = Math.exp(1);\n else if (_log > 1.9)\n this.logbase = Math.round(_log);\n }\n fp.logz = this.log;\n }\n\n /** @summary Configure axis painter\n * @desc Axis can be drawn inside frame group with offset to 0 point for the frame\n * Therefore one should distinguish when caclulated coordinates used for axis drawing itself or for calculation of frame coordinates\n * @private */\n configureAxis(name, min, max, smin, smax, vertical, frame_range, axis_range, opts) {\n if (!opts) opts = {};\n this.name = name;\n this.full_min = min;\n this.full_max = max;\n this.kind = 'normal';\n this.vertical = vertical;\n this.log = false;\n let _log = this.v7EvalAttr('log', 0),\n _symlog = this.v7EvalAttr('symlog', 0);\n this.reverse = opts.reverse || false;\n\n if (this.v7EvalAttr('time')) {\n this.kind = 'time';\n this.timeoffset = 0;\n let toffset = this.v7EvalAttr('timeOffset');\n if (toffset !== undefined) {\n toffset = parseFloat(toffset);\n if (Number.isFinite(toffset)) this.timeoffset = toffset*1000;\n }\n } else if (this.axis && this.axis.fLabelsIndex) {\n this.kind = 'labels';\n delete this.own_labels;\n } else if (opts.labels) {\n this.kind = 'labels';\n } else {\n this.kind = 'normal';\n }\n\n if (this.kind == 'time') {\n this.func = d3_scaleTime().domain([this.convertDate(smin), this.convertDate(smax)]);\n } else if (_symlog && (_symlog > 0)) {\n this.symlog = _symlog;\n this.func = d3_scaleSymlog().constant(_symlog).domain([smin,smax]);\n } else if (_log) {\n if (smax <= 0) smax = 1;\n if ((smin <= 0) || (smin >= smax))\n smin = smax * 0.0001;\n this.log = true;\n this.logbase = 10;\n if (Math.abs(_log - Math.exp(1)) < 0.1)\n this.logbase = Math.exp(1);\n else if (_log > 1.9)\n this.logbase = Math.round(_log);\n this.func = d3_scaleLog().base(this.logbase).domain([smin,smax]);\n } else {\n this.func = d3_scaleLinear().domain([smin,smax]);\n }\n\n this.scale_min = smin;\n this.scale_max = smax;\n\n this.gr_range = axis_range || 1000; // when not specified, one can ignore it\n\n let range = frame_range ? frame_range : [0, this.gr_range];\n\n this.axis_shift = range[1] - this.gr_range;\n\n if (this.reverse)\n this.func.range([range[1], range[0]]);\n else\n this.func.range(range);\n\n if (this.kind == 'time')\n this.gr = val => this.func(this.convertDate(val));\n else if (this.log)\n this.gr = val => (val < this.scale_min) ? (this.vertical ? this.func.range()[0]+5 : -5) : this.func(val);\n else\n this.gr = this.func;\n\n delete this.format;// remove formatting func\n\n let ndiv = this.v7EvalAttr('ndiv', 508);\n\n this.nticks = ndiv % 100;\n this.nticks2 = (ndiv % 10000 - this.nticks) / 100;\n this.nticks3 = Math.floor(ndiv/10000);\n\n if (this.nticks > 20) this.nticks = 20;\n\n let gr_range = Math.abs(this.gr_range) || 100;\n\n if (this.kind == 'time') {\n if (this.nticks > 8) this.nticks = 8;\n\n let scale_range = this.scale_max - this.scale_min,\n tf1 = this.v7EvalAttr('timeFormat', ''),\n tf2 = chooseTimeFormat(scale_range / gr_range, false);\n\n if (!tf1 || (scale_range < 0.1 * (this.full_max - this.full_min)))\n tf1 = chooseTimeFormat(scale_range / this.nticks, true);\n\n this.tfunc1 = this.tfunc2 = d3_timeFormat(tf1);\n if (tf2!==tf1)\n this.tfunc2 = d3_timeFormat(tf2);\n\n this.format = this.formatTime;\n\n } else if (this.log) {\n if (this.nticks2 > 1) {\n this.nticks *= this.nticks2; // all log ticks (major or minor) created centrally\n this.nticks2 = 1;\n }\n this.noexp = this.v7EvalAttr('noexp', false);\n if ((this.scale_max < 300) && (this.scale_min > 0.3) && (this.logbase == 10)) this.noexp = true;\n this.moreloglabels = this.v7EvalAttr('moreloglbls', false);\n\n this.format = this.formatLog;\n } else if (this.kind == 'labels') {\n this.nticks = 50; // for text output allow max 50 names\n let scale_range = this.scale_max - this.scale_min;\n if (this.nticks > scale_range)\n this.nticks = Math.round(scale_range);\n this.nticks2 = 1;\n\n this.format = this.formatLabels;\n } else {\n this.order = 0;\n this.ndig = 0;\n this.format = this.formatNormal;\n }\n }\n\n /** @summary Return scale min */\n getScaleMin() {\n return this.func ? this.func.domain()[0] : 0;\n }\n\n /** @summary Return scale max */\n getScaleMax() {\n return this.func ? this.func.domain()[1] : 0;\n }\n\n /** @summary Provide label for axis value */\n formatLabels(d) {\n let indx = Math.round(d);\n if (this.axis && this.axis.fLabelsIndex) {\n if ((indx < 0) || (indx >= this.axis.fNBinsNoOver)) return null;\n for (let i = 0; i < this.axis.fLabelsIndex.length; ++i) {\n let pair = this.axis.fLabelsIndex[i];\n if (pair.second === indx) return pair.first;\n }\n } else {\n let labels = this.getObject().fLabels;\n if (labels && (indx >= 0) && (indx < labels.length))\n return labels[indx];\n }\n return null;\n }\n\n /** @summary Creates array with minor/middle/major ticks */\n createTicks(only_major_as_array, optionNoexp, optionNoopt, optionInt) {\n\n if (optionNoopt && this.nticks && (this.kind == 'normal')) this.noticksopt = true;\n\n let handle = { nminor: 0, nmiddle: 0, nmajor: 0, func: this.func };\n\n handle.minor = handle.middle = handle.major = this.produceTicks(this.nticks);\n\n if (only_major_as_array) {\n let res = handle.major, delta = (this.scale_max - this.scale_min)*1e-5;\n if (res[0] > this.scale_min + delta) res.unshift(this.scale_min);\n if (res[res.length-1] < this.scale_max - delta) res.push(this.scale_max);\n return res;\n }\n\n if ((this.nticks2 > 1) && (!this.log || (this.logbase === 10))) {\n handle.minor = handle.middle = this.produceTicks(handle.major.length, this.nticks2);\n\n let gr_range = Math.abs(this.func.range()[1] - this.func.range()[0]);\n\n // avoid black filling by middle-size\n if ((handle.middle.length <= handle.major.length) || (handle.middle.length > gr_range/3.5)) {\n handle.minor = handle.middle = handle.major;\n } else if ((this.nticks3 > 1) && !this.log) {\n handle.minor = this.produceTicks(handle.middle.length, this.nticks3);\n if ((handle.minor.length <= handle.middle.length) || (handle.minor.length > gr_range/1.7)) handle.minor = handle.middle;\n }\n }\n\n handle.reset = function() {\n this.nminor = this.nmiddle = this.nmajor = 0;\n };\n\n handle.next = function(doround) {\n if (this.nminor >= this.minor.length) return false;\n\n this.tick = this.minor[this.nminor++];\n this.grpos = this.func(this.tick);\n if (doround) this.grpos = Math.round(this.grpos);\n this.kind = 3;\n\n if ((this.nmiddle < this.middle.length) && (Math.abs(this.grpos - this.func(this.middle[this.nmiddle])) < 1)) {\n this.nmiddle++;\n this.kind = 2;\n }\n\n if ((this.nmajor < this.major.length) && (Math.abs(this.grpos - this.func(this.major[this.nmajor])) < 1) ) {\n this.nmajor++;\n this.kind = 1;\n }\n return true;\n };\n\n handle.last_major = function() {\n return (this.kind !== 1) ? false : this.nmajor == this.major.length;\n };\n\n handle.next_major_grpos = function() {\n if (this.nmajor >= this.major.length) return null;\n return this.func(this.major[this.nmajor]);\n };\n\n this.order = 0;\n this.ndig = 0;\n\n // at the moment when drawing labels, we can try to find most optimal text representation for them\n\n if ((this.kind == 'normal') && !this.log && (handle.major.length > 0)) {\n\n let maxorder = 0, minorder = 0, exclorder3 = false;\n\n if (!optionNoexp) {\n let maxtick = Math.max(Math.abs(handle.major[0]),Math.abs(handle.major[handle.major.length-1])),\n mintick = Math.min(Math.abs(handle.major[0]),Math.abs(handle.major[handle.major.length-1])),\n ord1 = (maxtick > 0) ? Math.round(Math.log10(maxtick)/3)*3 : 0,\n ord2 = (mintick > 0) ? Math.round(Math.log10(mintick)/3)*3 : 0;\n\n exclorder3 = (maxtick < 2e4); // do not show 10^3 for values below 20000\n\n if (maxtick || mintick) {\n maxorder = Math.max(ord1,ord2) + 3;\n minorder = Math.min(ord1,ord2) - 3;\n }\n }\n\n // now try to find best combination of order and ndig for labels\n\n let bestorder = 0, bestndig = this.ndig, bestlen = 1e10;\n\n for (let order = minorder; order <= maxorder; order+=3) {\n if (exclorder3 && (order===3)) continue;\n this.order = order;\n this.ndig = 0;\n let lbls = [], indx = 0, totallen = 0;\n while (indx 11) break; // not too many digits, anyway it will be exponential\n lbls = []; indx = 0; totallen = 0;\n }\n\n // for order == 0 we should virually remove '0.' and extra label on top\n if (!order && (this.ndig < 4))\n totallen -= (handle.major.length * 2 + 3);\n\n if (totallen < bestlen) {\n bestlen = totallen;\n bestorder = this.order;\n bestndig = this.ndig;\n }\n }\n\n this.order = bestorder;\n this.ndig = bestndig;\n\n if (optionInt) {\n if (this.order) console.warn(`Axis painter - integer labels are configured, but axis order ${this.order} is preferable`);\n if (this.ndig) console.warn(`Axis painter - integer labels are configured, but ${this.ndig} decimal digits are required`);\n this.ndig = 0;\n this.order = 0;\n }\n }\n\n return handle;\n }\n\n /** @summary Is labels should be centered */\n isCenteredLabels() {\n if (this.kind === 'labels') return true;\n if (this.kind === 'log') return false;\n return this.v7EvalAttr('labels_center', false);\n }\n\n /** @summary Used to move axis labels instead of zooming\n * @private */\n processLabelsMove(arg, pos) {\n if (this.optionUnlab || !this.axis_g) return false;\n\n let label_g = this.axis_g.select('.axis_labels');\n if (!label_g || (label_g.size() != 1)) return false;\n\n if (arg == 'start') {\n // no moving without labels\n let box = label_g.node().getBBox();\n\n label_g.append('rect')\n .classed('zoom', true)\n .attr('x', box.x)\n .attr('y', box.y)\n .attr('width', box.width)\n .attr('height', box.height)\n .style('cursor', 'move');\n if (this.vertical) {\n this.drag_pos0 = pos[0];\n } else {\n this.drag_pos0 = pos[1];\n }\n\n return true;\n }\n\n let offset = label_g.property('fix_offset');\n\n if (this.vertical) {\n offset += Math.round(pos[0] - this.drag_pos0);\n label_g.attr('transform', `translate(${offset})`);\n } else {\n offset += Math.round(pos[1] - this.drag_pos0);\n label_g.attr('transform', `translate(0,${offset})`);\n }\n if (!offset) label_g.attr('transform', null);\n\n if (arg == 'stop') {\n label_g.select('rect.zoom').remove();\n delete this.drag_pos0;\n if (offset != label_g.property('fix_offset')) {\n label_g.property('fix_offset', offset);\n let side = label_g.property('side') || 1;\n this.labelsOffset = offset / (this.vertical ? -side : side);\n this.changeAxisAttr(1, 'labels_offset', this.labelsOffset / this.scalingSize);\n }\n }\n\n return true;\n }\n\n /** @summary Add interactive elements to draw axes title */\n addTitleDrag(title_g, side) {\n if (!settings.MoveResize || isBatchMode()) return;\n\n let drag_rect = null,\n acc_x, acc_y, new_x, new_y, alt_pos, curr_indx,\n drag_move = d3_drag().subject(Object);\n\n drag_move\n .on('start', evnt => {\n\n evnt.sourceEvent.preventDefault();\n evnt.sourceEvent.stopPropagation();\n\n let box = title_g.node().getBBox(), // check that elements visible, request precise value\n title_length = this.vertical ? box.height : box.width;\n\n new_x = acc_x = title_g.property('shift_x');\n new_y = acc_y = title_g.property('shift_y');\n\n if (this.titlePos == 'center')\n curr_indx = 1;\n else\n curr_indx = (this.titlePos == 'left') ? 0 : 2;\n\n // let d = ((this.gr_range > 0) && this.vertical) ? title_length : 0;\n alt_pos = [0, this.gr_range/2, this.gr_range]; // possible positions\n let off = this.vertical ? -title_length : title_length,\n swap = this.isReverseAxis() ? 2 : 0;\n if (this.title_align == 'middle') {\n alt_pos[swap] += off/2;\n alt_pos[2-swap] -= off/2;\n } else if ((this.title_align == 'begin') ^ this.isTitleRotated()) {\n alt_pos[1] -= off/2;\n alt_pos[2-swap] -= off;\n } else { // end\n alt_pos[swap] += off;\n alt_pos[1] += off/2;\n }\n\n alt_pos[curr_indx] = this.vertical ? acc_y : acc_x;\n\n drag_rect = title_g.append('rect')\n .classed('zoom', true)\n .attr('x', box.x)\n .attr('y', box.y)\n .attr('width', box.width)\n .attr('height', box.height)\n .style('cursor', 'move');\n// .style('pointer-events','none'); // let forward double click to underlying elements\n }).on('drag', evnt => {\n if (!drag_rect) return;\n\n evnt.sourceEvent.preventDefault();\n evnt.sourceEvent.stopPropagation();\n\n acc_x += evnt.dx;\n acc_y += evnt.dy;\n\n let set_x, set_y,\n p = this.vertical ? acc_y : acc_x, besti = 0;\n\n for (let i=1; i<3; ++i)\n if (Math.abs(p - alt_pos[i]) < Math.abs(p - alt_pos[besti])) besti = i;\n\n if (this.vertical) {\n set_x = acc_x;\n set_y = alt_pos[besti];\n } else {\n set_x = alt_pos[besti];\n set_y = acc_y;\n }\n\n new_x = set_x; new_y = set_y; curr_indx = besti;\n title_g.attr('transform', 'translate(' + Math.round(new_x) + ',' + Math.round(new_y) + ')');\n\n }).on('end', evnt => {\n if (!drag_rect) return;\n\n evnt.sourceEvent.preventDefault();\n evnt.sourceEvent.stopPropagation();\n\n let basepos = title_g.property('basepos') || 0;\n\n title_g.property('shift_x', new_x)\n .property('shift_y', new_y);\n\n this.titleOffset = (this.vertical ? basepos - new_x : new_y - basepos) * side;\n\n if (curr_indx == 1) {\n this.titlePos = 'center';\n } else if (curr_indx == 0) {\n this.titlePos = 'left';\n } else {\n this.titlePos = 'right';\n }\n\n this.changeAxisAttr(0, 'title_position', this.titlePos, 'title_offset', this.titleOffset / this.scalingSize);\n\n drag_rect.remove();\n drag_rect = null;\n });\n\n title_g.style('cursor', 'move').call(drag_move);\n }\n\n /** @summary checks if value inside graphical range, taking into account delta */\n isInsideGrRange(pos, delta1, delta2) {\n if (!delta1) delta1 = 0;\n if (delta2 === undefined) delta2 = delta1;\n if (this.gr_range < 0)\n return (pos >= this.gr_range - delta2) && (pos <= delta1);\n return (pos >= -delta1) && (pos <= this.gr_range + delta2);\n }\n\n /** @summary returns graphical range */\n getGrRange(delta) {\n if (!delta) delta = 0;\n if (this.gr_range < 0)\n return this.gr_range - delta;\n return this.gr_range + delta;\n }\n\n /** @summary If axis direction is negative coordinates direction */\n isReverseAxis() {\n return !this.vertical !== (this.getGrRange() > 0);\n }\n\n /** @summary Draw axis ticks\n * @private */\n drawMainLine(axis_g) {\n let ending = '';\n\n if (this.endingSize && this.endingStyle) {\n let sz = (this.gr_range > 0) ? -this.endingSize : this.endingSize,\n sz7 = Math.round(sz*0.7);\n sz = Math.round(sz);\n if (this.vertical)\n ending = `l${sz7},${sz}M0,${this.gr_range}l${-sz7},${sz}`;\n else\n ending = `l${sz},${sz7}M${this.gr_range},0l${sz},${-sz7}`;\n }\n\n axis_g.append('svg:path')\n .attr('d','M0,0' + (this.vertical ? 'v' : 'h') + this.gr_range + ending)\n .call(this.lineatt.func)\n .style('fill', ending ? 'none' : null);\n }\n\n /** @summary Draw axis ticks\n * @return {Object} with gaps on left and right side\n * @private */\n drawTicks(axis_g, side, main_draw) {\n if (main_draw) this.ticks = [];\n\n this.handle.reset();\n\n let res = '', ticks_plusminus = 0;\n if (this.ticksSide == 'both') {\n side = 1;\n ticks_plusminus = 1;\n }\n\n while (this.handle.next(true)) {\n\n let h1 = Math.round(this.ticksSize/4), h2 = 0;\n\n if (this.handle.kind < 3)\n h1 = Math.round(this.ticksSize/2);\n\n let grpos = this.handle.grpos - this.axis_shift;\n\n if ((this.startingSize || this.endingSize) && !this.isInsideGrRange(grpos, -Math.abs(this.startingSize), -Math.abs(this.endingSize))) continue;\n\n if (this.handle.kind == 1) {\n // if not showing labels, not show large tick\n if ((this.kind == 'labels') || (this.format(this.handle.tick,true) !== null)) h1 = this.ticksSize;\n\n if (main_draw) this.ticks.push(grpos); // keep graphical positions of major ticks\n }\n\n if (ticks_plusminus > 0) {\n h2 = -h1;\n } else if (side < 0) {\n h2 = -h1; h1 = 0;\n } else {\n h2 = 0;\n }\n\n res += this.vertical ? `M${h1},${grpos}H${h2}` : `M${grpos},${-h1}V${-h2}`;\n }\n\n if (res)\n axis_g.append('svg:path')\n .attr('d', res)\n .style('stroke', this.ticksColor || this.lineatt.color)\n .style('stroke-width', !this.ticksWidth || (this.ticksWidth == 1) ? null : this.ticksWidth);\n\n let gap0 = Math.round(0.25*this.ticksSize), gap = Math.round(1.25*this.ticksSize);\n return { '-1': (side > 0) || ticks_plusminus ? gap : gap0,\n '1': (side < 0) || ticks_plusminus ? gap : gap0 };\n }\n\n /** @summary Performs labels drawing\n * @return {Promise} with gaps in both direction */\n async drawLabels(axis_g, side, gaps) {\n let center_lbls = this.isCenteredLabels(),\n rotate_lbls = this.labelsFont.angle != 0,\n textscale = 1, maxtextlen = 0, lbls_tilt = false,\n label_g = axis_g.append('svg:g').attr('class','axis_labels').property('side', side),\n lbl_pos = this.handle.lbl_pos || this.handle.major,\n max_lbl_width = 0, max_lbl_height = 0;\n\n // function called when text is drawn to analyze width, required to correctly scale all labels\n function process_drawtext_ready(painter) {\n\n max_lbl_width = Math.max(max_lbl_width, this.result_width);\n max_lbl_height = Math.max(max_lbl_height, this.result_height);\n\n let textwidth = this.result_width;\n\n if (textwidth && ((!painter.vertical && !rotate_lbls) || (painter.vertical && rotate_lbls)) && !painter.log) {\n let maxwidth = this.gap_before*0.45 + this.gap_after*0.45;\n if (!this.gap_before) maxwidth = 0.9*this.gap_after; else\n if (!this.gap_after) maxwidth = 0.9*this.gap_before;\n textscale = Math.min(textscale, maxwidth / textwidth);\n }\n\n if ((textscale > 0.0001) && (textscale < 0.8) && !painter.vertical && !rotate_lbls && (maxtextlen > 5) && (side > 0))\n lbls_tilt = true;\n\n let scale = textscale * (lbls_tilt ? 3 : 1);\n if ((scale > 0.0001) && (scale < 1))\n painter.scaleTextDrawing(1/scale, label_g);\n }\n\n let lastpos = 0,\n fix_offset = Math.round((this.vertical ? -side : side) * this.labelsOffset),\n fix_coord = Math.round((this.vertical ? -side : side) * gaps[side]);\n\n if (fix_offset)\n label_g.attr('transform', this.vertical ? `translate(${fix_offset})` : `translate(0,${fix_offset})`);\n\n label_g.property('fix_offset', fix_offset);\n\n this.startTextDrawing(this.labelsFont, 'font', label_g);\n\n for (let nmajor = 0; nmajor < lbl_pos.length; ++nmajor) {\n\n let lbl = this.format(lbl_pos[nmajor], true);\n if (lbl === null) continue;\n\n let pos = Math.round(this.func(lbl_pos[nmajor])),\n arg = { text: lbl, latex: 1, draw_g: label_g };\n\n arg.gap_before = (nmajor > 0) ? Math.abs(Math.round(pos - this.func(lbl_pos[nmajor-1]))) : 0,\n arg.gap_after = (nmajor < lbl_pos.length-1) ? Math.abs(Math.round(this.func(lbl_pos[nmajor+1])-pos)) : 0;\n\n if (center_lbls) {\n let gap = arg.gap_after || arg.gap_before;\n pos = Math.round(pos - (this.vertical ? 0.5*gap : -0.5*gap));\n if (!this.isInsideGrRange(pos, 5)) continue;\n }\n\n maxtextlen = Math.max(maxtextlen, lbl.length);\n\n pos -= this.axis_shift;\n\n if ((this.startingSize || this.endingSize) && !this.isInsideGrRange(pos, -Math.abs(this.startingSize), -Math.abs(this.endingSize))) continue;\n\n if (this.vertical) {\n arg.x = fix_coord;\n arg.y = pos;\n arg.align = rotate_lbls ? ((side < 0) ? 23 : 20) : ((side < 0) ? 12 : 32);\n } else {\n arg.x = pos;\n arg.y = fix_coord;\n arg.align = rotate_lbls ? ((side < 0) ? 12 : 32) : ((side < 0) ? 20 : 23);\n }\n\n arg.post_process = process_drawtext_ready;\n\n this.drawText(arg);\n\n if (lastpos && (pos!=lastpos) && ((this.vertical && !rotate_lbls) || (!this.vertical && rotate_lbls))) {\n let axis_step = Math.abs(pos-lastpos);\n textscale = Math.min(textscale, 0.9*axis_step/this.labelsFont.size);\n }\n\n lastpos = pos;\n }\n\n if (this.order)\n this.drawText({ x: this.vertical ? side*5 : this.getGrRange(5),\n y: this.has_obstacle ? fix_coord : (this.vertical ? this.getGrRange(3) : -3*side),\n align: this.vertical ? ((side < 0) ? 30 : 10) : ((this.has_obstacle ^ (side < 0)) ? 13 : 10),\n latex: 1,\n text: '#times' + this.formatExp(10, this.order),\n draw_g: label_g\n });\n\n return this.finishTextDrawing(label_g).then(() => {\n\n if (lbls_tilt)\n label_g.selectAll('text').each(function () {\n let txt = d3_select(this), tr = txt.attr('transform');\n txt.attr('transform', tr + ' rotate(25)').style('text-anchor', 'start');\n });\n\n if (this.vertical) {\n gaps[side] += Math.round(rotate_lbls ? 1.2*max_lbl_height : max_lbl_width + 0.4*this.labelsFont.size) - side*fix_offset;\n } else {\n let tilt_height = lbls_tilt ? max_lbl_width * Math.sin(25/180*Math.PI) + max_lbl_height * (Math.cos(25/180*Math.PI) + 0.2) : 0;\n\n gaps[side] += Math.round(Math.max(rotate_lbls ? max_lbl_width + 0.4*this.labelsFont.size : 1.2*max_lbl_height, 1.2*this.labelsFont.size, tilt_height)) + fix_offset;\n }\n\n return gaps;\n });\n }\n\n /** @summary Add zomming rect to axis drawing */\n addZoomingRect(axis_g, side, lgaps) {\n if (settings.Zooming && !this.disable_zooming && !isBatchMode()) {\n let sz = Math.max(lgaps[side], 10),\n d = this.vertical ? `v${this.gr_range}h${-side*sz}v${-this.gr_range}`\n : `h${this.gr_range}v${side*sz}h${-this.gr_range}`;\n axis_g.append('svg:path')\n .attr('d',`M0,0${d}z`)\n .attr('class', 'axis_zoom')\n .style('opacity', '0')\n .style('cursor', 'crosshair');\n }\n }\n\n /** @summary Returns true if axis title is rotated */\n isTitleRotated() {\n return this.titleFont && (this.titleFont.angle != (this.vertical ? 270 : 0));\n }\n\n /** @summary Draw axis title */\n async drawTitle(axis_g, side, lgaps) {\n if (!this.fTitle)\n return this;\n\n let title_g = axis_g.append('svg:g').attr('class', 'axis_title'),\n title_shift_x = 0, title_shift_y = 0, title_basepos = 0;\n\n let rotated = this.isTitleRotated();\n\n this.startTextDrawing(this.titleFont, 'font', title_g);\n\n this.title_align = this.titleCenter ? 'middle' : (this.titleOpposite ^ (this.isReverseAxis() || rotated) ? 'begin' : 'end');\n\n if (this.vertical) {\n title_basepos = Math.round(-side*(lgaps[side]));\n title_shift_x = title_basepos + Math.round(-side*this.titleOffset);\n title_shift_y = Math.round(this.titleCenter ? this.gr_range/2 : (this.titleOpposite ? 0 : this.gr_range));\n this.drawText({ align: [this.title_align, ((side < 0) ^ rotated ? 'top' : 'bottom')],\n text: this.fTitle, draw_g: title_g });\n } else {\n title_shift_x = Math.round(this.titleCenter ? this.gr_range/2 : (this.titleOpposite ? 0 : this.gr_range));\n title_basepos = Math.round(side*lgaps[side]);\n title_shift_y = title_basepos + Math.round(side*this.titleOffset);\n this.drawText({ align: [this.title_align, ((side > 0) ^ rotated ? 'top' : 'bottom')],\n text: this.fTitle, draw_g: title_g });\n }\n\n title_g.attr('transform', `translate(${title_shift_x},${title_shift_y})`)\n .property('basepos', title_basepos)\n .property('shift_x', title_shift_x)\n .property('shift_y', title_shift_y);\n\n this.addTitleDrag(title_g, side);\n\n return this.finishTextDrawing(title_g);\n }\n\n /** @summary Extract major draw attributes, which are also used in interactive operations\n * @private */\n extractDrawAttributes(scalingSize) {\n let pp = this.getPadPainter(),\n rect = pp?.getPadRect() || { width: 10, height: 10 };\n\n this.scalingSize = scalingSize || (this.vertical ? rect.width : rect.height);\n\n this.createv7AttLine('line_');\n\n this.optionUnlab = this.v7EvalAttr('labels_hide', false);\n\n this.endingStyle = this.v7EvalAttr('ending_style', '');\n this.endingSize = Math.round(this.v7EvalLength('ending_size', this.scalingSize, this.endingStyle ? 0.02 : 0));\n this.startingSize = Math.round(this.v7EvalLength('starting_size', this.scalingSize, 0));\n this.ticksSize = this.v7EvalLength('ticks_size', this.scalingSize, 0.02);\n this.ticksSide = this.v7EvalAttr('ticks_side', 'normal');\n this.ticksColor = this.v7EvalColor('ticks_color', '');\n this.ticksWidth = this.v7EvalAttr('ticks_width', 1);\n if (scalingSize && (this.ticksSize < 0))\n this.ticksSize = -this.ticksSize;\n\n this.fTitle = this.v7EvalAttr('title_value', '');\n\n if (this.fTitle) {\n this.titleFont = this.v7EvalFont('title', { size: 0.03 }, scalingSize || pp?.getPadHeight() || 10);\n this.titleFont.roundAngle(180, this.vertical ? 270 : 0);\n\n this.titleOffset = this.v7EvalLength('title_offset', this.scalingSize, 0);\n this.titlePos = this.v7EvalAttr('title_position', 'right');\n this.titleCenter = (this.titlePos == 'center');\n this.titleOpposite = (this.titlePos == 'left');\n } else {\n delete this.titleFont;\n delete this.titleOffset;\n delete this.titlePos;\n }\n\n // TODO: remove old scaling factors for labels and ticks\n this.labelsFont = this.v7EvalFont('labels', { size: scalingSize ? 0.05 : 0.03 });\n this.labelsFont.roundAngle(180);\n if (this.labelsFont.angle) this.labelsFont.angle = 270;\n this.labelsOffset = this.v7EvalLength('labels_offset', this.scalingSize, 0);\n\n if (scalingSize) this.ticksSize = this.labelsFont.size*0.5; // old lego scaling factor\n\n if (this.maxTickSize && (this.ticksSize > this.maxTickSize))\n this.ticksSize = this.maxTickSize;\n }\n\n /** @summary Performs axis drawing\n * @return {Promise} which resolved when drawing is completed */\n async drawAxis(layer, transform, side) {\n let axis_g = layer;\n\n if (side === undefined) side = 1;\n\n if (!this.standalone) {\n axis_g = layer.select('.' + this.name + '_container');\n if (axis_g.empty())\n axis_g = layer.append('svg:g').attr('class', this.name + '_container');\n else\n axis_g.selectAll('*').remove();\n }\n\n axis_g.attr('transform', transform || null);\n\n this.extractDrawAttributes();\n this.axis_g = axis_g;\n this.side = side;\n\n if (this.ticksSide == 'invert') side = -side;\n\n if (this.standalone)\n this.drawMainLine(axis_g);\n\n let optionNoopt = false, // no ticks position optimization\n optionInt = false, // integer labels\n optionNoexp = false; // do not create exp\n\n this.handle = this.createTicks(false, optionNoexp, optionNoopt, optionInt);\n\n // first draw ticks\n let tgaps = this.drawTicks(axis_g, side, true);\n\n // draw labels\n let labelsPromise = this.optionUnlab ? Promise.resolve(tgaps) : this.drawLabels(axis_g, side, tgaps);\n\n return labelsPromise.then(lgaps => {\n // when drawing axis on frame, zoom rect should be always outside\n this.addZoomingRect(axis_g, this.standalone ? side : this.side, lgaps);\n\n return this.drawTitle(axis_g, side, lgaps);\n });\n }\n\n /** @summary Assign handler, which is called when axis redraw by interactive changes\n * @desc Used by palette painter to reassign iteractive handlers\n * @private */\n setAfterDrawHandler(handler) {\n this._afterDrawAgain = handler;\n }\n\n /** @summary Draw axis with the same settings, used by interactive changes */\n drawAxisAgain() {\n if (!this.axis_g || !this.side) return;\n\n this.axis_g.selectAll('*').remove();\n\n this.extractDrawAttributes();\n\n let side = this.side;\n if (this.ticksSide == 'invert') side = -side;\n\n if (this.standalone)\n this.drawMainLine(this.axis_g);\n\n // first draw ticks\n let tgaps = this.drawTicks(this.axis_g, side, false);\n\n let labelsPromise = this.optionUnlab ? Promise.resolve(tgaps) : this.drawLabels(this.axis_g, side, tgaps);\n\n return labelsPromise.then(lgaps => {\n // when drawing axis on frame, zoom rect should be always outside\n this.addZoomingRect(this.axis_g, this.standalone ? side : this.side, lgaps);\n\n return this.drawTitle(this.axis_g, side, lgaps);\n }).then(() => {\n if (isFunc(this._afterDrawAgain))\n this._afterDrawAgain();\n });\n }\n\n /** @summary Draw axis again on opposite frame size */\n drawAxisOtherPlace(layer, transform, side, only_ticks) {\n let axis_g = layer.select('.' + this.name + '_container2');\n if (axis_g.empty())\n axis_g = layer.append('svg:g').attr('class',this.name + '_container2');\n else\n axis_g.selectAll('*').remove();\n\n axis_g.attr('transform', transform || null);\n\n if (this.ticksSide == 'invert') side = -side;\n\n // draw ticks again\n let tgaps = this.drawTicks(axis_g, side, false);\n\n // draw labels again\n let promise = this.optionUnlab || only_ticks ? Promise.resolve(tgaps) : this.drawLabels(axis_g, side, tgaps);\n\n return promise.then(lgaps => {\n this.addZoomingRect(axis_g, side, lgaps);\n return true;\n });\n }\n\n /** @summary Change zooming in standalone mode */\n zoomStandalone(min,max) {\n this.changeAxisAttr(1, 'zoomMin', min, 'zoomMax', max);\n }\n\n /** @summary Redraw axis, used in standalone mode for RAxisDrawable */\n redraw() {\n\n let drawable = this.getObject(),\n pp = this.getPadPainter(),\n pos = pp.getCoordinate(drawable.fPos),\n len = pp.getPadLength(drawable.fVertical, drawable.fLength),\n reverse = this.v7EvalAttr('reverse', false),\n labels_len = drawable.fLabels.length,\n min = (labels_len > 0) ? 0 : this.v7EvalAttr('min', 0),\n max = (labels_len > 0) ? labels_len : this.v7EvalAttr('max', 100);\n\n // in vertical direction axis drawn in negative direction\n if (drawable.fVertical) len -= pp.getPadHeight();\n\n let smin = this.v7EvalAttr('zoomMin'),\n smax = this.v7EvalAttr('zoomMax');\n if (smin === smax) {\n smin = min; smax = max;\n }\n\n this.configureAxis('axis', min, max, smin, smax, drawable.fVertical, undefined, len, { reverse, labels: labels_len > 0 });\n\n this.createG();\n\n this.standalone = true; // no need to clean axis container\n\n let promise = this.drawAxis(this.draw_g, `translate(${pos.x},${pos.y})`);\n\n if (isBatchMode()) return promise;\n\n return promise.then(() => {\n if (settings.ContextMenu)\n this.draw_g.on('contextmenu', evnt => {\n evnt.stopPropagation(); // disable main context menu\n evnt.preventDefault(); // disable browser context menu\n createMenu(evnt, this).then(menu => {\n menu.add('header:RAxisDrawable');\n menu.add('Unzoom', () => this.zoomStandalone());\n this.fillAxisContextMenu(menu, '');\n menu.show();\n });\n });\n\n addDragHandler(this, { x: pos.x, y: pos.y, width: this.vertical ? 10 : len, height: this.vertical ? len : 10,\n only_move: true, redraw: d => this.positionChanged(d) });\n\n this.draw_g.on('dblclick', () => this.zoomStandalone());\n\n if (settings.ZoomWheel)\n this.draw_g.on('wheel', evnt => {\n evnt.stopPropagation();\n evnt.preventDefault();\n\n let pos = d3_pointer(evnt, this.draw_g.node()),\n coord = this.vertical ? (1 - pos[1] / len) : pos[0] / len,\n item = this.analyzeWheelEvent(evnt, coord);\n\n if (item.changed) this.zoomStandalone(item.min, item.max);\n });\n });\n }\n\n /** @summary Process interactive moving of the axis drawing */\n positionChanged(drag) {\n let drawable = this.getObject(),\n rect = this.getPadPainter().getPadRect(),\n xn = drag.x / rect.width,\n yn = 1 - drag.y / rect.height;\n\n drawable.fPos.fHoriz.fArr = [ xn ];\n drawable.fPos.fVert.fArr = [ yn ];\n\n this.submitCanvExec(`SetPos({${xn.toFixed(4)},${yn.toFixed(4)}})`);\n }\n\n /** @summary Change axis attribute, submit changes to server and redraw axis when specified\n * @desc Arguments as redraw_mode, name1, value1, name2, value2, ... */\n changeAxisAttr(redraw_mode) {\n let changes = {}, indx = 1;\n while (indx < arguments.length - 1) {\n this.v7AttrChange(changes, arguments[indx], arguments[indx+1]);\n this.v7SetAttr(arguments[indx], arguments[indx+1]);\n indx += 2;\n }\n this.v7SendAttrChanges(changes, false); // do not invoke canvas update on the server\n if (redraw_mode === 1) {\n if (this.standalone)\n this.redraw();\n else\n this.drawAxisAgain();\n } else if (redraw_mode)\n this.redrawPad();\n }\n\n /** @summary Change axis log scale kind */\n changeAxisLog(arg) {\n if ((this.kind == 'labels') || (this.kind == 'time')) return;\n if (arg === 'toggle') arg = this.log ? 0 : 10;\n\n arg = parseFloat(arg);\n if (Number.isFinite(arg)) this.changeAxisAttr(2, 'log', arg, 'symlog', 0);\n }\n\n /** @summary Provide context menu for axis */\n fillAxisContextMenu(menu, kind) {\n\n if (kind) menu.add('Unzoom', () => this.getFramePainter().unzoom(kind));\n\n menu.add('sub:Log scale', () => this.changeAxisLog('toggle'));\n menu.addchk(!this.log && !this.symlog, 'linear', 0, arg => this.changeAxisLog(arg));\n menu.addchk(this.log && !this.symlog && (this.logbase == 10), 'log10', () => this.changeAxisLog(10));\n menu.addchk(this.log && !this.symlog && (this.logbase == 2), 'log2', () => this.changeAxisLog(2));\n menu.addchk(this.log && !this.symlog && Math.abs(this.logbase - Math.exp(1)) < 0.1, 'ln', () => this.changeAxisLog(Math.exp(1)));\n menu.addchk(!this.log && this.symlog, 'symlog', 0, () =>\n menu.input('set symlog constant', this.symlog || 10, 'float').then(v => this.changeAxisAttr(2,'symlog', v)));\n menu.add('endsub:');\n\n menu.add('Divisions', () => menu.input('Set axis devisions', this.v7EvalAttr('ndiv', 508), 'int').then(val => this.changeAxisAttr(2, 'ndiv', val)));\n\n menu.add('sub:Ticks');\n menu.addRColorMenu('color', this.ticksColor, col => this.changeAxisAttr(1, 'ticks_color', col));\n menu.addSizeMenu('size', 0, 0.05, 0.01, this.ticksSize/this.scalingSize, sz => this.changeAxisAttr(1, 'ticks_size', sz));\n menu.addSelectMenu('side', ['normal', 'invert', 'both'], this.ticksSide, side => this.changeAxisAttr(1, 'ticks_side', side));\n menu.add('endsub:');\n\n if (!this.optionUnlab && this.labelsFont) {\n menu.add('sub:Labels');\n menu.addSizeMenu('offset', -0.05, 0.05, 0.01, this.labelsOffset/this.scalingSize,\n offset => this.changeAxisAttr(1, 'labels_offset', offset));\n menu.addRAttrTextItems(this.labelsFont, { noangle: 1, noalign: 1 },\n change => this.changeAxisAttr(1, 'labels_' + change.name, change.value));\n menu.addchk(this.labelsFont.angle, 'rotate', res => this.changeAxisAttr(1, 'labels_angle', res ? 180 : 0));\n menu.add('endsub:');\n }\n\n menu.add('sub:Title', () => menu.input('Enter axis title', this.fTitle).then(t => this.changeAxisAttr(1, 'title_value', t)));\n\n if (this.fTitle) {\n menu.addSizeMenu('offset', -0.05, 0.05, 0.01, this.titleOffset/this.scalingSize,\n offset => this.changeAxisAttr(1, 'title_offset', offset));\n\n menu.addSelectMenu('position', ['left', 'center', 'right'], this.titlePos,\n pos => this.changeAxisAttr(1, 'title_position', pos));\n\n menu.addchk(this.isTitleRotated(), 'rotate', flag => this.changeAxisAttr(1, 'title_angle', flag ? 180 : 0));\n\n menu.addRAttrTextItems(this.titleFont, { noangle: 1, noalign: 1 }, change => this.changeAxisAttr(1, 'title_' + change.name, change.value));\n }\n\n menu.add('endsub:');\n return true;\n }\n\n} // class RAxisPainter\n\nexport { RAxisPainter };\n","import { gStyle, settings, create, isBatchMode, isFunc, isStr, clTAxis } from '../core.mjs';\nimport { pointer as d3_pointer } from '../d3.mjs';\nimport { getSvgLineStyle } from '../base/TAttLineHandler.mjs';\nimport { TAxisPainter } from './TAxisPainter.mjs';\nimport { RAxisPainter } from './RAxisPainter.mjs';\nimport { FrameInteractive } from './TFramePainter.mjs';\nimport { RObjectPainter } from '../base/RObjectPainter.mjs';\n\n\n/**\n * @summary Painter class for RFrame, main handler for interactivity\n *\n * @private\n */\n\nclass RFramePainter extends RObjectPainter {\n\n /** @summary constructor\n * @param {object|string} dom - DOM element for drawing or element id\n * @param {object} tframe - RFrame object */\n constructor(dom, tframe) {\n super(dom, tframe, '', 'frame');\n this.mode3d = false;\n this.xmin = this.xmax = 0; // no scale specified, wait for objects drawing\n this.ymin = this.ymax = 0; // no scale specified, wait for objects drawing\n this.axes_drawn = false;\n this.keys_handler = null;\n this.projection = 0; // different projections\n this.v7_frame = true; // indicator of v7, used in interactive part\n }\n\n /** @summary Returns frame painter - object itself */\n getFramePainter() { return this; }\n\n /** @summary Returns true if it is ROOT6 frame\n * @private */\n is_root6() { return false; }\n\n /** @summary Set active flag for frame - can block some events\n * @private */\n setFrameActive(on) {\n this.enabledKeys = on && settings.HandleKeys ? true : false;\n // used only in 3D mode\n if (this.control)\n this.control.enableKeys = this.enabledKeys;\n }\n\n setLastEventPos(pnt) {\n // set position of last context menu event, can be\n this.fLastEventPnt = pnt;\n }\n\n getLastEventPos() {\n // return position of last event\n return this.fLastEventPnt;\n }\n\n /** @summary Update graphical attributes */\n updateAttributes(force) {\n if ((this.fX1NDC === undefined) || (force && !this.modified_NDC)) {\n\n let rect = this.getPadPainter().getPadRect();\n this.fX1NDC = this.v7EvalLength('margins_left', rect.width, settings.FrameNDC.fX1NDC) / rect.width;\n this.fY1NDC = this.v7EvalLength('margins_bottom', rect.height, settings.FrameNDC.fY1NDC) / rect.height;\n this.fX2NDC = 1 - this.v7EvalLength('margins_right', rect.width, 1-settings.FrameNDC.fX2NDC) / rect.width;\n this.fY2NDC = 1 - this.v7EvalLength('margins_top', rect.height, 1-settings.FrameNDC.fY2NDC) / rect.height;\n }\n\n if (!this.fillatt)\n this.createv7AttFill();\n\n this.createv7AttLine('border_');\n }\n\n /** @summary Returns coordinates transformation func */\n getProjectionFunc() {\n switch (this.projection) {\n // Aitoff2xy\n case 1: return (l, b) => {\n const DegToRad = Math.PI/180,\n alpha2 = (l/2)*DegToRad,\n delta = b*DegToRad,\n r2 = Math.sqrt(2),\n f = 2*r2/Math.PI,\n cdec = Math.cos(delta),\n denom = Math.sqrt(1. + cdec*Math.cos(alpha2));\n return {\n x: cdec*Math.sin(alpha2)*2.*r2/denom/f/DegToRad,\n y: Math.sin(delta)*r2/denom/f/DegToRad\n };\n };\n // mercator\n case 2: return (l, b) => { return { x: l, y: Math.log(Math.tan((Math.PI/2 + b/180*Math.PI)/2)) }; };\n // sinusoidal\n case 3: return (l, b) => { return { x: l*Math.cos(b/180*Math.PI), y: b } };\n // parabolic\n case 4: return (l, b) => { return { x: l*(2.*Math.cos(2*b/180*Math.PI/3) - 1), y: 180*Math.sin(b/180*Math.PI/3) }; };\n }\n }\n\n /** @summary Rcalculate frame ranges using specified projection functions\n * @desc Not yet used in v7 */\n recalculateRange(Proj) {\n this.projection = Proj || 0;\n\n if ((this.projection == 2) && ((this.scale_ymin <= -90 || this.scale_ymax >=90))) {\n console.warn(`Mercator Projection: latitude out of range ${this.scale_ymin} ${this.scale_ymax}`);\n this.projection = 0;\n }\n\n let func = this.getProjectionFunc();\n if (!func) return;\n\n let pnts = [ func(this.scale_xmin, this.scale_ymin),\n func(this.scale_xmin, this.scale_ymax),\n func(this.scale_xmax, this.scale_ymax),\n func(this.scale_xmax, this.scale_ymin) ];\n if (this.scale_xmin < 0 && this.scale_xmax > 0) {\n pnts.push(func(0, this.scale_ymin));\n pnts.push(func(0, this.scale_ymax));\n }\n if (this.scale_ymin < 0 && this.scale_ymax > 0) {\n pnts.push(func(this.scale_xmin, 0));\n pnts.push(func(this.scale_xmax, 0));\n }\n\n this.original_xmin = this.scale_xmin;\n this.original_xmax = this.scale_xmax;\n this.original_ymin = this.scale_ymin;\n this.original_ymax = this.scale_ymax;\n\n this.scale_xmin = this.scale_xmax = pnts[0].x;\n this.scale_ymin = this.scale_ymax = pnts[0].y;\n\n for (let n = 1; n < pnts.length; ++n) {\n this.scale_xmin = Math.min(this.scale_xmin, pnts[n].x);\n this.scale_xmax = Math.max(this.scale_xmax, pnts[n].x);\n this.scale_ymin = Math.min(this.scale_ymin, pnts[n].y);\n this.scale_ymax = Math.max(this.scale_ymax, pnts[n].y);\n }\n }\n\n /** @summary Draw axes grids\n * @desc Called immediately after axes drawing */\n drawGrids() {\n let layer = this.getFrameSvg().select('.grid_layer');\n\n layer.selectAll('.xgrid').remove();\n layer.selectAll('.ygrid').remove();\n\n let h = this.getFrameHeight(),\n w = this.getFrameWidth(),\n gridx = this.v7EvalAttr('gridX', false),\n gridy = this.v7EvalAttr('gridY', false),\n grid_style = getSvgLineStyle(gStyle.fGridStyle),\n grid_color = (gStyle.fGridColor > 0) ? this.getColor(gStyle.fGridColor) : 'black';\n\n if (this.x_handle)\n this.x_handle.draw_grid = gridx;\n\n // add a grid on x axis, if the option is set\n if (this.x_handle && this.x_handle.draw_grid) {\n let grid = '';\n for (let n = 0; n < this.x_handle.ticks.length; ++n)\n if (this.swap_xy)\n grid += `M0,${h+this.x_handle.ticks[n]}h${w}`;\n else\n grid += `M${this.x_handle.ticks[n]},0v${h}`;\n\n if (grid)\n layer.append('svg:path')\n .attr('class', 'xgrid')\n .attr('d', grid)\n .style('stroke',grid_color)\n .style('stroke-width', gStyle.fGridWidth)\n .style('stroke-dasharray', grid_style);\n }\n\n if (this.y_handle)\n this.y_handle.draw_grid = gridy;\n\n // add a grid on y axis, if the option is set\n if (this.y_handle && this.y_handle.draw_grid) {\n let grid = '';\n for (let n = 0; n < this.y_handle.ticks.length; ++n)\n if (this.swap_xy)\n grid += `M${this.y_handle.ticks[n]},0v${h}`;\n else\n grid += `M0,${h+this.y_handle.ticks[n]}h${w}`;\n\n if (grid)\n layer.append('svg:path')\n .attr('class', 'ygrid')\n .attr('d', grid)\n .style('stroke', grid_color)\n .style('stroke-width', gStyle.fGridWidth)\n .style('stroke-dasharray', grid_style);\n }\n }\n\n /** @summary Converts 'raw' axis value into text */\n axisAsText(axis, value) {\n let handle = this[axis+'_handle'];\n\n if (handle)\n return handle.axisAsText(value, settings[axis.toUpperCase() + 'ValuesFormat']);\n\n return value.toPrecision(4);\n }\n\n /** @summary Set axix range */\n _setAxisRange(prefix, vmin, vmax) {\n let nmin = prefix + 'min', nmax = prefix + 'max';\n if (this[nmin] != this[nmax]) return;\n let min = this.v7EvalAttr(prefix + '_min'),\n max = this.v7EvalAttr(prefix + '_max');\n\n if (min !== undefined) vmin = min;\n if (max !== undefined) vmax = max;\n\n if (vmin < vmax) {\n this[nmin] = vmin;\n this[nmax] = vmax;\n }\n\n let nzmin = 'zoom_' + prefix + 'min', nzmax = 'zoom_' + prefix + 'max';\n\n if ((this[nzmin] == this[nzmax]) && !this.zoomChangedInteractive(prefix)) {\n min = this.v7EvalAttr(prefix + '_zoomMin');\n max = this.v7EvalAttr(prefix + '_zoomMax');\n\n if ((min !== undefined) || (max !== undefined)) {\n this[nzmin] = (min === undefined) ? this[nmin] : min;\n this[nzmax] = (max === undefined) ? this[nmax] : max;\n }\n }\n }\n\n /** @summary Set axes ranges for drawing, check configured attributes if range already specified */\n setAxesRanges(xaxis, xmin, xmax, yaxis, ymin, ymax, zaxis, zmin, zmax) {\n if (this.axes_drawn) return;\n this.xaxis = xaxis;\n this._setAxisRange('x', xmin, xmax);\n this.yaxis = yaxis;\n this._setAxisRange('y', ymin, ymax);\n this.zaxis = zaxis;\n this._setAxisRange('z', zmin, zmax);\n }\n\n /** @summary Set secondary axes ranges */\n setAxes2Ranges(second_x, xaxis, xmin, xmax, second_y, yaxis, ymin, ymax) {\n if (second_x) {\n this.x2axis = xaxis;\n this._setAxisRange('x2', xmin, xmax);\n }\n if (second_y) {\n this.y2axis = yaxis;\n this._setAxisRange('y2', ymin, ymax);\n }\n }\n\n /** @summary Create x,y objects which maps user coordinates into pixels\n * @desc Must be used only for v6 objects, see TFramePainter for more details\n * @private */\n createXY(opts) {\n if (this.self_drawaxes) return;\n\n this.cleanXY(); // remove all previous configurations\n\n if (!opts) opts = {};\n\n this.v6axes = true;\n this.swap_xy = opts.swap_xy || false;\n this.reverse_x = opts.reverse_x || false;\n this.reverse_y = opts.reverse_y || false;\n\n this.logx = this.v7EvalAttr('x_log', 0);\n this.logy = this.v7EvalAttr('y_log', 0);\n\n let w = this.getFrameWidth(), h = this.getFrameHeight();\n\n this.scale_xmin = this.xmin;\n this.scale_xmax = this.xmax;\n\n this.scale_ymin = this.ymin;\n this.scale_ymax = this.ymax;\n\n if (opts.extra_y_space) {\n let log_scale = this.swap_xy ? this.logx : this.logy;\n if (log_scale && (this.scale_ymax > 0))\n this.scale_ymax = Math.exp(Math.log(this.scale_ymax)*1.1);\n else\n this.scale_ymax += (this.scale_ymax - this.scale_ymin)*0.1;\n }\n\n // if (opts.check_pad_range) {\n // take zooming out of pad or axis attributes - skip!\n // }\n\n if ((this.zoom_ymin == this.zoom_ymax) && (opts.zoom_ymin != opts.zoom_ymax) && !this.zoomChangedInteractive('y')) {\n this.zoom_ymin = opts.zoom_ymin;\n this.zoom_ymax = opts.zoom_ymax;\n }\n\n if (this.zoom_xmin != this.zoom_xmax) {\n this.scale_xmin = this.zoom_xmin;\n this.scale_xmax = this.zoom_xmax;\n }\n\n if (this.zoom_ymin != this.zoom_ymax) {\n this.scale_ymin = this.zoom_ymin;\n this.scale_ymax = this.zoom_ymax;\n }\n\n let xaxis = this.xaxis, yaxis = this.yaxis;\n if (xaxis?._typename != clTAxis) xaxis = create(clTAxis);\n if (yaxis?._typename != clTAxis) yaxis = create(clTAxis);\n\n this.x_handle = new TAxisPainter(this.getDom(), xaxis, true);\n this.x_handle.setPadName(this.getPadName());\n this.x_handle.optionUnlab = this.v7EvalAttr('x_labels_hide', false);\n\n this.x_handle.configureAxis('xaxis', this.xmin, this.xmax, this.scale_xmin, this.scale_xmax, this.swap_xy, this.swap_xy ? [0,h] : [0,w],\n { reverse: this.reverse_x,\n log: this.swap_xy ? this.logy : this.logx,\n symlog: this.swap_xy ? opts.symlog_y : opts.symlog_x,\n logcheckmin: this.swap_xy,\n logminfactor: 0.0001 });\n\n this.x_handle.assignFrameMembers(this,'x');\n\n this.y_handle = new TAxisPainter(this.getDom(), yaxis, true);\n this.y_handle.setPadName(this.getPadName());\n this.y_handle.optionUnlab = this.v7EvalAttr('y_labels_hide', false);\n\n this.y_handle.configureAxis('yaxis', this.ymin, this.ymax, this.scale_ymin, this.scale_ymax, !this.swap_xy, this.swap_xy ? [0,w] : [0,h],\n { reverse: this.reverse_y,\n log: this.swap_xy ? this.logx : this.logy,\n symlog: this.swap_xy ? opts.symlog_x : opts.symlog_y,\n logcheckmin: (opts.ndim < 2) || this.swap_xy,\n log_min_nz: opts.ymin_nz && (opts.ymin_nz < 0.01*this.ymax) ? 0.3 * opts.ymin_nz : 0,\n logminfactor: 3e-4 });\n\n this.y_handle.assignFrameMembers(this,'y');\n }\n\n /** @summary Identify if requested axes are drawn\n * @desc Checks if x/y axes are drawn. Also if second side is already there */\n hasDrawnAxes(second_x, second_y) {\n return !second_x && !second_y ? this.axes_drawn : false;\n }\n\n /** @summary Draw configured axes on the frame\n * @desc axes can be drawn only for main histogram */\n async drawAxes() {\n\n if (this.axes_drawn || (this.xmin == this.xmax) || (this.ymin == this.ymax))\n return this.axes_drawn;\n\n let ticksx = this.v7EvalAttr('ticksX', 1),\n ticksy = this.v7EvalAttr('ticksY', 1),\n sidex = 1, sidey = 1;\n\n if (this.v7EvalAttr('swapX', false)) sidex = -1;\n if (this.v7EvalAttr('swapY', false)) sidey = -1;\n\n let w = this.getFrameWidth(), h = this.getFrameHeight();\n\n if (!this.v6axes) {\n // this is partially same as v6 createXY method\n\n this.cleanupAxes();\n\n this.swap_xy = false;\n\n if (this.zoom_xmin != this.zoom_xmax) {\n this.scale_xmin = this.zoom_xmin;\n this.scale_xmax = this.zoom_xmax;\n } else {\n this.scale_xmin = this.xmin;\n this.scale_xmax = this.xmax;\n }\n\n if (this.zoom_ymin != this.zoom_ymax) {\n this.scale_ymin = this.zoom_ymin;\n this.scale_ymax = this.zoom_ymax;\n } else {\n this.scale_ymin = this.ymin;\n this.scale_ymax = this.ymax;\n }\n\n this.recalculateRange(0);\n\n this.x_handle = new RAxisPainter(this.getDom(), this, this.xaxis, 'x_');\n this.x_handle.setPadName(this.getPadName());\n this.x_handle.snapid = this.snapid;\n this.x_handle.draw_swapside = (sidex < 0);\n this.x_handle.draw_ticks = ticksx;\n\n this.y_handle = new RAxisPainter(this.getDom(), this, this.yaxis, 'y_');\n this.y_handle.setPadName(this.getPadName());\n this.y_handle.snapid = this.snapid;\n this.y_handle.draw_swapside = (sidey < 0);\n this.y_handle.draw_ticks = ticksy;\n\n this.z_handle = new RAxisPainter(this.getDom(), this, this.zaxis, 'z_');\n this.z_handle.setPadName(this.getPadName());\n this.z_handle.snapid = this.snapid;\n\n this.x_handle.configureAxis('xaxis', this.xmin, this.xmax, this.scale_xmin, this.scale_xmax, false, [0,w], w, { reverse: false });\n this.x_handle.assignFrameMembers(this,'x');\n\n this.y_handle.configureAxis('yaxis', this.ymin, this.ymax, this.scale_ymin, this.scale_ymax, true, [h,0], -h, { reverse: false });\n this.y_handle.assignFrameMembers(this,'y');\n\n // only get basic properties like log scale\n this.z_handle.configureZAxis('zaxis', this);\n }\n\n let layer = this.getFrameSvg().select('.axis_layer');\n\n this.x_handle.has_obstacle = false;\n\n let draw_horiz = this.swap_xy ? this.y_handle : this.x_handle,\n draw_vertical = this.swap_xy ? this.x_handle : this.y_handle,\n pp = this.getPadPainter(), pr;\n\n if (pp?._fast_drawing) {\n pr = Promise.resolve(true); // do nothing\n } else if (this.v6axes) {\n\n // in v7 ticksx/y values shifted by 1 relative to v6\n // In v7 ticksx == 0 means no ticks, ticksx == 1 equivalent to == 0 in v6\n\n let can_adjust_frame = false, disable_x_draw = false, disable_y_draw = false;\n\n draw_horiz.disable_ticks = (ticksx <= 0);\n draw_vertical.disable_ticks = (ticksy <= 0);\n\n let pr1 = draw_horiz.drawAxis(layer, w, h,\n draw_horiz.invert_side ? undefined : `translate(0,${h})`,\n (ticksx > 1) ? -h : 0, disable_x_draw,\n undefined, false);\n\n let pr2 = draw_vertical.drawAxis(layer, w, h,\n draw_vertical.invert_side ? `translate(${w})` : undefined,\n (ticksy > 1) ? w : 0, disable_y_draw,\n draw_vertical.invert_side ? 0 : this._frame_x, can_adjust_frame);\n\n pr = Promise.all([pr1,pr2]).then(() => this.drawGrids());\n\n } else {\n\n let arr = [];\n\n if (ticksx > 0)\n arr.push(draw_horiz.drawAxis(layer, (sidex > 0) ? `translate(0,${h})` : '', sidex));\n\n if (ticksy > 0)\n arr.push(draw_vertical.drawAxis(layer, (sidey > 0) ? `translate(0,${h})` : `translate(${w},${h})`, sidey));\n\n pr = Promise.all(arr).then(() => {\n arr = [];\n if (ticksx > 1)\n arr.push(draw_horiz.drawAxisOtherPlace(layer, (sidex < 0) ? `translate(0,${h})` : '', -sidex, ticksx == 2));\n\n if (ticksy > 1)\n arr.push(draw_vertical.drawAxisOtherPlace(layer, (sidey < 0) ? `translate(0,${h})` : `translate(${w},${h})`, -sidey, ticksy == 2));\n return Promise.all(arr);\n }).then(() => this.drawGrids());\n }\n\n return pr.then(() => {\n this.axes_drawn = true;\n return true;\n });\n }\n\n /** @summary Draw secondary configuread axes */\n drawAxes2(second_x, second_y) {\n let w = this.getFrameWidth(), h = this.getFrameHeight(),\n layer = this.getFrameSvg().select('.axis_layer'),\n pr1, pr2;\n\n if (second_x) {\n if (this.zoom_x2min != this.zoom_x2max) {\n this.scale_x2min = this.zoom_x2min;\n this.scale_x2max = this.zoom_x2max;\n } else {\n this.scale_x2min = this.x2min;\n this.scale_x2max = this.x2max;\n }\n this.x2_handle = new RAxisPainter(this.getDom(), this, this.x2axis, 'x2_');\n this.x2_handle.setPadName(this.getPadName());\n this.x2_handle.snapid = this.snapid;\n\n this.x2_handle.configureAxis('x2axis', this.x2min, this.x2max, this.scale_x2min, this.scale_x2max, false, [0,w], w, { reverse: false });\n this.x2_handle.assignFrameMembers(this,'x2');\n\n pr1 = this.x2_handle.drawAxis(layer, '', -1);\n }\n\n if (second_y) {\n if (this.zoom_y2min != this.zoom_y2max) {\n this.scale_y2min = this.zoom_y2min;\n this.scale_y2max = this.zoom_y2max;\n } else {\n this.scale_y2min = this.y2min;\n this.scale_y2max = this.y2max;\n }\n\n this.y2_handle = new RAxisPainter(this.getDom(), this, this.y2axis, 'y2_');\n this.y2_handle.setPadName(this.getPadName());\n this.y2_handle.snapid = this.snapid;\n\n this.y2_handle.configureAxis('y2axis', this.y2min, this.y2max, this.scale_y2min, this.scale_y2max, true, [h,0], -h, { reverse: false });\n this.y2_handle.assignFrameMembers(this,'y2');\n\n pr2 = this.y2_handle.drawAxis(layer, `translate(${w},${h})`, -1);\n }\n\n return Promise.all([pr1,pr2]);\n }\n\n /** @summary Return functions to create x/y points based on coordinates\n * @desc In default case returns frame painter itself\n * @private */\n getGrFuncs(second_x, second_y) {\n let use_x2 = second_x && this.grx2,\n use_y2 = second_y && this.gry2;\n if (!use_x2 && !use_y2) return this;\n\n return {\n use_x2: use_x2,\n grx: use_x2 ? this.grx2 : this.grx,\n x_handle: use_x2 ? this.x2_handle : this.x_handle,\n logx: use_x2 ? this.x2_handle.log : this.x_handle.log,\n scale_xmin: use_x2 ? this.scale_x2min : this.scale_xmin,\n scale_xmax: use_x2 ? this.scale_x2max : this.scale_xmax,\n use_y2: use_y2,\n gry: use_y2 ? this.gry2 : this.gry,\n y_handle: use_y2 ? this.y2_handle : this.y_handle,\n logy: use_y2 ? this.y2_handle.log : this.y_handle.log,\n scale_ymin: use_y2 ? this.scale_y2min : this.scale_ymin,\n scale_ymax: use_y2 ? this.scale_y2max : this.scale_ymax,\n swap_xy: this.swap_xy,\n fp: this,\n revertAxis(name, v) {\n if ((name == 'x') && this.use_x2) name = 'x2';\n if ((name == 'y') && this.use_y2) name = 'y2';\n return this.fp.revertAxis(name, v);\n },\n axisAsText(name, v) {\n if ((name == 'x') && this.use_x2) name = 'x2';\n if ((name == 'y') && this.use_y2) name = 'y2';\n return this.fp.axisAsText(name, v);\n }\n };\n }\n\n /** @summary function called at the end of resize of frame\n * @desc Used to update attributes on the server\n * @private */\n sizeChanged() {\n\n let changes = {};\n this.v7AttrChange(changes, 'margins_left', this.fX1NDC);\n this.v7AttrChange(changes, 'margins_bottom', this.fY1NDC);\n this.v7AttrChange(changes, 'margins_right', 1 - this.fX2NDC);\n this.v7AttrChange(changes, 'margins_top', 1 - this.fY2NDC);\n this.v7SendAttrChanges(changes, false); // do not invoke canvas update on the server\n\n this.redrawPad();\n }\n\n /** @summary Remove all x/y functions\n * @private */\n cleanXY() {\n // remove all axes drawings\n let clean = (name,grname) => {\n if (this[name]) {\n this[name].cleanup();\n delete this[name];\n }\n delete this[grname];\n };\n\n clean('x_handle', 'grx');\n clean('y_handle', 'gry');\n clean('z_handle', 'grz');\n clean('x2_handle', 'grx2');\n clean('y2_handle', 'gry2');\n\n delete this.v6axes; // marker that v6 axes are used\n }\n\n /** @summary Remove all axes drawings\n * @private */\n cleanupAxes() {\n this.cleanXY();\n\n if (this.draw_g) {\n this.draw_g.select('.grid_layer').selectAll('*').remove();\n this.draw_g.select('.axis_layer').selectAll('*').remove();\n }\n this.axes_drawn = false;\n }\n\n /** @summary Removes all drawn elements of the frame\n * @private */\n cleanFrameDrawings() {\n // cleanup all 3D drawings if any\n if (isFunc(this.create3DScene))\n this.create3DScene(-1);\n\n this.cleanupAxes();\n\n let clean = (name) => {\n this[name+'min'] = this[name+'max'] = 0;\n this[`zoom_${name}min`] = this[`zoom_${name}max`] = 0;\n this[`scale_${name}min`] = this[`scale_${name}max`] = 0;\n };\n\n clean('x');\n clean('y');\n clean('z');\n clean('x2');\n clean('y2');\n\n if (this.draw_g) {\n this.draw_g.select('.main_layer').selectAll('*').remove();\n this.draw_g.select('.upper_layer').selectAll('*').remove();\n }\n }\n\n /** @summary Fully cleanup frame\n * @private */\n cleanup() {\n\n this.cleanFrameDrawings();\n\n if (this.draw_g) {\n this.draw_g.selectAll('*').remove();\n this.draw_g.on('mousedown', null)\n .on('dblclick', null)\n .on('wheel', null)\n .on('contextmenu', null)\n .property('interactive_set', null);\n }\n\n if (this.keys_handler) {\n window.removeEventListener('keydown', this.keys_handler, false);\n this.keys_handler = null;\n }\n delete this.enabledKeys;\n delete this.self_drawaxes;\n\n delete this.xaxis;\n delete this.yaxis;\n delete this.zaxis;\n delete this.x2axis;\n delete this.y2axis;\n\n delete this.draw_g; // frame element managet by the pad\n\n delete this._click_handler;\n delete this._dblclick_handler;\n\n let pp = this.getPadPainter();\n if (pp?.frame_painter_ref === this)\n delete pp.frame_painter_ref;\n\n super.cleanup();\n }\n\n /** @summary Redraw frame\n * @private */\n redraw() {\n\n let pp = this.getPadPainter();\n if (pp) pp.frame_painter_ref = this;\n\n // first update all attributes from objects\n this.updateAttributes();\n\n let rect = pp?.getPadRect() ?? { width: 10, height: 10 },\n lm = Math.round(rect.width * this.fX1NDC),\n w = Math.round(rect.width * (this.fX2NDC - this.fX1NDC)),\n tm = Math.round(rect.height * (1 - this.fY2NDC)),\n h = Math.round(rect.height * (this.fY2NDC - this.fY1NDC)),\n rotate = false, fixpos = false, trans;\n\n if (pp?.options) {\n if (pp.options.RotateFrame) rotate = true;\n if (pp.options.FixFrame) fixpos = true;\n }\n\n if (rotate) {\n trans = `rotate(-90,${lm},${tm}) translate(${lm-h},${tm})`;\n [w, h] = [h, w];\n } else {\n trans = `translate(${lm},${tm})`;\n }\n\n // update values here to let access even when frame is not really updated\n this._frame_x = lm;\n this._frame_y = tm;\n this._frame_width = w;\n this._frame_height = h;\n this._frame_rotate = rotate;\n this._frame_fixpos = fixpos;\n\n if (this.mode3d) return this; // no need for real draw in mode3d\n\n // this is svg:g object - container for every other items belonging to frame\n this.draw_g = this.getFrameSvg();\n\n let top_rect, main_svg;\n\n if (this.draw_g.empty()) {\n\n this.draw_g = this.getLayerSvg('primitives_layer').append('svg:g').attr('class', 'root_frame');\n\n if (!isBatchMode())\n this.draw_g.append('svg:title').text('');\n\n top_rect = this.draw_g.append('svg:rect');\n\n // append for the moment three layers - for drawing and axis\n this.draw_g.append('svg:g').attr('class','grid_layer');\n\n main_svg = this.draw_g.append('svg:svg')\n .attr('class','main_layer')\n .attr('x', 0)\n .attr('y', 0)\n .attr('overflow', 'hidden');\n\n this.draw_g.append('svg:g').attr('class','axis_layer');\n this.draw_g.append('svg:g').attr('class','upper_layer');\n } else {\n top_rect = this.draw_g.select('rect');\n main_svg = this.draw_g.select('.main_layer');\n }\n\n this.axes_drawn = false;\n\n this.draw_g.attr('transform', trans);\n\n top_rect.attr('x', 0)\n .attr('y', 0)\n .attr('width', w)\n .attr('height', h)\n .attr('rx', this.lineatt.rx || null)\n .attr('ry', this.lineatt.ry || null)\n .call(this.fillatt.func)\n .call(this.lineatt.func);\n\n main_svg.attr('width', w)\n .attr('height', h)\n .attr('viewBox', `0 0 ${w} ${h}`);\n\n let pr = Promise.resolve(true);\n\n if (this.v7EvalAttr('drawAxes')) {\n this.self_drawaxes = true;\n this.setAxesRanges();\n pr = this.drawAxes().then(() => this.addInteractivity());\n }\n\n return pr.then(() => {\n if (!isBatchMode()) {\n top_rect.style('pointer-events', 'visibleFill'); // let process mouse events inside frame\n\n FrameInteractive.assign(this);\n this.addBasicInteractivity();\n }\n\n return this;\n });\n }\n\n /** @summary Returns frame width */\n getFrameWidth() { return this._frame_width || 0; }\n\n /** @summary Returns frame height */\n getFrameHeight() { return this._frame_height || 0; }\n\n /** @summary Returns frame rectangle plus extra info for hint display */\n getFrameRect() {\n return {\n x: this._frame_x || 0,\n y: this._frame_y || 0,\n width: this.getFrameWidth(),\n height: this.getFrameHeight(),\n transform: this.draw_g ? this.draw_g.attr('transform') : '',\n hint_delta_x: 0,\n hint_delta_y: 0\n }\n }\n\n /** @summary Returns palette associated with frame */\n getHistPalette() {\n return this.getPadPainter().getHistPalette();\n }\n\n /** @summary Configure user-defined click handler\n * @desc Function will be called every time when frame click was perfromed\n * As argument, tooltip object with selected bins will be provided\n * If handler function returns true, default handling of click will be disabled */\n configureUserClickHandler(handler) {\n this._click_handler = isFunc(handler) ? handler : null;\n }\n\n /** @summary Configure user-defined dblclick handler\n * @desc Function will be called every time when double click was called\n * As argument, tooltip object with selected bins will be provided\n * If handler function returns true, default handling of dblclick (unzoom) will be disabled */\n configureUserDblclickHandler(handler) {\n this._dblclick_handler = isFunc(handler) ? handler : null;\n }\n\n /** @summary function can be used for zooming into specified range\n * @desc if both limits for each axis 0 (like xmin == xmax == 0), axis will be unzoomed\n * @return {Promise} with boolean flag if zoom operation was performed */\n async zoom(xmin, xmax, ymin, ymax, zmin, zmax) {\n\n // disable zooming when axis conversion is enabled\n if (this.projection) return false;\n\n if (xmin === 'x') { xmin = xmax; xmax = ymin; ymin = undefined; } else\n if (xmin === 'y') { ymax = ymin; ymin = xmax; xmin = xmax = undefined; } else\n if (xmin === 'z') { zmin = xmax; zmax = ymin; xmin = xmax = ymin = undefined; }\n\n let zoom_x = (xmin !== xmax), zoom_y = (ymin !== ymax), zoom_z = (zmin !== zmax),\n unzoom_x = false, unzoom_y = false, unzoom_z = false;\n\n if (zoom_x) {\n let cnt = 0;\n if (xmin <= this.xmin) { xmin = this.xmin; cnt++; }\n if (xmax >= this.xmax) { xmax = this.xmax; cnt++; }\n if (cnt === 2) { zoom_x = false; unzoom_x = true; }\n } else {\n unzoom_x = (xmin === xmax) && (xmin === 0);\n }\n\n if (zoom_y) {\n let cnt = 0;\n if (ymin <= this.ymin) { ymin = this.ymin; cnt++; }\n if (ymax >= this.ymax) { ymax = this.ymax; cnt++; }\n if (cnt === 2) { zoom_y = false; unzoom_y = true; }\n } else {\n unzoom_y = (ymin === ymax) && (ymin === 0);\n }\n\n if (zoom_z) {\n let cnt = 0;\n // if (this.logz && this.ymin_nz && this.getDimension()===2) main_zmin = 0.3*this.ymin_nz;\n if (zmin <= this.zmin) { zmin = this.zmin; cnt++; }\n if (zmax >= this.zmax) { zmax = this.zmax; cnt++; }\n if (cnt === 2) { zoom_z = false; unzoom_z = true; }\n } else {\n unzoom_z = (zmin === zmax) && (zmin === 0);\n }\n\n let changed = false,\n r_x = '', r_y = '', r_z = '', is_any_check = false,\n req = {\n _typename: 'ROOT::Experimental::RFrame::RUserRanges',\n values: [0, 0, 0, 0, 0, 0],\n flags: [false, false, false, false, false, false]\n };\n\n const checkZooming = (painter, force) => {\n if (!force && !isFunc(painter.canZoomInside)) return;\n\n is_any_check = true;\n\n if (zoom_x && (force || painter.canZoomInside('x', xmin, xmax))) {\n this.zoom_xmin = xmin;\n this.zoom_xmax = xmax;\n changed = true; r_x = '0';\n zoom_x = false;\n req.values[0] = xmin; req.values[1] = xmax;\n req.flags[0] = req.flags[1] = true;\n }\n if (zoom_y && (force || painter.canZoomInside('y', ymin, ymax))) {\n this.zoom_ymin = ymin;\n this.zoom_ymax = ymax;\n changed = true; r_y = '1';\n zoom_y = false;\n req.values[2] = ymin; req.values[3] = ymax;\n req.flags[2] = req.flags[3] = true;\n }\n if (zoom_z && (force || painter.canZoomInside('z', zmin, zmax))) {\n this.zoom_zmin = zmin;\n this.zoom_zmax = zmax;\n changed = true; r_z = '2';\n zoom_z = false;\n req.values[4] = zmin; req.values[5] = zmax;\n req.flags[4] = req.flags[5] = true;\n }\n };\n\n // first process zooming (if any)\n if (zoom_x || zoom_y || zoom_z)\n this.forEachPainter(painter => checkZooming(painter));\n\n // force zooming when no any other painter can verify zoom range\n if (!is_any_check && this.self_drawaxes)\n checkZooming(null, true);\n\n // and process unzoom, if any\n if (unzoom_x || unzoom_y || unzoom_z) {\n if (unzoom_x) {\n if (this.zoom_xmin !== this.zoom_xmax) { changed = true; r_x = '0'; }\n this.zoom_xmin = this.zoom_xmax = 0;\n req.values[0] = req.values[1] = -1;\n }\n if (unzoom_y) {\n if (this.zoom_ymin !== this.zoom_ymax) { changed = true; r_y = '1'; }\n this.zoom_ymin = this.zoom_ymax = 0;\n req.values[2] = req.values[3] = -1;\n }\n if (unzoom_z) {\n if (this.zoom_zmin !== this.zoom_zmax) { changed = true; r_z = '2'; }\n this.zoom_zmin = this.zoom_zmax = 0;\n req.values[4] = req.values[5] = -1;\n }\n }\n\n if (!changed) return false;\n\n if (this.v7NormalMode())\n this.v7SubmitRequest('zoom', { _typename: 'ROOT::Experimental::RFrame::RZoomRequest', ranges: req });\n\n return this.interactiveRedraw('pad', 'zoom' + r_x + r_y + r_z).then(() => true);\n }\n\n /** @summary Provide zooming of single axis\n * @desc One can specify names like x/y/z but also second axis x2 or y2 */\n async zoomSingle(name, vmin, vmax) {\n\n let names = ['x','y','z','x2','y2'], indx = names.indexOf(name);\n\n // disable zooming when axis conversion is enabled\n if (this.projection || !this[name+'_handle'] || (indx < 0))\n return false;\n\n let zoom_v = (vmin !== vmax), unzoom_v = false;\n\n if (zoom_v) {\n let cnt = 0;\n if (vmin <= this[name+'min']) { vmin = this[name+'min']; cnt++; }\n if (vmax >= this[name+'max']) { vmax = this[name+'max']; cnt++; }\n if (cnt === 2) { zoom_v = false; unzoom_v = true; }\n } else {\n unzoom_v = (vmin === vmax) && (vmin === 0);\n }\n\n let changed = false, is_any_check = false,\n req = {\n _typename: 'ROOT::Experimental::RFrame::RUserRanges',\n values: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n flags: [false, false, false, false, false, false, false, false, false, false]\n };\n\n let checkZooming = (painter, force) => {\n if (!force && !isFunc(painter?.canZoomInside)) return;\n\n is_any_check = true;\n\n if (zoom_v && (force || painter.canZoomInside(name[0], vmin, vmax))) {\n this['zoom_' + name + 'min'] = vmin;\n this['zoom_' + name + 'max'] = vmax;\n changed = true;\n zoom_v = false;\n req.values[indx*2] = vmin; req.values[indx*2+1] = vmax;\n req.flags[indx*2] = req.flags[indx*2+1] = true;\n }\n };\n\n // first process zooming (if any)\n if (zoom_v)\n this.forEachPainter(painter => checkZooming(painter));\n\n // force zooming when no any other painter can verify zoom range\n if (!is_any_check && this.self_drawaxes)\n checkZooming(null, true);\n\n if (unzoom_v) {\n if (this[`zoom_${name}min`] !== this[`zoom_${name}max`]) changed = true;\n this[`zoom_${name}min`] = this[`zoom_${name}max`] = 0;\n req.values[indx*2] = req.values[indx*2+1] = -1;\n }\n\n if (!changed) return false;\n\n if (this.v7NormalMode())\n this.v7SubmitRequest('zoom', { _typename: 'ROOT::Experimental::RFrame::RZoomRequest', ranges: req });\n\n return this.interactiveRedraw('pad', 'zoom' + indx).then(() => true);\n }\n\n /** @summary Checks if specified axis zoomed */\n isAxisZoomed(axis) {\n return this['zoom_'+axis+'min'] !== this['zoom_'+axis+'max'];\n }\n\n /** @summary Unzoom specified axes\n * @return {Promise} with boolean flag if zoom is changed */\n async unzoom(dox, doy, doz) {\n if (dox == 'all')\n return this.unzoom('x2').then(() => this.unzoom('y2')).then(() => this.unzoom('xyz'));\n\n if ((dox == 'x2') || (dox == 'y2'))\n return this.zoomSingle(dox, 0, 0).then(changed => {\n if (changed) this.zoomChangedInteractive(dox, 'unzoom');\n return changed;\n });\n\n if (typeof dox === 'undefined') { dox = doy = doz = true; } else\n if (isStr(dox)) { doz = dox.indexOf('z') >= 0; doy = dox.indexOf('y') >= 0; dox = dox.indexOf('x') >= 0; }\n\n return this.zoom(dox ? 0 : undefined, dox ? 0 : undefined,\n doy ? 0 : undefined, doy ? 0 : undefined,\n doz ? 0 : undefined, doz ? 0 : undefined).then(changed => {\n\n if (changed && dox) this.zoomChangedInteractive('x', 'unzoom');\n if (changed && doy) this.zoomChangedInteractive('y', 'unzoom');\n if (changed && doz) this.zoomChangedInteractive('z', 'unzoom');\n\n return changed;\n });\n }\n\n /** @summary Mark/check if zoom for specific axis was changed interactively\n * @private */\n zoomChangedInteractive(axis, value) {\n if (axis == 'reset') {\n this.zoom_changed_x = this.zoom_changed_y = this.zoom_changed_z = undefined;\n return;\n }\n if (!axis || axis == 'any')\n return this.zoom_changed_x || this.zoom_changed_y || this.zoom_changed_z;\n\n if ((axis !== 'x') && (axis !== 'y') && (axis !== 'z')) return;\n\n let fld = 'zoom_changed_' + axis;\n if (value === undefined) return this[fld];\n\n if (value === 'unzoom') {\n // special handling of unzoom, only if was never changed before flag set to true\n this[fld] = (this[fld] === undefined);\n return;\n }\n\n if (value) this[fld] = true;\n }\n\n /** @summary Fill menu for frame when server is not there */\n fillObjectOfflineMenu(menu, kind) {\n if ((kind != 'x') && (kind != 'y')) return;\n\n menu.add('Unzoom', () => this.unzoom(kind));\n\n //if (this[kind+'_kind'] == 'normal')\n // menu.addchk(this['log'+kind], 'SetLog'+kind, this.toggleAxisLog.bind(this, kind));\n\n // here should be all axes attributes in offline\n }\n\n /** @summary Set grid drawing for specified axis */\n changeFrameAttr(attr, value) {\n let changes = {};\n this.v7AttrChange(changes, attr, value);\n this.v7SetAttr(attr, value);\n this.v7SendAttrChanges(changes, false); // do not invoke canvas update on the server\n this.redrawPad();\n }\n\n /** @summary Fill context menu */\n fillContextMenu(menu, kind, /* obj */) {\n\n // when fill and show context menu, remove all zooming\n\n if ((kind == 'x') || (kind == 'y') || (kind == 'x2') || (kind == 'y2')) {\n let handle = this[kind+'_handle'];\n if (!handle) return false;\n menu.add('header: ' + kind.toUpperCase() + ' axis');\n return handle.fillAxisContextMenu(menu, kind);\n }\n\n let alone = menu.size() == 0;\n\n if (alone)\n menu.add('header:Frame');\n else\n menu.add('separator');\n\n if (this.zoom_xmin !== this.zoom_xmax)\n menu.add('Unzoom X', () => this.unzoom('x'));\n if (this.zoom_ymin !== this.zoom_ymax)\n menu.add('Unzoom Y', () => this.unzoom('y'));\n if (this.zoom_zmin !== this.zoom_zmax)\n menu.add('Unzoom Z', () => this.unzoom('z'));\n if (this.zoom_x2min !== this.zoom_x2max)\n menu.add('Unzoom X2', () => this.unzoom('x2'));\n if (this.zoom_y2min !== this.zoom_y2max)\n menu.add('Unzoom Y2', () => this.unzoom('y2'));\n menu.add('Unzoom all', () => this.unzoom('all'));\n\n menu.add('separator');\n\n menu.addchk(this.isTooltipAllowed(), 'Show tooltips', () => this.setTooltipAllowed('toggle'));\n\n if (this.x_handle)\n menu.addchk(this.x_handle.draw_grid, 'Grid x', flag => this.changeFrameAttr('gridX', flag));\n if (this.y_handle)\n menu.addchk(this.y_handle.draw_grid, 'Grid y', flag => this.changeFrameAttr('gridY', flag));\n if (this.x_handle && !this.x2_handle)\n menu.addchk(this.x_handle.draw_swapside, 'Swap x', flag => this.changeFrameAttr('swapX', flag));\n if (this.y_handle && !this.y2_handle)\n menu.addchk(this.y_handle.draw_swapside, 'Swap y', flag => this.changeFrameAttr('swapY', flag));\n if (this.x_handle && !this.x2_handle) {\n menu.add('sub:Ticks x');\n menu.addchk(this.x_handle.draw_ticks == 0, 'off', () => this.changeFrameAttr('ticksX', 0));\n menu.addchk(this.x_handle.draw_ticks == 1, 'normal', () => this.changeFrameAttr('ticksX', 1));\n menu.addchk(this.x_handle.draw_ticks == 2, 'ticks on both sides', () => this.changeFrameAttr('ticksX', 2));\n menu.addchk(this.x_handle.draw_ticks == 3, 'labels on both sides', () => this.changeFrameAttr('ticksX', 3));\n menu.add('endsub:');\n }\n if (this.y_handle && !this.y2_handle) {\n menu.add('sub:Ticks y');\n menu.addchk(this.y_handle.draw_ticks == 0, 'off', () => this.changeFrameAttr('ticksY', 0));\n menu.addchk(this.y_handle.draw_ticks == 1, 'normal', () => this.changeFrameAttr('ticksY', 1));\n menu.addchk(this.y_handle.draw_ticks == 2, 'ticks on both sides', () => this.changeFrameAttr('ticksY', 2));\n menu.addchk(this.y_handle.draw_ticks == 3, 'labels on both sides', () => this.changeFrameAttr('ticksY', 3));\n menu.add('endsub:');\n }\n\n menu.addAttributesMenu(this, alone ? '' : 'Frame ');\n menu.add('separator');\n menu.add('Save as frame.png', () => this.getPadPainter().saveAs('png', 'frame', 'frame.png'));\n menu.add('Save as frame.svg', () => this.getPadPainter().saveAs('svg', 'frame', 'frame.svg'));\n\n return true;\n }\n\n /** @summary Convert graphical coordinate into axis value */\n revertAxis(axis, pnt) {\n let handle = this[axis+'_handle'];\n return handle ? handle.revertPoint(pnt) : 0;\n }\n\n /** @summary Show axis status message\n * @desc method called normally when mouse enter main object element\n * @private */\n showAxisStatus(axis_name, evnt) {\n\n let taxis = null, hint_name = axis_name, hint_title = 'axis',\n m = d3_pointer(evnt, this.getFrameSvg().node()), id = (axis_name == 'x') ? 0 : 1;\n\n if (taxis) { hint_name = taxis.fName; hint_title = taxis.fTitle || 'axis object'; }\n\n if (this.swap_xy) id = 1-id;\n\n let axis_value = this.revertAxis(axis_name, m[id]);\n\n this.showObjectStatus(hint_name, hint_title, axis_name + ' : ' + this.axisAsText(axis_name, axis_value), Math.round(m[0]) + ',' + Math.round(m[1]));\n }\n\n /** @summary Add interactive keys handlers\n * @private */\n addKeysHandler() {\n if (isBatchMode()) return;\n FrameInteractive.assign(this);\n this.addFrameKeysHandler();\n }\n\n /** @summary Add interactive functionality to the frame\n * @private */\n addInteractivity(for_second_axes) {\n\n if (isBatchMode() || (!settings.Zooming && !settings.ContextMenu))\n return true;\n FrameInteractive.assign(this);\n return this.addFrameInteractivity(for_second_axes);\n }\n\n /** @summary Set selected range back to pad object - to be implemented\n * @private */\n setRootPadRange(/* pad, is3d */) {\n // TODO: change of pad range and send back to root application\n }\n\n /** @summary Toggle log scale on the specified axes */\n toggleAxisLog(axis) {\n let handle = this[axis+'_handle'];\n if (handle) handle.changeAxisLog('toggle');\n }\n\n} // class RFramePainter\n\nexport { RFramePainter };\n","import { gStyle, settings, constants, internals, addMethods,\n isPromise, getPromise, isBatchMode, isObject, isFunc, isStr, btoa_func, clTPad } from '../core.mjs';\nimport { pointer as d3_pointer } from '../d3.mjs';\nimport { ColorPalette, addColor, getRootColors } from '../base/colors.mjs';\nimport { RObjectPainter } from '../base/RObjectPainter.mjs';\nimport { getElementRect, getAbsPosInCanvas, DrawOptions, compressSVG } from '../base/BasePainter.mjs';\nimport { selectActivePad, getActivePad } from '../base/ObjectPainter.mjs';\nimport { registerForResize, saveFile } from '../gui/utils.mjs';\nimport { BrowserLayout } from '../gui/display.mjs';\nimport { createMenu, closeMenu } from '../gui/menu.mjs';\nimport { PadButtonsHandler } from './TPadPainter.mjs';\n\n\n/**\n * @summary Painter class for RPad\n *\n * @private\n */\n\nclass RPadPainter extends RObjectPainter {\n\n /** @summary constructor */\n constructor(dom, pad, iscan) {\n super(dom, pad, '', 'pad');\n this.pad = pad;\n this.iscan = iscan; // indicate if working with canvas\n this.this_pad_name = '';\n if (!this.iscan && (pad !== null)) {\n if (pad.fObjectID)\n this.this_pad_name = 'pad' + pad.fObjectID; // use objectid as padname\n else\n this.this_pad_name = 'ppp' + internals.id_counter++; // artificical name\n }\n this.painters = []; // complete list of all painters in the pad\n this.has_canvas = true;\n this.forEachPainter = this.forEachPainterInPad;\n }\n\n /** @summary Indicates that is not Root6 pad painter\n * @private */\n isRoot6() { return false; }\n\n /** @summary Returns SVG element for the pad itself\n * @private */\n svg_this_pad() {\n return this.getPadSvg(this.this_pad_name);\n }\n\n /** @summary Returns main painter on the pad\n * @desc Typically main painter is TH1/TH2 object which is drawing axes\n * @private */\n getMainPainter() {\n return this.main_painter_ref || null;\n }\n\n /** @summary Assign main painter on the pad\n * @private */\n setMainPainter(painter, force) {\n if (!this.main_painter_ref || force)\n this.main_painter_ref = painter;\n }\n\n /** @summary cleanup pad and all primitives inside */\n cleanup() {\n if (this._doing_draw)\n console.error('pad drawing is not completed when cleanup is called');\n\n this.painters.forEach(p => p.cleanup());\n\n let svg_p = this.svg_this_pad();\n if (!svg_p.empty()) {\n svg_p.property('pad_painter', null);\n if (!this.iscan) svg_p.remove();\n }\n\n delete this.main_painter_ref;\n delete this.frame_painter_ref;\n delete this.pads_cache;\n delete this._pad_x;\n delete this._pad_y;\n delete this._pad_width;\n delete this._pad_height;\n delete this._doing_draw;\n delete this._dfltRFont;\n\n this.painters = [];\n this.pad = null;\n this.draw_object = null;\n this.pad_frame = null;\n this.this_pad_name = undefined;\n this.has_canvas = false;\n\n selectActivePad({ pp: this, active: false });\n\n super.cleanup();\n }\n\n /** @summary Returns frame painter inside the pad\n * @private */\n getFramePainter() { return this.frame_painter_ref; }\n\n /** @summary get pad width */\n getPadWidth() { return this._pad_width || 0; }\n\n /** @summary get pad height */\n getPadHeight() { return this._pad_height || 0; }\n\n /** @summary get pad rect */\n getPadRect() {\n return {\n x: this._pad_x || 0,\n y: this._pad_y || 0,\n width: this.getPadWidth(),\n height: this.getPadHeight()\n }\n }\n\n /** @summary Returns frame coordiantes - also when frame is not drawn */\n getFrameRect() {\n let fp = this.getFramePainter();\n if (fp) return fp.getFrameRect();\n\n let w = this.getPadWidth(),\n h = this.getPadHeight(),\n rect = {};\n\n rect.szx = Math.round(0.5*w);\n rect.szy = Math.round(0.5*h);\n rect.width = 2*rect.szx;\n rect.height = 2*rect.szy;\n rect.x = Math.round(w/2 - rect.szx);\n rect.y = Math.round(h/2 - rect.szy);\n rect.hint_delta_x = rect.szx;\n rect.hint_delta_y = rect.szy;\n rect.transform = `translate(${rect.x},${rect.y})`;\n return rect;\n }\n\n /** @summary return RPad object */\n getRootPad(is_root6) {\n return (is_root6 === undefined) || !is_root6 ? this.pad : null;\n }\n\n /** @summary Cleanup primitives from pad - selector lets define which painters to remove\n * @private */\n cleanPrimitives(selector) {\n if (!isFunc(selector)) return;\n\n for (let k = this.painters.length-1; k >= 0; --k)\n if (selector(this.painters[k])) {\n this.painters[k].cleanup();\n this.painters.splice(k, 1);\n }\n }\n\n /** @summary Try to find painter for specified object\n * @desc can be used to find painter for some special objects, registered as\n * histogram functions\n * @private */\n findPainterFor(selobj, selname, seltype) {\n return this.painters.find(p => {\n let pobj = p.getObject();\n if (!pobj) return;\n\n if (selobj && (pobj === selobj)) return true;\n if (!selname && !seltype) return;\n if (selname && (pobj.fName !== selname)) return;\n if (seltype && (pobj._typename !== seltype)) return;\n return true;\n });\n }\n\n /** @summary Returns palette associated with pad.\n * @desc Either from existing palette painter or just default palette */\n getHistPalette() {\n let pp = this.findPainterFor(undefined, undefined, 'ROOT::Experimental::RPaletteDrawable');\n\n if (pp) return pp.getHistPalette();\n\n if (!this.fDfltPalette) {\n this.fDfltPalette = {\n _typename: 'ROOT::Experimental::RPalette',\n fColors: [{ fOrdinal: 0, fColor: { fColor: 'rgb(53, 42, 135)' } },\n { fOrdinal: 0.125, fColor: { fColor: 'rgb(15, 92, 221)' } },\n { fOrdinal: 0.25, fColor: { fColor: 'rgb(20, 129, 214)' } },\n { fOrdinal: 0.375, fColor: { fColor: 'rgb(6, 164, 202)' } },\n { fOrdinal: 0.5, fColor: { fColor: 'rgb(46, 183, 164)' } },\n { fOrdinal: 0.625, fColor: { fColor: 'rgb(135, 191, 119)' } },\n { fOrdinal: 0.75, fColor: { fColor: 'rgb(209, 187, 89)' } },\n { fOrdinal: 0.875, fColor: { fColor: 'rgb(254, 200, 50)' } },\n { fOrdinal: 1, fColor: { fColor: 'rgb(249, 251, 14)' } }],\n fInterpolate: true,\n fNormalized: true\n };\n addMethods(this.fDfltPalette, 'ROOT::Experimental::RPalette');\n }\n\n return this.fDfltPalette;\n }\n\n /** @summary Returns number of painters\n * @private */\n getNumPainters() { return this.painters.length; }\n\n /** @summary Call function for each painter in pad\n * @param {function} userfunc - function to call\n * @param {string} kind - 'all' for all objects (default), 'pads' only pads and subpads, 'objects' only for object in current pad\n * @private */\n forEachPainterInPad(userfunc, kind) {\n if (!kind) kind = 'all';\n if (kind != 'objects') userfunc(this);\n for (let k = 0; k < this.painters.length; ++k) {\n let sub = this.painters[k];\n if (isFunc(sub.forEachPainterInPad)) {\n if (kind!='objects') sub.forEachPainterInPad(userfunc, kind);\n } else if (kind != 'pads') userfunc(sub);\n }\n }\n\n /** @summary register for pad events receiver\n * @desc in pad painter, while pad may be drawn without canvas\n * @private */\n registerForPadEvents(receiver) {\n this.pad_events_receiver = receiver;\n }\n\n /** @summary Generate pad events, normally handled by GED\n * @desc in pad painter, while pad may be drawn without canvas\n * @private */\n producePadEvent(what, padpainter, painter, position, place) {\n if ((what == 'select') && isFunc(this.selectActivePad))\n this.selectActivePad(padpainter, painter, position);\n\n if (this.pad_events_receiver)\n this.pad_events_receiver({ what, padpainter, painter, position, place });\n }\n\n /** @summary method redirect call to pad events receiver */\n selectObjectPainter(painter, pos, place) {\n\n let istoppad = (this.iscan || !this.has_canvas),\n canp = istoppad ? this : this.getCanvPainter();\n\n if (painter === undefined) painter = this;\n\n if (pos && !istoppad)\n pos = getAbsPosInCanvas(this.svg_this_pad(), pos);\n\n selectActivePad({ pp: this, active: true });\n\n canp.producePadEvent('select', this, painter, pos, place);\n }\n\n /** @summary Create SVG element for the canvas */\n createCanvasSvg(check_resize, new_size) {\n\n let factor = null, svg = null, lmt = 5, rect = null, btns, frect;\n\n if (check_resize > 0) {\n\n if (this._fixed_size) return (check_resize > 1); // flag used to force re-drawing of all subpads\n\n svg = this.getCanvSvg();\n\n if (svg.empty()) return false;\n\n factor = svg.property('height_factor');\n\n rect = this.testMainResize(check_resize, null, factor);\n\n if (!rect.changed) return false;\n\n if (!isBatchMode())\n btns = this.getLayerSvg('btns_layer', this.this_pad_name);\n\n frect = svg.select('.canvas_fillrect');\n\n } else {\n\n let render_to = this.selectDom();\n\n if (render_to.style('position') == 'static')\n render_to.style('position', 'relative');\n\n svg = render_to.append('svg')\n .attr('class', 'jsroot root_canvas')\n .property('pad_painter', this) // this is custom property\n .property('current_pad', '') // this is custom property\n .property('redraw_by_resize', false); // could be enabled to force redraw by each resize\n\n this.setTopPainter(); //assign canvas as top painter of that element\n\n if (!isBatchMode() && !this.online_canvas)\n svg.append('svg:title').text('ROOT canvas');\n\n frect = svg.append('svg:path').attr('class','canvas_fillrect');\n if (!isBatchMode())\n frect.style('pointer-events', 'visibleFill')\n .on('dblclick', evnt => this.enlargePad(evnt))\n .on('click', () => this.selectObjectPainter(this, null))\n .on('mouseenter', () => this.showObjectStatus())\n .on('contextmenu', settings.ContextMenu ? evnt => this.padContextMenu(evnt) : null);\n\n svg.append('svg:g').attr('class', 'primitives_layer');\n svg.append('svg:g').attr('class', 'info_layer');\n if (!isBatchMode())\n btns = svg.append('svg:g')\n .attr('class','btns_layer')\n .property('leftside', settings.ToolBarSide == 'left')\n .property('vertical', settings.ToolBarVert);\n\n factor = 0.66;\n if (this.pad && this.pad.fWinSize[0] && this.pad.fWinSize[1]) {\n factor = this.pad.fWinSize[1] / this.pad.fWinSize[0];\n if ((factor < 0.1) || (factor > 10)) factor = 0.66;\n }\n\n if (this._fixed_size) {\n render_to.style('overflow','auto');\n rect = { width: this.pad.fWinSize[0], height: this.pad.fWinSize[1] };\n if (!rect.width || !rect.height)\n rect = getElementRect(render_to);\n } else {\n rect = this.testMainResize(2, new_size, factor);\n }\n }\n\n this.createAttFill({ pattern: 1001, color: 0 });\n\n if ((rect.width <= lmt) || (rect.height <= lmt)) {\n svg.style('display', 'none');\n console.warn(`Hide canvas while geometry too small w=${rect.width} h=${rect.height}`);\n rect.width = 200; rect.height = 100; // just to complete drawing\n } else {\n svg.style('display', null);\n }\n\n if (this._fixed_size) {\n svg.attr('x', 0)\n .attr('y', 0)\n .attr('width', rect.width)\n .attr('height', rect.height)\n .style('position', 'absolute');\n } else {\n svg.attr('x', 0)\n .attr('y', 0)\n .style('width', '100%')\n .style('height', '100%')\n .style('position', 'absolute')\n .style('left', 0)\n .style('top', 0)\n .style('right', 0)\n .style('bottom', 0);\n }\n\n svg.style('filter', settings.DarkMode ? 'invert(100%)' : null);\n\n svg.attr('viewBox', `0 0 ${rect.width} ${rect.height}`)\n .attr('preserveAspectRatio', 'none') // we do not preserve relative ratio\n .property('height_factor', factor)\n .property('draw_x', 0)\n .property('draw_y', 0)\n .property('draw_width', rect.width)\n .property('draw_height', rect.height);\n\n this._pad_x = 0;\n this._pad_y = 0;\n this._pad_width = rect.width;\n this._pad_height = rect.height;\n\n frect.attr('d', `M0,0H${rect.width}V${rect.height}H0Z`)\n .call(this.fillatt.func);\n\n this._fast_drawing = settings.SmallPad && ((rect.width < settings.SmallPad.width) || (rect.height < settings.SmallPad.height));\n\n if (this.alignButtons && btns)\n this.alignButtons(btns, rect.width, rect.height);\n\n return true;\n }\n\n /** @summary Enlarge pad draw element when possible */\n enlargePad(evnt) {\n\n if (evnt) {\n evnt.preventDefault();\n evnt.stopPropagation();\n }\n\n let svg_can = this.getCanvSvg(),\n pad_enlarged = svg_can.property('pad_enlarged');\n\n if (this.iscan || !this.has_canvas || (!pad_enlarged && !this.hasObjectsToDraw() && !this.painters)) {\n if (this._fixed_size) return; // canvas cannot be enlarged in such mode\n if (!this.enlargeMain('toggle')) return;\n if (this.enlargeMain('state') == 'off') svg_can.property('pad_enlarged', null);\n } else if (!pad_enlarged) {\n this.enlargeMain(true, true);\n svg_can.property('pad_enlarged', this.pad);\n } else if (pad_enlarged === this.pad) {\n this.enlargeMain(false);\n svg_can.property('pad_enlarged', null);\n } else {\n console.error('missmatch with pad double click events');\n }\n\n let was_fast = this._fast_drawing;\n\n this.checkResize(true);\n\n if (this._fast_drawing != was_fast)\n this.showPadButtons();\n }\n\n /** @summary Create SVG element for the pad\n * @return true when pad is displayed and all its items should be redrawn */\n createPadSvg(only_resize) {\n\n if (!this.has_canvas) {\n this.createCanvasSvg(only_resize ? 2 : 0);\n return true;\n }\n\n let svg_parent = this.getPadSvg(this.pad_name), // this.pad_name MUST be here to select parent pad\n svg_can = this.getCanvSvg(),\n width = svg_parent.property('draw_width'),\n height = svg_parent.property('draw_height'),\n pad_enlarged = svg_can.property('pad_enlarged'),\n pad_visible = true,\n w = width, h = height, x = 0, y = 0,\n svg_pad = null, svg_rect = null, btns = null;\n\n if (this.pad && this.pad.fPos && this.pad.fSize) {\n x = Math.round(width * this.pad.fPos.fHoriz.fArr[0]);\n y = Math.round(height * this.pad.fPos.fVert.fArr[0]);\n w = Math.round(width * this.pad.fSize.fHoriz.fArr[0]);\n h = Math.round(height * this.pad.fSize.fVert.fArr[0]);\n }\n\n if (pad_enlarged) {\n pad_visible = false;\n if (pad_enlarged === this.pad)\n pad_visible = true;\n else\n this.forEachPainterInPad(pp => { if (pp.getObject() == pad_enlarged) pad_visible = true; }, 'pads');\n\n if (pad_visible) { w = width; h = height; x = y = 0; }\n }\n\n if (only_resize) {\n svg_pad = this.svg_this_pad();\n svg_rect = svg_pad.select('.root_pad_border');\n if (!isBatchMode())\n btns = this.getLayerSvg('btns_layer', this.this_pad_name);\n } else {\n svg_pad = svg_parent.select('.primitives_layer')\n .append('svg:svg') // here was g before, svg used to blend all drawin outside\n .classed('__root_pad_' + this.this_pad_name, true)\n .attr('pad', this.this_pad_name) // set extra attribute to mark pad name\n .property('pad_painter', this); // this is custom property\n\n if (!isBatchMode())\n svg_pad.append('svg:title').text('ROOT subpad');\n\n svg_rect = svg_pad.append('svg:path').attr('class', 'root_pad_border');\n\n svg_pad.append('svg:g').attr('class','primitives_layer');\n if (!isBatchMode())\n btns = svg_pad.append('svg:g')\n .attr('class','btns_layer')\n .property('leftside', settings.ToolBarSide != 'left')\n .property('vertical', settings.ToolBarVert);\n\n if (settings.ContextMenu)\n svg_rect.on('contextmenu', evnt => this.padContextMenu(evnt));\n\n if (!isBatchMode())\n svg_rect.style('pointer-events', 'visibleFill') // get events also for not visible rect\n .on('dblclick', evnt => this.enlargePad(evnt))\n .on('click', () => this.selectObjectPainter(this, null))\n .on('mouseenter', () => this.showObjectStatus());\n }\n\n this.createAttFill({ attr: this.pad });\n\n this.createAttLine({ attr: this.pad, color0: this.pad.fBorderMode == 0 ? 'none' : '' });\n\n svg_pad.style('display', pad_visible ? null : 'none')\n .attr('viewBox', `0 0 ${w} ${h}`) // due to svg\n .attr('preserveAspectRatio', 'none') // due to svg, we do not preserve relative ratio\n .attr('x', x) // due to svg\n .attr('y', y) // due to svg\n .attr('width', w) // due to svg\n .attr('height', h) // due to svg\n .property('draw_x', x) // this is to make similar with canvas\n .property('draw_y', y)\n .property('draw_width', w)\n .property('draw_height', h);\n\n this._pad_x = x;\n this._pad_y = y;\n this._pad_width = w;\n this._pad_height = h;\n\n svg_rect.attr('d', `M0,0H${w}V${h}H0Z`)\n .call(this.fillatt.func)\n .call(this.lineatt.func);\n\n this._fast_drawing = settings.SmallPad && ((w < settings.SmallPad.width) || (h < settings.SmallPad.height));\n\n // special case of 3D canvas overlay\n if (svg_pad.property('can3d') === constants.Embed3D.Overlay)\n this.selectDom().select('.draw3d_' + this.this_pad_name)\n .style('display', pad_visible ? '' : 'none');\n\n if (this.alignButtons && btns) this.alignButtons(btns, w, h);\n\n return pad_visible;\n }\n\n /** @summary returns true if any objects beside sub-pads exists in the pad */\n hasObjectsToDraw() {\n let arr = this.pad ? this.pad.fPrimitives : null;\n return arr && arr.find(obj => obj._typename != 'ROOT::Experimental::RPadDisplayItem') ? true : false;\n }\n\n /** @summary sync drawing/redrawing/resize of the pad\n * @param {string} kind - kind of draw operation, if true - always queued\n * @return {Promise} when pad is ready for draw operation or false if operation already queued\n * @private */\n syncDraw(kind) {\n let entry = { kind : kind || 'redraw' };\n if (this._doing_draw === undefined) {\n this._doing_draw = [ entry ];\n return Promise.resolve(true);\n }\n // if queued operation registered, ignore next calls, indx == 0 is running operation\n if ((entry.kind !== true) && (this._doing_draw.findIndex((e,i) => (i > 0) && (e.kind == entry.kind)) > 0))\n return false;\n this._doing_draw.push(entry);\n return new Promise(resolveFunc => {\n entry.func = resolveFunc;\n });\n }\n\n /** @summary confirms that drawing is completed, may trigger next drawing immediately\n * @private */\n confirmDraw() {\n if (this._doing_draw === undefined)\n return console.warn('failure, should not happen');\n this._doing_draw.shift();\n if (this._doing_draw.length == 0) {\n delete this._doing_draw;\n } else {\n let entry = this._doing_draw[0];\n if(entry.func) { entry.func(); delete entry.func; }\n }\n }\n\n /** @summary Draw single primitive */\n async drawObject(/*dom, obj, opt*/) {\n console.log('Not possible to draw object without loading of draw.mjs');\n return null;\n }\n\n /** @summary Draw pad primitives\n * @private */\n async drawPrimitives(indx) {\n\n if (indx === undefined) {\n if (this.iscan)\n this._start_tm = new Date().getTime();\n\n // set number of primitves\n this._num_primitives = this.pad && this.pad.fPrimitives ? this.pad.fPrimitives.length : 0;\n\n return this.syncDraw(true).then(() => this.drawPrimitives(0));\n }\n\n if (!this.pad || (indx >= this._num_primitives)) {\n\n this.confirmDraw();\n\n if (this._start_tm) {\n let spenttm = new Date().getTime() - this._start_tm;\n if (spenttm > 3000) console.log(`Canvas drawing took ${(spenttm*1e-3).toFixed(2)}s`);\n delete this._start_tm;\n }\n\n return;\n }\n\n // handle used to invoke callback only when necessary\n return this.drawObject(this.getDom(), this.pad.fPrimitives[indx], '').then(ppainter => {\n // mark painter as belonging to primitives\n if (isObject(ppainter))\n ppainter._primitive = true;\n\n return this.drawPrimitives(indx+1);\n });\n }\n\n /** @summary Process tooltip event in the pad\n * @private */\n processPadTooltipEvent(pnt) {\n let painters = [], hints = [];\n\n // first count - how many processors are there\n if (this.painters !== null)\n this.painters.forEach(obj => {\n if (isFunc(obj.processTooltipEvent)) painters.push(obj);\n });\n\n if (pnt) pnt.nproc = painters.length;\n\n painters.forEach(obj => {\n let hint = obj.processTooltipEvent(pnt);\n if (!hint) hint = { user_info: null };\n hints.push(hint);\n if (pnt && pnt.painters) hint.painter = obj;\n });\n\n return hints;\n }\n\n /** @summary Changes canvas dark mode\n * @private */\n changeDarkMode(mode) {\n this.getCanvSvg().style('filter', (mode ?? settings.DarkMode) ? 'invert(100%)' : null);\n }\n\n /** @summary Fill pad context menu\n * @private */\n fillContextMenu(menu) {\n\n if (this.iscan)\n menu.add('header: RCanvas');\n else\n menu.add('header: RPad');\n\n menu.addchk(this.isTooltipAllowed(), 'Show tooltips', () => this.setTooltipAllowed('toggle'));\n\n if (!this._websocket) {\n menu.addAttributesMenu(this);\n if (this.iscan)\n menu.addSettingsMenu(false, false, arg => {\n if (arg == 'dark') this.changeDarkMode();\n });\n }\n\n menu.add('separator');\n\n if (isFunc(this.hasMenuBar) && isFunc(this.actiavteMenuBar))\n menu.addchk(this.hasMenuBar(), 'Menu bar', flag => this.actiavteMenuBar(flag));\n\n if (isFunc(this.hasEventStatus) && isFunc(this.activateStatusBar))\n menu.addchk(this.hasEventStatus(), 'Event status', () => this.activateStatusBar('toggle'));\n\n if (this.enlargeMain() || (this.has_canvas && this.hasObjectsToDraw()))\n menu.addchk((this.enlargeMain('state') == 'on'), 'Enlarge ' + (this.iscan ? 'canvas' : 'pad'), () => this.enlargePad());\n\n let fname = this.this_pad_name || (this.iscan ? 'canvas' : 'pad');\n menu.add(`Save as ${fname}.png`, fname+'.png', arg => this.saveAs('png', false, arg));\n menu.add(`Save as ${fname}.svg`, fname+'.svg', arg => this.saveAs('svg', false, arg));\n\n return true;\n }\n\n /** @summary Show pad context menu\n * @private */\n padContextMenu(evnt) {\n if (evnt.stopPropagation) {\n let pos = d3_pointer(evnt, this.svg_this_pad().node());\n // this is normal event processing and not emulated jsroot event\n // for debug purposes keep original context menu for small region in top-left corner\n if ((pos.length==2) && (pos[0] >= 0) && (pos[0] < 10) && (pos[1] >= 0) && (pos[1] < 10)) return;\n\n evnt.stopPropagation(); // disable main context menu\n evnt.preventDefault(); // disable browser context menu\n\n this.getFramePainter()?.setLastEventPos();\n }\n\n createMenu(evnt, this).then(menu => {\n this.fillContextMenu(menu);\n return this.fillObjectExecMenu(menu);\n }).then(menu => menu.show());\n }\n\n /** @summary Redraw pad means redraw ourself\n * @return {Promise} when redrawing ready */\n async redrawPad(reason) {\n\n let sync_promise = this.syncDraw(reason);\n if (sync_promise === false) {\n console.log('Prevent RPad redrawing');\n return false;\n }\n\n let showsubitems = true;\n let redrawNext = indx => {\n while (indx < this.painters.length) {\n let sub = this.painters[indx++], res = 0;\n if (showsubitems || sub.this_pad_name)\n res = sub.redraw(reason);\n\n if (isPromise(res))\n return res.then(() => redrawNext(indx));\n }\n return true;\n };\n\n return sync_promise.then(() => {\n if (this.iscan) {\n this.createCanvasSvg(2);\n } else {\n showsubitems = this.createPadSvg(true);\n }\n return redrawNext(0);\n }).then(() => {\n if (getActivePad() === this)\n this.getCanvPainter()?.producePadEvent('padredraw', this);\n this.confirmDraw();\n return true;\n });\n }\n\n /** @summary redraw pad */\n redraw(reason) {\n return this.redrawPad(reason);\n }\n\n\n /** @summary Checks if pad should be redrawn by resize\n * @private */\n needRedrawByResize() {\n let elem = this.svg_this_pad();\n if (!elem.empty() && elem.property('can3d') === constants.Embed3D.Overlay) return true;\n\n for (let i = 0; i < this.painters.length; ++i)\n if (isFunc(this.painters[i].needRedrawByResize))\n if (this.painters[i].needRedrawByResize()) return true;\n\n return false;\n }\n\n /** @summary Check resize of canvas */\n checkCanvasResize(size, force) {\n\n if (!this.iscan && this.has_canvas) return false;\n\n let sync_promise = this.syncDraw('canvas_resize');\n if (sync_promise === false) return false;\n\n if ((size === true) || (size === false)) { force = size; size = null; }\n\n if (isObject(size) && size.force) force = true;\n\n if (!force) force = this.needRedrawByResize();\n\n let changed = false,\n redrawNext = indx => {\n if (!changed || (indx >= this.painters.length)) {\n this.confirmDraw();\n return changed;\n }\n\n return getPromise(this.painters[indx].redraw(force ? 'redraw' : 'resize')).then(() => redrawNext(indx+1));\n };\n\n return sync_promise.then(() => {\n\n changed = this.createCanvasSvg(force ? 2 : 1, size);\n\n // if canvas changed, redraw all its subitems.\n // If redrawing was forced for canvas, same applied for sub-elements\n return redrawNext(0);\n });\n }\n\n /** @summary update RPad object\n * @private */\n updateObject(obj) {\n if (!obj) return false;\n\n this.pad.fStyle = obj.fStyle;\n this.pad.fAttr = obj.fAttr;\n\n if (this.iscan) {\n this.pad.fTitle = obj.fTitle;\n this.pad.fWinSize = obj.fWinSize;\n } else {\n this.pad.fPos = obj.fPos;\n this.pad.fSize = obj.fSize;\n }\n\n return true;\n }\n\n\n /** @summary Add object painter to list of primitives\n * @private */\n addObjectPainter(objpainter, lst, indx) {\n if (objpainter && lst && lst[indx] && (objpainter.snapid === undefined)) {\n // keep snap id in painter, will be used for the\n if (this.painters.indexOf(objpainter) < 0)\n this.painters.push(objpainter);\n objpainter.assignSnapId(lst[indx].fObjectID);\n if (!objpainter.rstyle) objpainter.rstyle = lst[indx].fStyle || this.rstyle;\n }\n }\n\n /** @summary Extract properties from TObjectDisplayItem */\n extractTObjectProp(snap) {\n if (snap.fColIndex && snap.fColValue) {\n let colors = this.root_colors || getRootColors();\n for (let k = 0; k < snap.fColIndex.length; ++k)\n colors[snap.fColIndex[k]] = snap.fColValue[k];\n }\n\n // painter used only for evaluation of attributes\n let pattr = new RObjectPainter(), obj = snap.fObject;\n pattr.assignObject(snap);\n pattr.csstype = snap.fCssType;\n pattr.rstyle = snap.fStyle;\n\n snap.fOption = pattr.v7EvalAttr('options', '');\n\n const extract_color = (member_name, attr_name) => {\n let col = pattr.v7EvalColor(attr_name, '');\n if (col) obj[member_name] = addColor(col, this.root_colors);\n };\n\n // handle TAttLine\n if ((obj.fLineColor !== undefined) && (obj.fLineWidth !== undefined) && (obj.fLineStyle !== undefined)) {\n extract_color('fLineColor', 'line_color');\n obj.fLineWidth = pattr.v7EvalAttr('line_width', obj.fLineWidth);\n obj.fLineStyle = pattr.v7EvalAttr('line_style', obj.fLineStyle);\n }\n\n // handle TAttFill\n if ((obj.fFillColor !== undefined) && (obj.fFillStyle !== undefined)) {\n extract_color('fFillColor', 'fill_color');\n obj.fFillStyle = pattr.v7EvalAttr('fill_style', obj.fFillStyle);\n }\n\n // handle TAttMarker\n if ((obj.fMarkerColor !== undefined) && (obj.fMarkerStyle !== undefined) && (obj.fMarkerSize !== undefined)) {\n extract_color('fMarkerColor', 'marker_color');\n obj.fMarkerStyle = pattr.v7EvalAttr('marker_style', obj.fMarkerStyle);\n obj.fMarkerSize = pattr.v7EvalAttr('marker_size', obj.fMarkerSize);\n }\n\n // handle TAttText\n if ((obj.fTextColor !== undefined) && (obj.fTextAlign !== undefined) && (obj.fTextAngle !== undefined) && (obj.fTextSize !== undefined)) {\n extract_color('fTextColor', 'text_color');\n obj.fTextAlign = pattr.v7EvalAttr('text_align', obj.fTextAlign);\n obj.fTextAngle = pattr.v7EvalAttr('text_angle', obj.fTextAngle);\n obj.fTextSize = pattr.v7EvalAttr('text_size', obj.fTextSize);\n // TODO: v7 font handling differs much from v6, ignore for the moment\n }\n }\n\n /** @summary Function called when drawing next snapshot from the list\n * @return {Promise} with pad painter when ready\n * @private */\n async drawNextSnap(lst, indx) {\n\n if (indx === undefined) {\n indx = -1;\n // flag used to prevent immediate pad redraw during first draw\n this._snaps_map = {}; // to control how much snaps are drawn\n this._num_primitives = lst ? lst.length : 0;\n this._auto_color_cnt = 0;\n }\n\n delete this.next_rstyle;\n\n ++indx; // change to the next snap\n\n if (!lst || indx >= lst.length) {\n delete this._snaps_map;\n delete this._auto_color_cnt;\n return this;\n }\n\n let snap = lst[indx],\n snapid = snap.fObjectID,\n cnt = this._snaps_map[snapid],\n objpainter = null;\n\n if (cnt) cnt++; else cnt=1;\n this._snaps_map[snapid] = cnt; // check how many objects with same snapid drawn, use them again\n\n // empty object, no need to do something, take next\n if (snap.fDummy) return this.drawNextSnap(lst, indx);\n\n // first appropriate painter for the object\n // if same object drawn twice, two painters will exists\n for (let k = 0; k < this.painters.length; ++k) {\n if (this.painters[k].snapid === snapid)\n if (--cnt === 0) { objpainter = this.painters[k]; break; }\n }\n\n if (objpainter) {\n\n if (snap._typename == 'ROOT::Experimental::RPadDisplayItem') // subpad\n return objpainter.redrawPadSnap(snap).then(ppainter => {\n this.addObjectPainter(ppainter, lst, indx);\n return this.drawNextSnap(lst, indx);\n });\n\n if (snap._typename === 'ROOT::Experimental::TObjectDisplayItem')\n this.extractTObjectProp(snap);\n\n let promise;\n\n if (objpainter.updateObject(snap.fDrawable || snap.fObject || snap, snap.fOption || '', true))\n promise = objpainter.redraw();\n\n return getPromise(promise).then(() => this.drawNextSnap(lst, indx)); // call next\n }\n\n if (snap._typename == 'ROOT::Experimental::RPadDisplayItem') { // subpad\n\n let subpad = snap; // not subpad, but just attributes\n\n let padpainter = new RPadPainter(this.getDom(), subpad, false);\n padpainter.decodeOptions('');\n padpainter.addToPadPrimitives(this.this_pad_name); // only set parent pad name\n padpainter.assignSnapId(snap.fObjectID);\n padpainter.rstyle = snap.fStyle;\n\n padpainter.createPadSvg();\n\n if (snap.fPrimitives && snap.fPrimitives.length > 0)\n padpainter.addPadButtons();\n\n // we select current pad, where all drawing is performed\n let prev_name = padpainter.selectCurrentPad(padpainter.this_pad_name);\n\n return padpainter.drawNextSnap(snap.fPrimitives).then(() => {\n padpainter.selectCurrentPad(prev_name);\n return this.drawNextSnap(lst, indx);\n });\n }\n\n // will be used in addToPadPrimitives to assign style to sub-painters\n this.next_rstyle = lst[indx].fStyle || this.rstyle;\n\n if (snap._typename === 'ROOT::Experimental::TObjectDisplayItem') {\n\n // identifier used in RObjectDrawable\n const webSnapIds = { kNone: 0, kObject: 1, kColors: 4, kStyle: 5, kPalette: 6 };\n\n if (snap.fKind == webSnapIds.kStyle) {\n Object.assign(gStyle, snap.fObject);\n return this.drawNextSnap(lst, indx);\n }\n\n if (snap.fKind == webSnapIds.kColors) {\n let ListOfColors = [], arr = snap.fObject.arr;\n for (let n = 0; n < arr.length; ++n) {\n let name = arr[n].fString, p = name.indexOf('=');\n if (p > 0)\n ListOfColors[parseInt(name.slice(0,p))] = name.slice(p+1);\n }\n\n this.root_colors = ListOfColors;\n // set global list of colors\n // adoptRootColors(ListOfColors);\n return this.drawNextSnap(lst, indx);\n }\n\n if (snap.fKind == webSnapIds.kPalette) {\n let arr = snap.fObject.arr, palette = [];\n for (let n = 0; n < arr.length; ++n)\n palette[n] = arr[n].fString;\n this.custom_palette = new ColorPalette(palette);\n return this.drawNextSnap(lst, indx);\n }\n\n if (!this.getFramePainter())\n return this.drawObject(this.getDom(), { _typename: 'TFrame', $dummy: true }, '')\n .then(() => this.drawNextSnap(lst, indx-1)); // call same object again\n\n this.extractTObjectProp(snap);\n }\n\n // TODO - fDrawable is v7, fObject from v6, maybe use same data member?\n return this.drawObject(this.getDom(), snap.fDrawable || snap.fObject || snap, snap.fOption || '').then(objpainter => {\n this.addObjectPainter(objpainter, lst, indx);\n return this.drawNextSnap(lst, indx);\n });\n }\n\n /** @summary Search painter with specified snapid, also sub-pads are checked\n * @private */\n findSnap(snapid, onlyid) {\n\n function check(checkid) {\n if (!checkid || !isStr(checkid)) return false;\n if (checkid == snapid) return true;\n return onlyid && (checkid.length > snapid.length) &&\n (checkid.indexOf(snapid) == (checkid.length - snapid.length));\n }\n\n if (check(this.snapid)) return this;\n\n if (!this.painters) return null;\n\n for (let k=0;k {\n if (sub && (prim.fObjectID === sub.snapid)) {\n sub = null; isanyfound = true;\n }\n });\n\n if (sub) {\n // remove painter which does not found in the list of snaps\n this.painters.splice(k--,1);\n sub.cleanup(); // cleanup such painter\n isanyremove = true;\n if (this.main_painter_ref === sub)\n delete this.main_painter_ref;\n }\n }\n\n if (isanyremove)\n delete this.pads_cache;\n\n if (!isanyfound) {\n let fp = this.getFramePainter();\n // cannot preserve ROOT6 frame - it must be recreated\n if (fp?.is_root6()) fp = null;\n for (let k = 0; k < this.painters.length; ++k)\n if (fp !== this.painters[k])\n this.painters[k].cleanup();\n this.painters = [];\n delete this.main_painter_ref;\n if (fp) {\n this.painters.push(fp);\n fp.cleanFrameDrawings();\n fp.redraw(); // need to create all layers again\n }\n if (this.removePadButtons) this.removePadButtons();\n this.addPadButtons(true);\n }\n\n let prev_name = this.selectCurrentPad(this.this_pad_name);\n\n return this.drawNextSnap(snap.fPrimitives).then(() => {\n this.selectCurrentPad(prev_name);\n\n if (getActivePad() === this)\n this.getCanvPainter()?.producePadEvent('padredraw', this);\n return this;\n });\n }\n\n /** @summary Create image for the pad\n * @desc Used with web-based canvas to create images for server side\n * @return {Promise} with image data, coded with btoa() function\n * @private */\n async createImage(format) {\n // use https://github.com/MrRio/jsPDF in the future here\n if (format == 'pdf')\n return btoa_func('dummy PDF file');\n\n if ((format == 'png') || (format == 'jpeg') || (format == 'svg'))\n return this.produceImage(true, format).then(res => {\n if (!res || (format == 'svg')) return res;\n let separ = res.indexOf('base64,');\n return (separ > 0) ? res.slice(separ+7) : '';\n });\n\n return '';\n }\n\n /** @summary Show context menu for specified item\n * @private */\n itemContextMenu(name) {\n let rrr = this.svg_this_pad().node().getBoundingClientRect(),\n evnt = { clientX: rrr.left+10, clientY: rrr.top + 10 };\n\n // use timeout to avoid conflict with mouse click and automatic menu close\n if (name == 'pad')\n return setTimeout(() => this.padContextMenu(evnt), 50);\n\n let selp = null, selkind;\n\n switch(name) {\n case 'xaxis':\n case 'yaxis':\n case 'zaxis':\n selp = this.getMainPainter();\n selkind = name[0];\n break;\n case 'frame':\n selp = this.getFramePainter();\n break;\n default: {\n let indx = parseInt(name);\n if (Number.isInteger(indx)) selp = this.painters[indx];\n }\n }\n\n if (!isFunc(selp?.fillContextMenu)) return;\n\n createMenu(evnt, selp).then(menu => {\n if (selp.fillContextMenu(menu, selkind))\n selp.fillObjectExecMenu(menu, selkind).then(() => setTimeout(() => menu.show(), 50));\n });\n }\n\n /** @summary Save pad in specified format\n * @desc Used from context menu */\n saveAs(kind, full_canvas, filename) {\n if (!filename)\n filename = (this.this_pad_name || (this.iscan ? 'canvas' : 'pad')) + '.' + kind;\n\n this.produceImage(full_canvas, kind).then(imgdata => {\n if (!imgdata)\n return console.error(`Fail to produce image ${filename}`);\n\n saveFile(filename, (kind != 'svg') ? imgdata : 'data:image/svg+xml;charset=utf-8,'+encodeURIComponent(imgdata));\n });\n }\n\n /** @summary Search active pad\n * @return {Object} pad painter for active pad */\n findActivePad() {\n return null;\n }\n\n /** @summary Prodce image for the pad\n * @return {Promise} with created image */\n async produceImage(full_canvas, file_format) {\n\n let use_frame = (full_canvas === 'frame'),\n elem = use_frame ? this.getFrameSvg(this.this_pad_name) : (full_canvas ? this.getCanvSvg() : this.svg_this_pad()),\n painter = (full_canvas && !use_frame) ? this.getCanvPainter() : this,\n items = []; // keep list of replaced elements, which should be moved back at the end\n\n if (elem.empty())\n return '';\n\n if (!use_frame) // do not make transformations for the frame\n painter.forEachPainterInPad(pp => {\n\n let item = { prnt: pp.svg_this_pad() };\n items.push(item);\n\n // remove buttons from each subpad\n let btns = pp.getLayerSvg('btns_layer', this.this_pad_name);\n item.btns_node = btns.node();\n if (item.btns_node) {\n item.btns_prnt = item.btns_node.parentNode;\n item.btns_next = item.btns_node.nextSibling;\n btns.remove();\n }\n\n let main = pp.getFramePainter();\n if (!main || !isFunc(main.render3D) || !isFunc(main.access3dKind)) return;\n\n let can3d = main.access3dKind();\n\n if ((can3d !== constants.Embed3D.Overlay) && (can3d !== constants.Embed3D.Embed)) return;\n\n let sz2 = main.getSizeFor3d(constants.Embed3D.Embed), // get size and position of DOM element as it will be embed\n canvas = main.renderer.domElement;\n\n main.render3D(0); // WebGL clears buffers, therefore we should render scene and convert immediately\n\n let dataUrl = canvas.toDataURL('image/png');\n\n // remove 3D drawings\n\n if (can3d === constants.Embed3D.Embed) {\n item.foreign = item.prnt.select('.' + sz2.clname);\n item.foreign.remove();\n }\n\n let svg_frame = main.getFrameSvg();\n item.frame_node = svg_frame.node();\n if (item.frame_node) {\n item.frame_next = item.frame_node.nextSibling;\n svg_frame.remove();\n }\n\n // add svg image\n item.img = item.prnt.insert('image','.primitives_layer') // create image object\n .attr('x', sz2.x)\n .attr('y', sz2.y)\n .attr('width', canvas.width)\n .attr('height', canvas.height)\n .attr('href', dataUrl);\n\n }, 'pads');\n\n const reEncode = data => {\n data = encodeURIComponent(data);\n data = data.replace(/%([0-9A-F]{2})/g, function(match, p1) {\n let c = String.fromCharCode('0x'+p1);\n return c === '%' ? '%25' : c;\n });\n return decodeURIComponent(data);\n }, reconstruct = () => {\n for (let k = 0; k < items.length; ++k) {\n let item = items[k];\n\n if (item.img)\n item.img.remove(); // delete embed image\n\n let prim = item.prnt.select('.primitives_layer');\n\n if (item.foreign) // reinsert foreign object\n item.prnt.node().insertBefore(item.foreign.node(), prim.node());\n\n if (item.frame_node) // reinsert frame as first in list of primitives\n prim.node().insertBefore(item.frame_node, item.frame_next);\n\n if (item.btns_node) // reinsert buttons\n item.btns_prnt.insertBefore(item.btns_node, item.btns_next);\n }\n };\n\n let width = elem.property('draw_width'), height = elem.property('draw_height');\n if (use_frame) {\n let fp = this.getFramePainter();\n width = fp.getFrameWidth();\n height = fp.getFrameHeight();\n }\n\n let svg = `${elem.node().innerHTML}`;\n\n if (internals.processSvgWorkarounds)\n svg = internals.processSvgWorkarounds(svg);\n\n svg = compressSVG(svg);\n\n if (file_format == 'svg') {\n reconstruct();\n return svg; // return SVG file as is\n }\n\n let doctype = '',\n image = new Image();\n\n return new Promise(resolveFunc => {\n image.onload = function() {\n let canvas = document.createElement('canvas');\n canvas.width = image.width;\n canvas.height = image.height;\n let context = canvas.getContext('2d');\n context.drawImage(image, 0, 0);\n\n reconstruct();\n\n resolveFunc(canvas.toDataURL('image/' + file_format));\n }\n\n image.onerror = function(arg) {\n console.log(`IMAGE ERROR ${arg}`);\n reconstruct();\n resolveFunc(null);\n }\n\n image.src = 'data:image/svg+xml;base64,' + btoa_func(reEncode(doctype + svg));\n });\n }\n\n /** @summary Process pad button click */\n clickPadButton(funcname, evnt) {\n\n if (funcname == 'CanvasSnapShot')\n return this.saveAs('png', true);\n\n if (funcname == 'enlargePad')\n return this.enlargePad();\n\n if (funcname == 'PadSnapShot')\n return this.saveAs('png', false);\n\n if (funcname == 'PadContextMenus') {\n\n if (evnt) {\n evnt.preventDefault();\n evnt.stopPropagation();\n }\n\n if (closeMenu()) return;\n\n createMenu(evnt, this).then(menu => {\n menu.add('header:Menus');\n\n if (this.iscan)\n menu.add('Canvas', 'pad', this.itemContextMenu);\n else\n menu.add('Pad', 'pad', this.itemContextMenu);\n\n if (this.getFramePainter())\n menu.add('Frame', 'frame', this.itemContextMenu);\n\n let main = this.getMainPainter(); // here hist painter methods\n\n if (main) {\n menu.add('X axis', 'xaxis', this.itemContextMenu);\n menu.add('Y axis', 'yaxis', this.itemContextMenu);\n if (isFunc(main.getDimension) && (main.getDimension() > 1))\n menu.add('Z axis', 'zaxis', this.itemContextMenu);\n }\n\n if (this.painters?.length) {\n menu.add('separator');\n let shown = [];\n for (let n = 0; n < this.painters.length; ++n) {\n let obj = this.painters[n]?.getObject();\n if (!obj || (shown.indexOf(obj) >= 0)) continue;\n\n let name = obj._typename ? obj._typename + '::' : '';\n if (obj.fName) name += obj.fName;\n if (!name) name = 'item' + n;\n menu.add(name, n, this.itemContextMenu);\n }\n }\n\n menu.show();\n });\n\n return;\n }\n\n // click automatically goes to all sub-pads\n // if any painter indicates that processing completed, it returns true\n let done = false;\n\n for (let i = 0; i < this.painters.length; ++i) {\n let pp = this.painters[i];\n\n if (isFunc(pp.clickPadButton))\n pp.clickPadButton(funcname);\n\n if (!done && isFunc(pp.clickButton))\n done = pp.clickButton(funcname);\n }\n }\n\n /** @summary Add button to the pad\n * @private */\n addPadButton(btn, tooltip, funcname, keyname) {\n if (!settings.ToolBar || isBatchMode() || this.batch_mode) return;\n\n if (!this._buttons) this._buttons = [];\n // check if there are duplications\n\n for (let k = 0; k < this._buttons.length; ++k)\n if (this._buttons[k].funcname == funcname) return;\n\n this._buttons.push({ btn, tooltip, funcname, keyname });\n\n let iscan = this.iscan || !this.has_canvas;\n if (!iscan && (funcname.indexOf('Pad') != 0) && (funcname !== 'enlargePad')) {\n let cp = this.getCanvPainter();\n if (cp && (cp !== this)) cp.addPadButton(btn, tooltip, funcname);\n }\n }\n\n /** @summary Add buttons for pad or canvas\n * @private */\n addPadButtons(is_online) {\n\n this.addPadButton('camera', 'Create PNG', this.iscan ? 'CanvasSnapShot' : 'PadSnapShot', 'Ctrl PrintScreen');\n\n if (settings.ContextMenu)\n this.addPadButton('question', 'Access context menus', 'PadContextMenus');\n\n let add_enlarge = !this.iscan && this.has_canvas && this.hasObjectsToDraw()\n\n if (add_enlarge || this.enlargeMain('verify'))\n this.addPadButton('circle', 'Enlarge canvas', 'enlargePad');\n\n if (is_online && this.brlayout) {\n this.addPadButton('diamand', 'Toggle Ged', 'ToggleGed');\n this.addPadButton('three_circles', 'Toggle Status', 'ToggleStatus');\n }\n\n }\n\n /** @summary Show pad buttons\n * @private */\n showPadButtons() {\n if (!this._buttons) return;\n\n PadButtonsHandler.assign(this);\n this.showPadButtons();\n }\n\n /** @summary Calculates RPadLength value */\n getPadLength(vertical, len, frame_painter) {\n let sign = vertical ? -1 : 1,\n rect, res,\n getV = (indx, dflt) => (indx < len.fArr.length) ? len.fArr[indx] : dflt,\n getRect = () => {\n if (!rect)\n rect = frame_painter ? frame_painter.getFrameRect() : this.getPadRect();\n return rect;\n };\n\n if (frame_painter) {\n let user = getV(2), func = vertical ? 'gry' : 'grx';\n if ((user !== undefined) && frame_painter[func])\n res = frame_painter[func](user);\n }\n\n if (res === undefined)\n res = vertical ? getRect().height : 0;\n\n let norm = getV(0, 0), pixel = getV(1, 0);\n\n res += sign*pixel;\n\n if (norm)\n res += sign * (vertical ? getRect().height : getRect().width) * norm;\n\n return Math.round(res);\n }\n\n\n /** @summary Calculates pad position for RPadPos values\n * @param {object} pos - instance of RPadPos\n * @param {object} frame_painter - if drawing will be performed inside frame, frame painter */\n getCoordinate(pos, frame_painter) {\n return {\n x: this.getPadLength(false, pos.fHoriz, frame_painter),\n y: this.getPadLength(true, pos.fVert, frame_painter)\n }\n }\n\n /** @summary Decode pad draw options */\n decodeOptions(opt) {\n let pad = this.getObject();\n if (!pad) return;\n\n let d = new DrawOptions(opt);\n\n if (!this.options) this.options = {};\n\n Object.assign(this.options, { GlobalColors: true, LocalColors: false, IgnorePalette: false, RotateFrame: false, FixFrame: false });\n\n if (d.check('NOCOLORS') || d.check('NOCOL')) this.options.GlobalColors = this.options.LocalColors = false;\n if (d.check('LCOLORS') || d.check('LCOL')) { this.options.GlobalColors = false; this.options.LocalColors = true; }\n if (d.check('NOPALETTE') || d.check('NOPAL')) this.options.IgnorePalette = true;\n if (d.check('ROTATE')) this.options.RotateFrame = true;\n if (d.check('FIXFRAME')) this.options.FixFrame = true;\n\n if (d.check('WHITE')) pad.fFillColor = 0;\n if (d.check('LOGX')) pad.fLogx = 1;\n if (d.check('LOGY')) pad.fLogy = 1;\n if (d.check('LOGZ')) pad.fLogz = 1;\n if (d.check('LOG')) pad.fLogx = pad.fLogy = pad.fLogz = 1;\n if (d.check('GRIDX')) pad.fGridx = 1;\n if (d.check('GRIDY')) pad.fGridy = 1;\n if (d.check('GRID')) pad.fGridx = pad.fGridy = 1;\n if (d.check('TICKX')) pad.fTickx = 1;\n if (d.check('TICKY')) pad.fTicky = 1;\n if (d.check('TICK')) pad.fTickx = pad.fTicky = 1;\n }\n\n /** @summary draw RPad object */\n static async draw(dom, pad, opt) {\n let painter = new RPadPainter(dom, pad, false);\n painter.decodeOptions(opt);\n\n if (painter.getCanvSvg().empty()) {\n painter.has_canvas = false;\n painter.this_pad_name = '';\n painter.setTopPainter();\n } else {\n painter.addToPadPrimitives(painter.pad_name); // must be here due to pad painter\n }\n\n painter.createPadSvg();\n\n if (painter.matchObjectType(clTPad) && (!painter.has_canvas || painter.hasObjectsToDraw())) {\n painter.addPadButtons();\n }\n\n // we select current pad, where all drawing is performed\n let prev_name = painter.has_canvas ? painter.selectCurrentPad(painter.this_pad_name) : undefined;\n\n selectActivePad({ pp: painter, active: false });\n\n // flag used to prevent immediate pad redraw during first draw\n return painter.drawPrimitives().then(() => {\n painter.showPadButtons();\n // we restore previous pad name\n painter.selectCurrentPad(prev_name);\n return painter;\n });\n }\n\n} // class RPadPainter\n\nexport { RPadPainter };\n","import { httpRequest, createHttpRequest, loadScript, decodeUrl,\n browser, setBatchMode, isBatchMode, isObject, isFunc, isStr, btoa_func } from './core.mjs';\nimport { closeCurrentWindow, showProgress, loadOpenui5 } from './gui/utils.mjs';\n\n\n/**\n * @summary Class emulating web socket with long-poll http requests\n *\n * @private\n */\n\nclass LongPollSocket {\n\n constructor(addr, _raw, _args) {\n this.path = addr;\n this.connid = null;\n this.req = null;\n this.raw = _raw;\n this.args = _args;\n\n this.nextRequest('', 'connect');\n }\n\n /** @summary Submit next request */\n nextRequest(data, kind) {\n let url = this.path, reqmode = 'buf', post = null;\n if (kind === 'connect') {\n url += this.raw ? '?raw_connect' : '?txt_connect';\n if (this.args) url += '&' + this.args;\n console.log(`longpoll connect ${url} raw = ${this.raw}`);\n this.connid = 'connect';\n } else if (kind === 'close') {\n if ((this.connid === null) || (this.connid === 'close')) return;\n url += `?connection=${this.connid}&close`;\n this.connid = 'close';\n reqmode = 'text;sync'; // use sync mode to close connection before browser window closed\n } else if ((this.connid === null) || (typeof this.connid !== 'number')) {\n if (!browser.qt5) console.error('No connection');\n return;\n } else {\n url += '?connection=' + this.connid;\n if (kind === 'dummy') url += '&dummy';\n }\n\n if (data) {\n if (this.raw) {\n // special workaround to avoid POST request, use base64 coding\n url += '&post=' + btoa_func(data);\n } else {\n // send data with post request - most efficient way\n reqmode = 'postbuf';\n post = data;\n }\n }\n\n createHttpRequest(url, reqmode, function(res) {\n // this set to the request itself, res is response\n\n if (this.handle.req === this)\n this.handle.req = null; // get response for existing dummy request\n\n if (res === null)\n return this.handle.processRequest(null);\n\n if (this.handle.raw) {\n // raw mode - all kind of reply data packed into binary buffer\n // first 4 bytes header 'txt:' or 'bin:'\n // after the 'bin:' there is length of optional text argument like 'bin:14 :optional_text'\n // and immedaitely after text binary data. Server sends binary data so, that offset should be multiple of 8\n\n let str = '', i = 0, u8Arr = new Uint8Array(res), offset = u8Arr.length;\n if (offset < 4) {\n if (!browser.qt5) console.error(`longpoll got short message in raw mode ${offset}`);\n return this.handle.processRequest(null);\n }\n\n while (i < 4) str += String.fromCharCode(u8Arr[i++]);\n if (str != 'txt:') {\n str = '';\n while ((i < offset) && (String.fromCharCode(u8Arr[i]) != ':'))\n str += String.fromCharCode(u8Arr[i++]);\n ++i;\n offset = i + parseInt(str.trim());\n }\n\n str = '';\n while (i < offset) str += String.fromCharCode(u8Arr[i++]);\n\n if (str) {\n if (str == '<>')\n this.handle.processRequest(-1111);\n else\n this.handle.processRequest(str);\n }\n if (offset < u8Arr.length)\n this.handle.processRequest(res, offset);\n } else if (this.getResponseHeader('Content-Type') == 'application/x-binary') {\n // binary reply with optional header\n let extra_hdr = this.getResponseHeader('LongpollHeader');\n if (extra_hdr) this.handle.processRequest(extra_hdr);\n this.handle.processRequest(res, 0);\n } else {\n // text reply\n if (res && !isStr(res)) {\n let str = '', u8Arr = new Uint8Array(res);\n for (let i = 0; i < u8Arr.length; ++i)\n str += String.fromCharCode(u8Arr[i]);\n res = str;\n }\n if (res == '<>')\n this.handle.processRequest(-1111);\n else\n this.handle.processRequest(res);\n }\n }, function(/*err,status*/) {\n this.handle.processRequest(null, 'error');\n }, true).then(req => {\n req.handle = this;\n if (!this.req)\n this.req = req; // any request can be used for response, do not submit dummy until req is there\n req.send(post);\n });\n }\n\n /** @summary Process request */\n processRequest(res, _offset) {\n if (res === null) {\n if (isFunc(this.onerror))\n this.onerror('receive data with connid ' + (this.connid || '---'));\n if ((_offset == 'error') && isFunc(this.onclose))\n this.onclose('force_close');\n this.connid = null;\n return;\n } else if (res === -1111) {\n res = '';\n }\n\n let dummy_tmout = 5;\n\n if (this.connid === 'connect') {\n if (!res) {\n this.connid = null;\n if (isFunc(this.onerror))\n this.onerror('connection rejected');\n return;\n }\n\n this.connid = parseInt(res);\n dummy_tmout = 100; // when establishing connection, wait a bit longer to submit dummy package\n console.log(`Get new longpoll connection with id ${this.connid}`);\n if (isFunc(this.onopen))\n this.onopen();\n } else if (this.connid === 'close') {\n if (isFunc(this.onclose))\n this.onclose();\n return;\n } else {\n if (isFunc(this.onmessage) && res)\n this.onmessage({ data: res, offset: _offset });\n }\n\n // minimal timeout to reduce load, generate dummy only if client not submit new request immediately\n if (!this.req)\n setTimeout(() => { if (!this.req) this.nextRequest('', 'dummy'); }, dummy_tmout);\n }\n\n /** @summary Send data */\n send(str) { this.nextRequest(str); }\n\n /** @summary Close connection */\n close() { this.nextRequest('', 'close'); }\n\n} // class LongPollSocket\n\n// ========================================================================================\n\n/**\n * @summary Class re-playing socket data from stored protocol\n *\n * @private\n */\n\nclass FileDumpSocket {\n\n constructor(receiver) {\n this.receiver = receiver;\n this.protocol = [];\n this.cnt = 0;\n httpRequest('protocol.json', 'text').then(res => this.getProtocol(res));\n }\n\n /** @summary Get stored protocol */\n getProtocol(res) {\n if (!res) return;\n this.protocol = JSON.parse(res);\n if (isFunc(this.onopen)) this.onopen();\n this.nextOperation();\n }\n\n /** @summary Emulate send - just cound operation */\n send(/* str */) {\n if (this.protocol[this.cnt] == 'send') {\n this.cnt++;\n setTimeout(() => this.nextOperation(), 10);\n }\n }\n\n /** @summary Emulate close */\n close() {}\n\n /** @summary Read data for next operation */\n nextOperation() {\n // when file request running - just ignore\n if (this.wait_for_file) return;\n let fname = this.protocol[this.cnt];\n if (!fname) return;\n if (fname == 'send') return; // waiting for send\n this.wait_for_file = true;\n this.cnt++;\n httpRequest(fname, (fname.indexOf('.bin') > 0 ? 'buf' : 'text')).then(res => {\n this.wait_for_file = false;\n if (!res) return;\n if (this.receiver.provideData)\n this.receiver.provideData(1, res, 0);\n setTimeout(() => this.nextOperation(), 10);\n });\n }\n\n} // class FileDumpSocket\n\n\n/**\n * @summary Client communication handle for RWebWindow.\n *\n * @desc Should be created with {@link connectWebWindow} function\n */\n\nclass WebWindowHandle {\n\n constructor(socket_kind, credits) {\n this.kind = socket_kind;\n this.state = 0;\n this.credits = credits || 10;\n this.cansend = this.credits;\n this.ackn = this.credits;\n }\n\n /** @summary Returns arguments specified in the RWebWindow::SetUserArgs() method\n * @desc Can be any valid JSON expression. Undefined by default.\n * @param {string} [field] - if specified and user args is object, returns correspondent object member\n * @return user arguments object */\n getUserArgs(field) {\n if (field && isStr(field))\n return isObject(this.user_args) ? this.user_args[field] : undefined;\n\n return this.user_args;\n }\n\n /** @summary Set user args\n * @desc Normally set via RWebWindow::SetUserArgs() method */\n setUserArgs(args) { this.user_args = args; }\n\n /** @summary Set callbacks receiver.\n * @param {object} obj - object with receiver functions\n * @param {function} obj.onWebsocketMsg - called when new data receieved from RWebWindow\n * @param {function} obj.onWebsocketOpened - called when connection established\n * @param {function} obj.onWebsocketClosed - called when connection closed\n * @param {function} obj.onWebsocketError - called when get error via the connection */\n setReceiver(obj) { this.receiver = obj; }\n\n /** @summary Cleanup and close connection. */\n cleanup() {\n delete this.receiver;\n this.close(true);\n }\n\n /** @summary Invoke method in the receiver.\n * @private */\n invokeReceiver(brdcst, method, arg, arg2) {\n if (this.receiver && isFunc(this.receiver[method]))\n this.receiver[method](this, arg, arg2);\n\n if (brdcst && this.channels) {\n let ks = Object.keys(this.channels);\n for (let n = 0; n < ks.length; ++n)\n this.channels[ks[n]].invokeReceiver(false, method, arg, arg2);\n }\n }\n\n /** @summary Provide data for receiver. When no queue - do it directly.\n * @private */\n provideData(chid, _msg, _len) {\n if (this.wait_first_recv) {\n delete this.wait_first_recv;\n return this.invokeReceiver(false, 'onWebsocketOpened');\n }\n\n if ((chid > 1) && this.channels) {\n const channel = this.channels[chid];\n if (channel)\n return channel.provideData(1, _msg, _len);\n }\n\n const force_queue = _len && (_len < 0);\n\n if (!force_queue && (!this.msgqueue || !this.msgqueue.length))\n return this.invokeReceiver(false, 'onWebsocketMsg', _msg, _len);\n\n if (!this.msgqueue) this.msgqueue = [];\n if (force_queue) _len = undefined;\n\n this.msgqueue.push({ ready: true, msg: _msg, len: _len });\n }\n\n /** @summary Reserve entry in queue for data, which is not yet decoded.\n * @private */\n reserveQueueItem() {\n if (!this.msgqueue) this.msgqueue = [];\n let item = { ready: false, msg: null, len: 0 };\n this.msgqueue.push(item);\n return item;\n }\n\n /** @summary Provide data for item which was reserved before.\n * @private */\n markQueueItemDone(item, _msg, _len) {\n item.ready = true;\n item.msg = _msg;\n item.len = _len;\n this.processQueue();\n }\n\n /** @summary Process completed messages in the queue\n * @private */\n processQueue() {\n if (this._loop_msgqueue || !this.msgqueue) return;\n this._loop_msgqueue = true;\n while ((this.msgqueue.length > 0) && this.msgqueue[0].ready) {\n let front = this.msgqueue.shift();\n this.invokeReceiver(false, 'onWebsocketMsg', front.msg, front.len);\n }\n if (this.msgqueue.length == 0)\n delete this.msgqueue;\n delete this._loop_msgqueue;\n }\n\n /** @summary Close connection */\n close(force) {\n if (this.master) {\n this.master.send('CLOSECH=' + this.channelid, 0);\n delete this.master.channels[this.channelid];\n delete this.master;\n return;\n }\n\n if (this.timerid) {\n clearTimeout(this.timerid);\n delete this.timerid;\n }\n\n if (this._websocket && (this.state > 0)) {\n this.state = force ? -1 : 0; // -1 prevent socket from reopening\n this._websocket.onclose = null; // hide normal handler\n this._websocket.close();\n delete this._websocket;\n }\n }\n\n /** @summary Checks number of credits for send operation\n * @param {number} [numsend = 1] - number of required send operations\n * @return true if one allow to send specified number of text message to server */\n canSend(numsend) { return this.cansend >= (numsend || 1); }\n\n /** @summary Returns number of possible send operations relative to number of credits */\n getRelCanSend() { return !this.credits ? 1 : this.cansend / this.credits; }\n\n /** @summary Send text message via the connection.\n * @param {string} msg - text message to send\n * @param {number} [chid] - channel id, 1 by default, 0 used only for internal communication */\n send(msg, chid) {\n if (this.master)\n return this.master.send(msg, this.channelid);\n\n if (!this._websocket || (this.state <= 0)) return false;\n\n if (!Number.isInteger(chid)) chid = 1; // when not configured, channel 1 is used - main widget\n\n if (this.cansend <= 0) console.error(`should be queued before sending cansend: ${this.cansend}`);\n\n let prefix = `${this.ackn}:${this.cansend}:${chid}:`;\n this.ackn = 0;\n this.cansend--; // decrease number of allowed send packets\n\n this._websocket.send(prefix + msg);\n\n if ((this.kind === 'websocket') || (this.kind === 'longpoll')) {\n if (this.timerid) clearTimeout(this.timerid);\n this.timerid = setTimeout(() => this.keepAlive(), 10000);\n }\n\n return true;\n }\n\n /** @summary Inject message(s) into input queue, for debug purposes only\n * @private */\n inject(msg, chid, immediate) {\n // use timeout to avoid too deep call stack\n if (!immediate)\n return setTimeout(this.inject.bind(this, msg, chid, true), 0);\n\n if (chid === undefined) chid = 1;\n\n if (Array.isArray(msg)) {\n for (let k = 0; k < msg.length; ++k)\n this.provideData(chid, isStr(msg[k]) ? msg[k] : JSON.stringify(msg[k]), -1);\n this.processQueue();\n } else if (msg) {\n this.provideData(chid, isStr(msg) ? msg : JSON.stringify(msg));\n }\n }\n\n /** @summary Send keep-alive message.\n * @desc Only for internal use, only when used with websockets\n * @private */\n keepAlive() {\n delete this.timerid;\n this.send('KEEPALIVE', 0);\n }\n\n /** @summary Method open channel, which will share same connection, but can be used independently from main\n * @private */\n createChannel() {\n if (this.master)\n return master.createChannel();\n\n let channel = new WebWindowHandle('channel', this.credits);\n channel.wait_first_recv = true; // first received message via the channel is confirmation of established connection\n\n if (!this.channels) {\n this.channels = {};\n this.freechannelid = 2;\n }\n\n channel.master = this;\n channel.channelid = this.freechannelid++;\n\n // register\n this.channels[channel.channelid] = channel;\n\n // now server-side entity should be initialized and init message send from server side!\n return channel;\n }\n\n /** @summary Returns used channel ID, 1 by default */\n getChannelId() { return this.channelid && this.master ? this.channelid : 1; }\n\n /** @summary Assign href parameter\n * @param {string} [path] - absolute path, when not specified window.location.url will be used\n * @private */\n setHRef(path) { this.href = path; }\n\n /** @summary Return href part\n * @param {string} [relative_path] - relative path to the handle\n * @private */\n getHRef(relative_path) {\n if (!relative_path || !this.kind || !this.href) return this.href;\n\n let addr = this.href;\n if (relative_path.indexOf('../') == 0) {\n let ddd = addr.lastIndexOf('/',addr.length-2);\n addr = addr.slice(0,ddd) + relative_path.slice(2);\n } else {\n addr += relative_path;\n }\n\n return addr;\n }\n\n /** @summary Create configured socket for current object.\n * @private */\n connect(href) {\n\n this.close();\n if (!href && this.href) href = this.href;\n\n let ntry = 0, args = (this.key ? ('key=' + this.key) : '');\n if (this.token) {\n if (args) args += '&';\n args += 'token=' + this.token;\n }\n\n const retry_open = first_time => {\n\n if (this.state != 0) return;\n\n if (!first_time) console.log(`try connect window again ${new Date().toString()}`);\n\n if (this._websocket) {\n this._websocket.close();\n delete this._websocket;\n }\n\n if (!href) {\n href = window.location.href;\n if (href && href.indexOf('#') > 0) href = href.slice(0, href.indexOf('#'));\n if (href && href.lastIndexOf('/') > 0) href = href.slice(0, href.lastIndexOf('/') + 1);\n }\n this.href = href;\n ntry++;\n\n if (first_time) console.log(`Opening web socket at ${href}`);\n\n if (ntry > 2) showProgress(`Trying to connect ${href}`);\n\n let path = href;\n\n if (this.kind == 'file') {\n path += 'root.filedump';\n this._websocket = new FileDumpSocket(this);\n console.log(`configure protocol log ${path}`);\n } else if ((this.kind === 'websocket') && first_time) {\n path = path.replace('http://', 'ws://').replace('https://', 'wss://') + 'root.websocket';\n if (args) path += '?' + args;\n console.log(`configure websocket ${path}`);\n this._websocket = new WebSocket(path);\n } else {\n path += 'root.longpoll';\n console.log(`configure longpoll ${path}`);\n this._websocket = new LongPollSocket(path, (this.kind === 'rawlongpoll'), args);\n }\n\n if (!this._websocket) return;\n\n this._websocket.onopen = () => {\n if (ntry > 2) showProgress();\n this.state = 1;\n\n let key = this.key || '';\n\n this.send('READY=' + key, 0); // need to confirm connection\n this.invokeReceiver(false, 'onWebsocketOpened');\n };\n\n this._websocket.onmessage = e => {\n let msg = e.data;\n\n if (this.next_binary) {\n\n let binchid = this.next_binary;\n delete this.next_binary;\n\n if (msg instanceof Blob) {\n // convert Blob object to BufferArray\n let reader = new FileReader, qitem = this.reserveQueueItem();\n // The file's text will be printed here\n reader.onload = event => this.markQueueItemDone(qitem, event.target.result, 0);\n reader.readAsArrayBuffer(msg, e.offset || 0);\n } else {\n // this is from CEF or LongPoll handler\n this.provideData(binchid, msg, e.offset || 0);\n }\n\n return;\n }\n\n if (!isStr(msg))\n return console.log(`unsupported message kind: ${typeof msg}`);\n\n let i1 = msg.indexOf(':'),\n credit = parseInt(msg.slice(0, i1)),\n i2 = msg.indexOf(':', i1 + 1),\n // cansend = parseInt(msg.slice(i1 + 1, i2)), // TODO: take into account when sending messages\n i3 = msg.indexOf(':', i2 + 1),\n chid = parseInt(msg.slice(i2 + 1, i3));\n\n this.ackn++; // count number of received packets,\n this.cansend += credit; // how many packets client can send\n\n msg = msg.slice(i3 + 1);\n\n if (chid == 0) {\n console.log(`GET chid=0 message ${msg}`);\n if (msg == 'CLOSE') {\n this.close(true); // force closing of socket\n this.invokeReceiver(true, 'onWebsocketClosed');\n } else if (msg.indexOf('NEW_KEY=') == 0) {\n let newkey = msg.slice(8);\n this.close(true);\n if (typeof sessionStorage !== 'undefined')\n sessionStorage.setItem('RWebWindow_Key', newkey);\n location.reload(true);\n }\n } else if (msg == '$$binary$$') {\n this.next_binary = chid;\n } else if (msg == '$$nullbinary$$') {\n this.provideData(chid, new ArrayBuffer(0), 0);\n } else {\n this.provideData(chid, msg);\n }\n\n if (this.ackn > 7)\n this.send('READY', 0); // send dummy message to server\n };\n\n this._websocket.onclose = arg => {\n delete this._websocket;\n if ((this.state > 0) || (arg === 'force_close')) {\n console.log('websocket closed');\n this.state = 0;\n this.invokeReceiver(true, 'onWebsocketClosed');\n }\n };\n\n this._websocket.onerror = err => {\n console.log(`websocket error ${err} state ${this.state}`);\n if (this.state > 0) {\n this.invokeReceiver(true, 'onWebsocketError', err);\n this.state = 0;\n }\n };\n\n // only in interactive mode try to reconnect\n if (!isBatchMode())\n setTimeout(retry_open, 3000); // after 3 seconds try again\n\n } // retry_open\n\n retry_open(true); // call for the first time\n }\n\n /** @summary Send newkey request to application\n * @desc If server creates newkey and response - webpage will be reaload\n * After key generation done, connection will not be working any longer\n * WARNING - only call when you know that you are doing\n * @private */\n askReload() {\n this.send('GENERATE_KEY', 0);\n }\n\n /** @summary Instal Ctrl-R handler to realod web window\n * @desc Instead of default window reload invokes {@link askReload} method\n * WARNING - only call when you know that you are doing\n * @private */\n addReloadKeyHandler() {\n\n if (this.kind == 'file') return;\n\n window.addEventListener( 'keydown', evnt => {\n if (((evnt.key == 'R') || (evnt.key == 'r')) && evnt.ctrlKey) {\n evnt.stopPropagation();\n evnt.preventDefault();\n console.log('Prevent Ctrl-R propogation - ask reload RWebWindow!');\n this.askReload();\n }\n });\n }\n\n} // class WebWindowHandle\n\n\n/** @summary Method used to initialize connection to web window.\n * @param {object} arg - arguments\n * @param {string} [arg.socket_kind] - kind of connection longpoll|websocket, detected automatically from URL\n * @param {number} [arg.credits = 10] - number of packets which can be send to server without acknowledge\n * @param {object} arg.receiver - instance of receiver for websocket events, allows to initiate connection immediately\n * @param {string} [arg.first_recv] - required prefix in the first message from RWebWindow, remain part of message will be returned in handle.first_msg\n * @param {string} [arg.href] - URL to RWebWindow, using window.location.href by default\n * @return {Promise} for ready-to-use {@link WebWindowHandle} instance */\nasync function connectWebWindow(arg) {\n\n if (isFunc(arg))\n arg = { callback: arg };\n else if (!isObject(arg))\n arg = {};\n\n let d = decodeUrl();\n\n // special holder script, prevents headless chrome browser from too early exit\n if (d.has('headless') && d.get('key') && (browser.isChromeHeadless || browser.isChrome) && !arg.ignore_chrome_batch_holder)\n loadScript('root_batch_holder.js?key=' + d.get('key'));\n\n if (!arg.platform)\n arg.platform = d.get('platform');\n\n if (arg.platform == 'qt5')\n browser.qt5 = true;\n else if (arg.platform == 'cef3')\n browser.cef3 = true;\n\n if (arg.batch === undefined)\n arg.batch = d.has('headless');\n\n if (arg.batch) setBatchMode(true);\n\n if (!arg.socket_kind)\n arg.socket_kind = d.get('ws');\n\n if (!arg.socket_kind) {\n if (browser.qt5)\n arg.socket_kind = 'rawlongpoll';\n else if (browser.cef3)\n arg.socket_kind = 'longpoll';\n else\n arg.socket_kind = 'websocket';\n }\n\n // only for debug purposes\n // arg.socket_kind = 'longpoll';\n\n let main = new Promise(resolveFunc => {\n let handle = new WebWindowHandle(arg.socket_kind, arg.credits);\n handle.setUserArgs(arg.user_args);\n if (arg.href) handle.setHRef(arg.href); // apply href now while connect can be called from other place\n\n if (window) {\n window.onbeforeunload = () => handle.close(true);\n if (browser.qt5) window.onqt5unload = window.onbeforeunload;\n }\n\n handle.key = d.get('key');\n handle.token = d.get('token');\n\n if (typeof sessionStorage !== 'undefined') {\n let new_key = sessionStorage.getItem('RWebWindow_Key');\n sessionStorage.removeItem('RWebWindow_Key');\n if (new_key) {\n console.log(`Use key ${new_key} from session storage`);\n handle.key = new_key;\n }\n }\n\n if (arg.receiver) {\n // when receiver exists, it handles itself callbacks\n handle.setReceiver(arg.receiver);\n handle.connect();\n return resolveFunc(handle);\n }\n\n if (!arg.first_recv)\n return resolveFunc(handle);\n\n handle.setReceiver({\n onWebsocketOpened() {}, // dummy function when websocket connected\n\n onWebsocketMsg(handle, msg) {\n if (msg.indexOf(arg.first_recv) != 0)\n return handle.close();\n handle.first_msg = msg.slice(arg.first_recv.length);\n resolveFunc(handle);\n },\n\n onWebsocketClosed() { closeCurrentWindow(); } // when connection closed, close panel as well\n });\n\n handle.connect();\n });\n\n if (!arg.ui5) return main;\n\n return Promise.all([main, loadOpenui5(arg)]).then(arr => arr[0]);\n}\n\nexport { WebWindowHandle, connectWebWindow };\n","import { settings, create, parse, toJSON, loadScript, registerMethods, isBatchMode, isFunc, isStr } from '../core.mjs';\nimport { select as d3_select, rgb as d3_rgb } from '../d3.mjs';\nimport { closeCurrentWindow, showProgress, loadOpenui5, ToolbarIcons, getColorExec } from '../gui/utils.mjs';\nimport { GridDisplay, getHPainter } from '../gui/display.mjs';\nimport { selectActivePad, cleanup, resize, EAxisBits } from '../base/ObjectPainter.mjs';\nimport { RObjectPainter } from '../base/RObjectPainter.mjs';\nimport { RAxisPainter } from './RAxisPainter.mjs';\nimport { RFramePainter } from './RFramePainter.mjs';\nimport { RPadPainter } from './RPadPainter.mjs';\nimport { addDragHandler } from './TFramePainter.mjs';\nimport { WebWindowHandle } from '../webwindow.mjs';\n\n\n/**\n * @summary Painter class for RCanvas\n *\n * @private\n */\n\nclass RCanvasPainter extends RPadPainter {\n\n /** @summary constructor */\n constructor(dom, canvas) {\n super(dom, canvas, true);\n this._websocket = null;\n this.tooltip_allowed = settings.Tooltip;\n this.v7canvas = true;\n }\n\n /** @summary Cleanup canvas painter */\n cleanup() {\n delete this._websocket;\n delete this._submreq;\n\n if (this._changed_layout)\n this.setLayoutKind('simple');\n delete this._changed_layout;\n\n super.cleanup();\n }\n\n /** @summary Returns layout kind */\n getLayoutKind() {\n let origin = this.selectDom('origin'),\n layout = origin.empty() ? '' : origin.property('layout');\n return layout || 'simple';\n }\n\n /** @summary Set canvas layout kind */\n setLayoutKind(kind, main_selector) {\n let origin = this.selectDom('origin');\n if (!origin.empty()) {\n if (!kind) kind = 'simple';\n origin.property('layout', kind);\n origin.property('layout_selector', (kind != 'simple') && main_selector ? main_selector : null);\n this._changed_layout = (kind !== 'simple'); // use in cleanup\n }\n }\n\n /** @summary Changes layout\n * @return {Promise} indicating when finished */\n async changeLayout(layout_kind, mainid) {\n let current = this.getLayoutKind();\n if (current == layout_kind)\n return true;\n\n let origin = this.selectDom('origin'),\n sidebar = origin.select('.side_panel'),\n main = this.selectDom(), lst = [];\n\n while (main.node().firstChild)\n lst.push(main.node().removeChild(main.node().firstChild));\n\n if (!sidebar.empty())\n cleanup(sidebar.node());\n\n this.setLayoutKind('simple'); // restore defaults\n origin.html(''); // cleanup origin\n\n if (layout_kind == 'simple') {\n main = origin;\n for (let k = 0; k < lst.length; ++k)\n main.node().appendChild(lst[k]);\n this.setLayoutKind(layout_kind);\n } else {\n let grid = new GridDisplay(origin.node(), layout_kind);\n\n if (mainid == undefined)\n mainid = (layout_kind.indexOf('vert') == 0) ? 0 : 1;\n\n main = d3_select(grid.getGridFrame(mainid));\n sidebar = d3_select(grid.getGridFrame(1 - mainid));\n\n main.classed('central_panel', true).style('position', 'relative');\n sidebar.classed('side_panel', true).style('position', 'relative');\n\n // now append all childs to the new main\n for (let k = 0; k < lst.length; ++k)\n main.node().appendChild(lst[k]);\n\n this.setLayoutKind(layout_kind, '.central_panel');\n\n // remove reference to MDIDisplay, solves resize problem\n origin.property('mdi', null);\n }\n\n // resize main drawing and let draw extras\n resize(main.node());\n return true;\n }\n\n /** @summary Toggle projection\n * @return {Promise} indicating when ready\n * @private */\n async toggleProjection(kind) {\n delete this.proj_painter;\n\n if (kind) this.proj_painter = 1; // just indicator that drawing can be preformed\n\n if (isFunc(this.showUI5ProjectionArea))\n return this.showUI5ProjectionArea(kind);\n\n let layout = 'simple', mainid;\n\n switch(kind) {\n case 'X':\n case 'bottom': layout = 'vert2_31'; mainid = 0; break;\n case 'Y':\n case 'left': layout = 'horiz2_13'; mainid = 1; break;\n case 'top': layout = 'vert2_13'; mainid = 1; break;\n case 'right': layout = 'horiz2_31'; mainid = 0; break;\n }\n\n return this.changeLayout(layout, mainid);\n }\n\n /** @summary Draw projection for specified histogram\n * @private */\n async drawProjection( /*kind,hist*/) {\n // dummy for the moment\n return false;\n }\n\n /** @summary Draw in side panel\n * @private */\n async drawInSidePanel(canv, opt) {\n let side = this.selectDom('origin').select('.side_panel');\n return side.empty() ? null : this.drawObject(side.node(), canv, opt);\n }\n\n /** @summary Checks if canvas shown inside ui5 widget\n * @desc Function should be used only from the func which supposed to be replaced by ui5\n * @private */\n testUI5() {\n if (!this.use_openui) return false;\n console.warn('full ui5 should be used - not loaded yet? Please check!!');\n return true;\n }\n\n /** @summary Show message\n * @desc Used normally with web-based canvas and handled in ui5\n * @private */\n showMessage(msg) {\n if (!this.testUI5())\n showProgress(msg, 7000);\n }\n\n /** @summary Function called when canvas menu item Save is called */\n saveCanvasAsFile(fname) {\n let pnt = fname.indexOf('.');\n this.createImage(fname.slice(pnt+1))\n .then(res => { console.log('save', fname, res.length); this.sendWebsocket('SAVE:' + fname + ':' + res); });\n }\n\n /** @summary Send command to server to save canvas with specified name\n * @desc Should be only used in web-based canvas\n * @private */\n sendSaveCommand(fname) {\n this.sendWebsocket('PRODUCE:' + fname);\n }\n\n /** @summary Send message via web socket\n * @private */\n sendWebsocket(msg) {\n if (this._websocket?.canSend()) {\n this._websocket.send(msg);\n return true;\n }\n\n return false;\n }\n\n /** @summary Close websocket connection to canvas\n * @private */\n closeWebsocket(force) {\n if (this._websocket) {\n this._websocket.close(force);\n this._websocket.cleanup();\n delete this._websocket;\n }\n }\n\n /** @summary Use provided connection for the web canvas\n * @private */\n useWebsocket(handle) {\n this.closeWebsocket();\n\n this._websocket = handle;\n this._websocket.setReceiver(this);\n this._websocket.connect();\n }\n\n /** @summary Hanler for websocket open event\n * @private */\n onWebsocketOpened(/*handle*/) {\n }\n\n /** @summary Hanler for websocket close event\n * @private */\n onWebsocketClosed(/*handle*/) {\n if (!this.embed_canvas)\n closeCurrentWindow();\n }\n\n /** @summary Hanler for websocket message\n * @private */\n onWebsocketMsg(handle, msg) {\n console.log('GET_MSG ' + msg.slice(0,30));\n\n if (msg == 'CLOSE') {\n this.onWebsocketClosed();\n this.closeWebsocket(true);\n } else if (msg.slice(0,5) == 'SNAP:') {\n msg = msg.slice(5);\n let p1 = msg.indexOf(':'),\n snapid = msg.slice(0,p1),\n snap = parse(msg.slice(p1+1));\n this.syncDraw(true)\n .then(() => this.redrawPadSnap(snap))\n .then(() => {\n handle.send('SNAPDONE:' + snapid); // send ready message back when drawing completed\n this.confirmDraw();\n });\n } else if (msg.slice(0,4) == 'JSON') {\n let obj = parse(msg.slice(4));\n // console.log('get JSON ', msg.length-4, obj._typename);\n this.redrawObject(obj);\n } else if (msg.slice(0,9) == 'REPL_REQ:') {\n this.processDrawableReply(msg.slice(9));\n } else if (msg.slice(0,4) == 'CMD:') {\n msg = msg.slice(4);\n let p1 = msg.indexOf(':'),\n cmdid = msg.slice(0,p1),\n cmd = msg.slice(p1+1),\n reply = 'REPLY:' + cmdid + ':';\n if ((cmd == 'SVG') || (cmd == 'PNG') || (cmd == 'JPEG')) {\n this.createImage(cmd.toLowerCase())\n .then(res => handle.send(reply + res));\n } else if (cmd.indexOf('ADDPANEL:') == 0) {\n let relative_path = cmd.slice(9);\n if (!isFunc(this.showUI5Panel)) {\n handle.send(reply + 'false');\n } else {\n\n let conn = new WebWindowHandle(handle.kind);\n\n // set interim receiver until first message arrives\n conn.setReceiver({\n cpainter: this,\n\n onWebsocketOpened() {\n },\n\n onWebsocketMsg(panel_handle, msg) {\n let panel_name = (msg.indexOf('SHOWPANEL:') == 0) ? msg.slice(10) : '';\n this.cpainter.showUI5Panel(panel_name, panel_handle)\n .then(res => handle.send(reply + (res ? 'true' : 'false')));\n },\n\n onWebsocketClosed() {\n // if connection failed,\n handle.send(reply + 'false');\n },\n\n onWebsocketError() {\n // if connection failed,\n handle.send(reply + 'false');\n }\n\n });\n\n let addr = handle.href;\n if (relative_path.indexOf('../') == 0) {\n let ddd = addr.lastIndexOf('/',addr.length-2);\n addr = addr.slice(0,ddd) + relative_path.slice(2);\n } else {\n addr += relative_path;\n }\n // only when connection established, panel will be activated\n conn.connect(addr);\n }\n } else {\n console.log('Unrecognized command ' + cmd);\n handle.send(reply);\n }\n } else if ((msg.slice(0,7) == 'DXPROJ:') || (msg.slice(0,7) == 'DYPROJ:')) {\n let kind = msg[1],\n hist = parse(msg.slice(7));\n this.drawProjection(kind, hist);\n } else if (msg.slice(0,5) == 'SHOW:') {\n let that = msg.slice(5),\n on = that[that.length-1] == '1';\n this.showSection(that.slice(0,that.length-2), on);\n } else {\n console.log(`unrecognized msg len: ${msg.length} msg: ${msg.slice(0,30)}`);\n }\n }\n\n /** @summary Submit request to RDrawable object on server side */\n submitDrawableRequest(kind, req, painter, method) {\n\n if (!this._websocket || !req || !req._typename ||\n !painter.snapid || !isStr(painter.snapid)) return null;\n\n if (kind && method) {\n // if kind specified - check if such request already was submitted\n if (!painter._requests) painter._requests = {};\n\n let prevreq = painter._requests[kind];\n\n if (prevreq) {\n let tm = new Date().getTime();\n if (!prevreq._tm || (tm - prevreq._tm < 5000)) {\n prevreq._nextreq = req; // submit when got reply\n return false;\n }\n delete painter._requests[kind]; // let submit new request after timeout\n }\n\n painter._requests[kind] = req; // keep reference on the request\n }\n\n req.id = painter.snapid;\n\n if (method) {\n if (!this._nextreqid) this._nextreqid = 1;\n req.reqid = this._nextreqid++;\n } else {\n req.reqid = 0; // request will not be replied\n }\n\n let msg = JSON.stringify(req);\n\n if (req.reqid) {\n req._kind = kind;\n req._painter = painter;\n req._method = method;\n req._tm = new Date().getTime();\n\n if (!this._submreq) this._submreq = {};\n this._submreq[req.reqid] = req; // fast access to submitted requests\n }\n\n // console.log('Sending request ', msg.slice(0,60));\n\n this.sendWebsocket('REQ:' + msg);\n return req;\n }\n\n /** @summary Submit menu request\n * @private */\n async submitMenuRequest(painter, menukind, reqid) {\n return new Promise(resolveFunc => {\n this.submitDrawableRequest('', {\n _typename: 'ROOT::Experimental::RDrawableMenuRequest',\n menukind: menukind || '',\n menureqid: reqid, // used to identify menu request\n }, painter, resolveFunc);\n });\n }\n\n /** @summary Submit executable command for given painter */\n submitExec(painter, exec, subelem) {\n // snapid is intentionally ignored - only painter.snapid has to be used\n if (!this._websocket) return;\n\n if (subelem && isStr(subelem)) {\n let len = subelem.length;\n if ((len > 2) && (subelem.indexOf('#x') == len - 2)) subelem = 'x'; else\n if ((len > 2) && (subelem.indexOf('#y') == len - 2)) subelem = 'y'; else\n if ((len > 2) && (subelem.indexOf('#z') == len - 2)) subelem = 'z';\n\n if ((subelem == 'x') || (subelem == 'y') || (subelem == 'z'))\n exec = subelem + 'axis#' + exec;\n else\n return console.log(`not recoginzed subelem ${subelem} in SubmitExec`);\n }\n\n this.submitDrawableRequest('', {\n _typename: 'ROOT::Experimental::RDrawableExecRequest',\n exec: exec\n }, painter);\n }\n\n /** @summary Process reply from request to RDrawable */\n processDrawableReply(msg) {\n let reply = parse(msg);\n if (!reply || !reply.reqid || !this._submreq) return false;\n\n let req = this._submreq[reply.reqid];\n if (!req) return false;\n\n // remove reference first\n delete this._submreq[reply.reqid];\n\n // remove blocking reference for that kind\n if (req._kind && req._painter?._requests)\n if (req._painter._requests[req._kind] === req)\n delete req._painter._requests[req._kind];\n\n if (req._method)\n req._method(reply, req);\n\n // resubmit last request of that kind\n if (req._nextreq && !req._painter._requests[req._kind])\n this.submitDrawableRequest(req._kind, req._nextreq, req._painter, req._method);\n }\n\n /** @summary Show specified section in canvas */\n async showSection(that, on) {\n switch(that) {\n case 'Menu': break;\n case 'StatusBar': break;\n case 'Editor': break;\n case 'ToolBar': break;\n case 'ToolTips': this.setTooltipAllowed(on); break;\n }\n return true;\n }\n\n /** @summary Method informs that something was changed in the canvas\n * @desc used to update information on the server (when used with web6gui)\n * @private */\n processChanges(kind, painter, subelem) {\n // check if we could send at least one message more - for some meaningful actions\n if (!this._websocket || !this._websocket.canSend(2) || !isStr(kind)) return;\n\n let msg = '';\n if (!painter) painter = this;\n switch (kind) {\n case 'sbits':\n console.log('Status bits in RCanvas are changed - that to do?');\n break;\n case 'frame': // when moving frame\n case 'zoom': // when changing zoom inside frame\n console.log('Frame moved or zoom is changed - that to do?');\n break;\n case 'pave_moved':\n console.log('TPave is moved inside RCanvas - that to do?');\n break;\n default:\n if ((kind.slice(0,5) == 'exec:') && painter?.snapid) {\n this.submitExec(painter, kind.slice(5), subelem);\n } else {\n console.log('UNPROCESSED CHANGES', kind);\n }\n }\n\n if (msg) {\n console.log('RCanvas::processChanges want to send ' + msg.length + ' ' + msg.slice(0,40));\n }\n }\n\n /** @summary Handle pad button click event\n * @private */\n clickPadButton(funcname, evnt) {\n if (funcname == 'ToggleGed') return this.activateGed(this, null, 'toggle');\n if (funcname == 'ToggleStatus') return this.activateStatusBar('toggle');\n super.clickPadButton(funcname, evnt);\n }\n\n /** @summary returns true when event status area exist for the canvas */\n hasEventStatus() {\n if (this.testUI5()) return false;\n if (this.brlayout)\n return this.brlayout.hasStatus();\n let hp = getHPainter();\n return hp ? hp.hasStatusLine() : false;\n }\n\n /** @summary Show/toggle event status bar\n * @private */\n activateStatusBar(state) {\n if (this.testUI5()) return;\n if (this.brlayout)\n this.brlayout.createStatusLine(23, state);\n else\n getHPainter()?.createStatusLine(23, state);\n\n this.processChanges('sbits', this);\n }\n\n /** @summary Show online canvas status\n * @private */\n showCanvasStatus(...msgs) {\n if (this.testUI5()) return;\n\n let br = this.brlayout || getHPainter()?.brlayout;\n\n br?.showStatus(...msgs);\n }\n\n /** @summary Returns true if GED is present on the canvas */\n hasGed() {\n if (this.testUI5()) return false;\n return this.brlayout?.hasContent() ?? false;\n }\n\n /** @summary Function used to de-activate GED\n * @private */\n removeGed() {\n if (this.testUI5()) return;\n\n this.registerForPadEvents(null);\n\n if (this.ged_view) {\n this.ged_view.getController().cleanupGed();\n this.ged_view.destroy();\n delete this.ged_view;\n }\n this.brlayout?.deleteContent(true);\n this.processChanges('sbits', this);\n }\n\n /** @summary Get view data for ui5 panel\n * @private */\n getUi5PanelData(/* panel_name */) {\n return { jsroot: { settings, create, parse, toJSON, loadScript, EAxisBits, getColorExec } };\n }\n\n /** @summary Function used to activate GED\n * @return {Promise} when GED is there\n * @private */\n async activateGed(objpainter, kind, mode) {\n if (this.testUI5() || !this.brlayout)\n return false;\n\n if (this.brlayout.hasContent()) {\n if ((mode === 'toggle') || (mode === false))\n this.removeGed();\n else\n objpainter?.getPadPainter()?.selectObjectPainter(objpainter);\n\n return true;\n }\n\n if (mode === false)\n return false;\n\n let btns = this.brlayout.createBrowserBtns();\n\n ToolbarIcons.createSVG(btns, ToolbarIcons.diamand, 15, 'toggle fix-pos mode')\n .style('margin','3px').on('click', () => this.brlayout.toggleKind('fix'));\n\n ToolbarIcons.createSVG(btns, ToolbarIcons.circle, 15, 'toggle float mode')\n .style('margin','3px').on('click', () => this.brlayout.toggleKind('float'));\n\n ToolbarIcons.createSVG(btns, ToolbarIcons.cross, 15, 'delete GED')\n .style('margin','3px').on('click', () => this.removeGed());\n\n // be aware, that jsroot_browser_hierarchy required for flexible layout that element use full browser area\n this.brlayout.setBrowserContent(\"
Loading GED ...
\");\n this.brlayout.setBrowserTitle('GED');\n this.brlayout.toggleBrowserKind(kind || 'float');\n\n return new Promise(resolveFunc => {\n\n loadOpenui5.then(sap => {\n\n d3_select('#ged_placeholder').text('');\n\n sap.ui.define(['sap/ui/model/json/JSONModel', 'sap/ui/core/mvc/XMLView'], (JSONModel,XMLView) => {\n\n let oModel = new JSONModel({ handle: null });\n\n XMLView.create({\n viewName: 'rootui5.canv.view.Ged',\n viewData: this.getUi5PanelData('Ged')\n }).then(oGed => {\n\n oGed.setModel(oModel);\n\n oGed.placeAt('ged_placeholder');\n\n this.ged_view = oGed;\n\n // TODO: should be moved into Ged controller - it must be able to detect canvas painter itself\n this.registerForPadEvents(oGed.getController().padEventsReceiver.bind(oGed.getController()));\n\n objpainter?.getPadPainter()?.selectObjectPainter(objpainter);\n\n this.processChanges('sbits', this);\n\n resolveFunc(true);\n });\n });\n });\n });\n }\n\n /** @summary produce JSON for RCanvas, which can be used to display canvas once again\n * @private */\n produceJSON() {\n console.error('RCanvasPainter.produceJSON not yet implemented');\n return '';\n }\n\n /** @summary draw RCanvas object */\n static async draw(dom, can /*, opt */) {\n let nocanvas = !can;\n if (nocanvas)\n can = create('ROOT::Experimental::RCanvas');\n\n let painter = new RCanvasPainter(dom, can);\n painter.normal_canvas = !nocanvas;\n painter.createCanvasSvg(0);\n\n selectActivePad({ pp: painter, active: false });\n\n return painter.drawPrimitives().then(() => {\n painter.addPadButtons();\n painter.showPadButtons();\n return painter;\n });\n }\n\n} // class RCanvasPainter\n\n\n/** @summary draw RPadSnapshot object\n * @private */\nfunction drawRPadSnapshot(dom, snap /*, opt*/) {\n let painter = new RCanvasPainter(dom, null);\n painter.normal_canvas = false;\n painter.batch_mode = isBatchMode();\n return painter.syncDraw(true).then(() => painter.redrawPadSnap(snap)).then(() => {\n painter.confirmDraw();\n painter.showPadButtons();\n return painter;\n });\n}\n\n/** @summary Ensure RCanvas and RFrame for the painter object\n * @param {Object} painter - painter object to process\n * @param {string|boolean} frame_kind - false for no frame or '3d' for special 3D mode\n * @desc Assigns DOM, creates and draw RCanvas and RFrame if necessary, add painter to pad list of painters\n * @return {Promise} for ready */\nasync function ensureRCanvas(painter, frame_kind) {\n if (!painter)\n return Promise.reject(Error('Painter not provided in ensureRCanvas'));\n\n // simple check - if canvas there, can use painter\n let pr = painter.getCanvSvg().empty() ? RCanvasPainter.draw(painter.getDom(), null /* , noframe */) : Promise.resolve(true);\n\n return pr.then(() => {\n if ((frame_kind !== false) && painter.getFrameSvg().select('.main_layer').empty())\n return RFramePainter.draw(painter.getDom(), null, isStr(frame_kind) ? frame_kind : '');\n }).then(() => {\n painter.addToPadPrimitives();\n return painter;\n });\n}\n\n\n/** @summary Function used for direct draw of RFrameTitle\n * @private */\nfunction drawRFrameTitle(reason, drag) {\n let fp = this.getFramePainter();\n if (!fp)\n return console.log('no frame painter - no title');\n\n let rect = fp.getFrameRect(),\n fx = rect.x,\n fy = rect.y,\n fw = rect.width,\n // fh = rect.height,\n ph = this.getPadPainter().getPadHeight(),\n title = this.getObject(),\n title_margin = this.v7EvalLength('margin', ph, 0.02),\n title_width = fw,\n title_height = this.v7EvalLength('height', ph, 0.05),\n textFont = this.v7EvalFont('text', { size: 0.07, color: 'black', align: 22 });\n\n if (reason == 'drag') {\n title_height = drag.height;\n title_margin = fy - drag.y - drag.height;\n let changes = {};\n this.v7AttrChange(changes, 'margin', title_margin / ph);\n this.v7AttrChange(changes, 'height', title_height / ph);\n this.v7SendAttrChanges(changes, false); // do not invoke canvas update on the server\n }\n\n this.createG();\n\n this.draw_g.attr('transform',`translate(${fx},${Math.round(fy-title_margin-title_height)})`);\n\n let arg = { x: title_width/2, y: title_height/2, text: title.fText, latex: 1 };\n\n this.startTextDrawing(textFont, 'font');\n\n this.drawText(arg);\n\n return this.finishTextDrawing().then(() => {\n if (!isBatchMode())\n addDragHandler(this, { x: fx, y: Math.round(fy-title_margin-title_height), width: title_width, height: title_height,\n minwidth: 20, minheight: 20, no_change_x: true, redraw: d => this.redraw('drag', d) });\n });\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////\n\nregisterMethods('ROOT::Experimental::RPalette', {\n\n extractRColor(rcolor) {\n return rcolor.fColor || 'black';\n },\n\n getColor(indx) {\n return this.palette[indx];\n },\n\n getContourIndex(zc) {\n let cntr = this.fContour, l = 0, r = cntr.length-1, mid;\n\n if (zc < cntr[0]) return -1;\n if (zc >= cntr[r]) return r-1;\n\n if (this.fCustomContour) {\n while (l < r-1) {\n mid = Math.round((l+r)/2);\n if (cntr[mid] > zc) r = mid; else l = mid;\n }\n return l;\n }\n\n // last color in palette starts from level cntr[r-1]\n return Math.floor((zc-cntr[0]) / (cntr[r-1] - cntr[0]) * (r-1));\n },\n\n getContourColor(zc) {\n let zindx = this.getContourIndex(zc);\n return (zindx < 0) ? '' : this.getColor(zindx);\n },\n\n getContour() {\n return this.fContour && (this.fContour.length > 1) ? this.fContour : null;\n },\n\n deleteContour() {\n delete this.fContour;\n },\n\n calcColor(value, entry1, entry2) {\n let dist = entry2.fOrdinal - entry1.fOrdinal,\n r1 = entry2.fOrdinal - value,\n r2 = value - entry1.fOrdinal;\n\n if (!this.fInterpolate || (dist <= 0))\n return (r1 < r2) ? entry2.fColor : entry1.fColor;\n\n // interpolate\n let col1 = d3_rgb(this.extractRColor(entry1.fColor)),\n col2 = d3_rgb(this.extractRColor(entry2.fColor)),\n color = d3_rgb(Math.round((col1.r*r1 + col2.r*r2)/dist),\n Math.round((col1.g*r1 + col2.g*r2)/dist),\n Math.round((col1.b*r1 + col2.b*r2)/dist));\n\n return color.toString();\n },\n\n createPaletteColors(len) {\n let arr = [], indx = 0;\n\n while (arr.length < len) {\n let value = arr.length / (len-1);\n\n let entry = this.fColors[indx];\n\n if ((Math.abs(entry.fOrdinal - value) < 0.0001) || (indx == this.fColors.length - 1)) {\n arr.push(this.extractRColor(entry.fColor));\n continue;\n }\n\n let next = this.fColors[indx+1];\n if (next.fOrdinal <= value)\n indx++;\n else\n arr.push(this.calcColor(value, entry, next));\n }\n\n return arr;\n },\n\n getColorOrdinal(value) {\n // extract color with ordinal value between 0 and 1\n if (!this.fColors)\n return 'black';\n if ((typeof value != 'number') || (value < 0))\n value = 0;\n else if (value > 1)\n value = 1;\n\n // TODO: implement better way to find index\n\n let entry, next = this.fColors[0];\n for (let indx = 0; indx < this.fColors.length-1; ++indx) {\n entry = next;\n\n if (Math.abs(entry.fOrdinal - value) < 0.0001)\n return this.extractRColor(entry.fColor);\n\n next = this.fColors[indx+1];\n if (next.fOrdinal > value)\n return this.calcColor(value, entry, next);\n }\n\n return this.extractRColor(next.fColor);\n },\n\n setFullRange(min, max) {\n // set full z scale range, used in zooming\n this.full_min = min;\n this.full_max = max;\n },\n\n createContour(logz, nlevels, zmin, zmax, zminpositive) {\n this.fContour = [];\n delete this.fCustomContour;\n this.colzmin = zmin;\n this.colzmax = zmax;\n\n if (logz) {\n if (this.colzmax <= 0) this.colzmax = 1.;\n if (this.colzmin <= 0)\n if ((zminpositive === undefined) || (zminpositive <= 0))\n this.colzmin = 0.0001*this.colzmax;\n else\n this.colzmin = ((zminpositive < 3) || (zminpositive>100)) ? 0.3*zminpositive : 1;\n if (this.colzmin >= this.colzmax) this.colzmin = 0.0001*this.colzmax;\n\n let logmin = Math.log(this.colzmin)/Math.log(10),\n logmax = Math.log(this.colzmax)/Math.log(10),\n dz = (logmax-logmin)/nlevels;\n this.fContour.push(this.colzmin);\n for (let level=1; level painter.redraw())\n .then(() => painter);\n}\n\n/** @summary draw RFrame object\n * @private */\nfunction drawRFrame(dom, obj, opt) {\n let p = new RFramePainter(dom, obj);\n if (opt == '3d') p.mode3d = true;\n return ensureRCanvas(p, false).then(() => p.redraw());\n}\n\nexport { ensureRCanvas, drawRPadSnapshot,\n drawRFrameTitle, drawRFont, drawRAxis, drawRFrame,\n RObjectPainter, RPadPainter, RCanvasPainter };\n"],"x_google_ignoreList":[0,1,2,3,4,5]} \ No newline at end of file diff --git a/docs/562.13af937336895a9b.js b/docs/562.13af937336895a9b.js deleted file mode 100644 index ea614334f..000000000 --- a/docs/562.13af937336895a9b.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[562],{4562:(b,T,h)=>{h.r(T),h.d(T,{TRatioPlotPainter:()=>z});var E=h(5368),p=h(1773),w=h(2454),X=h(1518),L=h(6898);class z extends w.tK{setGridsRange(a,e){let l=this.getObject();if(a===e){let o=this.getPadPainter()?.findPainterFor(l.fLowerPad,"lower_pad",p.clTPad)?.getFramePainter()?.x_handle;if(!o)return;a=o.full_min,e=o.full_max}l.fGridlines.forEach(o=>{o.fX1=a,o.fX2=e})}redraw(){var a=this;return(0,E.Z)(function*(){let e=a.getObject(),l=a.getPadPainter(),o=l.findPainterFor(e.fTopPad,"top_pad",p.clTPad);o&&o.disablePadDrawing();let f=l.findPainterFor(e.fUpperPad,"upper_pad",p.clTPad),c=f?.getMainPainter(),i=f?.getFramePainter(),u=l.findPainterFor(e.fLowerPad,"lower_pad",p.clTPad),C=u?.getMainPainter(),r=u?.getFramePainter(),_=20,D=Promise.resolve(!0);if(f&&c&&i&&r&&!f._ratio_configured){f._ratio_configured=!0,c.options.Axis=0,_=c.getHisto().fYaxis.fLabelSize,_<1&&(_=Math.round(_*Math.min(f.getPadWidth(),f.getPadHeight())));let s=c.getHisto();s.fXaxis.fLabelSize=0,s.fXaxis.fTitle="",s.fYaxis.fLabelSize=_,s.fYaxis.fTitleSize=_,f.getRootPad().fTicky=1,D=f.redrawPad().then(()=>(i.o_zoom=i.zoom,i._ratio_low_fp=r,i._ratio_painter=a,i.zoom=function(P,g,n,d,t,m){return this._ratio_painter.setGridsRange(P,g),this._ratio_low_fp.o_zoom(P,g),this.o_zoom(P,g,n,d,t,m)},i.o_sizeChanged=i.sizeChanged,i.sizeChanged=function(){this.o_sizeChanged(),this._ratio_low_fp.fX1NDC=this.fX1NDC,this._ratio_low_fp.fX2NDC=this.fX2NDC,this._ratio_low_fp.o_sizeChanged()},!0))}return D.then(()=>{if(!u||!C||!r||!i||u._ratio_configured)return a;u._ratio_configured=!0,C.options.Axis=0;let s=C.getHisto();s.fXaxis.fTitle="x",s.fXaxis.fLabelSize=_,s.fXaxis.fTitleSize=_,s.fYaxis.fLabelSize=_,s.fYaxis.fTitleSize=_,u.getRootPad().fTicky=1,u.forEachPainterInPad(n=>{(0,p.isFunc)(n?.testEditable)&&n.testEditable(!1)});let g,P=[];return e.fGridlinePositions.length>0&&e.fGridlines.length{let d=!1;if(e.fGridlines.forEach(t=>{t.fY1==t.fY2&&Math.abs(t.fY1-n)<1e-6&&(d=!0)}),!d){let t=(0,p.create)(p.clTLine);t.fX1=i.scale_xmin,t.fX2=i.scale_xmax,t.fY1=t.fY2=n,t.fLineStyle=2,e.fGridlines.push(t),void 0===g&&(g=a.selectCurrentPad(e.fLowerPad.fName)),P.push((0,L.drawTLine)(a.getDom(),t))}}),Promise.all(P).then(()=>r.zoom(i.scale_xmin,i.scale_xmax)).then(()=>(r.o_zoom=r.zoom,r._ratio_up_fp=i,r._ratio_painter=a,r.zoom=function(n,d,t,m,M,O){return this._ratio_painter.setGridsRange(n,d),this._ratio_up_fp.o_zoom(n,d),this.o_zoom(n,d,t,m,M,O)},r.o_sizeChanged=r.sizeChanged,r.sizeChanged=function(){this.o_sizeChanged(),this._ratio_up_fp.fX1NDC=this.fX1NDC,this._ratio_up_fp.fX2NDC=this.fX2NDC,this._ratio_up_fp.o_sizeChanged()},a))})})()}static draw(a,e,l){return(0,E.Z)(function*(){let o=new z(a,e,l);return(0,X.ensureTCanvas)(o,!1).then(()=>o.redraw())})()}}}}]); -//# sourceMappingURL=562.13af937336895a9b.js.map \ No newline at end of file diff --git a/docs/579.8c087840c9033381.js b/docs/579.8c087840c9033381.js new file mode 100644 index 000000000..800998278 --- /dev/null +++ b/docs/579.8c087840c9033381.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[579],{9579:(Et,xt,G)=>{G.r(xt),G.d(xt,{RH3Painter:()=>q,drawHistDisplayItem:()=>Mt});var ft=G(4788),J=G(9542),O=G(9900),dt=G(3675),bt=G(9056),zt=G(9850),Bt=G(8172),H=G(1968),At=G(6061),wt=G(6476),Ct=G(7238);class q extends Bt.n{getDimension(){return 3}scanContent(t){if(t&&this.nbinsx&&this.nbinsy&&this.nbinsz)return;let i=this.getHisto();if(i){if(this.extractAxesProperties(3),this.isDisplayItem())this.gminbin=i.fContMin,this.gminposbin=i.fContMinPos>0?i.fContMinPos:null,this.gmaxbin=i.fContMax;else{this.gminbin=this.gmaxbin=i.getBinContent(1,1,1);for(let e=0;ethis.gmaxbin&&(this.gmaxbin=h)}}this.draw_content=this.gmaxbin>0}}countStat(){let M,E,I,T,j,U,W,$,K,z,t=this.getHisto(),i=this.getAxis("x"),e=this.getAxis("y"),n=this.getAxis("z"),o=0,h=0,l=0,x=0,g=0,u=0,y=0,C=this.getSelectIndex("x","left"),P=this.getSelectIndex("x","right"),f=this.getSelectIndex("y","left"),d=this.getSelectIndex("y","right"),_=this.getSelectIndex("z","left"),p=this.getSelectIndex("z","right"),c=(this.getFramePainter(),{name:t.fName,entries:0,integral:0,meanx:0,meany:0,meanz:0,rmsx:0,rmsy:0,rmsz:0});for(M=1;M<=this.nbinsx;++M)for(T=i.GetBinCoord(M-.5),j=M<=C+1?0:M>P+1?2:1,E=1;E<=this.nbinsy;++E)for(U=e.GetBinCoord(E-.5),W=E<=f+1?0:E>d+1?2:1,I=1;I<=this.nbinsz;++I)$=n.GetBinCoord(I-.5),K=I<=_+1?0:I>p+1?2:1,z=t.getBinContent(M,E,I),c.entries+=z,1==j&&1==W&&1==K&&(o+=z,h+=T*z,l+=U*z,x+=$*z,g+=T**2*z,u+=U**2*z,y+=$**2*z);return Math.abs(o)>1e-300&&(c.meanx=h/o,c.meany=l/o,c.meanz=x/o,c.rmsx=Math.sqrt(Math.abs(g/o-c.meanx**2)),c.rmsy=Math.sqrt(Math.abs(u/o-c.meany**2)),c.rmsz=Math.sqrt(Math.abs(y/o-c.meanz**2))),c.integral=o,t.fEntries>1&&(c.entries=t.fEntries),c}fillStatistic(t,i){let e=this.countStat(),n=i%10,o=Math.floor(i/10)%10,h=Math.floor(i/100)%10,l=Math.floor(i/1e3)%10,x=Math.floor(i/1e6)%10;return t.clearStat(),n>0&&t.addText(e.name),o>0&&t.addText("Entries = "+t.format(e.entries,"entries")),h>0&&(t.addText("Mean x = "+t.format(e.meanx)),t.addText("Mean y = "+t.format(e.meany)),t.addText("Mean z = "+t.format(e.meanz))),l>0&&(t.addText("Std Dev x = "+t.format(e.rmsx)),t.addText("Std Dev y = "+t.format(e.rmsy)),t.addText("Std Dev z = "+t.format(e.rmsz))),x>0&&t.addText("Integral = "+t.format(e.integral,"entries")),!0}getBinTooltips(t,i,e){let n=[],o=this.getHisto(),h=1,l=1,x=1;this.isDisplayItem()&&(h=o.stepx||1,l=o.stepy||1,x=o.stepz||1),n.push(this.getObjectHint()),n.push(`x = ${this.getAxisBinTip("x",t,h)} xbin=${t+1}`),n.push(`y = ${this.getAxisBinTip("y",i,l)} ybin=${i+1}`),n.push(`z = ${this.getAxisBinTip("z",e,x)} zbin=${e+1}`);let g=o.getBinContent(t+1,i+1,e+1),u="entries = "+(h>1||l>1||x>1?"~":"");return g===Math.round(g)?n.push(u+g):n.push(u+(0,dt.Ee)(g,J.gStyle.fStatFormat)),n}draw3DScatter(t){var i=this;return(0,ft.Z)(function*(){let f,d,_,p,e=i.getHisto(),n=i.getFramePainter(),o=t.i1,h=t.i2,l=t.stepi,x=t.j1,g=t.j2,u=t.stepj,y=t.k1,C=t.k2,P=t.stepk;if(h<=o||g<=x||C<=y)return!0;let F=i.gmaxbin>1e3?1e3/i.gmaxbin:1,c=0,M=0,E=Math.max(0,i.gminbin);for(f=o;f(n.webgl?1e5:3e4))return!1;let I=new H.B_(c,n.webgl,n.size_x3d/200),T=new Int32Array(c),j=0,U=i.getAxis("x"),W=i.getAxis("y"),$=i.getAxis("z"),K=new dt.q9(M);for(f=o;f(n.toplevel.add(z),z.bins=T,z.painter=i,z.tip_color=65280,z.tooltip=function(b){if(!Number.isInteger(b.index))return console.error(`intersect.index not provided, three.js version ${O.UZH}`),null;let S=Math.floor(b.index/this.nvertex);if(S<0||S>=this.bins.length)return null;let B=this.painter,v=B.getFramePainter(),m=B.get3DToolTip(this.bins[S]);return m.x1=v.grx(B.getAxis("x").GetBinLowEdge(m.ix)),m.x2=v.grx(B.getAxis("x").GetBinLowEdge(m.ix+l)),m.y1=v.gry(B.getAxis("y").GetBinLowEdge(m.iy)),m.y2=v.gry(B.getAxis("y").GetBinLowEdge(m.iy+u)),m.z1=v.grz(B.getAxis("z").GetBinLowEdge(m.iz)),m.z2=v.grz(B.getAxis("z").GetBinLowEdge(m.iz+P)),m.color=this.tip_color,m.opacity=.3,m},!0))})()}draw3DBins(t){let u,y,i=this.v7EvalColor("fill_color","red"),e=this.getFramePainter(),n=0,o=!1,h=!1,l=!1,x=1,g=!0,C=.5;if(this.options.Sphere){C=.4,o=!0,11===this.options.Sphere&&(l=!0);let a=e.webgl?new O.xo$(.5,16,12):new O.xo$(.5,8,6);a.applyMatrix4((new O.yGw).makeRotationX(Math.PI/2)),a.computeVertexNormals();let s=a.getIndex().array,k=a.getAttribute("position").array,w=a.getAttribute("normal").array;n=3*s.length,u=new Float32Array(n),y=new Float32Array(n);for(let r=0;r=0?(void 0===X[a]&&(X[a]=0,Y[a]=N++),X[a]+=1):console.error(`not found color for value = ${Z}`)}l||(X.push(b),N=1,Y=[0]);let mt,at,ut,lt,_t,ht,it=new Array(N),tt=new Array(N),nt=new Array(N),rt=new Array(N),V=new Array(N),st=new Array(N),ot=new Array(N);for(let a=0;a65520?2:1),tt[s]=new Float32Array(b*n),nt[s]=new Float32Array(b*n),rt[s]=new Int32Array(b),1===V[s]&&(st[s]=new Uint16Array(b*H.XZ.MeshSegments.length)),2===V[s]&&(ot[s]=new Float32Array(b*H.XZ.Segments.length*3))}for(j=this.getAxis("x"),U=this.getAxis("y"),W=this.getAxis("z"),S=f;S=this.bins.length)return null;let D=this.painter,gt=D.getFramePainter(),L=D.get3DToolTip(this.bins[R]),ct=gt.grx(D.getAxis("x").GetBinCoord(L.ix-.5)),pt=gt.gry(D.getAxis("y").GetBinCoord(L.iy-.5)),yt=gt.grz(D.getAxis("z").GetBinCoord(L.iz-.5)),Q=this.use_scale?Math.pow(Math.abs(L.value*this.use_scale),.3333):1;return L.x1=ct-this.scalex*Q,L.x2=ct+this.scalex*Q,L.y1=pt-this.scaley*Q,L.y2=pt+this.scaley*Q,L.z1=yt-this.scalez*Q,L.z2=yt+this.scalez*Q,L.color=this.tip_color,L},e.toplevel.add(r),V[s]>0){let A=this.v7EvalColor("line_color","lightblue"),R=new O.nls({color:A}),D=null;D=1===V[s]?(0,H.Qy)(tt[s],R,st[s]):(0,H.Qy)(ot[s],R),e.toplevel.add(D)}}l&&this.updatePaletteDraw()}draw3D(){if(!this.draw_content)return!1;let t=this.prepareDraw({only_indexes:!0,extra:-.5,right_extra:-1});return(this.options.Scatter?this.draw3DScatter(t):Promise.resolve(!1)).then(e=>e||this.draw3DBins(t))}redraw(t){let i=this.getFramePainter();return"resize"==t?(i.resize3D()&&i.render3D(),this):((0,Ct.g_)(i),i.create3DScene(this.options.Render3D).then(()=>(i.setAxesRanges(this.getAxis("x"),this.xmin,this.xmax,this.getAxis("y"),this.ymin,this.ymax,this.getAxis("z"),this.zmin,this.zmax),i.set3DOptions(this.options),i.drawXYZ(i.toplevel,zt.C,{zoom:J.settings.Zooming,ndim:3,draw:!0,v7:!0}),this.drawingBins(t))).then(()=>this.draw3D()).then(()=>(i.render3D(),i.addKeysHandler(),this)))}fillToolbar(){let t=this.getPadPainter();t&&(t.addPadButton("auto_zoom","Unzoom all axes","ToggleZoom","Ctrl *"),this.draw_content&&t.addPadButton("statbox","Toggle stat box","ToggleStatBox"),t.showPadButtons())}canZoomInside(t,i,e){let n=this.getHisto();return n&&(n=n["f"+t.toUpperCase()+"axis"]),!n||n.FindBin(e,.5)-n.FindBin(i,0)>1}autoZoom(){let l,x,g,t=this.getSelectIndex("x","left"),i=this.getSelectIndex("x","right"),e=this.getSelectIndex("y","left"),n=this.getSelectIndex("y","right"),o=this.getSelectIndex("z","left"),h=this.getSelectIndex("z","right"),u=this.getHisto();if(t===i||e===n||o===h)return;let y=u.getBinContent(t+1,e+1,o+1);for(l=t;l0)return;let C=i,P=t,f=n,d=e,_=h,p=o;for(l=t;ly&&(l=P&&(P=l+1),x=d&&(d=x+1),g<_&&(_=g),g>=p&&(p=g+1));let F,c,M,E,I,T,j=!1;return C===P-1&&C>t+1&&Pe+1&&do+1&&pt||Pe||do||p{if("inspect"===e)return this.showInspector();this.decodeOptions(e),this.interactiveRedraw(!0,"drawopt")})}static draw(t,i){return(0,ft.Z)(function*(){let e=new q(t,i);return e.mode3d=!0,(0,bt.ensureRCanvas)(e,"3d").then(()=>{e.setAsMainPainter(),e.options={Box:0,Scatter:!1,Sphere:0,Color:!1,minimum:J.kNoZoom,maximum:J.kNoZoom};let n=e.v7EvalAttr("kind",""),o=e.v7EvalAttr("sub",0),h=e.options;switch(n){case"box":h.Box=10+o;break;case"sphere":h.Sphere=10+o;break;case"col":h.Color=!0;break;case"scat":h.Scatter=!0;break;default:h.Box=10}return e.scanContent(),e.redraw()})})()}}function Mt(et,t,i){return t?1==t.fAxes.length?At.RH1Painter.draw(et,t,i):2==t.fAxes.length?wt.RH2Painter.draw(et,t,i):3==t.fAxes.length?q.draw(et,t,i):null:null}}}]); +//# sourceMappingURL=579.8c087840c9033381.js.map \ No newline at end of file diff --git a/docs/636.6ba473b6b4c07b12.js.map b/docs/579.8c087840c9033381.js.map similarity index 99% rename from docs/636.6ba473b6b4c07b12.js.map rename to docs/579.8c087840c9033381.js.map index ba2efa318..086406230 100644 --- a/docs/636.6ba473b6b4c07b12.js.map +++ b/docs/579.8c087840c9033381.js.map @@ -1 +1 @@ -{"version":3,"file":"636.6ba473b6b4c07b12.js","mappings":"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","names":["RH3Painter","RHistPainter","getDimension","scanContent","when_axis_changed","this","nbinsx","nbinsy","nbinsz","histo","getHisto","extractAxesProperties","isDisplayItem","gminbin","fContMin","gminposbin","fContMinPos","gmaxbin","fContMax","getBinContent","i","j","k","bin_content","draw_content","countStat","xi","yi","zi","xx","xside","yy","yside","zz","zside","cont","xaxis","getAxis","yaxis","zaxis","stat_sum0","stat_sumx1","stat_sumy1","stat_sumz1","stat_sumx2","stat_sumy2","stat_sumz2","i1","getSelectIndex","i2","j1","j2","k1","k2","res","getFramePainter","name","fName","entries","integral","meanx","meany","meanz","rmsx","rmsy","rmsz","GetBinCoord","Math","abs","sqrt","fEntries","fillStatistic","stat","dostat","data","print_name","print_entries","floor","print_mean","print_rms","print_integral","clearStat","addText","format","getBinTooltips","ix","iy","iz","lines","dx","dy","dz","stepx","stepy","stepz","push","getObjectHint","getAxisBinTip","binz","lbl","round","floatToString","gStyle","draw3DScatter","handle","_this","main","di","stepi","dj","stepj","dk","stepk","coef","numpixels","sumz","content_lmt","max","webgl","pnts","PointsCreator","size_x3d","bins","Int32Array","nbin","rnd","TRandom","num","n","binx","random","biny","getBin","addPoint","grx","gry","grz","createPoints","color","v7EvalColor","then","mesh","toplevel","add","painter","tip_color","tooltip","intersect","Number","isInteger","index","console","error","REVISION","indx","nvertex","length","p","tip","get3DToolTip","x1","GetBinLowEdge","x2","y1","y2","z1","z2","opacity","draw3DBins","single_bin_verts","single_bin_norms","fillcolor","buffer_size","use_lambert","use_helper","use_colors","use_opacity","use_scale","tipscale","options","Sphere","geom","SphereGeometry","applyMatrix4","Matrix4","makeRotationX","PI","computeVertexNormals","getIndex","array","pos","getAttribute","norm","Float32Array","iii","indicies","Box3D","normals","vertices","nn","vert","x","y","z","Box","Color","palette","getHistPalette","createContour","wei","scalex","scaley","scalez","nbins","cols_size","num_colors","cols_sequence","pow","colindx","getContourIndex","undefined","cols_nbins","Array","bin_verts","bin_norms","bin_tooltips","helper_kind","helper_indexes","helper_positions","ncol","nseq","Uint16Array","GetBinCenter","vvv","bin_v","bin_n","vi","helper_segments","shift","helper_i","helper_p","all_bins_buffgeom","BufferGeometry","setAttribute","BufferAttribute","getColor","material","MeshLambertMaterial","transparent","vertexColors","MeshBasicMaterial","combined_bins","Mesh","bins_faces","faceIndex","value","lcolor","helper_material","LineBasicMaterial","createLineSegments","updatePaletteDraw","draw3D","prepareDraw","only_indexes","extra","right_extra","Scatter","Promise","resolve","redraw","reason","resize3D","render3D","assignFrame3DMethods","create3DScene","Render3D","setAxesRanges","xmin","xmax","ymin","ymax","zmin","zmax","set3DOptions","drawXYZ","RAxisPainter","zoom","settings","ndim","draw","v7","drawingBins","addKeysHandler","fillToolbar","pp","getPadPainter","addPadButton","showPadButtons","canZoomInside","axis","min","obj","toUpperCase","FindBin","autoZoom","ileft","iright","jleft","jright","kleft","kright","isany","fillHistContextMenu","menu","opts","getSupportedDrawOptions","addDrawMenu","arg","showInspector","decodeOptions","interactiveRedraw","static","dom","mode3d","ensureRCanvas","setAsMainPainter","minimum","kNoZoom","maximum","kind","v7EvalAttr","sub","o","drawHistDisplayItem","opt","fAxes","RH1Painter","RH2Painter"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/hist/RH3Painter.mjs"],"sourcesContent":["import { gStyle, settings, kNoZoom } from '../core.mjs';\nimport { REVISION, Matrix4, Mesh, MeshBasicMaterial, MeshLambertMaterial, SphereGeometry,\n LineBasicMaterial, BufferAttribute, BufferGeometry } from '../three.mjs';\nimport { floatToString, TRandom } from '../base/BasePainter.mjs';\nimport { ensureRCanvas } from '../gpad/RCanvasPainter.mjs';\nimport { RAxisPainter } from '../gpad/RAxisPainter.mjs';\nimport { RHistPainter } from '../hist2d/RHistPainter.mjs';\nimport { createLineSegments, PointsCreator, Box3D } from '../base/base3d.mjs';\nimport { RH1Painter } from './RH1Painter.mjs';\nimport { RH2Painter } from './RH2Painter.mjs';\nimport { assignFrame3DMethods } from './hist3d.mjs';\n\n/**\n * @summary Painter for RH3 classes\n *\n * @private\n */\n\nclass RH3Painter extends RHistPainter {\n\n /** @summary Returns histogram dimension */\n getDimension() { return 3; }\n\n scanContent(when_axis_changed) {\n\n // no need to rescan histogram while result does not depend from axis selection\n if (when_axis_changed && this.nbinsx && this.nbinsy && this.nbinsz) return;\n\n let histo = this.getHisto();\n if (!histo) return;\n\n this.extractAxesProperties(3);\n\n // global min/max, used at the moment in 3D drawing\n\n if (this.isDisplayItem()) {\n // take min/max values from the display item\n this.gminbin = histo.fContMin;\n this.gminposbin = histo.fContMinPos > 0 ? histo.fContMinPos : null;\n this.gmaxbin = histo.fContMax;\n } else {\n this.gminbin = this.gmaxbin = histo.getBinContent(1,1,1);\n\n for (let i = 0; i < this.nbinsx; ++i)\n for (let j = 0; j < this.nbinsy; ++j)\n for (let k = 0; k < this.nbinsz; ++k) {\n let bin_content = histo.getBinContent(i+1, j+1, k+1);\n if (bin_content < this.gminbin) this.gminbin = bin_content; else\n if (bin_content > this.gmaxbin) this.gmaxbin = bin_content;\n }\n }\n\n this.draw_content = this.gmaxbin > 0;\n }\n\n /** @summary Count histogram statistic */\n countStat() {\n let histo = this.getHisto(),\n xaxis = this.getAxis('x'),\n yaxis = this.getAxis('y'),\n zaxis = this.getAxis('z'),\n stat_sum0 = 0, stat_sumx1 = 0, stat_sumy1 = 0,\n stat_sumz1 = 0, stat_sumx2 = 0, stat_sumy2 = 0, stat_sumz2 = 0,\n i1 = this.getSelectIndex('x', 'left'),\n i2 = this.getSelectIndex('x', 'right'),\n j1 = this.getSelectIndex('y', 'left'),\n j2 = this.getSelectIndex('y', 'right'),\n k1 = this.getSelectIndex('z', 'left'),\n k2 = this.getSelectIndex('z', 'right'),\n fp = this.getFramePainter(),\n res = { name: histo.fName, entries: 0, integral: 0, meanx: 0, meany: 0, meanz: 0, rmsx: 0, rmsy: 0, rmsz: 0 },\n xi, yi, zi, xx, xside, yy, yside, zz, zside, cont;\n\n for (xi = 1; xi <= this.nbinsx; ++xi) {\n\n xx = xaxis.GetBinCoord(xi - 0.5);\n xside = (xi <= i1+1) ? 0 : (xi > i2+1 ? 2 : 1);\n\n for (yi = 1; yi <= this.nbinsy; ++yi) {\n\n yy = yaxis.GetBinCoord(yi - 0.5);\n yside = (yi <= j1+1) ? 0 : (yi > j2+1 ? 2 : 1);\n\n for (zi = 1; zi <= this.nbinsz; ++zi) {\n\n zz = zaxis.GetBinCoord(zi - 0.5);\n zside = (zi <= k1+1) ? 0 : (zi > k2+1 ? 2 : 1);\n\n cont = histo.getBinContent(xi, yi, zi);\n res.entries += cont;\n\n if ((xside == 1) && (yside == 1) && (zside == 1)) {\n stat_sum0 += cont;\n stat_sumx1 += xx * cont;\n stat_sumy1 += yy * cont;\n stat_sumz1 += zz * cont;\n stat_sumx2 += xx**2 * cont;\n stat_sumy2 += yy**2 * cont;\n stat_sumz2 += zz**2 * cont;\n }\n }\n }\n }\n\n if (Math.abs(stat_sum0) > 1e-300) {\n res.meanx = stat_sumx1 / stat_sum0;\n res.meany = stat_sumy1 / stat_sum0;\n res.meanz = stat_sumz1 / stat_sum0;\n res.rmsx = Math.sqrt(Math.abs(stat_sumx2 / stat_sum0 - res.meanx**2));\n res.rmsy = Math.sqrt(Math.abs(stat_sumy2 / stat_sum0 - res.meany**2));\n res.rmsz = Math.sqrt(Math.abs(stat_sumz2 / stat_sum0 - res.meanz**2));\n }\n\n res.integral = stat_sum0;\n\n if (histo.fEntries > 1)\n res.entries = histo.fEntries;\n\n return res;\n }\n\n /** @summary Fill statistic */\n fillStatistic(stat, dostat /*, dofit */) {\n\n let data = this.countStat(),\n print_name = dostat % 10,\n print_entries = Math.floor(dostat / 10) % 10,\n print_mean = Math.floor(dostat / 100) % 10,\n print_rms = Math.floor(dostat / 1000) % 10,\n // print_under = Math.floor(dostat / 10000) % 10,\n // print_over = Math.floor(dostat / 100000) % 10,\n print_integral = Math.floor(dostat / 1000000) % 10;\n // print_skew = Math.floor(dostat / 10000000) % 10;\n // print_kurt = Math.floor(dostat / 100000000) % 10;\n\n stat.clearStat();\n\n if (print_name > 0)\n stat.addText(data.name);\n\n if (print_entries > 0)\n stat.addText('Entries = ' + stat.format(data.entries,'entries'));\n\n if (print_mean > 0) {\n stat.addText('Mean x = ' + stat.format(data.meanx));\n stat.addText('Mean y = ' + stat.format(data.meany));\n stat.addText('Mean z = ' + stat.format(data.meanz));\n }\n\n if (print_rms > 0) {\n stat.addText('Std Dev x = ' + stat.format(data.rmsx));\n stat.addText('Std Dev y = ' + stat.format(data.rmsy));\n stat.addText('Std Dev z = ' + stat.format(data.rmsz));\n }\n\n if (print_integral > 0) {\n stat.addText('Integral = ' + stat.format(data.integral,'entries'));\n }\n\n return true;\n }\n\n /** @summary Provide text information (tooltips) for histogram bin */\n getBinTooltips(ix, iy, iz) {\n let lines = [], histo = this.getHisto(),\n dx = 1, dy = 1, dz = 1;\n\n if (this.isDisplayItem()) {\n dx = histo.stepx || 1;\n dy = histo.stepy || 1;\n dz = histo.stepz || 1;\n }\n\n lines.push(this.getObjectHint());\n\n lines.push(`x = ${this.getAxisBinTip('x', ix, dx)} xbin=${ix+1}`);\n lines.push(`y = ${this.getAxisBinTip('y', iy, dy)} ybin=${iy+1}`);\n lines.push(`z = ${this.getAxisBinTip('z', iz, dz)} zbin=${iz+1}`);\n\n let binz = histo.getBinContent(ix+1, iy+1, iz+1),\n lbl = 'entries = '+ ((dx > 1) || (dy > 1) || (dz > 1) ? '~' : '');\n if (binz === Math.round(binz))\n lines.push(lbl + binz);\n else\n lines.push(lbl + floatToString(binz, gStyle.fStatFormat));\n\n return lines;\n }\n\n /** @summary Try to draw 3D histogram as scatter plot\n * @desc If there are too many points, returns promise with false */\n async draw3DScatter(handle) {\n\n let histo = this.getHisto(),\n main = this.getFramePainter(),\n i1 = handle.i1, i2 = handle.i2, di = handle.stepi,\n j1 = handle.j1, j2 = handle.j2, dj = handle.stepj,\n k1 = handle.k1, k2 = handle.k2, dk = handle.stepk,\n i, j, k, bin_content;\n\n if ((i2 <= i1) || (j2 <= j1) || (k2 <= k1))\n return true;\n\n // scale down factor if too large values\n let coef = (this.gmaxbin > 1000) ? 1000/this.gmaxbin : 1,\n numpixels = 0, sumz = 0, content_lmt = Math.max(0, this.gminbin);\n\n for (i = i1; i < i2; i += di) {\n for (j = j1; j < j2; j += dj) {\n for (k = k1; k < k2; k += dk) {\n bin_content = histo.getBinContent(i+1, j+1, k+1);\n sumz += bin_content;\n if (bin_content <= content_lmt) continue;\n numpixels += Math.round(bin_content*coef);\n }\n }\n }\n\n // too many pixels - use box drawing\n if (numpixels > (main.webgl ? 100000 : 30000))\n return false;\n\n let pnts = new PointsCreator(numpixels, main.webgl, main.size_x3d/200),\n bins = new Int32Array(numpixels), nbin = 0,\n xaxis = this.getAxis('x'), yaxis = this.getAxis('y'), zaxis = this.getAxis('z'),\n rnd = new TRandom(sumz);\n\n for (i = i1; i < i2; i += di) {\n for (j = j1; j < j2; j += dj) {\n for (k = k1; k < k2; k += dk) {\n bin_content = histo.getBinContent(i+1, j+1, k+1);\n if (bin_content <= content_lmt) continue;\n let num = Math.round(bin_content*coef);\n\n for (let n=0;n {\n main.toplevel.add(mesh);\n\n mesh.bins = bins;\n mesh.painter = this;\n mesh.tip_color = 0x00FF00;\n\n mesh.tooltip = function(intersect) {\n if (!Number.isInteger(intersect.index)) {\n console.error(`intersect.index not provided, three.js version ${REVISION}`);\n return null;\n }\n\n let indx = Math.floor(intersect.index / this.nvertex);\n if ((indx < 0) || (indx >= this.bins.length)) return null;\n\n let p = this.painter,\n main = p.getFramePainter(),\n tip = p.get3DToolTip(this.bins[indx]);\n\n tip.x1 = main.grx(p.getAxis('x').GetBinLowEdge(tip.ix));\n tip.x2 = main.grx(p.getAxis('x').GetBinLowEdge(tip.ix+di));\n tip.y1 = main.gry(p.getAxis('y').GetBinLowEdge(tip.iy));\n tip.y2 = main.gry(p.getAxis('y').GetBinLowEdge(tip.iy+dj));\n tip.z1 = main.grz(p.getAxis('z').GetBinLowEdge(tip.iz));\n tip.z2 = main.grz(p.getAxis('z').GetBinLowEdge(tip.iz+dk));\n tip.color = this.tip_color;\n tip.opacity = 0.3;\n\n return tip;\n };\n\n return true;\n });\n }\n\n /** @summary Drawing of 3D histogram */\n draw3DBins(handle) {\n\n let fillcolor = this.v7EvalColor('fill_color', 'red'),\n main = this.getFramePainter(),\n buffer_size = 0, use_lambert = false,\n use_helper = false, use_colors = false, use_opacity = 1, use_scale = true,\n single_bin_verts, single_bin_norms,\n tipscale = 0.5;\n\n if (this.options.Sphere) {\n\n // drawing spheres\n tipscale = 0.4;\n use_lambert = true;\n if (this.options.Sphere === 11) use_colors = true;\n\n let geom = main.webgl ? new SphereGeometry(0.5, 16, 12) : new SphereGeometry(0.5, 8, 6);\n geom.applyMatrix4( new Matrix4().makeRotationX( Math.PI / 2 ) );\n geom.computeVertexNormals();\n\n let indx = geom.getIndex().array,\n pos = geom.getAttribute('position').array,\n norm = geom.getAttribute('normal').array;\n\n buffer_size = indx.length*3;\n single_bin_verts = new Float32Array(buffer_size);\n single_bin_norms = new Float32Array(buffer_size);\n\n for (let k=0;k= 0) {\n if (cols_size[colindx] === undefined) {\n cols_size[colindx] = 0;\n cols_sequence[colindx] = num_colors++;\n }\n cols_size[colindx]+=1;\n } else {\n console.error(`not found color for value = ${bin_content}`);\n }\n }\n }\n }\n\n if (!use_colors) {\n cols_size.push(nbins);\n num_colors = 1;\n cols_sequence = [0];\n }\n\n let cols_nbins = new Array(num_colors),\n bin_verts = new Array(num_colors),\n bin_norms = new Array(num_colors),\n bin_tooltips = new Array(num_colors),\n helper_kind = new Array(num_colors),\n helper_indexes = new Array(num_colors), // helper_kind == 1, use original vertices\n helper_positions = new Array(num_colors); // helper_kind == 2, all vertices copied into separate buffer\n\n for(let ncol = 0; ncol < cols_size.length; ++ncol) {\n if (!cols_size[ncol]) continue; // ignore dummy colors\n\n nbins = cols_size[ncol]; // how many bins with specified color\n let nseq = cols_sequence[ncol];\n\n cols_nbins[nseq] = 0; // counter for the filled bins\n\n helper_kind[nseq] = 0;\n\n // 1 - use same vertices to create helper, one can use maximal 64K vertices\n // 2 - all vertices copied into separate buffer\n if (use_helper)\n helper_kind[nseq] = (nbins * buffer_size / 3 > 0xFFF0) ? 2 : 1;\n\n bin_verts[nseq] = new Float32Array(nbins * buffer_size);\n bin_norms[nseq] = new Float32Array(nbins * buffer_size);\n bin_tooltips[nseq] = new Int32Array(nbins);\n\n if (helper_kind[nseq] === 1)\n helper_indexes[nseq] = new Uint16Array(nbins * Box3D.MeshSegments.length);\n\n if (helper_kind[nseq] === 2)\n helper_positions[nseq] = new Float32Array(nbins * Box3D.Segments.length * 3);\n }\n\n let binx, grx, biny, gry, binz, grz;\n xaxis = this.getAxis('x'),\n yaxis = this.getAxis('y'),\n zaxis = this.getAxis('z');\n\n for (i = i1; i < i2; i += di) {\n binx = xaxis.GetBinCenter(i+1); grx = main.grx(binx);\n for (j = j1; j < j2; j += dj) {\n biny = yaxis.GetBinCenter(j+1); gry = main.gry(biny);\n for (k = k1; k < k2; k +=dk) {\n bin_content = histo.getBinContent(i+1, j+1, k+1);\n if (!this.options.Color && ((bin_content === 0) || (bin_content < this.gminbin))) continue;\n\n wei = use_scale ? Math.pow(Math.abs(bin_content*use_scale), 0.3333) : 1;\n if (wei < 1e-3) continue; // do not show very small bins\n\n let nseq = 0;\n if (use_colors) {\n let colindx = palette.getContourIndex(bin_content);\n if (colindx < 0) continue;\n nseq = cols_sequence[colindx];\n }\n\n nbins = cols_nbins[nseq];\n\n binz = zaxis.GetBinCenter(k+1); grz = main.grz(binz);\n\n // remember bin index for tooltip\n bin_tooltips[nseq][nbins] = histo.getBin(i+1, j+1, k+1);\n\n let vvv = nbins * buffer_size, bin_v = bin_verts[nseq], bin_n = bin_norms[nseq];\n\n // Grab the coordinates and scale that are being assigned to each bin\n for (let vi = 0; vi < buffer_size; vi+=3, vvv+=3) {\n bin_v[vvv] = grx + single_bin_verts[vi]*scalex*wei;\n bin_v[vvv+1] = gry + single_bin_verts[vi+1]*scaley*wei;\n bin_v[vvv+2] = grz + single_bin_verts[vi+2]*scalez*wei;\n\n bin_n[vvv] = single_bin_norms[vi];\n bin_n[vvv+1] = single_bin_norms[vi+1];\n bin_n[vvv+2] = single_bin_norms[vi+2];\n }\n\n if (helper_kind[nseq] === 1) {\n // reuse vertices created for the mesh\n let helper_segments = Box3D.MeshSegments;\n vvv = nbins * helper_segments.length;\n let shift = Math.round(nbins * buffer_size/3),\n helper_i = helper_indexes[nseq];\n for (let n = 0; n < helper_segments.length; ++n)\n helper_i[vvv+n] = shift + helper_segments[n];\n }\n\n if (helper_kind[nseq] === 2) {\n let helper_segments = Box3D.Segments,\n helper_p = helper_positions[nseq];\n vvv = nbins * helper_segments.length * 3;\n for (let n = 0; n < helper_segments.length; ++n, vvv += 3) {\n let vert = Box3D.Vertices[helper_segments[n]];\n helper_p[vvv] = grx + (vert.x-0.5)*scalex*wei;\n helper_p[vvv+1] = gry + (vert.y-0.5)*scaley*wei;\n helper_p[vvv+2] = grz + (vert.z-0.5)*scalez*wei;\n }\n }\n\n cols_nbins[nseq] = nbins+1;\n }\n }\n }\n\n for (let ncol = 0; ncol < cols_size.length; ++ncol) {\n if (!cols_size[ncol]) continue; // ignore dummy colors\n\n let nseq = cols_sequence[ncol];\n\n // BufferGeometries that store geometry of all bins\n let all_bins_buffgeom = new BufferGeometry();\n\n // Create mesh from bin buffergeometry\n all_bins_buffgeom.setAttribute('position', new BufferAttribute(bin_verts[nseq], 3));\n all_bins_buffgeom.setAttribute('normal', new BufferAttribute(bin_norms[nseq], 3));\n\n if (use_colors) fillcolor = palette.getColor(ncol);\n\n let material = use_lambert ? new MeshLambertMaterial({ color: fillcolor, opacity: use_opacity, transparent: (use_opacity < 1), vertexColors: false })\n : new MeshBasicMaterial({ color: fillcolor, opacity: use_opacity, vertexColors: false });\n\n let combined_bins = new Mesh(all_bins_buffgeom, material);\n\n combined_bins.bins = bin_tooltips[nseq];\n combined_bins.bins_faces = buffer_size/9;\n combined_bins.painter = this;\n\n combined_bins.scalex = tipscale*scalex;\n combined_bins.scaley = tipscale*scaley;\n combined_bins.scalez = tipscale*scalez;\n combined_bins.tip_color = 0x00FF00;\n combined_bins.use_scale = use_scale;\n\n combined_bins.tooltip = function(intersect) {\n if (!Number.isInteger(intersect.faceIndex)) {\n console.error(`intersect.faceIndex not provided, three.js version ${REVISION}`);\n return null;\n }\n let indx = Math.floor(intersect.faceIndex / this.bins_faces);\n if ((indx < 0) || (indx >= this.bins.length)) return null;\n\n let p = this.painter,\n main = p.getFramePainter(),\n tip = p.get3DToolTip(this.bins[indx]),\n grx = main.grx(p.getAxis('x').GetBinCoord(tip.ix-0.5)),\n gry = main.gry(p.getAxis('y').GetBinCoord(tip.iy-0.5)),\n grz = main.grz(p.getAxis('z').GetBinCoord(tip.iz-0.5)),\n wei = this.use_scale ? Math.pow(Math.abs(tip.value*this.use_scale), 0.3333) : 1;\n\n tip.x1 = grx - this.scalex*wei; tip.x2 = grx + this.scalex*wei;\n tip.y1 = gry - this.scaley*wei; tip.y2 = gry + this.scaley*wei;\n tip.z1 = grz - this.scalez*wei; tip.z2 = grz + this.scalez*wei;\n\n tip.color = this.tip_color;\n\n return tip;\n };\n\n main.toplevel.add(combined_bins);\n\n if (helper_kind[nseq] > 0) {\n let lcolor = this.v7EvalColor('line_color', 'lightblue'),\n helper_material = new LineBasicMaterial({ color: lcolor }),\n lines = null;\n\n if (helper_kind[nseq] === 1) {\n // reuse positions from the mesh - only special index was created\n lines = createLineSegments(bin_verts[nseq], helper_material, helper_indexes[nseq]);\n } else {\n lines = createLineSegments(helper_positions[nseq], helper_material);\n }\n\n main.toplevel.add(lines);\n }\n }\n\n if (use_colors)\n this.updatePaletteDraw();\n }\n\n draw3D() {\n\n if (!this.draw_content)\n return false;\n\n //this.options.Scatter = false;\n //this.options.Box = true;\n\n let handle = this.prepareDraw({ only_indexes: true, extra: -0.5, right_extra: -1 });\n\n let pr = this.options.Scatter ? this.draw3DScatter(handle) : Promise.resolve(false);\n\n return pr.then(res => {\n return res ? res : this.draw3DBins(handle);\n });\n }\n\n\n /** @summary Redraw histogram*/\n redraw(reason) {\n\n let main = this.getFramePainter(); // who makes axis and 3D drawing\n\n if (reason == 'resize') {\n if (main.resize3D()) main.render3D();\n return this;\n }\n\n assignFrame3DMethods(main);\n return main.create3DScene(this.options.Render3D).then(() => {\n main.setAxesRanges(this.getAxis('x'), this.xmin, this.xmax, this.getAxis('y'), this.ymin, this.ymax, this.getAxis('z'), this.zmin, this.zmax);\n main.set3DOptions(this.options);\n main.drawXYZ(main.toplevel, RAxisPainter, { zoom: settings.Zooming, ndim: 3, draw: true, v7: true });\n return this.drawingBins(reason);\n }).then(() => this.draw3D()).then(() => {\n main.render3D();\n main.addKeysHandler();\n return this;\n });\n }\n\n /** @summary Fill pad toolbar with RH3-related functions */\n fillToolbar() {\n let pp = this.getPadPainter();\n if (!pp) return;\n\n pp.addPadButton('auto_zoom', 'Unzoom all axes', 'ToggleZoom', 'Ctrl *');\n if (this.draw_content)\n pp.addPadButton('statbox', 'Toggle stat box', 'ToggleStatBox');\n pp.showPadButtons();\n }\n\n /** @summary Checks if it makes sense to zoom inside specified axis range */\n canZoomInside(axis, min, max) {\n let obj = this.getHisto();\n if (obj) obj = obj['f'+axis.toUpperCase()+'axis'];\n return !obj || (obj.FindBin(max,0.5) - obj.FindBin(min,0) > 1);\n }\n\n /** @summary Perform automatic zoom inside non-zero region of histogram */\n autoZoom() {\n let i1 = this.getSelectIndex('x', 'left'),\n i2 = this.getSelectIndex('x', 'right'),\n j1 = this.getSelectIndex('y', 'left'),\n j2 = this.getSelectIndex('y', 'right'),\n k1 = this.getSelectIndex('z', 'left'),\n k2 = this.getSelectIndex('z', 'right'),\n i, j, k, histo = this.getHisto();\n\n if ((i1 === i2) || (j1 === j2) || (k1 === k2)) return;\n\n // first find minimum\n let min = histo.getBinContent(i1 + 1, j1 + 1, k1+1);\n for (i = i1; i < i2; ++i)\n for (j = j1; j < j2; ++j)\n for (k = k1; k < k2; ++k)\n min = Math.min(min, histo.getBinContent(i+1, j+1, k+1));\n\n if (min > 0) return; // if all points positive, no chance for autoscale\n\n let ileft = i2, iright = i1, jleft = j2, jright = j1, kleft = k2, kright = k1;\n\n for (i = i1; i < i2; ++i)\n for (j = j1; j < j2; ++j)\n for (k = k1; k < k2; ++k)\n if (histo.getBinContent(i+1, j+1, k+1) > min) {\n if (i < ileft) ileft = i;\n if (i >= iright) iright = i + 1;\n if (j < jleft) jleft = j;\n if (j >= jright) jright = j + 1;\n if (k < kleft) kleft = k;\n if (k >= kright) kright = k + 1;\n }\n\n let xmin, xmax, ymin, ymax, zmin, zmax, isany = false;\n\n if ((ileft === iright-1) && (ileft > i1+1) && (iright < i2-1)) { ileft--; iright++; }\n if ((jleft === jright-1) && (jleft > j1+1) && (jright < j2-1)) { jleft--; jright++; }\n if ((kleft === kright-1) && (kleft > k1+1) && (kright < k2-1)) { kleft--; kright++; }\n\n if ((ileft > i1 || iright < i2) && (ileft < iright - 1)) {\n xmin = this.getAxis('x').GetBinLowEdge(ileft+1);\n xmax = this.getAxis('x').GetBinLowEdge(iright+1);\n isany = true;\n }\n\n if ((jleft > j1 || jright < j2) && (jleft < jright - 1)) {\n ymin = this.getAxis('y').GetBinLowEdge(jleft+1);\n ymax = this.getAxis('y').GetBinLowEdge(jright+1);\n isany = true;\n }\n\n if ((kleft > k1 || kright < k2) && (kleft < kright - 1)) {\n zmin = this.getAxis('z').GetBinLowEdge(kleft+1);\n zmax = this.getAxis('z').GetBinLowEdge(kright+1);\n isany = true;\n }\n\n if (isany)\n return this.getFramePainter().zoom(xmin, xmax, ymin, ymax, zmin, zmax);\n }\n\n /** @summary Fill histogram context menu */\n fillHistContextMenu(menu) {\n\n let opts = this.getSupportedDrawOptions();\n\n menu.addDrawMenu('Draw with', opts, arg => {\n if (arg === 'inspect')\n return this.showInspector();\n\n this.decodeOptions(arg);\n\n this.interactiveRedraw(true, 'drawopt');\n });\n }\n\n /** @summary draw RH3 object */\n static async draw(dom, histo /*, opt*/) {\n let painter = new RH3Painter(dom, histo);\n painter.mode3d = true;\n\n return ensureRCanvas(painter, '3d').then(() => {\n\n painter.setAsMainPainter();\n\n painter.options = { Box: 0, Scatter: false, Sphere: 0, Color: false, minimum: kNoZoom, maximum: kNoZoom };\n\n let kind = painter.v7EvalAttr('kind', ''),\n sub = painter.v7EvalAttr('sub', 0),\n o = painter.options;\n\n switch(kind) {\n case 'box': o.Box = 10 + sub; break;\n case 'sphere': o.Sphere = 10 + sub; break;\n case 'col': o.Color = true; break;\n case 'scat': o.Scatter = true; break;\n default: o.Box = 10;\n }\n\n painter.scanContent();\n return painter.redraw();\n });\n }\n\n} // class RH3Painter\n\n/** @summary draw RHistDisplayItem object\n * @private */\nfunction drawHistDisplayItem(dom, obj, opt) {\n if (!obj)\n return null;\n\n if (obj.fAxes.length == 1)\n return RH1Painter.draw(dom, obj, opt);\n\n if (obj.fAxes.length == 2)\n return RH2Painter.draw(dom, obj, opt);\n\n if (obj.fAxes.length == 3)\n return RH3Painter.draw(dom, obj, opt);\n\n return null;\n}\n\n\nexport { RH3Painter, drawHistDisplayItem };\n"],"x_google_ignoreList":[0]} \ No newline at end of file +{"version":3,"file":"579.8c087840c9033381.js","mappings":"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","names":["RH3Painter","RHistPainter","getDimension","scanContent","when_axis_changed","this","nbinsx","nbinsy","nbinsz","histo","getHisto","extractAxesProperties","isDisplayItem","gminbin","fContMin","gminposbin","fContMinPos","gmaxbin","fContMax","getBinContent","i","j","k","bin_content","draw_content","countStat","xi","yi","zi","xx","xside","yy","yside","zz","zside","cont","xaxis","getAxis","yaxis","zaxis","stat_sum0","stat_sumx1","stat_sumy1","stat_sumz1","stat_sumx2","stat_sumy2","stat_sumz2","i1","getSelectIndex","i2","j1","j2","k1","k2","res","getFramePainter","name","fName","entries","integral","meanx","meany","meanz","rmsx","rmsy","rmsz","GetBinCoord","Math","abs","sqrt","fEntries","fillStatistic","stat","dostat","data","print_name","print_entries","floor","print_mean","print_rms","print_integral","clearStat","addText","format","getBinTooltips","ix","iy","iz","lines","dx","dy","dz","stepx","stepy","stepz","push","getObjectHint","getAxisBinTip","binz","lbl","round","floatToString","gStyle","draw3DScatter","handle","_this","main","di","stepi","dj","stepj","dk","stepk","coef","numpixels","sumz","content_lmt","max","webgl","pnts","PointsCreator","size_x3d","bins","Int32Array","nbin","rnd","TRandom","num","n","binx","random","biny","getBin","addPoint","grx","gry","grz","createPoints","color","v7EvalColor","then","mesh","toplevel","add","painter","tip_color","tooltip","intersect","Number","isInteger","index","console","error","REVISION","indx","nvertex","length","p","tip","get3DToolTip","x1","GetBinLowEdge","x2","y1","y2","z1","z2","opacity","draw3DBins","single_bin_verts","single_bin_norms","fillcolor","buffer_size","use_lambert","use_helper","use_colors","use_opacity","use_scale","tipscale","options","Sphere","geom","SphereGeometry","applyMatrix4","Matrix4","makeRotationX","PI","computeVertexNormals","getIndex","array","pos","getAttribute","norm","Float32Array","iii","indicies","Box3D","normals","vertices","nn","vert","x","y","z","Box","Color","palette","getHistPalette","createContour","wei","scalex","scaley","scalez","nbins","cols_size","num_colors","cols_sequence","pow","colindx","getContourIndex","undefined","cols_nbins","Array","bin_verts","bin_norms","bin_tooltips","helper_kind","helper_indexes","helper_positions","ncol","nseq","Uint16Array","GetBinCenter","vvv","bin_v","bin_n","vi","helper_segments","shift","helper_i","helper_p","all_bins_buffgeom","BufferGeometry","setAttribute","BufferAttribute","getColor","material","MeshLambertMaterial","transparent","vertexColors","MeshBasicMaterial","combined_bins","Mesh","bins_faces","faceIndex","value","lcolor","helper_material","LineBasicMaterial","createLineSegments","updatePaletteDraw","draw3D","prepareDraw","only_indexes","extra","right_extra","Scatter","Promise","resolve","redraw","reason","resize3D","render3D","assignFrame3DMethods","create3DScene","Render3D","setAxesRanges","xmin","xmax","ymin","ymax","zmin","zmax","set3DOptions","drawXYZ","RAxisPainter","zoom","settings","ndim","draw","v7","drawingBins","addKeysHandler","fillToolbar","pp","getPadPainter","addPadButton","showPadButtons","canZoomInside","axis","min","obj","toUpperCase","FindBin","autoZoom","ileft","iright","jleft","jright","kleft","kright","isany","fillHistContextMenu","menu","opts","getSupportedDrawOptions","addDrawMenu","arg","showInspector","decodeOptions","interactiveRedraw","static","dom","mode3d","ensureRCanvas","setAsMainPainter","minimum","kNoZoom","maximum","kind","v7EvalAttr","sub","o","drawHistDisplayItem","opt","fAxes","RH1Painter","RH2Painter"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/hist/RH3Painter.mjs"],"sourcesContent":["import { gStyle, settings, kNoZoom } from '../core.mjs';\nimport { REVISION, Matrix4, Mesh, MeshBasicMaterial, MeshLambertMaterial, SphereGeometry,\n LineBasicMaterial, BufferAttribute, BufferGeometry } from '../three.mjs';\nimport { floatToString, TRandom } from '../base/BasePainter.mjs';\nimport { ensureRCanvas } from '../gpad/RCanvasPainter.mjs';\nimport { RAxisPainter } from '../gpad/RAxisPainter.mjs';\nimport { RHistPainter } from '../hist2d/RHistPainter.mjs';\nimport { createLineSegments, PointsCreator, Box3D } from '../base/base3d.mjs';\nimport { RH1Painter } from './RH1Painter.mjs';\nimport { RH2Painter } from './RH2Painter.mjs';\nimport { assignFrame3DMethods } from './hist3d.mjs';\n\n/**\n * @summary Painter for RH3 classes\n *\n * @private\n */\n\nclass RH3Painter extends RHistPainter {\n\n /** @summary Returns histogram dimension */\n getDimension() { return 3; }\n\n scanContent(when_axis_changed) {\n\n // no need to rescan histogram while result does not depend from axis selection\n if (when_axis_changed && this.nbinsx && this.nbinsy && this.nbinsz) return;\n\n let histo = this.getHisto();\n if (!histo) return;\n\n this.extractAxesProperties(3);\n\n // global min/max, used at the moment in 3D drawing\n\n if (this.isDisplayItem()) {\n // take min/max values from the display item\n this.gminbin = histo.fContMin;\n this.gminposbin = histo.fContMinPos > 0 ? histo.fContMinPos : null;\n this.gmaxbin = histo.fContMax;\n } else {\n this.gminbin = this.gmaxbin = histo.getBinContent(1,1,1);\n\n for (let i = 0; i < this.nbinsx; ++i)\n for (let j = 0; j < this.nbinsy; ++j)\n for (let k = 0; k < this.nbinsz; ++k) {\n let bin_content = histo.getBinContent(i+1, j+1, k+1);\n if (bin_content < this.gminbin) this.gminbin = bin_content; else\n if (bin_content > this.gmaxbin) this.gmaxbin = bin_content;\n }\n }\n\n this.draw_content = this.gmaxbin > 0;\n }\n\n /** @summary Count histogram statistic */\n countStat() {\n let histo = this.getHisto(),\n xaxis = this.getAxis('x'),\n yaxis = this.getAxis('y'),\n zaxis = this.getAxis('z'),\n stat_sum0 = 0, stat_sumx1 = 0, stat_sumy1 = 0,\n stat_sumz1 = 0, stat_sumx2 = 0, stat_sumy2 = 0, stat_sumz2 = 0,\n i1 = this.getSelectIndex('x', 'left'),\n i2 = this.getSelectIndex('x', 'right'),\n j1 = this.getSelectIndex('y', 'left'),\n j2 = this.getSelectIndex('y', 'right'),\n k1 = this.getSelectIndex('z', 'left'),\n k2 = this.getSelectIndex('z', 'right'),\n fp = this.getFramePainter(),\n res = { name: histo.fName, entries: 0, integral: 0, meanx: 0, meany: 0, meanz: 0, rmsx: 0, rmsy: 0, rmsz: 0 },\n xi, yi, zi, xx, xside, yy, yside, zz, zside, cont;\n\n for (xi = 1; xi <= this.nbinsx; ++xi) {\n\n xx = xaxis.GetBinCoord(xi - 0.5);\n xside = (xi <= i1+1) ? 0 : (xi > i2+1 ? 2 : 1);\n\n for (yi = 1; yi <= this.nbinsy; ++yi) {\n\n yy = yaxis.GetBinCoord(yi - 0.5);\n yside = (yi <= j1+1) ? 0 : (yi > j2+1 ? 2 : 1);\n\n for (zi = 1; zi <= this.nbinsz; ++zi) {\n\n zz = zaxis.GetBinCoord(zi - 0.5);\n zside = (zi <= k1+1) ? 0 : (zi > k2+1 ? 2 : 1);\n\n cont = histo.getBinContent(xi, yi, zi);\n res.entries += cont;\n\n if ((xside == 1) && (yside == 1) && (zside == 1)) {\n stat_sum0 += cont;\n stat_sumx1 += xx * cont;\n stat_sumy1 += yy * cont;\n stat_sumz1 += zz * cont;\n stat_sumx2 += xx**2 * cont;\n stat_sumy2 += yy**2 * cont;\n stat_sumz2 += zz**2 * cont;\n }\n }\n }\n }\n\n if (Math.abs(stat_sum0) > 1e-300) {\n res.meanx = stat_sumx1 / stat_sum0;\n res.meany = stat_sumy1 / stat_sum0;\n res.meanz = stat_sumz1 / stat_sum0;\n res.rmsx = Math.sqrt(Math.abs(stat_sumx2 / stat_sum0 - res.meanx**2));\n res.rmsy = Math.sqrt(Math.abs(stat_sumy2 / stat_sum0 - res.meany**2));\n res.rmsz = Math.sqrt(Math.abs(stat_sumz2 / stat_sum0 - res.meanz**2));\n }\n\n res.integral = stat_sum0;\n\n if (histo.fEntries > 1)\n res.entries = histo.fEntries;\n\n return res;\n }\n\n /** @summary Fill statistic */\n fillStatistic(stat, dostat /*, dofit */) {\n\n let data = this.countStat(),\n print_name = dostat % 10,\n print_entries = Math.floor(dostat / 10) % 10,\n print_mean = Math.floor(dostat / 100) % 10,\n print_rms = Math.floor(dostat / 1000) % 10,\n // print_under = Math.floor(dostat / 10000) % 10,\n // print_over = Math.floor(dostat / 100000) % 10,\n print_integral = Math.floor(dostat / 1000000) % 10;\n // print_skew = Math.floor(dostat / 10000000) % 10;\n // print_kurt = Math.floor(dostat / 100000000) % 10;\n\n stat.clearStat();\n\n if (print_name > 0)\n stat.addText(data.name);\n\n if (print_entries > 0)\n stat.addText('Entries = ' + stat.format(data.entries,'entries'));\n\n if (print_mean > 0) {\n stat.addText('Mean x = ' + stat.format(data.meanx));\n stat.addText('Mean y = ' + stat.format(data.meany));\n stat.addText('Mean z = ' + stat.format(data.meanz));\n }\n\n if (print_rms > 0) {\n stat.addText('Std Dev x = ' + stat.format(data.rmsx));\n stat.addText('Std Dev y = ' + stat.format(data.rmsy));\n stat.addText('Std Dev z = ' + stat.format(data.rmsz));\n }\n\n if (print_integral > 0) {\n stat.addText('Integral = ' + stat.format(data.integral,'entries'));\n }\n\n return true;\n }\n\n /** @summary Provide text information (tooltips) for histogram bin */\n getBinTooltips(ix, iy, iz) {\n let lines = [], histo = this.getHisto(),\n dx = 1, dy = 1, dz = 1;\n\n if (this.isDisplayItem()) {\n dx = histo.stepx || 1;\n dy = histo.stepy || 1;\n dz = histo.stepz || 1;\n }\n\n lines.push(this.getObjectHint());\n\n lines.push(`x = ${this.getAxisBinTip('x', ix, dx)} xbin=${ix+1}`);\n lines.push(`y = ${this.getAxisBinTip('y', iy, dy)} ybin=${iy+1}`);\n lines.push(`z = ${this.getAxisBinTip('z', iz, dz)} zbin=${iz+1}`);\n\n let binz = histo.getBinContent(ix+1, iy+1, iz+1),\n lbl = 'entries = '+ ((dx > 1) || (dy > 1) || (dz > 1) ? '~' : '');\n if (binz === Math.round(binz))\n lines.push(lbl + binz);\n else\n lines.push(lbl + floatToString(binz, gStyle.fStatFormat));\n\n return lines;\n }\n\n /** @summary Try to draw 3D histogram as scatter plot\n * @desc If there are too many points, returns promise with false */\n async draw3DScatter(handle) {\n\n let histo = this.getHisto(),\n main = this.getFramePainter(),\n i1 = handle.i1, i2 = handle.i2, di = handle.stepi,\n j1 = handle.j1, j2 = handle.j2, dj = handle.stepj,\n k1 = handle.k1, k2 = handle.k2, dk = handle.stepk,\n i, j, k, bin_content;\n\n if ((i2 <= i1) || (j2 <= j1) || (k2 <= k1))\n return true;\n\n // scale down factor if too large values\n let coef = (this.gmaxbin > 1000) ? 1000/this.gmaxbin : 1,\n numpixels = 0, sumz = 0, content_lmt = Math.max(0, this.gminbin);\n\n for (i = i1; i < i2; i += di) {\n for (j = j1; j < j2; j += dj) {\n for (k = k1; k < k2; k += dk) {\n bin_content = histo.getBinContent(i+1, j+1, k+1);\n sumz += bin_content;\n if (bin_content <= content_lmt) continue;\n numpixels += Math.round(bin_content*coef);\n }\n }\n }\n\n // too many pixels - use box drawing\n if (numpixels > (main.webgl ? 100000 : 30000))\n return false;\n\n let pnts = new PointsCreator(numpixels, main.webgl, main.size_x3d/200),\n bins = new Int32Array(numpixels), nbin = 0,\n xaxis = this.getAxis('x'), yaxis = this.getAxis('y'), zaxis = this.getAxis('z'),\n rnd = new TRandom(sumz);\n\n for (i = i1; i < i2; i += di) {\n for (j = j1; j < j2; j += dj) {\n for (k = k1; k < k2; k += dk) {\n bin_content = histo.getBinContent(i+1, j+1, k+1);\n if (bin_content <= content_lmt) continue;\n let num = Math.round(bin_content*coef);\n\n for (let n=0;n {\n main.toplevel.add(mesh);\n\n mesh.bins = bins;\n mesh.painter = this;\n mesh.tip_color = 0x00FF00;\n\n mesh.tooltip = function(intersect) {\n if (!Number.isInteger(intersect.index)) {\n console.error(`intersect.index not provided, three.js version ${REVISION}`);\n return null;\n }\n\n let indx = Math.floor(intersect.index / this.nvertex);\n if ((indx < 0) || (indx >= this.bins.length)) return null;\n\n let p = this.painter,\n main = p.getFramePainter(),\n tip = p.get3DToolTip(this.bins[indx]);\n\n tip.x1 = main.grx(p.getAxis('x').GetBinLowEdge(tip.ix));\n tip.x2 = main.grx(p.getAxis('x').GetBinLowEdge(tip.ix+di));\n tip.y1 = main.gry(p.getAxis('y').GetBinLowEdge(tip.iy));\n tip.y2 = main.gry(p.getAxis('y').GetBinLowEdge(tip.iy+dj));\n tip.z1 = main.grz(p.getAxis('z').GetBinLowEdge(tip.iz));\n tip.z2 = main.grz(p.getAxis('z').GetBinLowEdge(tip.iz+dk));\n tip.color = this.tip_color;\n tip.opacity = 0.3;\n\n return tip;\n };\n\n return true;\n });\n }\n\n /** @summary Drawing of 3D histogram */\n draw3DBins(handle) {\n\n let fillcolor = this.v7EvalColor('fill_color', 'red'),\n main = this.getFramePainter(),\n buffer_size = 0, use_lambert = false,\n use_helper = false, use_colors = false, use_opacity = 1, use_scale = true,\n single_bin_verts, single_bin_norms,\n tipscale = 0.5;\n\n if (this.options.Sphere) {\n\n // drawing spheres\n tipscale = 0.4;\n use_lambert = true;\n if (this.options.Sphere === 11) use_colors = true;\n\n let geom = main.webgl ? new SphereGeometry(0.5, 16, 12) : new SphereGeometry(0.5, 8, 6);\n geom.applyMatrix4( new Matrix4().makeRotationX( Math.PI / 2 ) );\n geom.computeVertexNormals();\n\n let indx = geom.getIndex().array,\n pos = geom.getAttribute('position').array,\n norm = geom.getAttribute('normal').array;\n\n buffer_size = indx.length*3;\n single_bin_verts = new Float32Array(buffer_size);\n single_bin_norms = new Float32Array(buffer_size);\n\n for (let k=0;k= 0) {\n if (cols_size[colindx] === undefined) {\n cols_size[colindx] = 0;\n cols_sequence[colindx] = num_colors++;\n }\n cols_size[colindx]+=1;\n } else {\n console.error(`not found color for value = ${bin_content}`);\n }\n }\n }\n }\n\n if (!use_colors) {\n cols_size.push(nbins);\n num_colors = 1;\n cols_sequence = [0];\n }\n\n let cols_nbins = new Array(num_colors),\n bin_verts = new Array(num_colors),\n bin_norms = new Array(num_colors),\n bin_tooltips = new Array(num_colors),\n helper_kind = new Array(num_colors),\n helper_indexes = new Array(num_colors), // helper_kind == 1, use original vertices\n helper_positions = new Array(num_colors); // helper_kind == 2, all vertices copied into separate buffer\n\n for(let ncol = 0; ncol < cols_size.length; ++ncol) {\n if (!cols_size[ncol]) continue; // ignore dummy colors\n\n nbins = cols_size[ncol]; // how many bins with specified color\n let nseq = cols_sequence[ncol];\n\n cols_nbins[nseq] = 0; // counter for the filled bins\n\n helper_kind[nseq] = 0;\n\n // 1 - use same vertices to create helper, one can use maximal 64K vertices\n // 2 - all vertices copied into separate buffer\n if (use_helper)\n helper_kind[nseq] = (nbins * buffer_size / 3 > 0xFFF0) ? 2 : 1;\n\n bin_verts[nseq] = new Float32Array(nbins * buffer_size);\n bin_norms[nseq] = new Float32Array(nbins * buffer_size);\n bin_tooltips[nseq] = new Int32Array(nbins);\n\n if (helper_kind[nseq] === 1)\n helper_indexes[nseq] = new Uint16Array(nbins * Box3D.MeshSegments.length);\n\n if (helper_kind[nseq] === 2)\n helper_positions[nseq] = new Float32Array(nbins * Box3D.Segments.length * 3);\n }\n\n let binx, grx, biny, gry, binz, grz;\n xaxis = this.getAxis('x'),\n yaxis = this.getAxis('y'),\n zaxis = this.getAxis('z');\n\n for (i = i1; i < i2; i += di) {\n binx = xaxis.GetBinCenter(i+1); grx = main.grx(binx);\n for (j = j1; j < j2; j += dj) {\n biny = yaxis.GetBinCenter(j+1); gry = main.gry(biny);\n for (k = k1; k < k2; k +=dk) {\n bin_content = histo.getBinContent(i+1, j+1, k+1);\n if (!this.options.Color && ((bin_content === 0) || (bin_content < this.gminbin))) continue;\n\n wei = use_scale ? Math.pow(Math.abs(bin_content*use_scale), 0.3333) : 1;\n if (wei < 1e-3) continue; // do not show very small bins\n\n let nseq = 0;\n if (use_colors) {\n let colindx = palette.getContourIndex(bin_content);\n if (colindx < 0) continue;\n nseq = cols_sequence[colindx];\n }\n\n nbins = cols_nbins[nseq];\n\n binz = zaxis.GetBinCenter(k+1); grz = main.grz(binz);\n\n // remember bin index for tooltip\n bin_tooltips[nseq][nbins] = histo.getBin(i+1, j+1, k+1);\n\n let vvv = nbins * buffer_size, bin_v = bin_verts[nseq], bin_n = bin_norms[nseq];\n\n // Grab the coordinates and scale that are being assigned to each bin\n for (let vi = 0; vi < buffer_size; vi+=3, vvv+=3) {\n bin_v[vvv] = grx + single_bin_verts[vi]*scalex*wei;\n bin_v[vvv+1] = gry + single_bin_verts[vi+1]*scaley*wei;\n bin_v[vvv+2] = grz + single_bin_verts[vi+2]*scalez*wei;\n\n bin_n[vvv] = single_bin_norms[vi];\n bin_n[vvv+1] = single_bin_norms[vi+1];\n bin_n[vvv+2] = single_bin_norms[vi+2];\n }\n\n if (helper_kind[nseq] === 1) {\n // reuse vertices created for the mesh\n let helper_segments = Box3D.MeshSegments;\n vvv = nbins * helper_segments.length;\n let shift = Math.round(nbins * buffer_size/3),\n helper_i = helper_indexes[nseq];\n for (let n = 0; n < helper_segments.length; ++n)\n helper_i[vvv+n] = shift + helper_segments[n];\n }\n\n if (helper_kind[nseq] === 2) {\n let helper_segments = Box3D.Segments,\n helper_p = helper_positions[nseq];\n vvv = nbins * helper_segments.length * 3;\n for (let n = 0; n < helper_segments.length; ++n, vvv += 3) {\n let vert = Box3D.Vertices[helper_segments[n]];\n helper_p[vvv] = grx + (vert.x-0.5)*scalex*wei;\n helper_p[vvv+1] = gry + (vert.y-0.5)*scaley*wei;\n helper_p[vvv+2] = grz + (vert.z-0.5)*scalez*wei;\n }\n }\n\n cols_nbins[nseq] = nbins+1;\n }\n }\n }\n\n for (let ncol = 0; ncol < cols_size.length; ++ncol) {\n if (!cols_size[ncol]) continue; // ignore dummy colors\n\n let nseq = cols_sequence[ncol];\n\n // BufferGeometries that store geometry of all bins\n let all_bins_buffgeom = new BufferGeometry();\n\n // Create mesh from bin buffergeometry\n all_bins_buffgeom.setAttribute('position', new BufferAttribute(bin_verts[nseq], 3));\n all_bins_buffgeom.setAttribute('normal', new BufferAttribute(bin_norms[nseq], 3));\n\n if (use_colors) fillcolor = palette.getColor(ncol);\n\n let material = use_lambert ? new MeshLambertMaterial({ color: fillcolor, opacity: use_opacity, transparent: (use_opacity < 1), vertexColors: false })\n : new MeshBasicMaterial({ color: fillcolor, opacity: use_opacity, vertexColors: false });\n\n let combined_bins = new Mesh(all_bins_buffgeom, material);\n\n combined_bins.bins = bin_tooltips[nseq];\n combined_bins.bins_faces = buffer_size/9;\n combined_bins.painter = this;\n\n combined_bins.scalex = tipscale*scalex;\n combined_bins.scaley = tipscale*scaley;\n combined_bins.scalez = tipscale*scalez;\n combined_bins.tip_color = 0x00FF00;\n combined_bins.use_scale = use_scale;\n\n combined_bins.tooltip = function(intersect) {\n if (!Number.isInteger(intersect.faceIndex)) {\n console.error(`intersect.faceIndex not provided, three.js version ${REVISION}`);\n return null;\n }\n let indx = Math.floor(intersect.faceIndex / this.bins_faces);\n if ((indx < 0) || (indx >= this.bins.length)) return null;\n\n let p = this.painter,\n main = p.getFramePainter(),\n tip = p.get3DToolTip(this.bins[indx]),\n grx = main.grx(p.getAxis('x').GetBinCoord(tip.ix-0.5)),\n gry = main.gry(p.getAxis('y').GetBinCoord(tip.iy-0.5)),\n grz = main.grz(p.getAxis('z').GetBinCoord(tip.iz-0.5)),\n wei = this.use_scale ? Math.pow(Math.abs(tip.value*this.use_scale), 0.3333) : 1;\n\n tip.x1 = grx - this.scalex*wei; tip.x2 = grx + this.scalex*wei;\n tip.y1 = gry - this.scaley*wei; tip.y2 = gry + this.scaley*wei;\n tip.z1 = grz - this.scalez*wei; tip.z2 = grz + this.scalez*wei;\n\n tip.color = this.tip_color;\n\n return tip;\n };\n\n main.toplevel.add(combined_bins);\n\n if (helper_kind[nseq] > 0) {\n let lcolor = this.v7EvalColor('line_color', 'lightblue'),\n helper_material = new LineBasicMaterial({ color: lcolor }),\n lines = null;\n\n if (helper_kind[nseq] === 1) {\n // reuse positions from the mesh - only special index was created\n lines = createLineSegments(bin_verts[nseq], helper_material, helper_indexes[nseq]);\n } else {\n lines = createLineSegments(helper_positions[nseq], helper_material);\n }\n\n main.toplevel.add(lines);\n }\n }\n\n if (use_colors)\n this.updatePaletteDraw();\n }\n\n draw3D() {\n\n if (!this.draw_content)\n return false;\n\n //this.options.Scatter = false;\n //this.options.Box = true;\n\n let handle = this.prepareDraw({ only_indexes: true, extra: -0.5, right_extra: -1 });\n\n let pr = this.options.Scatter ? this.draw3DScatter(handle) : Promise.resolve(false);\n\n return pr.then(res => {\n return res ? res : this.draw3DBins(handle);\n });\n }\n\n\n /** @summary Redraw histogram*/\n redraw(reason) {\n\n let main = this.getFramePainter(); // who makes axis and 3D drawing\n\n if (reason == 'resize') {\n if (main.resize3D()) main.render3D();\n return this;\n }\n\n assignFrame3DMethods(main);\n return main.create3DScene(this.options.Render3D).then(() => {\n main.setAxesRanges(this.getAxis('x'), this.xmin, this.xmax, this.getAxis('y'), this.ymin, this.ymax, this.getAxis('z'), this.zmin, this.zmax);\n main.set3DOptions(this.options);\n main.drawXYZ(main.toplevel, RAxisPainter, { zoom: settings.Zooming, ndim: 3, draw: true, v7: true });\n return this.drawingBins(reason);\n }).then(() => this.draw3D()).then(() => {\n main.render3D();\n main.addKeysHandler();\n return this;\n });\n }\n\n /** @summary Fill pad toolbar with RH3-related functions */\n fillToolbar() {\n let pp = this.getPadPainter();\n if (!pp) return;\n\n pp.addPadButton('auto_zoom', 'Unzoom all axes', 'ToggleZoom', 'Ctrl *');\n if (this.draw_content)\n pp.addPadButton('statbox', 'Toggle stat box', 'ToggleStatBox');\n pp.showPadButtons();\n }\n\n /** @summary Checks if it makes sense to zoom inside specified axis range */\n canZoomInside(axis, min, max) {\n let obj = this.getHisto();\n if (obj) obj = obj['f'+axis.toUpperCase()+'axis'];\n return !obj || (obj.FindBin(max,0.5) - obj.FindBin(min,0) > 1);\n }\n\n /** @summary Perform automatic zoom inside non-zero region of histogram */\n autoZoom() {\n let i1 = this.getSelectIndex('x', 'left'),\n i2 = this.getSelectIndex('x', 'right'),\n j1 = this.getSelectIndex('y', 'left'),\n j2 = this.getSelectIndex('y', 'right'),\n k1 = this.getSelectIndex('z', 'left'),\n k2 = this.getSelectIndex('z', 'right'),\n i, j, k, histo = this.getHisto();\n\n if ((i1 === i2) || (j1 === j2) || (k1 === k2)) return;\n\n // first find minimum\n let min = histo.getBinContent(i1 + 1, j1 + 1, k1+1);\n for (i = i1; i < i2; ++i)\n for (j = j1; j < j2; ++j)\n for (k = k1; k < k2; ++k)\n min = Math.min(min, histo.getBinContent(i+1, j+1, k+1));\n\n if (min > 0) return; // if all points positive, no chance for autoscale\n\n let ileft = i2, iright = i1, jleft = j2, jright = j1, kleft = k2, kright = k1;\n\n for (i = i1; i < i2; ++i)\n for (j = j1; j < j2; ++j)\n for (k = k1; k < k2; ++k)\n if (histo.getBinContent(i+1, j+1, k+1) > min) {\n if (i < ileft) ileft = i;\n if (i >= iright) iright = i + 1;\n if (j < jleft) jleft = j;\n if (j >= jright) jright = j + 1;\n if (k < kleft) kleft = k;\n if (k >= kright) kright = k + 1;\n }\n\n let xmin, xmax, ymin, ymax, zmin, zmax, isany = false;\n\n if ((ileft === iright-1) && (ileft > i1+1) && (iright < i2-1)) { ileft--; iright++; }\n if ((jleft === jright-1) && (jleft > j1+1) && (jright < j2-1)) { jleft--; jright++; }\n if ((kleft === kright-1) && (kleft > k1+1) && (kright < k2-1)) { kleft--; kright++; }\n\n if ((ileft > i1 || iright < i2) && (ileft < iright - 1)) {\n xmin = this.getAxis('x').GetBinLowEdge(ileft+1);\n xmax = this.getAxis('x').GetBinLowEdge(iright+1);\n isany = true;\n }\n\n if ((jleft > j1 || jright < j2) && (jleft < jright - 1)) {\n ymin = this.getAxis('y').GetBinLowEdge(jleft+1);\n ymax = this.getAxis('y').GetBinLowEdge(jright+1);\n isany = true;\n }\n\n if ((kleft > k1 || kright < k2) && (kleft < kright - 1)) {\n zmin = this.getAxis('z').GetBinLowEdge(kleft+1);\n zmax = this.getAxis('z').GetBinLowEdge(kright+1);\n isany = true;\n }\n\n if (isany)\n return this.getFramePainter().zoom(xmin, xmax, ymin, ymax, zmin, zmax);\n }\n\n /** @summary Fill histogram context menu */\n fillHistContextMenu(menu) {\n\n let opts = this.getSupportedDrawOptions();\n\n menu.addDrawMenu('Draw with', opts, arg => {\n if (arg === 'inspect')\n return this.showInspector();\n\n this.decodeOptions(arg);\n\n this.interactiveRedraw(true, 'drawopt');\n });\n }\n\n /** @summary draw RH3 object */\n static async draw(dom, histo /*, opt*/) {\n let painter = new RH3Painter(dom, histo);\n painter.mode3d = true;\n\n return ensureRCanvas(painter, '3d').then(() => {\n\n painter.setAsMainPainter();\n\n painter.options = { Box: 0, Scatter: false, Sphere: 0, Color: false, minimum: kNoZoom, maximum: kNoZoom };\n\n let kind = painter.v7EvalAttr('kind', ''),\n sub = painter.v7EvalAttr('sub', 0),\n o = painter.options;\n\n switch(kind) {\n case 'box': o.Box = 10 + sub; break;\n case 'sphere': o.Sphere = 10 + sub; break;\n case 'col': o.Color = true; break;\n case 'scat': o.Scatter = true; break;\n default: o.Box = 10;\n }\n\n painter.scanContent();\n return painter.redraw();\n });\n }\n\n} // class RH3Painter\n\n/** @summary draw RHistDisplayItem object\n * @private */\nfunction drawHistDisplayItem(dom, obj, opt) {\n if (!obj)\n return null;\n\n if (obj.fAxes.length == 1)\n return RH1Painter.draw(dom, obj, opt);\n\n if (obj.fAxes.length == 2)\n return RH2Painter.draw(dom, obj, opt);\n\n if (obj.fAxes.length == 3)\n return RH3Painter.draw(dom, obj, opt);\n\n return null;\n}\n\n\nexport { RH3Painter, drawHistDisplayItem };\n"],"x_google_ignoreList":[0]} \ No newline at end of file diff --git a/docs/580.ce6123e31b50494f.js b/docs/580.ce6123e31b50494f.js new file mode 100644 index 000000000..2bd075eed --- /dev/null +++ b/docs/580.ce6123e31b50494f.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[580],{2580:(N,v,l)=>{l.r(v),l.d(v,{drawLeafPlayer:()=>S,drawTree:()=>U,drawTreePlayer:()=>P,drawTreePlayerKey:()=>k});var x=l(4788),n=l(9542),R=l(2253),y=l(8538),_=l(3414),O=l(3675),f=l(6458),$=l(629),B=l(8189),M=l(5906),A=l(3761),K=l(7822),c=l(9622);function b(i,t,e){return T.apply(this,arguments)}function T(){return(T=(0,x.Z)(function*(i,t,e){let s=t?._typename;return s&&(0,n.isStr)(s)?0==s.indexOf(n.clTH1)?$.TH1Painter.draw(i,t,e):0==s.indexOf(n.clTH2)?B.TH2Painter.draw(i,t,e):0==s.indexOf(n.clTH3)?M.TH3Painter.draw(i,t,e):0==s.indexOf(n.clTGraph)?A.o.draw(i,t,e):s==n.clTPolyMarker3D&&t.$hist?M.TH3Painter.draw(i,t.$hist,e).then(()=>{let r=new f.tK(i,t,e);return r.addToPadPrimitives(),r.redraw=K.Y,r.redraw()}):Promise.reject(Error(`Object of type ${s} cannot be draw with TTree`)):Promise.reject(Error("Object without type cannot be draw with TTree"))})).apply(this,arguments)}function I(i,t){return g.apply(this,arguments)}function g(){return(g=(0,x.Z)(function*(i,t){if(t||this.last_pr){if(this.dump||this.testio){if(!t)return;if((0,n.isBatchMode)()){let s=new O.be(this.drawid);return s.selectDom().property("_json_object_",i),s}if((0,n.isFunc)(n.internals.drawInspector))return n.internals.drawInspector(this.drawid,i);let e=(0,n.create)(n.clTObjString);return e.fString=(0,n.toJSON)(i,2),(0,f.VE)(this.drawid,e)}return this.last_pr||(this.last_pr=Promise.resolve(!0)),this.last_pr.then(()=>(this.last_pr=this.obj_painter?this.obj_painter.redrawObject(i).then(()=>this.obj_painter):b(this.drawid,i).then(e=>(this.obj_painter=e,t||(this.last_pr=null),e)),t?this.last_pr:null))}})).apply(this,arguments)}function C(i){return i.draw_first=!0,i.configureOnline=function(t,e,s,r,a){this.setItemName(t,"",this),this.url=e,this.root_version=r,this.askey=s,this.draw_expr=a},i.configureTree=function(t){this.local_tree=t},i.showExtraButtons=function(t){let e=this.selectDom(),s=this.local_tree?this.local_tree.fEntries:0;e.select(".treedraw_more").remove(),e.select(".treedraw_buttons").node().innerHTML+=`Cut: Opt: Num: First: `,e.select(".treedraw_exe").on("click",()=>this.performDraw()),e.select(".treedraw_cut").property("value",t?.parse_cut||"").on("change",()=>this.performDraw()),e.select(".treedraw_opt").property("value",t?.drawopt||"").on("change",()=>this.performDraw()),e.select(".treedraw_number").attr("value",t?.numentries||""),e.select(".treedraw_first").attr("value",t?.firstentry||""),e.select(".treedraw_clear").on("click",()=>(0,f.Eq)(this.drawid))},i.showPlayer=function(t){let e=this.selectDom();this.drawid="jsroot_tree_player_"+n.internals.id_counter+++"_draw";let s=t?.parse_cut||t?.numentries||t?.firstentry;e.html(`
Expr:

`),this.setTopPainter(),this.local_tree&&e.select(".treedraw_buttons").attr("title","Tree draw player for: "+this.local_tree.fName),e.select(".treedraw_exe").on("click",()=>this.performDraw()),e.select(".treedraw_varexp").attr("value",t?.parse_expr||this.draw_expr||"px:py").on("change",()=>this.performDraw()),e.select(".treedraw_varexp_info").attr("title","Example of valid draw expressions:\n px - 1-dim draw\n px:py - 2-dim draw\n px:py:pz - 3-dim draw\n px+py:px-py - use any expressions\n px:py>>Graph - create and draw TGraph\n px:py>>dump - dump extracted variables\n px:py>>h(50,-5,5,50,-5,5) - custom histogram\n px:py;hbins:100 - custom number of bins"),s?this.showExtraButtons(t):e.select(".treedraw_more").on("click",()=>this.showExtraButtons(t)),this.checkResize(),(0,c.MG)(this)},i.getValue=function(t){const e=this.selectDom().select(t);if(e.empty())return;const s=e.property("value");return void 0!==s?s:e.attr("value")},i.performLocalDraw=function(){if(!this.local_tree)return;const t=this.selectDom(),e={expr:this.getValue(".treedraw_varexp")};t.select(".treedraw_more").empty()&&(e.cut=this.getValue(".treedraw_cut"),e.cut||delete e.cut,e.drawopt=this.getValue(".treedraw_opt"),"dump"===e.drawopt&&(e.dump=!0,e.drawopt=""),e.drawopt||delete e.drawopt,e.numentries=parseInt(this.getValue(".treedraw_number")),Number.isInteger(e.numentries)||delete e.numentries,e.firstentry=parseInt(this.getValue(".treedraw_first")),Number.isInteger(e.firstentry)||delete e.firstentry),(0,f.Eq)(this.drawid),e.drawid=this.drawid,e.progress=I.bind(e),(0,_.treeDraw)(this.local_tree,e).then(s=>e.progress(s,!0))},i.getDrawOpt=function(){let t="player",e=this.getValue(".treedraw_varexp");return e&&(t+=":"+e),t},i.performDraw=function(){if(this.local_tree)return this.performLocalDraw();let t=this.selectDom(),e=this.url+"/exe.json.gz?compact=3&method=Draw",s=this.getValue(".treedraw_varexp"),r="h_tree_draw",a="",o=s.indexOf(">>");if(o<0)s+=">>"+r;else{r=s.slice(o+2),"+"==r[0]&&(r=r.slice(1));let u=r.indexOf("(");u>0&&(r=r.slice(0,u))}if(t.select(".treedraw_more").empty()){let u=this.getValue(".treedraw_cut"),h=this.getValue(".treedraw_number"),p=this.getValue(".treedraw_first");a=this.getValue(".treedraw_opt"),e+=`&prototype="const char*,const char*,Option_t*,Long64_t,Long64_t"&varexp="${s}"&selection="${u}"`,""==h&&(h=this.root_version>=394499?"TTree::kMaxEntries":"1000000000"),""==p&&(p="0"),e+=`&option="${a}"&nentries=${h}&firstentry=${p}`}else e+=`&prototype="Option_t*"&opt="${s}"`;e+="&_ret_object_="+r;const d=()=>{(0,n.httpRequest)(e,"object").then(u=>{(0,f.Eq)(this.drawid),b(this.drawid,u,a)})};this.draw_expr=s,this.askey?(this.askey=!1,(0,n.httpRequest)(this.url+"/root.json.gz?compact=3","text").then(d)):d()},i.checkResize=function(){(0,f.SI)(this.drawid)},i}function P(i,t,e,s){let r=i.findItem(t),a=i.getTopOnlineItem(r),o="",d=0;if(!r||!a)return null;if(s){for(o=r._name;r&&!r._ttree;)r=r._parent;if(!r)return null;t=i.itemFullName(r)}let u=i.getOnlineItemUrl(t);if(!u)return null;let h=a._root_version||400129,p=i.getDisplay();if(!p)return null;let L=p.findFrame(t,!0);if(!L)return null;let V=(0,R.Ys)(L).attr("id"),w=new O.be(V);if(r._childs&&!s)for(let E=0;E0&&(o+=":"),o+=m._name)}return C(w),w.configureOnline(t,u,e,h,o),w.showPlayer(),w}function k(i,t){return P(i,t,!0)}function S(i,t){return P(i,t,!1,!0)}function U(i,t,e){return D.apply(this,arguments)}function D(){return(D=(0,x.Z)(function*(i,t,e){let a,o,s=t,r=e;if(t._typename==_.clTBranchFunc?(r={expr:`.${t.func}()`,branch:t.branch},e&&0==e.indexOf("dump")?r.expr+=">>"+e:e&&(r.expr+=e),s=t.branch.$tree):t.$branch?(r={expr:`.${t.fName}${e||""}`,branch:t.$branch},(r.branch.fType===_.kClonesNode||r.branch.fType===_.kSTLNode)&&(r.expr=e,r.direct_branch=!0),s=t.$branch.$tree):t.$tree?(!e&&t.fStreamerType&&t.fStreamerType!==y.kt&&t.fStreamerType>=y.C5&&t.fStreamerType<=y.R1&&(e="dump"),r={expr:e,branch:t},s=t.$tree):(r||(r="player"),(0,n.isStr)(r)&&(r={expr:r})),!s)throw Error("No TTree object available for TTree::Draw");if((0,n.isStr)(r.expr)){let d=r.expr.indexOf("player");0==d?(r.player=!0,r.expr=r.expr.slice(6),":"==r.expr[0]&&(r.expr=r.expr.slice(1))):d>=0&&d==r.expr.length-6&&(r.player=!0,r.expr=r.expr.slice(0,d),d>0&&";"==r.expr[d-1]&&(r.expr=r.expr.slice(0,d-1)))}if(r.player?(a=new f.tK(i,t,e),C(a),a.configureTree(s),a.showPlayer(r),r.drawid=a.drawid):r.drawid=i,r.progress=I.bind(r),"testio"===r.expr)r.testio=!0,r.showProgress=c.Ae,o=(0,_.treeIOTest)(s,r);else{if(!r.expr&&!r.branch)return a;o=(0,_.treeDraw)(s,r)}return o.then(d=>r.progress(d,!0))})).apply(this,arguments)}_.TDrawSelector.prototype.ShowProgress=function(i){if(typeof document>"u"||(0,n.isBatchMode)())return;if(void 0===i||!Number.isFinite(i))return(0,c.Ae)();if(this.last_progress!==i){let a=i-this.last_progress;this.aver_diff||(this.aver_diff=a),this.aver_diff=.3*a+.7*this.aver_diff}let t=0;this.aver_diff<=0?t=0:this.aver_diff<1e-4?t=3:this.aver_diff<.001?t=2:this.aver_diff<.01&&(t=1);let e=document.createElement("p"),s=document.createTextNode("TTree draw "+(100*i).toFixed(t)+" % "),r=this;e.appendChild(s),e.title="Click on element to break drawing",e.onclick=function(){if(++r._break<3)return e.title="Tree draw will break after next I/O operation",s.nodeValue="Breaking ... ";r.Abort(),(0,c.Ae)()},(0,c.Ae)(e),this.last_progress=i}}}]); +//# sourceMappingURL=580.ce6123e31b50494f.js.map \ No newline at end of file diff --git a/docs/460.82abbdc95d6f09e0.js.map b/docs/580.ce6123e31b50494f.js.map similarity index 99% rename from docs/460.82abbdc95d6f09e0.js.map rename to docs/580.ce6123e31b50494f.js.map index d3f01d422..7502b97f2 100644 --- a/docs/460.82abbdc95d6f09e0.js.map +++ b/docs/580.ce6123e31b50494f.js.map @@ -1 +1 @@ -{"version":3,"file":"460.82abbdc95d6f09e0.js","mappings":"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","names":["drawTreeDrawResult","_x","dom","obj","opt","typ","_typename","isStr","indexOf","clTH1","TH1Painter","clTH2","TH2Painter","clTH3","TH3Painter","clTGraph","TGraphPainter","clTPolyMarker3D","$hist","then","p2","ObjectPainter","addToPadPrimitives","redraw","drawPolyMarker3D","Promise","reject","Error","apply","treeDrawProgress","_x4","final","this","last_pr","dump","testio","isBatchMode","painter","BasePainter","drawid","selectDom","property","isFunc","internals","str","create","clTObjString","fString","toJSON","drawRawText","resolve","obj_painter","redrawObject","p","createTreePlayer","player","draw_first","configureOnline","itemname","url","askey","root_version","expr","setItemName","draw_expr","configureTree","tree","local_tree","showExtraButtons","args","main","numentries","fEntries","select","remove","node","innerHTML","on","performDraw","parse_cut","drawopt","attr","firstentry","cleanup","showPlayer","show_extra","html","setTopPainter","fName","parse_expr","checkResize","registerForResize","getValue","sel","elem","empty","val","undefined","performLocalDraw","frame","cut","parseInt","Number","isInteger","progress","bind","treeDraw","getDrawOpt","res","hname","option","pos","slice","pos2","nentries","submitDrawRequest","httpRequest","resize","drawTreePlayer","hpainter","asleaf","item","findItem","top","getTopOnlineItem","leaf_cnt","_name","_ttree","_parent","itemFullName","getOnlineItemUrl","_root_version","mdi","getDisplay","findFrame","divid","d3_select","_childs","n","length","leaf","_kind","drawTreePlayerKey","drawLeafPlayer","drawTree","_x6","pr","clTBranchFunc","func","branch","$tree","$branch","fType","kClonesNode","kSTLNode","direct_branch","fStreamerType","kTString","kObject","kAnyP","showProgress","treeIOTest","TDrawSelector","value","document","isFinite","last_progress","diff","aver_diff","ndig","main_box","createElement","text_node","createTextNode","toFixed","selector","appendChild","title","onclick","_break","nodeValue","Abort"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/draw/TTree.mjs"],"sourcesContent":["import { internals, httpRequest, isBatchMode, isFunc, isStr, create, toJSON, clTObjString,\n clTGraph, clTPolyMarker3D, clTH1, clTH2, clTH3 } from '../core.mjs';\nimport { select as d3_select } from '../d3.mjs';\nimport { kTString, kObject, kAnyP } from '../io.mjs';\nimport { kClonesNode, kSTLNode, clTBranchFunc, treeDraw, treeIOTest, TDrawSelector } from '../tree.mjs';\nimport { BasePainter } from '../base/BasePainter.mjs';\nimport { cleanup, resize, drawRawText, ObjectPainter } from '../base/ObjectPainter.mjs';\nimport { TH1Painter } from '../hist/TH1Painter.mjs';\nimport { TH2Painter } from '../hist/TH2Painter.mjs';\nimport { TH3Painter } from '../hist/TH3Painter.mjs';\nimport { TGraphPainter } from '../hist/TGraphPainter.mjs';\nimport { drawPolyMarker3D } from '../draw/TPolyMarker3D.mjs';\nimport { showProgress, registerForResize } from '../gui/utils.mjs';\n\n/** @summary Show TTree::Draw progress during processing */\nTDrawSelector.prototype.ShowProgress = function(value) {\n if ((typeof document == 'undefined') || isBatchMode()) return;\n\n if ((value === undefined) || !Number.isFinite(value))\n return showProgress();\n\n if (this.last_progress !== value) {\n let diff = value - this.last_progress;\n if (!this.aver_diff) this.aver_diff = diff;\n this.aver_diff = diff * 0.3 + this.aver_diff * 0.7;\n }\n\n let ndig = 0;\n if (this.aver_diff <= 0)\n ndig = 0;\n else if (this.aver_diff < 0.0001)\n ndig = 3;\n else if (this.aver_diff < 0.001)\n ndig = 2;\n else if (this.aver_diff < 0.01)\n ndig = 1;\n\n let main_box = document.createElement('p'),\n text_node = document.createTextNode('TTree draw ' + (value * 100).toFixed(ndig) + ' % '),\n selector = this;\n\n main_box.appendChild(text_node);\n main_box.title = 'Click on element to break drawing';\n\n main_box.onclick = function() {\n if (++selector._break < 3) {\n main_box.title = 'Tree draw will break after next I/O operation';\n return text_node.nodeValue = 'Breaking ... ';\n }\n selector.Abort();\n showProgress();\n };\n\n showProgress(main_box);\n this.last_progress = value;\n}\n\n/** @summary Draw result of tree drawing\n * @private */\nasync function drawTreeDrawResult(dom, obj, opt) {\n\n let typ = obj?._typename;\n\n if (!typ || !isStr(typ))\n return Promise.reject(Error(`Object without type cannot be draw with TTree`));\n\n if (typ.indexOf(clTH1) == 0)\n return TH1Painter.draw(dom, obj, opt);\n if (typ.indexOf(clTH2) == 0)\n return TH2Painter.draw(dom, obj, opt);\n if (typ.indexOf(clTH3) == 0)\n return TH3Painter.draw(dom, obj, opt);\n if (typ.indexOf(clTGraph) == 0)\n return TGraphPainter.draw(dom, obj, opt);\n if ((typ == clTPolyMarker3D) && obj.$hist) {\n return TH3Painter.draw(dom, obj.$hist, opt).then(() => {\n let p2 = new ObjectPainter(dom, obj, opt);\n p2.addToPadPrimitives();\n p2.redraw = drawPolyMarker3D;\n return p2.redraw();\n });\n }\n\n return Promise.reject(Error(`Object of type ${typ} cannot be draw with TTree`));\n}\n\n\n/** @summary Handle callback function with progress of tree draw\n * @private */\nasync function treeDrawProgress(obj, final) {\n\n // no need to update drawing if previous is not yet completed\n if (!final && !this.last_pr)\n return;\n\n if (this.dump || this.testio) {\n if (!final) return;\n if (isBatchMode()) {\n let painter = new BasePainter(this.drawid);\n painter.selectDom().property('_json_object_', obj);\n return painter;\n }\n if (isFunc(internals.drawInspector))\n return internals.drawInspector(this.drawid, obj);\n let str = create(clTObjString);\n str.fString = toJSON(obj,2);\n return drawRawText(this.drawid, str);\n }\n\n // complex logic with intermediate update\n // while TTree reading not synchronized with drawing,\n // next portion can appear before previous is drawn\n // critical is last drawing which should wait for previous one\n // therefore last_pr is kept as inidication that promise is not yet processed\n\n if (!this.last_pr) this.last_pr = Promise.resolve(true);\n\n return this.last_pr.then(() => {\n if (this.obj_painter)\n this.last_pr = this.obj_painter.redrawObject(obj).then(() => this.obj_painter);\n else\n this.last_pr = drawTreeDrawResult(this.drawid, obj).then(p => {\n this.obj_painter = p;\n if (!final) this.last_pr = null;\n return p; // return painter for histogram\n });\n\n return final ? this.last_pr : null;\n });\n}\n\n\n/** @summary Create painter to perform tree drawing on server side\n * @private */\nfunction createTreePlayer(player) {\n\n player.draw_first = true;\n\n player.configureOnline = function(itemname, url, askey, root_version, expr) {\n this.setItemName(itemname, '', this);\n this.url = url;\n this.root_version = root_version;\n this.askey = askey;\n this.draw_expr = expr;\n }\n\n player.configureTree = function(tree) {\n this.local_tree = tree;\n }\n\n player.showExtraButtons = function(args) {\n let main = this.selectDom(),\n numentries = this.local_tree ? this.local_tree.fEntries : 0;\n\n main.select('.treedraw_more').remove(); // remove more button first\n\n main.select('.treedraw_buttons').node().innerHTML +=\n 'Cut: '+\n 'Opt: '+\n `Num: `+\n `First: `+\n '';\n\n main.select('.treedraw_exe').on('click', () => this.performDraw());\n main.select('.treedraw_cut').property('value', args?.parse_cut || '').on('change', () => this.performDraw());\n main.select('.treedraw_opt').property('value', args?.drawopt || '').on('change', () => this.performDraw());\n main.select('.treedraw_number').attr('value', args?.numentries || ''); // .on('change', () => this.performDraw());\n main.select('.treedraw_first').attr('value', args?.firstentry || ''); // .on('change', () => this.performDraw());\n main.select('.treedraw_clear').on('click', () => cleanup(this.drawid));\n }\n\n player.showPlayer = function(args) {\n\n let main = this.selectDom();\n\n this.drawid = 'jsroot_tree_player_' + internals.id_counter++ + '_draw';\n\n let show_extra = args?.parse_cut || args?.numentries || args?.firstentry;\n\n main.html('
'+\n '
' +\n '' +\n 'Expr:'+\n '' +\n '' +\n '
' +\n '

' +\n `
` +\n '
');\n\n // only when main html element created, one can set painter\n // ObjectPainter allow such usage of methods from BasePainter\n this.setTopPainter();\n\n if (this.local_tree)\n main.select('.treedraw_buttons')\n .attr('title', 'Tree draw player for: ' + this.local_tree.fName);\n main.select('.treedraw_exe').on('click', () => this.performDraw());\n main.select('.treedraw_varexp')\n .attr('value', args?.parse_expr || this.draw_expr || 'px:py')\n .on('change', () => this.performDraw());\n main.select('.treedraw_varexp_info')\n .attr('title', 'Example of valid draw expressions:\\n' +\n ' px - 1-dim draw\\n' +\n ' px:py - 2-dim draw\\n' +\n ' px:py:pz - 3-dim draw\\n' +\n ' px+py:px-py - use any expressions\\n' +\n ' px:py>>Graph - create and draw TGraph\\n' +\n ' px:py>>dump - dump extracted variables\\n' +\n ' px:py>>h(50,-5,5,50,-5,5) - custom histogram\\n' +\n ' px:py;hbins:100 - custom number of bins');\n\n if (show_extra)\n this.showExtraButtons(args);\n else\n main.select('.treedraw_more').on('click', () => this.showExtraButtons(args));\n\n this.checkResize();\n\n registerForResize(this);\n }\n\n player.getValue = function(sel) {\n const elem = this.selectDom().select(sel);\n if (elem.empty()) return;\n const val = elem.property('value');\n if (val !== undefined) return val;\n return elem.attr('value');\n }\n\n player.performLocalDraw = function() {\n if (!this.local_tree) return;\n\n const frame = this.selectDom(),\n args = { expr: this.getValue('.treedraw_varexp') };\n\n if (frame.select('.treedraw_more').empty()) {\n args.cut = this.getValue('.treedraw_cut');\n if (!args.cut) delete args.cut;\n\n args.drawopt = this.getValue('.treedraw_opt');\n if (args.drawopt === 'dump') { args.dump = true; args.drawopt = ''; }\n if (!args.drawopt) delete args.drawopt;\n\n args.numentries = parseInt(this.getValue('.treedraw_number'));\n if (!Number.isInteger(args.numentries)) delete args.numentries;\n\n args.firstentry = parseInt(this.getValue('.treedraw_first'));\n if (!Number.isInteger(args.firstentry)) delete args.firstentry;\n }\n\n /* if (args.drawopt) */ cleanup(this.drawid);\n\n args.drawid = this.drawid;\n\n args.progress = treeDrawProgress.bind(args);\n\n treeDraw(this.local_tree, args).then(obj => args.progress(obj, true));\n }\n\n player.getDrawOpt = function() {\n let res = 'player',\n expr = this.getValue('.treedraw_varexp')\n if (expr) res += ':' + expr;\n return res;\n }\n\n player.performDraw = function() {\n\n if (this.local_tree)\n return this.performLocalDraw();\n\n let frame = this.selectDom(),\n url = this.url + '/exe.json.gz?compact=3&method=Draw',\n expr = this.getValue('.treedraw_varexp'),\n hname = 'h_tree_draw', option = '',\n pos = expr.indexOf('>>');\n\n if (pos < 0) {\n expr += '>>' + hname;\n } else {\n hname = expr.slice(pos+2);\n if (hname[0] == '+') hname = hname.slice(1);\n let pos2 = hname.indexOf('(');\n if (pos2 > 0) hname = hname.slice(0, pos2);\n }\n\n if (frame.select('.treedraw_more').empty()) {\n let cut = this.getValue('.treedraw_cut'),\n nentries = this.getValue('.treedraw_number'),\n firstentry = this.getValue('.treedraw_first');\n\n option = this.getValue('.treedraw_opt');\n\n url += `&prototype=\"const char*,const char*,Option_t*,Long64_t,Long64_t\"&varexp=\"${expr}\"&selection=\"${cut}\"`;\n\n // provide all optional arguments - default value kMaxEntries not works properly in ROOT6\n if (nentries == '') nentries = (this.root_version >= 394499) ? 'TTree::kMaxEntries': '1000000000'; // kMaxEntries available since ROOT 6.05/03\n if (firstentry == '') firstentry = '0';\n url += `&option=\"${option}\"&nentries=${nentries}&firstentry=${firstentry}`;\n } else {\n url += `&prototype=\"Option_t*\"&opt=\"${expr}\"`;\n }\n url += '&_ret_object_=' + hname;\n\n const submitDrawRequest = () => {\n httpRequest(url, 'object').then(res => {\n cleanup(this.drawid);\n drawTreeDrawResult(this.drawid, res, option);\n });\n };\n\n this.draw_expr = expr;\n\n if (this.askey) {\n // first let read tree from the file\n this.askey = false;\n httpRequest(this.url + '/root.json.gz?compact=3', 'text').then(submitDrawRequest);\n } else {\n submitDrawRequest();\n }\n }\n\n player.checkResize = function(/*arg*/) {\n resize(this.drawid);\n }\n\n return player;\n}\n\n\n/** @summary function used with THttpServer to assign player for the TTree object\n * @private */\nfunction drawTreePlayer(hpainter, itemname, askey, asleaf) {\n\n let item = hpainter.findItem(itemname),\n top = hpainter.getTopOnlineItem(item),\n expr = '', leaf_cnt = 0;\n if (!item || !top) return null;\n\n if (asleaf) {\n expr = item._name;\n while (item && !item._ttree) item = item._parent;\n if (!item) return null;\n itemname = hpainter.itemFullName(item);\n }\n\n let url = hpainter.getOnlineItemUrl(itemname);\n if (!url) return null;\n\n let root_version = top._root_version || 400129; // by default use version number 6-27-01\n\n let mdi = hpainter.getDisplay();\n if (!mdi) return null;\n\n let frame = mdi.findFrame(itemname, true);\n if (!frame) return null;\n\n let divid = d3_select(frame).attr('id'),\n player = new BasePainter(divid);\n\n if (item._childs && !asleaf)\n for (let n = 0; n < item._childs.length; ++n) {\n let leaf = item._childs[n];\n if (leaf && leaf._kind && (leaf._kind.indexOf('ROOT.TLeaf') == 0) && (leaf_cnt < 2)) {\n if (leaf_cnt++ > 0) expr += ':';\n expr += leaf._name;\n }\n }\n\n createTreePlayer(player);\n player.configureOnline(itemname, url, askey, root_version, expr);\n player.showPlayer();\n\n return player;\n}\n\n/** @summary function used with THttpServer when tree is not yet loaded\n * @private */\nfunction drawTreePlayerKey(hpainter, itemname) {\n return drawTreePlayer(hpainter, itemname, true);\n}\n\n/** @summary function used with THttpServer when tree is not yet loaded\n * @private */\nfunction drawLeafPlayer(hpainter, itemname) {\n return drawTreePlayer(hpainter, itemname, false, true);\n}\n\n/** @summary function called from draw()\n * @desc just envelope for real TTree::Draw method which do the main job\n * Can be also used for the branch and leaf object\n * @private */\nasync function drawTree(dom, obj, opt) {\n\n let tree = obj, args = opt;\n\n if (obj._typename == clTBranchFunc) {\n // fictional object, created only in browser\n args = { expr: `.${obj.func}()`, branch: obj.branch };\n if (opt && opt.indexOf('dump') == 0)\n args.expr += '>>' + opt;\n else if (opt)\n args.expr += opt;\n tree = obj.branch.$tree;\n } else if (obj.$branch) {\n // this is drawing of the single leaf from the branch\n args = { expr: `.${obj.fName}${opt || ''}`, branch: obj.$branch };\n if ((args.branch.fType === kClonesNode) || (args.branch.fType === kSTLNode)) {\n // special case of size\n args.expr = opt;\n args.direct_branch = true;\n }\n\n tree = obj.$branch.$tree;\n } else if (obj.$tree) {\n // this is drawing of the branch\n\n // if generic object tried to be drawn without specifying any options, it will be just dump\n if (!opt && obj.fStreamerType && (obj.fStreamerType !== kTString) &&\n (obj.fStreamerType >= kObject) && (obj.fStreamerType <= kAnyP)) opt = 'dump';\n\n args = { expr: opt, branch: obj };\n tree = obj.$tree;\n } else {\n if (!args) args = 'player';\n if (isStr(args)) args = { expr: args };\n }\n\n if (!tree)\n throw Error('No TTree object available for TTree::Draw');\n\n if (isStr(args.expr)) {\n let p = args.expr.indexOf('player');\n if (p == 0) {\n args.player = true;\n args.expr = args.expr.slice(6);\n if (args.expr[0] == ':') args.expr = args.expr.slice(1);\n } else if ((p >= 0) && (p == args.expr.length-6)) {\n args.player = true;\n args.expr = args.expr.slice(0, p);\n if ((p > 0) && (args.expr[p-1] == ';')) args.expr = args.expr.slice(0, p-1);\n }\n }\n\n let painter;\n\n if (args.player) {\n painter = new ObjectPainter(dom, obj, opt);\n createTreePlayer(painter);\n painter.configureTree(tree);\n painter.showPlayer(args);\n args.drawid = painter.drawid;\n } else {\n args.drawid = dom;\n }\n\n // use in result handling same function as for progress handling\n\n args.progress = treeDrawProgress.bind(args);\n\n let pr;\n if (args.expr === 'testio') {\n args.testio = true;\n args.showProgress = showProgress;\n pr = treeIOTest(tree, args);\n } else if (args.expr || args.branch) {\n pr = treeDraw(tree, args);\n } else\n return painter;\n\n return pr.then(res => args.progress(res, true));\n}\n\nexport { drawTree, drawTreePlayer, drawTreePlayerKey, drawLeafPlayer };\n"],"x_google_ignoreList":[0]} \ No newline at end of file +{"version":3,"file":"580.ce6123e31b50494f.js","mappings":"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","names":["drawTreeDrawResult","_x","dom","obj","opt","typ","_typename","isStr","indexOf","clTH1","TH1Painter","clTH2","TH2Painter","clTH3","TH3Painter","clTGraph","TGraphPainter","clTPolyMarker3D","$hist","then","p2","ObjectPainter","addToPadPrimitives","redraw","drawPolyMarker3D","Promise","reject","Error","apply","treeDrawProgress","_x4","final","this","last_pr","dump","testio","isBatchMode","painter","BasePainter","drawid","selectDom","property","isFunc","internals","str","create","clTObjString","fString","toJSON","drawRawText","resolve","obj_painter","redrawObject","p","createTreePlayer","player","draw_first","configureOnline","itemname","url","askey","root_version","expr","setItemName","draw_expr","configureTree","tree","local_tree","showExtraButtons","args","main","numentries","fEntries","select","remove","node","innerHTML","on","performDraw","parse_cut","drawopt","attr","firstentry","cleanup","showPlayer","show_extra","html","setTopPainter","fName","parse_expr","checkResize","registerForResize","getValue","sel","elem","empty","val","undefined","performLocalDraw","frame","cut","parseInt","Number","isInteger","progress","bind","treeDraw","getDrawOpt","res","hname","option","pos","slice","pos2","nentries","submitDrawRequest","httpRequest","resize","drawTreePlayer","hpainter","asleaf","item","findItem","top","getTopOnlineItem","leaf_cnt","_name","_ttree","_parent","itemFullName","getOnlineItemUrl","_root_version","mdi","getDisplay","findFrame","divid","d3_select","_childs","n","length","leaf","_kind","drawTreePlayerKey","drawLeafPlayer","drawTree","_x6","pr","clTBranchFunc","func","branch","$tree","$branch","fType","kClonesNode","kSTLNode","direct_branch","fStreamerType","kTString","kObject","kAnyP","showProgress","treeIOTest","TDrawSelector","value","document","isFinite","last_progress","diff","aver_diff","ndig","main_box","createElement","text_node","createTextNode","toFixed","selector","appendChild","title","onclick","_break","nodeValue","Abort"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/draw/TTree.mjs"],"sourcesContent":["import { internals, httpRequest, isBatchMode, isFunc, isStr, create, toJSON, clTObjString,\n clTGraph, clTPolyMarker3D, clTH1, clTH2, clTH3 } from '../core.mjs';\nimport { select as d3_select } from '../d3.mjs';\nimport { kTString, kObject, kAnyP } from '../io.mjs';\nimport { kClonesNode, kSTLNode, clTBranchFunc, treeDraw, treeIOTest, TDrawSelector } from '../tree.mjs';\nimport { BasePainter } from '../base/BasePainter.mjs';\nimport { cleanup, resize, drawRawText, ObjectPainter } from '../base/ObjectPainter.mjs';\nimport { TH1Painter } from '../hist/TH1Painter.mjs';\nimport { TH2Painter } from '../hist/TH2Painter.mjs';\nimport { TH3Painter } from '../hist/TH3Painter.mjs';\nimport { TGraphPainter } from '../hist/TGraphPainter.mjs';\nimport { drawPolyMarker3D } from '../draw/TPolyMarker3D.mjs';\nimport { showProgress, registerForResize } from '../gui/utils.mjs';\n\n/** @summary Show TTree::Draw progress during processing */\nTDrawSelector.prototype.ShowProgress = function(value) {\n if ((typeof document == 'undefined') || isBatchMode()) return;\n\n if ((value === undefined) || !Number.isFinite(value))\n return showProgress();\n\n if (this.last_progress !== value) {\n let diff = value - this.last_progress;\n if (!this.aver_diff) this.aver_diff = diff;\n this.aver_diff = diff * 0.3 + this.aver_diff * 0.7;\n }\n\n let ndig = 0;\n if (this.aver_diff <= 0)\n ndig = 0;\n else if (this.aver_diff < 0.0001)\n ndig = 3;\n else if (this.aver_diff < 0.001)\n ndig = 2;\n else if (this.aver_diff < 0.01)\n ndig = 1;\n\n let main_box = document.createElement('p'),\n text_node = document.createTextNode('TTree draw ' + (value * 100).toFixed(ndig) + ' % '),\n selector = this;\n\n main_box.appendChild(text_node);\n main_box.title = 'Click on element to break drawing';\n\n main_box.onclick = function() {\n if (++selector._break < 3) {\n main_box.title = 'Tree draw will break after next I/O operation';\n return text_node.nodeValue = 'Breaking ... ';\n }\n selector.Abort();\n showProgress();\n };\n\n showProgress(main_box);\n this.last_progress = value;\n}\n\n/** @summary Draw result of tree drawing\n * @private */\nasync function drawTreeDrawResult(dom, obj, opt) {\n\n let typ = obj?._typename;\n\n if (!typ || !isStr(typ))\n return Promise.reject(Error(`Object without type cannot be draw with TTree`));\n\n if (typ.indexOf(clTH1) == 0)\n return TH1Painter.draw(dom, obj, opt);\n if (typ.indexOf(clTH2) == 0)\n return TH2Painter.draw(dom, obj, opt);\n if (typ.indexOf(clTH3) == 0)\n return TH3Painter.draw(dom, obj, opt);\n if (typ.indexOf(clTGraph) == 0)\n return TGraphPainter.draw(dom, obj, opt);\n if ((typ == clTPolyMarker3D) && obj.$hist) {\n return TH3Painter.draw(dom, obj.$hist, opt).then(() => {\n let p2 = new ObjectPainter(dom, obj, opt);\n p2.addToPadPrimitives();\n p2.redraw = drawPolyMarker3D;\n return p2.redraw();\n });\n }\n\n return Promise.reject(Error(`Object of type ${typ} cannot be draw with TTree`));\n}\n\n\n/** @summary Handle callback function with progress of tree draw\n * @private */\nasync function treeDrawProgress(obj, final) {\n\n // no need to update drawing if previous is not yet completed\n if (!final && !this.last_pr)\n return;\n\n if (this.dump || this.testio) {\n if (!final) return;\n if (isBatchMode()) {\n let painter = new BasePainter(this.drawid);\n painter.selectDom().property('_json_object_', obj);\n return painter;\n }\n if (isFunc(internals.drawInspector))\n return internals.drawInspector(this.drawid, obj);\n let str = create(clTObjString);\n str.fString = toJSON(obj,2);\n return drawRawText(this.drawid, str);\n }\n\n // complex logic with intermediate update\n // while TTree reading not synchronized with drawing,\n // next portion can appear before previous is drawn\n // critical is last drawing which should wait for previous one\n // therefore last_pr is kept as inidication that promise is not yet processed\n\n if (!this.last_pr) this.last_pr = Promise.resolve(true);\n\n return this.last_pr.then(() => {\n if (this.obj_painter)\n this.last_pr = this.obj_painter.redrawObject(obj).then(() => this.obj_painter);\n else\n this.last_pr = drawTreeDrawResult(this.drawid, obj).then(p => {\n this.obj_painter = p;\n if (!final) this.last_pr = null;\n return p; // return painter for histogram\n });\n\n return final ? this.last_pr : null;\n });\n}\n\n\n/** @summary Create painter to perform tree drawing on server side\n * @private */\nfunction createTreePlayer(player) {\n\n player.draw_first = true;\n\n player.configureOnline = function(itemname, url, askey, root_version, expr) {\n this.setItemName(itemname, '', this);\n this.url = url;\n this.root_version = root_version;\n this.askey = askey;\n this.draw_expr = expr;\n }\n\n player.configureTree = function(tree) {\n this.local_tree = tree;\n }\n\n player.showExtraButtons = function(args) {\n let main = this.selectDom(),\n numentries = this.local_tree ? this.local_tree.fEntries : 0;\n\n main.select('.treedraw_more').remove(); // remove more button first\n\n main.select('.treedraw_buttons').node().innerHTML +=\n 'Cut: '+\n 'Opt: '+\n `Num: `+\n `First: `+\n '';\n\n main.select('.treedraw_exe').on('click', () => this.performDraw());\n main.select('.treedraw_cut').property('value', args?.parse_cut || '').on('change', () => this.performDraw());\n main.select('.treedraw_opt').property('value', args?.drawopt || '').on('change', () => this.performDraw());\n main.select('.treedraw_number').attr('value', args?.numentries || ''); // .on('change', () => this.performDraw());\n main.select('.treedraw_first').attr('value', args?.firstentry || ''); // .on('change', () => this.performDraw());\n main.select('.treedraw_clear').on('click', () => cleanup(this.drawid));\n }\n\n player.showPlayer = function(args) {\n\n let main = this.selectDom();\n\n this.drawid = 'jsroot_tree_player_' + internals.id_counter++ + '_draw';\n\n let show_extra = args?.parse_cut || args?.numentries || args?.firstentry;\n\n main.html('
'+\n '
' +\n '' +\n 'Expr:'+\n '' +\n '' +\n '
' +\n '

' +\n `
` +\n '
');\n\n // only when main html element created, one can set painter\n // ObjectPainter allow such usage of methods from BasePainter\n this.setTopPainter();\n\n if (this.local_tree)\n main.select('.treedraw_buttons')\n .attr('title', 'Tree draw player for: ' + this.local_tree.fName);\n main.select('.treedraw_exe').on('click', () => this.performDraw());\n main.select('.treedraw_varexp')\n .attr('value', args?.parse_expr || this.draw_expr || 'px:py')\n .on('change', () => this.performDraw());\n main.select('.treedraw_varexp_info')\n .attr('title', 'Example of valid draw expressions:\\n' +\n ' px - 1-dim draw\\n' +\n ' px:py - 2-dim draw\\n' +\n ' px:py:pz - 3-dim draw\\n' +\n ' px+py:px-py - use any expressions\\n' +\n ' px:py>>Graph - create and draw TGraph\\n' +\n ' px:py>>dump - dump extracted variables\\n' +\n ' px:py>>h(50,-5,5,50,-5,5) - custom histogram\\n' +\n ' px:py;hbins:100 - custom number of bins');\n\n if (show_extra)\n this.showExtraButtons(args);\n else\n main.select('.treedraw_more').on('click', () => this.showExtraButtons(args));\n\n this.checkResize();\n\n registerForResize(this);\n }\n\n player.getValue = function(sel) {\n const elem = this.selectDom().select(sel);\n if (elem.empty()) return;\n const val = elem.property('value');\n if (val !== undefined) return val;\n return elem.attr('value');\n }\n\n player.performLocalDraw = function() {\n if (!this.local_tree) return;\n\n const frame = this.selectDom(),\n args = { expr: this.getValue('.treedraw_varexp') };\n\n if (frame.select('.treedraw_more').empty()) {\n args.cut = this.getValue('.treedraw_cut');\n if (!args.cut) delete args.cut;\n\n args.drawopt = this.getValue('.treedraw_opt');\n if (args.drawopt === 'dump') { args.dump = true; args.drawopt = ''; }\n if (!args.drawopt) delete args.drawopt;\n\n args.numentries = parseInt(this.getValue('.treedraw_number'));\n if (!Number.isInteger(args.numentries)) delete args.numentries;\n\n args.firstentry = parseInt(this.getValue('.treedraw_first'));\n if (!Number.isInteger(args.firstentry)) delete args.firstentry;\n }\n\n /* if (args.drawopt) */ cleanup(this.drawid);\n\n args.drawid = this.drawid;\n\n args.progress = treeDrawProgress.bind(args);\n\n treeDraw(this.local_tree, args).then(obj => args.progress(obj, true));\n }\n\n player.getDrawOpt = function() {\n let res = 'player',\n expr = this.getValue('.treedraw_varexp')\n if (expr) res += ':' + expr;\n return res;\n }\n\n player.performDraw = function() {\n\n if (this.local_tree)\n return this.performLocalDraw();\n\n let frame = this.selectDom(),\n url = this.url + '/exe.json.gz?compact=3&method=Draw',\n expr = this.getValue('.treedraw_varexp'),\n hname = 'h_tree_draw', option = '',\n pos = expr.indexOf('>>');\n\n if (pos < 0) {\n expr += '>>' + hname;\n } else {\n hname = expr.slice(pos+2);\n if (hname[0] == '+') hname = hname.slice(1);\n let pos2 = hname.indexOf('(');\n if (pos2 > 0) hname = hname.slice(0, pos2);\n }\n\n if (frame.select('.treedraw_more').empty()) {\n let cut = this.getValue('.treedraw_cut'),\n nentries = this.getValue('.treedraw_number'),\n firstentry = this.getValue('.treedraw_first');\n\n option = this.getValue('.treedraw_opt');\n\n url += `&prototype=\"const char*,const char*,Option_t*,Long64_t,Long64_t\"&varexp=\"${expr}\"&selection=\"${cut}\"`;\n\n // provide all optional arguments - default value kMaxEntries not works properly in ROOT6\n if (nentries == '') nentries = (this.root_version >= 394499) ? 'TTree::kMaxEntries': '1000000000'; // kMaxEntries available since ROOT 6.05/03\n if (firstentry == '') firstentry = '0';\n url += `&option=\"${option}\"&nentries=${nentries}&firstentry=${firstentry}`;\n } else {\n url += `&prototype=\"Option_t*\"&opt=\"${expr}\"`;\n }\n url += '&_ret_object_=' + hname;\n\n const submitDrawRequest = () => {\n httpRequest(url, 'object').then(res => {\n cleanup(this.drawid);\n drawTreeDrawResult(this.drawid, res, option);\n });\n };\n\n this.draw_expr = expr;\n\n if (this.askey) {\n // first let read tree from the file\n this.askey = false;\n httpRequest(this.url + '/root.json.gz?compact=3', 'text').then(submitDrawRequest);\n } else {\n submitDrawRequest();\n }\n }\n\n player.checkResize = function(/*arg*/) {\n resize(this.drawid);\n }\n\n return player;\n}\n\n\n/** @summary function used with THttpServer to assign player for the TTree object\n * @private */\nfunction drawTreePlayer(hpainter, itemname, askey, asleaf) {\n\n let item = hpainter.findItem(itemname),\n top = hpainter.getTopOnlineItem(item),\n expr = '', leaf_cnt = 0;\n if (!item || !top) return null;\n\n if (asleaf) {\n expr = item._name;\n while (item && !item._ttree) item = item._parent;\n if (!item) return null;\n itemname = hpainter.itemFullName(item);\n }\n\n let url = hpainter.getOnlineItemUrl(itemname);\n if (!url) return null;\n\n let root_version = top._root_version || 400129; // by default use version number 6-27-01\n\n let mdi = hpainter.getDisplay();\n if (!mdi) return null;\n\n let frame = mdi.findFrame(itemname, true);\n if (!frame) return null;\n\n let divid = d3_select(frame).attr('id'),\n player = new BasePainter(divid);\n\n if (item._childs && !asleaf)\n for (let n = 0; n < item._childs.length; ++n) {\n let leaf = item._childs[n];\n if (leaf && leaf._kind && (leaf._kind.indexOf('ROOT.TLeaf') == 0) && (leaf_cnt < 2)) {\n if (leaf_cnt++ > 0) expr += ':';\n expr += leaf._name;\n }\n }\n\n createTreePlayer(player);\n player.configureOnline(itemname, url, askey, root_version, expr);\n player.showPlayer();\n\n return player;\n}\n\n/** @summary function used with THttpServer when tree is not yet loaded\n * @private */\nfunction drawTreePlayerKey(hpainter, itemname) {\n return drawTreePlayer(hpainter, itemname, true);\n}\n\n/** @summary function used with THttpServer when tree is not yet loaded\n * @private */\nfunction drawLeafPlayer(hpainter, itemname) {\n return drawTreePlayer(hpainter, itemname, false, true);\n}\n\n/** @summary function called from draw()\n * @desc just envelope for real TTree::Draw method which do the main job\n * Can be also used for the branch and leaf object\n * @private */\nasync function drawTree(dom, obj, opt) {\n\n let tree = obj, args = opt;\n\n if (obj._typename == clTBranchFunc) {\n // fictional object, created only in browser\n args = { expr: `.${obj.func}()`, branch: obj.branch };\n if (opt && opt.indexOf('dump') == 0)\n args.expr += '>>' + opt;\n else if (opt)\n args.expr += opt;\n tree = obj.branch.$tree;\n } else if (obj.$branch) {\n // this is drawing of the single leaf from the branch\n args = { expr: `.${obj.fName}${opt || ''}`, branch: obj.$branch };\n if ((args.branch.fType === kClonesNode) || (args.branch.fType === kSTLNode)) {\n // special case of size\n args.expr = opt;\n args.direct_branch = true;\n }\n\n tree = obj.$branch.$tree;\n } else if (obj.$tree) {\n // this is drawing of the branch\n\n // if generic object tried to be drawn without specifying any options, it will be just dump\n if (!opt && obj.fStreamerType && (obj.fStreamerType !== kTString) &&\n (obj.fStreamerType >= kObject) && (obj.fStreamerType <= kAnyP)) opt = 'dump';\n\n args = { expr: opt, branch: obj };\n tree = obj.$tree;\n } else {\n if (!args) args = 'player';\n if (isStr(args)) args = { expr: args };\n }\n\n if (!tree)\n throw Error('No TTree object available for TTree::Draw');\n\n if (isStr(args.expr)) {\n let p = args.expr.indexOf('player');\n if (p == 0) {\n args.player = true;\n args.expr = args.expr.slice(6);\n if (args.expr[0] == ':') args.expr = args.expr.slice(1);\n } else if ((p >= 0) && (p == args.expr.length-6)) {\n args.player = true;\n args.expr = args.expr.slice(0, p);\n if ((p > 0) && (args.expr[p-1] == ';')) args.expr = args.expr.slice(0, p-1);\n }\n }\n\n let painter;\n\n if (args.player) {\n painter = new ObjectPainter(dom, obj, opt);\n createTreePlayer(painter);\n painter.configureTree(tree);\n painter.showPlayer(args);\n args.drawid = painter.drawid;\n } else {\n args.drawid = dom;\n }\n\n // use in result handling same function as for progress handling\n\n args.progress = treeDrawProgress.bind(args);\n\n let pr;\n if (args.expr === 'testio') {\n args.testio = true;\n args.showProgress = showProgress;\n pr = treeIOTest(tree, args);\n } else if (args.expr || args.branch) {\n pr = treeDraw(tree, args);\n } else\n return painter;\n\n return pr.then(res => args.progress(res, true));\n}\n\nexport { drawTree, drawTreePlayer, drawTreePlayerKey, drawLeafPlayer };\n"],"x_google_ignoreList":[0]} \ No newline at end of file diff --git a/docs/60.cc479afafde89289.js b/docs/60.cc479afafde89289.js new file mode 100644 index 000000000..26f5ff771 --- /dev/null +++ b/docs/60.cc479afafde89289.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[60],{7060:(y,o,s)=>{s.r(o),s.d(o,{drawPolyLine3D:()=>d,drawPolyMarker3D:()=>P});var u=s(4788),i=s(9542),p=s(1968),h=s(9665),D=s(7822);function f(t,r){let a=t.getFramePainter();if(!a?.mode3d||!r)return null;if(a?.toplevel)return a;let e=t.getMainPainter();return e?(0,i.isFunc)(e.drawExtras)?e.drawExtras(r):null:(0,h.drawDummy3DGeom)(t)}function P(){return l.apply(this,arguments)}function l(){return(l=(0,u.Z)(function*(){let r=f(this,this.getObject());return(0,i.isObject)(r)&&r.grx&&r.gry&&r.grz?(this.$fp=r,D.Y.bind(this)()):r})).apply(this,arguments)}function d(){return _.apply(this,arguments)}function _(){return(_=(0,u.Z)(function*(){let t=this.getObject(),r=f(this,t);if(!((0,i.isObject)(r)&&r.grx&&r.gry&&r.grz))return r;let a=3*t.fN,e=t.fP,g=[];for(let n=3;n{S.r(d),S.d(d,{drawTF2:()=>L});var x=S(1773),O=S(5759),C=S(1827),T=S(2454),y=S(5611);function P(e,a){let f=e.fSave.length,t=!0;f>6&&f!==(e.fSave[f-2]+1)*(e.fSave[f-1]+1)+6&&(f=0),f>6&&e.fXmin.99999&&(t=!1);let i=Math.max(e.fNpx,2),r=Math.max(e.fNpy,2),m=!1,s=!1,_=(e.fXmax-e.fXmin)/(t?i:i-1),v=(e.fYmax-e.fYmin)/(t?r:r-1),X=t?.5:0,n=f>6&&x.settings.PreferSavedPoints;if(!n){e.evalPar||(0,C.proivdeEvalPar)(e);for(let M=0;M6&&(n=!0)}if(!n&&!a&&(a=(0,x.createHistogram)("TH2F",i,r)),!m&&s&&(a.fXaxis.fXmin=e.fXmin-(t?0:_/2),a.fXaxis.fXmax=e.fXmax+(t?0:_/2),a.fYaxis.fXmin=e.fYmin-(t?0:v/2),a.fYaxis.fXmax=e.fYmax+(t?0:v/2)),n){i=Math.round(e.fSave[f-2]),r=Math.round(e.fSave[f-1]),_=(e.fSave[f-5]-e.fSave[f-6])/i,v=(e.fSave[f-3]-e.fSave[f-4])/r,a||(a=(0,x.createHistogram)("TH2F",i+1,r+1)),a.fXaxis.fXmin=e.fSave[f-6]-_/2,a.fXaxis.fXmax=e.fSave[f-5]+_/2,a.fYaxis.fXmin=e.fSave[f-4]-v/2,a.fYaxis.fXmax=e.fSave[f-3]+v/2;for(let M=0,l=0;l<=r;++l)for(let o=0;o<=i;++o)a.setBinContent(a.getBin(o+1,l+1),e.fSave[M++])}a.fName="Func",a.fTitle=e.fTitle,a.fMinimum=e.fMinimum,a.fMaximum=e.fMaximum,a.fLineColor=e.fLineColor,a.fLineStyle=e.fLineStyle,a.fLineWidth=e.fLineWidth,a.fFillColor=e.fFillColor,a.fFillStyle=e.fFillStyle,a.fMarkerColor=e.fMarkerColor,a.fMarkerStyle=e.fMarkerStyle,a.fMarkerSize=e.fMarkerSize;const A=(0,x.BIT)(9);return a.fBits|=A,a}function L(e,a,f){let t=P(a);if(!t)return;let i=new y.pc(f);return("SAMECOLORZ"==(f=i.empty()?"cont3":"SAME"===i.opt?"cont2 same":i.opt)||"SAMECOLOR"==f||"SAMECOLZ"==f)&&(f="SAMECOL"),0==f.indexOf("SAME")&&((0,T.SO)(e)||(f="A_ADJUST_FRAME_"+f.slice(4))),O.TH2Painter.draw(e,t,f).then(r=>(r.tf2_typename=a._typename,r.updateObject=function(m){return!(!m||this.tf2_typename!=m._typename||(delete m.evalPar,P(m,this.getHisto()),0))},r))}}}]); -//# sourceMappingURL=212.e5372e25e1379a18.js.map \ No newline at end of file +"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[601],{3601:(B,d,S)=>{S.r(d),S.d(d,{drawTF2:()=>L});var x=S(9542),O=S(8189),C=S(9428),T=S(6458),y=S(3675);function P(e,a){let f=e.fSave.length,t=!0;f>6&&f!==(e.fSave[f-2]+1)*(e.fSave[f-1]+1)+6&&(f=0),f>6&&e.fXmin.99999&&(t=!1);let i=Math.max(e.fNpx,2),r=Math.max(e.fNpy,2),m=!1,s=!1,_=(e.fXmax-e.fXmin)/(t?i:i-1),v=(e.fYmax-e.fYmin)/(t?r:r-1),X=t?.5:0,n=f>6&&x.settings.PreferSavedPoints;if(!n){e.evalPar||(0,C.proivdeEvalPar)(e);for(let M=0;M6&&(n=!0)}if(!n&&!a&&(a=(0,x.createHistogram)("TH2F",i,r)),!m&&s&&(a.fXaxis.fXmin=e.fXmin-(t?0:_/2),a.fXaxis.fXmax=e.fXmax+(t?0:_/2),a.fYaxis.fXmin=e.fYmin-(t?0:v/2),a.fYaxis.fXmax=e.fYmax+(t?0:v/2)),n){i=Math.round(e.fSave[f-2]),r=Math.round(e.fSave[f-1]),_=(e.fSave[f-5]-e.fSave[f-6])/i,v=(e.fSave[f-3]-e.fSave[f-4])/r,a||(a=(0,x.createHistogram)("TH2F",i+1,r+1)),a.fXaxis.fXmin=e.fSave[f-6]-_/2,a.fXaxis.fXmax=e.fSave[f-5]+_/2,a.fYaxis.fXmin=e.fSave[f-4]-v/2,a.fYaxis.fXmax=e.fSave[f-3]+v/2;for(let M=0,l=0;l<=r;++l)for(let o=0;o<=i;++o)a.setBinContent(a.getBin(o+1,l+1),e.fSave[M++])}a.fName="Func",a.fTitle=e.fTitle,a.fMinimum=e.fMinimum,a.fMaximum=e.fMaximum,a.fLineColor=e.fLineColor,a.fLineStyle=e.fLineStyle,a.fLineWidth=e.fLineWidth,a.fFillColor=e.fFillColor,a.fFillStyle=e.fFillStyle,a.fMarkerColor=e.fMarkerColor,a.fMarkerStyle=e.fMarkerStyle,a.fMarkerSize=e.fMarkerSize;const A=(0,x.BIT)(9);return a.fBits|=A,a}function L(e,a,f){let t=P(a);if(!t)return;let i=new y.pc(f);return("SAMECOLORZ"==(f=i.empty()?"cont3":"SAME"===i.opt?"cont2 same":i.opt)||"SAMECOLOR"==f||"SAMECOLZ"==f)&&(f="SAMECOL"),0==f.indexOf("SAME")&&((0,T.SO)(e)||(f="A_ADJUST_FRAME_"+f.slice(4))),O.TH2Painter.draw(e,t,f).then(r=>(r.tf2_typename=a._typename,r.updateObject=function(m){return!(!m||this.tf2_typename!=m._typename||(delete m.evalPar,P(m,this.getHisto()),0))},r))}}}]); +//# sourceMappingURL=601.bdb253779e07488d.js.map \ No newline at end of file diff --git a/docs/212.e5372e25e1379a18.js.map b/docs/601.bdb253779e07488d.js.map similarity index 99% rename from docs/212.e5372e25e1379a18.js.map rename to docs/601.bdb253779e07488d.js.map index 80df8e3d4..dc05c32d6 100644 --- a/docs/212.e5372e25e1379a18.js.map +++ b/docs/601.bdb253779e07488d.js.map @@ -1 +1 @@ -{"version":3,"file":"212.e5372e25e1379a18.js","mappings":"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","names":["createTF2Histogram","func","hist","nsave","fSave","length","use_middle","fXmin","fXmax","npx","Math","max","fNpx","npy","fNpy","iserr","isany","dx","dy","fYmax","fYmin","extra","use_saved_points","settings","evalPar","proivdeEvalPar","j","i","x","y","z","Number","isFinite","createHistogram","setBinContent","getBin","fXaxis","fYaxis","round","k","fName","fTitle","fMinimum","fMaximum","fLineColor","fLineStyle","fLineWidth","fFillColor","fFillStyle","fMarkerColor","fMarkerStyle","fMarkerSize","kNoStats","BIT","fBits","drawTF2","dom","opt","d","DrawOptions","empty","indexOf","getElementMainPainter","slice","TH2Painter","then","hpainter","tf2_typename","_typename","updateObject","obj","this","getHisto"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/draw/TF2.mjs"],"sourcesContent":["import { createHistogram, BIT, settings } from '../core.mjs';\nimport { TH2Painter } from '../hist/TH2Painter.mjs';\nimport { proivdeEvalPar } from '../hist/TF1Painter.mjs';\nimport { getElementMainPainter } from '../base/ObjectPainter.mjs';\nimport { DrawOptions } from '../base/BasePainter.mjs';\n\n\n/** @summary Create histogram for TF2 drawing\n * @private */\nfunction createTF2Histogram(func, hist = undefined) {\n let nsave = func.fSave.length, use_middle = true;\n if ((nsave > 6) && (nsave !== (func.fSave[nsave-2]+1)*(func.fSave[nsave-1]+1) + 6)) nsave = 0;\n\n // check if exact min/max range is used or created histogram has to be extended\n if ((nsave > 6) && (func.fXmin < func.fXmax) && (func.fSave[nsave-6] < func.fSave[nsave-5]) &&\n ((func.fSave[nsave-5] - func.fSave[nsave-6]) / (func.fXmax - func.fXmin) > 0.99999)) use_middle = false;\n\n let npx = Math.max(func.fNpx, 2),\n npy = Math.max(func.fNpy, 2),\n iserr = false, isany = false,\n dx = (func.fXmax - func.fXmin) / (use_middle ? npx : (npx-1)),\n dy = (func.fYmax - func.fYmin) / (use_middle ? npy : (npy-1)),\n extra = use_middle ? 0.5 : 0,\n use_saved_points = (nsave > 6) && settings.PreferSavedPoints;\n\n if (!use_saved_points) {\n if (!func.evalPar)\n proivdeEvalPar(func);\n\n for (let j = 0; j < npy; ++j)\n for (let i = 0; (i < npx) && !iserr; ++i) {\n let x = func.fXmin + (i + extra) * dx,\n y = func.fYmin + (j + extra) * dy,\n z = 0;\n\n try {\n z = func.evalPar(x, y);\n } catch {\n iserr = true;\n }\n\n if (!iserr && Number.isFinite(z)) {\n if (!hist) hist = createHistogram('TH2F', npx, npy);\n isany = true;\n hist.setBinContent(hist.getBin(i+1,j+1), z);\n }\n }\n\n if ((iserr || !isany) && (nsave > 6))\n use_saved_points = true;\n }\n\n if (!use_saved_points && !hist)\n hist = createHistogram('TH2F', npx, npy);\n\n if (!iserr && isany) {\n hist.fXaxis.fXmin = func.fXmin - (use_middle ? 0 : dx/2);\n hist.fXaxis.fXmax = func.fXmax + (use_middle ? 0 : dx/2);\n\n hist.fYaxis.fXmin = func.fYmin - (use_middle ? 0 : dy/2);\n hist.fYaxis.fXmax = func.fYmax + (use_middle ? 0 : dy/2);\n }\n\n if (use_saved_points) {\n npx = Math.round(func.fSave[nsave-2]);\n npy = Math.round(func.fSave[nsave-1]);\n dx = (func.fSave[nsave-5] - func.fSave[nsave-6]) / npx;\n dy = (func.fSave[nsave-3] - func.fSave[nsave-4]) / npy;\n\n if (!hist) hist = createHistogram('TH2F', npx+1, npy+1);\n\n hist.fXaxis.fXmin = func.fSave[nsave-6] - dx/2;\n hist.fXaxis.fXmax = func.fSave[nsave-5] + dx/2;\n\n hist.fYaxis.fXmin = func.fSave[nsave-4] - dy/2;\n hist.fYaxis.fXmax = func.fSave[nsave-3] + dy/2;\n\n for (let k = 0, j = 0; j <= npy; ++j)\n for (let i = 0; i <= npx; ++i)\n hist.setBinContent(hist.getBin(i+1,j+1), func.fSave[k++]);\n }\n\n hist.fName = 'Func';\n hist.fTitle = func.fTitle;\n hist.fMinimum = func.fMinimum;\n hist.fMaximum = func.fMaximum;\n //fHistogram->SetContour(fContour.fN, levels);\n hist.fLineColor = func.fLineColor;\n hist.fLineStyle = func.fLineStyle;\n hist.fLineWidth = func.fLineWidth;\n hist.fFillColor = func.fFillColor;\n hist.fFillStyle = func.fFillStyle;\n hist.fMarkerColor = func.fMarkerColor;\n hist.fMarkerStyle = func.fMarkerStyle;\n hist.fMarkerSize = func.fMarkerSize;\n const kNoStats = BIT(9);\n hist.fBits |= kNoStats;\n\n return hist;\n}\n\n/** @summary draw TF2 object\n * @desc TF2 always drawn via temporary TH2 object,\n * therefore there is no special painter class\n * @private */\nfunction drawTF2(dom, func, opt) {\n\n let hist = createTF2Histogram(func);\n if (!hist) return;\n\n let d = new DrawOptions(opt);\n\n if (d.empty())\n opt = 'cont3';\n else if (d.opt === 'SAME')\n opt = 'cont2 same';\n else\n opt = d.opt;\n\n // workaround for old waves.C\n if (opt == 'SAMECOLORZ' || opt == 'SAMECOLOR' || opt == 'SAMECOLZ') opt = 'SAMECOL';\n\n if (opt.indexOf('SAME') == 0)\n if (!getElementMainPainter(dom))\n opt = 'A_ADJUST_FRAME_' + opt.slice(4);\n\n return TH2Painter.draw(dom, hist, opt).then(hpainter => {\n\n hpainter.tf2_typename = func._typename;\n\n hpainter.updateObject = function(obj /*, opt*/) {\n if (!obj || (this.tf2_typename != obj._typename)) return false;\n delete obj.evalPar;\n createTF2Histogram(obj, this.getHisto());\n return true;\n };\n\n return hpainter;\n });\n}\n\nexport { drawTF2 };\n"],"x_google_ignoreList":[0]} \ No newline at end of file +{"version":3,"file":"601.bdb253779e07488d.js","mappings":"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","names":["createTF2Histogram","func","hist","nsave","fSave","length","use_middle","fXmin","fXmax","npx","Math","max","fNpx","npy","fNpy","iserr","isany","dx","dy","fYmax","fYmin","extra","use_saved_points","settings","evalPar","proivdeEvalPar","j","i","x","y","z","Number","isFinite","createHistogram","setBinContent","getBin","fXaxis","fYaxis","round","k","fName","fTitle","fMinimum","fMaximum","fLineColor","fLineStyle","fLineWidth","fFillColor","fFillStyle","fMarkerColor","fMarkerStyle","fMarkerSize","kNoStats","BIT","fBits","drawTF2","dom","opt","d","DrawOptions","empty","indexOf","getElementMainPainter","slice","TH2Painter","then","hpainter","tf2_typename","_typename","updateObject","obj","this","getHisto"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/draw/TF2.mjs"],"sourcesContent":["import { createHistogram, BIT, settings } from '../core.mjs';\nimport { TH2Painter } from '../hist/TH2Painter.mjs';\nimport { proivdeEvalPar } from '../hist/TF1Painter.mjs';\nimport { getElementMainPainter } from '../base/ObjectPainter.mjs';\nimport { DrawOptions } from '../base/BasePainter.mjs';\n\n\n/** @summary Create histogram for TF2 drawing\n * @private */\nfunction createTF2Histogram(func, hist = undefined) {\n let nsave = func.fSave.length, use_middle = true;\n if ((nsave > 6) && (nsave !== (func.fSave[nsave-2]+1)*(func.fSave[nsave-1]+1) + 6)) nsave = 0;\n\n // check if exact min/max range is used or created histogram has to be extended\n if ((nsave > 6) && (func.fXmin < func.fXmax) && (func.fSave[nsave-6] < func.fSave[nsave-5]) &&\n ((func.fSave[nsave-5] - func.fSave[nsave-6]) / (func.fXmax - func.fXmin) > 0.99999)) use_middle = false;\n\n let npx = Math.max(func.fNpx, 2),\n npy = Math.max(func.fNpy, 2),\n iserr = false, isany = false,\n dx = (func.fXmax - func.fXmin) / (use_middle ? npx : (npx-1)),\n dy = (func.fYmax - func.fYmin) / (use_middle ? npy : (npy-1)),\n extra = use_middle ? 0.5 : 0,\n use_saved_points = (nsave > 6) && settings.PreferSavedPoints;\n\n if (!use_saved_points) {\n if (!func.evalPar)\n proivdeEvalPar(func);\n\n for (let j = 0; j < npy; ++j)\n for (let i = 0; (i < npx) && !iserr; ++i) {\n let x = func.fXmin + (i + extra) * dx,\n y = func.fYmin + (j + extra) * dy,\n z = 0;\n\n try {\n z = func.evalPar(x, y);\n } catch {\n iserr = true;\n }\n\n if (!iserr && Number.isFinite(z)) {\n if (!hist) hist = createHistogram('TH2F', npx, npy);\n isany = true;\n hist.setBinContent(hist.getBin(i+1,j+1), z);\n }\n }\n\n if ((iserr || !isany) && (nsave > 6))\n use_saved_points = true;\n }\n\n if (!use_saved_points && !hist)\n hist = createHistogram('TH2F', npx, npy);\n\n if (!iserr && isany) {\n hist.fXaxis.fXmin = func.fXmin - (use_middle ? 0 : dx/2);\n hist.fXaxis.fXmax = func.fXmax + (use_middle ? 0 : dx/2);\n\n hist.fYaxis.fXmin = func.fYmin - (use_middle ? 0 : dy/2);\n hist.fYaxis.fXmax = func.fYmax + (use_middle ? 0 : dy/2);\n }\n\n if (use_saved_points) {\n npx = Math.round(func.fSave[nsave-2]);\n npy = Math.round(func.fSave[nsave-1]);\n dx = (func.fSave[nsave-5] - func.fSave[nsave-6]) / npx;\n dy = (func.fSave[nsave-3] - func.fSave[nsave-4]) / npy;\n\n if (!hist) hist = createHistogram('TH2F', npx+1, npy+1);\n\n hist.fXaxis.fXmin = func.fSave[nsave-6] - dx/2;\n hist.fXaxis.fXmax = func.fSave[nsave-5] + dx/2;\n\n hist.fYaxis.fXmin = func.fSave[nsave-4] - dy/2;\n hist.fYaxis.fXmax = func.fSave[nsave-3] + dy/2;\n\n for (let k = 0, j = 0; j <= npy; ++j)\n for (let i = 0; i <= npx; ++i)\n hist.setBinContent(hist.getBin(i+1,j+1), func.fSave[k++]);\n }\n\n hist.fName = 'Func';\n hist.fTitle = func.fTitle;\n hist.fMinimum = func.fMinimum;\n hist.fMaximum = func.fMaximum;\n //fHistogram->SetContour(fContour.fN, levels);\n hist.fLineColor = func.fLineColor;\n hist.fLineStyle = func.fLineStyle;\n hist.fLineWidth = func.fLineWidth;\n hist.fFillColor = func.fFillColor;\n hist.fFillStyle = func.fFillStyle;\n hist.fMarkerColor = func.fMarkerColor;\n hist.fMarkerStyle = func.fMarkerStyle;\n hist.fMarkerSize = func.fMarkerSize;\n const kNoStats = BIT(9);\n hist.fBits |= kNoStats;\n\n return hist;\n}\n\n/** @summary draw TF2 object\n * @desc TF2 always drawn via temporary TH2 object,\n * therefore there is no special painter class\n * @private */\nfunction drawTF2(dom, func, opt) {\n\n let hist = createTF2Histogram(func);\n if (!hist) return;\n\n let d = new DrawOptions(opt);\n\n if (d.empty())\n opt = 'cont3';\n else if (d.opt === 'SAME')\n opt = 'cont2 same';\n else\n opt = d.opt;\n\n // workaround for old waves.C\n if (opt == 'SAMECOLORZ' || opt == 'SAMECOLOR' || opt == 'SAMECOLZ') opt = 'SAMECOL';\n\n if (opt.indexOf('SAME') == 0)\n if (!getElementMainPainter(dom))\n opt = 'A_ADJUST_FRAME_' + opt.slice(4);\n\n return TH2Painter.draw(dom, hist, opt).then(hpainter => {\n\n hpainter.tf2_typename = func._typename;\n\n hpainter.updateObject = function(obj /*, opt*/) {\n if (!obj || (this.tf2_typename != obj._typename)) return false;\n delete obj.evalPar;\n createTF2Histogram(obj, this.getHisto());\n return true;\n };\n\n return hpainter;\n });\n}\n\nexport { drawTF2 };\n"],"x_google_ignoreList":[0]} \ No newline at end of file diff --git a/docs/18.53db17338b338e15.js b/docs/61.dbe75c5a8333bdf7.js similarity index 93% rename from docs/18.53db17338b338e15.js rename to docs/61.dbe75c5a8333bdf7.js index 86eaadece..11e8be588 100644 --- a/docs/18.53db17338b338e15.js +++ b/docs/61.dbe75c5a8333bdf7.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[18],{2018:(ct,lt,T)=>{T.r(lt),T.d(lt,{RH1Painter:()=>it});var z=T(5368),F=T(1773),ot=T(2912),Y=T(5611),xt=T(8597),gt=T(6717);class et extends xt.n{constructor(t,e){super(t,e),this.wheel_zoomy=!1}scanContent(t){let e=this.getHisto();if(!e)return;!this.nbinsx&&t&&(t=!1),t||this.extractAxesProperties(1);let r=0,u=0,i=0,a=0;if(this.isDisplayItem())r=e.fContMin,u=e.fContMinPos,i=e.fContMax,a=i;else{let h=this.getSelectIndex("x","left"),l=this.getSelectIndex("x","right");if(t&&h===this.scan_xleft&&l===this.scan_xright)return;this.scan_xleft=h,this.scan_xright=l;let n,p,c=!0;for(let o=0;o=l)&&(n>0&&(0==u||n=i)0==r?(this.ymin=0,this.ymax=1):r<0?(this.ymin=2*r,this.ymax=0):(this.ymin=0,this.ymax=2*r);else{let h=.05*(i-r);this.ymin=r-h,this.ymin<0&&r>=0&&(this.ymin=0),this.ymax=i+h}}countStat(t){let p,e=this.getHisto(),r=this.getAxis("x"),u=this.getSelectIndex("x","left"),i=this.getSelectIndex("x","right"),a=0,h=0,l=0,o=0,s=0,y=null,d=null,x=(this.getFramePainter(),{name:"histo",meanx:0,meany:0,rmsx:0,rmsy:0,integral:0,entries:this.stat_entries,xmax:0,wmax:0});for(p=u;pd)&&(y=o,d=s),a+=s,h+=s*o,l+=s*o**2);return x.integral=a,Math.abs(a)>1e-300&&(x.meanx=h/a,x.meany=0/a,x.rmsx=Math.sqrt(Math.abs(l/a-x.meanx**2)),x.rmsy=Math.sqrt(Math.abs(0/a-x.meany**2))),null!==y&&(x.xmax=y,x.wmax=d),x}fillStatistic(t,e){let r=this.countStat(),u=e%10,i=Math.floor(e/10)%10,a=Math.floor(e/100)%10,h=Math.floor(e/1e3)%10,l=Math.floor(e/1e4)%10,c=Math.floor(e/1e5)%10,n=Math.floor(e/1e6)%10,p=Math.floor(e/1e7)%10,o=Math.floor(e/1e8)%10;return t.clearStat(),u>0&&t.addText(r.name),i>0&&t.addText("Entries = "+t.format(r.entries,"entries")),a>0&&t.addText("Mean = "+t.format(r.meanx)),h>0&&t.addText("Std Dev = "+t.format(r.rmsx)),l>0&&t.addText("Underflow = "+t.format(histo.getBinContent(0),"entries")),c>0&&t.addText("Overflow = "+t.format(histo.getBinContent(this.nbinsx+1),"entries")),n>0&&t.addText("Integral = "+t.format(r.integral,"entries")),p>0&&t.addText("Skew = "),o>0&&t.addText("Kurt = "),!0}drawBars(t,e,r,u){var i=this;return(0,z.Z)(function*(){i.createG(!0);let o,s,y,d,w,x,_,f,g,a=t.i1,h=t.i2,l=t.stepi,c=i.getFramePainter(),n=i.getHisto(),p=i.getAxis("x"),M="",b="",v="";for(f=c.swap_xy?0:u,Number.isFinite(i.options.BaseLine)&&i.options.BaseLine>=e.scale_ymin&&(f=Math.round(e.gry(i.options.BaseLine))),o=a;o0&&(w=d+g,g=Math.round(g/10),c.swap_xy?(b+=`M${f},${d}h${_-f}v${g}h${f-_}z`,v+=`M${f},${w}h${_-f}v${-g}h${f-_}z`):(b+=`M${d},${_}h${g}v${f-_}h${-g}z`,v+=`M${w},${_}h${-g}v${f-_}h${g}z`))));return i.fillatt.empty()&&i.fillatt.setSolidColor("blue"),M&&i.draw_g.append("svg:path").attr("d",M).call(i.fillatt.func),b&&i.draw_g.append("svg:path").attr("d",b).call(i.fillatt.func).style("fill",(0,ot.B8)(i.fillatt.color).brighter(.5).formatHex()),v&&i.draw_g.append("svg:path").attr("d",v).call(i.fillatt.func).style("fill",(0,ot.B8)(i.fillatt.color).darker(.5).formatHex()),!0})()}drawFilledErrors(t,e){var r=this;return(0,z.Z)(function*(){r.createG(!0);let c,n,p,o,s,y,d,u=t.i1,i=t.i2,a=t.stepi,h=r.getHisto(),l=r.getAxis("x"),w=[],x=[];for(c=u;c1&&(O=!0),2===a.ErrorKind?i.fillatt.empty()?O=!0:J="":a.Error&&(W="",V=p?"":null),X&&(I=""),O&&(i.createv7AttMarker(),i.markeratt.size>0?(Q="",i.markeratt.resetPos()):O=!1),N){if(P=i.v7EvalFont("text",{size:20,color:"black",align:22}),!P.angle&&!a.TextKind){let D=r/(l-h+1);D<3*P.size&&(P.setAngle(270),P.setSize(Math.round(.7*D)))}i.startTextDrawing(P,"font")}let ft=l-h>3*r;if(1===a.ErrorKind){let D=i.lineatt.width+F.gStyle.fEndErrorSize;rt=`m0,${D}v${-2*D}m0,${D}`,nt=`m${D},0h${-2*D}m${D},0`,q=Math.floor((i.lineatt.width-1)/2)}let U=R||O;(U||N||X)&&(ft=!0);let tt=D=>{if(k=n.getBinContent(D+1),!L||0!==k){if(H=Math.round(e.grx(o.GetBinCoord(D))),K=Math.round(e.grx(o.GetBinCoord(D+c))),Z=Math.round((H+K)/2),S=Math.round(e.gry(k)),G=j=20,R&&(at=n.getBinError(D+1),G=Math.round(S-e.gry(k+at)),j=Math.round(e.gry(k-at)-S)),N&&0!==k){let A=k===Math.round(k)?k.toString():(0,Y.Ee)(k,F.gStyle.fPaintTextFormat);i.drawText(P.angle?{align:12,x:Z,y:Math.round(S-2-P.size/5),text:A,latex:0}:{x:Math.round(H+.1*(K-H)),y:Math.round(S-2-P.size),width:Math.round(.8*(K-H)),height:P.size,text:A,latex:0})}if(X&&null!==I&&(I+=(0===I.length?"M":"L")+Z+","+S),U&&S>=-G&&S<=u+j&&(null!==J&&(J+=`M${H},${S-G}h${K-H}v${G+j+1}h${H-K}z`),null!==Q&&(Q+=i.markeratt.create(Z,S)),null!==W)){let A=5;if(i.options.errorX>0){A=Math.round((K-H)*i.options.errorX);let ut=Z-A;W+=`M${ut+q},${S}${rt}h${Z+A-ut-2*q}${rt}`}W+=`M${Z},${S-G+q}${nt}v${G+j-2*q}${nt}`,null!==V&&(V+=`M${Z-A},${S-G}h${2*A}v${G+j}h${-2*A}z`)}}};for(B=h;B<=l;B+=c)_=o.GetBinCoord(B),!(e.logx&&_<=0)&&(f=Math.round(e.grx(_)),y=B>l-c,y&&hv&&(m=B),b=Math.min(b,M),v=Math.max(v,M),x=M):(M!==x||y)&&(f!==w&&(s+="h"+(f-w)),M!==x&&(s+="v"+(M-x)),x=M,w=f));let st="",dt=!(0,F.isBatchMode)()&&i.fillatt.empty()&&a.Hist&&F.settings.Tooltip&&!U&&!X;if(!i.fillatt.empty()||dt){let D=u+3;if(dt){let A=Math.round(e.gry(0));A<=0?D=-3:Av+.5?r.swap_xy?f=m:g=m:(f++,g--)}if(l=g=f,n=M(l),r.swap_xy){for(;f>x&&M(f-1)n-2;)++g}else{for(;f>x&&M(f-1)>n-2;)--f;for(;g<_&&M(g+1)i/10&&(l=Math.round(f+(g-f)/i*C)),n=M(l)}if(n=Math.round(n),o=Math.round(M(l+1)),this.options.Bar){let m=o-n;n+=Math.round(this.options.BarOffset*m),o=n+Math.round(this.options.BarWidth*m)}if(n>o&&([n,o]=[o,n]),p=Math.round((n+o)/2),y=s=d=b(l),this.options.Bar)c=!0,w=0,s=Math.round(r.gry(!1!==this.options.BaseLine&&this.options.BaseLine>r.scale_ymin?this.options.BaseLine:r.scale_ymin)),s>d&&([s,d]=[d,s]),!t.touch&&1===t.nproc&&(Cd)&&(l=null);else if(this.options.Error||this.options.Mark){c=!0;let m=3;if(this.markeratt&&(m=Math.max(m,this.markeratt.getFullSize())),this.options.Error){let $=a.getBinContent(l+1),L=a.getBinError(l+1);s=Math.round(r.gry($+L)),d=Math.round(r.gry($-L));let R=(o-n)*this.options.errorX;n=Math.round(p-R),o=Math.round(p+R)}o-n<2*m&&(n=p-m,o=p+m),s=Math.min(s,y-m),d=Math.max(d,y+m),!t.touch&&1===t.nproc&&(Cd)&&(l=null)}else this.options.Line?c=!1:(c=1===t.nproc&&_-xd)&&!t.touch&&(l=null)));null!==l&&(l===x&&n>v+w||l===_-1&&oo+w||!this.options.Zero&&0===a.getBinContent(l+1))&&(l=null);let E=this.draw_g.select(".tooltip_bin");if(null===l||d<=0||s>=i)return E.remove(),null;let B={name:"histo",title:a.fTitle,x:p,y,exact:!0,color1:this.lineatt?this.lineatt.color:"green",color2:this.fillatt?this.fillatt.getFillColorAlt("blue"):"blue",lines:this.getBinTooltips(l)};if(t.disabled)E.remove(),B.changed=!0;else if(c)E.empty()&&(E=this.draw_g.append("svg:rect").attr("class","tooltip_bin h1bin").style("pointer-events","none")),B.changed=E.property("current_bin")!==l,B.changed&&E.attr("x",e.swap_xy?s:n).attr("width",e.swap_xy?d-s:o-n).attr("y",e.swap_xy?n:s).attr("height",e.swap_xy?o-n:d-s).style("opacity","0.3").property("current_bin",l),B.exact=Math.abs(y-C)<=5||C>=s&&C<=d,B.menu=B.exact,B.menu_dist=Math.sqrt((p-v)**2+(y-C)**2);else{let m=this.lineatt.width+3;E.empty()&&(E=this.draw_g.append("svg:circle").attr("class","tooltip_bin").style("pointer-events","none").attr("r",m).call(this.lineatt.func).call(this.fillatt.func)),B.exact=Math.abs(p-t.x)<=m&&Math.abs(y-t.y)<=m,B.menu=B.exact,B.menu_dist=Math.sqrt((p-t.x)**2+(y-t.y)**2),B.changed=E.property("current_bin")!==l,B.changed&&E.attr("cx",p).attr("cy",y).property("current_bin",l)}return B.changed&&(B.user_info={obj:a,name:"histo",bin:l,cont:a.getBinContent(l+1),grx:p,gry:y}),B}fillHistContextMenu(t){t.add("Auto zoom-in",()=>this.autoZoom());let e=this.getSupportedDrawOptions();t.addDrawMenu("Draw with",e,r=>{if("inspect"===r)return this.showInspector();this.decodeOptions(r),this.options.need_fillcol&&this.fillatt&&this.fillatt.empty()&&this.fillatt.change(5,1001),this.interactiveRedraw("pad","drawopt")})}autoZoom(){let t=this.getSelectIndex("x","left",-1),e=this.getSelectIndex("x","right",1),r=e-t,u=this.getHisto(),i=this.getAxis("x");if(0==r)return;let a=u.getBinContent(t+1);for(let h=t;h0)){for(;t2&&e1||"y"==t&&Math.abs(r-e)>1e-6*Math.abs(this.ymax-this.ymin)}callDrawFunc(t){var e=this;return(0,z.Z)(function*(){let r=e.getFramePainter();return r&&r.mode3d!==e.options.Mode3D&&!e.isMainPainter()&&(e.options.Mode3D=r.mode3d),e.options.Mode3D?e.draw3D(t):e.draw2D(t)})()}draw2D(t){var e=this;return(0,z.Z)(function*(){return e.clear3DScene(),e.drawFrameAxes().then(r=>!!r&&e.drawingBins(t)).then(r=>{if(r)return e.draw1DBins().then(()=>e.addInteractivity())}).then(()=>e)})()}draw3D(t){var e=this;return(0,z.Z)(function*(){return console.log("3D drawing is disabled, load ./hist/RH1Painter.mjs"),e.draw2D(t)})()}redraw(t){var e=this;return(0,z.Z)(function*(){return e.callDrawFunc(t)})()}static _draw(t,e){return(0,z.Z)(function*(){return(0,gt.ensureRCanvas)(t).then(()=>{t.setAsMainPainter(),t.options={Hist:!1,Bar:!1,BarStyle:0,Error:!1,ErrorKind:-1,errorX:F.gStyle.fErrorX,Zero:!1,Mark:!1,Line:!1,Fill:!1,Lego:0,Surf:0,Text:!1,TextAngle:0,TextKind:"",AutoColor:0,BarOffset:0,BarWidth:1,BaseLine:!1,Mode3D:!1};let r=new Y.pc(e);r.check("R3D_",!0)&&(t.options.Render3D=F.constants.Render3D.fromString(r.part.toLowerCase()));let u=t.v7EvalAttr("kind","hist"),i=t.v7EvalAttr("sub",0),a=!!t.getMainPainter(),h=t.options;switch(h.Text=t.v7EvalAttr("drawtext",!1),h.BarOffset=t.v7EvalAttr("baroffset",0),h.BarWidth=t.v7EvalAttr("barwidth",1),h.second_x=a&&t.v7EvalAttr("secondx",!1),h.second_y=a&&t.v7EvalAttr("secondy",!1),u){case"bar":h.Bar=!0,h.BarStyle=i;break;case"err":h.Error=!0,h.ErrorKind=i;break;case"p":h.Mark=!0;break;case"l":h.Line=!0;break;case"lego":h.Lego=i>0?10+i:12,h.Mode3D=!0;break;default:h.Hist=!0}return t.scanContent(),t.callDrawFunc()})})()}static draw(t,e,r){return(0,z.Z)(function*(){return et._draw(new et(t,e),r)})()}}var mt=T(757),ht=T(3641);class it extends et{draw3D(t){this.mode3d=!0;let e=this.getFramePainter(),r=this.isMainPainter(),u=1+2*F.gStyle.fHistTopMargin,i=Promise.resolve(this);return"resize"==t?(r&&e.resize3D()&&e.render3D(),i):(this.deleteAttr(),this.scanContent(!0),r&&((0,ht.g_)(e),i=e.create3DScene(this.options.Render3D).then(()=>{e.setAxesRanges(this.getAxis("x"),this.xmin,this.xmax,null,this.ymin,this.ymax,null,0,0),e.set3DOptions(this.options),e.drawXYZ(e.toplevel,mt.C,{use_y_for_z:!0,zmult:u,zoom:F.settings.Zooming,ndim:1,draw:!0,v7:!0})})),e.mode3d?i.then(()=>this.drawingBins(t)).then(()=>{let a=this.getFramePainter();return(0,ht.UR)(this,!0),this.updatePaletteDraw(),a.render3D(),a.addKeysHandler(),this}):i)}static draw(t,e,r){return(0,z.Z)(function*(){return it._draw(new it(t,e),r)})()}}}}]); -//# sourceMappingURL=18.53db17338b338e15.js.map \ No newline at end of file +"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[61],{6061:(ct,lt,T)=>{T.r(lt),T.d(lt,{RH1Painter:()=>it});var z=T(4788),F=T(9542),ot=T(2253),Y=T(3675),xt=T(8172),gt=T(9056);class et extends xt.n{constructor(t,e){super(t,e),this.wheel_zoomy=!1}scanContent(t){let e=this.getHisto();if(!e)return;!this.nbinsx&&t&&(t=!1),t||this.extractAxesProperties(1);let r=0,u=0,i=0,a=0;if(this.isDisplayItem())r=e.fContMin,u=e.fContMinPos,i=e.fContMax,a=i;else{let h=this.getSelectIndex("x","left"),l=this.getSelectIndex("x","right");if(t&&h===this.scan_xleft&&l===this.scan_xright)return;this.scan_xleft=h,this.scan_xright=l;let n,p,c=!0;for(let o=0;o=l)&&(n>0&&(0==u||n=i)0==r?(this.ymin=0,this.ymax=1):r<0?(this.ymin=2*r,this.ymax=0):(this.ymin=0,this.ymax=2*r);else{let h=.05*(i-r);this.ymin=r-h,this.ymin<0&&r>=0&&(this.ymin=0),this.ymax=i+h}}countStat(t){let p,e=this.getHisto(),r=this.getAxis("x"),u=this.getSelectIndex("x","left"),i=this.getSelectIndex("x","right"),a=0,h=0,l=0,o=0,s=0,y=null,d=null,x=(this.getFramePainter(),{name:"histo",meanx:0,meany:0,rmsx:0,rmsy:0,integral:0,entries:this.stat_entries,xmax:0,wmax:0});for(p=u;pd)&&(y=o,d=s),a+=s,h+=s*o,l+=s*o**2);return x.integral=a,Math.abs(a)>1e-300&&(x.meanx=h/a,x.meany=0/a,x.rmsx=Math.sqrt(Math.abs(l/a-x.meanx**2)),x.rmsy=Math.sqrt(Math.abs(0/a-x.meany**2))),null!==y&&(x.xmax=y,x.wmax=d),x}fillStatistic(t,e){let r=this.countStat(),u=e%10,i=Math.floor(e/10)%10,a=Math.floor(e/100)%10,h=Math.floor(e/1e3)%10,l=Math.floor(e/1e4)%10,c=Math.floor(e/1e5)%10,n=Math.floor(e/1e6)%10,p=Math.floor(e/1e7)%10,o=Math.floor(e/1e8)%10;return t.clearStat(),u>0&&t.addText(r.name),i>0&&t.addText("Entries = "+t.format(r.entries,"entries")),a>0&&t.addText("Mean = "+t.format(r.meanx)),h>0&&t.addText("Std Dev = "+t.format(r.rmsx)),l>0&&t.addText("Underflow = "+t.format(histo.getBinContent(0),"entries")),c>0&&t.addText("Overflow = "+t.format(histo.getBinContent(this.nbinsx+1),"entries")),n>0&&t.addText("Integral = "+t.format(r.integral,"entries")),p>0&&t.addText("Skew = "),o>0&&t.addText("Kurt = "),!0}drawBars(t,e,r,u){var i=this;return(0,z.Z)(function*(){i.createG(!0);let o,s,y,d,w,x,_,f,g,a=t.i1,h=t.i2,l=t.stepi,c=i.getFramePainter(),n=i.getHisto(),p=i.getAxis("x"),M="",b="",v="";for(f=c.swap_xy?0:u,Number.isFinite(i.options.BaseLine)&&i.options.BaseLine>=e.scale_ymin&&(f=Math.round(e.gry(i.options.BaseLine))),o=a;o0&&(w=d+g,g=Math.round(g/10),c.swap_xy?(b+=`M${f},${d}h${_-f}v${g}h${f-_}z`,v+=`M${f},${w}h${_-f}v${-g}h${f-_}z`):(b+=`M${d},${_}h${g}v${f-_}h${-g}z`,v+=`M${w},${_}h${-g}v${f-_}h${g}z`))));return i.fillatt.empty()&&i.fillatt.setSolidColor("blue"),M&&i.draw_g.append("svg:path").attr("d",M).call(i.fillatt.func),b&&i.draw_g.append("svg:path").attr("d",b).call(i.fillatt.func).style("fill",(0,ot.B8)(i.fillatt.color).brighter(.5).formatHex()),v&&i.draw_g.append("svg:path").attr("d",v).call(i.fillatt.func).style("fill",(0,ot.B8)(i.fillatt.color).darker(.5).formatHex()),!0})()}drawFilledErrors(t,e){var r=this;return(0,z.Z)(function*(){r.createG(!0);let c,n,p,o,s,y,d,u=t.i1,i=t.i2,a=t.stepi,h=r.getHisto(),l=r.getAxis("x"),w=[],x=[];for(c=u;c1&&(O=!0),2===a.ErrorKind?i.fillatt.empty()?O=!0:J="":a.Error&&(W="",V=p?"":null),X&&(I=""),O&&(i.createv7AttMarker(),i.markeratt.size>0?(Q="",i.markeratt.resetPos()):O=!1),N){if(P=i.v7EvalFont("text",{size:20,color:"black",align:22}),!P.angle&&!a.TextKind){let D=r/(l-h+1);D<3*P.size&&(P.setAngle(270),P.setSize(Math.round(.7*D)))}i.startTextDrawing(P,"font")}let ft=l-h>3*r;if(1===a.ErrorKind){let D=i.lineatt.width+F.gStyle.fEndErrorSize;rt=`m0,${D}v${-2*D}m0,${D}`,nt=`m${D},0h${-2*D}m${D},0`,q=Math.floor((i.lineatt.width-1)/2)}let U=R||O;(U||N||X)&&(ft=!0);let tt=D=>{if(k=n.getBinContent(D+1),!L||0!==k){if(H=Math.round(e.grx(o.GetBinCoord(D))),K=Math.round(e.grx(o.GetBinCoord(D+c))),Z=Math.round((H+K)/2),S=Math.round(e.gry(k)),G=j=20,R&&(at=n.getBinError(D+1),G=Math.round(S-e.gry(k+at)),j=Math.round(e.gry(k-at)-S)),N&&0!==k){let A=k===Math.round(k)?k.toString():(0,Y.Ee)(k,F.gStyle.fPaintTextFormat);i.drawText(P.angle?{align:12,x:Z,y:Math.round(S-2-P.size/5),text:A,latex:0}:{x:Math.round(H+.1*(K-H)),y:Math.round(S-2-P.size),width:Math.round(.8*(K-H)),height:P.size,text:A,latex:0})}if(X&&null!==I&&(I+=(0===I.length?"M":"L")+Z+","+S),U&&S>=-G&&S<=u+j&&(null!==J&&(J+=`M${H},${S-G}h${K-H}v${G+j+1}h${H-K}z`),null!==Q&&(Q+=i.markeratt.create(Z,S)),null!==W)){let A=5;if(i.options.errorX>0){A=Math.round((K-H)*i.options.errorX);let ut=Z-A;W+=`M${ut+q},${S}${rt}h${Z+A-ut-2*q}${rt}`}W+=`M${Z},${S-G+q}${nt}v${G+j-2*q}${nt}`,null!==V&&(V+=`M${Z-A},${S-G}h${2*A}v${G+j}h${-2*A}z`)}}};for(B=h;B<=l;B+=c)_=o.GetBinCoord(B),!(e.logx&&_<=0)&&(f=Math.round(e.grx(_)),y=B>l-c,y&&hv&&(m=B),b=Math.min(b,M),v=Math.max(v,M),x=M):(M!==x||y)&&(f!==w&&(s+="h"+(f-w)),M!==x&&(s+="v"+(M-x)),x=M,w=f));let st="",dt=!(0,F.isBatchMode)()&&i.fillatt.empty()&&a.Hist&&F.settings.Tooltip&&!U&&!X;if(!i.fillatt.empty()||dt){let D=u+3;if(dt){let A=Math.round(e.gry(0));A<=0?D=-3:Av+.5?r.swap_xy?f=m:g=m:(f++,g--)}if(l=g=f,n=M(l),r.swap_xy){for(;f>x&&M(f-1)n-2;)++g}else{for(;f>x&&M(f-1)>n-2;)--f;for(;g<_&&M(g+1)i/10&&(l=Math.round(f+(g-f)/i*C)),n=M(l)}if(n=Math.round(n),o=Math.round(M(l+1)),this.options.Bar){let m=o-n;n+=Math.round(this.options.BarOffset*m),o=n+Math.round(this.options.BarWidth*m)}if(n>o&&([n,o]=[o,n]),p=Math.round((n+o)/2),y=s=d=b(l),this.options.Bar)c=!0,w=0,s=Math.round(r.gry(!1!==this.options.BaseLine&&this.options.BaseLine>r.scale_ymin?this.options.BaseLine:r.scale_ymin)),s>d&&([s,d]=[d,s]),!t.touch&&1===t.nproc&&(Cd)&&(l=null);else if(this.options.Error||this.options.Mark){c=!0;let m=3;if(this.markeratt&&(m=Math.max(m,this.markeratt.getFullSize())),this.options.Error){let $=a.getBinContent(l+1),L=a.getBinError(l+1);s=Math.round(r.gry($+L)),d=Math.round(r.gry($-L));let R=(o-n)*this.options.errorX;n=Math.round(p-R),o=Math.round(p+R)}o-n<2*m&&(n=p-m,o=p+m),s=Math.min(s,y-m),d=Math.max(d,y+m),!t.touch&&1===t.nproc&&(Cd)&&(l=null)}else this.options.Line?c=!1:(c=1===t.nproc&&_-xd)&&!t.touch&&(l=null)));null!==l&&(l===x&&n>v+w||l===_-1&&oo+w||!this.options.Zero&&0===a.getBinContent(l+1))&&(l=null);let E=this.draw_g.select(".tooltip_bin");if(null===l||d<=0||s>=i)return E.remove(),null;let B={name:"histo",title:a.fTitle,x:p,y,exact:!0,color1:this.lineatt?this.lineatt.color:"green",color2:this.fillatt?this.fillatt.getFillColorAlt("blue"):"blue",lines:this.getBinTooltips(l)};if(t.disabled)E.remove(),B.changed=!0;else if(c)E.empty()&&(E=this.draw_g.append("svg:rect").attr("class","tooltip_bin h1bin").style("pointer-events","none")),B.changed=E.property("current_bin")!==l,B.changed&&E.attr("x",e.swap_xy?s:n).attr("width",e.swap_xy?d-s:o-n).attr("y",e.swap_xy?n:s).attr("height",e.swap_xy?o-n:d-s).style("opacity","0.3").property("current_bin",l),B.exact=Math.abs(y-C)<=5||C>=s&&C<=d,B.menu=B.exact,B.menu_dist=Math.sqrt((p-v)**2+(y-C)**2);else{let m=this.lineatt.width+3;E.empty()&&(E=this.draw_g.append("svg:circle").attr("class","tooltip_bin").style("pointer-events","none").attr("r",m).call(this.lineatt.func).call(this.fillatt.func)),B.exact=Math.abs(p-t.x)<=m&&Math.abs(y-t.y)<=m,B.menu=B.exact,B.menu_dist=Math.sqrt((p-t.x)**2+(y-t.y)**2),B.changed=E.property("current_bin")!==l,B.changed&&E.attr("cx",p).attr("cy",y).property("current_bin",l)}return B.changed&&(B.user_info={obj:a,name:"histo",bin:l,cont:a.getBinContent(l+1),grx:p,gry:y}),B}fillHistContextMenu(t){t.add("Auto zoom-in",()=>this.autoZoom());let e=this.getSupportedDrawOptions();t.addDrawMenu("Draw with",e,r=>{if("inspect"===r)return this.showInspector();this.decodeOptions(r),this.options.need_fillcol&&this.fillatt&&this.fillatt.empty()&&this.fillatt.change(5,1001),this.interactiveRedraw("pad","drawopt")})}autoZoom(){let t=this.getSelectIndex("x","left",-1),e=this.getSelectIndex("x","right",1),r=e-t,u=this.getHisto(),i=this.getAxis("x");if(0==r)return;let a=u.getBinContent(t+1);for(let h=t;h0)){for(;t2&&e1||"y"==t&&Math.abs(r-e)>1e-6*Math.abs(this.ymax-this.ymin)}callDrawFunc(t){var e=this;return(0,z.Z)(function*(){let r=e.getFramePainter();return r&&r.mode3d!==e.options.Mode3D&&!e.isMainPainter()&&(e.options.Mode3D=r.mode3d),e.options.Mode3D?e.draw3D(t):e.draw2D(t)})()}draw2D(t){var e=this;return(0,z.Z)(function*(){return e.clear3DScene(),e.drawFrameAxes().then(r=>!!r&&e.drawingBins(t)).then(r=>{if(r)return e.draw1DBins().then(()=>e.addInteractivity())}).then(()=>e)})()}draw3D(t){var e=this;return(0,z.Z)(function*(){return console.log("3D drawing is disabled, load ./hist/RH1Painter.mjs"),e.draw2D(t)})()}redraw(t){var e=this;return(0,z.Z)(function*(){return e.callDrawFunc(t)})()}static _draw(t,e){return(0,z.Z)(function*(){return(0,gt.ensureRCanvas)(t).then(()=>{t.setAsMainPainter(),t.options={Hist:!1,Bar:!1,BarStyle:0,Error:!1,ErrorKind:-1,errorX:F.gStyle.fErrorX,Zero:!1,Mark:!1,Line:!1,Fill:!1,Lego:0,Surf:0,Text:!1,TextAngle:0,TextKind:"",AutoColor:0,BarOffset:0,BarWidth:1,BaseLine:!1,Mode3D:!1};let r=new Y.pc(e);r.check("R3D_",!0)&&(t.options.Render3D=F.constants.Render3D.fromString(r.part.toLowerCase()));let u=t.v7EvalAttr("kind","hist"),i=t.v7EvalAttr("sub",0),a=!!t.getMainPainter(),h=t.options;switch(h.Text=t.v7EvalAttr("drawtext",!1),h.BarOffset=t.v7EvalAttr("baroffset",0),h.BarWidth=t.v7EvalAttr("barwidth",1),h.second_x=a&&t.v7EvalAttr("secondx",!1),h.second_y=a&&t.v7EvalAttr("secondy",!1),u){case"bar":h.Bar=!0,h.BarStyle=i;break;case"err":h.Error=!0,h.ErrorKind=i;break;case"p":h.Mark=!0;break;case"l":h.Line=!0;break;case"lego":h.Lego=i>0?10+i:12,h.Mode3D=!0;break;default:h.Hist=!0}return t.scanContent(),t.callDrawFunc()})})()}static draw(t,e,r){return(0,z.Z)(function*(){return et._draw(new et(t,e),r)})()}}var mt=T(9850),ht=T(7238);class it extends et{draw3D(t){this.mode3d=!0;let e=this.getFramePainter(),r=this.isMainPainter(),u=1+2*F.gStyle.fHistTopMargin,i=Promise.resolve(this);return"resize"==t?(r&&e.resize3D()&&e.render3D(),i):(this.deleteAttr(),this.scanContent(!0),r&&((0,ht.g_)(e),i=e.create3DScene(this.options.Render3D).then(()=>{e.setAxesRanges(this.getAxis("x"),this.xmin,this.xmax,null,this.ymin,this.ymax,null,0,0),e.set3DOptions(this.options),e.drawXYZ(e.toplevel,mt.C,{use_y_for_z:!0,zmult:u,zoom:F.settings.Zooming,ndim:1,draw:!0,v7:!0})})),e.mode3d?i.then(()=>this.drawingBins(t)).then(()=>{let a=this.getFramePainter();return(0,ht.UR)(this,!0),this.updatePaletteDraw(),a.render3D(),a.addKeysHandler(),this}):i)}static draw(t,e,r){return(0,z.Z)(function*(){return it._draw(new it(t,e),r)})()}}}}]); +//# sourceMappingURL=61.dbe75c5a8333bdf7.js.map \ No newline at end of file diff --git a/docs/18.53db17338b338e15.js.map b/docs/61.dbe75c5a8333bdf7.js.map similarity index 99% rename from docs/18.53db17338b338e15.js.map rename to docs/61.dbe75c5a8333bdf7.js.map index 591c54b03..77a7898ef 100644 --- a/docs/18.53db17338b338e15.js.map +++ b/docs/61.dbe75c5a8333bdf7.js.map @@ -1 +1 @@ -{"version":3,"file":"18.53db17338b338e15.js","mappings":"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","names":["RH1Painter","RHistPainter","constructor","dom","histo","super","this","wheel_zoomy","scanContent","when_axis_changed","getHisto","nbinsx","extractAxesProperties","hmin","hmin_nz","hmax","hsum","isDisplayItem","fContMin","fContMinPos","fContMax","left","getSelectIndex","right","scan_xleft","scan_xright","value","err","first","i","getBinContent","Math","min","max","stat_entries","ymin_nz","draw_content","abs","ymin","ymax","dy","countStat","cond","xaxis","getAxis","stat_sumw","stat_sumwx","stat_sumwx2","xx","w","xmax","wmax","res","getFramePainter","name","meanx","meany","rmsx","rmsy","integral","entries","GetBinCoord","sqrt","fillStatistic","stat","dostat","data","print_name","print_entries","floor","print_mean","print_rms","print_under","print_over","print_integral","print_skew","print_kurt","clearStat","addText","format","drawBars","handle","funcs","width","height","_this","createG","x1","x2","grx1","grx2","y","gry1","gry2","i1","i2","di","stepi","pmain","bars","barsl","barsr","swap_xy","Number","isFinite","options","BaseLine","scale_ymin","round","gry","logx","grx","logy","BarOffset","BarWidth","BarStyle","fillatt","empty","setSolidColor","draw_g","append","attr","call","func","style","d3_rgb","color","brighter","formatHex","darker","drawFilledErrors","_this2","x","yerr","bins1","bins2","getBinError","push","unshift","kind","ErrorKind","path1","buildSvgPath","path2","path","draw1DBins","_this3","rect","getFrameRect","removeG","createHistDrawAttributes","prepareDraw","extra","only_indexes","getGrFuncs","second_x","second_y","Bar","drawHistBins","_this4","startx","currx","curry","curry_min","curry_max","prevy","prevx","bestimin","bestimax","my","yerr1","yerr2","bincont","binerr","mx1","mx2","midx","text_font","want_tooltip","isBatchMode","settings","lastbin","exclude_zero","Zero","show_errors","Error","show_markers","Mark","show_line","Line","show_text","Text","path_fill","path_err","path_marker","path_line","hints_err","endx","endy","dend","v7EvalAttr","createv7AttMarker","markeratt","size","resetPos","v7EvalFont","align","angle","TextKind","space","setAngle","setSize","startTextDrawing","use_minmax","lw","lineatt","gStyle","draw_markers","draw_bin","besti","lbl","toString","floatToString","drawText","text","latex","length","create","edx","errorX","mmx1","close_path","fill_for_interactive","Hist","h0","gry0","Fill","finishTextDrawing","getBinTooltips","bin","tips","getObjectHint","stepx","cont","xlbl","getAxisBinTip","axisAsText","toPrecision","$baseh","processTooltipEvent","pnt","Mode3D","select","remove","show_rect","midy","getFrameWidth","getFrameHeight","findbin","gapx","l","r","GetBinGrX","GetBinGrY","yy","pnt_x","pnt_y","m","best","dist","touch","nproc","msize","getFullSize","dx","ttrect","title","fTitle","exact","color1","color2","getFillColorAlt","lines","disabled","changed","property","menu","menu_dist","radius","user_info","obj","fillHistContextMenu","add","autoZoom","opts","getSupportedDrawOptions","addDrawMenu","arg","showInspector","decodeOptions","need_fillcol","change","interactiveRedraw","indx","zoom","canZoomInside","axis","FindBin","callDrawFunc","reason","main","_this5","mode3d","isMainPainter","draw3D","draw2D","clear3DScene","_this6","drawFrameAxes","then","drawingBins","addInteractivity","console","log","_this7","redraw","_this8","static","painter","opt","ensureRCanvas","setAsMainPainter","Lego","Surf","TextAngle","AutoColor","d","DrawOptions","check","Render3D","constants","part","toLowerCase","sub","has_main","getMainPainter","o","_draw","RH1Painter2D","is_main","zmult","pr","Promise","resolve","resize3D","render3D","deleteAttr","assignFrame3DMethods","create3DScene","setAxesRanges","xmin","set3DOptions","drawXYZ","toplevel","RAxisPainter","use_y_for_z","ndim","draw","v7","drawBinsLego","updatePaletteDraw","addKeysHandler"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/hist2d/RH1Painter.mjs","../node_modules/jsroot/modules/hist/RH1Painter.mjs"],"sourcesContent":["import { gStyle, settings, constants, isBatchMode } from '../core.mjs';\nimport { rgb as d3_rgb } from '../d3.mjs';\nimport { floatToString, DrawOptions, buildSvgPath } from '../base/BasePainter.mjs';\nimport { RHistPainter } from './RHistPainter.mjs';\nimport { ensureRCanvas } from '../gpad/RCanvasPainter.mjs';\n\n/**\n * @summary Painter for RH1 classes\n *\n * @private\n */\n\nclass RH1Painter extends RHistPainter {\n\n /** @summary Constructor\n * @param {object|string} dom - DOM element or id\n * @param {object} histo - histogram object */\n constructor(dom, histo) {\n super(dom, histo);\n this.wheel_zoomy = false;\n }\n\n /** @summary Scan content */\n scanContent(when_axis_changed) {\n // if when_axis_changed === true specified, content will be scanned after axis zoom changed\n\n let histo = this.getHisto();\n if (!histo) return;\n\n if (!this.nbinsx && when_axis_changed) when_axis_changed = false;\n\n if (!when_axis_changed)\n this.extractAxesProperties(1);\n\n let hmin = 0, hmin_nz = 0, hmax = 0, hsum = 0;\n\n if (this.isDisplayItem()) {\n // take min/max values from the display item\n hmin = histo.fContMin;\n hmin_nz = histo.fContMinPos;\n hmax = histo.fContMax;\n hsum = hmax;\n } else {\n\n let left = this.getSelectIndex('x', 'left'),\n right = this.getSelectIndex('x', 'right');\n\n if (when_axis_changed) {\n if ((left === this.scan_xleft) && (right === this.scan_xright)) return;\n }\n\n this.scan_xleft = left;\n this.scan_xright = right;\n\n let first = true, value, err;\n\n for (let i = 0; i < this.nbinsx; ++i) {\n value = histo.getBinContent(i+1);\n hsum += value;\n\n if ((i=right)) continue;\n\n if (value > 0)\n if ((hmin_nz == 0) || (value= hmax) {\n if (hmin == 0) { this.ymin = 0; this.ymax = 1; }\n else if (hmin < 0) { this.ymin = 2 * hmin; this.ymax = 0; }\n else { this.ymin = 0; this.ymax = hmin * 2; }\n } else {\n let dy = (hmax - hmin) * 0.05;\n this.ymin = hmin - dy;\n if ((this.ymin < 0) && (hmin >= 0)) this.ymin = 0;\n this.ymax = hmax + dy;\n }\n }\n }\n\n /** @summary Count statistic */\n countStat(cond) {\n let histo = this.getHisto(), xaxis = this.getAxis('x'),\n left = this.getSelectIndex('x', 'left'),\n right = this.getSelectIndex('x', 'right'),\n stat_sumw = 0, stat_sumwx = 0, stat_sumwx2 = 0, stat_sumwy = 0, stat_sumwy2 = 0,\n i, xx = 0, w = 0, xmax = null, wmax = null,\n fp = this.getFramePainter(),\n res = { name: 'histo', meanx: 0, meany: 0, rmsx: 0, rmsy: 0, integral: 0, entries: this.stat_entries, xmax: 0, wmax: 0 };\n\n for (i = left; i < right; ++i) {\n xx = xaxis.GetBinCoord(i+0.5);\n\n if (cond && !cond(xx)) continue;\n\n w = histo.getBinContent(i + 1);\n\n if ((xmax === null) || (w > wmax)) { xmax = xx; wmax = w; }\n\n stat_sumw += w;\n stat_sumwx += w * xx;\n stat_sumwx2 += w * xx**2;\n }\n\n res.integral = stat_sumw;\n\n if (Math.abs(stat_sumw) > 1e-300) {\n res.meanx = stat_sumwx / stat_sumw;\n res.meany = stat_sumwy / stat_sumw;\n res.rmsx = Math.sqrt(Math.abs(stat_sumwx2 / stat_sumw - res.meanx**2));\n res.rmsy = Math.sqrt(Math.abs(stat_sumwy2 / stat_sumw - res.meany**2));\n }\n\n if (xmax !== null) {\n res.xmax = xmax;\n res.wmax = wmax;\n }\n\n return res;\n }\n\n /** @summary Fill statistic */\n fillStatistic(stat, dostat/*, dofit*/) {\n\n let data = this.countStat(),\n print_name = dostat % 10,\n print_entries = Math.floor(dostat / 10) % 10,\n print_mean = Math.floor(dostat / 100) % 10,\n print_rms = Math.floor(dostat / 1000) % 10,\n print_under = Math.floor(dostat / 10000) % 10,\n print_over = Math.floor(dostat / 100000) % 10,\n print_integral = Math.floor(dostat / 1000000) % 10,\n print_skew = Math.floor(dostat / 10000000) % 10,\n print_kurt = Math.floor(dostat / 100000000) % 10;\n\n // make empty at the beginning\n stat.clearStat();\n\n if (print_name > 0)\n stat.addText(data.name);\n\n if (print_entries > 0)\n stat.addText('Entries = ' + stat.format(data.entries,'entries'));\n\n if (print_mean > 0)\n stat.addText('Mean = ' + stat.format(data.meanx));\n\n if (print_rms > 0)\n stat.addText('Std Dev = ' + stat.format(data.rmsx));\n\n if (print_under > 0)\n stat.addText('Underflow = ' + stat.format(histo.getBinContent(0), 'entries'));\n\n if (print_over > 0)\n stat.addText('Overflow = ' + stat.format(histo.getBinContent(this.nbinsx+1), 'entries'));\n\n if (print_integral > 0)\n stat.addText('Integral = ' + stat.format(data.integral,'entries'));\n\n if (print_skew > 0)\n stat.addText('Skew = ');\n\n if (print_kurt > 0)\n stat.addText('Kurt = ');\n\n return true;\n }\n\n /** @summary Draw histogram as bars */\n async drawBars(handle, funcs, width, height) {\n\n this.createG(true);\n\n let left = handle.i1, right = handle.i2, di = handle.stepi,\n pmain = this.getFramePainter(),\n histo = this.getHisto(), xaxis = this.getAxis('x'),\n i, x1, x2, grx1, grx2, y, gry1, gry2, w,\n bars = '', barsl = '', barsr = '';\n\n gry2 = pmain.swap_xy ? 0 : height;\n if (Number.isFinite(this.options.BaseLine))\n if (this.options.BaseLine >= funcs.scale_ymin)\n gry2 = Math.round(funcs.gry(this.options.BaseLine));\n\n for (i = left; i < right; i += di) {\n x1 = xaxis.GetBinCoord(i);\n x2 = xaxis.GetBinCoord(i+di);\n\n if (funcs.logx && (x2 <= 0)) continue;\n\n grx1 = Math.round(funcs.grx(x1));\n grx2 = Math.round(funcs.grx(x2));\n\n y = histo.getBinContent(i+1);\n if (funcs.logy && (y < funcs.scale_ymin)) continue;\n gry1 = Math.round(funcs.gry(y));\n\n w = grx2 - grx1;\n grx1 += Math.round(this.options.BarOffset*w);\n w = Math.round(this.options.BarWidth*w);\n\n if (pmain.swap_xy)\n bars += `M${gry2},${grx1}h${gry1-gry2}v${w}h${gry2-gry1}z`;\n else\n bars += `M${grx1},${gry1}h${w}v${gry2-gry1}h${-w}z`;\n\n if (this.options.BarStyle > 0) {\n grx2 = grx1 + w;\n w = Math.round(w / 10);\n if (pmain.swap_xy) {\n barsl += `M${gry2},${grx1}h${gry1-gry2}v${w}h${gry2-gry1}z`;\n barsr += `M${gry2},${grx2}h${gry1-gry2}v${-w}h${gry2-gry1}z`;\n } else {\n barsl += `M${grx1},${gry1}h${w}v${gry2-gry1}h${-w}z`;\n barsr += `M${grx2},${gry1}h${-w}v${gry2-gry1}h${w}z`;\n }\n }\n }\n\n if (this.fillatt.empty()) this.fillatt.setSolidColor('blue');\n\n if (bars)\n this.draw_g.append('svg:path')\n .attr('d', bars)\n .call(this.fillatt.func);\n\n if (barsl)\n this.draw_g.append('svg:path')\n .attr('d', barsl)\n .call(this.fillatt.func)\n .style('fill', d3_rgb(this.fillatt.color).brighter(0.5).formatHex());\n\n if (barsr)\n this.draw_g.append('svg:path')\n .attr('d', barsr)\n .call(this.fillatt.func)\n .style('fill', d3_rgb(this.fillatt.color).darker(0.5).formatHex());\n\n return true;\n }\n\n /** @summary Draw histogram as filled errors */\n async drawFilledErrors(handle, funcs /*, width, height*/) {\n this.createG(true);\n\n let left = handle.i1, right = handle.i2, di = handle.stepi,\n histo = this.getHisto(), xaxis = this.getAxis('x'),\n i, x, grx, y, yerr, gry1, gry2,\n bins1 = [], bins2 = [];\n\n for (i = left; i < right; i += di) {\n x = xaxis.GetBinCoord(i+0.5);\n if (funcs.logx && (x <= 0)) continue;\n grx = Math.round(funcs.grx(x));\n\n y = histo.getBinContent(i+1);\n yerr = histo.getBinError(i+1);\n if (funcs.logy && (y-yerr < funcs.scale_ymin)) continue;\n\n gry1 = Math.round(funcs.gry(y + yerr));\n gry2 = Math.round(funcs.gry(y - yerr));\n\n bins1.push({grx: grx, gry: gry1});\n bins2.unshift({grx: grx, gry: gry2});\n }\n\n let kind = (this.options.ErrorKind === 4) ? 'bezier' : 'line',\n path1 = buildSvgPath(kind, bins1),\n path2 = buildSvgPath('L'+kind, bins2);\n\n if (this.fillatt.empty()) this.fillatt.setSolidColor('blue');\n\n this.draw_g.append('svg:path')\n .attr('d', path1.path + path2.path + 'Z')\n .call(this.fillatt.func);\n\n return true;\n }\n\n /** @summary Draw 1D histogram as SVG */\n async draw1DBins() {\n\n let pmain = this.getFramePainter(),\n rect = pmain.getFrameRect();\n\n if (!this.draw_content || (rect.width <= 0) || (rect.height <= 0)) {\n this.removeG()\n return false;\n }\n\n this.createHistDrawAttributes();\n\n let handle = this.prepareDraw({ extra: 1, only_indexes: true }),\n funcs = pmain.getGrFuncs(this.options.second_x, this.options.second_y);\n\n if (this.options.Bar)\n return this.drawBars(handle, funcs, rect.width, rect.height);\n\n if ((this.options.ErrorKind === 3) || (this.options.ErrorKind === 4))\n return this.drawFilledErrors(handle, funcs, rect.width, rect.height);\n\n return this.drawHistBins(handle, funcs, rect.width, rect.height);\n }\n\n /** @summary Draw histogram bins */\n async drawHistBins(handle, funcs, width, height) {\n this.createG(true);\n\n let options = this.options,\n left = handle.i1,\n right = handle.i2,\n di = handle.stepi,\n histo = this.getHisto(),\n want_tooltip = !isBatchMode() && settings.Tooltip,\n xaxis = this.getAxis('x'),\n res = '', lastbin = false,\n startx, currx, curry, x, grx, y, gry, curry_min, curry_max, prevy, prevx, i, bestimin, bestimax,\n exclude_zero = !options.Zero,\n show_errors = options.Error,\n show_markers = options.Mark,\n show_line = options.Line,\n show_text = options.Text,\n path_fill = null, path_err = null, path_marker = null, path_line = null,\n hints_err = null,\n endx = '', endy = '', dend = 0, my, yerr1, yerr2, bincont, binerr, mx1, mx2, midx,\n text_font;\n\n if (show_errors && !show_markers && (this.v7EvalAttr('marker_style',1) > 1))\n show_markers = true;\n\n if (options.ErrorKind === 2) {\n if (this.fillatt.empty()) show_markers = true;\n else path_fill = '';\n } else if (options.Error) {\n path_err = '';\n hints_err = want_tooltip ? '' : null;\n }\n\n if (show_line) path_line = '';\n\n if (show_markers) {\n // draw markers also when e2 option was specified\n this.createv7AttMarker();\n if (this.markeratt.size > 0) {\n // simply use relative move from point, can optimize in the future\n path_marker = '';\n this.markeratt.resetPos();\n } else {\n show_markers = false;\n }\n }\n\n if (show_text) {\n text_font = this.v7EvalFont('text', { size: 20, color: 'black', align: 22 });\n\n if (!text_font.angle && !options.TextKind) {\n let space = width / (right - left + 1);\n if (space < 3 * text_font.size) {\n text_font.setAngle(270);\n text_font.setSize(Math.round(space*0.7));\n }\n }\n\n this.startTextDrawing(text_font, 'font');\n }\n\n // if there are too many points, exclude many vertical drawings at the same X position\n // instead define min and max value and made min-max drawing\n let use_minmax = ((right-left) > 3*width);\n\n if (options.ErrorKind === 1) {\n let lw = this.lineatt.width + gStyle.fEndErrorSize;\n endx = `m0,${lw}v${-2*lw}m0,${lw}`;\n endy = `m${lw},0h${-2*lw}m${lw},0`;\n dend = Math.floor((this.lineatt.width-1)/2);\n }\n\n let draw_markers = show_errors || show_markers;\n\n if (draw_markers || show_text || show_line) use_minmax = true;\n\n let draw_bin = besti => {\n bincont = histo.getBinContent(besti+1);\n if (!exclude_zero || (bincont !== 0)) {\n mx1 = Math.round(funcs.grx(xaxis.GetBinCoord(besti)));\n mx2 = Math.round(funcs.grx(xaxis.GetBinCoord(besti+di)));\n midx = Math.round((mx1+mx2)/2);\n my = Math.round(funcs.gry(bincont));\n yerr1 = yerr2 = 20;\n if (show_errors) {\n binerr = histo.getBinError(besti+1);\n yerr1 = Math.round(my - funcs.gry(bincont + binerr)); // up\n yerr2 = Math.round(funcs.gry(bincont - binerr) - my); // down\n }\n\n if (show_text && (bincont !== 0)) {\n let lbl = (bincont === Math.round(bincont)) ? bincont.toString() : floatToString(bincont, gStyle.fPaintTextFormat);\n\n if (text_font.angle)\n this.drawText({ align: 12, x: midx, y: Math.round(my - 2 - text_font.size / 5), text: lbl, latex: 0 });\n else\n this.drawText({ x: Math.round(mx1 + (mx2 - mx1) * 0.1), y: Math.round(my - 2 - text_font.size), width: Math.round((mx2 - mx1) * 0.8), height: text_font.size, text: lbl, latex: 0 });\n }\n\n if (show_line && (path_line !== null))\n path_line += ((path_line.length === 0) ? 'M' : 'L') + midx + ',' + my;\n\n if (draw_markers) {\n if ((my >= -yerr1) && (my <= height + yerr2)) {\n if (path_fill !== null)\n path_fill += `M${mx1},${my-yerr1}h${mx2-mx1}v${yerr1+yerr2+1}h${mx1-mx2}z`;\n if (path_marker !== null)\n path_marker += this.markeratt.create(midx, my);\n if (path_err !== null) {\n let edx = 5;\n if (this.options.errorX > 0) {\n edx = Math.round((mx2-mx1)*this.options.errorX);\n let mmx1 = midx - edx, mmx2 = midx + edx;\n path_err += `M${mmx1+dend},${my}${endx}h${mmx2-mmx1-2*dend}${endx}`;\n }\n path_err += `M${midx},${my-yerr1+dend}${endy}v${yerr1+yerr2-2*dend}${endy}`;\n if (hints_err !== null)\n hints_err += `M${midx-edx},${my-yerr1}h${2*edx}v${yerr1+yerr2}h${-2*edx}z`;\n }\n }\n }\n }\n };\n\n for (i = left; i <= right; i += di) {\n\n x = xaxis.GetBinCoord(i);\n\n if (funcs.logx && (x <= 0)) continue;\n\n grx = Math.round(funcs.grx(x));\n\n lastbin = (i > right - di);\n\n if (lastbin && (left < right)) {\n gry = curry;\n } else {\n y = histo.getBinContent(i+1);\n gry = Math.round(funcs.gry(y));\n }\n\n if (res.length === 0) {\n bestimin = bestimax = i;\n prevx = startx = currx = grx;\n prevy = curry_min = curry_max = curry = gry;\n res = 'M'+currx+','+curry;\n } else\n if (use_minmax) {\n if ((grx === currx) && !lastbin) {\n if (gry < curry_min) bestimax = i; else\n if (gry > curry_max) bestimin = i;\n curry_min = Math.min(curry_min, gry);\n curry_max = Math.max(curry_max, gry);\n curry = gry;\n } else {\n\n if (draw_markers || show_text || show_line) {\n if (bestimin === bestimax) { draw_bin(bestimin); } else\n if (bestimin < bestimax) { draw_bin(bestimin); draw_bin(bestimax); } else {\n draw_bin(bestimax); draw_bin(bestimin);\n }\n }\n\n // when several points as same X differs, need complete logic\n if (!draw_markers && ((curry_min !== curry_max) || (prevy !== curry_min))) {\n\n if (prevx !== currx)\n res += 'h'+(currx-prevx);\n\n if (curry === curry_min) {\n if (curry_max !== prevy)\n res += 'v' + (curry_max - prevy);\n if (curry_min !== curry_max)\n res += 'v' + (curry_min - curry_max);\n } else {\n if (curry_min !== prevy)\n res += 'v' + (curry_min - prevy);\n if (curry_max !== curry_min)\n res += 'v' + (curry_max - curry_min);\n if (curry !== curry_max)\n res += 'v' + (curry - curry_max);\n }\n\n prevx = currx;\n prevy = curry;\n }\n\n if (lastbin && (prevx !== grx))\n res += 'h'+(grx-prevx);\n\n bestimin = bestimax = i;\n curry_min = curry_max = curry = gry;\n currx = grx;\n }\n } else\n if ((gry !== curry) || lastbin) {\n if (grx !== currx) res += 'h'+(grx-currx);\n if (gry !== curry) res += 'v'+(gry-curry);\n curry = gry;\n currx = grx;\n }\n }\n\n let close_path = '',\n fill_for_interactive = !isBatchMode() && this.fillatt.empty() && options.Hist && settings.Tooltip && !draw_markers && !show_line;\n if (!this.fillatt.empty() || fill_for_interactive) {\n let h0 = height + 3;\n if (fill_for_interactive) {\n let gry0 = Math.round(funcs.gry(0));\n if (gry0 <= 0)\n h0 = -3;\n else if (gry0 < height)\n h0 = gry0;\n }\n close_path = `L${currx},${h0}H${startx}Z`;\n if (res) res += close_path;\n }\n\n if (draw_markers || show_line) {\n if (path_fill)\n this.draw_g.append('svg:path')\n .attr('d', path_fill)\n .call(this.fillatt.func);\n\n if (path_err)\n this.draw_g.append('svg:path')\n .attr('d', path_err)\n .call(this.lineatt.func);\n\n if (hints_err)\n this.draw_g.append('svg:path')\n .attr('d', hints_err)\n .style('fill', 'none')\n .style('pointer-events', isBatchMode() ? null : 'visibleFill');\n\n if (path_line) {\n if (!this.fillatt.empty())\n this.draw_g.append('svg:path')\n .attr('d', options.Fill ? (path_line + close_path) : res)\n .call(this.fillatt.func);\n\n this.draw_g.append('svg:path')\n .attr('d', path_line)\n .style('fill', 'none')\n .call(this.lineatt.func);\n }\n\n if (path_marker)\n this.draw_g.append('svg:path')\n .attr('d', path_marker)\n .call(this.markeratt.func);\n\n } else if (res && options.Hist) {\n this.draw_g.append('svg:path')\n .attr('d', res)\n .style('stroke-linejoin','miter')\n .call(this.lineatt.func)\n .call(this.fillatt.func);\n }\n\n return show_text ? this.finishTextDrawing() : true;\n }\n\n /** @summary Provide text information (tooltips) for histogram bin */\n getBinTooltips(bin) {\n let tips = [],\n name = this.getObjectHint(),\n pmain = this.getFramePainter(),\n histo = this.getHisto(),\n xaxis = this.getAxis('x'),\n di = this.isDisplayItem() ? histo.stepx : 1,\n x1 = xaxis.GetBinCoord(bin),\n x2 = xaxis.GetBinCoord(bin+di),\n cont = histo.getBinContent(bin+1),\n xlbl = this.getAxisBinTip('x', bin, di);\n\n if (name) tips.push(name);\n\n if (this.options.Error || this.options.Mark) {\n tips.push('x = ' + xlbl, 'y = ' + pmain.axisAsText('y', cont));\n if (this.options.Error) {\n if (xlbl[0] == '[') tips.push('error x = ' + ((x2 - x1) / 2).toPrecision(4));\n tips.push('error y = ' + histo.getBinError(bin + 1).toPrecision(4));\n }\n } else {\n tips.push(`bin = ${bin+1}`);\n tips.push('x = ' + xlbl);\n if (histo['$baseh']) cont -= histo['$baseh'].getBinContent(bin+1);\n let lbl = 'entries = ' + (di > 1 ? '~' : '');\n if (cont === Math.round(cont))\n tips.push(lbl + cont);\n else\n tips.push(lbl + floatToString(cont, gStyle.fStatFormat));\n }\n\n return tips;\n }\n\n /** @summary Process tooltip event */\n processTooltipEvent(pnt) {\n if (!pnt || !this.draw_content || this.options.Mode3D || !this.draw_g) {\n if (this.draw_g)\n this.draw_g.select('.tooltip_bin').remove();\n return null;\n }\n\n let pmain = this.getFramePainter(),\n funcs = pmain.getGrFuncs(this.options.second_x, this.options.second_y),\n width = pmain.getFrameWidth(),\n height = pmain.getFrameHeight(),\n histo = this.getHisto(), xaxis = this.getAxis('x'),\n findbin = null, show_rect,\n grx1, midx, grx2, gry1, midy, gry2, gapx = 2,\n left = this.getSelectIndex('x', 'left', -1),\n right = this.getSelectIndex('x', 'right', 2),\n l = left, r = right;\n\n function GetBinGrX(i) {\n let xx = xaxis.GetBinCoord(i);\n return (funcs.logx && (xx <= 0)) ? null : funcs.grx(xx);\n }\n\n function GetBinGrY(i) {\n let yy = histo.getBinContent(i + 1);\n if (funcs.logy && (yy < funcs.scale_ymin))\n return funcs.swap_xy ? -1000 : 10*height;\n return Math.round(funcs.gry(yy));\n }\n\n let pnt_x = funcs.swap_xy ? pnt.y : pnt.x,\n pnt_y = funcs.swap_xy ? pnt.x : pnt.y;\n\n while (l < r-1) {\n let m = Math.round((l+r)*0.5),\n xx = GetBinGrX(m);\n if ((xx === null) || (xx < pnt_x - 0.5)) {\n if (funcs.swap_xy) r = m; else l = m;\n } else if (xx > pnt_x + 0.5) {\n if (funcs.swap_xy) l = m; else r = m;\n } else { l++; r--; }\n }\n\n findbin = r = l;\n grx1 = GetBinGrX(findbin);\n\n if (funcs.swap_xy) {\n while ((l>left) && (GetBinGrX(l-1) < grx1 + 2)) --l;\n while ((r grx1 - 2)) ++r;\n } else {\n while ((l>left) && (GetBinGrX(l-1) > grx1 - 2)) --l;\n while ((r height/10)\n findbin = Math.round(l + (r-l) / height * pnt_y);\n\n grx1 = GetBinGrX(findbin);\n }\n\n grx1 = Math.round(grx1);\n grx2 = Math.round(GetBinGrX(findbin+1));\n\n if (this.options.Bar) {\n let w = grx2 - grx1;\n grx1 += Math.round(this.options.BarOffset*w);\n grx2 = grx1 + Math.round(this.options.BarWidth*w);\n }\n\n if (grx1 > grx2)\n [grx1, grx2] = [grx2, grx1];\n\n midx = Math.round((grx1 + grx2)/2);\n\n midy = gry1 = gry2 = GetBinGrY(findbin);\n\n if (this.options.Bar) {\n show_rect = true;\n\n gapx = 0;\n\n gry1 = Math.round(funcs.gry(((this.options.BaseLine!==false) && (this.options.BaseLine > funcs.scale_ymin)) ? this.options.BaseLine : funcs.scale_ymin));\n\n if (gry1 > gry2)\n [gry1, gry2] = [gry2, gry1];\n\n if (!pnt.touch && (pnt.nproc === 1))\n if ((pnt_y < gry1) || (pnt_y > gry2)) findbin = null;\n\n } else if (this.options.Error || this.options.Mark) {\n\n show_rect = true;\n\n let msize = 3;\n if (this.markeratt) msize = Math.max(msize, this.markeratt.getFullSize());\n\n if (this.options.Error) {\n let cont = histo.getBinContent(findbin+1),\n binerr = histo.getBinError(findbin+1);\n\n gry1 = Math.round(funcs.gry(cont + binerr)); // up\n gry2 = Math.round(funcs.gry(cont - binerr)); // down\n\n let dx = (grx2-grx1)*this.options.errorX;\n grx1 = Math.round(midx - dx);\n grx2 = Math.round(midx + dx);\n }\n\n // show at least 6 pixels as tooltip rect\n if (grx2 - grx1 < 2*msize) { grx1 = midx-msize; grx2 = midx+msize; }\n\n gry1 = Math.min(gry1, midy - msize);\n gry2 = Math.max(gry2, midy + msize);\n\n if (!pnt.touch && (pnt.nproc === 1))\n if ((pnt_ygry2)) findbin = null;\n\n } else if (this.options.Line) {\n\n show_rect = false;\n\n } else {\n\n // if histogram alone, use old-style with rects\n // if there are too many points at pixel, use circle\n show_rect = (pnt.nproc === 1) && (right-left < width);\n\n if (show_rect) {\n gry2 = height;\n\n if (!this.fillatt.empty()) {\n gry2 = Math.min(height, Math.max(0, Math.round(funcs.gry(0))));\n if (gry2 < gry1)\n [gry1, gry2] = [gry2, gry1];\n }\n\n // for mouse events pointer should be between y1 and y2\n if (((pnt.y < gry1) || (pnt.y > gry2)) && !pnt.touch) findbin = null;\n }\n }\n\n if (findbin !== null) {\n // if bin on boundary found, check that x position is ok\n if ((findbin === left) && (grx1 > pnt_x + gapx)) findbin = null; else\n if ((findbin === right-1) && (grx2 < pnt_x - gapx)) findbin = null; else\n // if bars option used check that bar is not match\n if ((pnt_x < grx1 - gapx) || (pnt_x > grx2 + gapx)) findbin = null; else\n // exclude empty bin if empty bins suppressed\n if (!this.options.Zero && (histo.getBinContent(findbin+1) === 0)) findbin = null;\n }\n\n let ttrect = this.draw_g.select('.tooltip_bin');\n\n if ((findbin === null) || ((gry2 <= 0) || (gry1 >= height))) {\n ttrect.remove();\n return null;\n }\n\n let res = { name: 'histo', title: histo.fTitle,\n x: midx, y: midy, exact: true,\n color1: this.lineatt ? this.lineatt.color : 'green',\n color2: this.fillatt ? this.fillatt.getFillColorAlt('blue') : 'blue',\n lines: this.getBinTooltips(findbin) };\n\n if (pnt.disabled) {\n // case when tooltip should not highlight bin\n\n ttrect.remove();\n res.changed = true;\n } else if (show_rect) {\n\n if (ttrect.empty())\n ttrect = this.draw_g.append('svg:rect')\n .attr('class','tooltip_bin h1bin')\n .style('pointer-events','none');\n\n res.changed = ttrect.property('current_bin') !== findbin;\n\n if (res.changed)\n ttrect.attr('x', pmain.swap_xy ? gry1 : grx1)\n .attr('width', pmain.swap_xy ? gry2-gry1 : grx2-grx1)\n .attr('y', pmain.swap_xy ? grx1 : gry1)\n .attr('height', pmain.swap_xy ? grx2-grx1 : gry2-gry1)\n .style('opacity', '0.3')\n .property('current_bin', findbin);\n\n res.exact = (Math.abs(midy - pnt_y) <= 5) || ((pnt_y>=gry1) && (pnt_y<=gry2));\n\n res.menu = res.exact; // one could show context menu\n // distance to middle point, use to decide which menu to activate\n res.menu_dist = Math.sqrt((midx-pnt_x)**2 + (midy-pnt_y)**2);\n\n } else {\n let radius = this.lineatt.width + 3;\n\n if (ttrect.empty())\n ttrect = this.draw_g.append('svg:circle')\n .attr('class','tooltip_bin')\n .style('pointer-events','none')\n .attr('r', radius)\n .call(this.lineatt.func)\n .call(this.fillatt.func);\n\n res.exact = (Math.abs(midx - pnt.x) <= radius) && (Math.abs(midy - pnt.y) <= radius);\n\n res.menu = res.exact; // show menu only when mouse pointer exactly over the histogram\n res.menu_dist = Math.sqrt((midx-pnt.x)**2 + (midy-pnt.y)**2);\n\n res.changed = ttrect.property('current_bin') !== findbin;\n\n if (res.changed)\n ttrect.attr('cx', midx)\n .attr('cy', midy)\n .property('current_bin', findbin);\n }\n\n if (res.changed)\n res.user_info = { obj: histo, name: 'histo',\n bin: findbin, cont: histo.getBinContent(findbin+1),\n grx: midx, gry: midy };\n\n return res;\n }\n\n /** @summary Fill histogram context menu */\n fillHistContextMenu(menu) {\n\n menu.add('Auto zoom-in', () => this.autoZoom());\n\n let opts = this.getSupportedDrawOptions();\n\n menu.addDrawMenu('Draw with', opts, arg => {\n if (arg === 'inspect')\n return this.showInspector();\n\n this.decodeOptions(arg); // obsolete, should be implemented differently\n\n if (this.options.need_fillcol && this.fillatt && this.fillatt.empty())\n this.fillatt.change(5,1001);\n\n // redraw all objects\n this.interactiveRedraw('pad', 'drawopt');\n });\n }\n\n /** @summary Perform automatic zoom inside non-zero region of histogram */\n autoZoom() {\n let left = this.getSelectIndex('x', 'left', -1),\n right = this.getSelectIndex('x', 'right', 1),\n dist = right - left, histo = this.getHisto(), xaxis = this.getAxis('x');\n\n if (dist == 0) return;\n\n // first find minimum\n let min = histo.getBinContent(left + 1);\n for (let indx = left; indx < right; ++indx)\n min = Math.min(min, histo.getBinContent(indx+1));\n if (min > 0) return; // if all points positive, no chance for autoscale\n\n while ((left < right) && (histo.getBinContent(left+1) <= min)) ++left;\n while ((left < right) && (histo.getBinContent(right) <= min)) --right;\n\n // if singular bin\n if ((left === right-1) && (left > 2) && (right < this.nbinsx-2)) {\n --left; ++right;\n }\n\n if ((right - left < dist) && (left < right))\n return this.getFramePainter().zoom(xaxis.GetBinCoord(left), xaxis.GetBinCoord(right));\n }\n\n /** @summary Checks if it makes sense to zoom inside specified axis range */\n canZoomInside(axis,min,max) {\n let xaxis = this.getAxis('x');\n\n if ((axis == 'x') && (xaxis.FindBin(max,0.5) - xaxis.FindBin(min,0) > 1)) return true;\n\n if ((axis == 'y') && (Math.abs(max-min) > Math.abs(this.ymax-this.ymin)*1e-6)) return true;\n\n return false;\n }\n\n /** @summary Call appropriate draw function */\n async callDrawFunc(reason) {\n let main = this.getFramePainter();\n\n if (main && (main.mode3d !== this.options.Mode3D) && !this.isMainPainter())\n this.options.Mode3D = main.mode3d;\n\n return this.options.Mode3D ? this.draw3D(reason) : this.draw2D(reason);\n }\n\n /** @summary Draw in 2d */\n async draw2D(reason) {\n this.clear3DScene();\n\n return this.drawFrameAxes().then(res => {\n return res ? this.drawingBins(reason) : false;\n }).then(res => {\n if (res)\n return this.draw1DBins().then(() => this.addInteractivity());\n }).then(() => this);\n }\n\n /** @summary Draw in 3d */\n async draw3D(reason) {\n console.log('3D drawing is disabled, load ./hist/RH1Painter.mjs');\n return this.draw2D(reason);\n }\n\n /** @summary Readraw histogram */\n async redraw(reason) {\n return this.callDrawFunc(reason);\n }\n\n static async _draw(painter, opt) {\n return ensureRCanvas(painter).then(() => {\n\n painter.setAsMainPainter();\n\n painter.options = { Hist: false, Bar: false, BarStyle: 0,\n Error: false, ErrorKind: -1, errorX: gStyle.fErrorX,\n Zero: false, Mark: false,\n Line: false, Fill: false, Lego: 0, Surf: 0,\n Text: false, TextAngle: 0, TextKind: '', AutoColor: 0,\n BarOffset: 0., BarWidth: 1., BaseLine: false, Mode3D: false };\n\n let d = new DrawOptions(opt);\n if (d.check('R3D_', true))\n painter.options.Render3D = constants.Render3D.fromString(d.part.toLowerCase());\n\n let kind = painter.v7EvalAttr('kind', 'hist'),\n sub = painter.v7EvalAttr('sub', 0),\n has_main = !!painter.getMainPainter(),\n o = painter.options;\n\n o.Text = painter.v7EvalAttr('drawtext', false);\n o.BarOffset = painter.v7EvalAttr('baroffset', 0.);\n o.BarWidth = painter.v7EvalAttr('barwidth', 1.);\n o.second_x = has_main && painter.v7EvalAttr('secondx', false);\n o.second_y = has_main && painter.v7EvalAttr('secondy', false);\n\n switch(kind) {\n case 'bar': o.Bar = true; o.BarStyle = sub; break;\n case 'err': o.Error = true; o.ErrorKind = sub; break;\n case 'p': o.Mark = true; break;\n case 'l': o.Line = true; break;\n case 'lego': o.Lego = sub > 0 ? 10+sub : 12; o.Mode3D = true; break;\n default: o.Hist = true;\n }\n\n painter.scanContent();\n\n return painter.callDrawFunc();\n });\n }\n\n /** @summary draw RH1 object */\n static async draw(dom, histo, opt) {\n return RH1Painter._draw(new RH1Painter(dom, histo), opt);\n }\n\n} // class RH1Painter\n\nexport { RH1Painter };\n","import { settings, gStyle } from '../core.mjs';\nimport { RH1Painter as RH1Painter2D } from '../hist2d/RH1Painter.mjs';\nimport { RAxisPainter } from '../gpad/RAxisPainter.mjs';\nimport { assignFrame3DMethods, drawBinsLego } from './hist3d.mjs';\n\n\nclass RH1Painter extends RH1Painter2D {\n\n /** @summary Draw 1-D histogram in 3D mode */\n draw3D(reason) {\n\n this.mode3d = true;\n\n let main = this.getFramePainter(), // who makes axis drawing\n is_main = this.isMainPainter(), // is main histogram\n zmult = 1 + 2*gStyle.fHistTopMargin,\n pr = Promise.resolve(this);\n\n if (reason == 'resize') {\n if (is_main && main.resize3D()) main.render3D();\n return pr;\n }\n\n this.deleteAttr();\n\n this.scanContent(true); // may be required for axis drawings\n\n if (is_main) {\n assignFrame3DMethods(main);\n pr = main.create3DScene(this.options.Render3D).then(() => {\n main.setAxesRanges(this.getAxis('x'), this.xmin, this.xmax, null, this.ymin, this.ymax, null, 0, 0);\n main.set3DOptions(this.options);\n main.drawXYZ(main.toplevel, RAxisPainter, { use_y_for_z: true, zmult, zoom: settings.Zooming, ndim: 1, draw: true, v7: true });\n });\n }\n\n if (!main.mode3d)\n return pr;\n\n return pr.then(() => this.drawingBins(reason)).then(() => {\n\n // called when bins received from server, must be reentrant\n let main = this.getFramePainter();\n\n drawBinsLego(this, true);\n this.updatePaletteDraw();\n main.render3D();\n main.addKeysHandler();\n return this;\n });\n }\n\n /** @summary draw RH1 object */\n static async draw(dom, histo, opt) {\n return RH1Painter._draw(new RH1Painter(dom, histo), opt);\n }\n\n} // class RH1Painter\n\nexport { RH1Painter };\n\n"],"x_google_ignoreList":[0,1]} \ No newline at end of file +{"version":3,"file":"61.dbe75c5a8333bdf7.js","mappings":"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","names":["RH1Painter","RHistPainter","constructor","dom","histo","super","this","wheel_zoomy","scanContent","when_axis_changed","getHisto","nbinsx","extractAxesProperties","hmin","hmin_nz","hmax","hsum","isDisplayItem","fContMin","fContMinPos","fContMax","left","getSelectIndex","right","scan_xleft","scan_xright","value","err","first","i","getBinContent","Math","min","max","stat_entries","ymin_nz","draw_content","abs","ymin","ymax","dy","countStat","cond","xaxis","getAxis","stat_sumw","stat_sumwx","stat_sumwx2","xx","w","xmax","wmax","res","getFramePainter","name","meanx","meany","rmsx","rmsy","integral","entries","GetBinCoord","sqrt","fillStatistic","stat","dostat","data","print_name","print_entries","floor","print_mean","print_rms","print_under","print_over","print_integral","print_skew","print_kurt","clearStat","addText","format","drawBars","handle","funcs","width","height","_this","createG","x1","x2","grx1","grx2","y","gry1","gry2","i1","i2","di","stepi","pmain","bars","barsl","barsr","swap_xy","Number","isFinite","options","BaseLine","scale_ymin","round","gry","logx","grx","logy","BarOffset","BarWidth","BarStyle","fillatt","empty","setSolidColor","draw_g","append","attr","call","func","style","d3_rgb","color","brighter","formatHex","darker","drawFilledErrors","_this2","x","yerr","bins1","bins2","getBinError","push","unshift","kind","ErrorKind","path1","buildSvgPath","path2","path","draw1DBins","_this3","rect","getFrameRect","removeG","createHistDrawAttributes","prepareDraw","extra","only_indexes","getGrFuncs","second_x","second_y","Bar","drawHistBins","_this4","startx","currx","curry","curry_min","curry_max","prevy","prevx","bestimin","bestimax","my","yerr1","yerr2","bincont","binerr","mx1","mx2","midx","text_font","want_tooltip","isBatchMode","settings","lastbin","exclude_zero","Zero","show_errors","Error","show_markers","Mark","show_line","Line","show_text","Text","path_fill","path_err","path_marker","path_line","hints_err","endx","endy","dend","v7EvalAttr","createv7AttMarker","markeratt","size","resetPos","v7EvalFont","align","angle","TextKind","space","setAngle","setSize","startTextDrawing","use_minmax","lw","lineatt","gStyle","draw_markers","draw_bin","besti","lbl","toString","floatToString","drawText","text","latex","length","create","edx","errorX","mmx1","close_path","fill_for_interactive","Hist","h0","gry0","Fill","finishTextDrawing","getBinTooltips","bin","tips","getObjectHint","stepx","cont","xlbl","getAxisBinTip","axisAsText","toPrecision","$baseh","processTooltipEvent","pnt","Mode3D","select","remove","show_rect","midy","getFrameWidth","getFrameHeight","findbin","gapx","l","r","GetBinGrX","GetBinGrY","yy","pnt_x","pnt_y","m","best","dist","touch","nproc","msize","getFullSize","dx","ttrect","title","fTitle","exact","color1","color2","getFillColorAlt","lines","disabled","changed","property","menu","menu_dist","radius","user_info","obj","fillHistContextMenu","add","autoZoom","opts","getSupportedDrawOptions","addDrawMenu","arg","showInspector","decodeOptions","need_fillcol","change","interactiveRedraw","indx","zoom","canZoomInside","axis","FindBin","callDrawFunc","reason","main","_this5","mode3d","isMainPainter","draw3D","draw2D","clear3DScene","_this6","drawFrameAxes","then","drawingBins","addInteractivity","console","log","_this7","redraw","_this8","static","painter","opt","ensureRCanvas","setAsMainPainter","Lego","Surf","TextAngle","AutoColor","d","DrawOptions","check","Render3D","constants","part","toLowerCase","sub","has_main","getMainPainter","o","_draw","RH1Painter2D","is_main","zmult","pr","Promise","resolve","resize3D","render3D","deleteAttr","assignFrame3DMethods","create3DScene","setAxesRanges","xmin","set3DOptions","drawXYZ","toplevel","RAxisPainter","use_y_for_z","ndim","draw","v7","drawBinsLego","updatePaletteDraw","addKeysHandler"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/hist2d/RH1Painter.mjs","../node_modules/jsroot/modules/hist/RH1Painter.mjs"],"sourcesContent":["import { gStyle, settings, constants, isBatchMode } from '../core.mjs';\nimport { rgb as d3_rgb } from '../d3.mjs';\nimport { floatToString, DrawOptions, buildSvgPath } from '../base/BasePainter.mjs';\nimport { RHistPainter } from './RHistPainter.mjs';\nimport { ensureRCanvas } from '../gpad/RCanvasPainter.mjs';\n\n/**\n * @summary Painter for RH1 classes\n *\n * @private\n */\n\nclass RH1Painter extends RHistPainter {\n\n /** @summary Constructor\n * @param {object|string} dom - DOM element or id\n * @param {object} histo - histogram object */\n constructor(dom, histo) {\n super(dom, histo);\n this.wheel_zoomy = false;\n }\n\n /** @summary Scan content */\n scanContent(when_axis_changed) {\n // if when_axis_changed === true specified, content will be scanned after axis zoom changed\n\n let histo = this.getHisto();\n if (!histo) return;\n\n if (!this.nbinsx && when_axis_changed) when_axis_changed = false;\n\n if (!when_axis_changed)\n this.extractAxesProperties(1);\n\n let hmin = 0, hmin_nz = 0, hmax = 0, hsum = 0;\n\n if (this.isDisplayItem()) {\n // take min/max values from the display item\n hmin = histo.fContMin;\n hmin_nz = histo.fContMinPos;\n hmax = histo.fContMax;\n hsum = hmax;\n } else {\n\n let left = this.getSelectIndex('x', 'left'),\n right = this.getSelectIndex('x', 'right');\n\n if (when_axis_changed) {\n if ((left === this.scan_xleft) && (right === this.scan_xright)) return;\n }\n\n this.scan_xleft = left;\n this.scan_xright = right;\n\n let first = true, value, err;\n\n for (let i = 0; i < this.nbinsx; ++i) {\n value = histo.getBinContent(i+1);\n hsum += value;\n\n if ((i=right)) continue;\n\n if (value > 0)\n if ((hmin_nz == 0) || (value= hmax) {\n if (hmin == 0) { this.ymin = 0; this.ymax = 1; }\n else if (hmin < 0) { this.ymin = 2 * hmin; this.ymax = 0; }\n else { this.ymin = 0; this.ymax = hmin * 2; }\n } else {\n let dy = (hmax - hmin) * 0.05;\n this.ymin = hmin - dy;\n if ((this.ymin < 0) && (hmin >= 0)) this.ymin = 0;\n this.ymax = hmax + dy;\n }\n }\n }\n\n /** @summary Count statistic */\n countStat(cond) {\n let histo = this.getHisto(), xaxis = this.getAxis('x'),\n left = this.getSelectIndex('x', 'left'),\n right = this.getSelectIndex('x', 'right'),\n stat_sumw = 0, stat_sumwx = 0, stat_sumwx2 = 0, stat_sumwy = 0, stat_sumwy2 = 0,\n i, xx = 0, w = 0, xmax = null, wmax = null,\n fp = this.getFramePainter(),\n res = { name: 'histo', meanx: 0, meany: 0, rmsx: 0, rmsy: 0, integral: 0, entries: this.stat_entries, xmax: 0, wmax: 0 };\n\n for (i = left; i < right; ++i) {\n xx = xaxis.GetBinCoord(i+0.5);\n\n if (cond && !cond(xx)) continue;\n\n w = histo.getBinContent(i + 1);\n\n if ((xmax === null) || (w > wmax)) { xmax = xx; wmax = w; }\n\n stat_sumw += w;\n stat_sumwx += w * xx;\n stat_sumwx2 += w * xx**2;\n }\n\n res.integral = stat_sumw;\n\n if (Math.abs(stat_sumw) > 1e-300) {\n res.meanx = stat_sumwx / stat_sumw;\n res.meany = stat_sumwy / stat_sumw;\n res.rmsx = Math.sqrt(Math.abs(stat_sumwx2 / stat_sumw - res.meanx**2));\n res.rmsy = Math.sqrt(Math.abs(stat_sumwy2 / stat_sumw - res.meany**2));\n }\n\n if (xmax !== null) {\n res.xmax = xmax;\n res.wmax = wmax;\n }\n\n return res;\n }\n\n /** @summary Fill statistic */\n fillStatistic(stat, dostat/*, dofit*/) {\n\n let data = this.countStat(),\n print_name = dostat % 10,\n print_entries = Math.floor(dostat / 10) % 10,\n print_mean = Math.floor(dostat / 100) % 10,\n print_rms = Math.floor(dostat / 1000) % 10,\n print_under = Math.floor(dostat / 10000) % 10,\n print_over = Math.floor(dostat / 100000) % 10,\n print_integral = Math.floor(dostat / 1000000) % 10,\n print_skew = Math.floor(dostat / 10000000) % 10,\n print_kurt = Math.floor(dostat / 100000000) % 10;\n\n // make empty at the beginning\n stat.clearStat();\n\n if (print_name > 0)\n stat.addText(data.name);\n\n if (print_entries > 0)\n stat.addText('Entries = ' + stat.format(data.entries,'entries'));\n\n if (print_mean > 0)\n stat.addText('Mean = ' + stat.format(data.meanx));\n\n if (print_rms > 0)\n stat.addText('Std Dev = ' + stat.format(data.rmsx));\n\n if (print_under > 0)\n stat.addText('Underflow = ' + stat.format(histo.getBinContent(0), 'entries'));\n\n if (print_over > 0)\n stat.addText('Overflow = ' + stat.format(histo.getBinContent(this.nbinsx+1), 'entries'));\n\n if (print_integral > 0)\n stat.addText('Integral = ' + stat.format(data.integral,'entries'));\n\n if (print_skew > 0)\n stat.addText('Skew = ');\n\n if (print_kurt > 0)\n stat.addText('Kurt = ');\n\n return true;\n }\n\n /** @summary Draw histogram as bars */\n async drawBars(handle, funcs, width, height) {\n\n this.createG(true);\n\n let left = handle.i1, right = handle.i2, di = handle.stepi,\n pmain = this.getFramePainter(),\n histo = this.getHisto(), xaxis = this.getAxis('x'),\n i, x1, x2, grx1, grx2, y, gry1, gry2, w,\n bars = '', barsl = '', barsr = '';\n\n gry2 = pmain.swap_xy ? 0 : height;\n if (Number.isFinite(this.options.BaseLine))\n if (this.options.BaseLine >= funcs.scale_ymin)\n gry2 = Math.round(funcs.gry(this.options.BaseLine));\n\n for (i = left; i < right; i += di) {\n x1 = xaxis.GetBinCoord(i);\n x2 = xaxis.GetBinCoord(i+di);\n\n if (funcs.logx && (x2 <= 0)) continue;\n\n grx1 = Math.round(funcs.grx(x1));\n grx2 = Math.round(funcs.grx(x2));\n\n y = histo.getBinContent(i+1);\n if (funcs.logy && (y < funcs.scale_ymin)) continue;\n gry1 = Math.round(funcs.gry(y));\n\n w = grx2 - grx1;\n grx1 += Math.round(this.options.BarOffset*w);\n w = Math.round(this.options.BarWidth*w);\n\n if (pmain.swap_xy)\n bars += `M${gry2},${grx1}h${gry1-gry2}v${w}h${gry2-gry1}z`;\n else\n bars += `M${grx1},${gry1}h${w}v${gry2-gry1}h${-w}z`;\n\n if (this.options.BarStyle > 0) {\n grx2 = grx1 + w;\n w = Math.round(w / 10);\n if (pmain.swap_xy) {\n barsl += `M${gry2},${grx1}h${gry1-gry2}v${w}h${gry2-gry1}z`;\n barsr += `M${gry2},${grx2}h${gry1-gry2}v${-w}h${gry2-gry1}z`;\n } else {\n barsl += `M${grx1},${gry1}h${w}v${gry2-gry1}h${-w}z`;\n barsr += `M${grx2},${gry1}h${-w}v${gry2-gry1}h${w}z`;\n }\n }\n }\n\n if (this.fillatt.empty()) this.fillatt.setSolidColor('blue');\n\n if (bars)\n this.draw_g.append('svg:path')\n .attr('d', bars)\n .call(this.fillatt.func);\n\n if (barsl)\n this.draw_g.append('svg:path')\n .attr('d', barsl)\n .call(this.fillatt.func)\n .style('fill', d3_rgb(this.fillatt.color).brighter(0.5).formatHex());\n\n if (barsr)\n this.draw_g.append('svg:path')\n .attr('d', barsr)\n .call(this.fillatt.func)\n .style('fill', d3_rgb(this.fillatt.color).darker(0.5).formatHex());\n\n return true;\n }\n\n /** @summary Draw histogram as filled errors */\n async drawFilledErrors(handle, funcs /*, width, height*/) {\n this.createG(true);\n\n let left = handle.i1, right = handle.i2, di = handle.stepi,\n histo = this.getHisto(), xaxis = this.getAxis('x'),\n i, x, grx, y, yerr, gry1, gry2,\n bins1 = [], bins2 = [];\n\n for (i = left; i < right; i += di) {\n x = xaxis.GetBinCoord(i+0.5);\n if (funcs.logx && (x <= 0)) continue;\n grx = Math.round(funcs.grx(x));\n\n y = histo.getBinContent(i+1);\n yerr = histo.getBinError(i+1);\n if (funcs.logy && (y-yerr < funcs.scale_ymin)) continue;\n\n gry1 = Math.round(funcs.gry(y + yerr));\n gry2 = Math.round(funcs.gry(y - yerr));\n\n bins1.push({grx: grx, gry: gry1});\n bins2.unshift({grx: grx, gry: gry2});\n }\n\n let kind = (this.options.ErrorKind === 4) ? 'bezier' : 'line',\n path1 = buildSvgPath(kind, bins1),\n path2 = buildSvgPath('L'+kind, bins2);\n\n if (this.fillatt.empty()) this.fillatt.setSolidColor('blue');\n\n this.draw_g.append('svg:path')\n .attr('d', path1.path + path2.path + 'Z')\n .call(this.fillatt.func);\n\n return true;\n }\n\n /** @summary Draw 1D histogram as SVG */\n async draw1DBins() {\n\n let pmain = this.getFramePainter(),\n rect = pmain.getFrameRect();\n\n if (!this.draw_content || (rect.width <= 0) || (rect.height <= 0)) {\n this.removeG()\n return false;\n }\n\n this.createHistDrawAttributes();\n\n let handle = this.prepareDraw({ extra: 1, only_indexes: true }),\n funcs = pmain.getGrFuncs(this.options.second_x, this.options.second_y);\n\n if (this.options.Bar)\n return this.drawBars(handle, funcs, rect.width, rect.height);\n\n if ((this.options.ErrorKind === 3) || (this.options.ErrorKind === 4))\n return this.drawFilledErrors(handle, funcs, rect.width, rect.height);\n\n return this.drawHistBins(handle, funcs, rect.width, rect.height);\n }\n\n /** @summary Draw histogram bins */\n async drawHistBins(handle, funcs, width, height) {\n this.createG(true);\n\n let options = this.options,\n left = handle.i1,\n right = handle.i2,\n di = handle.stepi,\n histo = this.getHisto(),\n want_tooltip = !isBatchMode() && settings.Tooltip,\n xaxis = this.getAxis('x'),\n res = '', lastbin = false,\n startx, currx, curry, x, grx, y, gry, curry_min, curry_max, prevy, prevx, i, bestimin, bestimax,\n exclude_zero = !options.Zero,\n show_errors = options.Error,\n show_markers = options.Mark,\n show_line = options.Line,\n show_text = options.Text,\n path_fill = null, path_err = null, path_marker = null, path_line = null,\n hints_err = null,\n endx = '', endy = '', dend = 0, my, yerr1, yerr2, bincont, binerr, mx1, mx2, midx,\n text_font;\n\n if (show_errors && !show_markers && (this.v7EvalAttr('marker_style',1) > 1))\n show_markers = true;\n\n if (options.ErrorKind === 2) {\n if (this.fillatt.empty()) show_markers = true;\n else path_fill = '';\n } else if (options.Error) {\n path_err = '';\n hints_err = want_tooltip ? '' : null;\n }\n\n if (show_line) path_line = '';\n\n if (show_markers) {\n // draw markers also when e2 option was specified\n this.createv7AttMarker();\n if (this.markeratt.size > 0) {\n // simply use relative move from point, can optimize in the future\n path_marker = '';\n this.markeratt.resetPos();\n } else {\n show_markers = false;\n }\n }\n\n if (show_text) {\n text_font = this.v7EvalFont('text', { size: 20, color: 'black', align: 22 });\n\n if (!text_font.angle && !options.TextKind) {\n let space = width / (right - left + 1);\n if (space < 3 * text_font.size) {\n text_font.setAngle(270);\n text_font.setSize(Math.round(space*0.7));\n }\n }\n\n this.startTextDrawing(text_font, 'font');\n }\n\n // if there are too many points, exclude many vertical drawings at the same X position\n // instead define min and max value and made min-max drawing\n let use_minmax = ((right-left) > 3*width);\n\n if (options.ErrorKind === 1) {\n let lw = this.lineatt.width + gStyle.fEndErrorSize;\n endx = `m0,${lw}v${-2*lw}m0,${lw}`;\n endy = `m${lw},0h${-2*lw}m${lw},0`;\n dend = Math.floor((this.lineatt.width-1)/2);\n }\n\n let draw_markers = show_errors || show_markers;\n\n if (draw_markers || show_text || show_line) use_minmax = true;\n\n let draw_bin = besti => {\n bincont = histo.getBinContent(besti+1);\n if (!exclude_zero || (bincont !== 0)) {\n mx1 = Math.round(funcs.grx(xaxis.GetBinCoord(besti)));\n mx2 = Math.round(funcs.grx(xaxis.GetBinCoord(besti+di)));\n midx = Math.round((mx1+mx2)/2);\n my = Math.round(funcs.gry(bincont));\n yerr1 = yerr2 = 20;\n if (show_errors) {\n binerr = histo.getBinError(besti+1);\n yerr1 = Math.round(my - funcs.gry(bincont + binerr)); // up\n yerr2 = Math.round(funcs.gry(bincont - binerr) - my); // down\n }\n\n if (show_text && (bincont !== 0)) {\n let lbl = (bincont === Math.round(bincont)) ? bincont.toString() : floatToString(bincont, gStyle.fPaintTextFormat);\n\n if (text_font.angle)\n this.drawText({ align: 12, x: midx, y: Math.round(my - 2 - text_font.size / 5), text: lbl, latex: 0 });\n else\n this.drawText({ x: Math.round(mx1 + (mx2 - mx1) * 0.1), y: Math.round(my - 2 - text_font.size), width: Math.round((mx2 - mx1) * 0.8), height: text_font.size, text: lbl, latex: 0 });\n }\n\n if (show_line && (path_line !== null))\n path_line += ((path_line.length === 0) ? 'M' : 'L') + midx + ',' + my;\n\n if (draw_markers) {\n if ((my >= -yerr1) && (my <= height + yerr2)) {\n if (path_fill !== null)\n path_fill += `M${mx1},${my-yerr1}h${mx2-mx1}v${yerr1+yerr2+1}h${mx1-mx2}z`;\n if (path_marker !== null)\n path_marker += this.markeratt.create(midx, my);\n if (path_err !== null) {\n let edx = 5;\n if (this.options.errorX > 0) {\n edx = Math.round((mx2-mx1)*this.options.errorX);\n let mmx1 = midx - edx, mmx2 = midx + edx;\n path_err += `M${mmx1+dend},${my}${endx}h${mmx2-mmx1-2*dend}${endx}`;\n }\n path_err += `M${midx},${my-yerr1+dend}${endy}v${yerr1+yerr2-2*dend}${endy}`;\n if (hints_err !== null)\n hints_err += `M${midx-edx},${my-yerr1}h${2*edx}v${yerr1+yerr2}h${-2*edx}z`;\n }\n }\n }\n }\n };\n\n for (i = left; i <= right; i += di) {\n\n x = xaxis.GetBinCoord(i);\n\n if (funcs.logx && (x <= 0)) continue;\n\n grx = Math.round(funcs.grx(x));\n\n lastbin = (i > right - di);\n\n if (lastbin && (left < right)) {\n gry = curry;\n } else {\n y = histo.getBinContent(i+1);\n gry = Math.round(funcs.gry(y));\n }\n\n if (res.length === 0) {\n bestimin = bestimax = i;\n prevx = startx = currx = grx;\n prevy = curry_min = curry_max = curry = gry;\n res = 'M'+currx+','+curry;\n } else\n if (use_minmax) {\n if ((grx === currx) && !lastbin) {\n if (gry < curry_min) bestimax = i; else\n if (gry > curry_max) bestimin = i;\n curry_min = Math.min(curry_min, gry);\n curry_max = Math.max(curry_max, gry);\n curry = gry;\n } else {\n\n if (draw_markers || show_text || show_line) {\n if (bestimin === bestimax) { draw_bin(bestimin); } else\n if (bestimin < bestimax) { draw_bin(bestimin); draw_bin(bestimax); } else {\n draw_bin(bestimax); draw_bin(bestimin);\n }\n }\n\n // when several points as same X differs, need complete logic\n if (!draw_markers && ((curry_min !== curry_max) || (prevy !== curry_min))) {\n\n if (prevx !== currx)\n res += 'h'+(currx-prevx);\n\n if (curry === curry_min) {\n if (curry_max !== prevy)\n res += 'v' + (curry_max - prevy);\n if (curry_min !== curry_max)\n res += 'v' + (curry_min - curry_max);\n } else {\n if (curry_min !== prevy)\n res += 'v' + (curry_min - prevy);\n if (curry_max !== curry_min)\n res += 'v' + (curry_max - curry_min);\n if (curry !== curry_max)\n res += 'v' + (curry - curry_max);\n }\n\n prevx = currx;\n prevy = curry;\n }\n\n if (lastbin && (prevx !== grx))\n res += 'h'+(grx-prevx);\n\n bestimin = bestimax = i;\n curry_min = curry_max = curry = gry;\n currx = grx;\n }\n } else\n if ((gry !== curry) || lastbin) {\n if (grx !== currx) res += 'h'+(grx-currx);\n if (gry !== curry) res += 'v'+(gry-curry);\n curry = gry;\n currx = grx;\n }\n }\n\n let close_path = '',\n fill_for_interactive = !isBatchMode() && this.fillatt.empty() && options.Hist && settings.Tooltip && !draw_markers && !show_line;\n if (!this.fillatt.empty() || fill_for_interactive) {\n let h0 = height + 3;\n if (fill_for_interactive) {\n let gry0 = Math.round(funcs.gry(0));\n if (gry0 <= 0)\n h0 = -3;\n else if (gry0 < height)\n h0 = gry0;\n }\n close_path = `L${currx},${h0}H${startx}Z`;\n if (res) res += close_path;\n }\n\n if (draw_markers || show_line) {\n if (path_fill)\n this.draw_g.append('svg:path')\n .attr('d', path_fill)\n .call(this.fillatt.func);\n\n if (path_err)\n this.draw_g.append('svg:path')\n .attr('d', path_err)\n .call(this.lineatt.func);\n\n if (hints_err)\n this.draw_g.append('svg:path')\n .attr('d', hints_err)\n .style('fill', 'none')\n .style('pointer-events', isBatchMode() ? null : 'visibleFill');\n\n if (path_line) {\n if (!this.fillatt.empty())\n this.draw_g.append('svg:path')\n .attr('d', options.Fill ? (path_line + close_path) : res)\n .call(this.fillatt.func);\n\n this.draw_g.append('svg:path')\n .attr('d', path_line)\n .style('fill', 'none')\n .call(this.lineatt.func);\n }\n\n if (path_marker)\n this.draw_g.append('svg:path')\n .attr('d', path_marker)\n .call(this.markeratt.func);\n\n } else if (res && options.Hist) {\n this.draw_g.append('svg:path')\n .attr('d', res)\n .style('stroke-linejoin','miter')\n .call(this.lineatt.func)\n .call(this.fillatt.func);\n }\n\n return show_text ? this.finishTextDrawing() : true;\n }\n\n /** @summary Provide text information (tooltips) for histogram bin */\n getBinTooltips(bin) {\n let tips = [],\n name = this.getObjectHint(),\n pmain = this.getFramePainter(),\n histo = this.getHisto(),\n xaxis = this.getAxis('x'),\n di = this.isDisplayItem() ? histo.stepx : 1,\n x1 = xaxis.GetBinCoord(bin),\n x2 = xaxis.GetBinCoord(bin+di),\n cont = histo.getBinContent(bin+1),\n xlbl = this.getAxisBinTip('x', bin, di);\n\n if (name) tips.push(name);\n\n if (this.options.Error || this.options.Mark) {\n tips.push('x = ' + xlbl, 'y = ' + pmain.axisAsText('y', cont));\n if (this.options.Error) {\n if (xlbl[0] == '[') tips.push('error x = ' + ((x2 - x1) / 2).toPrecision(4));\n tips.push('error y = ' + histo.getBinError(bin + 1).toPrecision(4));\n }\n } else {\n tips.push(`bin = ${bin+1}`);\n tips.push('x = ' + xlbl);\n if (histo['$baseh']) cont -= histo['$baseh'].getBinContent(bin+1);\n let lbl = 'entries = ' + (di > 1 ? '~' : '');\n if (cont === Math.round(cont))\n tips.push(lbl + cont);\n else\n tips.push(lbl + floatToString(cont, gStyle.fStatFormat));\n }\n\n return tips;\n }\n\n /** @summary Process tooltip event */\n processTooltipEvent(pnt) {\n if (!pnt || !this.draw_content || this.options.Mode3D || !this.draw_g) {\n if (this.draw_g)\n this.draw_g.select('.tooltip_bin').remove();\n return null;\n }\n\n let pmain = this.getFramePainter(),\n funcs = pmain.getGrFuncs(this.options.second_x, this.options.second_y),\n width = pmain.getFrameWidth(),\n height = pmain.getFrameHeight(),\n histo = this.getHisto(), xaxis = this.getAxis('x'),\n findbin = null, show_rect,\n grx1, midx, grx2, gry1, midy, gry2, gapx = 2,\n left = this.getSelectIndex('x', 'left', -1),\n right = this.getSelectIndex('x', 'right', 2),\n l = left, r = right;\n\n function GetBinGrX(i) {\n let xx = xaxis.GetBinCoord(i);\n return (funcs.logx && (xx <= 0)) ? null : funcs.grx(xx);\n }\n\n function GetBinGrY(i) {\n let yy = histo.getBinContent(i + 1);\n if (funcs.logy && (yy < funcs.scale_ymin))\n return funcs.swap_xy ? -1000 : 10*height;\n return Math.round(funcs.gry(yy));\n }\n\n let pnt_x = funcs.swap_xy ? pnt.y : pnt.x,\n pnt_y = funcs.swap_xy ? pnt.x : pnt.y;\n\n while (l < r-1) {\n let m = Math.round((l+r)*0.5),\n xx = GetBinGrX(m);\n if ((xx === null) || (xx < pnt_x - 0.5)) {\n if (funcs.swap_xy) r = m; else l = m;\n } else if (xx > pnt_x + 0.5) {\n if (funcs.swap_xy) l = m; else r = m;\n } else { l++; r--; }\n }\n\n findbin = r = l;\n grx1 = GetBinGrX(findbin);\n\n if (funcs.swap_xy) {\n while ((l>left) && (GetBinGrX(l-1) < grx1 + 2)) --l;\n while ((r grx1 - 2)) ++r;\n } else {\n while ((l>left) && (GetBinGrX(l-1) > grx1 - 2)) --l;\n while ((r height/10)\n findbin = Math.round(l + (r-l) / height * pnt_y);\n\n grx1 = GetBinGrX(findbin);\n }\n\n grx1 = Math.round(grx1);\n grx2 = Math.round(GetBinGrX(findbin+1));\n\n if (this.options.Bar) {\n let w = grx2 - grx1;\n grx1 += Math.round(this.options.BarOffset*w);\n grx2 = grx1 + Math.round(this.options.BarWidth*w);\n }\n\n if (grx1 > grx2)\n [grx1, grx2] = [grx2, grx1];\n\n midx = Math.round((grx1 + grx2)/2);\n\n midy = gry1 = gry2 = GetBinGrY(findbin);\n\n if (this.options.Bar) {\n show_rect = true;\n\n gapx = 0;\n\n gry1 = Math.round(funcs.gry(((this.options.BaseLine!==false) && (this.options.BaseLine > funcs.scale_ymin)) ? this.options.BaseLine : funcs.scale_ymin));\n\n if (gry1 > gry2)\n [gry1, gry2] = [gry2, gry1];\n\n if (!pnt.touch && (pnt.nproc === 1))\n if ((pnt_y < gry1) || (pnt_y > gry2)) findbin = null;\n\n } else if (this.options.Error || this.options.Mark) {\n\n show_rect = true;\n\n let msize = 3;\n if (this.markeratt) msize = Math.max(msize, this.markeratt.getFullSize());\n\n if (this.options.Error) {\n let cont = histo.getBinContent(findbin+1),\n binerr = histo.getBinError(findbin+1);\n\n gry1 = Math.round(funcs.gry(cont + binerr)); // up\n gry2 = Math.round(funcs.gry(cont - binerr)); // down\n\n let dx = (grx2-grx1)*this.options.errorX;\n grx1 = Math.round(midx - dx);\n grx2 = Math.round(midx + dx);\n }\n\n // show at least 6 pixels as tooltip rect\n if (grx2 - grx1 < 2*msize) { grx1 = midx-msize; grx2 = midx+msize; }\n\n gry1 = Math.min(gry1, midy - msize);\n gry2 = Math.max(gry2, midy + msize);\n\n if (!pnt.touch && (pnt.nproc === 1))\n if ((pnt_ygry2)) findbin = null;\n\n } else if (this.options.Line) {\n\n show_rect = false;\n\n } else {\n\n // if histogram alone, use old-style with rects\n // if there are too many points at pixel, use circle\n show_rect = (pnt.nproc === 1) && (right-left < width);\n\n if (show_rect) {\n gry2 = height;\n\n if (!this.fillatt.empty()) {\n gry2 = Math.min(height, Math.max(0, Math.round(funcs.gry(0))));\n if (gry2 < gry1)\n [gry1, gry2] = [gry2, gry1];\n }\n\n // for mouse events pointer should be between y1 and y2\n if (((pnt.y < gry1) || (pnt.y > gry2)) && !pnt.touch) findbin = null;\n }\n }\n\n if (findbin !== null) {\n // if bin on boundary found, check that x position is ok\n if ((findbin === left) && (grx1 > pnt_x + gapx)) findbin = null; else\n if ((findbin === right-1) && (grx2 < pnt_x - gapx)) findbin = null; else\n // if bars option used check that bar is not match\n if ((pnt_x < grx1 - gapx) || (pnt_x > grx2 + gapx)) findbin = null; else\n // exclude empty bin if empty bins suppressed\n if (!this.options.Zero && (histo.getBinContent(findbin+1) === 0)) findbin = null;\n }\n\n let ttrect = this.draw_g.select('.tooltip_bin');\n\n if ((findbin === null) || ((gry2 <= 0) || (gry1 >= height))) {\n ttrect.remove();\n return null;\n }\n\n let res = { name: 'histo', title: histo.fTitle,\n x: midx, y: midy, exact: true,\n color1: this.lineatt ? this.lineatt.color : 'green',\n color2: this.fillatt ? this.fillatt.getFillColorAlt('blue') : 'blue',\n lines: this.getBinTooltips(findbin) };\n\n if (pnt.disabled) {\n // case when tooltip should not highlight bin\n\n ttrect.remove();\n res.changed = true;\n } else if (show_rect) {\n\n if (ttrect.empty())\n ttrect = this.draw_g.append('svg:rect')\n .attr('class','tooltip_bin h1bin')\n .style('pointer-events','none');\n\n res.changed = ttrect.property('current_bin') !== findbin;\n\n if (res.changed)\n ttrect.attr('x', pmain.swap_xy ? gry1 : grx1)\n .attr('width', pmain.swap_xy ? gry2-gry1 : grx2-grx1)\n .attr('y', pmain.swap_xy ? grx1 : gry1)\n .attr('height', pmain.swap_xy ? grx2-grx1 : gry2-gry1)\n .style('opacity', '0.3')\n .property('current_bin', findbin);\n\n res.exact = (Math.abs(midy - pnt_y) <= 5) || ((pnt_y>=gry1) && (pnt_y<=gry2));\n\n res.menu = res.exact; // one could show context menu\n // distance to middle point, use to decide which menu to activate\n res.menu_dist = Math.sqrt((midx-pnt_x)**2 + (midy-pnt_y)**2);\n\n } else {\n let radius = this.lineatt.width + 3;\n\n if (ttrect.empty())\n ttrect = this.draw_g.append('svg:circle')\n .attr('class','tooltip_bin')\n .style('pointer-events','none')\n .attr('r', radius)\n .call(this.lineatt.func)\n .call(this.fillatt.func);\n\n res.exact = (Math.abs(midx - pnt.x) <= radius) && (Math.abs(midy - pnt.y) <= radius);\n\n res.menu = res.exact; // show menu only when mouse pointer exactly over the histogram\n res.menu_dist = Math.sqrt((midx-pnt.x)**2 + (midy-pnt.y)**2);\n\n res.changed = ttrect.property('current_bin') !== findbin;\n\n if (res.changed)\n ttrect.attr('cx', midx)\n .attr('cy', midy)\n .property('current_bin', findbin);\n }\n\n if (res.changed)\n res.user_info = { obj: histo, name: 'histo',\n bin: findbin, cont: histo.getBinContent(findbin+1),\n grx: midx, gry: midy };\n\n return res;\n }\n\n /** @summary Fill histogram context menu */\n fillHistContextMenu(menu) {\n\n menu.add('Auto zoom-in', () => this.autoZoom());\n\n let opts = this.getSupportedDrawOptions();\n\n menu.addDrawMenu('Draw with', opts, arg => {\n if (arg === 'inspect')\n return this.showInspector();\n\n this.decodeOptions(arg); // obsolete, should be implemented differently\n\n if (this.options.need_fillcol && this.fillatt && this.fillatt.empty())\n this.fillatt.change(5,1001);\n\n // redraw all objects\n this.interactiveRedraw('pad', 'drawopt');\n });\n }\n\n /** @summary Perform automatic zoom inside non-zero region of histogram */\n autoZoom() {\n let left = this.getSelectIndex('x', 'left', -1),\n right = this.getSelectIndex('x', 'right', 1),\n dist = right - left, histo = this.getHisto(), xaxis = this.getAxis('x');\n\n if (dist == 0) return;\n\n // first find minimum\n let min = histo.getBinContent(left + 1);\n for (let indx = left; indx < right; ++indx)\n min = Math.min(min, histo.getBinContent(indx+1));\n if (min > 0) return; // if all points positive, no chance for autoscale\n\n while ((left < right) && (histo.getBinContent(left+1) <= min)) ++left;\n while ((left < right) && (histo.getBinContent(right) <= min)) --right;\n\n // if singular bin\n if ((left === right-1) && (left > 2) && (right < this.nbinsx-2)) {\n --left; ++right;\n }\n\n if ((right - left < dist) && (left < right))\n return this.getFramePainter().zoom(xaxis.GetBinCoord(left), xaxis.GetBinCoord(right));\n }\n\n /** @summary Checks if it makes sense to zoom inside specified axis range */\n canZoomInside(axis,min,max) {\n let xaxis = this.getAxis('x');\n\n if ((axis == 'x') && (xaxis.FindBin(max,0.5) - xaxis.FindBin(min,0) > 1)) return true;\n\n if ((axis == 'y') && (Math.abs(max-min) > Math.abs(this.ymax-this.ymin)*1e-6)) return true;\n\n return false;\n }\n\n /** @summary Call appropriate draw function */\n async callDrawFunc(reason) {\n let main = this.getFramePainter();\n\n if (main && (main.mode3d !== this.options.Mode3D) && !this.isMainPainter())\n this.options.Mode3D = main.mode3d;\n\n return this.options.Mode3D ? this.draw3D(reason) : this.draw2D(reason);\n }\n\n /** @summary Draw in 2d */\n async draw2D(reason) {\n this.clear3DScene();\n\n return this.drawFrameAxes().then(res => {\n return res ? this.drawingBins(reason) : false;\n }).then(res => {\n if (res)\n return this.draw1DBins().then(() => this.addInteractivity());\n }).then(() => this);\n }\n\n /** @summary Draw in 3d */\n async draw3D(reason) {\n console.log('3D drawing is disabled, load ./hist/RH1Painter.mjs');\n return this.draw2D(reason);\n }\n\n /** @summary Readraw histogram */\n async redraw(reason) {\n return this.callDrawFunc(reason);\n }\n\n static async _draw(painter, opt) {\n return ensureRCanvas(painter).then(() => {\n\n painter.setAsMainPainter();\n\n painter.options = { Hist: false, Bar: false, BarStyle: 0,\n Error: false, ErrorKind: -1, errorX: gStyle.fErrorX,\n Zero: false, Mark: false,\n Line: false, Fill: false, Lego: 0, Surf: 0,\n Text: false, TextAngle: 0, TextKind: '', AutoColor: 0,\n BarOffset: 0., BarWidth: 1., BaseLine: false, Mode3D: false };\n\n let d = new DrawOptions(opt);\n if (d.check('R3D_', true))\n painter.options.Render3D = constants.Render3D.fromString(d.part.toLowerCase());\n\n let kind = painter.v7EvalAttr('kind', 'hist'),\n sub = painter.v7EvalAttr('sub', 0),\n has_main = !!painter.getMainPainter(),\n o = painter.options;\n\n o.Text = painter.v7EvalAttr('drawtext', false);\n o.BarOffset = painter.v7EvalAttr('baroffset', 0.);\n o.BarWidth = painter.v7EvalAttr('barwidth', 1.);\n o.second_x = has_main && painter.v7EvalAttr('secondx', false);\n o.second_y = has_main && painter.v7EvalAttr('secondy', false);\n\n switch(kind) {\n case 'bar': o.Bar = true; o.BarStyle = sub; break;\n case 'err': o.Error = true; o.ErrorKind = sub; break;\n case 'p': o.Mark = true; break;\n case 'l': o.Line = true; break;\n case 'lego': o.Lego = sub > 0 ? 10+sub : 12; o.Mode3D = true; break;\n default: o.Hist = true;\n }\n\n painter.scanContent();\n\n return painter.callDrawFunc();\n });\n }\n\n /** @summary draw RH1 object */\n static async draw(dom, histo, opt) {\n return RH1Painter._draw(new RH1Painter(dom, histo), opt);\n }\n\n} // class RH1Painter\n\nexport { RH1Painter };\n","import { settings, gStyle } from '../core.mjs';\nimport { RH1Painter as RH1Painter2D } from '../hist2d/RH1Painter.mjs';\nimport { RAxisPainter } from '../gpad/RAxisPainter.mjs';\nimport { assignFrame3DMethods, drawBinsLego } from './hist3d.mjs';\n\n\nclass RH1Painter extends RH1Painter2D {\n\n /** @summary Draw 1-D histogram in 3D mode */\n draw3D(reason) {\n\n this.mode3d = true;\n\n let main = this.getFramePainter(), // who makes axis drawing\n is_main = this.isMainPainter(), // is main histogram\n zmult = 1 + 2*gStyle.fHistTopMargin,\n pr = Promise.resolve(this);\n\n if (reason == 'resize') {\n if (is_main && main.resize3D()) main.render3D();\n return pr;\n }\n\n this.deleteAttr();\n\n this.scanContent(true); // may be required for axis drawings\n\n if (is_main) {\n assignFrame3DMethods(main);\n pr = main.create3DScene(this.options.Render3D).then(() => {\n main.setAxesRanges(this.getAxis('x'), this.xmin, this.xmax, null, this.ymin, this.ymax, null, 0, 0);\n main.set3DOptions(this.options);\n main.drawXYZ(main.toplevel, RAxisPainter, { use_y_for_z: true, zmult, zoom: settings.Zooming, ndim: 1, draw: true, v7: true });\n });\n }\n\n if (!main.mode3d)\n return pr;\n\n return pr.then(() => this.drawingBins(reason)).then(() => {\n\n // called when bins received from server, must be reentrant\n let main = this.getFramePainter();\n\n drawBinsLego(this, true);\n this.updatePaletteDraw();\n main.render3D();\n main.addKeysHandler();\n return this;\n });\n }\n\n /** @summary draw RH1 object */\n static async draw(dom, histo, opt) {\n return RH1Painter._draw(new RH1Painter(dom, histo), opt);\n }\n\n} // class RH1Painter\n\nexport { RH1Painter };\n\n"],"x_google_ignoreList":[0,1]} \ No newline at end of file diff --git a/docs/928.a46951b729c76312.js b/docs/625.b2df831fc47ab055.js similarity index 96% rename from docs/928.a46951b729c76312.js rename to docs/625.b2df831fc47ab055.js index 5cdb3e32e..42c2a41fc 100644 --- a/docs/928.a46951b729c76312.js +++ b/docs/625.b2df831fc47ab055.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[928],{5928:(L,S,v)=>{v.r(S),v.d(S,{RHistStatsPainter:()=>b,RLegendPainter:()=>T,RPavePainter:()=>k,RPaveTextPainter:()=>y});var c=v(5368),x=v(1773),C=v(5611),R=v(6528),E=v(6717),O=v(2989);class k extends R.p{drawContent(){var t=this;return(0,c.Z)(function*(){return t})()}drawPave(){var t=this;return(0,c.Z)(function*(){let e=t.getPadPainter().getPadRect(),i=t.getFramePainter();t.onFrame=i&&t.v7EvalAttr("onFrame",!0),t.corner=t.v7EvalAttr("corner",2);let a=t.v7EvalAttr("visible",!0),r=t.v7EvalLength("offsetX",e.width,.02),o=t.v7EvalLength("offsetY",e.height,.02),n=t.v7EvalLength("width",e.width,.3),s=t.v7EvalLength("height",e.height,.3);if(t.createG(),t.draw_g.classed("most_upper_primitives",!0),!a)return t;t.createv7AttLine("border_"),t.createv7AttFill();let d=0,f=0,_=t.onFrame?i.getFrameRect():e;switch(t.corner){case 1:d=_.x+r,f=_.y+o;break;case 3:d=_.x+r,f=_.y+_.height-o-s;break;case 4:d=_.x+_.width-r-n,f=_.y+_.height-o-s;break;default:d=_.x+_.width-r-n,f=_.y+o}return t.draw_g.attr("transform",`translate(${d},${f})`),t.draw_g.append("svg:rect").attr("x",0).attr("width",n).attr("y",0).attr("height",s).call(t.lineatt.func).call(t.fillatt.func),t.pave_width=n,t.pave_height=s,t.drawContent().then(()=>((0,x.isBatchMode)()||(x.settings.ContextMenu&&t.paveContextMenu&&t.draw_g.on("contextmenu",h=>t.paveContextMenu(h)),(0,O.uI)(t,{x:d,y:f,width:n,height:s,minwidth:20,minheight:20,redraw:h=>t.sizeChanged(h)})),t))})()}sizeChanged(t){this.pave_width=t.width,this.pave_height=t.height;let e=t.x,i=t.y,a=this.getPadPainter().getPadRect(),r=this.onFrame?this.getFramePainter().getFrameRect():a,o=0,n=0,s={};switch(this.corner){case 1:o=e-r.x,n=i-r.y;break;case 3:o=e-r.x,n=r.y+r.height-i-this.pave_height;break;case 4:o=r.x+r.width-e-this.pave_width,n=r.y+r.height-i-this.pave_height;break;default:o=r.x+r.width-e-this.pave_width,n=i-r.y}this.v7AttrChange(s,"offsetX",o/a.width),this.v7AttrChange(s,"offsetY",n/a.height),this.v7AttrChange(s,"width",this.pave_width/a.width),this.v7AttrChange(s,"height",this.pave_height/a.height),this.v7SendAttrChanges(s,!1),this.draw_g.select("rect").attr("width",this.pave_width).attr("height",this.pave_height),this.drawContent()}redraw(){var t=this;return(0,c.Z)(function*(){return t.drawPave()})()}static draw(t,e,i){return(0,c.Z)(function*(){let a=new k(t,e,i,"pave");return(0,E.ensureRCanvas)(a,!1).then(()=>a.drawPave())})()}}class T extends k{drawContent(){var t=this;return(0,c.Z)(function*(){let e=t.getObject(),i=t.v7EvalFont("text",{size:12,color:"black",align:22}),a=t.pave_width,r=t.pave_height,o=e.fEntries.length,n=t.getPadPainter();if(e.fTitle&&o++,!o||!n)return t;let s=r/o,d=0,f=.02*a;i.setSize(r/(1.2*o)),t.startTextDrawing(i,"font"),e.fTitle&&(t.drawText({latex:1,width:a-2*f,height:s,x:f,y:d,text:e.fTitle}),d+=s);for(let _=0;_a.drawPave())})()}}class y extends k{drawContent(){let t=this.getObject(),e=this.v7EvalFont("text",{size:12,color:"black",align:22}),i=this.pave_width,a=this.pave_height,r=t.fText.length;if(!r)return;let o=a/r,n=0,s=.02*i;e.setSize(a/(1.2*r)),this.startTextDrawing(e,"font");for(let d=0;da.drawPave())})()}}class b extends k{clearStat(){this.stats_lines=[]}addText(t){this.stats_lines.push(t)}updateStatistic(t){this.stats_lines=t.lines,this.drawStatistic(this.stats_lines)}fillStatistic(){if(this.getPadPainter()?._fast_drawing)return!1;let e=this.getObject();if(void 0!==e.fLines)return this.stats_lines=e.fLines,delete e.fLines,!0;if(this.v7OfflineMode()){let i=this.getMainPainter();return!!(0,x.isFunc)(i?.fillStatistic)&&i.fillStatistic(this,x.gStyle.fOptStat,x.gStyle.fOptFit)}return void 0!==this.stats_lines}format(t,e){switch(e||(e="stat"),e){case"stat":e=x.gStyle.fStatFormat;break;case"fit":e=x.gStyle.fFitFormat;break;case"entries":if(Math.abs(t)<1e9&&Math.round(t)==t)return t.toFixed(0);e="14.7g";break;case"last":e=this.lastformat}let i=(0,C.Ee)(t,e||"6.4g",!0);return this.lastformat=i[1],i[0]}drawContent(){var t=this;return(0,c.Z)(function*(){return t.fillStatistic()?t.drawStatistic(t.stats_lines):t})()}changeMask(t){let e=this.getObject(),i=1<{let i=this.getObject(),a=this.changeMask.bind(this);e.add("header: StatBox");for(let r=0;re.show())}drawStatistic(t){var e=this;return(0,c.Z)(function*(){let i=e.v7EvalFont("stats_text",{size:12,color:"black",align:22}),a=0,r=0,o=0,n=e.pave_width,s=e.pave_height;if(!t)return e;let d=t.length;for(let l=0;l0&&(o=Math.max(o,P.length)),0==l||P.indexOf("|")<0)continue;0===a&&(a=l);let p=P.split("|");p.length>r&&(r=p.length)}let f=s/d,_=!1,h=.02*n,g=e.draw_g.select(".statlines");if(g.empty()?g=e.draw_g.append("svg:g").attr("class","statlines"):g.selectAll("*").remove(),i.setSize(s/(1.2*d)),e.startTextDrawing(i,"font",g),1==d)e.drawText({width:n,height:s,text:t[0],latex:1,draw_g:g});else for(let l=0;l=a){let p=t[l].split("|");for(let M=0;M0&&r>1){for(let l=a;le.updateStatistic(a))}return e.drawPave()})()}static draw(t,e,i){return(0,c.Z)(function*(){let a=new b(t,e,i,e);return(0,E.ensureRCanvas)(a,!1).then(()=>a.drawPave())})()}}}}]); -//# sourceMappingURL=928.a46951b729c76312.js.map \ No newline at end of file +"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[625],{3625:(L,S,v)=>{v.r(S),v.d(S,{RHistStatsPainter:()=>b,RLegendPainter:()=>T,RPavePainter:()=>k,RPaveTextPainter:()=>y});var c=v(4788),x=v(9542),C=v(3675),R=v(3029),E=v(9056),O=v(6116);class k extends R.p{drawContent(){var t=this;return(0,c.Z)(function*(){return t})()}drawPave(){var t=this;return(0,c.Z)(function*(){let e=t.getPadPainter().getPadRect(),i=t.getFramePainter();t.onFrame=i&&t.v7EvalAttr("onFrame",!0),t.corner=t.v7EvalAttr("corner",2);let a=t.v7EvalAttr("visible",!0),r=t.v7EvalLength("offsetX",e.width,.02),o=t.v7EvalLength("offsetY",e.height,.02),n=t.v7EvalLength("width",e.width,.3),s=t.v7EvalLength("height",e.height,.3);if(t.createG(),t.draw_g.classed("most_upper_primitives",!0),!a)return t;t.createv7AttLine("border_"),t.createv7AttFill();let d=0,f=0,_=t.onFrame?i.getFrameRect():e;switch(t.corner){case 1:d=_.x+r,f=_.y+o;break;case 3:d=_.x+r,f=_.y+_.height-o-s;break;case 4:d=_.x+_.width-r-n,f=_.y+_.height-o-s;break;default:d=_.x+_.width-r-n,f=_.y+o}return t.draw_g.attr("transform",`translate(${d},${f})`),t.draw_g.append("svg:rect").attr("x",0).attr("width",n).attr("y",0).attr("height",s).call(t.lineatt.func).call(t.fillatt.func),t.pave_width=n,t.pave_height=s,t.drawContent().then(()=>((0,x.isBatchMode)()||(x.settings.ContextMenu&&t.paveContextMenu&&t.draw_g.on("contextmenu",h=>t.paveContextMenu(h)),(0,O.uI)(t,{x:d,y:f,width:n,height:s,minwidth:20,minheight:20,redraw:h=>t.sizeChanged(h)})),t))})()}sizeChanged(t){this.pave_width=t.width,this.pave_height=t.height;let e=t.x,i=t.y,a=this.getPadPainter().getPadRect(),r=this.onFrame?this.getFramePainter().getFrameRect():a,o=0,n=0,s={};switch(this.corner){case 1:o=e-r.x,n=i-r.y;break;case 3:o=e-r.x,n=r.y+r.height-i-this.pave_height;break;case 4:o=r.x+r.width-e-this.pave_width,n=r.y+r.height-i-this.pave_height;break;default:o=r.x+r.width-e-this.pave_width,n=i-r.y}this.v7AttrChange(s,"offsetX",o/a.width),this.v7AttrChange(s,"offsetY",n/a.height),this.v7AttrChange(s,"width",this.pave_width/a.width),this.v7AttrChange(s,"height",this.pave_height/a.height),this.v7SendAttrChanges(s,!1),this.draw_g.select("rect").attr("width",this.pave_width).attr("height",this.pave_height),this.drawContent()}redraw(){var t=this;return(0,c.Z)(function*(){return t.drawPave()})()}static draw(t,e,i){return(0,c.Z)(function*(){let a=new k(t,e,i,"pave");return(0,E.ensureRCanvas)(a,!1).then(()=>a.drawPave())})()}}class T extends k{drawContent(){var t=this;return(0,c.Z)(function*(){let e=t.getObject(),i=t.v7EvalFont("text",{size:12,color:"black",align:22}),a=t.pave_width,r=t.pave_height,o=e.fEntries.length,n=t.getPadPainter();if(e.fTitle&&o++,!o||!n)return t;let s=r/o,d=0,f=.02*a;i.setSize(r/(1.2*o)),t.startTextDrawing(i,"font"),e.fTitle&&(t.drawText({latex:1,width:a-2*f,height:s,x:f,y:d,text:e.fTitle}),d+=s);for(let _=0;_a.drawPave())})()}}class y extends k{drawContent(){let t=this.getObject(),e=this.v7EvalFont("text",{size:12,color:"black",align:22}),i=this.pave_width,a=this.pave_height,r=t.fText.length;if(!r)return;let o=a/r,n=0,s=.02*i;e.setSize(a/(1.2*r)),this.startTextDrawing(e,"font");for(let d=0;da.drawPave())})()}}class b extends k{clearStat(){this.stats_lines=[]}addText(t){this.stats_lines.push(t)}updateStatistic(t){this.stats_lines=t.lines,this.drawStatistic(this.stats_lines)}fillStatistic(){if(this.getPadPainter()?._fast_drawing)return!1;let e=this.getObject();if(void 0!==e.fLines)return this.stats_lines=e.fLines,delete e.fLines,!0;if(this.v7OfflineMode()){let i=this.getMainPainter();return!!(0,x.isFunc)(i?.fillStatistic)&&i.fillStatistic(this,x.gStyle.fOptStat,x.gStyle.fOptFit)}return void 0!==this.stats_lines}format(t,e){switch(e||(e="stat"),e){case"stat":e=x.gStyle.fStatFormat;break;case"fit":e=x.gStyle.fFitFormat;break;case"entries":if(Math.abs(t)<1e9&&Math.round(t)==t)return t.toFixed(0);e="14.7g";break;case"last":e=this.lastformat}let i=(0,C.Ee)(t,e||"6.4g",!0);return this.lastformat=i[1],i[0]}drawContent(){var t=this;return(0,c.Z)(function*(){return t.fillStatistic()?t.drawStatistic(t.stats_lines):t})()}changeMask(t){let e=this.getObject(),i=1<{let i=this.getObject(),a=this.changeMask.bind(this);e.add("header: StatBox");for(let r=0;re.show())}drawStatistic(t){var e=this;return(0,c.Z)(function*(){let i=e.v7EvalFont("stats_text",{size:12,color:"black",align:22}),a=0,r=0,o=0,n=e.pave_width,s=e.pave_height;if(!t)return e;let d=t.length;for(let l=0;l0&&(o=Math.max(o,P.length)),0==l||P.indexOf("|")<0)continue;0===a&&(a=l);let p=P.split("|");p.length>r&&(r=p.length)}let f=s/d,_=!1,h=.02*n,g=e.draw_g.select(".statlines");if(g.empty()?g=e.draw_g.append("svg:g").attr("class","statlines"):g.selectAll("*").remove(),i.setSize(s/(1.2*d)),e.startTextDrawing(i,"font",g),1==d)e.drawText({width:n,height:s,text:t[0],latex:1,draw_g:g});else for(let l=0;l=a){let p=t[l].split("|");for(let M=0;M0&&r>1){for(let l=a;le.updateStatistic(a))}return e.drawPave()})()}static draw(t,e,i){return(0,c.Z)(function*(){let a=new b(t,e,i,e);return(0,E.ensureRCanvas)(a,!1).then(()=>a.drawPave())})()}}}}]); +//# sourceMappingURL=625.b2df831fc47ab055.js.map \ No newline at end of file diff --git a/docs/928.a46951b729c76312.js.map b/docs/625.b2df831fc47ab055.js.map similarity index 99% rename from docs/928.a46951b729c76312.js.map rename to docs/625.b2df831fc47ab055.js.map index cb023e827..71dd63e27 100644 --- a/docs/928.a46951b729c76312.js.map +++ b/docs/625.b2df831fc47ab055.js.map @@ -1 +1 @@ -{"version":3,"file":"928.a46951b729c76312.js","mappings":"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","names":["RPavePainter","RObjectPainter","drawContent","_this","drawPave","rect","_this2","getPadPainter","getPadRect","fp","getFramePainter","onFrame","v7EvalAttr","corner","visible","offsetx","v7EvalLength","width","offsety","height","pave_width","pave_height","createG","draw_g","classed","createv7AttLine","createv7AttFill","pave_x","pave_y","fr","getFrameRect","x","y","attr","append","call","lineatt","func","fillatt","then","isBatchMode","settings","paveContextMenu","on","evnt","addDragHandler","minwidth","minheight","redraw","d","sizeChanged","drag","this","changes","v7AttrChange","v7SendAttrChanges","select","_this3","static","dom","pave","opt","painter","ensureRCanvas","RLegendPainter","legend","_this4","getObject","textFont","v7EvalFont","size","color","align","nlines","fEntries","length","pp","fTitle","stepy","posy","margin_x","setSize","startTextDrawing","drawText","latex","text","i","objp","entry","w4","Math","round","fLabel","fDrawableId","findSnap","fDrawable","fIO","getDom","fLine","fFill","fMarker","createv7AttMarker","fError","markeratt","create","finishTextDrawing","RPaveTextPainter","pavetext","fText","undefined","RHistStatsPainter","clearStat","stats_lines","addText","line","push","updateStatistic","reply","lines","drawStatistic","fillStatistic","_fast_drawing","obj","fLines","v7OfflineMode","main","getMainPainter","isFunc","gStyle","format","value","fmt","abs","toFixed","lastformat","res","floatToString","_this5","changeMask","nbit","mask","fShowMask","statsContextMenu","preventDefault","stopPropagation","createMenu","menu","action","bind","add","n","addchk","fillObjectExecMenu","show","_this6","first_stat","num_cols","maxlen","j","max","indexOf","parts","split","has_head","text_g","empty","selectAll","remove","max_hlen","slice","args","_expected_width","_args","post_process","ready","scaleTextDrawing","result_width","__expected_width","lpath","nrow","ncol","reason","isStr","_this7","v7NormalMode","req","_typename","v7SubmitRequest","stats"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/hist/RPavePainter.mjs"],"sourcesContent":["import { settings, isBatchMode, isFunc, isStr, gStyle } from '../core.mjs';\nimport { floatToString } from '../base/BasePainter.mjs';\nimport { RObjectPainter } from '../base/RObjectPainter.mjs';\nimport { ensureRCanvas } from '../gpad/RCanvasPainter.mjs';\nimport { addDragHandler } from '../gpad/TFramePainter.mjs';\n\n\nconst ECorner = { kTopLeft: 1, kTopRight: 2, kBottomLeft: 3, kBottomRight: 4 };\n\n/**\n * @summary Painter for RPave class\n *\n * @private\n */\n\nclass RPavePainter extends RObjectPainter {\n\n /** @summary Draw pave content\n * @desc assigned depending on pave class */\n async drawContent() { return this; }\n\n /** @summary Draw pave */\n async drawPave() {\n\n let rect = this.getPadPainter().getPadRect(),\n fp = this.getFramePainter();\n\n this.onFrame = fp && this.v7EvalAttr('onFrame', true);\n this.corner = this.v7EvalAttr('corner', ECorner.kTopRight);\n\n let visible = this.v7EvalAttr('visible', true),\n offsetx = this.v7EvalLength('offsetX', rect.width, 0.02),\n offsety = this.v7EvalLength('offsetY', rect.height, 0.02),\n pave_width = this.v7EvalLength('width', rect.width, 0.3),\n pave_height = this.v7EvalLength('height', rect.height, 0.3);\n\n this.createG();\n\n this.draw_g.classed('most_upper_primitives', true); // this primitive will remain on top of list\n\n if (!visible)\n return this;\n\n this.createv7AttLine('border_');\n\n this.createv7AttFill();\n\n let pave_x = 0, pave_y = 0,\n fr = this.onFrame ? fp.getFrameRect() : rect;\n switch (this.corner) {\n case ECorner.kTopLeft:\n pave_x = fr.x + offsetx;\n pave_y = fr.y + offsety;\n break;\n case ECorner.kBottomLeft:\n pave_x = fr.x + offsetx;\n pave_y = fr.y + fr.height - offsety - pave_height;\n break;\n case ECorner.kBottomRight:\n pave_x = fr.x + fr.width - offsetx - pave_width;\n pave_y = fr.y + fr.height - offsety - pave_height;\n break;\n case ECorner.kTopRight:\n default:\n pave_x = fr.x + fr.width - offsetx - pave_width;\n pave_y = fr.y + offsety;\n }\n\n this.draw_g.attr('transform', `translate(${pave_x},${pave_y})`);\n\n this.draw_g.append('svg:rect')\n .attr('x', 0)\n .attr('width', pave_width)\n .attr('y', 0)\n .attr('height', pave_height)\n .call(this.lineatt.func)\n .call(this.fillatt.func);\n\n this.pave_width = pave_width;\n this.pave_height = pave_height;\n\n // here should be fill and draw of text\n\n return this.drawContent().then(() => {\n\n if (isBatchMode()) return this;\n\n // TODO: provide pave context menu as in v6\n if (settings.ContextMenu && this.paveContextMenu)\n this.draw_g.on('contextmenu', evnt => this.paveContextMenu(evnt));\n\n addDragHandler(this, { x: pave_x, y: pave_y, width: pave_width, height: pave_height,\n minwidth: 20, minheight: 20, redraw: d => this.sizeChanged(d) });\n\n return this;\n });\n }\n\n /** @summary Process interactive moving of the stats box */\n sizeChanged(drag) {\n this.pave_width = drag.width;\n this.pave_height = drag.height;\n\n let pave_x = drag.x,\n pave_y = drag.y,\n rect = this.getPadPainter().getPadRect(),\n fr = this.onFrame ? this.getFramePainter().getFrameRect() : rect,\n offsetx = 0, offsety = 0, changes = {};\n\n switch (this.corner) {\n case ECorner.kTopLeft:\n offsetx = pave_x - fr.x;\n offsety = pave_y - fr.y;\n break;\n case ECorner.kBottomLeft:\n offsetx = pave_x - fr.x;\n offsety = fr.y + fr.height - pave_y - this.pave_height;\n break;\n case ECorner.kBottomRight:\n offsetx = fr.x + fr.width - pave_x - this.pave_width;\n offsety = fr.y + fr.height - pave_y - this.pave_height;\n break;\n case ECorner.kTopRight:\n default:\n offsetx = fr.x + fr.width - pave_x - this.pave_width;\n offsety = pave_y - fr.y;\n }\n\n this.v7AttrChange(changes, 'offsetX', offsetx / rect.width);\n this.v7AttrChange(changes, 'offsetY', offsety / rect.height);\n this.v7AttrChange(changes, 'width', this.pave_width / rect.width);\n this.v7AttrChange(changes, 'height', this.pave_height / rect.height);\n this.v7SendAttrChanges(changes, false); // do not invoke canvas update on the server\n\n this.draw_g.select('rect')\n .attr('width', this.pave_width)\n .attr('height', this.pave_height);\n\n this.drawContent();\n }\n\n /** @summary Redraw RPave object */\n async redraw(/*reason*/) {\n return this.drawPave();\n }\n\n /** @summary draw RPave object */\n static async draw(dom, pave, opt) {\n let painter = new RPavePainter(dom, pave, opt, 'pave');\n return ensureRCanvas(painter, false).then(() => painter.drawPave());\n }\n}\n\n\n/**\n * @summary Painter for RLegend class\n *\n * @private\n */\n\nclass RLegendPainter extends RPavePainter {\n\n /** @summary draw RLegend content */\n async drawContent() {\n let legend = this.getObject(),\n textFont = this.v7EvalFont('text', { size: 12, color: 'black', align: 22 }),\n width = this.pave_width,\n height = this.pave_height,\n nlines = legend.fEntries.length,\n pp = this.getPadPainter();\n\n if (legend.fTitle) nlines++;\n\n if (!nlines || !pp) return this;\n\n let stepy = height / nlines, posy = 0, margin_x = 0.02 * width;\n\n textFont.setSize(height/(nlines * 1.2));\n this.startTextDrawing(textFont, 'font');\n\n if (legend.fTitle) {\n this.drawText({ latex: 1, width: width - 2*margin_x, height: stepy, x: margin_x, y: posy, text: legend.fTitle });\n posy += stepy;\n }\n\n for (let i = 0; i < legend.fEntries.length; ++i) {\n let objp = null, entry = legend.fEntries[i], w4 = Math.round(width/4);\n\n this.drawText({ latex: 1, width: 0.75*width - 3*margin_x, height: stepy, x: 2*margin_x + w4, y: posy, text: entry.fLabel });\n\n if (entry.fDrawableId != 'custom') {\n objp = pp.findSnap(entry.fDrawableId, true);\n } else if (entry.fDrawable.fIO) {\n objp = new RObjectPainter(this.getDom(), entry.fDrawable.fIO);\n if (entry.fLine) objp.createv7AttLine();\n if (entry.fFill) objp.createv7AttFill();\n if (entry.fMarker) objp.createv7AttMarker();\n }\n\n if (objp && entry.fFill && objp.fillatt)\n this.draw_g\n .append('svg:path')\n .attr('d', `M${Math.round(margin_x)},${Math.round(posy + stepy*0.1)}h${w4}v${Math.round(stepy*0.8)}h${-w4}z`)\n .call(objp.fillatt.func);\n\n if (objp && entry.fLine && objp.lineatt)\n this.draw_g\n .append('svg:path')\n .attr('d', `M${Math.round(margin_x)},${Math.round(posy + stepy/2)}h${w4}`)\n .call(objp.lineatt.func);\n\n if (objp && entry.fError && objp.lineatt)\n this.draw_g\n .append('svg:path')\n .attr('d', `M${Math.round(margin_x + width/8)},${Math.round(posy + stepy*0.2)}v${Math.round(stepy*0.6)}`)\n .call(objp.lineatt.func);\n\n if (objp && entry.fMarker && objp.markeratt)\n this.draw_g.append('svg:path')\n .attr('d', objp.markeratt.create(margin_x + width/8, posy + stepy/2))\n .call(objp.markeratt.func);\n\n posy += stepy;\n }\n\n return this.finishTextDrawing();\n }\n\n /** @summary draw RLegend object */\n static async draw(dom, legend, opt) {\n let painter = new RLegendPainter(dom, legend, opt, 'legend');\n return ensureRCanvas(painter, false).then(() => painter.drawPave());\n }\n\n} // class RLegendPainter\n\n\n/**\n * @summary Painter for RPaveText class\n *\n * @private\n */\n\nclass RPaveTextPainter extends RPavePainter {\n\n /** @summary draw RPaveText content */\n drawContent() {\n let pavetext = this.getObject(),\n textFont = this.v7EvalFont('text', { size: 12, color: 'black', align: 22 }),\n width = this.pave_width,\n height = this.pave_height,\n nlines = pavetext.fText.length;\n\n if (!nlines) return;\n\n let stepy = height / nlines, posy = 0, margin_x = 0.02 * width;\n\n textFont.setSize(height/(nlines * 1.2))\n\n this.startTextDrawing(textFont, 'font');\n\n for (let i = 0; i < pavetext.fText.length; ++i) {\n let line = pavetext.fText[i];\n\n this.drawText({ latex: 1, width: width - 2*margin_x, height: stepy, x: margin_x, y: posy, text: line });\n posy += stepy;\n }\n\n return this.finishTextDrawing(undefined, true);\n }\n\n /** @summary draw RPaveText object */\n static async draw(dom, pave, opt) {\n let painter = new RPaveTextPainter(dom, pave, opt, 'pavetext');\n return ensureRCanvas(painter, false).then(() => painter.drawPave());\n }\n\n} // class RPaveTextPainter\n\n/**\n * @summary Painter for RHistStats class\n *\n * @private\n */\n\nclass RHistStatsPainter extends RPavePainter {\n\n /** @summary clear entries from stat box */\n clearStat() {\n this.stats_lines = [];\n }\n\n /** @summary add text entry to stat box */\n addText(line) {\n this.stats_lines.push(line);\n }\n\n /** @summary update statistic from the server */\n updateStatistic(reply) {\n this.stats_lines = reply.lines;\n this.drawStatistic(this.stats_lines);\n }\n\n /** @summary fill statistic */\n fillStatistic() {\n let pp = this.getPadPainter();\n if (pp?._fast_drawing) return false;\n\n let obj = this.getObject();\n if (obj.fLines !== undefined) {\n this.stats_lines = obj.fLines;\n delete obj.fLines;\n return true;\n }\n\n if (this.v7OfflineMode()) {\n let main = this.getMainPainter();\n if (!isFunc(main?.fillStatistic)) return false;\n // we take statistic from main painter\n return main.fillStatistic(this, gStyle.fOptStat, gStyle.fOptFit);\n }\n\n // show lines which are exists, maybe server request will be recieved later\n return (this.stats_lines !== undefined);\n }\n\n /** @summary format float value as string\n * @private */\n format(value, fmt) {\n if (!fmt) fmt = 'stat';\n\n switch(fmt) {\n case 'stat' : fmt = gStyle.fStatFormat; break;\n case 'fit': fmt = gStyle.fFitFormat; break;\n case 'entries': if ((Math.abs(value) < 1e9) && (Math.round(value) == value)) return value.toFixed(0); fmt = '14.7g'; break;\n case 'last': fmt = this.lastformat; break;\n }\n\n let res = floatToString(value, fmt || '6.4g', true);\n\n this.lastformat = res[1];\n\n return res[0];\n }\n\n /** @summary Draw content */\n async drawContent() {\n if (this.fillStatistic())\n return this.drawStatistic(this.stats_lines);\n\n return this;\n }\n\n /** @summary Change mask */\n changeMask(nbit) {\n let obj = this.getObject(), mask = (1< {\n let obj = this.getObject(),\n action = this.changeMask.bind(this);\n\n menu.add('header: StatBox');\n\n for (let n=0;n menu.show());\n }\n\n /** @summary Draw statistic */\n async drawStatistic(lines) {\n\n let textFont = this.v7EvalFont('stats_text', { size: 12, color: 'black', align: 22 }),\n first_stat = 0, num_cols = 0, maxlen = 0,\n width = this.pave_width,\n height = this.pave_height;\n\n if (!lines) return this;\n\n let nlines = lines.length;\n // adjust font size\n for (let j = 0; j < nlines; ++j) {\n let line = lines[j];\n if (j > 0) maxlen = Math.max(maxlen, line.length);\n if ((j == 0) || (line.indexOf('|') < 0)) continue;\n if (first_stat === 0) first_stat = j;\n let parts = line.split('|');\n if (parts.length > num_cols)\n num_cols = parts.length;\n }\n\n // for characters like 'p' or 'y' several more pixels required to stay in the box when drawn in last line\n let stepy = height / nlines, has_head = false, margin_x = 0.02 * width;\n\n let text_g = this.draw_g.select('.statlines');\n if (text_g.empty())\n text_g = this.draw_g.append('svg:g').attr('class', 'statlines');\n else\n text_g.selectAll('*').remove();\n\n textFont.setSize(height/(nlines * 1.2));\n this.startTextDrawing(textFont, 'font' , text_g);\n\n if (nlines == 1) {\n this.drawText({ width: width, height: height, text: lines[0], latex: 1, draw_g: text_g });\n } else\n for (let j = 0; j < nlines; ++j) {\n let posy = j*stepy;\n\n if (first_stat && (j >= first_stat)) {\n let parts = lines[j].split('|');\n for (let n = 0; n < parts.length; ++n)\n this.drawText({ align: 'middle', x: width * n / num_cols, y: posy, latex: 0,\n width: width/num_cols, height: stepy, text: parts[n], draw_g: text_g });\n } else if (lines[j].indexOf('=') < 0) {\n if (j == 0) {\n has_head = true;\n let max_hlen = Math.max(maxlen, Math.round((width-2*margin_x)/stepy/0.65));\n if (lines[j].length > max_hlen + 5)\n lines[j] = lines[j].slice(0,max_hlen+2) + '...';\n }\n this.drawText({ align: (j == 0) ? 'middle' : 'start', x: margin_x, y: posy,\n width: width - 2*margin_x, height: stepy, text: lines[j], draw_g: text_g });\n } else {\n let parts = lines[j].split('='), args = [];\n\n for (let n = 0; n < 2; ++n) {\n let arg = {\n align: (n == 0) ? 'start' : 'end', x: margin_x, y: posy,\n width: width-2*margin_x, height: stepy, text: parts[n], draw_g: text_g,\n _expected_width: width-2*margin_x, _args: args,\n post_process(painter) {\n if (this._args[0].ready && this._args[1].ready)\n painter.scaleTextDrawing(1.05*(this._args[0].result_width && this._args[1].result_width)/this.__expected_width, this.draw_g);\n }\n };\n args.push(arg);\n }\n\n for (let n = 0; n < 2; ++n)\n this.drawText(args[n]);\n }\n }\n\n let lpath = '';\n\n if (has_head)\n lpath += 'M0,' + Math.round(stepy) + 'h' + width;\n\n if ((first_stat > 0) && (num_cols > 1)) {\n for (let nrow = first_stat; nrow < nlines; ++nrow)\n lpath += 'M0,' + Math.round(nrow * stepy) + 'h' + width;\n for (let ncol = 0; ncol < num_cols - 1; ++ncol)\n lpath += 'M' + Math.round(width / num_cols * (ncol + 1)) + ',' + Math.round(first_stat * stepy) + 'V' + height;\n }\n\n if (lpath) this.draw_g.append('svg:path').attr('d',lpath) /*.call(this.lineatt.func)*/;\n\n return this.finishTextDrawing(text_g);\n }\n\n /** @summary Redraw stats box */\n async redraw(reason) {\n if (reason && isStr(reason) && (reason.indexOf('zoom') == 0) && this.v7NormalMode()) {\n let req = {\n _typename: 'ROOT::Experimental::RHistStatBoxBase::RRequest',\n mask: this.getObject().fShowMask // lines to show in stat box\n };\n\n this.v7SubmitRequest('stat', req, reply => this.updateStatistic(reply));\n }\n\n return this.drawPave();\n }\n\n /** @summary draw RHistStats object */\n static async draw(dom, stats, opt) {\n let painter = new RHistStatsPainter(dom, stats, opt, stats);\n return ensureRCanvas(painter, false).then(() => painter.drawPave());\n }\n\n} // class RHistStatsPainter\n\n\nexport { RPavePainter, RLegendPainter, RPaveTextPainter, RHistStatsPainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file +{"version":3,"file":"625.b2df831fc47ab055.js","mappings":"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","names":["RPavePainter","RObjectPainter","drawContent","_this","drawPave","rect","_this2","getPadPainter","getPadRect","fp","getFramePainter","onFrame","v7EvalAttr","corner","visible","offsetx","v7EvalLength","width","offsety","height","pave_width","pave_height","createG","draw_g","classed","createv7AttLine","createv7AttFill","pave_x","pave_y","fr","getFrameRect","x","y","attr","append","call","lineatt","func","fillatt","then","isBatchMode","settings","paveContextMenu","on","evnt","addDragHandler","minwidth","minheight","redraw","d","sizeChanged","drag","this","changes","v7AttrChange","v7SendAttrChanges","select","_this3","static","dom","pave","opt","painter","ensureRCanvas","RLegendPainter","legend","_this4","getObject","textFont","v7EvalFont","size","color","align","nlines","fEntries","length","pp","fTitle","stepy","posy","margin_x","setSize","startTextDrawing","drawText","latex","text","i","objp","entry","w4","Math","round","fLabel","fDrawableId","findSnap","fDrawable","fIO","getDom","fLine","fFill","fMarker","createv7AttMarker","fError","markeratt","create","finishTextDrawing","RPaveTextPainter","pavetext","fText","undefined","RHistStatsPainter","clearStat","stats_lines","addText","line","push","updateStatistic","reply","lines","drawStatistic","fillStatistic","_fast_drawing","obj","fLines","v7OfflineMode","main","getMainPainter","isFunc","gStyle","format","value","fmt","abs","toFixed","lastformat","res","floatToString","_this5","changeMask","nbit","mask","fShowMask","statsContextMenu","preventDefault","stopPropagation","createMenu","menu","action","bind","add","n","addchk","fillObjectExecMenu","show","_this6","first_stat","num_cols","maxlen","j","max","indexOf","parts","split","has_head","text_g","empty","selectAll","remove","max_hlen","slice","args","_expected_width","_args","post_process","ready","scaleTextDrawing","result_width","__expected_width","lpath","nrow","ncol","reason","isStr","_this7","v7NormalMode","req","_typename","v7SubmitRequest","stats"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/hist/RPavePainter.mjs"],"sourcesContent":["import { settings, isBatchMode, isFunc, isStr, gStyle } from '../core.mjs';\nimport { floatToString } from '../base/BasePainter.mjs';\nimport { RObjectPainter } from '../base/RObjectPainter.mjs';\nimport { ensureRCanvas } from '../gpad/RCanvasPainter.mjs';\nimport { addDragHandler } from '../gpad/TFramePainter.mjs';\n\n\nconst ECorner = { kTopLeft: 1, kTopRight: 2, kBottomLeft: 3, kBottomRight: 4 };\n\n/**\n * @summary Painter for RPave class\n *\n * @private\n */\n\nclass RPavePainter extends RObjectPainter {\n\n /** @summary Draw pave content\n * @desc assigned depending on pave class */\n async drawContent() { return this; }\n\n /** @summary Draw pave */\n async drawPave() {\n\n let rect = this.getPadPainter().getPadRect(),\n fp = this.getFramePainter();\n\n this.onFrame = fp && this.v7EvalAttr('onFrame', true);\n this.corner = this.v7EvalAttr('corner', ECorner.kTopRight);\n\n let visible = this.v7EvalAttr('visible', true),\n offsetx = this.v7EvalLength('offsetX', rect.width, 0.02),\n offsety = this.v7EvalLength('offsetY', rect.height, 0.02),\n pave_width = this.v7EvalLength('width', rect.width, 0.3),\n pave_height = this.v7EvalLength('height', rect.height, 0.3);\n\n this.createG();\n\n this.draw_g.classed('most_upper_primitives', true); // this primitive will remain on top of list\n\n if (!visible)\n return this;\n\n this.createv7AttLine('border_');\n\n this.createv7AttFill();\n\n let pave_x = 0, pave_y = 0,\n fr = this.onFrame ? fp.getFrameRect() : rect;\n switch (this.corner) {\n case ECorner.kTopLeft:\n pave_x = fr.x + offsetx;\n pave_y = fr.y + offsety;\n break;\n case ECorner.kBottomLeft:\n pave_x = fr.x + offsetx;\n pave_y = fr.y + fr.height - offsety - pave_height;\n break;\n case ECorner.kBottomRight:\n pave_x = fr.x + fr.width - offsetx - pave_width;\n pave_y = fr.y + fr.height - offsety - pave_height;\n break;\n case ECorner.kTopRight:\n default:\n pave_x = fr.x + fr.width - offsetx - pave_width;\n pave_y = fr.y + offsety;\n }\n\n this.draw_g.attr('transform', `translate(${pave_x},${pave_y})`);\n\n this.draw_g.append('svg:rect')\n .attr('x', 0)\n .attr('width', pave_width)\n .attr('y', 0)\n .attr('height', pave_height)\n .call(this.lineatt.func)\n .call(this.fillatt.func);\n\n this.pave_width = pave_width;\n this.pave_height = pave_height;\n\n // here should be fill and draw of text\n\n return this.drawContent().then(() => {\n\n if (isBatchMode()) return this;\n\n // TODO: provide pave context menu as in v6\n if (settings.ContextMenu && this.paveContextMenu)\n this.draw_g.on('contextmenu', evnt => this.paveContextMenu(evnt));\n\n addDragHandler(this, { x: pave_x, y: pave_y, width: pave_width, height: pave_height,\n minwidth: 20, minheight: 20, redraw: d => this.sizeChanged(d) });\n\n return this;\n });\n }\n\n /** @summary Process interactive moving of the stats box */\n sizeChanged(drag) {\n this.pave_width = drag.width;\n this.pave_height = drag.height;\n\n let pave_x = drag.x,\n pave_y = drag.y,\n rect = this.getPadPainter().getPadRect(),\n fr = this.onFrame ? this.getFramePainter().getFrameRect() : rect,\n offsetx = 0, offsety = 0, changes = {};\n\n switch (this.corner) {\n case ECorner.kTopLeft:\n offsetx = pave_x - fr.x;\n offsety = pave_y - fr.y;\n break;\n case ECorner.kBottomLeft:\n offsetx = pave_x - fr.x;\n offsety = fr.y + fr.height - pave_y - this.pave_height;\n break;\n case ECorner.kBottomRight:\n offsetx = fr.x + fr.width - pave_x - this.pave_width;\n offsety = fr.y + fr.height - pave_y - this.pave_height;\n break;\n case ECorner.kTopRight:\n default:\n offsetx = fr.x + fr.width - pave_x - this.pave_width;\n offsety = pave_y - fr.y;\n }\n\n this.v7AttrChange(changes, 'offsetX', offsetx / rect.width);\n this.v7AttrChange(changes, 'offsetY', offsety / rect.height);\n this.v7AttrChange(changes, 'width', this.pave_width / rect.width);\n this.v7AttrChange(changes, 'height', this.pave_height / rect.height);\n this.v7SendAttrChanges(changes, false); // do not invoke canvas update on the server\n\n this.draw_g.select('rect')\n .attr('width', this.pave_width)\n .attr('height', this.pave_height);\n\n this.drawContent();\n }\n\n /** @summary Redraw RPave object */\n async redraw(/*reason*/) {\n return this.drawPave();\n }\n\n /** @summary draw RPave object */\n static async draw(dom, pave, opt) {\n let painter = new RPavePainter(dom, pave, opt, 'pave');\n return ensureRCanvas(painter, false).then(() => painter.drawPave());\n }\n}\n\n\n/**\n * @summary Painter for RLegend class\n *\n * @private\n */\n\nclass RLegendPainter extends RPavePainter {\n\n /** @summary draw RLegend content */\n async drawContent() {\n let legend = this.getObject(),\n textFont = this.v7EvalFont('text', { size: 12, color: 'black', align: 22 }),\n width = this.pave_width,\n height = this.pave_height,\n nlines = legend.fEntries.length,\n pp = this.getPadPainter();\n\n if (legend.fTitle) nlines++;\n\n if (!nlines || !pp) return this;\n\n let stepy = height / nlines, posy = 0, margin_x = 0.02 * width;\n\n textFont.setSize(height/(nlines * 1.2));\n this.startTextDrawing(textFont, 'font');\n\n if (legend.fTitle) {\n this.drawText({ latex: 1, width: width - 2*margin_x, height: stepy, x: margin_x, y: posy, text: legend.fTitle });\n posy += stepy;\n }\n\n for (let i = 0; i < legend.fEntries.length; ++i) {\n let objp = null, entry = legend.fEntries[i], w4 = Math.round(width/4);\n\n this.drawText({ latex: 1, width: 0.75*width - 3*margin_x, height: stepy, x: 2*margin_x + w4, y: posy, text: entry.fLabel });\n\n if (entry.fDrawableId != 'custom') {\n objp = pp.findSnap(entry.fDrawableId, true);\n } else if (entry.fDrawable.fIO) {\n objp = new RObjectPainter(this.getDom(), entry.fDrawable.fIO);\n if (entry.fLine) objp.createv7AttLine();\n if (entry.fFill) objp.createv7AttFill();\n if (entry.fMarker) objp.createv7AttMarker();\n }\n\n if (objp && entry.fFill && objp.fillatt)\n this.draw_g\n .append('svg:path')\n .attr('d', `M${Math.round(margin_x)},${Math.round(posy + stepy*0.1)}h${w4}v${Math.round(stepy*0.8)}h${-w4}z`)\n .call(objp.fillatt.func);\n\n if (objp && entry.fLine && objp.lineatt)\n this.draw_g\n .append('svg:path')\n .attr('d', `M${Math.round(margin_x)},${Math.round(posy + stepy/2)}h${w4}`)\n .call(objp.lineatt.func);\n\n if (objp && entry.fError && objp.lineatt)\n this.draw_g\n .append('svg:path')\n .attr('d', `M${Math.round(margin_x + width/8)},${Math.round(posy + stepy*0.2)}v${Math.round(stepy*0.6)}`)\n .call(objp.lineatt.func);\n\n if (objp && entry.fMarker && objp.markeratt)\n this.draw_g.append('svg:path')\n .attr('d', objp.markeratt.create(margin_x + width/8, posy + stepy/2))\n .call(objp.markeratt.func);\n\n posy += stepy;\n }\n\n return this.finishTextDrawing();\n }\n\n /** @summary draw RLegend object */\n static async draw(dom, legend, opt) {\n let painter = new RLegendPainter(dom, legend, opt, 'legend');\n return ensureRCanvas(painter, false).then(() => painter.drawPave());\n }\n\n} // class RLegendPainter\n\n\n/**\n * @summary Painter for RPaveText class\n *\n * @private\n */\n\nclass RPaveTextPainter extends RPavePainter {\n\n /** @summary draw RPaveText content */\n drawContent() {\n let pavetext = this.getObject(),\n textFont = this.v7EvalFont('text', { size: 12, color: 'black', align: 22 }),\n width = this.pave_width,\n height = this.pave_height,\n nlines = pavetext.fText.length;\n\n if (!nlines) return;\n\n let stepy = height / nlines, posy = 0, margin_x = 0.02 * width;\n\n textFont.setSize(height/(nlines * 1.2))\n\n this.startTextDrawing(textFont, 'font');\n\n for (let i = 0; i < pavetext.fText.length; ++i) {\n let line = pavetext.fText[i];\n\n this.drawText({ latex: 1, width: width - 2*margin_x, height: stepy, x: margin_x, y: posy, text: line });\n posy += stepy;\n }\n\n return this.finishTextDrawing(undefined, true);\n }\n\n /** @summary draw RPaveText object */\n static async draw(dom, pave, opt) {\n let painter = new RPaveTextPainter(dom, pave, opt, 'pavetext');\n return ensureRCanvas(painter, false).then(() => painter.drawPave());\n }\n\n} // class RPaveTextPainter\n\n/**\n * @summary Painter for RHistStats class\n *\n * @private\n */\n\nclass RHistStatsPainter extends RPavePainter {\n\n /** @summary clear entries from stat box */\n clearStat() {\n this.stats_lines = [];\n }\n\n /** @summary add text entry to stat box */\n addText(line) {\n this.stats_lines.push(line);\n }\n\n /** @summary update statistic from the server */\n updateStatistic(reply) {\n this.stats_lines = reply.lines;\n this.drawStatistic(this.stats_lines);\n }\n\n /** @summary fill statistic */\n fillStatistic() {\n let pp = this.getPadPainter();\n if (pp?._fast_drawing) return false;\n\n let obj = this.getObject();\n if (obj.fLines !== undefined) {\n this.stats_lines = obj.fLines;\n delete obj.fLines;\n return true;\n }\n\n if (this.v7OfflineMode()) {\n let main = this.getMainPainter();\n if (!isFunc(main?.fillStatistic)) return false;\n // we take statistic from main painter\n return main.fillStatistic(this, gStyle.fOptStat, gStyle.fOptFit);\n }\n\n // show lines which are exists, maybe server request will be recieved later\n return (this.stats_lines !== undefined);\n }\n\n /** @summary format float value as string\n * @private */\n format(value, fmt) {\n if (!fmt) fmt = 'stat';\n\n switch(fmt) {\n case 'stat' : fmt = gStyle.fStatFormat; break;\n case 'fit': fmt = gStyle.fFitFormat; break;\n case 'entries': if ((Math.abs(value) < 1e9) && (Math.round(value) == value)) return value.toFixed(0); fmt = '14.7g'; break;\n case 'last': fmt = this.lastformat; break;\n }\n\n let res = floatToString(value, fmt || '6.4g', true);\n\n this.lastformat = res[1];\n\n return res[0];\n }\n\n /** @summary Draw content */\n async drawContent() {\n if (this.fillStatistic())\n return this.drawStatistic(this.stats_lines);\n\n return this;\n }\n\n /** @summary Change mask */\n changeMask(nbit) {\n let obj = this.getObject(), mask = (1< {\n let obj = this.getObject(),\n action = this.changeMask.bind(this);\n\n menu.add('header: StatBox');\n\n for (let n=0;n menu.show());\n }\n\n /** @summary Draw statistic */\n async drawStatistic(lines) {\n\n let textFont = this.v7EvalFont('stats_text', { size: 12, color: 'black', align: 22 }),\n first_stat = 0, num_cols = 0, maxlen = 0,\n width = this.pave_width,\n height = this.pave_height;\n\n if (!lines) return this;\n\n let nlines = lines.length;\n // adjust font size\n for (let j = 0; j < nlines; ++j) {\n let line = lines[j];\n if (j > 0) maxlen = Math.max(maxlen, line.length);\n if ((j == 0) || (line.indexOf('|') < 0)) continue;\n if (first_stat === 0) first_stat = j;\n let parts = line.split('|');\n if (parts.length > num_cols)\n num_cols = parts.length;\n }\n\n // for characters like 'p' or 'y' several more pixels required to stay in the box when drawn in last line\n let stepy = height / nlines, has_head = false, margin_x = 0.02 * width;\n\n let text_g = this.draw_g.select('.statlines');\n if (text_g.empty())\n text_g = this.draw_g.append('svg:g').attr('class', 'statlines');\n else\n text_g.selectAll('*').remove();\n\n textFont.setSize(height/(nlines * 1.2));\n this.startTextDrawing(textFont, 'font' , text_g);\n\n if (nlines == 1) {\n this.drawText({ width: width, height: height, text: lines[0], latex: 1, draw_g: text_g });\n } else\n for (let j = 0; j < nlines; ++j) {\n let posy = j*stepy;\n\n if (first_stat && (j >= first_stat)) {\n let parts = lines[j].split('|');\n for (let n = 0; n < parts.length; ++n)\n this.drawText({ align: 'middle', x: width * n / num_cols, y: posy, latex: 0,\n width: width/num_cols, height: stepy, text: parts[n], draw_g: text_g });\n } else if (lines[j].indexOf('=') < 0) {\n if (j == 0) {\n has_head = true;\n let max_hlen = Math.max(maxlen, Math.round((width-2*margin_x)/stepy/0.65));\n if (lines[j].length > max_hlen + 5)\n lines[j] = lines[j].slice(0,max_hlen+2) + '...';\n }\n this.drawText({ align: (j == 0) ? 'middle' : 'start', x: margin_x, y: posy,\n width: width - 2*margin_x, height: stepy, text: lines[j], draw_g: text_g });\n } else {\n let parts = lines[j].split('='), args = [];\n\n for (let n = 0; n < 2; ++n) {\n let arg = {\n align: (n == 0) ? 'start' : 'end', x: margin_x, y: posy,\n width: width-2*margin_x, height: stepy, text: parts[n], draw_g: text_g,\n _expected_width: width-2*margin_x, _args: args,\n post_process(painter) {\n if (this._args[0].ready && this._args[1].ready)\n painter.scaleTextDrawing(1.05*(this._args[0].result_width && this._args[1].result_width)/this.__expected_width, this.draw_g);\n }\n };\n args.push(arg);\n }\n\n for (let n = 0; n < 2; ++n)\n this.drawText(args[n]);\n }\n }\n\n let lpath = '';\n\n if (has_head)\n lpath += 'M0,' + Math.round(stepy) + 'h' + width;\n\n if ((first_stat > 0) && (num_cols > 1)) {\n for (let nrow = first_stat; nrow < nlines; ++nrow)\n lpath += 'M0,' + Math.round(nrow * stepy) + 'h' + width;\n for (let ncol = 0; ncol < num_cols - 1; ++ncol)\n lpath += 'M' + Math.round(width / num_cols * (ncol + 1)) + ',' + Math.round(first_stat * stepy) + 'V' + height;\n }\n\n if (lpath) this.draw_g.append('svg:path').attr('d',lpath) /*.call(this.lineatt.func)*/;\n\n return this.finishTextDrawing(text_g);\n }\n\n /** @summary Redraw stats box */\n async redraw(reason) {\n if (reason && isStr(reason) && (reason.indexOf('zoom') == 0) && this.v7NormalMode()) {\n let req = {\n _typename: 'ROOT::Experimental::RHistStatBoxBase::RRequest',\n mask: this.getObject().fShowMask // lines to show in stat box\n };\n\n this.v7SubmitRequest('stat', req, reply => this.updateStatistic(reply));\n }\n\n return this.drawPave();\n }\n\n /** @summary draw RHistStats object */\n static async draw(dom, stats, opt) {\n let painter = new RHistStatsPainter(dom, stats, opt, stats);\n return ensureRCanvas(painter, false).then(() => painter.drawPave());\n }\n\n} // class RHistStatsPainter\n\n\nexport { RPavePainter, RLegendPainter, RPaveTextPainter, RHistStatsPainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file diff --git a/docs/636.6ba473b6b4c07b12.js b/docs/636.6ba473b6b4c07b12.js deleted file mode 100644 index 596817e2f..000000000 --- a/docs/636.6ba473b6b4c07b12.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[636],{4636:(Et,xt,G)=>{G.r(xt),G.d(xt,{RH3Painter:()=>q,drawHistDisplayItem:()=>Mt});var ft=G(5368),J=G(1773),O=G(1515),dt=G(5611),bt=G(6717),zt=G(757),Bt=G(8597),H=G(6772),At=G(2018),wt=G(7),Ct=G(3641);class q extends Bt.n{getDimension(){return 3}scanContent(t){if(t&&this.nbinsx&&this.nbinsy&&this.nbinsz)return;let i=this.getHisto();if(i){if(this.extractAxesProperties(3),this.isDisplayItem())this.gminbin=i.fContMin,this.gminposbin=i.fContMinPos>0?i.fContMinPos:null,this.gmaxbin=i.fContMax;else{this.gminbin=this.gmaxbin=i.getBinContent(1,1,1);for(let e=0;ethis.gmaxbin&&(this.gmaxbin=h)}}this.draw_content=this.gmaxbin>0}}countStat(){let M,E,I,T,j,U,W,$,K,z,t=this.getHisto(),i=this.getAxis("x"),e=this.getAxis("y"),n=this.getAxis("z"),o=0,h=0,l=0,x=0,g=0,u=0,y=0,C=this.getSelectIndex("x","left"),P=this.getSelectIndex("x","right"),f=this.getSelectIndex("y","left"),d=this.getSelectIndex("y","right"),_=this.getSelectIndex("z","left"),p=this.getSelectIndex("z","right"),c=(this.getFramePainter(),{name:t.fName,entries:0,integral:0,meanx:0,meany:0,meanz:0,rmsx:0,rmsy:0,rmsz:0});for(M=1;M<=this.nbinsx;++M)for(T=i.GetBinCoord(M-.5),j=M<=C+1?0:M>P+1?2:1,E=1;E<=this.nbinsy;++E)for(U=e.GetBinCoord(E-.5),W=E<=f+1?0:E>d+1?2:1,I=1;I<=this.nbinsz;++I)$=n.GetBinCoord(I-.5),K=I<=_+1?0:I>p+1?2:1,z=t.getBinContent(M,E,I),c.entries+=z,1==j&&1==W&&1==K&&(o+=z,h+=T*z,l+=U*z,x+=$*z,g+=T**2*z,u+=U**2*z,y+=$**2*z);return Math.abs(o)>1e-300&&(c.meanx=h/o,c.meany=l/o,c.meanz=x/o,c.rmsx=Math.sqrt(Math.abs(g/o-c.meanx**2)),c.rmsy=Math.sqrt(Math.abs(u/o-c.meany**2)),c.rmsz=Math.sqrt(Math.abs(y/o-c.meanz**2))),c.integral=o,t.fEntries>1&&(c.entries=t.fEntries),c}fillStatistic(t,i){let e=this.countStat(),n=i%10,o=Math.floor(i/10)%10,h=Math.floor(i/100)%10,l=Math.floor(i/1e3)%10,x=Math.floor(i/1e6)%10;return t.clearStat(),n>0&&t.addText(e.name),o>0&&t.addText("Entries = "+t.format(e.entries,"entries")),h>0&&(t.addText("Mean x = "+t.format(e.meanx)),t.addText("Mean y = "+t.format(e.meany)),t.addText("Mean z = "+t.format(e.meanz))),l>0&&(t.addText("Std Dev x = "+t.format(e.rmsx)),t.addText("Std Dev y = "+t.format(e.rmsy)),t.addText("Std Dev z = "+t.format(e.rmsz))),x>0&&t.addText("Integral = "+t.format(e.integral,"entries")),!0}getBinTooltips(t,i,e){let n=[],o=this.getHisto(),h=1,l=1,x=1;this.isDisplayItem()&&(h=o.stepx||1,l=o.stepy||1,x=o.stepz||1),n.push(this.getObjectHint()),n.push(`x = ${this.getAxisBinTip("x",t,h)} xbin=${t+1}`),n.push(`y = ${this.getAxisBinTip("y",i,l)} ybin=${i+1}`),n.push(`z = ${this.getAxisBinTip("z",e,x)} zbin=${e+1}`);let g=o.getBinContent(t+1,i+1,e+1),u="entries = "+(h>1||l>1||x>1?"~":"");return g===Math.round(g)?n.push(u+g):n.push(u+(0,dt.Ee)(g,J.gStyle.fStatFormat)),n}draw3DScatter(t){var i=this;return(0,ft.Z)(function*(){let f,d,_,p,e=i.getHisto(),n=i.getFramePainter(),o=t.i1,h=t.i2,l=t.stepi,x=t.j1,g=t.j2,u=t.stepj,y=t.k1,C=t.k2,P=t.stepk;if(h<=o||g<=x||C<=y)return!0;let F=i.gmaxbin>1e3?1e3/i.gmaxbin:1,c=0,M=0,E=Math.max(0,i.gminbin);for(f=o;f(n.webgl?1e5:3e4))return!1;let I=new H.B_(c,n.webgl,n.size_x3d/200),T=new Int32Array(c),j=0,U=i.getAxis("x"),W=i.getAxis("y"),$=i.getAxis("z"),K=new dt.q9(M);for(f=o;f(n.toplevel.add(z),z.bins=T,z.painter=i,z.tip_color=65280,z.tooltip=function(b){if(!Number.isInteger(b.index))return console.error(`intersect.index not provided, three.js version ${O.UZH}`),null;let S=Math.floor(b.index/this.nvertex);if(S<0||S>=this.bins.length)return null;let B=this.painter,v=B.getFramePainter(),m=B.get3DToolTip(this.bins[S]);return m.x1=v.grx(B.getAxis("x").GetBinLowEdge(m.ix)),m.x2=v.grx(B.getAxis("x").GetBinLowEdge(m.ix+l)),m.y1=v.gry(B.getAxis("y").GetBinLowEdge(m.iy)),m.y2=v.gry(B.getAxis("y").GetBinLowEdge(m.iy+u)),m.z1=v.grz(B.getAxis("z").GetBinLowEdge(m.iz)),m.z2=v.grz(B.getAxis("z").GetBinLowEdge(m.iz+P)),m.color=this.tip_color,m.opacity=.3,m},!0))})()}draw3DBins(t){let u,y,i=this.v7EvalColor("fill_color","red"),e=this.getFramePainter(),n=0,o=!1,h=!1,l=!1,x=1,g=!0,C=.5;if(this.options.Sphere){C=.4,o=!0,11===this.options.Sphere&&(l=!0);let a=e.webgl?new O.xo$(.5,16,12):new O.xo$(.5,8,6);a.applyMatrix4((new O.yGw).makeRotationX(Math.PI/2)),a.computeVertexNormals();let s=a.getIndex().array,k=a.getAttribute("position").array,w=a.getAttribute("normal").array;n=3*s.length,u=new Float32Array(n),y=new Float32Array(n);for(let r=0;r=0?(void 0===X[a]&&(X[a]=0,Y[a]=N++),X[a]+=1):console.error(`not found color for value = ${Z}`)}l||(X.push(b),N=1,Y=[0]);let mt,at,ut,lt,_t,ht,it=new Array(N),tt=new Array(N),nt=new Array(N),rt=new Array(N),V=new Array(N),st=new Array(N),ot=new Array(N);for(let a=0;a65520?2:1),tt[s]=new Float32Array(b*n),nt[s]=new Float32Array(b*n),rt[s]=new Int32Array(b),1===V[s]&&(st[s]=new Uint16Array(b*H.XZ.MeshSegments.length)),2===V[s]&&(ot[s]=new Float32Array(b*H.XZ.Segments.length*3))}for(j=this.getAxis("x"),U=this.getAxis("y"),W=this.getAxis("z"),S=f;S=this.bins.length)return null;let D=this.painter,gt=D.getFramePainter(),L=D.get3DToolTip(this.bins[R]),ct=gt.grx(D.getAxis("x").GetBinCoord(L.ix-.5)),pt=gt.gry(D.getAxis("y").GetBinCoord(L.iy-.5)),yt=gt.grz(D.getAxis("z").GetBinCoord(L.iz-.5)),Q=this.use_scale?Math.pow(Math.abs(L.value*this.use_scale),.3333):1;return L.x1=ct-this.scalex*Q,L.x2=ct+this.scalex*Q,L.y1=pt-this.scaley*Q,L.y2=pt+this.scaley*Q,L.z1=yt-this.scalez*Q,L.z2=yt+this.scalez*Q,L.color=this.tip_color,L},e.toplevel.add(r),V[s]>0){let A=this.v7EvalColor("line_color","lightblue"),R=new O.nls({color:A}),D=null;D=1===V[s]?(0,H.Qy)(tt[s],R,st[s]):(0,H.Qy)(ot[s],R),e.toplevel.add(D)}}l&&this.updatePaletteDraw()}draw3D(){if(!this.draw_content)return!1;let t=this.prepareDraw({only_indexes:!0,extra:-.5,right_extra:-1});return(this.options.Scatter?this.draw3DScatter(t):Promise.resolve(!1)).then(e=>e||this.draw3DBins(t))}redraw(t){let i=this.getFramePainter();return"resize"==t?(i.resize3D()&&i.render3D(),this):((0,Ct.g_)(i),i.create3DScene(this.options.Render3D).then(()=>(i.setAxesRanges(this.getAxis("x"),this.xmin,this.xmax,this.getAxis("y"),this.ymin,this.ymax,this.getAxis("z"),this.zmin,this.zmax),i.set3DOptions(this.options),i.drawXYZ(i.toplevel,zt.C,{zoom:J.settings.Zooming,ndim:3,draw:!0,v7:!0}),this.drawingBins(t))).then(()=>this.draw3D()).then(()=>(i.render3D(),i.addKeysHandler(),this)))}fillToolbar(){let t=this.getPadPainter();t&&(t.addPadButton("auto_zoom","Unzoom all axes","ToggleZoom","Ctrl *"),this.draw_content&&t.addPadButton("statbox","Toggle stat box","ToggleStatBox"),t.showPadButtons())}canZoomInside(t,i,e){let n=this.getHisto();return n&&(n=n["f"+t.toUpperCase()+"axis"]),!n||n.FindBin(e,.5)-n.FindBin(i,0)>1}autoZoom(){let l,x,g,t=this.getSelectIndex("x","left"),i=this.getSelectIndex("x","right"),e=this.getSelectIndex("y","left"),n=this.getSelectIndex("y","right"),o=this.getSelectIndex("z","left"),h=this.getSelectIndex("z","right"),u=this.getHisto();if(t===i||e===n||o===h)return;let y=u.getBinContent(t+1,e+1,o+1);for(l=t;l0)return;let C=i,P=t,f=n,d=e,_=h,p=o;for(l=t;ly&&(l=P&&(P=l+1),x=d&&(d=x+1),g<_&&(_=g),g>=p&&(p=g+1));let F,c,M,E,I,T,j=!1;return C===P-1&&C>t+1&&Pe+1&&do+1&&pt||Pe||do||p{if("inspect"===e)return this.showInspector();this.decodeOptions(e),this.interactiveRedraw(!0,"drawopt")})}static draw(t,i){return(0,ft.Z)(function*(){let e=new q(t,i);return e.mode3d=!0,(0,bt.ensureRCanvas)(e,"3d").then(()=>{e.setAsMainPainter(),e.options={Box:0,Scatter:!1,Sphere:0,Color:!1,minimum:J.kNoZoom,maximum:J.kNoZoom};let n=e.v7EvalAttr("kind",""),o=e.v7EvalAttr("sub",0),h=e.options;switch(n){case"box":h.Box=10+o;break;case"sphere":h.Sphere=10+o;break;case"col":h.Color=!0;break;case"scat":h.Scatter=!0;break;default:h.Box=10}return e.scanContent(),e.redraw()})})()}}function Mt(et,t,i){return t?1==t.fAxes.length?At.RH1Painter.draw(et,t,i):2==t.fAxes.length?wt.RH2Painter.draw(et,t,i):3==t.fAxes.length?q.draw(et,t,i):null:null}}}]); -//# sourceMappingURL=636.6ba473b6b4c07b12.js.map \ No newline at end of file diff --git a/docs/647.f98f01d9b6ad4c05.js b/docs/647.f98f01d9b6ad4c05.js new file mode 100644 index 000000000..e03b2f9cc --- /dev/null +++ b/docs/647.f98f01d9b6ad4c05.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[647],{5647:(A,D,f)=>{f.r(D),f.d(D,{TASImagePainter:()=>B});var d=f(4788),g=f(9542),_=f(3038),M=f(6458),w=f(4585),x=f(49);class B extends M.tK{decodeOptions(e){this.options={Zscale:!1},e&&e.indexOf("z")>=0&&(this.options.Zscale=!0)}createRGBA(e){let t=this.getObject();if(!t?.fPalette)return null;let r=new Array(4*(e+1)),a=1,l=t.fPalette;for(let n=0;n<=e;++n){let o=1*n/e;for(;l.fPoints[a]=n&&(n=l+1);let o=0,h=e.fWidth,u=0,P=e.fHeight;return t&&t.zoom_xmin!=t.zoom_xmax&&(o=Math.round(t.zoom_xmin*e.fWidth),h=Math.round(t.zoom_xmax*e.fWidth)),t&&t.zoom_ymin!=t.zoom_ymax&&(u=Math.round(t.zoom_ymin*e.fHeight),P=Math.round(t.zoom_ymax*e.fHeight)),((0,g.isNodeJs)()?f.e(305).then(f.t.bind(f,8305,19)).then(i=>i.default.createCanvas(h-o,P-u)):new Promise(i=>{let s=document.createElement("canvas");s.width=h-o,s.height=P-u,i(s)})).then(i=>{let s=i.getContext("2d"),m=s.getImageData(0,0,i.width,i.height),b=m.data;for(let c=u;c(n.url&&e.createG(!!r).append("image").attr("href",n.url).attr("width",a.width).attr("height",a.height).attr("preserveAspectRatio",n.constRatio?null:"none"),n.url&&e.isMainPainter()&&n.is_buf&&r?e.drawColorPalette(e.options.Zscale,!0).then(()=>(r.setAxesRanges((0,g.create)(g.clTAxis),0,1,(0,g.create)(g.clTAxis),0,1,null,0,0),r.createXY({ndim:2,check_pad_range:!1}),r.addInteractivity())):e))})()}canZoomInside(e,t,r){let a=this.getObject();return!!a?.fImgBuf&&("x"==e&&(r-t)*a.fWidth>3||"y"==e&&(r-t)*a.fHeight>3)}drawColorPalette(e,t){var r=this;return(0,d.Z)(function*(){if(!r.isMainPainter())return null;if(!r.draw_palette){let o=(0,g.create)(g.clTPaletteAxis);Object.assign(o,{fX1NDC:.91,fX2NDC:.95,fY1NDC:.1,fY2NDC:.9,fInit:1}),o.fAxis.fChopt="+",r.draw_palette=o,r.fPalette=!0}let a=r.getPadPainter().findPainterFor(r.draw_palette);if(!e)return a&&(a.Enabled=!1,a.removeG()),null;let l=r.getFramePainter();if(t&&l){let o=r.draw_palette;o.fX2NDC=l.fX2NDC+.01+(o.fX2NDC-o.fX1NDC),o.fX1NDC=l.fX2NDC+.01,o.fY1NDC=l.fY1NDC,o.fY2NDC=l.fY2NDC}if(a)return a.Enabled=!0,a.drawPave("");let n=r.selectCurrentPad(r.getPadName());return w.TPavePainter.draw(r.getDom(),r.draw_palette).then(o=>{a=o,r.selectCurrentPad(n),a.$secondary=!0,a.redraw=function(){}})})()}toggleColz(){let e=this.getObject();e&&e.fPalette&&(this.options.Zscale=!this.options.Zscale,this.drawColorPalette(this.options.Zscale,!0))}redraw(e){let t=this.draw_g?this.draw_g.select("image"):null,r=this.getFramePainter();if(!t||t.empty()||"zoom"===e||!r)return this.drawImage();t.attr("width",r.getFrameWidth()).attr("height",r.getFrameHeight())}clickButton(e){return!!this.isMainPainter()&&"ToggleColorZ"===e&&(this.toggleColz(),!0)}fillToolbar(){let e=this.getPadPainter(),t=this.getObject();e&&t?.fPalette&&(e.addPadButton("th2colorz","Toggle color palette","ToggleColorZ"),e.showPadButtons())}static draw(e,t,r){return(0,d.Z)(function*(){let a=new B(e,t,r);return a.decodeOptions(r),(0,x.ensureTCanvas)(a,!1).then(()=>a.drawImage()).then(()=>(a.fillToolbar(),a))})()}}}}]); +//# sourceMappingURL=647.f98f01d9b6ad4c05.js.map \ No newline at end of file diff --git a/docs/726.d688e74f08d3451b.js.map b/docs/647.f98f01d9b6ad4c05.js.map similarity index 99% rename from docs/726.d688e74f08d3451b.js.map rename to docs/647.f98f01d9b6ad4c05.js.map index 4a8a09bfc..d8783ef33 100644 --- a/docs/726.d688e74f08d3451b.js.map +++ b/docs/647.f98f01d9b6ad4c05.js.map @@ -1 +1 @@ -{"version":3,"file":"726.d688e74f08d3451b.js","mappings":"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","names":["TASImagePainter","ObjectPainter","decodeOptions","opt","this","options","Zscale","indexOf","createRGBA","nlevels","obj","getObject","fPalette","rgba","Array","indx","pal","lvl","l","fPoints","length","r1","r2","Math","min","round","fColorRed","fColorGreen","fColorBlue","fColorAlpha","makeUrlFromImageBuf","fp","_this","fImgBuf","max","k","v","fContour","arr","getLevels","getPaletteColor","zval","toHex","xmin","xmax","fWidth","ymin","ymax","fHeight","zoom_xmin","zoom_xmax","zoom_ymin","zoom_ymax","isNodeJs","__webpack_require__","then","h","default","createCanvas","Promise","resolveFunc","c","document","createElement","width","height","canvas","context","getContext","imageData","getImageData","data","i","dst","row","j","iii","putImageData","url","toDataURL","constRatio","fConstRatio","is_buf","makeUrlFromPngBuf","buf","fPngBuf","pngbuf","isStr","String","fromCharCode","btoa_func","drawImage","promise","_this2","getFramePainter","rect","getFrameRect","getPadPainter","getPadRect","wheel_zoomy","_blob","console","error","fImageQuality","fImageCompression","_typename","fUniqueID","fBits","fNumPoints","resolve","res","createG","append","attr","isMainPainter","drawColorPalette","setAxesRanges","create","clTAxis","createXY","ndim","check_pad_range","addInteractivity","canZoomInside","axis","enabled","can_move","_this3","draw_palette","clTPaletteAxis","Object","assign","fX1NDC","fX2NDC","fY1NDC","fY2NDC","fInit","fAxis","fChopt","pal_painter","findPainterFor","Enabled","removeG","frame_painter","drawPave","prev_name","selectCurrentPad","getPadName","TPavePainter","getDom","p","$secondary","redraw","toggleColz","reason","img","draw_g","select","empty","getFrameWidth","getFrameHeight","clickButton","funcname","fillToolbar","pp","addPadButton","showPadButtons","static","dom","painter","ensureTCanvas"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/draw/TASImagePainter.mjs"],"sourcesContent":["import { create, isNodeJs, isStr, btoa_func, clTPave, clTGaxis, clTAxis, clTPaletteAxis } from '../core.mjs';\nimport { toHex } from '../base/colors.mjs';\nimport { ObjectPainter } from '../base/ObjectPainter.mjs';\nimport { TPavePainter } from '../hist/TPavePainter.mjs';\nimport { ensureTCanvas } from '../gpad/TCanvasPainter.mjs';\n\n/**\n * @summary Painter for TASImage object.\n *\n * @private\n */\n\nclass TASImagePainter extends ObjectPainter {\n\n /** @summary Decode options string */\n decodeOptions(opt) {\n this.options = { Zscale: false };\n\n if (opt && (opt.indexOf('z') >= 0)) this.options.Zscale = true;\n }\n\n /** @summary Create RGBA buffers */\n createRGBA(nlevels) {\n let obj = this.getObject();\n\n if (!obj?.fPalette) return null;\n\n let rgba = new Array((nlevels+1) * 4), indx = 1, pal = obj.fPalette; // precaclucated colors\n\n for(let lvl = 0; lvl <= nlevels; ++lvl) {\n let l = 1.*lvl/nlevels;\n while ((pal.fPoints[indx] < l) && (indx < pal.fPoints.length-1)) indx++;\n\n let r1 = (pal.fPoints[indx] - l) / (pal.fPoints[indx] - pal.fPoints[indx-1]),\n r2 = (l - pal.fPoints[indx-1]) / (pal.fPoints[indx] - pal.fPoints[indx-1]);\n\n rgba[lvl*4] = Math.min(255, Math.round((pal.fColorRed[indx-1] * r1 + pal.fColorRed[indx] * r2) / 256));\n rgba[lvl*4+1] = Math.min(255, Math.round((pal.fColorGreen[indx-1] * r1 + pal.fColorGreen[indx] * r2) / 256));\n rgba[lvl*4+2] = Math.min(255, Math.round((pal.fColorBlue[indx-1] * r1 + pal.fColorBlue[indx] * r2) / 256));\n rgba[lvl*4+3] = Math.min(255, Math.round((pal.fColorAlpha[indx-1] * r1 + pal.fColorAlpha[indx] * r2) / 256));\n }\n\n return rgba;\n }\n\n /** @summary Create url using image buffer\n * @private */\n async makeUrlFromImageBuf(obj, fp) {\n\n let nlevels = 1000;\n this.rgba = this.createRGBA(nlevels); // precaclucated colors\n\n let min = obj.fImgBuf[0], max = obj.fImgBuf[0];\n for (let k = 1; k < obj.fImgBuf.length; ++k) {\n let v = obj.fImgBuf[k];\n min = Math.min(v, min);\n max = Math.max(v, max);\n }\n\n // does not work properly in Node.js, causes 'Maximum call stack size exceeded' error\n // min = Math.min.apply(null, obj.fImgBuf),\n // max = Math.max.apply(null, obj.fImgBuf);\n\n // create countor like in hist painter to allow palette drawing\n this.fContour = {\n arr: new Array(200),\n rgba: this.rgba,\n getLevels() { return this.arr; },\n getPaletteColor(pal, zval) {\n if (!this.arr || !this.rgba) return 'white';\n let indx = Math.round((zval - this.arr[0]) / (this.arr[this.arr.length-1] - this.arr[0]) * (this.rgba.length-4)/4) * 4;\n return '#' + toHex(this.rgba[indx],1) + toHex(this.rgba[indx+1],1) + toHex(this.rgba[indx+2],1) + toHex(this.rgba[indx+3],1);\n }\n };\n for (let k = 0; k < 200; k++)\n this.fContour.arr[k] = min + (max-min)/(200-1)*k;\n\n if (min >= max) max = min + 1;\n\n let xmin = 0, xmax = obj.fWidth, ymin = 0, ymax = obj.fHeight; // dimension in pixels\n\n if (fp && (fp.zoom_xmin != fp.zoom_xmax)) {\n xmin = Math.round(fp.zoom_xmin * obj.fWidth);\n xmax = Math.round(fp.zoom_xmax * obj.fWidth);\n }\n\n if (fp && (fp.zoom_ymin != fp.zoom_ymax)) {\n ymin = Math.round(fp.zoom_ymin * obj.fHeight);\n ymax = Math.round(fp.zoom_ymax * obj.fHeight);\n }\n\n let pr = isNodeJs() ?\n import('canvas').then(h => h.default.createCanvas(xmax - xmin, ymax - ymin)) :\n new Promise(resolveFunc => {\n let c = document.createElement('canvas');\n c.width = xmax - xmin;\n c.height = ymax - ymin;\n resolveFunc(c);\n });\n\n return pr.then(canvas => {\n\n let context = canvas.getContext('2d'),\n imageData = context.getImageData(0, 0, canvas.width, canvas.height),\n arr = imageData.data;\n\n for(let i = ymin; i < ymax; ++i) {\n let dst = (ymax - i - 1) * (xmax - xmin) * 4,\n row = i * obj.fWidth;\n for(let j = xmin; j < xmax; ++j) {\n let iii = Math.round((obj.fImgBuf[row + j] - min) / (max - min) * nlevels) * 4;\n // copy rgba value for specified point\n arr[dst++] = this.rgba[iii++];\n arr[dst++] = this.rgba[iii++];\n arr[dst++] = this.rgba[iii++];\n arr[dst++] = this.rgba[iii++];\n }\n }\n\n context.putImageData(imageData, 0, 0);\n\n return { url: canvas.toDataURL(), constRatio: obj.fConstRatio, is_buf: true };\n });\n }\n\n /** @summary Produce data url from png data */\n async makeUrlFromPngBuf(obj) {\n let buf = obj.fPngBuf, pngbuf = '';\n\n if (isStr(buf))\n pngbuf = buf;\n else\n for (let k = 0; k < buf.length; ++k)\n pngbuf += String.fromCharCode(buf[k] < 0 ? 256 + buf[k] : buf[k]);\n\n return { url: 'data:image/png;base64,' + btoa_func(pngbuf), constRatio: true };\n }\n\n /** @summary Draw image */\n async drawImage() {\n let obj = this.getObject(),\n fp = this.getFramePainter(),\n rect = fp ? fp.getFrameRect() : this.getPadPainter().getPadRect();\n\n this.wheel_zoomy = true;\n\n if (obj._blob) {\n // try to process blob data due to custom streamer\n if ((obj._blob.length == 15) && !obj._blob[0]) {\n obj.fImageQuality = obj._blob[1];\n obj.fImageCompression = obj._blob[2];\n obj.fConstRatio = obj._blob[3];\n obj.fPalette = {\n _typename: 'TImagePalette',\n fUniqueID: obj._blob[4],\n fBits: obj._blob[5],\n fNumPoints: obj._blob[6],\n fPoints: obj._blob[7],\n fColorRed: obj._blob[8],\n fColorGreen: obj._blob[9],\n fColorBlue: obj._blob[10],\n fColorAlpha: obj._blob[11]\n };\n\n obj.fWidth = obj._blob[12];\n obj.fHeight = obj._blob[13];\n obj.fImgBuf = obj._blob[14];\n\n if ((obj.fWidth * obj.fHeight != obj.fImgBuf.length) ||\n (obj.fPalette.fNumPoints != obj.fPalette.fPoints.length)) {\n console.error(`TASImage _blob decoding error ${obj.fWidth * obj.fHeight} != ${obj.fImgBuf.length} ${obj.fPalette.fNumPoints} != ${obj.fPalette.fPoints.length}`);\n delete obj.fImgBuf;\n delete obj.fPalette;\n }\n\n } else if ((obj._blob.length == 3) && obj._blob[0]) {\n obj.fPngBuf = obj._blob[2];\n if (obj.fPngBuf?.length != obj._blob[1]) {\n console.error(`TASImage with png buffer _blob error ${obj._blob[1]} != ${obj.fPngBuf?.length}`);\n delete obj.fPngBuf;\n }\n } else {\n console.error(`TASImage _blob len ${obj._blob.length} not recognized`);\n }\n\n delete obj._blob;\n }\n\n let promise;\n\n if (obj.fImgBuf && obj.fPalette) {\n promise = this.makeUrlFromImageBuf(obj, fp);\n } else if (obj.fPngBuf) {\n promise = this.makeUrlFromPngBuf(obj);\n } else {\n promise = Promise.resolve({});\n }\n\n return promise.then(res => {\n\n if (res.url)\n this.createG(fp ? true : false)\n .append('image')\n .attr('href', res.url)\n .attr('width', rect.width)\n .attr('height', rect.height)\n .attr('preserveAspectRatio', res.constRatio ? null : 'none');\n\n if (!res.url || !this.isMainPainter() || !res.is_buf || !fp)\n return this;\n\n return this.drawColorPalette(this.options.Zscale, true).then(() => {\n fp.setAxesRanges(create(clTAxis), 0, 1, create(clTAxis), 0, 1, null, 0, 0);\n fp.createXY({ ndim: 2, check_pad_range: false });\n return fp.addInteractivity();\n })\n });\n }\n\n /** @summary Checks if it makes sense to zoom inside specified axis range */\n canZoomInside(axis,min,max) {\n let obj = this.getObject();\n\n if (!obj?.fImgBuf)\n return false;\n\n if ((axis == 'x') && ((max - min) * obj.fWidth > 3)) return true;\n\n if ((axis == 'y') && ((max - min) * obj.fHeight > 3)) return true;\n\n return false;\n }\n\n /** @summary Draw color palette\n * @private */\n async drawColorPalette(enabled, can_move) {\n\n if (!this.isMainPainter())\n return null;\n\n if (!this.draw_palette) {\n let pal = create(clTPaletteAxis);\n Object.assign(pal, { fX1NDC: 0.91, fX2NDC: 0.95, fY1NDC: 0.1, fY2NDC: 0.9, fInit: 1 });\n pal.fAxis.fChopt = '+';\n this.draw_palette = pal;\n this.fPalette = true; // to emulate behaviour of hist painter\n }\n\n let pal_painter = this.getPadPainter().findPainterFor(this.draw_palette);\n\n if (!enabled) {\n if (pal_painter) {\n pal_painter.Enabled = false;\n pal_painter.removeG(); // completely remove drawing without need to redraw complete pad\n }\n return null;\n }\n\n let frame_painter = this.getFramePainter();\n\n // keep palette width\n if (can_move && frame_painter) {\n let pal = this.draw_palette;\n pal.fX2NDC = frame_painter.fX2NDC + 0.01 + (pal.fX2NDC - pal.fX1NDC);\n pal.fX1NDC = frame_painter.fX2NDC + 0.01;\n pal.fY1NDC = frame_painter.fY1NDC;\n pal.fY2NDC = frame_painter.fY2NDC;\n }\n\n if (pal_painter) {\n pal_painter.Enabled = true;\n return pal_painter.drawPave('');\n }\n\n\n let prev_name = this.selectCurrentPad(this.getPadName());\n\n return TPavePainter.draw(this.getDom(), this.draw_palette).then(p => {\n\n pal_painter = p;\n\n this.selectCurrentPad(prev_name);\n // mark painter as secondary - not in list of TCanvas primitives\n pal_painter.$secondary = true;\n\n // make dummy redraw, palette will be updated only from histogram painter\n pal_painter.redraw = function() {};\n });\n }\n\n /** @summary Toggle colz draw option\n * @private */\n toggleColz() {\n let obj = this.getObject(),\n can_toggle = obj && obj.fPalette;\n\n if (can_toggle) {\n this.options.Zscale = !this.options.Zscale;\n this.drawColorPalette(this.options.Zscale, true);\n }\n }\n\n /** @summary Redraw image */\n redraw(reason) {\n let img = this.draw_g ? this.draw_g.select('image') : null,\n fp = this.getFramePainter();\n\n if (img && !img.empty() && (reason !== 'zoom') && fp) {\n img.attr('width', fp.getFrameWidth()).attr('height', fp.getFrameHeight());\n } else {\n return this.drawImage();\n }\n }\n\n /** @summary Process click on TASImage-defined buttons */\n clickButton(funcname) {\n if (!this.isMainPainter()) return false;\n\n switch(funcname) {\n case 'ToggleColorZ': this.toggleColz(); break;\n default: return false;\n }\n\n return true;\n }\n\n /** @summary Fill pad toolbar for TASImage */\n fillToolbar() {\n let pp = this.getPadPainter(), obj = this.getObject();\n if (pp && obj?.fPalette) {\n pp.addPadButton('th2colorz', 'Toggle color palette', 'ToggleColorZ');\n pp.showPadButtons();\n }\n }\n\n /** @summary Draw TASImage object */\n static async draw(dom, obj, opt) {\n let painter = new TASImagePainter(dom, obj, opt);\n painter.decodeOptions(opt);\n return ensureTCanvas(painter, false)\n .then(() => painter.drawImage())\n .then(() => {\n painter.fillToolbar();\n return painter;\n });\n }\n\n} // class TASImagePainter\n\nexport { TASImagePainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file +{"version":3,"file":"647.f98f01d9b6ad4c05.js","mappings":"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","names":["TASImagePainter","ObjectPainter","decodeOptions","opt","this","options","Zscale","indexOf","createRGBA","nlevels","obj","getObject","fPalette","rgba","Array","indx","pal","lvl","l","fPoints","length","r1","r2","Math","min","round","fColorRed","fColorGreen","fColorBlue","fColorAlpha","makeUrlFromImageBuf","fp","_this","fImgBuf","max","k","v","fContour","arr","getLevels","getPaletteColor","zval","toHex","xmin","xmax","fWidth","ymin","ymax","fHeight","zoom_xmin","zoom_xmax","zoom_ymin","zoom_ymax","isNodeJs","__webpack_require__","then","h","default","createCanvas","Promise","resolveFunc","c","document","createElement","width","height","canvas","context","getContext","imageData","getImageData","data","i","dst","row","j","iii","putImageData","url","toDataURL","constRatio","fConstRatio","is_buf","makeUrlFromPngBuf","buf","fPngBuf","pngbuf","isStr","String","fromCharCode","btoa_func","drawImage","promise","_this2","getFramePainter","rect","getFrameRect","getPadPainter","getPadRect","wheel_zoomy","_blob","console","error","fImageQuality","fImageCompression","_typename","fUniqueID","fBits","fNumPoints","resolve","res","createG","append","attr","isMainPainter","drawColorPalette","setAxesRanges","create","clTAxis","createXY","ndim","check_pad_range","addInteractivity","canZoomInside","axis","enabled","can_move","_this3","draw_palette","clTPaletteAxis","Object","assign","fX1NDC","fX2NDC","fY1NDC","fY2NDC","fInit","fAxis","fChopt","pal_painter","findPainterFor","Enabled","removeG","frame_painter","drawPave","prev_name","selectCurrentPad","getPadName","TPavePainter","getDom","p","$secondary","redraw","toggleColz","reason","img","draw_g","select","empty","getFrameWidth","getFrameHeight","clickButton","funcname","fillToolbar","pp","addPadButton","showPadButtons","static","dom","painter","ensureTCanvas"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/draw/TASImagePainter.mjs"],"sourcesContent":["import { create, isNodeJs, isStr, btoa_func, clTPave, clTGaxis, clTAxis, clTPaletteAxis } from '../core.mjs';\nimport { toHex } from '../base/colors.mjs';\nimport { ObjectPainter } from '../base/ObjectPainter.mjs';\nimport { TPavePainter } from '../hist/TPavePainter.mjs';\nimport { ensureTCanvas } from '../gpad/TCanvasPainter.mjs';\n\n/**\n * @summary Painter for TASImage object.\n *\n * @private\n */\n\nclass TASImagePainter extends ObjectPainter {\n\n /** @summary Decode options string */\n decodeOptions(opt) {\n this.options = { Zscale: false };\n\n if (opt && (opt.indexOf('z') >= 0)) this.options.Zscale = true;\n }\n\n /** @summary Create RGBA buffers */\n createRGBA(nlevels) {\n let obj = this.getObject();\n\n if (!obj?.fPalette) return null;\n\n let rgba = new Array((nlevels+1) * 4), indx = 1, pal = obj.fPalette; // precaclucated colors\n\n for(let lvl = 0; lvl <= nlevels; ++lvl) {\n let l = 1.*lvl/nlevels;\n while ((pal.fPoints[indx] < l) && (indx < pal.fPoints.length-1)) indx++;\n\n let r1 = (pal.fPoints[indx] - l) / (pal.fPoints[indx] - pal.fPoints[indx-1]),\n r2 = (l - pal.fPoints[indx-1]) / (pal.fPoints[indx] - pal.fPoints[indx-1]);\n\n rgba[lvl*4] = Math.min(255, Math.round((pal.fColorRed[indx-1] * r1 + pal.fColorRed[indx] * r2) / 256));\n rgba[lvl*4+1] = Math.min(255, Math.round((pal.fColorGreen[indx-1] * r1 + pal.fColorGreen[indx] * r2) / 256));\n rgba[lvl*4+2] = Math.min(255, Math.round((pal.fColorBlue[indx-1] * r1 + pal.fColorBlue[indx] * r2) / 256));\n rgba[lvl*4+3] = Math.min(255, Math.round((pal.fColorAlpha[indx-1] * r1 + pal.fColorAlpha[indx] * r2) / 256));\n }\n\n return rgba;\n }\n\n /** @summary Create url using image buffer\n * @private */\n async makeUrlFromImageBuf(obj, fp) {\n\n let nlevels = 1000;\n this.rgba = this.createRGBA(nlevels); // precaclucated colors\n\n let min = obj.fImgBuf[0], max = obj.fImgBuf[0];\n for (let k = 1; k < obj.fImgBuf.length; ++k) {\n let v = obj.fImgBuf[k];\n min = Math.min(v, min);\n max = Math.max(v, max);\n }\n\n // does not work properly in Node.js, causes 'Maximum call stack size exceeded' error\n // min = Math.min.apply(null, obj.fImgBuf),\n // max = Math.max.apply(null, obj.fImgBuf);\n\n // create countor like in hist painter to allow palette drawing\n this.fContour = {\n arr: new Array(200),\n rgba: this.rgba,\n getLevels() { return this.arr; },\n getPaletteColor(pal, zval) {\n if (!this.arr || !this.rgba) return 'white';\n let indx = Math.round((zval - this.arr[0]) / (this.arr[this.arr.length-1] - this.arr[0]) * (this.rgba.length-4)/4) * 4;\n return '#' + toHex(this.rgba[indx],1) + toHex(this.rgba[indx+1],1) + toHex(this.rgba[indx+2],1) + toHex(this.rgba[indx+3],1);\n }\n };\n for (let k = 0; k < 200; k++)\n this.fContour.arr[k] = min + (max-min)/(200-1)*k;\n\n if (min >= max) max = min + 1;\n\n let xmin = 0, xmax = obj.fWidth, ymin = 0, ymax = obj.fHeight; // dimension in pixels\n\n if (fp && (fp.zoom_xmin != fp.zoom_xmax)) {\n xmin = Math.round(fp.zoom_xmin * obj.fWidth);\n xmax = Math.round(fp.zoom_xmax * obj.fWidth);\n }\n\n if (fp && (fp.zoom_ymin != fp.zoom_ymax)) {\n ymin = Math.round(fp.zoom_ymin * obj.fHeight);\n ymax = Math.round(fp.zoom_ymax * obj.fHeight);\n }\n\n let pr = isNodeJs() ?\n import('canvas').then(h => h.default.createCanvas(xmax - xmin, ymax - ymin)) :\n new Promise(resolveFunc => {\n let c = document.createElement('canvas');\n c.width = xmax - xmin;\n c.height = ymax - ymin;\n resolveFunc(c);\n });\n\n return pr.then(canvas => {\n\n let context = canvas.getContext('2d'),\n imageData = context.getImageData(0, 0, canvas.width, canvas.height),\n arr = imageData.data;\n\n for(let i = ymin; i < ymax; ++i) {\n let dst = (ymax - i - 1) * (xmax - xmin) * 4,\n row = i * obj.fWidth;\n for(let j = xmin; j < xmax; ++j) {\n let iii = Math.round((obj.fImgBuf[row + j] - min) / (max - min) * nlevels) * 4;\n // copy rgba value for specified point\n arr[dst++] = this.rgba[iii++];\n arr[dst++] = this.rgba[iii++];\n arr[dst++] = this.rgba[iii++];\n arr[dst++] = this.rgba[iii++];\n }\n }\n\n context.putImageData(imageData, 0, 0);\n\n return { url: canvas.toDataURL(), constRatio: obj.fConstRatio, is_buf: true };\n });\n }\n\n /** @summary Produce data url from png data */\n async makeUrlFromPngBuf(obj) {\n let buf = obj.fPngBuf, pngbuf = '';\n\n if (isStr(buf))\n pngbuf = buf;\n else\n for (let k = 0; k < buf.length; ++k)\n pngbuf += String.fromCharCode(buf[k] < 0 ? 256 + buf[k] : buf[k]);\n\n return { url: 'data:image/png;base64,' + btoa_func(pngbuf), constRatio: true };\n }\n\n /** @summary Draw image */\n async drawImage() {\n let obj = this.getObject(),\n fp = this.getFramePainter(),\n rect = fp ? fp.getFrameRect() : this.getPadPainter().getPadRect();\n\n this.wheel_zoomy = true;\n\n if (obj._blob) {\n // try to process blob data due to custom streamer\n if ((obj._blob.length == 15) && !obj._blob[0]) {\n obj.fImageQuality = obj._blob[1];\n obj.fImageCompression = obj._blob[2];\n obj.fConstRatio = obj._blob[3];\n obj.fPalette = {\n _typename: 'TImagePalette',\n fUniqueID: obj._blob[4],\n fBits: obj._blob[5],\n fNumPoints: obj._blob[6],\n fPoints: obj._blob[7],\n fColorRed: obj._blob[8],\n fColorGreen: obj._blob[9],\n fColorBlue: obj._blob[10],\n fColorAlpha: obj._blob[11]\n };\n\n obj.fWidth = obj._blob[12];\n obj.fHeight = obj._blob[13];\n obj.fImgBuf = obj._blob[14];\n\n if ((obj.fWidth * obj.fHeight != obj.fImgBuf.length) ||\n (obj.fPalette.fNumPoints != obj.fPalette.fPoints.length)) {\n console.error(`TASImage _blob decoding error ${obj.fWidth * obj.fHeight} != ${obj.fImgBuf.length} ${obj.fPalette.fNumPoints} != ${obj.fPalette.fPoints.length}`);\n delete obj.fImgBuf;\n delete obj.fPalette;\n }\n\n } else if ((obj._blob.length == 3) && obj._blob[0]) {\n obj.fPngBuf = obj._blob[2];\n if (obj.fPngBuf?.length != obj._blob[1]) {\n console.error(`TASImage with png buffer _blob error ${obj._blob[1]} != ${obj.fPngBuf?.length}`);\n delete obj.fPngBuf;\n }\n } else {\n console.error(`TASImage _blob len ${obj._blob.length} not recognized`);\n }\n\n delete obj._blob;\n }\n\n let promise;\n\n if (obj.fImgBuf && obj.fPalette) {\n promise = this.makeUrlFromImageBuf(obj, fp);\n } else if (obj.fPngBuf) {\n promise = this.makeUrlFromPngBuf(obj);\n } else {\n promise = Promise.resolve({});\n }\n\n return promise.then(res => {\n\n if (res.url)\n this.createG(fp ? true : false)\n .append('image')\n .attr('href', res.url)\n .attr('width', rect.width)\n .attr('height', rect.height)\n .attr('preserveAspectRatio', res.constRatio ? null : 'none');\n\n if (!res.url || !this.isMainPainter() || !res.is_buf || !fp)\n return this;\n\n return this.drawColorPalette(this.options.Zscale, true).then(() => {\n fp.setAxesRanges(create(clTAxis), 0, 1, create(clTAxis), 0, 1, null, 0, 0);\n fp.createXY({ ndim: 2, check_pad_range: false });\n return fp.addInteractivity();\n })\n });\n }\n\n /** @summary Checks if it makes sense to zoom inside specified axis range */\n canZoomInside(axis,min,max) {\n let obj = this.getObject();\n\n if (!obj?.fImgBuf)\n return false;\n\n if ((axis == 'x') && ((max - min) * obj.fWidth > 3)) return true;\n\n if ((axis == 'y') && ((max - min) * obj.fHeight > 3)) return true;\n\n return false;\n }\n\n /** @summary Draw color palette\n * @private */\n async drawColorPalette(enabled, can_move) {\n\n if (!this.isMainPainter())\n return null;\n\n if (!this.draw_palette) {\n let pal = create(clTPaletteAxis);\n Object.assign(pal, { fX1NDC: 0.91, fX2NDC: 0.95, fY1NDC: 0.1, fY2NDC: 0.9, fInit: 1 });\n pal.fAxis.fChopt = '+';\n this.draw_palette = pal;\n this.fPalette = true; // to emulate behaviour of hist painter\n }\n\n let pal_painter = this.getPadPainter().findPainterFor(this.draw_palette);\n\n if (!enabled) {\n if (pal_painter) {\n pal_painter.Enabled = false;\n pal_painter.removeG(); // completely remove drawing without need to redraw complete pad\n }\n return null;\n }\n\n let frame_painter = this.getFramePainter();\n\n // keep palette width\n if (can_move && frame_painter) {\n let pal = this.draw_palette;\n pal.fX2NDC = frame_painter.fX2NDC + 0.01 + (pal.fX2NDC - pal.fX1NDC);\n pal.fX1NDC = frame_painter.fX2NDC + 0.01;\n pal.fY1NDC = frame_painter.fY1NDC;\n pal.fY2NDC = frame_painter.fY2NDC;\n }\n\n if (pal_painter) {\n pal_painter.Enabled = true;\n return pal_painter.drawPave('');\n }\n\n\n let prev_name = this.selectCurrentPad(this.getPadName());\n\n return TPavePainter.draw(this.getDom(), this.draw_palette).then(p => {\n\n pal_painter = p;\n\n this.selectCurrentPad(prev_name);\n // mark painter as secondary - not in list of TCanvas primitives\n pal_painter.$secondary = true;\n\n // make dummy redraw, palette will be updated only from histogram painter\n pal_painter.redraw = function() {};\n });\n }\n\n /** @summary Toggle colz draw option\n * @private */\n toggleColz() {\n let obj = this.getObject(),\n can_toggle = obj && obj.fPalette;\n\n if (can_toggle) {\n this.options.Zscale = !this.options.Zscale;\n this.drawColorPalette(this.options.Zscale, true);\n }\n }\n\n /** @summary Redraw image */\n redraw(reason) {\n let img = this.draw_g ? this.draw_g.select('image') : null,\n fp = this.getFramePainter();\n\n if (img && !img.empty() && (reason !== 'zoom') && fp) {\n img.attr('width', fp.getFrameWidth()).attr('height', fp.getFrameHeight());\n } else {\n return this.drawImage();\n }\n }\n\n /** @summary Process click on TASImage-defined buttons */\n clickButton(funcname) {\n if (!this.isMainPainter()) return false;\n\n switch(funcname) {\n case 'ToggleColorZ': this.toggleColz(); break;\n default: return false;\n }\n\n return true;\n }\n\n /** @summary Fill pad toolbar for TASImage */\n fillToolbar() {\n let pp = this.getPadPainter(), obj = this.getObject();\n if (pp && obj?.fPalette) {\n pp.addPadButton('th2colorz', 'Toggle color palette', 'ToggleColorZ');\n pp.showPadButtons();\n }\n }\n\n /** @summary Draw TASImage object */\n static async draw(dom, obj, opt) {\n let painter = new TASImagePainter(dom, obj, opt);\n painter.decodeOptions(opt);\n return ensureTCanvas(painter, false)\n .then(() => painter.drawImage())\n .then(() => {\n painter.fillToolbar();\n return painter;\n });\n }\n\n} // class TASImagePainter\n\nexport { TASImagePainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file diff --git a/docs/665.b62c24ed8ec594bf.js b/docs/665.b62c24ed8ec594bf.js deleted file mode 100644 index 2ebfb7dea..000000000 --- a/docs/665.b62c24ed8ec594bf.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[665],{2665:(_,r,a)=>{a.r(r),a.d(r,{TArrowPainter:()=>d});var x=a(5368),f=a(1773),g=a(2454),M=a(1518),c=a(7222);class d extends g.tK{rotate(t,s,i){let h=this.wsize*Math.cos(t),e=this.wsize*Math.sin(t),n="";return void 0!==s&&void 0!==i?n=`M${Math.round(s-h)},${Math.round(i-e)}`:(h=-h,e=-e),n+=`l${Math.round(h)},${Math.round(e)}`,s&&void 0===i&&(n+="z"),n}createPath(){let t=Math.atan2(this.y2-this.y1,this.x2-this.x1),s=this.wsize*Math.cos(this.angle2),i=s*Math.cos(t),h=s*Math.sin(t),e="";return this.beg&&(e+=this.rotate(t-Math.PI-this.angle2,this.x1,this.y1)+this.rotate(t-Math.PI+this.angle2,this.beg>10)),this.mid%10==2&&(e+=this.rotate(t-Math.PI-this.angle2,(this.x1+this.x2-i)/2,(this.y1+this.y2-h)/2)+this.rotate(t-Math.PI+this.angle2,this.mid>10)),this.mid%10==1&&(e+=this.rotate(t-this.angle2,(this.x1+this.x2+i)/2,(this.y1+this.y2+h)/2)+this.rotate(t+this.angle2,this.mid>10)),this.end&&(e+=this.rotate(t-this.angle2,this.x2,this.y2)+this.rotate(t+this.angle2,this.end>10)),`M${Math.round(this.x1+(this.beg>10?i:0))},${Math.round(this.y1+(this.beg>10?h:0))}L${Math.round(this.x2-(this.end>10?i:0))},${Math.round(this.y2-(this.end>10?h:0))}`+e}moveStart(t,s){let i=Math.sqrt((this.x1-this.x2)**2+(this.y1-this.y2)**2),h=Math.sqrt((t-this.x1)**2+(s-this.y1)**2)/i,e=Math.sqrt((t-this.x2)**2+(s-this.y2)**2)/i;this.side=h>.9?1:e>.9?-1:0}moveDrag(t,s){1!=this.side&&(this.x1+=t,this.y1+=s),-1!=this.side&&(this.x2+=t,this.y2+=s),this.draw_g.select("path").attr("d",this.createPath())}moveEnd(t){if(t)return;let s=this.getObject(),i="";s.fX1=this.svgToAxis("x",this.x1,this.isndc),s.fX2=this.svgToAxis("x",this.x2,this.isndc),s.fY1=this.svgToAxis("y",this.y1,this.isndc),s.fY2=this.svgToAxis("y",this.y2,this.isndc),1!=this.side&&(i+=`SetX1(${s.fX1});;SetY1(${s.fY1});;`),-1!=this.side&&(i+=`SetX2(${s.fX2});;SetY2(${s.fY2});;`),this.submitCanvExec(i+"Notify();;")}redraw(){let t=this.getObject(),s=(0,f.BIT)(14),i=t.fOption,h=this.getPadPainter().getPadRect();this.wsize=Math.max(3,Math.round(Math.max(h.width,h.height)*t.fArrowSize*.8)),this.isndc=t.TestBit(s),this.angle2=t.fAngle/2/180*Math.PI,this.beg=this.mid=this.end=0,0==i.indexOf("<")&&(this.beg=0==i.indexOf("<|")?12:2),i.indexOf("->-")>=0?this.mid=1:i.indexOf("-|>-")>=0?this.mid=11:i.indexOf("-<-")>=0?this.mid=2:i.indexOf("-<|-")>=0&&(this.mid=12);let e=i.lastIndexOf(">"),n=i.lastIndexOf("|>"),l=i.length;e>=0&&e==l-1&&(this.end=n>=0&&n==l-2?11:1),this.createAttLine({attr:t}),this.createG(),this.x1=this.axisToSvg("x",t.fX1,this.isndc,!0),this.y1=this.axisToSvg("y",t.fY1,this.isndc,!0),this.x2=this.axisToSvg("x",t.fX2,this.isndc,!0),this.y2=this.axisToSvg("y",t.fY2,this.isndc,!0);let o=this.draw_g.append("svg:path").attr("d",this.createPath()).call(this.lineatt.func);return this.beg>10||this.end>10?(this.createAttFill({attr:t}),o.call(this.fillatt.func)):o.style("fill","none"),(0,f.isBatchMode)()||(0,c.Z)(this),this}static draw(t,s,i){return(0,x.Z)(function*(){let h=new d(t,s,i);return(0,M.ensureTCanvas)(h,!1).then(()=>h.redraw())})()}}}}]); -//# sourceMappingURL=665.b62c24ed8ec594bf.js.map \ No newline at end of file diff --git a/docs/665.b62c24ed8ec594bf.js.map b/docs/665.b62c24ed8ec594bf.js.map deleted file mode 100644 index e43c1c8c9..000000000 --- a/docs/665.b62c24ed8ec594bf.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"665.b62c24ed8ec594bf.js","mappings":"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","names":["TArrowPainter","ObjectPainter","rotate","angle","x0","y0","dx","this","wsize","Math","cos","dy","sin","res","undefined","round","createPath","atan2","y2","y1","x2","x1","dlen","angle2","path","beg","PI","mid","end","moveStart","x","y","fullsize","sqrt","sz1","sz2","side","moveDrag","draw_g","select","attr","moveEnd","not_changed","arrow","getObject","exec","fX1","svgToAxis","isndc","fX2","fY1","fY2","submitCanvExec","redraw","kLineNDC","BIT","oo","fOption","rect","getPadPainter","getPadRect","max","width","height","fArrowSize","TestBit","fAngle","indexOf","p1","lastIndexOf","p2","len","length","createAttLine","createG","axisToSvg","elem","append","call","lineatt","func","createAttFill","fillatt","style","isBatchMode","addMoveHandler","static","dom","obj","opt","painter","ensureTCanvas","then"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/draw/TArrowPainter.mjs"],"sourcesContent":["import { BIT, isBatchMode } from '../core.mjs';\nimport { ObjectPainter } from '../base/ObjectPainter.mjs';\nimport { ensureTCanvas } from '../gpad/TCanvasPainter.mjs';\nimport { addMoveHandler } from '../gui/utils.mjs';\n\n\n/** @summary Drawing TArrow\n * @private */\nclass TArrowPainter extends ObjectPainter {\n\n /** @summary Create line segment with rotation */\n rotate(angle, x0, y0) {\n let dx = this.wsize * Math.cos(angle), dy = this.wsize * Math.sin(angle), res = '';\n if ((x0 !== undefined) && (y0 !== undefined)) {\n res = `M${Math.round(x0-dx)},${Math.round(y0-dy)}`;\n } else {\n dx = -dx; dy = -dy;\n }\n res += `l${Math.round(dx)},${Math.round(dy)}`;\n if (x0 && (y0 === undefined)) res += 'z';\n return res;\n }\n\n /** @summary Create SVG path for the arrow */\n createPath() {\n let angle = Math.atan2(this.y2 - this.y1, this.x2 - this.x1),\n dlen = this.wsize * Math.cos(this.angle2),\n dx = dlen*Math.cos(angle), dy = dlen*Math.sin(angle),\n path = '';\n\n if (this.beg)\n path += this.rotate(angle - Math.PI - this.angle2, this.x1, this.y1) +\n this.rotate(angle - Math.PI + this.angle2, this.beg > 10);\n\n if (this.mid % 10 == 2)\n path += this.rotate(angle - Math.PI - this.angle2, (this.x1+this.x2-dx)/2, (this.y1+this.y2-dy)/2) +\n this.rotate(angle - Math.PI + this.angle2, this.mid > 10);\n\n if (this.mid % 10 == 1)\n path += this.rotate(angle - this.angle2, (this.x1+this.x2+dx)/2, (this.y1+this.y2+dy)/2) +\n this.rotate(angle + this.angle2, this.mid > 10);\n\n if (this.end)\n path += this.rotate(angle - this.angle2, this.x2, this.y2) +\n this.rotate(angle + this.angle2, this.end > 10);\n\n return `M${Math.round(this.x1 + (this.beg > 10 ? dx : 0))},${Math.round(this.y1 + (this.beg > 10 ? dy : 0))}` +\n `L${Math.round(this.x2 - (this.end > 10 ? dx : 0))},${Math.round(this.y2 - (this.end > 10 ? dy : 0))}` +\n path;\n }\n\n /** @summary Start interactive moving */\n moveStart(x,y) {\n let fullsize = Math.sqrt((this.x1-this.x2)**2 + (this.y1-this.y2)**2),\n sz1 = Math.sqrt((x-this.x1)**2 + (y-this.y1)**2)/fullsize,\n sz2 = Math.sqrt((x-this.x2)**2 + (y-this.y2)**2)/fullsize;\n if (sz1 > 0.9)\n this.side = 1;\n else if (sz2 > 0.9)\n this.side = -1;\n else\n this.side = 0;\n }\n\n /** @summary Continue interactive moving */\n moveDrag(dx,dy) {\n if (this.side != 1) { this.x1 += dx; this.y1 += dy; }\n if (this.side != -1) { this.x2 += dx; this.y2 += dy; }\n this.draw_g.select('path').attr('d', this.createPath());\n }\n\n /** @summary Finish interactive moving */\n moveEnd(not_changed) {\n if (not_changed) return;\n let arrow = this.getObject(), exec = '';\n arrow.fX1 = this.svgToAxis('x', this.x1, this.isndc);\n arrow.fX2 = this.svgToAxis('x', this.x2, this.isndc);\n arrow.fY1 = this.svgToAxis('y', this.y1, this.isndc);\n arrow.fY2 = this.svgToAxis('y', this.y2, this.isndc);\n if (this.side != 1) exec += `SetX1(${arrow.fX1});;SetY1(${arrow.fY1});;`;\n if (this.side != -1) exec += `SetX2(${arrow.fX2});;SetY2(${arrow.fY2});;`;\n this.submitCanvExec(exec + 'Notify();;');\n }\n\n /** @summary Redraw arrow */\n redraw() {\n let arrow = this.getObject(), kLineNDC = BIT(14),\n oo = arrow.fOption, rect = this.getPadPainter().getPadRect();\n\n this.wsize = Math.max(3, Math.round(Math.max(rect.width, rect.height) * arrow.fArrowSize*0.8));\n this.isndc = arrow.TestBit(kLineNDC);\n this.angle2 = arrow.fAngle/2/180 * Math.PI;\n this.beg = this.mid = this.end = 0;\n\n if (oo.indexOf('<') == 0)\n this.beg = (oo.indexOf('<|') == 0) ? 12 : 2;\n if (oo.indexOf('->-') >= 0)\n this.mid = 1;\n else if (oo.indexOf('-|>-') >= 0)\n this.mid = 11;\n else if (oo.indexOf('-<-') >= 0)\n this.mid = 2;\n else if (oo.indexOf('-<|-') >= 0)\n this.mid = 12;\n\n let p1 = oo.lastIndexOf('>'), p2 = oo.lastIndexOf('|>'), len = oo.length;\n if ((p1 >= 0) && (p1 == len-1))\n this.end = ((p2 >= 0) && (p2 == len-2)) ? 11 : 1;\n\n this.createAttLine({ attr: arrow });\n\n this.createG();\n\n this.x1 = this.axisToSvg('x', arrow.fX1, this.isndc, true);\n this.y1 = this.axisToSvg('y', arrow.fY1, this.isndc, true);\n this.x2 = this.axisToSvg('x', arrow.fX2, this.isndc, true);\n this.y2 = this.axisToSvg('y', arrow.fY2, this.isndc, true);\n\n let elem = this.draw_g.append('svg:path')\n .attr('d', this.createPath())\n .call(this.lineatt.func);\n\n if ((this.beg > 10) || (this.end > 10)) {\n this.createAttFill({ attr: arrow });\n elem.call(this.fillatt.func);\n } else {\n elem.style('fill','none');\n }\n\n if (!isBatchMode())\n addMoveHandler(this);\n\n return this;\n }\n\n /** @summary Draw TArrow object */\n static async draw(dom, obj, opt) {\n let painter = new TArrowPainter(dom, obj,opt);\n return ensureTCanvas(painter, false).then(() => painter.redraw());\n }\n\n} // class TArrowPainter\n\nexport { TArrowPainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file diff --git a/docs/680.52fd2861264b5cb7.js b/docs/680.52fd2861264b5cb7.js new file mode 100644 index 000000000..ba71002fc --- /dev/null +++ b/docs/680.52fd2861264b5cb7.js @@ -0,0 +1,2 @@ +(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[680],{1680:()=>{}}]); +//# sourceMappingURL=680.52fd2861264b5cb7.js.map \ No newline at end of file diff --git a/docs/765.d54816cb7021354f.js.map b/docs/680.52fd2861264b5cb7.js.map similarity index 58% rename from docs/765.d54816cb7021354f.js.map rename to docs/680.52fd2861264b5cb7.js.map index 91b5bfb79..a719cda80 100644 --- a/docs/765.d54816cb7021354f.js.map +++ b/docs/680.52fd2861264b5cb7.js.map @@ -1 +1 @@ -{"version":3,"file":"765.d54816cb7021354f.js","mappings":"","names":[],"sourceRoot":"webpack:///","sources":[],"sourcesContent":[],"x_google_ignoreList":[]} \ No newline at end of file +{"version":3,"file":"680.52fd2861264b5cb7.js","mappings":"","names":[],"sourceRoot":"webpack:///","sources":[],"sourcesContent":[],"x_google_ignoreList":[]} \ No newline at end of file diff --git a/docs/680.7cef058bf72a659f.js b/docs/680.7cef058bf72a659f.js deleted file mode 100644 index 1b5096d4a..000000000 --- a/docs/680.7cef058bf72a659f.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[680],{1156:(y,o,s)=>{s.r(o),s.d(o,{drawPolyLine3D:()=>d,drawPolyMarker3D:()=>P});var u=s(5368),i=s(1773),p=s(6772),h=s(3182),D=s(3083);function f(t,r){let a=t.getFramePainter();if(!a?.mode3d||!r)return null;if(a?.toplevel)return a;let e=t.getMainPainter();return e?(0,i.isFunc)(e.drawExtras)?e.drawExtras(r):null:(0,h.drawDummy3DGeom)(t)}function P(){return l.apply(this,arguments)}function l(){return(l=(0,u.Z)(function*(){let r=f(this,this.getObject());return(0,i.isObject)(r)&&r.grx&&r.gry&&r.grz?(this.$fp=r,D.Y.bind(this)()):r})).apply(this,arguments)}function d(){return _.apply(this,arguments)}function _(){return(_=(0,u.Z)(function*(){let t=this.getObject(),r=f(this,t);if(!((0,i.isObject)(r)&&r.grx&&r.gry&&r.grz))return r;let a=3*t.fN,e=t.fP,g=[];for(let n=3;n{A.r(ot),A.d(ot,{RH2Painter:()=>J});var H=A(5368),F=A(1773),st=A(2912),at=A(1671),it=A(5611),xt=A(8597),ct=A(6717);class W extends xt.n{constructor(t,i){super(t,i),this.wheel_zoomy=!0}cleanup(){delete this.tt_handle,super.cleanup()}getDimension(){return 2}toggleProjection(t,i){if("Projections"==t&&(t=""),(0,F.isStr)(t)&&t.length>1&&(i=parseInt(t.slice(1)),t=t[0]),i||(i=1),t&&this.is_projection==t){if(this.projection_width!==i)return void(this.projection_width=i);t=""}delete this.proj_hist;let e=this.is_projection===t?"":t;this.is_projection="",this.projection_width=i,this.provideSpecialDrawArea(e).then(()=>(this.is_projection=e,this.redrawProjection()))}redrawProjection(){}executeMenuCommand(t,i){return!!super.executeMenuCommand(t,i)||("SetShowProjectionX"==t.fName||"SetShowProjectionY"==t.fName)&&(this.toggleProjection(t.fName[17],i&&parseInt(i)?parseInt(i):1),!0)}fillHistContextMenu(t){t.add("sub:Projections",()=>this.toggleProjection());let i=this.is_projection||"";i&&(i+=this.projection_width);let e=["X1","X2","X3","X5","X10","Y1","Y2","Y3","Y5","Y10"];for(let o=0;othis.toggleProjection(l));t.add("endsub:"),t.add("Auto zoom-in",()=>this.autoZoom());let r=this.getSupportedDrawOptions();t.addDrawMenu("Draw with",r,o=>{if("inspect"===o)return this.showInspector();this.decodeOptions(o),this.interactiveRedraw("pad","drawopt")}),this.options.Color&&this.fillPaletteMenu(t)}clickButton(t){if(super.clickButton(t))return!0;switch(t){case"ToggleColor":this.toggleColor();break;case"Toggle3D":this.toggleMode3D();break;default:return!1}return!0}fillToolbar(){super.fillToolbar(!0);let t=this.getPadPainter();t&&(t.addPadButton("th2color","Toggle color","ToggleColor"),t.addPadButton("th2colorz","Toggle color palette","ToggleColorZ"),t.addPadButton("th2draw3d","Toggle 3D mode","Toggle3D"),t.showPadButtons())}toggleColor(){this.options.Mode3D?(this.options.Mode3D=!1,this.options.Color=!0):this.options.Color=!this.options.Color,this.redraw()}autoZoom(){let o,l,t=this.getSelectIndex("x","left",-1),i=this.getSelectIndex("x","right",1),e=this.getSelectIndex("y","left",-1),r=this.getSelectIndex("y","right",1),u=this.getHisto(),f=this.getAxis("x"),w=this.getAxis("y");if(t==i||e==r)return;let x=u.getBinContent(t+1,e+1);for(o=t;o0)return;let h=i,n=t,a=r,c=e;for(o=t;ox&&(o=n&&(n=o+1),l=c&&(c=l+1));let g,m,d,y,s=!1;return h===n-1&&h>t+1&&ne+1&&ct||ne||c0?r.fContMinPos:null,this.gmaxbin=r.fContMax;else for(this.gminbin=this.gmaxbin=r.getBinContent(1,1),this.gminposbin=null,i=0;ithis.gmaxbin&&(this.gmaxbin=o),o>0&&(null===this.gminposbin||this.gminposbin>o)&&(this.gminposbin=o)}this.zmin=this.gminbin,this.zmax=this.gmaxbin,null===this.gminposbin&&(this.gminposbin=1e-4*this.gmaxbin),this.draw_content=!(this.options.Axis>0)&&this.gmaxbin>0}countStat(t){let f,w,x,h,n,y,s,i=this.getHisto(),e=0,r=0,o=0,l=0,u=0,a={name:"histo",entries:0,integral:0,meanx:0,meany:0,rmsx:0,rmsy:0,matrix:[0,0,0,0,0,0,0,0,0],xmax:0,ymax:0,wmax:null},c=this.getSelectIndex("x","left"),g=this.getSelectIndex("x","right"),m=this.getSelectIndex("y","left"),d=this.getSelectIndex("y","right"),M=this.getAxis("x"),b=this.getAxis("y");for(y=1;y<=this.nbinsx;++y)for(f=y<=c+1?0:y>g+1?2:1,x=M.GetBinCoord(y-.5),s=1;s<=this.nbinsy;++s)w=s<=m+1?0:s>d+1?2:1,h=b.GetBinCoord(s-.5),n=i.getBinContent(y,s),a.entries+=n,a.matrix[3*w+f]+=n,1==f&&1==w&&(t&&!t(x,h)||((null===a.wmax||n>a.wmax)&&(a.wmax=n,a.xmax=x,a.ymax=h),e+=n,r+=x*n,o+=h*n,l+=x**2*n,u+=h**2*n));return Math.abs(e)>1e-300&&(a.meanx=r/e,a.meany=o/e,a.rmsx=Math.sqrt(Math.abs(l/e-a.meanx**2)),a.rmsy=Math.sqrt(Math.abs(u/e-a.meany**2))),null===a.wmax&&(a.wmax=0),a.integral=e,a}fillStatistic(t,i){let e=this.countStat(),r=Math.floor(i%10),o=Math.floor(i/10)%10,l=Math.floor(i/100)%10,u=Math.floor(i/1e3)%10,f=Math.floor(i/1e4)%10,w=Math.floor(i/1e5)%10,x=Math.floor(i/1e6)%10,h=Math.floor(i/1e7)%10,n=Math.floor(i/1e8)%10;if(t.clearStat(),r>0&&t.addText(e.name),o>0&&t.addText("Entries = "+t.format(e.entries,"entries")),l>0&&(t.addText("Mean x = "+t.format(e.meanx)),t.addText("Mean y = "+t.format(e.meany))),u>0&&(t.addText("Std Dev x = "+t.format(e.rmsx)),t.addText("Std Dev y = "+t.format(e.rmsy))),x>0&&t.addText("Integral = "+t.format(e.matrix[4],"entries")),h>0&&(t.addText("Skewness x = "),t.addText("Skewness y = ")),n>0&&t.addText("Kurt = "),f>0||w>0){let a=e.matrix;t.addText(a[6].toFixed(0)+" | "+a[7].toFixed(0)+" | "+a[7].toFixed(0)),t.addText(a[3].toFixed(0)+" | "+a[4].toFixed(0)+" | "+a[5].toFixed(0)),t.addText(a[0].toFixed(0)+" | "+a[1].toFixed(0)+" | "+a[2].toFixed(0))}return!0}drawBinsColor(){const t=this.getHisto(),i=this.prepareDraw(),e=i.stepi,r=i.stepj,o=[];let u,f,w,x,h,n,a,c,g,m;const d=()=>{m.path+=`h${a}v${m.y2-m.y}h${-a}z`,m.dy=0,m=null};for(x=i.i1;x{y&&this.draw_g.append("svg:path").style("fill",i.palette.getColor(s)).attr("d",y.path)}),this.updatePaletteDraw(),i}buildContour(t,i,e,r){let n,a,g,b,_,B,C,j,p,P,k,Z,T,lt,I,o=this.getHisto(),l=2004,f=new Float32Array(2*l),w=new Float32Array(2*l),x=new Int32Array(2*l),h=0,c=[],m=0,d=[0,0,0,0],y=[0,0,0,0],s=[0,0,0,0],M=[0,0,0,0],Q=t.stepi,E=t.stepj;function pt(G){for(let v=0;vs[j]&&(C=j),C++,h=1,p=1;p<=4;p++)j=C%4+1,P=ht(s[C-1],M[C-1],d[C-1],y[C-1],s[j-1],M[j-1],d[j-1],y[j-1]),h+=2*P,C=j;for(C=s[0]<=s[1]?0:1,j=s[2]<=s[3]?2:3,s[C]>s[j]&&(C=j),C++,h=2,p=1;p<=4;p++)j=1==C?4:C-1,P=ht(s[C-1],M[C-1],d[C-1],y[C-1],s[j-1],M[j-1],d[j-1],y[j-1]),h+=2*P,C=j;for(k=0,p=1;p<=h-5;p+=2)for(;x[p-1]!=x[p];){for(Z=f[p],T=w[p],lt=x[p],I=p;I<=h-5;I+=2)f[I]=f[I+2],w[I]=w[I+2],x[I]=x[I+2];if(f[h-3]=Z,w[h-3]=T,x[h-3]=lt,k>2e3)break;k++}if(k>2e3)continue;for(p=1;p<=h-2;p+=2)n=x[p-1],n>=0&&n=0){rt=n;break}for(B=0,n=rt-1;n>=0;n--)et[B]=n,B++;for(n=rt;n0&&v[b+1]===X[D]&&$[b+1]===L[D]&&(D--,X[D]=v[b],L[D]=$[b],v[b]=v[b+1]=R,$[b]=$[b+1]=O,U++);if(0==U)break}for(D+1=0&&r(G,X,L,D,z,n),S=0,b=2;b{let m,d,y,s,g="";for(let M=n;M<=a;++M){if(f?(d=f(x[M],h[M]),d.x=Math.round(t.grx(d.x)),d.y=Math.round(t.gry(d.y))):d={x:Math.round(x[M]),y:Math.round(h[M])},g)if(M==a&&y&&d.x==y.x&&d.y==y.y){if(!s)return"";g+="z",c=!1}else d.x!=m.x&&d.y!=m.y?(g+="l"+(d.x-m.x)+","+(d.y-m.y),s=!0):d.x!=m.x?(g+="h"+(d.x-m.x),s=!0):d.y!=m.y&&(g+="v"+(d.y-m.y),s=!0);else g="M"+d.x+","+d.y,y=d;m=d}return c&&(g+="z"),g};if(14===this.options.Contour){let x=`M0,0h${i}v${e}h${-i}z`;if(this.options.Proj){let h=r.stepj,n=parseInt((r.j2-r.j1)/h),a=new Float32Array(2*n),c=new Float32Array(2*n);for(let g=0;g{let d,g=l.getColor(x),m=g;switch(this.options.Contour){case 1:case 14:break;case 11:m="none",d=new at.rE({color:g});break;case 12:m="none",d=new at.rE({color:1,style:x%5+1,width:1});break;case 13:m="none",d=this.lineatt}let y=w(h,n,a,c,"none"!=m);if(!y)return;let s=this.draw_g.append("svg:path").attr("class","th2_contour").attr("d",y).style("fill",m);d&&s.call(d.func)}),r.hide_only_zeros=!0,r}createPolyBin(){return""}drawBinsText(t){let e,r,o,l,u,f,w,x,h,n,i=this.getHisto();null===t&&(t=this.prepareDraw({rounding:!1}));let a=this.v7EvalFont("text",{size:20,color:"black",align:22}),c=0,g=this.draw_g.append("svg:g").attr("class","th2_text"),m=t.stepi,d=t.stepj;for(this.options.BarOffset&&(c=this.options.BarOffset),this.startTextDrawing(a,"font",g),e=t.i1;e(t.hide_only_zeros=!0,t))}drawBinsArrow(){let e,r,l,u,f,w,x,h,n,a,c,g,m,d,y,t=this.getHisto(),i="",o=1e-30,s=this.prepareDraw({rounding:!1}),M=(s.grx[s.i2]-s.grx[s.i1])/(s.i2-s.i1+1-.03)/2,b=(s.gry[s.j2]-s.gry[s.j1])/(s.j2-s.j1+1-.03)/2,_=s.stepi,B=s.stepj;const C=(j,p)=>j?p?`l${j},${p}`:`h${j}`:p?`v${p}`:"";for(let j=0;j<2;++j)for(e=s.i1;e=s.i2-_?t.getBinContent(e+1,r+1)-t.getBinContent(e+1-_,r+1):.5*(t.getBinContent(e+1+_,r+1)-t.getBinContent(e+1-_,r+1)),u=r===s.j1?t.getBinContent(e+1,r+1+B)-t.getBinContent(e+1,r+1):r>=s.j2-B?t.getBinContent(e+1,r+1)-t.getBinContent(e+1,r+1-B):.5*(t.getBinContent(e+1,r+1+B)-t.getBinContent(e+1,r+1-B)),0===j?o=Math.max(o,Math.abs(l),Math.abs(u)):(f=(s.grx[e]+s.grx[e+_])/2,w=(s.gry[r]+s.gry[r+B])/2,x=M*l/o,h=b*u/o,n=f-x,a=f+x,c=w-h,g=w+h,l=Math.round(a-n),u=Math.round(g-c),(0!==l||0!==u)&&(i+="M"+Math.round(n)+","+Math.round(c)+C(l,u),(Math.abs(l)>5||Math.abs(u)>5)&&(m=Math.sqrt(2/(l**2+u**2)),d=Math.round(m*(l+u)),y=Math.round(m*(l-u)),(d||y)&&(i+=`m${-d},${y}`+C(d,-y)+C(-y,-d)))));return this.draw_g.append("svg:path").attr("d",i).style("fill","none").call(this.lineatt.func),s}drawBinsBox(){let t=this.getHisto(),i=this.prepareDraw({rounding:!1}),e=this.getFramePainter();e.maxbin===e.minbin&&(e.maxbin=this.gmaxbin,e.minbin=this.gminbin,e.minposbin=this.gminposbin),e.maxbin===e.minbin&&(e.minbin=Math.min(0,e.maxbin-1));let l,u,f,w,c,g,m,d,y,s,M,b,r=Math.max(Math.abs(e.maxbin),Math.abs(e.minbin)),o=Math.max(0,e.minbin),x="",h="",n="",a="",_=!1,B=0,C=i.stepi,j=i.stepj;if(e.logz&&r>0){_=!0;let p=Math.log(r);B=o>0?Math.log(o):e.minposbin>=1&&e.minposbin<100?Math.log(.7):e.minposbin>0?Math.log(.7*e.minposbin):p-10,B>=p&&(B=p-10),b=1/(p-B)}else b=1/(r-o);for(l=i.i1;l0?Math.log(w)-B:0:w-o,c=.5*(c<0?1:1-Math.sqrt(c*b)),c<0&&(c=0),s=i.grx[l+C]-i.grx[l],M=i.gry[u]-i.gry[u+j],g=c*s,m=c*M,d=Math.round(i.grx[l]+g),y=Math.round(i.gry[u+j]+m),s=Math.max(Math.round(s-2*g),1),M=Math.max(Math.round(M-2*m),1),x+=`M${d},${y}v${M}h${s}v${-M}z`,f<0&&10===this.options.BoxStyle&&(h+=`M${d},${y}l${s},${M}M${d+s},${y}l${-s},${M}`),11===this.options.BoxStyle&&s>5&&M>5)){let p=Math.round(.1*s),P=Math.round(.1*M),k=`M${d},${y}h${s}l${-p},${P}h${2*p-s}v${M-2*P}l${-p},${P}z`,Z=`M${d+s},${y+M}v${-M}l${-p},${P}v${M-2*P}h${2*p-s}l${-p},${P}z`;f<0?(a+=k,n+=Z):(n+=k,a+=Z)}if(x){let p=this.draw_g.append("svg:path").attr("d",x).call(this.fillatt.func);11!==this.options.BoxStyle&&this.fillatt.empty()&&p.call(this.lineatt.func)}if(n&&this.fillatt.hasColor()&&this.draw_g.append("svg:path").attr("d",n).call(this.fillatt.func).style("fill",(0,st.B8)(this.fillatt.color).brighter(.5).formatHex()),a&&this.draw_g.append("svg:path").attr("d",a).call(this.fillatt.func).style("fill",this.fillatt.hasColor()?(0,st.B8)(this.fillatt.color).darker(.5).formatHex():"red"),h){let p=this.draw_g.append("svg:path").attr("d",h).style("fill","none");this.lineatt.empty()||p.call(this.lineatt.func)}return i}drawBinsScatter(){let f,w,x,h,n,a,c,g,t=this.getHisto(),i=this.prepareDraw({rounding:!0,pixel_density:!0,scatter_plot:!0}),e=[],r=[],o=[],l=[],u=[],m=1,d=this.options.ScatCoef*(this.gmaxbin>2e3?2e3/this.gmaxbin:1),y=i.stepi,s=i.stepj,M=new it.q9(i.sumz);if(d*i.sumz<1e5){this.createv7AttMarker(),this.markeratt.resetPos();let j,p,C="";for(h=i.i1;h.7&&(m=.7/this.maxbin),h=i.i1;h0&&(_=b.insert("svg:defs",":first-child")),this.createv7AttMarker();let B=i.palette.getContour();for(f=0;f0&&(o=t.drawBinsContour(r,e.width,e.height)),t.options.Text&&(l=t.drawBinsText(o)),!o&&!l&&(o=t.drawBinsColor()),l||(l=Promise.resolve(o)),l.then(u=>(t.tt_handle=u,t))})()}getBinTooltips(t,i){let e=[],r=this.getHisto(),o=r.getBinContent(t+1,i+1),l=1,u=1;this.isDisplayItem()&&(l=r.stepx||1,u=r.stepy||1),e.push(this.getObjectHint()||"histo<2>"),e.push("x = "+this.getAxisBinTip("x",t,l),"y = "+this.getAxisBinTip("y",i,u)),e.push(`bin = ${t+1}, ${i+1}`),r.$baseh&&(o-=r.$baseh.getBinContent(t+1,i+1));let f="entries = "+(l>1||u>1?"~":"");return o===Math.round(o)?e.push(f+o):e.push(f+(0,it.Ee)(o,F.gStyle.fStatFormat)),e}getPolyBinTooltips(){return[]}processTooltipEvent(t){if(!t||!this.draw_content||!this.draw_g||!this.tt_handle||this.options.Proj)return this.draw_g&&this.draw_g.select(".tooltip_bin").remove(),null;let i=this.getHisto(),e=this.tt_handle,r=this.draw_g.select(".tooltip_bin");if(e.poly)return null;let o,l,u=0,f=null;for(o=e.i1;o=e.grx[o]&&t.x<=e.grx[o+1]);++o);for(l=e.j1;l=e.gry[l+1]&&t.y<=e.gry[l]);++l);if(o1){let s=(this.projection_width-1)/2;a+s>=e.j2?(a=Math.min(Math.round(a+s),e.j2),n=Math.max(a-this.projection_width,e.j1)):(n=Math.max(Math.round(n-s),e.j1),a=Math.min(n+this.projection_width,e.j2))}m=e.gry[a],d=e.gry[n],y=777*n+333*a}else if("Y"==this.is_projection){if(m=0,d=this.getFramePainter().getFrameHeight(),this.projection_width>1){let s=(this.projection_width-1)/2;h+s>=e.i2?(h=Math.min(Math.round(h+s),e.i2),x=Math.max(h-this.projection_width,e.i1)):(x=Math.max(Math.round(x-s),e.i1),h=Math.min(x+this.projection_width,e.i2))}c=e.grx[x],g=e.grx[h],y=777*x+333*h}w.changed=r.property("current_bin")!==y,w.changed&&r.attr("x",c).attr("width",g-c).attr("y",m).attr("height",d-m).style("opacity","0.7").property("current_bin",y),this.is_projection&&w.changed&&this.redrawProjection(x,h,n,a)}return w.changed&&(w.user_info={obj:i,name:"histo",bin:i.getBin(o+1,l+1),cont:u,binx:o+1,biny:l+1,grx:t.x,gry:t.y}),w}canZoomInside(t,i,e){if("z"==t)return!0;let r=this.getAxis(t);return r.FindBin(e,.5)-r.FindBin(i,0)>1}draw2D(t){var i=this;return(0,H.Z)(function*(){return i.clear3DScene(),i.drawFrameAxes().then(e=>!!e&&i.drawingBins(t)).then(e=>{if(e)return i.draw2DBins().then(()=>i.addInteractivity())}).then(()=>i)})()}draw3D(t){var i=this;return(0,H.Z)(function*(){return console.log("3D drawing is disabled, load ./hist/RH1Painter.mjs"),i.draw2D(t)})()}callDrawFunc(t){var i=this;return(0,H.Z)(function*(){let e=i.getFramePainter();return e&&e.mode3d!==i.options.Mode3D&&!i.isMainPainter()&&(i.options.Mode3D=e.mode3d),i.options.Mode3D?i.draw3D(t):i.draw2D(t)})()}redraw(t){var i=this;return(0,H.Z)(function*(){return i.callDrawFunc(t)})()}static _draw(t){return(0,H.Z)(function*(){return(0,ct.ensureRCanvas)(t).then(()=>{t.setAsMainPainter(),t.options={Hist:!1,Error:!1,Zero:!1,Mark:!1,Line:!1,Fill:!1,Lego:0,Surf:0,Text:!0,TextAngle:0,TextKind:"",BaseLine:!1,Mode3D:!1,AutoColor:0,Color:!1,Scat:!1,ScatCoef:1,Box:!1,BoxStyle:0,Arrow:!1,Contour:0,Proj:0,BarOffset:0,BarWidth:1,minimum:F.kNoZoom,maximum:F.kNoZoom};let i=t.v7EvalAttr("kind",""),e=t.v7EvalAttr("sub",0),r=t.options;switch(r.Text=t.v7EvalAttr("drawtext",!1),i){case"lego":r.Lego=e>0?10+e:12,r.Mode3D=!0;break;case"surf":r.Surf=e>0?10+e:1,r.Mode3D=!0;break;case"box":r.Box=!0,r.BoxStyle=10+e;break;case"err":r.Error=!0,r.Mode3D=!0;break;case"cont":r.Contour=e>0?10+e:1;break;case"arr":r.Arrow=!0;break;case"scat":r.Scat=!0;break;case"col":r.Color=!0;break;default:r.Text||(r.Color=!0)}return t._show_empty_bins=!1,t.scanContent(),t.callDrawFunc()})})()}static draw(t,i,e){return(0,H.Z)(function*(){return W._draw(new W(t,i),e)})()}}var mt=A(757),K=A(3641);class J extends W{draw3DBins(){if(this.draw_content){if(this.options.Surf)return(0,K.c5)(this,!0);if(this.options.Error)return(0,K.me)(this,!0);if(this.options.Contour)return(0,K.ME)(this,!0,!0);(0,K.UR)(this,!0),this.updatePaletteDraw()}}draw3D(t){this.mode3d=!0;let i=this.getFramePainter(),e=this.isMainPainter(),r=Promise.resolve(this);if("resize"==t)return e&&i.resize3D()&&i.render3D(),r;let o=1+2*F.gStyle.fHistTopMargin;return this.zmin=i.logz?.3*this.gminposbin:this.gminbin,this.zmax=this.gmaxbin,this.options.minimum!==F.kNoZoom&&(this.zmin=this.options.minimum),this.options.maximum!==F.kNoZoom&&(this.zmax=this.options.maximum,o=1),i.logz&&this.zmin<=0&&(this.zmin=1e-5*this.zmax),this.deleteAttr(),e&&((0,K.g_)(i),r=i.create3DScene(this.options.Render3D).then(()=>{i.setAxesRanges(this.getAxis("x"),this.xmin,this.xmax,this.getAxis("y"),this.ymin,this.ymax,null,this.zmin,this.zmax),i.set3DOptions(this.options),i.drawXYZ(i.toplevel,mt.C,{zmult:o,zoom:F.settings.Zooming,ndim:2,draw:!0,v7:!0})})),i.mode3d?r.then(()=>this.drawingBins(t)).then(()=>{let l=this.getFramePainter();return this.draw3DBins(),l.render3D(),l.addKeysHandler(),this}):r}static draw(t,i,e){return(0,H.Z)(function*(){return J._draw(new J(t,i),e)})()}}}}]); -//# sourceMappingURL=7.26ceec994b6894fa.js.map \ No newline at end of file diff --git a/docs/7.26ceec994b6894fa.js.map b/docs/7.26ceec994b6894fa.js.map deleted file mode 100644 index ef486360d..000000000 --- a/docs/7.26ceec994b6894fa.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"7.26ceec994b6894fa.js","mappings":"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","names":["RH2Painter","RHistPainter","constructor","dom","histo","super","this","wheel_zoomy","cleanup","tt_handle","getDimension","toggleProjection","kind","width","isStr","length","parseInt","slice","is_projection","projection_width","proj_hist","new_proj","provideSpecialDrawArea","then","redrawProjection","executeMenuCommand","method","args","fName","fillHistContextMenu","menu","add","kinds","k","addchk","arg","autoZoom","opts","getSupportedDrawOptions","addDrawMenu","showInspector","decodeOptions","interactiveRedraw","options","Color","fillPaletteMenu","clickButton","funcname","toggleColor","toggleMode3D","fillToolbar","pp","getPadPainter","addPadButton","showPadButtons","Mode3D","redraw","i","j","i1","getSelectIndex","i2","j1","j2","getHisto","xaxis","getAxis","yaxis","min","getBinContent","Math","ileft","iright","jleft","jright","xmin","xmax","ymin","ymax","isany","GetBinCoord","getFramePainter","zoom","scanContent","when_axis_changed","nbinsx","nbinsy","extractAxesProperties","isDisplayItem","gminbin","fContMin","gminposbin","fContMinPos","gmaxbin","fContMax","bin_content","zmin","zmax","draw_content","Axis","countStat","cond","xside","yside","xx","yy","zz","xi","yi","stat_sum0","stat_sumx1","stat_sumy1","stat_sumx2","stat_sumy2","res","name","entries","integral","meanx","meany","rmsx","rmsy","matrix","wmax","xleft","xright","yleft","yright","abs","sqrt","fillStatistic","stat","dostat","data","print_name","floor","print_entries","print_mean","print_rms","print_under","print_over","print_integral","print_skew","print_kurt","clearStat","addText","format","m","toFixed","drawBinsColor","handle","prepareDraw","di","stepi","dj","stepj","colindx","cmd1","cmd2","binz","dx","dy","entry","last_entry","flush_last_entry","path","y2","y","grx","palette","getContourIndex","Zero","_show_empty_bins","gry","undefined","x","forEach","draw_g","append","style","getColor","attr","updatePaletteDraw","buildContour","levels","contour_func","ipoly","poly","np","n","ix","ljfill","count","xsave","ysave","itars","jx","kMAXCONTOUR","xarr","Float32Array","yarr","itarr","Int32Array","lj","polys","npmax","zc","ir","BinarySearch","kk","PaintContourLine","elev1","icont1","x1","y1","elev2","icont2","x2","xlen","pdif","diff","elev","vert","tlen","tdif","ii","maxii","icount","arrx","original","origx","arry","origy","createTPolyLine","fLastPoint","fN","fX","round","fY","max","polysort","first","xp","yp","iminus","iplus","nadd","istart","drawBinsContour","funcs","frame_w","frame_h","rounding","extra","Proj","main","getHistPalette","getContour","func","getProjectionFunc","BuildPath","do_close","last","pnt","cmd","Contour","dd","sz","xd","yd","lineatt","icol","fillcolor","TAttLineHandler","color","elem","call","hide_only_zeros","createPolyBin","drawBinsText","binw","binh","text","height","textFont","v7EvalFont","size","align","text_offset","text_g","BarOffset","startTextDrawing","toString","floatToString","gStyle","angle","drawText","latex","finishTextDrawing","drawBinsArrow","xc","yc","dxn","dyn","anr","si","co","dn","scale_x","scale_y","makeLine","loop","drawBinsBox","maxbin","minbin","minposbin","absz","zdiff","dgrx","dgry","ww","hh","xyfactor","absmax","absmin","cross","btn1","btn2","uselogz","logmin","logz","logmax","log","BoxStyle","pww","phh","side1","side2","fillatt","empty","hasColor","d3_rgb","brighter","formatHex","darker","drawBinsScatter","cw","ch","pixel_density","scatter_plot","colPaths","currx","curry","cell_w","cell_h","factor","scale","ScatCoef","rnd","TRandom","sumz","createv7AttMarker","markeratt","resetPos","npix","create","random","layer","getFrameSvg","select","defs","insert","cntr","pattern_class","pattern","internals","selectAll","remove","draw2DBins","_this","removeG","createHistDrawAttributes","createG","pmain","rect","getFrameRect","getGrFuncs","second_x","second_y","pr","Scat","Box","Arrow","Text","Promise","resolve","h","getBinTooltips","lines","stepx","stepy","push","getObjectHint","getAxisBinTip","$baseh","lbl","getPolyBinTooltips","processTooltipEvent","ttrect","title","fTitle","color1","color2","getFillColorAlt","exact","disabled","changed","binid","getFrameWidth","getFrameHeight","property","user_info","obj","bin","getBin","cont","binx","biny","canZoomInside","axis","FindBin","draw2D","reason","clear3DScene","_this2","drawFrameAxes","drawingBins","addInteractivity","draw3D","console","_this3","callDrawFunc","_this4","mode3d","isMainPainter","_this5","static","painter","ensureRCanvas","setAsMainPainter","Hist","Error","Mark","Line","Fill","Lego","Surf","TextAngle","TextKind","BaseLine","AutoColor","BarWidth","minimum","kNoZoom","maximum","v7EvalAttr","sub","o","opt","_draw","RH2Painter2D","draw3DBins","drawBinsSurf3D","drawBinsError3D","drawBinsContour3D","drawBinsLego","is_main","resize3D","render3D","zmult","deleteAttr","assignFrame3DMethods","create3DScene","Render3D","setAxesRanges","set3DOptions","drawXYZ","toplevel","RAxisPainter","settings","ndim","draw","v7","addKeysHandler"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/hist2d/RH2Painter.mjs","../node_modules/jsroot/modules/hist/RH2Painter.mjs"],"sourcesContent":["import { gStyle, internals, isStr, createTPolyLine, kNoZoom } from '../core.mjs';\nimport { rgb as d3_rgb } from '../d3.mjs';\nimport { TAttLineHandler } from '../base/TAttLineHandler.mjs';\nimport { floatToString, TRandom } from '../base/BasePainter.mjs';\nimport { RHistPainter } from './RHistPainter.mjs';\nimport { ensureRCanvas } from '../gpad/RCanvasPainter.mjs';\n\n/**\n * @summary Painter for RH2 classes\n *\n * @private\n */\n\nclass RH2Painter extends RHistPainter {\n\n /** @summary constructor\n * @param {object|string} dom - DOM element or id\n * @param {object} histo - histogram object */\n constructor(dom, histo) {\n super(dom, histo);\n this.wheel_zoomy = true;\n }\n\n /** @summary Cleanup painter */\n cleanup() {\n delete this.tt_handle;\n super.cleanup();\n }\n\n /** @summary Returns histogram dimension */\n getDimension() { return 2; }\n\n /** @summary Toggle projection */\n toggleProjection(kind, width) {\n\n if (kind == 'Projections') kind = '';\n\n if (isStr(kind) && (kind.length > 1)) {\n width = parseInt(kind.slice(1));\n kind = kind[0];\n }\n\n if (!width) width = 1;\n\n if (kind && (this.is_projection==kind)) {\n if (this.projection_width === width) {\n kind = '';\n } else {\n this.projection_width = width;\n return;\n }\n }\n\n delete this.proj_hist;\n\n let new_proj = (this.is_projection === kind) ? '' : kind;\n this.is_projection = ''; // disable projection redraw until callback\n this.projection_width = width;\n\n this.provideSpecialDrawArea(new_proj).then(() => { this.is_projection = new_proj; return this.redrawProjection(); });\n }\n\n /** @summary Readraw projections */\n redrawProjection(/* ii1, ii2 , jj1, jj2*/) {\n // do nothing for the moment\n\n if (!this.is_projection) return;\n }\n\n /** @summary Execute menu command */\n executeMenuCommand(method, args) {\n if (super.executeMenuCommand(method, args)) return true;\n\n if ((method.fName == 'SetShowProjectionX') || (method.fName == 'SetShowProjectionY')) {\n this.toggleProjection(method.fName[17], args && parseInt(args) ? parseInt(args) : 1);\n return true;\n }\n\n return false;\n }\n\n /** @summary Fill histogram context menu */\n fillHistContextMenu(menu) {\n menu.add('sub:Projections', () => this.toggleProjection());\n let kind = this.is_projection || '';\n if (kind) kind += this.projection_width;\n let kinds = ['X1', 'X2', 'X3', 'X5', 'X10', 'Y1', 'Y2', 'Y3', 'Y5', 'Y10'];\n for (let k = 0; k < kinds.length; ++k)\n menu.addchk(kind == kinds[k], kinds[k], kinds[k], arg => this.toggleProjection(arg));\n menu.add('endsub:');\n\n menu.add('Auto zoom-in', () => this.autoZoom());\n\n let opts = this.getSupportedDrawOptions();\n\n menu.addDrawMenu('Draw with', opts, arg => {\n if (arg === 'inspect')\n return this.showInspector();\n this.decodeOptions(arg);\n this.interactiveRedraw('pad', 'drawopt');\n });\n\n if (this.options.Color)\n this.fillPaletteMenu(menu);\n }\n\n /** @summary Process click on histogram-defined buttons */\n clickButton(funcname) {\n if (super.clickButton(funcname)) return true;\n\n switch(funcname) {\n case 'ToggleColor': this.toggleColor(); break;\n case 'Toggle3D': this.toggleMode3D(); break;\n default: return false;\n }\n\n // all methods here should not be processed further\n return true;\n }\n\n /** @summary Fill pad toolbar with RH2-related functions */\n fillToolbar() {\n super.fillToolbar(true);\n\n let pp = this.getPadPainter();\n if (!pp) return;\n\n pp.addPadButton('th2color', 'Toggle color', 'ToggleColor');\n pp.addPadButton('th2colorz', 'Toggle color palette', 'ToggleColorZ');\n pp.addPadButton('th2draw3d', 'Toggle 3D mode', 'Toggle3D');\n pp.showPadButtons();\n }\n\n /** @summary Toggle color drawing mode */\n toggleColor() {\n\n if (this.options.Mode3D) {\n this.options.Mode3D = false;\n this.options.Color = true;\n } else {\n this.options.Color = !this.options.Color;\n }\n\n this.redraw();\n }\n\n /** @summary Perform automatic zoom inside non-zero region of histogram */\n autoZoom() {\n let i1 = this.getSelectIndex('x', 'left', -1),\n i2 = this.getSelectIndex('x', 'right', 1),\n j1 = this.getSelectIndex('y', 'left', -1),\n j2 = this.getSelectIndex('y', 'right', 1),\n i,j, histo = this.getHisto(), xaxis = this.getAxis('x'), yaxis = this.getAxis('y');\n\n if ((i1 == i2) || (j1 == j2)) return;\n\n // first find minimum\n let min = histo.getBinContent(i1 + 1, j1 + 1);\n for (i = i1; i < i2; ++i)\n for (j = j1; j < j2; ++j)\n min = Math.min(min, histo.getBinContent(i+1, j+1));\n if (min > 0) return; // if all points positive, no chance for autoscale\n\n let ileft = i2, iright = i1, jleft = j2, jright = j1;\n\n for (i = i1; i < i2; ++i)\n for (j = j1; j < j2; ++j)\n if (histo.getBinContent(i + 1, j + 1) > min) {\n if (i < ileft) ileft = i;\n if (i >= iright) iright = i + 1;\n if (j < jleft) jleft = j;\n if (j >= jright) jright = j + 1;\n }\n\n let xmin, xmax, ymin, ymax, isany = false;\n\n if ((ileft === iright-1) && (ileft > i1+1) && (iright < i2-1)) { ileft--; iright++; }\n if ((jleft === jright-1) && (jleft > j1+1) && (jright < j2-1)) { jleft--; jright++; }\n\n if ((ileft > i1 || iright < i2) && (ileft < iright - 1)) {\n xmin = xaxis.GetBinCoord(ileft);\n xmax = xaxis.GetBinCoord(iright);\n isany = true;\n }\n\n if ((jleft > j1 || jright < j2) && (jleft < jright - 1)) {\n ymin = yaxis.GetBinCoord(jleft);\n ymax = yaxis.GetBinCoord(jright);\n isany = true;\n }\n\n if (isany)\n return this.getFramePainter().zoom(xmin, xmax, ymin, ymax);\n }\n\n /** @summary Scan content of 2-dim histogram */\n scanContent(when_axis_changed) {\n\n // no need to rescan histogram while result does not depend from axis selection\n if (when_axis_changed && this.nbinsx && this.nbinsy) return;\n\n let i, j, histo = this.getHisto();\n\n this.extractAxesProperties(2);\n\n if (this.isDisplayItem()) {\n // take min/max values from the display item\n this.gminbin = histo.fContMin;\n this.gminposbin = histo.fContMinPos > 0 ? histo.fContMinPos : null;\n this.gmaxbin = histo.fContMax;\n } else {\n // global min/max, used at the moment in 3D drawing\n this.gminbin = this.gmaxbin = histo.getBinContent(1, 1);\n this.gminposbin = null;\n for (i = 0; i < this.nbinsx; ++i) {\n for (j = 0; j < this.nbinsy; ++j) {\n let bin_content = histo.getBinContent(i+1, j+1);\n if (bin_content < this.gminbin) this.gminbin = bin_content; else\n if (bin_content > this.gmaxbin) this.gmaxbin = bin_content;\n if (bin_content > 0)\n if ((this.gminposbin === null) || (this.gminposbin > bin_content)) this.gminposbin = bin_content;\n }\n }\n }\n\n this.zmin = this.gminbin;\n this.zmax = this.gmaxbin;\n\n // this value used for logz scale drawing\n if (this.gminposbin === null) this.gminposbin = this.gmaxbin*1e-4;\n\n if (this.options.Axis > 0) { // Paint histogram axis only\n this.draw_content = false;\n } else {\n this.draw_content = this.gmaxbin > 0;\n }\n }\n\n /** @summary Count statistic */\n countStat(cond) {\n let histo = this.getHisto(),\n stat_sum0 = 0, stat_sumx1 = 0, stat_sumy1 = 0,\n stat_sumx2 = 0, stat_sumy2 = 0,\n xside, yside, xx, yy, zz,\n res = { name: 'histo', entries: 0, integral: 0, meanx: 0, meany: 0, rmsx: 0, rmsy: 0, matrix: [0,0,0,0,0,0,0,0,0], xmax: 0, ymax:0, wmax: null };\n\n let xleft = this.getSelectIndex('x', 'left'),\n xright = this.getSelectIndex('x', 'right'),\n yleft = this.getSelectIndex('y', 'left'),\n yright = this.getSelectIndex('y', 'right'),\n xi, yi, xaxis = this.getAxis('x'), yaxis = this.getAxis('y');\n\n // TODO: account underflow/overflow bins, now stored in different array and only by histogram itself\n for (xi = 1; xi <= this.nbinsx; ++xi) {\n xside = (xi <= xleft+1) ? 0 : (xi > xright+1 ? 2 : 1);\n xx = xaxis.GetBinCoord(xi - 0.5);\n\n for (yi = 1; yi <= this.nbinsy; ++yi) {\n yside = (yi <= yleft+1) ? 0 : (yi > yright+1 ? 2 : 1);\n yy = yaxis.GetBinCoord(yi - 0.5);\n\n zz = histo.getBinContent(xi, yi);\n\n res.entries += zz;\n\n res.matrix[yside * 3 + xside] += zz;\n\n if ((xside != 1) || (yside != 1)) continue;\n\n if (cond && !cond(xx,yy)) continue;\n\n if ((res.wmax === null) || (zz > res.wmax)) { res.wmax = zz; res.xmax = xx; res.ymax = yy; }\n\n stat_sum0 += zz;\n stat_sumx1 += xx * zz;\n stat_sumy1 += yy * zz;\n stat_sumx2 += xx**2 * zz;\n stat_sumy2 += yy**2 * zz;\n }\n }\n\n if (Math.abs(stat_sum0) > 1e-300) {\n res.meanx = stat_sumx1 / stat_sum0;\n res.meany = stat_sumy1 / stat_sum0;\n res.rmsx = Math.sqrt(Math.abs(stat_sumx2 / stat_sum0 - res.meanx**2));\n res.rmsy = Math.sqrt(Math.abs(stat_sumy2 / stat_sum0 - res.meany**2));\n }\n\n if (res.wmax === null) res.wmax = 0;\n res.integral = stat_sum0;\n return res;\n }\n\n /** @summary Fill statistic into statbox */\n fillStatistic(stat, dostat /*, dofit*/) {\n\n let data = this.countStat(),\n print_name = Math.floor(dostat % 10),\n print_entries = Math.floor(dostat / 10) % 10,\n print_mean = Math.floor(dostat / 100) % 10,\n print_rms = Math.floor(dostat / 1000) % 10,\n print_under = Math.floor(dostat / 10000) % 10,\n print_over = Math.floor(dostat / 100000) % 10,\n print_integral = Math.floor(dostat / 1000000) % 10,\n print_skew = Math.floor(dostat / 10000000) % 10,\n print_kurt = Math.floor(dostat / 100000000) % 10;\n\n stat.clearStat();\n\n if (print_name > 0)\n stat.addText(data.name);\n\n if (print_entries > 0)\n stat.addText('Entries = ' + stat.format(data.entries,'entries'));\n\n if (print_mean > 0) {\n stat.addText('Mean x = ' + stat.format(data.meanx));\n stat.addText('Mean y = ' + stat.format(data.meany));\n }\n\n if (print_rms > 0) {\n stat.addText('Std Dev x = ' + stat.format(data.rmsx));\n stat.addText('Std Dev y = ' + stat.format(data.rmsy));\n }\n\n if (print_integral > 0)\n stat.addText('Integral = ' + stat.format(data.matrix[4], 'entries'));\n\n if (print_skew > 0) {\n stat.addText('Skewness x = ');\n stat.addText('Skewness y = ');\n }\n\n if (print_kurt > 0)\n stat.addText('Kurt = ');\n\n if ((print_under > 0) || (print_over > 0)) {\n let m = data.matrix;\n\n stat.addText('' + m[6].toFixed(0) + ' | ' + m[7].toFixed(0) + ' | ' + m[7].toFixed(0));\n stat.addText('' + m[3].toFixed(0) + ' | ' + m[4].toFixed(0) + ' | ' + m[5].toFixed(0));\n stat.addText('' + m[0].toFixed(0) + ' | ' + m[1].toFixed(0) + ' | ' + m[2].toFixed(0));\n }\n\n return true;\n }\n\n /** @summary Draw histogram bins as color */\n drawBinsColor() {\n const histo = this.getHisto(),\n handle = this.prepareDraw(),\n di = handle.stepi, dj = handle.stepj,\n entries = [],\n can_merge = true;\n let colindx, cmd1, cmd2, i, j, binz, dx, dy, entry, last_entry;\n\n const flush_last_entry = () => {\n last_entry.path += `h${dx}v${last_entry.y2-last_entry.y}h${-dx}z`;\n last_entry.dy = 0;\n last_entry = null;\n };\n\n // now start build\n for (i = handle.i1; i < handle.i2; i += di) {\n dx = (handle.grx[i+di] - handle.grx[i]) || 1;\n\n for (j = handle.j1; j < handle.j2; j += dj) {\n binz = histo.getBinContent(i+1, j+1);\n colindx = handle.palette.getContourIndex(binz);\n if (binz === 0) {\n if (!this.options.Zero)\n colindx = null;\n else if ((colindx === null) && this._show_empty_bins)\n colindx = 0;\n }\n if (colindx === null) {\n if (last_entry) flush_last_entry();\n continue;\n }\n\n cmd1 = `M${handle.grx[i]},${handle.gry[j]}`;\n\n dy = (handle.gry[j+dj] - handle.gry[j]) || -1;\n\n entry = entries[colindx];\n\n if (entry === undefined) {\n entry = entries[colindx] = { path: cmd1 };\n } else if (can_merge && (entry === last_entry)) {\n entry.y2 = handle.gry[j] + dy;\n continue;\n } else {\n cmd2 = `m${handle.grx[i]-entry.x},${handle.gry[j]-entry.y}`;\n entry.path += (cmd2.length < cmd1.length) ? cmd2 : cmd1;\n }\n if (last_entry) flush_last_entry();\n entry.x = handle.grx[i];\n entry.y = handle.gry[j];\n if (can_merge) {\n entry.y2 = handle.gry[j] + dy;\n last_entry = entry;\n } else {\n entry.path += `h${dx}v${dy}h${-dx}z`;\n }\n }\n if (last_entry) flush_last_entry();\n }\n\n entries.forEach((entry,colindx) => {\n if (entry)\n this.draw_g\n .append('svg:path')\n .style('fill', handle.palette.getColor(colindx))\n .attr('d', entry.path);\n });\n\n this.updatePaletteDraw();\n\n return handle;\n }\n\n /** @summary Build histogram contour lines */\n buildContour(handle, levels, palette, contour_func) {\n let histo = this.getHisto(),\n kMAXCONTOUR = 2004,\n kMAXCOUNT = 2000,\n // arguments used in the PaintContourLine\n xarr = new Float32Array(2*kMAXCONTOUR),\n yarr = new Float32Array(2*kMAXCONTOUR),\n itarr = new Int32Array(2*kMAXCONTOUR),\n lj = 0, ipoly, poly, polys = [], np, npmax = 0,\n x = [0.,0.,0.,0.], y = [0.,0.,0.,0.], zc = [0.,0.,0.,0.], ir = [0,0,0,0],\n i, j, k, n, m, ix, ljfill, count,\n xsave, ysave, itars, jx,\n di = handle.stepi, dj = handle.stepj;\n\n function BinarySearch(zc) {\n for (let kk=0;kk zc[m]) n = m;\n n++;\n lj=1;\n for (ix=1;ix<=4;ix++) {\n m = n%4 + 1;\n ljfill = PaintContourLine(zc[n-1],ir[n-1],x[n-1],y[n-1],\n zc[m-1],ir[m-1],x[m-1],y[m-1]);\n lj += 2*ljfill;\n n = m;\n }\n\n if (zc[0] <= zc[1]) n = 0; else n = 1;\n if (zc[2] <= zc[3]) m = 2; else m = 3;\n if (zc[n] > zc[m]) n = m;\n n++;\n lj=2;\n for (ix=1;ix<=4;ix++) {\n if (n == 1) m = 4;\n else m = n-1;\n ljfill = PaintContourLine(zc[n-1],ir[n-1],x[n-1],y[n-1],\n zc[m-1],ir[m-1],x[m-1],y[m-1]);\n lj += 2*ljfill;\n n = m;\n }\n // Re-order endpoints\n\n count = 0;\n for (ix=1; ix<=lj-5; ix +=2) {\n //count = 0;\n while (itarr[ix-1] != itarr[ix]) {\n xsave = xarr[ix];\n ysave = yarr[ix];\n itars = itarr[ix];\n for (jx=ix; jx<=lj-5; jx +=2) {\n xarr[jx] = xarr[jx+2];\n yarr[jx] = yarr[jx+2];\n itarr[jx] = itarr[jx+2];\n }\n xarr[lj-3] = xsave;\n yarr[lj-3] = ysave;\n itarr[lj-3] = itars;\n if (count > kMAXCOUNT) break;\n count++;\n }\n }\n\n if (count > kMAXCOUNT) continue;\n\n for (ix=1; ix<=lj-2; ix +=2) {\n\n ipoly = itarr[ix-1];\n\n if ((ipoly >= 0) && (ipoly < levels.length)) {\n poly = polys[ipoly];\n if (!poly)\n poly = polys[ipoly] = createTPolyLine(kMAXCONTOUR*4, true);\n\n np = poly.fLastPoint;\n if (np < poly.fN-2) {\n poly.fX[np+1] = Math.round(xarr[ix-1]); poly.fY[np+1] = Math.round(yarr[ix-1]);\n poly.fX[np+2] = Math.round(xarr[ix]); poly.fY[np+2] = Math.round(yarr[ix]);\n poly.fLastPoint = np+2;\n npmax = Math.max(npmax, poly.fLastPoint+1);\n } else {\n // console.log(`reject point ${poly.fLastPoint}`);\n }\n }\n }\n } // end of if (ir[0]\n } // end of j\n } // end of i\n\n let polysort = new Int32Array(levels.length), first = 0;\n // find first positive contour\n for (ipoly=0;ipoly= 0) { first = ipoly; break; }\n }\n //store negative contours from 0 to minimum, then all positive contours\n k = 0;\n for (ipoly = first - 1; ipoly >= 0; ipoly--) { polysort[k] = ipoly; k++; }\n for (ipoly = first; ipoly < levels.length; ipoly++) { polysort[k] = ipoly; k++; }\n\n let xp = new Float32Array(2*npmax),\n yp = new Float32Array(2*npmax);\n\n for (k=0;k 0) && (xx[i+1] === xp[iminus]) && (yy[i+1] === yp[iminus])) {\n iminus--;\n xp[iminus] = xx[i]; yp[iminus] = yy[i];\n xx[i] = xx[i+1] = xmin;\n yy[i] = yy[i+1] = ymin;\n nadd++;\n }\n }\n if (nadd == 0) break;\n }\n\n if ((iminus+1 < iplus) && (iminus >= 0))\n contour_func(colindx, xp, yp, iminus, iplus, ipoly);\n\n istart = 0;\n for (i=2;i {\n let cmd = '', last, pnt, first, isany;\n for (let i = iminus; i <= iplus; ++i) {\n if (func) {\n pnt = func(xp[i], yp[i]);\n pnt.x = Math.round(funcs.grx(pnt.x));\n pnt.y = Math.round(funcs.gry(pnt.y));\n } else {\n pnt = { x: Math.round(xp[i]), y: Math.round(yp[i]) };\n }\n if (!cmd) {\n cmd = 'M' + pnt.x + ',' + pnt.y; first = pnt;\n } else if ((i == iplus) && first && (pnt.x == first.x) && (pnt.y == first.y)) {\n if (!isany) return ''; // all same points\n cmd += 'z'; do_close = false;\n } else if ((pnt.x != last.x) && (pnt.y != last.y)) {\n cmd += 'l' + (pnt.x - last.x) + ',' + (pnt.y - last.y); isany = true;\n } else if (pnt.x != last.x) {\n cmd += 'h' + (pnt.x - last.x); isany = true;\n } else if (pnt.y != last.y) {\n cmd += 'v' + (pnt.y - last.y); isany = true;\n }\n last = pnt;\n }\n if (do_close) cmd += 'z';\n return cmd;\n };\n\n if (this.options.Contour === 14) {\n let dd = `M0,0h${frame_w}v${frame_h}h${-frame_w}z`;\n if (this.options.Proj) {\n let dj = handle.stepj, sz = parseInt((handle.j2 - handle.j1)/dj),\n xd = new Float32Array(sz*2), yd = new Float32Array(sz*2);\n for (let i=0;i {\n let icol = palette.getColor(colindx),\n fillcolor = icol, lineatt;\n\n switch (this.options.Contour) {\n case 1: break;\n case 11: fillcolor = 'none'; lineatt = new TAttLineHandler({ color: icol }); break;\n case 12: fillcolor = 'none'; lineatt = new TAttLineHandler({ color:1, style: (colindx%5 + 1), width: 1 }); break;\n case 13: fillcolor = 'none'; lineatt = this.lineatt; break;\n case 14: break;\n }\n\n let dd = BuildPath(xp, yp, iminus, iplus, fillcolor != 'none');\n if (!dd) return;\n\n let elem = this.draw_g\n .append('svg:path')\n .attr('class','th2_contour')\n .attr('d', dd)\n .style('fill', fillcolor);\n\n if (lineatt)\n elem.call(lineatt.func);\n }\n );\n\n handle.hide_only_zeros = true; // text drawing suppress only zeros\n\n return handle;\n }\n\n /** @summary Create polybin */\n createPolyBin() {\n // see how TH2Painter is implemented\n return '';\n }\n\n /** @summary Draw RH2 bins as text */\n drawBinsText(handle) {\n let histo = this.getHisto(),\n i, j, binz, binw, binh, text, x, y, width, height;\n\n if (handle === null) handle = this.prepareDraw({ rounding: false });\n\n let textFont = this.v7EvalFont('text', { size: 20, color: 'black', align: 22 }),\n text_offset = 0,\n text_g = this.draw_g.append('svg:g').attr('class','th2_text'),\n di = handle.stepi, dj = handle.stepj,\n profile2d = false;\n\n if (this.options.BarOffset) text_offset = this.options.BarOffset;\n\n this.startTextDrawing(textFont, 'font', text_g);\n\n for (i = handle.i1; i < handle.i2; i += di)\n for (j = handle.j1; j < handle.j2; j += dj) {\n binz = histo.getBinContent(i+1, j+1);\n if ((binz === 0) && !this._show_empty_bins) continue;\n\n binw = handle.grx[i+di] - handle.grx[i];\n binh = handle.gry[j] - handle.gry[j+dj];\n\n if (profile2d)\n binz = histo.getBinEntries(i+1, j+1);\n\n text = (binz === Math.round(binz)) ? binz.toString() :\n floatToString(binz, gStyle.fPaintTextFormat);\n\n if (textFont.angle) {\n x = Math.round(handle.grx[i] + binw*0.5);\n y = Math.round(handle.gry[j+dj] + binh*(0.5 + text_offset));\n width = height = 0;\n } else {\n x = Math.round(handle.grx[i] + binw*0.1);\n y = Math.round(handle.gry[j+dj] + binh*(0.1 + text_offset));\n width = Math.round(binw*0.8);\n height = Math.round(binh*0.8);\n }\n\n this.drawText({ align: 22, x, y, width, height, text, latex: 0, draw_g: text_g });\n }\n\n return this.finishTextDrawing(text_g, true).then(() => {\n\n handle.hide_only_zeros = true; // text drawing suppress only zeros\n\n return handle;\n });\n }\n\n /** @summary Draw RH2 bins as arrows */\n drawBinsArrow() {\n let histo = this.getHisto(), cmd = '',\n i,j, dn = 1e-30, dx, dy, xc,yc,\n dxn,dyn,x1,x2,y1,y2, anr,si,co,\n handle = this.prepareDraw({ rounding: false }),\n scale_x = (handle.grx[handle.i2] - handle.grx[handle.i1])/(handle.i2 - handle.i1 + 1-0.03)/2,\n scale_y = (handle.gry[handle.j2] - handle.gry[handle.j1])/(handle.j2 - handle.j1 + 1-0.03)/2,\n di = handle.stepi, dj = handle.stepj;\n\n const makeLine = (dx, dy) => {\n if (dx)\n return dy ? `l${dx},${dy}` : `h${dx}`;\n return dy ? `v${dy}` : '';\n };\n\n for (let loop = 0; loop < 2; ++loop)\n for (i = handle.i1; i < handle.i2; i += di)\n for (j = handle.j1; j < handle.j2; j += dj) {\n\n if (i === handle.i1) {\n dx = histo.getBinContent(i+1+di, j+1) - histo.getBinContent(i+1, j+1);\n } else if (i >= handle.i2-di) {\n dx = histo.getBinContent(i+1, j+1) - histo.getBinContent(i+1-di, j+1);\n } else {\n dx = 0.5*(histo.getBinContent(i+1+di, j+1) - histo.getBinContent(i+1-di, j+1));\n }\n if (j === handle.j1) {\n dy = histo.getBinContent(i+1, j+1+dj) - histo.getBinContent(i+1, j+1);\n } else if (j >= handle.j2-dj) {\n dy = histo.getBinContent(i+1, j+1) - histo.getBinContent(i+1, j+1-dj);\n } else {\n dy = 0.5*(histo.getBinContent(i+1, j+1+dj) - histo.getBinContent(i+1, j+1-dj));\n }\n\n if (loop === 0) {\n dn = Math.max(dn, Math.abs(dx), Math.abs(dy));\n } else {\n xc = (handle.grx[i] + handle.grx[i+di])/2;\n yc = (handle.gry[j] + handle.gry[j+dj])/2;\n dxn = scale_x*dx/dn;\n dyn = scale_y*dy/dn;\n x1 = xc - dxn;\n x2 = xc + dxn;\n y1 = yc - dyn;\n y2 = yc + dyn;\n dx = Math.round(x2-x1);\n dy = Math.round(y2-y1);\n\n if ((dx !== 0) || (dy !== 0)) {\n cmd += 'M'+Math.round(x1)+','+Math.round(y1) + makeLine(dx,dy);;\n\n if (Math.abs(dx) > 5 || Math.abs(dy) > 5) {\n anr = Math.sqrt(2/(dx**2 + dy**2));\n si = Math.round(anr*(dx + dy));\n co = Math.round(anr*(dx - dy));\n if (si || co)\n cmd += `m${-si},${co}` + makeLine(si,-co) + makeLine(-co,-si);;\n }\n }\n }\n }\n\n this.draw_g\n .append('svg:path')\n .attr('d', cmd)\n .style('fill', 'none')\n .call(this.lineatt.func);\n\n return handle;\n }\n\n /** @summary Draw RH2 bins as boxes */\n drawBinsBox() {\n\n let histo = this.getHisto(),\n handle = this.prepareDraw({ rounding: false }),\n main = this.getFramePainter();\n\n if (main.maxbin === main.minbin) {\n main.maxbin = this.gmaxbin;\n main.minbin = this.gminbin;\n main.minposbin = this.gminposbin;\n }\n if (main.maxbin === main.minbin)\n main.minbin = Math.min(0, main.maxbin-1);\n\n let absmax = Math.max(Math.abs(main.maxbin), Math.abs(main.minbin)),\n absmin = Math.max(0, main.minbin),\n i, j, binz, absz, res = '', cross = '', btn1 = '', btn2 = '',\n zdiff, dgrx, dgry, xx, yy, ww, hh,\n xyfactor, uselogz = false, logmin = 0,\n di = handle.stepi, dj = handle.stepj;\n\n if (main.logz && (absmax > 0)) {\n uselogz = true;\n let logmax = Math.log(absmax);\n if (absmin > 0)\n logmin = Math.log(absmin);\n else if ((main.minposbin >= 1) && (main.minposbin < 100))\n logmin = Math.log(0.7);\n else\n logmin = (main.minposbin > 0) ? Math.log(0.7*main.minposbin) : logmax - 10;\n if (logmin >= logmax) logmin = logmax - 10;\n xyfactor = 1. / (logmax - logmin);\n } else {\n xyfactor = 1. / (absmax - absmin);\n }\n\n // now start build\n for (i = handle.i1; i < handle.i2; i += di) {\n for (j = handle.j1; j < handle.j2; j += dj) {\n binz = histo.getBinContent(i + 1, j + 1);\n absz = Math.abs(binz);\n if ((absz === 0) || (absz < absmin)) continue;\n\n zdiff = uselogz ? ((absz > 0) ? Math.log(absz) - logmin : 0) : (absz - absmin);\n // area of the box should be proportional to absolute bin content\n zdiff = 0.5 * ((zdiff < 0) ? 1 : (1 - Math.sqrt(zdiff * xyfactor)));\n // avoid oversized bins\n if (zdiff < 0) zdiff = 0;\n\n ww = handle.grx[i+di] - handle.grx[i];\n hh = handle.gry[j] - handle.gry[j+dj];\n\n dgrx = zdiff * ww;\n dgry = zdiff * hh;\n\n xx = Math.round(handle.grx[i] + dgrx);\n yy = Math.round(handle.gry[j+dj] + dgry);\n\n ww = Math.max(Math.round(ww - 2*dgrx), 1);\n hh = Math.max(Math.round(hh - 2*dgry), 1);\n\n res += `M${xx},${yy}v${hh}h${ww}v${-hh}z`;\n\n if ((binz < 0) && (this.options.BoxStyle === 10))\n cross += `M${xx},${yy}l${ww},${hh}M${xx+ww},${yy}l${-ww},${hh}`;\n\n if ((this.options.BoxStyle === 11) && (ww>5) && (hh>5)) {\n let pww = Math.round(ww*0.1),\n phh = Math.round(hh*0.1),\n side1 = `M${xx},${yy}h${ww}l${-pww},${phh}h${2*pww-ww}v${hh-2*phh}l${-pww},${phh}z`,\n side2 = `M${xx+ww},${yy+hh}v${-hh}l${-pww},${phh}v${hh-2*phh}h${2*pww-ww}l${-pww},${phh}z`;\n if (binz < 0) { btn2 += side1; btn1 += side2; }\n else { btn1 += side1; btn2 += side2; }\n }\n }\n }\n\n if (res) {\n let elem = this.draw_g\n .append('svg:path')\n .attr('d', res)\n .call(this.fillatt.func);\n if ((this.options.BoxStyle !== 11) && this.fillatt.empty())\n elem.call(this.lineatt.func);\n }\n\n if (btn1 && this.fillatt.hasColor())\n this.draw_g.append('svg:path')\n .attr('d', btn1)\n .call(this.fillatt.func)\n .style('fill', d3_rgb(this.fillatt.color).brighter(0.5).formatHex());\n\n if (btn2)\n this.draw_g.append('svg:path')\n .attr('d', btn2)\n .call(this.fillatt.func)\n .style('fill', !this.fillatt.hasColor() ? 'red' : d3_rgb(this.fillatt.color).darker(0.5).formatHex());\n\n if (cross) {\n let elem = this.draw_g.append('svg:path')\n .attr('d', cross)\n .style('fill', 'none');\n if (!this.lineatt.empty())\n elem.call(this.lineatt.func);\n }\n\n return handle;\n }\n\n /** @summary Draw RH2 bins as scatter plot */\n drawBinsScatter() {\n let histo = this.getHisto(),\n handle = this.prepareDraw({ rounding: true, pixel_density: true, scatter_plot: true }),\n colPaths = [], currx = [], curry = [], cell_w = [], cell_h = [],\n colindx, cmd1, cmd2, i, j, binz, cw, ch, factor = 1.,\n scale = this.options.ScatCoef * ((this.gmaxbin) > 2000 ? 2000. / this.gmaxbin : 1.),\n di = handle.stepi, dj = handle.stepj;\n\n let rnd = new TRandom(handle.sumz);\n\n if (scale*handle.sumz < 1e5) {\n // one can use direct drawing of scatter plot without any patterns\n\n this.createv7AttMarker();\n\n this.markeratt.resetPos();\n\n let path = '', k, npix;\n for (i = handle.i1; i < handle.i2; i += di) {\n cw = handle.grx[i+di] - handle.grx[i];\n for (j = handle.j1; j < handle.j2; j += dj) {\n ch = handle.gry[j] - handle.gry[j+dj];\n binz = histo.getBinContent(i + 1, j + 1);\n\n npix = Math.round(scale*binz);\n if (npix <= 0) continue;\n\n for (k = 0; k < npix; ++k)\n path += this.markeratt.create(\n Math.round(handle.grx[i] + cw * rnd.random()),\n Math.round(handle.gry[j+1] + ch * rnd.random()));\n }\n }\n\n this.draw_g\n .append('svg:path')\n .attr('d', path)\n .call(this.markeratt.func);\n\n return handle;\n }\n\n // limit filling factor, do not try to produce as many points as filled area;\n if (this.maxbin > 0.7) factor = 0.7/this.maxbin;\n\n // let nlevels = Math.round(handle.max - handle.min);\n\n // now start build\n for (i = handle.i1; i < handle.i2; i += di) {\n for (j = handle.j1; j < handle.j2; j += dj) {\n binz = histo.getBinContent(i + 1, j + 1);\n if ((binz <= 0) || (binz < this.minbin)) continue;\n\n cw = handle.grx[i+di] - handle.grx[i];\n ch = handle.gry[j] - handle.gry[j+dj];\n if (cw*ch <= 0) continue;\n\n colindx = handle.palette.getContourIndex(binz/cw/ch);\n if (colindx < 0) continue;\n\n cmd1 = `M${handle.grx[i]},${handle.gry[j+dj]}`;\n if (colPaths[colindx] === undefined) {\n colPaths[colindx] = cmd1;\n cell_w[colindx] = cw;\n cell_h[colindx] = ch;\n } else{\n cmd2 = `m${handle.grx[i]-currx[colindx]},${handle.gry[j+dj] - curry[colindx]}`;\n colPaths[colindx] += (cmd2.length < cmd1.length) ? cmd2 : cmd1;\n cell_w[colindx] = Math.max(cell_w[colindx], cw);\n cell_h[colindx] = Math.max(cell_h[colindx], ch);\n }\n\n currx[colindx] = handle.grx[i];\n curry[colindx] = handle.gry[j+dj];\n\n colPaths[colindx] += `v${ch}h${cw}v${-ch}z`;\n }\n }\n\n let layer = this.getFrameSvg().select('.main_layer'),\n defs = layer.select('def');\n if (defs.empty() && (colPaths.length > 0))\n defs = layer.insert('svg:defs', ':first-child');\n\n this.createv7AttMarker();\n\n let cntr = handle.palette.getContour();\n\n for (colindx = 0; colindx < colPaths.length; ++colindx)\n if ((colPaths[colindx] !== undefined) && (colindx 0)\n handle = this.drawBinsContour(funcs, rect.width, rect.height);\n\n if (this.options.Text)\n pr = this.drawBinsText(handle);\n\n if (!handle && !pr)\n handle = this.drawBinsColor();\n\n if (!pr) pr = Promise.resolve(handle);\n\n return pr.then(h => {\n this.tt_handle = h;\n return this;\n });\n }\n\n /** @summary Provide text information (tooltips) for histogram bin */\n getBinTooltips(i, j) {\n let lines = [],\n histo = this.getHisto(),\n binz = histo.getBinContent(i+1,j+1),\n di = 1, dj = 1;\n\n if (this.isDisplayItem()) {\n di = histo.stepx || 1;\n dj = histo.stepy || 1;\n }\n\n lines.push(this.getObjectHint() || 'histo<2>');\n lines.push('x = ' + this.getAxisBinTip('x', i, di),\n 'y = ' + this.getAxisBinTip('y', j, dj));\n\n lines.push(`bin = ${i+1}, ${j+1}`);\n\n if (histo.$baseh) binz -= histo.$baseh.getBinContent(i+1,j+1);\n\n let lbl = 'entries = ' + ((di > 1) || (dj > 1) ? '~' : '');\n\n if (binz === Math.round(binz))\n lines.push(lbl + binz);\n else\n lines.push(lbl + floatToString(binz, gStyle.fStatFormat));\n\n return lines;\n }\n\n /** @summary Provide text information (tooltips) for poly bin */\n getPolyBinTooltips() {\n // see how TH2Painter is implemented\n return [];\n }\n\n /** @summary Process tooltip event */\n processTooltipEvent(pnt) {\n if (!pnt || !this.draw_content || !this.draw_g || !this.tt_handle || this.options.Proj) {\n if (this.draw_g)\n this.draw_g.select('.tooltip_bin').remove();\n return null;\n }\n\n let histo = this.getHisto(),\n h = this.tt_handle,\n ttrect = this.draw_g.select('.tooltip_bin');\n\n if (h.poly) {\n // process tooltips from TH2Poly - see TH2Painter\n return null;\n }\n\n let i, j, binz = 0, colindx = null;\n\n // search bins position\n for (i = h.i1; i < h.i2; ++i)\n if ((pnt.x>=h.grx[i]) && (pnt.x<=h.grx[i+1])) break;\n\n for (j = h.j1; j < h.j2; ++j)\n if ((pnt.y>=h.gry[j+1]) && (pnt.y<=h.gry[j])) break;\n\n if ((i < h.i2) && (j < h.j2)) {\n binz = histo.getBinContent(i+1,j+1);\n if (this.is_projection) {\n colindx = 0; // just to avoid hide\n } else if (h.hide_only_zeros) {\n colindx = (binz === 0) && !this._show_empty_bins ? null : 0;\n } else {\n colindx = h.palette.getContourIndex(binz);\n if ((colindx === null) && (binz === 0) && this._show_empty_bins) colindx = 0;\n }\n }\n\n if (colindx === null) {\n ttrect.remove();\n return null;\n }\n\n let res = { name: 'histo', title: histo.fTitle || 'title',\n x: pnt.x, y: pnt.y,\n color1: this.lineatt ? this.lineatt.color : 'green',\n color2: this.fillatt ? this.fillatt.getFillColorAlt('blue') : 'blue',\n lines: this.getBinTooltips(i, j), exact: true, menu: true };\n\n if (this.options.Color) res.color2 = h.palette.getColor(colindx);\n\n if (pnt.disabled && !this.is_projection) {\n ttrect.remove();\n res.changed = true;\n } else {\n if (ttrect.empty())\n ttrect = this.draw_g.append('svg:rect')\n .attr('class','tooltip_bin h1bin')\n .style('pointer-events','none');\n\n let i1 = i, i2 = i+1,\n j1 = j, j2 = j+1,\n x1 = h.grx[i1], x2 = h.grx[i2],\n y1 = h.gry[j2], y2 = h.gry[j1],\n binid = i*10000 + j;\n\n if (this.is_projection == 'X') {\n x1 = 0; x2 = this.getFramePainter().getFrameWidth();\n if (this.projection_width > 1) {\n let dd = (this.projection_width-1)/2;\n if (j2+dd >= h.j2) { j2 = Math.min(Math.round(j2+dd), h.j2); j1 = Math.max(j2 - this.projection_width, h.j1); }\n else { j1 = Math.max(Math.round(j1-dd), h.j1); j2 = Math.min(j1 + this.projection_width, h.j2); }\n }\n y1 = h.gry[j2]; y2 = h.gry[j1];\n binid = j1*777 + j2*333;\n } else if (this.is_projection == 'Y') {\n y1 = 0; y2 = this.getFramePainter().getFrameHeight();\n if (this.projection_width > 1) {\n let dd = (this.projection_width-1)/2;\n if (i2+dd >= h.i2) { i2 = Math.min(Math.round(i2+dd), h.i2); i1 = Math.max(i2 - this.projection_width, h.i1); }\n else { i1 = Math.max(Math.round(i1-dd), h.i1); i2 = Math.min(i1 + this.projection_width, h.i2); }\n }\n x1 = h.grx[i1], x2 = h.grx[i2],\n binid = i1*777 + i2*333;\n }\n\n res.changed = ttrect.property('current_bin') !== binid;\n\n if (res.changed)\n ttrect.attr('x', x1)\n .attr('width', x2 - x1)\n .attr('y', y1)\n .attr('height', y2 - y1)\n .style('opacity', '0.7')\n .property('current_bin', binid);\n\n if (this.is_projection && res.changed)\n this.redrawProjection(i1, i2, j1, j2);\n }\n\n if (res.changed)\n res.user_info = { obj: histo, name: 'histo',\n bin: histo.getBin(i+1, j+1), cont: binz, binx: i+1, biny: j+1,\n grx: pnt.x, gry: pnt.y };\n\n return res;\n }\n\n /** @summary Checks if it makes sense to zoom inside specified axis range */\n canZoomInside(axis,min,max) {\n if (axis == 'z') return true;\n let obj = this.getAxis(axis);\n return obj.FindBin(max,0.5) - obj.FindBin(min,0) > 1;\n }\n\n /** @summary Performs 2D drawing of histogram\n * @return {Promise} when ready */\n async draw2D(reason) {\n this.clear3DScene();\n\n return this.drawFrameAxes().then(res => {\n return res ? this.drawingBins(reason) : false;\n }).then(res => {\n if (res) return this.draw2DBins().then(() => this.addInteractivity());\n }).then(() => this);\n }\n\n /** @summary Performs 3D drawing of histogram\n * @return {Promise} when ready */\n async draw3D(reason) {\n console.log('3D drawing is disabled, load ./hist/RH1Painter.mjs');\n return this.draw2D(reason);\n }\n\n /** @summary Call drawing function depending from 3D mode */\n async callDrawFunc(reason) {\n let main = this.getFramePainter();\n\n if (main && (main.mode3d !== this.options.Mode3D) && !this.isMainPainter())\n this.options.Mode3D = main.mode3d;\n\n return this.options.Mode3D ? this.draw3D(reason) : this.draw2D(reason);\n }\n\n /** @summary Redraw histogram */\n async redraw(reason) {\n return this.callDrawFunc(reason);\n }\n\n /** @summary Draw histogram using painter instance\n * @private */\n static async _draw(painter /*, opt*/) {\n return ensureRCanvas(painter).then(() => {\n\n painter.setAsMainPainter();\n\n painter.options = { Hist: false, Error: false, Zero: false, Mark: false,\n Line: false, Fill: false, Lego: 0, Surf: 0,\n Text: true, TextAngle: 0, TextKind: '',\n BaseLine: false, Mode3D: false, AutoColor: 0,\n Color: false, Scat: false, ScatCoef: 1, Box: false, BoxStyle: 0, Arrow: false, Contour: 0, Proj: 0,\n BarOffset: 0., BarWidth: 1., minimum: kNoZoom, maximum: kNoZoom };\n\n let kind = painter.v7EvalAttr('kind', ''),\n sub = painter.v7EvalAttr('sub', 0),\n o = painter.options;\n\n o.Text = painter.v7EvalAttr('drawtext', false);\n\n switch(kind) {\n case 'lego': o.Lego = sub > 0 ? 10+sub : 12; o.Mode3D = true; break;\n case 'surf': o.Surf = sub > 0 ? 10+sub : 1; o.Mode3D = true; break;\n case 'box': o.Box = true; o.BoxStyle = 10 + sub; break;\n case 'err': o.Error = true; o.Mode3D = true; break;\n case 'cont': o.Contour = sub > 0 ? 10+sub : 1; break;\n case 'arr': o.Arrow = true; break;\n case 'scat': o.Scat = true; break;\n case 'col': o.Color = true; break;\n default: if (!o.Text) o.Color = true;\n }\n\n // here we deciding how histogram will look like and how will be shown\n // painter.decodeOptions(opt);\n\n painter._show_empty_bins = false;\n\n painter.scanContent();\n\n return painter.callDrawFunc();\n });\n }\n\n /** @summary draw RH2 object */\n static async draw(dom, obj, opt) {\n // create painter and add it to canvas\n return RH2Painter._draw(new RH2Painter(dom, obj), opt);\n }\n\n} // class RH2Painter\n\n\nexport { RH2Painter };\n","import { settings, gStyle, kNoZoom } from '../core.mjs';\nimport { RH2Painter as RH2Painter2D } from '../hist2d/RH2Painter.mjs';\nimport { RAxisPainter } from '../gpad/RAxisPainter.mjs';\nimport { assignFrame3DMethods, drawBinsLego, drawBinsError3D, drawBinsContour3D, drawBinsSurf3D } from './hist3d.mjs';\n\n\nclass RH2Painter extends RH2Painter2D {\n\n /** Draw histogram bins in 3D, using provided draw options */\n draw3DBins() {\n\n if (!this.draw_content) return;\n\n if (this.options.Surf)\n return drawBinsSurf3D(this, true);\n\n if (this.options.Error)\n return drawBinsError3D(this, true);\n\n if (this.options.Contour)\n return drawBinsContour3D(this, true, true);\n\n drawBinsLego(this, true);\n this.updatePaletteDraw();\n }\n\n draw3D(reason) {\n\n this.mode3d = true;\n\n let main = this.getFramePainter(), // who makes axis drawing\n is_main = this.isMainPainter(), // is main histogram\n pr = Promise.resolve(this);\n\n if (reason == 'resize') {\n if (is_main && main.resize3D()) main.render3D();\n\n return pr;\n }\n\n let zmult = 1 + 2*gStyle.fHistTopMargin;\n\n this.zmin = main.logz ? this.gminposbin * 0.3 : this.gminbin;\n this.zmax = this.gmaxbin;\n if (this.options.minimum !== kNoZoom) this.zmin = this.options.minimum;\n if (this.options.maximum !== kNoZoom) { this.zmax = this.options.maximum; zmult = 1; }\n if (main.logz && (this.zmin <= 0)) this.zmin = this.zmax * 1e-5;\n\n this.deleteAttr();\n\n if (is_main) {\n assignFrame3DMethods(main);\n pr = main.create3DScene(this.options.Render3D).then(() => {\n main.setAxesRanges(this.getAxis('x'), this.xmin, this.xmax, this.getAxis('y'), this.ymin, this.ymax, null, this.zmin, this.zmax);\n main.set3DOptions(this.options);\n main.drawXYZ(main.toplevel, RAxisPainter, { zmult, zoom: settings.Zooming, ndim: 2, draw: true, v7: true });\n });\n }\n\n if (!main.mode3d)\n return pr;\n\n return pr.then(() => this.drawingBins(reason)).then(() => {\n // called when bins received from server, must be reentrant\n let main = this.getFramePainter();\n\n this.draw3DBins();\n main.render3D();\n main.addKeysHandler();\n\n return this;\n });\n }\n\n /** @summary draw RH2 object */\n static async draw(dom, obj, opt) {\n // create painter and add it to canvas\n return RH2Painter._draw(new RH2Painter(dom, obj), opt);\n }\n\n} // class RH2Painter\n\nexport { RH2Painter };\n"],"x_google_ignoreList":[0,1]} \ No newline at end of file diff --git a/docs/717.92b025f5f9cba505.js b/docs/717.92b025f5f9cba505.js deleted file mode 100644 index 031826d44..000000000 --- a/docs/717.92b025f5f9cba505.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[717],{6528:(et,J,T)=>{T.d(J,{p:()=>Z});var F=T(1773),f=T(6149),W=T(2454);class Z extends W.tK{constructor(m,b,h,c){super(m,b,h),this.csstype=c}v7EvalAttr(m,b){let h=this.getObject();if(!h)return b;this.cssprefix&&(m=this.cssprefix+m);const c=o=>{if(void 0===b)return o;let l=typeof b,d=typeof o;return l==d?o:"boolean"==l?"string"==d?""!=o&&"0"!=o&&"no"!=o&&"off"!=o:!!o:"number"==l&&"string"==d?parseFloat(o):o};if(h.fAttr&&h.fAttr.m){let o=h.fAttr.m[m];if(o)return c(o.v)}if(this.rstyle&&this.rstyle.fBlocks){let o=this.rstyle.fBlocks;for(let l=0;l=d.length)break;if("-"==d[v]||"+"==d[v]){if(p)return console.log("Fail to parse RPadLength "+c),h;p="-"==d[v]?-1:1,v++;continue}for(v>0&&(d=d.slice(v),v=0);v="0"&&d[v]<="9"||"."==d[v]);)v++;let w=parseFloat(d.slice(0,v));if(!Number.isFinite(w))return console.log("Fail to parse RPadLength "+c),Math.round(h*b);d=d.slice(v),v=0,p||(p=1),d&&"%"==d[0]?(d=d.slice(1),o+=p*w*.01):d.length>1&&"p"==d[0]&&"x"==d[1]?(d=d.slice(2),l+=p*w):o+=p*w,p=0}return Math.round(o*b+l)}v7EvalColor(m,b){let h=this.v7EvalAttr(m,"");if(!h||!(0,F.isStr)(h))return b;if("auto"==h){let c=this.getPadPainter();if(void 0!==c?._auto_color_cnt){let o=c.getHistPalette(),l=c._auto_color_cnt++,d=c._num_primitives-1;d<2&&(d=2),h=o?o.getColorOrdinal(l%d/d):"blue",this._auto_colors||(this._auto_colors={}),this._auto_colors[m]=h}else this._auto_colors&&this._auto_colors[m]?h=this._auto_colors[m]:(console.error(`Autocolor ${m} not defined yet - please check code`),h="")}else if("["==h[0]){let c=parseFloat(h.slice(1,h.length-1));if(h="black",Number.isFinite(c)){let l=this.getPadPainter()?.getHistPalette();l&&(h=l.getColorOrdinal(c))}}return h}v7EvalFont(m,b,h){b?"number"==typeof b&&(b={size:b}):b={};let c=this.getPadPainter(),o=c?._dfltRFont||{fFamily:"Arial",fStyle:"",fWeight:""},l=this.v7EvalAttr(m+"_size",b.size||12),d=this.v7EvalAttr(m+"_angle",0),p=this.v7EvalAttr(m+"_align",b.align||"none"),v=this.v7EvalColor(m+"_color",b.color||"none"),w=this.v7EvalAttr(m+"_font_family",o.fFamily||"Arial"),M=this.v7EvalAttr(m+"_font_style",o.fStyle||""),D=this.v7EvalAttr(m+"_font_weight",o.fWeight||"");(0,F.isStr)(l)&&(l=parseFloat(l)),(!Number.isFinite(l)||l<=0)&&(l=12),h||(h=c?.getPadHeight()||100);let z=new f.G(null,l,h,w,M,D);return d&&z.setAngle(360-d),"none"!==p&&z.setAlign(p),"none"!==v&&z.setColor(v),z}createv7AttFill(m){(!m||!(0,F.isStr)(m))&&(m="fill_");let b=this.v7EvalColor(m+"color",""),h=this.v7EvalAttr(m+"style",0);this.createAttFill({pattern:h,color:b,color_as_svg:!0})}createv7AttLine(m){(!m||!(0,F.isStr)(m))&&(m="line_");let b=this.v7EvalColor(m+"color","black"),h=this.v7EvalAttr(m+"width",1),c=this.v7EvalAttr(m+"style",1),o=this.v7EvalAttr(m+"pattern");this.createAttLine({color:b,width:h,style:c,pattern:o}),"border_"==m&&this.lineatt.setBorder(this.v7EvalAttr(m+"rx",0),this.v7EvalAttr(m+"ry",0))}createv7AttMarker(m){(!m||!(0,F.isStr)(m))&&(m="marker_");let b=this.v7EvalColor(m+"color","black"),h=this.v7EvalAttr(m+"size",.01),c=this.v7EvalAttr(m+"style",1),o=1;h<1&&(o=this.getPadPainter()?.getPadHeight()||100),this.createAttMarker({color:b,size:h,style:c,refsize:o})}v7AttrChange(m,b,h,c){if(!this.snapid)return!1;m._typename||(m._typename="ROOT::Experimental::RChangeAttrRequest",m.ids=[],m.names=[],m.values=[],m.update=!0),this.cssprefix&&(b=this.cssprefix+b),m.ids.push(this.snapid),m.names.push(b);let o=null;if(null==h&&(c||(c="none"),"none"!==c&&console.error(`Trying to set ${c} for none value`)),!c)switch(typeof h){case"number":c="double";break;case"boolean":c="boolean"}switch(o={_typename:"ROOT::Experimental::RAttrMap::"},c){case"none":o._typename+="NoValue_t";break;case"boolean":o._typename+="BoolValue_t",o.v=!!h;break;case"int":o._typename+="IntValue_t",o.v=parseInt(h);break;case"double":o._typename+="DoubleValue_t",o.v=parseFloat(h);break;default:o._typename+="StringValue_t",o.v=(0,F.isStr)(h)?h:JSON.stringify(h)}return m.values.push(o),!0}v7SendAttrChanges(m,b){let h=this.getCanvPainter();h&&m?._typename&&(void 0!==b&&(m.update=!!b),h.v7SubmitRequest("",m))}v7SubmitRequest(m,b,h){let c=this.getCanvPainter();return(0,F.isFunc)(c?.submitDrawableRequest)?this.snapid?c.submitDrawableRequest(m,b,this,h):(this._pending_request={kind:m,req:b,method:h},b):null}assignSnapId(m){if(this.snapid=m,this.snapid&&this._pending_request){let b=this._pending_request;this.v7SubmitRequest(b.kind,b.req,b.method),delete this._pending_request}}v7CommMode(){let m=this.getCanvPainter();return m&&m.submitDrawableRequest&&m._websocket?1:3}v7NormalMode(){return 1==this.v7CommMode()}v7OfflineMode(){return 3==this.v7CommMode()}}},757:(et,J,T)=>{T.d(J,{C:()=>m});var F=T(5368),f=T(1773),W=T(2912),B=T(6292),K=T(7428),Z=T(2989),V=T(6528);class m extends V.p{constructor(h,c,o,l){super(h,l?c.getObject():c,"",l?c.csstype:"axis"),Object.assign(this,B.KB),this.initAxisPainter(),this.axis=o,l?(this.embedded=!0,this.cssprefix=l,this.rstyle=c.rstyle):this.cssprefix="axis_"}cleanup(){delete this.axis,delete this.axis_g,this.cleanupAxisPainter(),super.cleanup()}getAxisType(){return"RAttrAxis"}configureZAxis(h,c){this.name=h,this.kind="normal",this.log=!1;let o=this.v7EvalAttr("log",0);o&&(this.log=!0,this.logbase=10,Math.abs(o-Math.exp(1))<.1?this.logbase=Math.exp(1):o>1.9&&(this.logbase=Math.round(o))),c.logz=this.log}configureAxis(h,c,o,l,d,p,v,w,M){M||(M={}),this.name=h,this.full_min=c,this.full_max=o,this.kind="normal",this.vertical=p,this.log=!1;let D=this.v7EvalAttr("log",0),z=this.v7EvalAttr("symlog",0);if(this.reverse=M.reverse||!1,this.v7EvalAttr("time")){this.kind="time",this.timeoffset=0;let P=this.v7EvalAttr("timeOffset");void 0!==P&&(P=parseFloat(P),Number.isFinite(P)&&(this.timeoffset=1e3*P))}else this.axis&&this.axis.fLabelsIndex?(this.kind="labels",delete this.own_labels):this.kind=M.labels?"labels":"normal";"time"==this.kind?this.func=(0,W.Xf)().domain([this.convertDate(l),this.convertDate(d)]):z&&z>0?(this.symlog=z,this.func=(0,W.eh)().constant(z).domain([l,d])):D?(d<=0&&(d=1),(l<=0||l>=d)&&(l=1e-4*d),this.log=!0,this.logbase=10,Math.abs(D-Math.exp(1))<.1?this.logbase=Math.exp(1):D>1.9&&(this.logbase=Math.round(D)),this.func=(0,W.p2)().base(this.logbase).domain([l,d])):this.func=(0,W.BY)().domain([l,d]),this.scale_min=l,this.scale_max=d,this.gr_range=w||1e3;let A=v||[0,this.gr_range];this.axis_shift=A[1]-this.gr_range,this.func.range(this.reverse?[A[1],A[0]]:A),this.gr="time"==this.kind?P=>this.func(this.convertDate(P)):this.log?P=>P20&&(this.nticks=20);let j=Math.abs(this.gr_range)||100;if("time"==this.kind){this.nticks>8&&(this.nticks=8);let P=this.scale_max-this.scale_min,I=this.v7EvalAttr("timeFormat",""),Y=(0,B.ai)(P/j,!1);(!I||P<.1*(this.full_max-this.full_min))&&(I=(0,B.ai)(P/this.nticks,!0)),this.tfunc1=this.tfunc2=(0,W.i$)(I),Y!==I&&(this.tfunc2=(0,W.i$)(Y)),this.format=this.formatTime}else if(this.log)this.nticks2>1&&(this.nticks*=this.nticks2,this.nticks2=1),this.noexp=this.v7EvalAttr("noexp",!1),this.scale_max<300&&this.scale_min>.3&&10==this.logbase&&(this.noexp=!0),this.moreloglabels=this.v7EvalAttr("moreloglbls",!1),this.format=this.formatLog;else if("labels"==this.kind){this.nticks=50;let P=this.scale_max-this.scale_min;this.nticks>P&&(this.nticks=Math.round(P)),this.nticks2=1,this.format=this.formatLabels}else this.order=0,this.ndig=0,this.format=this.formatNormal}getScaleMin(){return this.func?this.func.domain()[0]:0}getScaleMax(){return this.func?this.func.domain()[1]:0}formatLabels(h){let c=Math.round(h);if(this.axis&&this.axis.fLabelsIndex){if(c<0||c>=this.axis.fNBinsNoOver)return null;for(let o=0;o=0&&cthis.scale_min+v&&p.unshift(this.scale_min),p[p.length-1]1&&(!this.log||10===this.logbase)){d.minor=d.middle=this.produceTicks(d.major.length,this.nticks2);let p=Math.abs(this.func.range()[1]-this.func.range()[0]);d.middle.length<=d.major.length||d.middle.length>p/3.5?d.minor=d.middle=d.major:this.nticks3>1&&!this.log&&(d.minor=this.produceTicks(d.middle.length,this.nticks3),(d.minor.length<=d.middle.length||d.minor.length>p/1.7)&&(d.minor=d.middle))}if(d.reset=function(){this.nminor=this.nmiddle=this.nmajor=0},d.next=function(p){return!(this.nminor>=this.minor.length||(this.tick=this.minor[this.nminor++],this.grpos=this.func(this.tick),p&&(this.grpos=Math.round(this.grpos)),this.kind=3,this.nmiddle=this.major.length?null:this.func(this.major[this.nmajor])},this.order=0,this.ndig=0,"normal"==this.kind&&!this.log&&d.major.length>0){let p=0,v=0,w=!1;if(!c){let A=Math.max(Math.abs(d.major[0]),Math.abs(d.major[d.major.length-1])),O=Math.min(Math.abs(d.major[0]),Math.abs(d.major[d.major.length-1])),j=A>0?3*Math.round(Math.log10(A)/3):0,P=O>0?3*Math.round(Math.log10(O)/3):0;w=A<2e4,(A||O)&&(p=Math.max(j,P)+3,v=Math.min(j,P)-3)}let M=0,D=this.ndig,z=1e10;for(let A=v;A<=p;A+=3){if(w&&3===A)continue;this.order=A,this.ndig=0;let O=[],j=0,P=0;for(;j11)break;O=[],j=0,P=0}}!A&&this.ndig<4&&(P-=2*d.major.length+3),P{z.sourceEvent.preventDefault(),z.sourceEvent.stopPropagation();let A=h.node().getBBox(),O=this.vertical?A.height:A.width;p=l=h.property("shift_x"),v=d=h.property("shift_y"),M="center"==this.titlePos?1:"left"==this.titlePos?0:2,w=[0,this.gr_range/2,this.gr_range];let j=this.vertical?-O:O,P=this.isReverseAxis()?2:0;"middle"==this.title_align?(w[P]+=j/2,w[2-P]-=j/2):"begin"==this.title_align^this.isTitleRotated()?(w[1]-=j/2,w[2-P]-=j):(w[P]+=j,w[1]+=j/2),w[M]=this.vertical?d:l,o=h.append("rect").classed("zoom",!0).attr("x",A.x).attr("y",A.y).attr("width",A.width).attr("height",A.height).style("cursor","move")}).on("drag",z=>{if(!o)return;z.sourceEvent.preventDefault(),z.sourceEvent.stopPropagation(),l+=z.dx,d+=z.dy;let A,O,j=this.vertical?d:l,P=0;for(let I=1;I<3;++I)Math.abs(j-w[I]){if(!o)return;z.sourceEvent.preventDefault(),z.sourceEvent.stopPropagation();let A=h.property("basepos")||0;h.property("shift_x",p).property("shift_y",v),this.titleOffset=(this.vertical?A-p:v-A)*c,this.titlePos=1==M?"center":0==M?"left":"right",this.changeAxisAttr(0,"title_position",this.titlePos,"title_offset",this.titleOffset/this.scalingSize),o.remove(),o=null}),h.style("cursor","move").call(D)}isInsideGrRange(h,c,o){return c||(c=0),void 0===o&&(o=c),this.gr_range<0?h>=this.gr_range-o&&h<=c:h>=-c&&h<=this.gr_range+o}getGrRange(h){return h||(h=0),this.gr_range<0?this.gr_range-h:this.gr_range+h}isReverseAxis(){return!this.vertical!=this.getGrRange()>0}drawMainLine(h){let c="";if(this.endingSize&&this.endingStyle){let o=this.gr_range>0?-this.endingSize:this.endingSize,l=Math.round(.7*o);o=Math.round(o),c=this.vertical?`l${l},${o}M0,${this.gr_range}l${-l},${o}`:`l${o},${l}M${this.gr_range},0l${o},${-l}`}h.append("svg:path").attr("d","M0,0"+(this.vertical?"v":"h")+this.gr_range+c).call(this.lineatt.func).style("fill",c?"none":null)}drawTicks(h,c,o){o&&(this.ticks=[]),this.handle.reset();let l="",d=0;for("both"==this.ticksSide&&(c=1,d=1);this.handle.next(!0);){let w=Math.round(this.ticksSize/4),M=0;this.handle.kind<3&&(w=Math.round(this.ticksSize/2));let D=this.handle.grpos-this.axis_shift;(this.startingSize||this.endingSize)&&!this.isInsideGrRange(D,-Math.abs(this.startingSize),-Math.abs(this.endingSize))||(1==this.handle.kind&&(("labels"==this.kind||null!==this.format(this.handle.tick,!0))&&(w=this.ticksSize),o&&this.ticks.push(D)),d>0?M=-w:c<0?(M=-w,w=0):M=0,l+=this.vertical?`M${w},${D}H${M}`:`M${D},${-w}V${-M}`)}l&&h.append("svg:path").attr("d",l).style("stroke",this.ticksColor||this.lineatt.color).style("stroke-width",this.ticksWidth&&1!=this.ticksWidth?this.ticksWidth:null);let p=Math.round(.25*this.ticksSize),v=Math.round(1.25*this.ticksSize);return{"-1":c>0||d?v:p,1:c<0||d?v:p}}drawLabels(h,c,o){var l=this;return(0,F.Z)(function*(){let d=l.isCenteredLabels(),p=0!=l.labelsFont.angle,v=1,w=0,M=!1,D=h.append("svg:g").attr("class","axis_labels").property("side",c),z=l.handle.lbl_pos||l.handle.major,A=0,O=0;function j(N){A=Math.max(A,this.result_width),O=Math.max(O,this.result_height);let X=this.result_width;if(X&&(!N.vertical&&!p||N.vertical&&p)&&!N.log){let U=.45*this.gap_before+.45*this.gap_after;this.gap_before?this.gap_after||(U=.9*this.gap_before):U=.9*this.gap_after,v=Math.min(v,U/X)}v>1e-4&&v<.8&&!N.vertical&&!p&&w>5&&c>0&&(M=!0);let G=v*(M?3:1);G>1e-4&&G<1&&N.scaleTextDrawing(1/G,D)}let P=0,I=Math.round((l.vertical?-c:c)*l.labelsOffset),Y=Math.round((l.vertical?-c:c)*o[c]);I&&D.attr("transform",l.vertical?`translate(${I})`:`translate(0,${I})`),D.property("fix_offset",I),l.startTextDrawing(l.labelsFont,"font",D);for(let N=0;N0?Math.abs(Math.round(G-l.func(z[N-1]))):0,U.gap_after=N{if(M&&D.selectAll("text").each(function(){let N=(0,W.Ys)(this),X=N.attr("transform");N.attr("transform",X+" rotate(25)").style("text-anchor","start")}),l.vertical)o[c]+=Math.round(p?1.2*O:A+.4*l.labelsFont.size)-c*I;else{let N=M?A*Math.sin(.1388888888888889*Math.PI)+O*(Math.cos(.1388888888888889*Math.PI)+.2):0;o[c]+=Math.round(Math.max(p?A+.4*l.labelsFont.size:1.2*O,1.2*l.labelsFont.size,N))+I}return o})})()}addZoomingRect(h,c,o){if(f.settings.Zooming&&!this.disable_zooming&&!(0,f.isBatchMode)()){let l=Math.max(o[c],10),d=this.vertical?`v${this.gr_range}h${-c*l}v${-this.gr_range}`:`h${this.gr_range}v${c*l}h${-this.gr_range}`;h.append("svg:path").attr("d",`M0,0${d}z`).attr("class","axis_zoom").style("opacity","0").style("cursor","crosshair")}}isTitleRotated(){return this.titleFont&&this.titleFont.angle!=(this.vertical?270:0)}drawTitle(h,c,o){var l=this;return(0,F.Z)(function*(){if(!l.fTitle)return l;let d=h.append("svg:g").attr("class","axis_title"),p=0,v=0,w=0,M=l.isTitleRotated();return l.startTextDrawing(l.titleFont,"font",d),l.title_align=l.titleCenter?"middle":l.titleOpposite^(l.isReverseAxis()||M)?"begin":"end",l.vertical?(w=Math.round(-c*o[c]),p=w+Math.round(-c*l.titleOffset),v=Math.round(l.titleCenter?l.gr_range/2:l.titleOpposite?0:l.gr_range),l.drawText({align:[l.title_align,c<0^M?"top":"bottom"],text:l.fTitle,draw_g:d})):(p=Math.round(l.titleCenter?l.gr_range/2:l.titleOpposite?0:l.gr_range),w=Math.round(c*o[c]),v=w+Math.round(c*l.titleOffset),l.drawText({align:[l.title_align,c>0^M?"top":"bottom"],text:l.fTitle,draw_g:d})),d.attr("transform",`translate(${p},${v})`).property("basepos",w).property("shift_x",p).property("shift_y",v),l.addTitleDrag(d,c),l.finishTextDrawing(d)})()}extractDrawAttributes(h){let c=this.getPadPainter(),o=c?.getPadRect()||{width:10,height:10};this.scalingSize=h||(this.vertical?o.width:o.height),this.createv7AttLine("line_"),this.optionUnlab=this.v7EvalAttr("labels_hide",!1),this.endingStyle=this.v7EvalAttr("ending_style",""),this.endingSize=Math.round(this.v7EvalLength("ending_size",this.scalingSize,this.endingStyle?.02:0)),this.startingSize=Math.round(this.v7EvalLength("starting_size",this.scalingSize,0)),this.ticksSize=this.v7EvalLength("ticks_size",this.scalingSize,.02),this.ticksSide=this.v7EvalAttr("ticks_side","normal"),this.ticksColor=this.v7EvalColor("ticks_color",""),this.ticksWidth=this.v7EvalAttr("ticks_width",1),h&&this.ticksSize<0&&(this.ticksSize=-this.ticksSize),this.fTitle=this.v7EvalAttr("title_value",""),this.fTitle?(this.titleFont=this.v7EvalFont("title",{size:.03},h||c?.getPadHeight()||10),this.titleFont.roundAngle(180,this.vertical?270:0),this.titleOffset=this.v7EvalLength("title_offset",this.scalingSize,0),this.titlePos=this.v7EvalAttr("title_position","right"),this.titleCenter="center"==this.titlePos,this.titleOpposite="left"==this.titlePos):(delete this.titleFont,delete this.titleOffset,delete this.titlePos),this.labelsFont=this.v7EvalFont("labels",{size:h?.05:.03}),this.labelsFont.roundAngle(180),this.labelsFont.angle&&(this.labelsFont.angle=270),this.labelsOffset=this.v7EvalLength("labels_offset",this.scalingSize,0),h&&(this.ticksSize=.5*this.labelsFont.size),this.maxTickSize&&this.ticksSize>this.maxTickSize&&(this.ticksSize=this.maxTickSize)}drawAxis(h,c,o){var l=this;return(0,F.Z)(function*(){let d=h;void 0===o&&(o=1),l.standalone||(d=h.select("."+l.name+"_container"),d.empty()?d=h.append("svg:g").attr("class",l.name+"_container"):d.selectAll("*").remove()),d.attr("transform",c||null),l.extractDrawAttributes(),l.axis_g=d,l.side=o,"invert"==l.ticksSide&&(o=-o),l.standalone&&l.drawMainLine(d),l.handle=l.createTicks(!1,!1,!1,!1);let M=l.drawTicks(d,o,!0);return(l.optionUnlab?Promise.resolve(M):l.drawLabels(d,o,M)).then(z=>(l.addZoomingRect(d,l.standalone?o:l.side,z),l.drawTitle(d,o,z)))})()}setAfterDrawHandler(h){this._afterDrawAgain=h}drawAxisAgain(){if(!this.axis_g||!this.side)return;this.axis_g.selectAll("*").remove(),this.extractDrawAttributes();let h=this.side;"invert"==this.ticksSide&&(h=-h),this.standalone&&this.drawMainLine(this.axis_g);let c=this.drawTicks(this.axis_g,h,!1);return(this.optionUnlab?Promise.resolve(c):this.drawLabels(this.axis_g,h,c)).then(l=>(this.addZoomingRect(this.axis_g,this.standalone?h:this.side,l),this.drawTitle(this.axis_g,h,l))).then(()=>{(0,f.isFunc)(this._afterDrawAgain)&&this._afterDrawAgain()})}drawAxisOtherPlace(h,c,o,l){let d=h.select("."+this.name+"_container2");d.empty()?d=h.append("svg:g").attr("class",this.name+"_container2"):d.selectAll("*").remove(),d.attr("transform",c||null),"invert"==this.ticksSide&&(o=-o);let p=this.drawTicks(d,o,!1);return(this.optionUnlab||l?Promise.resolve(p):this.drawLabels(d,o,p)).then(w=>(this.addZoomingRect(d,o,w),!0))}zoomStandalone(h,c){this.changeAxisAttr(1,"zoomMin",h,"zoomMax",c)}redraw(){let h=this.getObject(),c=this.getPadPainter(),o=c.getCoordinate(h.fPos),l=c.getPadLength(h.fVertical,h.fLength),d=this.v7EvalAttr("reverse",!1),p=h.fLabels.length,v=p>0?0:this.v7EvalAttr("min",0),w=p>0?p:this.v7EvalAttr("max",100);h.fVertical&&(l-=c.getPadHeight());let M=this.v7EvalAttr("zoomMin"),D=this.v7EvalAttr("zoomMax");M===D&&(M=v,D=w),this.configureAxis("axis",v,w,M,D,h.fVertical,void 0,l,{reverse:d,labels:p>0}),this.createG(),this.standalone=!0;let z=this.drawAxis(this.draw_g,`translate(${o.x},${o.y})`);return(0,f.isBatchMode)()?z:z.then(()=>{f.settings.ContextMenu&&this.draw_g.on("contextmenu",A=>{A.stopPropagation(),A.preventDefault(),(0,K.Z)(A,this).then(O=>{O.add("header:RAxisDrawable"),O.add("Unzoom",()=>this.zoomStandalone()),this.fillAxisContextMenu(O,""),O.show()})}),(0,Z.uI)(this,{x:o.x,y:o.y,width:this.vertical?10:l,height:this.vertical?l:10,only_move:!0,redraw:A=>this.positionChanged(A)}),this.draw_g.on("dblclick",()=>this.zoomStandalone()),f.settings.ZoomWheel&&this.draw_g.on("wheel",A=>{A.stopPropagation(),A.preventDefault();let O=(0,W.cx)(A,this.draw_g.node()),P=this.analyzeWheelEvent(A,this.vertical?1-O[1]/l:O[0]/l);P.changed&&this.zoomStandalone(P.min,P.max)})})}positionChanged(h){let c=this.getObject(),o=this.getPadPainter().getPadRect(),l=h.x/o.width,d=1-h.y/o.height;c.fPos.fHoriz.fArr=[l],c.fPos.fVert.fArr=[d],this.submitCanvExec(`SetPos({${l.toFixed(4)},${d.toFixed(4)}})`)}changeAxisAttr(h){let c={},o=1;for(;othis.getFramePainter().unzoom(c)),h.add("sub:Log scale",()=>this.changeAxisLog("toggle")),h.addchk(!this.log&&!this.symlog,"linear",0,o=>this.changeAxisLog(o)),h.addchk(this.log&&!this.symlog&&10==this.logbase,"log10",()=>this.changeAxisLog(10)),h.addchk(this.log&&!this.symlog&&2==this.logbase,"log2",()=>this.changeAxisLog(2)),h.addchk(this.log&&!this.symlog&&Math.abs(this.logbase-Math.exp(1))<.1,"ln",()=>this.changeAxisLog(Math.exp(1))),h.addchk(!this.log&&this.symlog,"symlog",0,()=>h.input("set symlog constant",this.symlog||10,"float").then(o=>this.changeAxisAttr(2,"symlog",o))),h.add("endsub:"),h.add("Divisions",()=>h.input("Set axis devisions",this.v7EvalAttr("ndiv",508),"int").then(o=>this.changeAxisAttr(2,"ndiv",o))),h.add("sub:Ticks"),h.addRColorMenu("color",this.ticksColor,o=>this.changeAxisAttr(1,"ticks_color",o)),h.addSizeMenu("size",0,.05,.01,this.ticksSize/this.scalingSize,o=>this.changeAxisAttr(1,"ticks_size",o)),h.addSelectMenu("side",["normal","invert","both"],this.ticksSide,o=>this.changeAxisAttr(1,"ticks_side",o)),h.add("endsub:"),!this.optionUnlab&&this.labelsFont&&(h.add("sub:Labels"),h.addSizeMenu("offset",-.05,.05,.01,this.labelsOffset/this.scalingSize,o=>this.changeAxisAttr(1,"labels_offset",o)),h.addRAttrTextItems(this.labelsFont,{noangle:1,noalign:1},o=>this.changeAxisAttr(1,"labels_"+o.name,o.value)),h.addchk(this.labelsFont.angle,"rotate",o=>this.changeAxisAttr(1,"labels_angle",o?180:0)),h.add("endsub:")),h.add("sub:Title",()=>h.input("Enter axis title",this.fTitle).then(o=>this.changeAxisAttr(1,"title_value",o))),this.fTitle&&(h.addSizeMenu("offset",-.05,.05,.01,this.titleOffset/this.scalingSize,o=>this.changeAxisAttr(1,"title_offset",o)),h.addSelectMenu("position",["left","center","right"],this.titlePos,o=>this.changeAxisAttr(1,"title_position",o)),h.addchk(this.isTitleRotated(),"rotate",o=>this.changeAxisAttr(1,"title_angle",o?180:0)),h.addRAttrTextItems(this.titleFont,{noangle:1,noalign:1},o=>this.changeAxisAttr(1,"title_"+o.name,o.value))),h.add("endsub:"),!0}}},6717:(et,J,T)=>{T.r(J),T.d(J,{RCanvasPainter:()=>j,RObjectPainter:()=>V.p,RPadPainter:()=>w,drawRAxis:()=>G,drawRFont:()=>X,drawRFrame:()=>U,drawRFrameTitle:()=>N,drawRPadSnapshot:()=>P,ensureRCanvas:()=>I});var F=T(5368),f=T(1773),W=T(2912),B=T(7222),K=T(1727),Z=T(2454),V=T(6528),m=T(757),b=T(1671),h=T(6292),c=T(2989);class o extends V.p{constructor(t,e){super(t,e,"","frame"),this.mode3d=!1,this.xmin=this.xmax=0,this.ymin=this.ymax=0,this.axes_drawn=!1,this.keys_handler=null,this.projection=0,this.v7_frame=!0}getFramePainter(){return this}is_root6(){return!1}setFrameActive(t){this.enabledKeys=!(!t||!f.settings.HandleKeys),this.control&&(this.control.enableKeys=this.enabledKeys)}setLastEventPos(t){this.fLastEventPnt=t}getLastEventPos(){return this.fLastEventPnt}updateAttributes(t){if(void 0===this.fX1NDC||t&&!this.modified_NDC){let e=this.getPadPainter().getPadRect();this.fX1NDC=this.v7EvalLength("margins_left",e.width,f.settings.FrameNDC.fX1NDC)/e.width,this.fY1NDC=this.v7EvalLength("margins_bottom",e.height,f.settings.FrameNDC.fY1NDC)/e.height,this.fX2NDC=1-this.v7EvalLength("margins_right",e.width,1-f.settings.FrameNDC.fX2NDC)/e.width,this.fY2NDC=1-this.v7EvalLength("margins_top",e.height,1-f.settings.FrameNDC.fY2NDC)/e.height}this.fillatt||this.createv7AttFill(),this.createv7AttLine("border_")}getProjectionFunc(){switch(this.projection){case 1:return(t,e)=>{const i=Math.PI/180,s=t/2*i,r=e*i,a=Math.sqrt(2),n=2*a/Math.PI,u=Math.cos(r),g=Math.sqrt(1+u*Math.cos(s));return{x:u*Math.sin(s)*2*a/g/n/i,y:Math.sin(r)*a/g/n/i}};case 2:return(t,e)=>({x:t,y:Math.log(Math.tan((Math.PI/2+e/180*Math.PI)/2))});case 3:return(t,e)=>({x:t*Math.cos(e/180*Math.PI),y:e});case 4:return(t,e)=>({x:t*(2*Math.cos(2*e/180*Math.PI/3)-1),y:180*Math.sin(e/180*Math.PI/3)})}}recalculateRange(t){this.projection=t||0,2==this.projection&&(this.scale_ymin<=-90||this.scale_ymax>=90)&&(console.warn(`Mercator Projection: latitude out of range ${this.scale_ymin} ${this.scale_ymax}`),this.projection=0);let e=this.getProjectionFunc();if(!e)return;let i=[e(this.scale_xmin,this.scale_ymin),e(this.scale_xmin,this.scale_ymax),e(this.scale_xmax,this.scale_ymax),e(this.scale_xmax,this.scale_ymin)];this.scale_xmin<0&&this.scale_xmax>0&&(i.push(e(0,this.scale_ymin)),i.push(e(0,this.scale_ymax))),this.scale_ymin<0&&this.scale_ymax>0&&(i.push(e(this.scale_xmin,0)),i.push(e(this.scale_xmax,0))),this.original_xmin=this.scale_xmin,this.original_xmax=this.scale_xmax,this.original_ymin=this.scale_ymin,this.original_ymax=this.scale_ymax,this.scale_xmin=this.scale_xmax=i[0].x,this.scale_ymin=this.scale_ymax=i[0].y;for(let s=1;s0?this.getColor(f.gStyle.fGridColor):"black";if(this.x_handle&&(this.x_handle.draw_grid=s),this.x_handle&&this.x_handle.draw_grid){let u="";for(let g=0;g0?this.scale_ymax=Math.exp(1.1*Math.log(this.scale_ymax)):this.scale_ymax+=.1*(this.scale_ymax-this.scale_ymin)),this.zoom_ymin==this.zoom_ymax&&t.zoom_ymin!=t.zoom_ymax&&!this.zoomChangedInteractive("y")&&(this.zoom_ymin=t.zoom_ymin,this.zoom_ymax=t.zoom_ymax),this.zoom_xmin!=this.zoom_xmax&&(this.scale_xmin=this.zoom_xmin,this.scale_xmax=this.zoom_xmax),this.zoom_ymin!=this.zoom_ymax&&(this.scale_ymin=this.zoom_ymin,this.scale_ymax=this.zoom_ymax);let s=this.xaxis,r=this.yaxis;s?._typename!=f.clTAxis&&(s=(0,f.create)(f.clTAxis)),r?._typename!=f.clTAxis&&(r=(0,f.create)(f.clTAxis)),this.x_handle=new h.z4(this.getDom(),s,!0),this.x_handle.setPadName(this.getPadName()),this.x_handle.optionUnlab=this.v7EvalAttr("x_labels_hide",!1),this.x_handle.configureAxis("xaxis",this.xmin,this.xmax,this.scale_xmin,this.scale_xmax,this.swap_xy,this.swap_xy?[0,i]:[0,e],{reverse:this.reverse_x,log:this.swap_xy?this.logy:this.logx,symlog:this.swap_xy?t.symlog_y:t.symlog_x,logcheckmin:this.swap_xy,logminfactor:1e-4}),this.x_handle.assignFrameMembers(this,"x"),this.y_handle=new h.z4(this.getDom(),r,!0),this.y_handle.setPadName(this.getPadName()),this.y_handle.optionUnlab=this.v7EvalAttr("y_labels_hide",!1),this.y_handle.configureAxis("yaxis",this.ymin,this.ymax,this.scale_ymin,this.scale_ymax,!this.swap_xy,this.swap_xy?[0,e]:[0,i],{reverse:this.reverse_y,log:this.swap_xy?this.logx:this.logy,symlog:this.swap_xy?t.symlog_x:t.symlog_y,logcheckmin:t.ndim<2||this.swap_xy,log_min_nz:t.ymin_nz&&t.ymin_nz<.01*this.ymax?.3*t.ymin_nz:0,logminfactor:3e-4}),this.y_handle.assignFrameMembers(this,"y")}hasDrawnAxes(t,e){return!t&&!e&&this.axes_drawn}drawAxes(){var t=this;return(0,F.Z)(function*(){if(t.axes_drawn||t.xmin==t.xmax||t.ymin==t.ymax)return t.axes_drawn;let e=t.v7EvalAttr("ticksX",1),i=t.v7EvalAttr("ticksY",1),s=1,r=1;t.v7EvalAttr("swapX",!1)&&(s=-1),t.v7EvalAttr("swapY",!1)&&(r=-1);let a=t.getFrameWidth(),n=t.getFrameHeight();t.v6axes||(t.cleanupAxes(),t.swap_xy=!1,t.zoom_xmin!=t.zoom_xmax?(t.scale_xmin=t.zoom_xmin,t.scale_xmax=t.zoom_xmax):(t.scale_xmin=t.xmin,t.scale_xmax=t.xmax),t.zoom_ymin!=t.zoom_ymax?(t.scale_ymin=t.zoom_ymin,t.scale_ymax=t.zoom_ymax):(t.scale_ymin=t.ymin,t.scale_ymax=t.ymax),t.recalculateRange(0),t.x_handle=new m.C(t.getDom(),t,t.xaxis,"x_"),t.x_handle.setPadName(t.getPadName()),t.x_handle.snapid=t.snapid,t.x_handle.draw_swapside=s<0,t.x_handle.draw_ticks=e,t.y_handle=new m.C(t.getDom(),t,t.yaxis,"y_"),t.y_handle.setPadName(t.getPadName()),t.y_handle.snapid=t.snapid,t.y_handle.draw_swapside=r<0,t.y_handle.draw_ticks=i,t.z_handle=new m.C(t.getDom(),t,t.zaxis,"z_"),t.z_handle.setPadName(t.getPadName()),t.z_handle.snapid=t.snapid,t.x_handle.configureAxis("xaxis",t.xmin,t.xmax,t.scale_xmin,t.scale_xmax,!1,[0,a],a,{reverse:!1}),t.x_handle.assignFrameMembers(t,"x"),t.y_handle.configureAxis("yaxis",t.ymin,t.ymax,t.scale_ymin,t.scale_ymax,!0,[n,0],-n,{reverse:!1}),t.y_handle.assignFrameMembers(t,"y"),t.z_handle.configureZAxis("zaxis",t));let u=t.getFrameSvg().select(".axis_layer");t.x_handle.has_obstacle=!1;let k,g=t.swap_xy?t.y_handle:t.x_handle,x=t.swap_xy?t.x_handle:t.y_handle;if(t.getPadPainter()?._fast_drawing)k=Promise.resolve(!0);else if(t.v6axes){let S=!1,R=!1,E=!1;g.disable_ticks=e<=0,x.disable_ticks=i<=0;let C=g.drawAxis(u,a,n,g.invert_side?void 0:`translate(0,${n})`,e>1?-n:0,R,void 0,!1),q=x.drawAxis(u,a,n,x.invert_side?`translate(${a})`:void 0,i>1?a:0,E,x.invert_side?0:t._frame_x,S);k=Promise.all([C,q]).then(()=>t.drawGrids())}else{let S=[];e>0&&S.push(g.drawAxis(u,s>0?`translate(0,${n})`:"",s)),i>0&&S.push(x.drawAxis(u,r>0?`translate(0,${n})`:`translate(${a},${n})`,r)),k=Promise.all(S).then(()=>(S=[],e>1&&S.push(g.drawAxisOtherPlace(u,s<0?`translate(0,${n})`:"",-s,2==e)),i>1&&S.push(x.drawAxisOtherPlace(u,r<0?`translate(0,${n})`:`translate(${a},${n})`,-r,2==i)),Promise.all(S))).then(()=>t.drawGrids())}return k.then(()=>(t.axes_drawn=!0,!0))})()}drawAxes2(t,e){let a,n,i=this.getFrameWidth(),s=this.getFrameHeight(),r=this.getFrameSvg().select(".axis_layer");return t&&(this.zoom_x2min!=this.zoom_x2max?(this.scale_x2min=this.zoom_x2min,this.scale_x2max=this.zoom_x2max):(this.scale_x2min=this.x2min,this.scale_x2max=this.x2max),this.x2_handle=new m.C(this.getDom(),this,this.x2axis,"x2_"),this.x2_handle.setPadName(this.getPadName()),this.x2_handle.snapid=this.snapid,this.x2_handle.configureAxis("x2axis",this.x2min,this.x2max,this.scale_x2min,this.scale_x2max,!1,[0,i],i,{reverse:!1}),this.x2_handle.assignFrameMembers(this,"x2"),a=this.x2_handle.drawAxis(r,"",-1)),e&&(this.zoom_y2min!=this.zoom_y2max?(this.scale_y2min=this.zoom_y2min,this.scale_y2max=this.zoom_y2max):(this.scale_y2min=this.y2min,this.scale_y2max=this.y2max),this.y2_handle=new m.C(this.getDom(),this,this.y2axis,"y2_"),this.y2_handle.setPadName(this.getPadName()),this.y2_handle.snapid=this.snapid,this.y2_handle.configureAxis("y2axis",this.y2min,this.y2max,this.scale_y2min,this.scale_y2max,!0,[s,0],-s,{reverse:!1}),this.y2_handle.assignFrameMembers(this,"y2"),n=this.y2_handle.drawAxis(r,`translate(${i},${s})`,-1)),Promise.all([a,n])}getGrFuncs(t,e){let i=t&&this.grx2,s=e&&this.gry2;return i||s?{use_x2:i,grx:i?this.grx2:this.grx,x_handle:i?this.x2_handle:this.x_handle,logx:i?this.x2_handle.log:this.x_handle.log,scale_xmin:i?this.scale_x2min:this.scale_xmin,scale_xmax:i?this.scale_x2max:this.scale_xmax,use_y2:s,gry:s?this.gry2:this.gry,y_handle:s?this.y2_handle:this.y_handle,logy:s?this.y2_handle.log:this.y_handle.log,scale_ymin:s?this.scale_y2min:this.scale_ymin,scale_ymax:s?this.scale_y2max:this.scale_ymax,swap_xy:this.swap_xy,fp:this,revertAxis(r,a){return"x"==r&&this.use_x2&&(r="x2"),"y"==r&&this.use_y2&&(r="y2"),this.fp.revertAxis(r,a)},axisAsText(r,a){return"x"==r&&this.use_x2&&(r="x2"),"y"==r&&this.use_y2&&(r="y2"),this.fp.axisAsText(r,a)}}:this}sizeChanged(){let t={};this.v7AttrChange(t,"margins_left",this.fX1NDC),this.v7AttrChange(t,"margins_bottom",this.fY1NDC),this.v7AttrChange(t,"margins_right",1-this.fX2NDC),this.v7AttrChange(t,"margins_top",1-this.fY2NDC),this.v7SendAttrChanges(t,!1),this.redrawPad()}cleanXY(){let t=(e,i)=>{this[e]&&(this[e].cleanup(),delete this[e]),delete this[i]};t("x_handle","grx"),t("y_handle","gry"),t("z_handle","grz"),t("x2_handle","grx2"),t("y2_handle","gry2"),delete this.v6axes}cleanupAxes(){this.cleanXY(),this.draw_g&&(this.draw_g.select(".grid_layer").selectAll("*").remove(),this.draw_g.select(".axis_layer").selectAll("*").remove()),this.axes_drawn=!1}cleanFrameDrawings(){(0,f.isFunc)(this.create3DScene)&&this.create3DScene(-1),this.cleanupAxes();let t=e=>{this[e+"min"]=this[e+"max"]=0,this[`zoom_${e}min`]=this[`zoom_${e}max`]=0,this[`scale_${e}min`]=this[`scale_${e}max`]=0};t("x"),t("y"),t("z"),t("x2"),t("y2"),this.draw_g&&(this.draw_g.select(".main_layer").selectAll("*").remove(),this.draw_g.select(".upper_layer").selectAll("*").remove())}cleanup(){this.cleanFrameDrawings(),this.draw_g&&(this.draw_g.selectAll("*").remove(),this.draw_g.on("mousedown",null).on("dblclick",null).on("wheel",null).on("contextmenu",null).property("interactive_set",null)),this.keys_handler&&(window.removeEventListener("keydown",this.keys_handler,!1),this.keys_handler=null),delete this.enabledKeys,delete this.self_drawaxes,delete this.xaxis,delete this.yaxis,delete this.zaxis,delete this.x2axis,delete this.y2axis,delete this.draw_g,delete this._click_handler,delete this._dblclick_handler;let t=this.getPadPainter();t?.frame_painter_ref===this&&delete t.frame_painter_ref,super.cleanup()}redraw(){let t=this.getPadPainter();t&&(t.frame_painter_ref=this),this.updateAttributes();let g,x,y,e=t?.getPadRect()??{width:10,height:10},i=Math.round(e.width*this.fX1NDC),s=Math.round(e.width*(this.fX2NDC-this.fX1NDC)),r=Math.round(e.height*(1-this.fY2NDC)),a=Math.round(e.height*(this.fY2NDC-this.fY1NDC)),n=!1,u=!1;if(t?.options&&(t.options.RotateFrame&&(n=!0),t.options.FixFrame&&(u=!0)),n?(g=`rotate(-90,${i},${r}) translate(${i-a},${r})`,[s,a]=[a,s]):g=`translate(${i},${r})`,this._frame_x=i,this._frame_y=r,this._frame_width=s,this._frame_height=a,this._frame_rotate=n,this._frame_fixpos=u,this.mode3d)return this;this.draw_g=this.getFrameSvg(),this.draw_g.empty()?(this.draw_g=this.getLayerSvg("primitives_layer").append("svg:g").attr("class","root_frame"),(0,f.isBatchMode)()||this.draw_g.append("svg:title").text(""),x=this.draw_g.append("svg:rect"),this.draw_g.append("svg:g").attr("class","grid_layer"),y=this.draw_g.append("svg:svg").attr("class","main_layer").attr("x",0).attr("y",0).attr("overflow","hidden"),this.draw_g.append("svg:g").attr("class","axis_layer"),this.draw_g.append("svg:g").attr("class","upper_layer")):(x=this.draw_g.select("rect"),y=this.draw_g.select(".main_layer")),this.axes_drawn=!1,this.draw_g.attr("transform",g),x.attr("x",0).attr("y",0).attr("width",s).attr("height",a).attr("rx",this.lineatt.rx||null).attr("ry",this.lineatt.ry||null).call(this.fillatt.func).call(this.lineatt.func),y.attr("width",s).attr("height",a).attr("viewBox",`0 0 ${s} ${a}`);let k=Promise.resolve(!0);return this.v7EvalAttr("drawAxes")&&(this.self_drawaxes=!0,this.setAxesRanges(),k=this.drawAxes().then(()=>this.addInteractivity())),k.then(()=>((0,f.isBatchMode)()||(x.style("pointer-events","visibleFill"),c.J9.assign(this),this.addBasicInteractivity()),this))}getFrameWidth(){return this._frame_width||0}getFrameHeight(){return this._frame_height||0}getFrameRect(){return{x:this._frame_x||0,y:this._frame_y||0,width:this.getFrameWidth(),height:this.getFrameHeight(),transform:this.draw_g?this.draw_g.attr("transform"):"",hint_delta_x:0,hint_delta_y:0}}getHistPalette(){return this.getPadPainter().getHistPalette()}configureUserClickHandler(t){this._click_handler=(0,f.isFunc)(t)?t:null}configureUserDblclickHandler(t){this._dblclick_handler=(0,f.isFunc)(t)?t:null}zoom(t,e,i,s,r,a){var n=this;return(0,F.Z)(function*(){if(n.projection)return!1;"x"===t?(t=e,e=i,i=void 0):"y"===t?(s=i,i=e,t=e=void 0):"z"===t&&(r=e,a=i,t=e=i=void 0);let u=t!==e,g=i!==s,x=r!==a,y=!1,k=!1,S=!1;if(u){let $=0;t<=n.xmin&&(t=n.xmin,$++),e>=n.xmax&&(e=n.xmax,$++),2===$&&(u=!1,y=!0)}else y=t===e&&0===t;if(g){let $=0;i<=n.ymin&&(i=n.ymin,$++),s>=n.ymax&&(s=n.ymax,$++),2===$&&(g=!1,k=!0)}else k=i===s&&0===i;if(x){let $=0;r<=n.zmin&&(r=n.zmin,$++),a>=n.zmax&&(a=n.zmax,$++),2===$&&(x=!1,S=!0)}else S=r===a&&0===r;let R=!1,E="",C="",q="",H=!1,L={_typename:"ROOT::Experimental::RFrame::RUserRanges",values:[0,0,0,0,0,0],flags:[!1,!1,!1,!1,!1,!1]};const Q=($,tt)=>{!tt&&!(0,f.isFunc)($.canZoomInside)||(H=!0,u&&(tt||$.canZoomInside("x",t,e))&&(n.zoom_xmin=t,n.zoom_xmax=e,R=!0,E="0",u=!1,L.values[0]=t,L.values[1]=e,L.flags[0]=L.flags[1]=!0),g&&(tt||$.canZoomInside("y",i,s))&&(n.zoom_ymin=i,n.zoom_ymax=s,R=!0,C="1",g=!1,L.values[2]=i,L.values[3]=s,L.flags[2]=L.flags[3]=!0),x&&(tt||$.canZoomInside("z",r,a))&&(n.zoom_zmin=r,n.zoom_zmax=a,R=!0,q="2",x=!1,L.values[4]=r,L.values[5]=a,L.flags[4]=L.flags[5]=!0))};return(u||g||x)&&n.forEachPainter($=>Q($)),!H&&n.self_drawaxes&&Q(null,!0),(y||k||S)&&(y&&(n.zoom_xmin!==n.zoom_xmax&&(R=!0,E="0"),n.zoom_xmin=n.zoom_xmax=0,L.values[0]=L.values[1]=-1),k&&(n.zoom_ymin!==n.zoom_ymax&&(R=!0,C="1"),n.zoom_ymin=n.zoom_ymax=0,L.values[2]=L.values[3]=-1),S&&(n.zoom_zmin!==n.zoom_zmax&&(R=!0,q="2"),n.zoom_zmin=n.zoom_zmax=0,L.values[4]=L.values[5]=-1)),!!R&&(n.v7NormalMode()&&n.v7SubmitRequest("zoom",{_typename:"ROOT::Experimental::RFrame::RZoomRequest",ranges:L}),n.interactiveRedraw("pad","zoom"+E+C+q).then(()=>!0))})()}zoomSingle(t,e,i){var s=this;return(0,F.Z)(function*(){let a=["x","y","z","x2","y2"].indexOf(t);if(s.projection||!s[t+"_handle"]||a<0)return!1;let n=e!==i,u=!1;if(n){let S=0;e<=s[t+"min"]&&(e=s[t+"min"],S++),i>=s[t+"max"]&&(i=s[t+"max"],S++),2===S&&(n=!1,u=!0)}else u=e===i&&0===e;let g=!1,x=!1,y={_typename:"ROOT::Experimental::RFrame::RUserRanges",values:[0,0,0,0,0,0,0,0,0,0],flags:[!1,!1,!1,!1,!1,!1,!1,!1,!1,!1]},k=(S,R)=>{!R&&!(0,f.isFunc)(S?.canZoomInside)||(x=!0,n&&(R||S.canZoomInside(t[0],e,i))&&(s["zoom_"+t+"min"]=e,s["zoom_"+t+"max"]=i,g=!0,n=!1,y.values[2*a]=e,y.values[2*a+1]=i,y.flags[2*a]=y.flags[2*a+1]=!0))};return n&&s.forEachPainter(S=>k(S)),!x&&s.self_drawaxes&&k(null,!0),u&&(s[`zoom_${t}min`]!==s[`zoom_${t}max`]&&(g=!0),s[`zoom_${t}min`]=s[`zoom_${t}max`]=0,y.values[2*a]=y.values[2*a+1]=-1),!!g&&(s.v7NormalMode()&&s.v7SubmitRequest("zoom",{_typename:"ROOT::Experimental::RFrame::RZoomRequest",ranges:y}),s.interactiveRedraw("pad","zoom"+a).then(()=>!0))})()}isAxisZoomed(t){return this["zoom_"+t+"min"]!==this["zoom_"+t+"max"]}unzoom(t,e,i){var s=this;return(0,F.Z)(function*(){return"all"==t?s.unzoom("x2").then(()=>s.unzoom("y2")).then(()=>s.unzoom("xyz")):"x2"==t||"y2"==t?s.zoomSingle(t,0,0).then(r=>(r&&s.zoomChangedInteractive(t,"unzoom"),r)):(typeof t>"u"?t=e=i=!0:(0,f.isStr)(t)&&(i=t.indexOf("z")>=0,e=t.indexOf("y")>=0,t=t.indexOf("x")>=0),s.zoom(t?0:void 0,t?0:void 0,e?0:void 0,e?0:void 0,i?0:void 0,i?0:void 0).then(r=>(r&&t&&s.zoomChangedInteractive("x","unzoom"),r&&e&&s.zoomChangedInteractive("y","unzoom"),r&&i&&s.zoomChangedInteractive("z","unzoom"),r)))})()}zoomChangedInteractive(t,e){if("reset"==t)return void(this.zoom_changed_x=this.zoom_changed_y=this.zoom_changed_z=void 0);if(!t||"any"==t)return this.zoom_changed_x||this.zoom_changed_y||this.zoom_changed_z;if("x"!==t&&"y"!==t&&"z"!==t)return;let i="zoom_changed_"+t;if(void 0===e)return this[i];"unzoom"!==e?e&&(this[i]=!0):this[i]=void 0===this[i]}fillObjectOfflineMenu(t,e){"x"!=e&&"y"!=e||t.add("Unzoom",()=>this.unzoom(e))}changeFrameAttr(t,e){let i={};this.v7AttrChange(i,t,e),this.v7SetAttr(t,e),this.v7SendAttrChanges(i,!1),this.redrawPad()}fillContextMenu(t,e){if("x"==e||"y"==e||"x2"==e||"y2"==e){let s=this[e+"_handle"];return!!s&&(t.add("header: "+e.toUpperCase()+" axis"),s.fillAxisContextMenu(t,e))}let i=0==t.size();return t.add(i?"header:Frame":"separator"),this.zoom_xmin!==this.zoom_xmax&&t.add("Unzoom X",()=>this.unzoom("x")),this.zoom_ymin!==this.zoom_ymax&&t.add("Unzoom Y",()=>this.unzoom("y")),this.zoom_zmin!==this.zoom_zmax&&t.add("Unzoom Z",()=>this.unzoom("z")),this.zoom_x2min!==this.zoom_x2max&&t.add("Unzoom X2",()=>this.unzoom("x2")),this.zoom_y2min!==this.zoom_y2max&&t.add("Unzoom Y2",()=>this.unzoom("y2")),t.add("Unzoom all",()=>this.unzoom("all")),t.add("separator"),t.addchk(this.isTooltipAllowed(),"Show tooltips",()=>this.setTooltipAllowed("toggle")),this.x_handle&&t.addchk(this.x_handle.draw_grid,"Grid x",s=>this.changeFrameAttr("gridX",s)),this.y_handle&&t.addchk(this.y_handle.draw_grid,"Grid y",s=>this.changeFrameAttr("gridY",s)),this.x_handle&&!this.x2_handle&&t.addchk(this.x_handle.draw_swapside,"Swap x",s=>this.changeFrameAttr("swapX",s)),this.y_handle&&!this.y2_handle&&t.addchk(this.y_handle.draw_swapside,"Swap y",s=>this.changeFrameAttr("swapY",s)),this.x_handle&&!this.x2_handle&&(t.add("sub:Ticks x"),t.addchk(0==this.x_handle.draw_ticks,"off",()=>this.changeFrameAttr("ticksX",0)),t.addchk(1==this.x_handle.draw_ticks,"normal",()=>this.changeFrameAttr("ticksX",1)),t.addchk(2==this.x_handle.draw_ticks,"ticks on both sides",()=>this.changeFrameAttr("ticksX",2)),t.addchk(3==this.x_handle.draw_ticks,"labels on both sides",()=>this.changeFrameAttr("ticksX",3)),t.add("endsub:")),this.y_handle&&!this.y2_handle&&(t.add("sub:Ticks y"),t.addchk(0==this.y_handle.draw_ticks,"off",()=>this.changeFrameAttr("ticksY",0)),t.addchk(1==this.y_handle.draw_ticks,"normal",()=>this.changeFrameAttr("ticksY",1)),t.addchk(2==this.y_handle.draw_ticks,"ticks on both sides",()=>this.changeFrameAttr("ticksY",2)),t.addchk(3==this.y_handle.draw_ticks,"labels on both sides",()=>this.changeFrameAttr("ticksY",3)),t.add("endsub:")),t.addAttributesMenu(this,i?"":"Frame "),t.add("separator"),t.add("Save as frame.png",()=>this.getPadPainter().saveAs("png","frame","frame.png")),t.add("Save as frame.svg",()=>this.getPadPainter().saveAs("svg","frame","frame.svg")),!0}revertAxis(t,e){let i=this[t+"_handle"];return i?i.revertPoint(e):0}showAxisStatus(t,e){let s=t,a=(0,W.cx)(e,this.getFrameSvg().node()),n="x"==t?0:1;this.swap_xy&&(n=1-n);let u=this.revertAxis(t,a[n]);this.showObjectStatus(s,"axis",t+" : "+this.axisAsText(t,u),Math.round(a[0])+","+Math.round(a[1]))}addKeysHandler(){(0,f.isBatchMode)()||(c.J9.assign(this),this.addFrameKeysHandler())}addInteractivity(t){return!(!(0,f.isBatchMode)()&&(f.settings.Zooming||f.settings.ContextMenu))||(c.J9.assign(this),this.addFrameInteractivity(t))}setRootPadRange(){}toggleAxisLog(t){let e=this[t+"_handle"];e&&e.changeAxisLog("toggle")}}var l=T(263),d=T(5611),p=T(7428),v=T(9822);class w extends V.p{constructor(t,e,i){super(t,e,"","pad"),this.pad=e,this.iscan=i,this.this_pad_name="",!this.iscan&&null!==e&&(this.this_pad_name=e.fObjectID?"pad"+e.fObjectID:"ppp"+f.internals.id_counter++),this.painters=[],this.has_canvas=!0,this.forEachPainter=this.forEachPainterInPad}isRoot6(){return!1}svg_this_pad(){return this.getPadSvg(this.this_pad_name)}getMainPainter(){return this.main_painter_ref||null}setMainPainter(t,e){(!this.main_painter_ref||e)&&(this.main_painter_ref=t)}cleanup(){this._doing_draw&&console.error("pad drawing is not completed when cleanup is called"),this.painters.forEach(e=>e.cleanup());let t=this.svg_this_pad();t.empty()||(t.property("pad_painter",null),this.iscan||t.remove()),delete this.main_painter_ref,delete this.frame_painter_ref,delete this.pads_cache,delete this._pad_x,delete this._pad_y,delete this._pad_width,delete this._pad_height,delete this._doing_draw,delete this._dfltRFont,this.painters=[],this.pad=null,this.draw_object=null,this.pad_frame=null,this.this_pad_name=void 0,this.has_canvas=!1,(0,Z.O5)({pp:this,active:!1}),super.cleanup()}getFramePainter(){return this.frame_painter_ref}getPadWidth(){return this._pad_width||0}getPadHeight(){return this._pad_height||0}getPadRect(){return{x:this._pad_x||0,y:this._pad_y||0,width:this.getPadWidth(),height:this.getPadHeight()}}getFrameRect(){let t=this.getFramePainter();if(t)return t.getFrameRect();let e=this.getPadWidth(),i=this.getPadHeight(),s={};return s.szx=Math.round(.5*e),s.szy=Math.round(.5*i),s.width=2*s.szx,s.height=2*s.szy,s.x=Math.round(e/2-s.szx),s.y=Math.round(i/2-s.szy),s.hint_delta_x=s.szx,s.hint_delta_y=s.szy,s.transform=`translate(${s.x},${s.y})`,s}getRootPad(t){return void 0!==t&&t?null:this.pad}cleanPrimitives(t){if((0,f.isFunc)(t))for(let e=this.painters.length-1;e>=0;--e)t(this.painters[e])&&(this.painters[e].cleanup(),this.painters.splice(e,1))}findPainterFor(t,e,i){return this.painters.find(s=>{let r=s.getObject();if(r){if(t&&r===t)return!0;if((e||i)&&(!e||r.fName===e)&&(!i||r._typename===i))return!0}})}getHistPalette(){let t=this.findPainterFor(void 0,void 0,"ROOT::Experimental::RPaletteDrawable");return t?t.getHistPalette():(this.fDfltPalette||(this.fDfltPalette={_typename:"ROOT::Experimental::RPalette",fColors:[{fOrdinal:0,fColor:{fColor:"rgb(53, 42, 135)"}},{fOrdinal:.125,fColor:{fColor:"rgb(15, 92, 221)"}},{fOrdinal:.25,fColor:{fColor:"rgb(20, 129, 214)"}},{fOrdinal:.375,fColor:{fColor:"rgb(6, 164, 202)"}},{fOrdinal:.5,fColor:{fColor:"rgb(46, 183, 164)"}},{fOrdinal:.625,fColor:{fColor:"rgb(135, 191, 119)"}},{fOrdinal:.75,fColor:{fColor:"rgb(209, 187, 89)"}},{fOrdinal:.875,fColor:{fColor:"rgb(254, 200, 50)"}},{fOrdinal:1,fColor:{fColor:"rgb(249, 251, 14)"}}],fInterpolate:!0,fNormalized:!0},(0,f.addMethods)(this.fDfltPalette,"ROOT::Experimental::RPalette")),this.fDfltPalette)}getNumPainters(){return this.painters.length}forEachPainterInPad(t,e){e||(e="all"),"objects"!=e&&t(this);for(let i=0;i0){if(this._fixed_size)return t>1;if(s=this.getCanvSvg(),s.empty()||(i=s.property("height_factor"),a=this.testMainResize(t,null,i),!a.changed))return!1;(0,f.isBatchMode)()||(n=this.getLayerSvg("btns_layer",this.this_pad_name)),u=s.select(".canvas_fillrect")}else{let g=this.selectDom();"static"==g.style("position")&&g.style("position","relative"),s=g.append("svg").attr("class","jsroot root_canvas").property("pad_painter",this).property("current_pad","").property("redraw_by_resize",!1),this.setTopPainter(),!(0,f.isBatchMode)()&&!this.online_canvas&&s.append("svg:title").text("ROOT canvas"),u=s.append("svg:path").attr("class","canvas_fillrect"),(0,f.isBatchMode)()||u.style("pointer-events","visibleFill").on("dblclick",x=>this.enlargePad(x)).on("click",()=>this.selectObjectPainter(this,null)).on("mouseenter",()=>this.showObjectStatus()).on("contextmenu",f.settings.ContextMenu?x=>this.padContextMenu(x):null),s.append("svg:g").attr("class","primitives_layer"),s.append("svg:g").attr("class","info_layer"),(0,f.isBatchMode)()||(n=s.append("svg:g").attr("class","btns_layer").property("leftside","left"==f.settings.ToolBarSide).property("vertical",f.settings.ToolBarVert)),i=.66,this.pad&&this.pad.fWinSize[0]&&this.pad.fWinSize[1]&&(i=this.pad.fWinSize[1]/this.pad.fWinSize[0],(i<.1||i>10)&&(i=.66)),this._fixed_size?(g.style("overflow","auto"),a={width:this.pad.fWinSize[0],height:this.pad.fWinSize[1]},(!a.width||!a.height)&&(a=(0,d.Yo)(g))):a=this.testMainResize(2,e,i)}return this.createAttFill({pattern:1001,color:0}),a.width<=5||a.height<=5?(s.style("display","none"),console.warn(`Hide canvas while geometry too small w=${a.width} h=${a.height}`),a.width=200,a.height=100):s.style("display",null),this._fixed_size?s.attr("x",0).attr("y",0).attr("width",a.width).attr("height",a.height).style("position","absolute"):s.attr("x",0).attr("y",0).style("width","100%").style("height","100%").style("position","absolute").style("left",0).style("top",0).style("right",0).style("bottom",0),s.style("filter",f.settings.DarkMode?"invert(100%)":null),s.attr("viewBox",`0 0 ${a.width} ${a.height}`).attr("preserveAspectRatio","none").property("height_factor",i).property("draw_x",0).property("draw_y",0).property("draw_width",a.width).property("draw_height",a.height),this._pad_x=0,this._pad_y=0,this._pad_width=a.width,this._pad_height=a.height,u.attr("d",`M0,0H${a.width}V${a.height}H0Z`).call(this.fillatt.func),this._fast_drawing=f.settings.SmallPad&&(a.width{E.getObject()==a&&(n=!0)},"pads"),n&&(u=s,g=r,x=y=0)),t?(k=this.svg_this_pad(),S=k.select(".root_pad_border"),(0,f.isBatchMode)()||(R=this.getLayerSvg("btns_layer",this.this_pad_name))):(k=e.select(".primitives_layer").append("svg:svg").classed("__root_pad_"+this.this_pad_name,!0).attr("pad",this.this_pad_name).property("pad_painter",this),(0,f.isBatchMode)()||k.append("svg:title").text("ROOT subpad"),S=k.append("svg:path").attr("class","root_pad_border"),k.append("svg:g").attr("class","primitives_layer"),(0,f.isBatchMode)()||(R=k.append("svg:g").attr("class","btns_layer").property("leftside","left"!=f.settings.ToolBarSide).property("vertical",f.settings.ToolBarVert)),f.settings.ContextMenu&&S.on("contextmenu",E=>this.padContextMenu(E)),(0,f.isBatchMode)()||S.style("pointer-events","visibleFill").on("dblclick",E=>this.enlargePad(E)).on("click",()=>this.selectObjectPainter(this,null)).on("mouseenter",()=>this.showObjectStatus())),this.createAttFill({attr:this.pad}),this.createAttLine({attr:this.pad,color0:0==this.pad.fBorderMode?"none":""}),k.style("display",n?null:"none").attr("viewBox",`0 0 ${u} ${g}`).attr("preserveAspectRatio","none").attr("x",x).attr("y",y).attr("width",u).attr("height",g).property("draw_x",x).property("draw_y",y).property("draw_width",u).property("draw_height",g),this._pad_x=x,this._pad_y=y,this._pad_width=u,this._pad_height=g,S.attr("d",`M0,0H${u}V${g}H0Z`).call(this.fillatt.func).call(this.lineatt.func),this._fast_drawing=f.settings.SmallPad&&(u"ROOT::Experimental::RPadDisplayItem"!=e._typename))}syncDraw(t){let e={kind:t||"redraw"};return void 0===this._doing_draw?(this._doing_draw=[e],Promise.resolve(!0)):!(!0!==e.kind&&this._doing_draw.findIndex((i,s)=>s>0&&i.kind==e.kind)>0)&&(this._doing_draw.push(e),new Promise(i=>{e.func=i}))}confirmDraw(){if(void 0===this._doing_draw)return console.warn("failure, should not happen");if(this._doing_draw.shift(),0==this._doing_draw.length)delete this._doing_draw;else{let t=this._doing_draw[0];t.func&&(t.func(),delete t.func)}}drawObject(){return(0,F.Z)(function*(){return console.log("Not possible to draw object without loading of draw.mjs"),null})()}drawPrimitives(t){var e=this;return(0,F.Z)(function*(){if(void 0===t)return e.iscan&&(e._start_tm=(new Date).getTime()),e._num_primitives=e.pad&&e.pad.fPrimitives?e.pad.fPrimitives.length:0,e.syncDraw(!0).then(()=>e.drawPrimitives(0));if(e.pad&&!(t>=e._num_primitives))return e.drawObject(e.getDom(),e.pad.fPrimitives[t],"").then(i=>((0,f.isObject)(i)&&(i._primitive=!0),e.drawPrimitives(t+1)));if(e.confirmDraw(),e._start_tm){let i=(new Date).getTime()-e._start_tm;i>3e3&&console.log(`Canvas drawing took ${(.001*i).toFixed(2)}s`),delete e._start_tm}})()}processPadTooltipEvent(t){let e=[],i=[];return null!==this.painters&&this.painters.forEach(s=>{(0,f.isFunc)(s.processTooltipEvent)&&e.push(s)}),t&&(t.nproc=e.length),e.forEach(s=>{let r=s.processTooltipEvent(t);r||(r={user_info:null}),i.push(r),t&&t.painters&&(r.painter=s)}),i}changeDarkMode(t){this.getCanvSvg().style("filter",t??f.settings.DarkMode?"invert(100%)":null)}fillContextMenu(t){t.add(this.iscan?"header: RCanvas":"header: RPad"),t.addchk(this.isTooltipAllowed(),"Show tooltips",()=>this.setTooltipAllowed("toggle")),this._websocket||(t.addAttributesMenu(this),this.iscan&&t.addSettingsMenu(!1,!1,i=>{"dark"==i&&this.changeDarkMode()})),t.add("separator"),(0,f.isFunc)(this.hasMenuBar)&&(0,f.isFunc)(this.actiavteMenuBar)&&t.addchk(this.hasMenuBar(),"Menu bar",i=>this.actiavteMenuBar(i)),(0,f.isFunc)(this.hasEventStatus)&&(0,f.isFunc)(this.activateStatusBar)&&t.addchk(this.hasEventStatus(),"Event status",()=>this.activateStatusBar("toggle")),(this.enlargeMain()||this.has_canvas&&this.hasObjectsToDraw())&&t.addchk("on"==this.enlargeMain("state"),"Enlarge "+(this.iscan?"canvas":"pad"),()=>this.enlargePad());let e=this.this_pad_name||(this.iscan?"canvas":"pad");return t.add(`Save as ${e}.png`,e+".png",i=>this.saveAs("png",!1,i)),t.add(`Save as ${e}.svg`,e+".svg",i=>this.saveAs("svg",!1,i)),!0}padContextMenu(t){if(t.stopPropagation){let e=(0,W.cx)(t,this.svg_this_pad().node());if(2==e.length&&e[0]>=0&&e[0]<10&&e[1]>=0&&e[1]<10)return;t.stopPropagation(),t.preventDefault(),this.getFramePainter()?.setLastEventPos()}(0,p.Z)(t,this).then(e=>(this.fillContextMenu(e),this.fillObjectExecMenu(e))).then(e=>e.show())}redrawPad(t){var e=this;return(0,F.Z)(function*(){let i=e.syncDraw(t);if(!1===i)return console.log("Prevent RPad redrawing"),!1;let s=!0,r=a=>{for(;ar(a))}return!0};return i.then(()=>(e.iscan?e.createCanvasSvg(2):s=e.createPadSvg(!0),r(0))).then(()=>((0,Z.X8)()===e&&e.getCanvPainter()?.producePadEvent("padredraw",e),e.confirmDraw(),!0))})()}redraw(t){return this.redrawPad(t)}needRedrawByResize(){let t=this.svg_this_pad();if(!t.empty()&&t.property("can3d")===f.constants.Embed3D.Overlay)return!0;for(let e=0;e!s||a>=this.painters.length?(this.confirmDraw(),s):(0,f.getPromise)(this.painters[a].redraw(e?"redraw":"resize")).then(()=>r(a+1));return i.then(()=>(s=this.createCanvasSvg(e?2:1,t),r(0)))}updateObject(t){return!!t&&(this.pad.fStyle=t.fStyle,this.pad.fAttr=t.fAttr,this.iscan?(this.pad.fTitle=t.fTitle,this.pad.fWinSize=t.fWinSize):(this.pad.fPos=t.fPos,this.pad.fSize=t.fSize),!0)}addObjectPainter(t,e,i){t&&e&&e[i]&&void 0===t.snapid&&(this.painters.indexOf(t)<0&&this.painters.push(t),t.assignSnapId(e[i].fObjectID),t.rstyle||(t.rstyle=e[i].fStyle||this.rstyle))}extractTObjectProp(t){if(t.fColIndex&&t.fColValue){let r=this.root_colors||(0,l._V)();for(let a=0;a{let n=e.v7EvalColor(a,"");n&&(i[r]=(0,l.hI)(n,this.root_colors))};void 0!==i.fLineColor&&void 0!==i.fLineWidth&&void 0!==i.fLineStyle&&(s("fLineColor","line_color"),i.fLineWidth=e.v7EvalAttr("line_width",i.fLineWidth),i.fLineStyle=e.v7EvalAttr("line_style",i.fLineStyle)),void 0!==i.fFillColor&&void 0!==i.fFillStyle&&(s("fFillColor","fill_color"),i.fFillStyle=e.v7EvalAttr("fill_style",i.fFillStyle)),void 0!==i.fMarkerColor&&void 0!==i.fMarkerStyle&&void 0!==i.fMarkerSize&&(s("fMarkerColor","marker_color"),i.fMarkerStyle=e.v7EvalAttr("marker_style",i.fMarkerStyle),i.fMarkerSize=e.v7EvalAttr("marker_size",i.fMarkerSize)),void 0!==i.fTextColor&&void 0!==i.fTextAlign&&void 0!==i.fTextAngle&&void 0!==i.fTextSize&&(s("fTextColor","text_color"),i.fTextAlign=e.v7EvalAttr("text_align",i.fTextAlign),i.fTextAngle=e.v7EvalAttr("text_angle",i.fTextAngle),i.fTextSize=e.v7EvalAttr("text_size",i.fTextSize))}drawNextSnap(t,e){var i=this;return(0,F.Z)(function*(){if(void 0===e&&(e=-1,i._snaps_map={},i._num_primitives=t?t.length:0,i._auto_color_cnt=0),delete i.next_rstyle,++e,!t||e>=t.length)return delete i._snaps_map,delete i._auto_color_cnt,i;let s=t[e],r=s.fObjectID,a=i._snaps_map[r],n=null;if(a?a++:a=1,i._snaps_map[r]=a,s.fDummy)return i.drawNextSnap(t,e);for(let u=0;u(i.addObjectPainter(g,t,e),i.drawNextSnap(t,e)));let u;return"ROOT::Experimental::TObjectDisplayItem"===s._typename&&i.extractTObjectProp(s),n.updateObject(s.fDrawable||s.fObject||s,s.fOption||"",!0)&&(u=n.redraw()),(0,f.getPromise)(u).then(()=>i.drawNextSnap(t,e))}if("ROOT::Experimental::RPadDisplayItem"==s._typename){let u=s,g=new w(i.getDom(),u,!1);g.decodeOptions(""),g.addToPadPrimitives(i.this_pad_name),g.assignSnapId(s.fObjectID),g.rstyle=s.fStyle,g.createPadSvg(),s.fPrimitives&&s.fPrimitives.length>0&&g.addPadButtons();let x=g.selectCurrentPad(g.this_pad_name);return g.drawNextSnap(s.fPrimitives).then(()=>(g.selectCurrentPad(x),i.drawNextSnap(t,e)))}if(i.next_rstyle=t[e].fStyle||i.rstyle,"ROOT::Experimental::TObjectDisplayItem"===s._typename){const u={kNone:0,kObject:1,kColors:4,kStyle:5,kPalette:6};if(s.fKind==u.kStyle)return Object.assign(f.gStyle,s.fObject),i.drawNextSnap(t,e);if(s.fKind==u.kColors){let g=[],x=s.fObject.arr;for(let y=0;y0&&(g[parseInt(k.slice(0,S))]=k.slice(S+1))}return i.root_colors=g,i.drawNextSnap(t,e)}if(s.fKind==u.kPalette){let g=s.fObject.arr,x=[];for(let y=0;yi.drawNextSnap(t,e-1));i.extractTObjectProp(s)}return i.drawObject(i.getDom(),s.fDrawable||s.fObject||s,s.fOption||"").then(u=>(i.addObjectPainter(u,t,e),i.drawNextSnap(t,e)))})()}findSnap(t,e){function i(s){return!(!s||!(0,f.isStr)(s))&&(s==t||e&&s.length>t.length&&s.indexOf(t)==s.length-t.length)}if(i(this.snapid))return this;if(!this.painters)return null;for(let s=0;s{n&&u.fObjectID===n.snapid&&(n=null,i=!0)}),n&&(e.painters.splice(a--,1),n.cleanup(),s=!0,e.main_painter_ref===n&&delete e.main_painter_ref))}if(s&&delete e.pads_cache,!i){let a=e.getFramePainter();a?.is_root6()&&(a=null);for(let n=0;n(e.selectCurrentPad(r),(0,Z.X8)()===e&&e.getCanvPainter()?.producePadEvent("padredraw",e),e))})()}createImage(t){var e=this;return(0,F.Z)(function*(){return"pdf"==t?(0,f.btoa_func)("dummy PDF file"):"png"==t||"jpeg"==t||"svg"==t?e.produceImage(!0,t).then(i=>{if(!i||"svg"==t)return i;let s=i.indexOf("base64,");return s>0?i.slice(s+7):""}):""})()}itemContextMenu(t){let e=this.svg_this_pad().node().getBoundingClientRect(),i={clientX:e.left+10,clientY:e.top+10};if("pad"==t)return setTimeout(()=>this.padContextMenu(i),50);let r,s=null;switch(t){case"xaxis":case"yaxis":case"zaxis":s=this.getMainPainter(),r=t[0];break;case"frame":s=this.getFramePainter();break;default:{let a=parseInt(t);Number.isInteger(a)&&(s=this.painters[a])}}(0,f.isFunc)(s?.fillContextMenu)&&(0,p.Z)(i,s).then(a=>{s.fillContextMenu(a,r)&&s.fillObjectExecMenu(a,r).then(()=>setTimeout(()=>a.show(),50))})}saveAs(t,e,i){i||(i=(this.this_pad_name||(this.iscan?"canvas":"pad"))+"."+t),this.produceImage(e,t).then(s=>{if(!s)return console.error(`Fail to produce image ${i}`);(0,B.yH)(i,"svg"!=t?s:"data:image/svg+xml;charset=utf-8,"+encodeURIComponent(s))})}findActivePad(){return null}produceImage(t,e){var i=this;return(0,F.Z)(function*(){let s="frame"===t,r=s?i.getFrameSvg(i.this_pad_name):t?i.getCanvSvg():i.svg_this_pad(),a=t&&!s?i.getCanvPainter():i,n=[];if(r.empty())return"";s||a.forEachPainterInPad(E=>{let C={prnt:E.svg_this_pad()};n.push(C);let q=E.getLayerSvg("btns_layer",i.this_pad_name);C.btns_node=q.node(),C.btns_node&&(C.btns_prnt=C.btns_node.parentNode,C.btns_next=C.btns_node.nextSibling,q.remove());let H=E.getFramePainter();if(!H||!(0,f.isFunc)(H.render3D)||!(0,f.isFunc)(H.access3dKind))return;let L=H.access3dKind();if(L!==f.constants.Embed3D.Overlay&&L!==f.constants.Embed3D.Embed)return;let Q=H.getSizeFor3d(f.constants.Embed3D.Embed),$=H.renderer.domElement;H.render3D(0);let tt=$.toDataURL("image/png");L===f.constants.Embed3D.Embed&&(C.foreign=C.prnt.select("."+Q.clname),C.foreign.remove());let it=H.getFrameSvg();C.frame_node=it.node(),C.frame_node&&(C.frame_next=C.frame_node.nextSibling,it.remove()),C.img=C.prnt.insert("image",".primitives_layer").attr("x",Q.x).attr("y",Q.y).attr("width",$.width).attr("height",$.height).attr("href",tt)},"pads");const g=()=>{for(let E=0;E${r.node().innerHTML}`;if(f.internals.processSvgWorkarounds&&(k=f.internals.processSvgWorkarounds(k)),k=(0,d.ln)(k),"svg"==e)return g(),k;let R=new Image;return new Promise(E=>{R.onload=function(){let C=document.createElement("canvas");C.width=R.width,C.height=R.height,C.getContext("2d").drawImage(R,0,0),g(),E(C.toDataURL("image/"+e))},R.onerror=function(C){console.log(`IMAGE ERROR ${C}`),g(),E(null)},R.src="data:image/svg+xml;base64,"+(0,f.btoa_func)((E=>(E=(E=encodeURIComponent(E)).replace(/%([0-9A-F]{2})/g,function(C,q){let H=String.fromCharCode("0x"+q);return"%"===H?"%25":H}),decodeURIComponent(E)))(''+k))})})()}clickPadButton(t,e){if("CanvasSnapShot"==t)return this.saveAs("png",!0);if("enlargePad"==t)return this.enlargePad();if("PadSnapShot"==t)return this.saveAs("png",!1);if("PadContextMenus"==t){if(e&&(e.preventDefault(),e.stopPropagation()),(0,p.W)())return;return void(0,p.Z)(e,this).then(s=>{s.add("header:Menus"),s.add(this.iscan?"Canvas":"Pad","pad",this.itemContextMenu),this.getFramePainter()&&s.add("Frame","frame",this.itemContextMenu);let r=this.getMainPainter();if(r&&(s.add("X axis","xaxis",this.itemContextMenu),s.add("Y axis","yaxis",this.itemContextMenu),(0,f.isFunc)(r.getDimension)&&r.getDimension()>1&&s.add("Z axis","zaxis",this.itemContextMenu)),this.painters?.length){s.add("separator");let a=[];for(let n=0;n=0)continue;let g=u._typename?u._typename+"::":"";u.fName&&(g+=u.fName),g||(g="item"+n),s.add(g,n,this.itemContextMenu)}}s.show()})}let i=!1;for(let s=0;sy(r||(r=i?i.getFrameRect():this.getPadRect()),r);if(i){let y=n(2),k=t?"gry":"grx";void 0!==y&&i[k]&&(a=i[k](y))}void 0===a&&(a=t?u().height:0);let g=n(0,0);return a+=s*n(1,0),g&&(a+=s*(t?u().height:u().width)*g),Math.round(a)}getCoordinate(t,e){return{x:this.getPadLength(!1,t.fHoriz,e),y:this.getPadLength(!0,t.fVert,e)}}decodeOptions(t){let e=this.getObject();if(!e)return;let i=new d.pc(t);this.options||(this.options={}),Object.assign(this.options,{GlobalColors:!0,LocalColors:!1,IgnorePalette:!1,RotateFrame:!1,FixFrame:!1}),(i.check("NOCOLORS")||i.check("NOCOL"))&&(this.options.GlobalColors=this.options.LocalColors=!1),(i.check("LCOLORS")||i.check("LCOL"))&&(this.options.GlobalColors=!1,this.options.LocalColors=!0),(i.check("NOPALETTE")||i.check("NOPAL"))&&(this.options.IgnorePalette=!0),i.check("ROTATE")&&(this.options.RotateFrame=!0),i.check("FIXFRAME")&&(this.options.FixFrame=!0),i.check("WHITE")&&(e.fFillColor=0),i.check("LOGX")&&(e.fLogx=1),i.check("LOGY")&&(e.fLogy=1),i.check("LOGZ")&&(e.fLogz=1),i.check("LOG")&&(e.fLogx=e.fLogy=e.fLogz=1),i.check("GRIDX")&&(e.fGridx=1),i.check("GRIDY")&&(e.fGridy=1),i.check("GRID")&&(e.fGridx=e.fGridy=1),i.check("TICKX")&&(e.fTickx=1),i.check("TICKY")&&(e.fTicky=1),i.check("TICK")&&(e.fTickx=e.fTicky=1)}static draw(t,e,i){return(0,F.Z)(function*(){let s=new w(t,e,!1);s.decodeOptions(i),s.getCanvSvg().empty()?(s.has_canvas=!1,s.this_pad_name="",s.setTopPainter()):s.addToPadPrimitives(s.pad_name),s.createPadSvg(),s.matchObjectType(f.clTPad)&&(!s.has_canvas||s.hasObjectsToDraw())&&s.addPadButtons();let r=s.has_canvas?s.selectCurrentPad(s.this_pad_name):void 0;return(0,Z.O5)({pp:s,active:!1}),s.drawPrimitives().then(()=>(s.showPadButtons(),s.selectCurrentPad(r),s))})()}}class M{constructor(t,e,i){this.path=t,this.connid=null,this.req=null,this.raw=e,this.args=i,this.nextRequest("","connect")}nextRequest(t,e){let i=this.path,s="buf",r=null;if("connect"===e)i+=this.raw?"?raw_connect":"?txt_connect",this.args&&(i+="&"+this.args),console.log(`longpoll connect ${i} raw = ${this.raw}`),this.connid="connect";else if("close"===e){if(null===this.connid||"close"===this.connid)return;i+=`?connection=${this.connid}&close`,this.connid="close",s="text;sync"}else{if(null===this.connid||"number"!=typeof this.connid)return void(f.browser.qt5||console.error("No connection"));i+="?connection="+this.connid,"dummy"===e&&(i+="&dummy")}t&&(this.raw?i+="&post="+(0,f.btoa_func)(t):(s="postbuf",r=t)),(0,f.createHttpRequest)(i,s,function(a){if(this.handle.req===this&&(this.handle.req=null),null===a)return this.handle.processRequest(null);if(this.handle.raw){let n="",u=0,g=new Uint8Array(a),x=g.length;if(x<4)return f.browser.qt5||console.error(`longpoll got short message in raw mode ${x}`),this.handle.processRequest(null);for(;u<4;)n+=String.fromCharCode(g[u++]);if("txt:"!=n){for(n="";u>"==n?-1111:n),x>"==a?-1111:a)}},function(){this.handle.processRequest(null,"error")},!0).then(a=>{a.handle=this,this.req||(this.req=a),a.send(r)})}processRequest(t,e){if(null===t)return(0,f.isFunc)(this.onerror)&&this.onerror("receive data with connid "+(this.connid||"---")),"error"==e&&(0,f.isFunc)(this.onclose)&&this.onclose("force_close"),void(this.connid=null);-1111===t&&(t="");let i=5;if("connect"===this.connid){if(!t)return this.connid=null,void((0,f.isFunc)(this.onerror)&&this.onerror("connection rejected"));this.connid=parseInt(t),i=100,console.log(`Get new longpoll connection with id ${this.connid}`),(0,f.isFunc)(this.onopen)&&this.onopen()}else{if("close"===this.connid)return void((0,f.isFunc)(this.onclose)&&this.onclose());(0,f.isFunc)(this.onmessage)&&t&&this.onmessage({data:t,offset:e})}this.req||setTimeout(()=>{this.req||this.nextRequest("","dummy")},i)}send(t){this.nextRequest(t)}close(){this.nextRequest("","close")}}class D{constructor(t){this.receiver=t,this.protocol=[],this.cnt=0,(0,f.httpRequest)("protocol.json","text").then(e=>this.getProtocol(e))}getProtocol(t){t&&(this.protocol=JSON.parse(t),(0,f.isFunc)(this.onopen)&&this.onopen(),this.nextOperation())}send(){"send"==this.protocol[this.cnt]&&(this.cnt++,setTimeout(()=>this.nextOperation(),10))}close(){}nextOperation(){if(this.wait_for_file)return;let t=this.protocol[this.cnt];t&&"send"!=t&&(this.wait_for_file=!0,this.cnt++,(0,f.httpRequest)(t,t.indexOf(".bin")>0?"buf":"text").then(e=>{this.wait_for_file=!1,e&&(this.receiver.provideData&&this.receiver.provideData(1,e,0),setTimeout(()=>this.nextOperation(),10))}))}}class z{constructor(t,e){this.kind=t,this.state=0,this.credits=e||10,this.cansend=this.credits,this.ackn=this.credits}getUserArgs(t){return t&&(0,f.isStr)(t)?(0,f.isObject)(this.user_args)?this.user_args[t]:void 0:this.user_args}setUserArgs(t){this.user_args=t}setReceiver(t){this.receiver=t}cleanup(){delete this.receiver,this.close(!0)}invokeReceiver(t,e,i,s){if(this.receiver&&(0,f.isFunc)(this.receiver[e])&&this.receiver[e](this,i,s),t&&this.channels){let r=Object.keys(this.channels);for(let a=0;a1&&this.channels){const r=this.channels[t];if(r)return r.provideData(1,e,i)}const s=i&&i<0;if(!(s||this.msgqueue&&this.msgqueue.length))return this.invokeReceiver(!1,"onWebsocketMsg",e,i);this.msgqueue||(this.msgqueue=[]),s&&(i=void 0),this.msgqueue.push({ready:!0,msg:e,len:i})}reserveQueueItem(){this.msgqueue||(this.msgqueue=[]);let t={ready:!1,msg:null,len:0};return this.msgqueue.push(t),t}markQueueItemDone(t,e,i){t.ready=!0,t.msg=e,t.len=i,this.processQueue()}processQueue(){if(!this._loop_msgqueue&&this.msgqueue){for(this._loop_msgqueue=!0;this.msgqueue.length>0&&this.msgqueue[0].ready;){let t=this.msgqueue.shift();this.invokeReceiver(!1,"onWebsocketMsg",t.msg,t.len)}0==this.msgqueue.length&&delete this.msgqueue,delete this._loop_msgqueue}}close(t){if(this.master)return this.master.send("CLOSECH="+this.channelid,0),delete this.master.channels[this.channelid],void delete this.master;this.timerid&&(clearTimeout(this.timerid),delete this.timerid),this._websocket&&this.state>0&&(this.state=t?-1:0,this._websocket.onclose=null,this._websocket.close(),delete this._websocket)}canSend(t){return this.cansend>=(t||1)}getRelCanSend(){return this.credits?this.cansend/this.credits:1}send(t,e){if(this.master)return this.master.send(t,this.channelid);if(!this._websocket||this.state<=0)return!1;Number.isInteger(e)||(e=1),this.cansend<=0&&console.error(`should be queued before sending cansend: ${this.cansend}`);let i=`${this.ackn}:${this.cansend}:${e}:`;return this.ackn=0,this.cansend--,this._websocket.send(i+t),("websocket"===this.kind||"longpoll"===this.kind)&&(this.timerid&&clearTimeout(this.timerid),this.timerid=setTimeout(()=>this.keepAlive(),1e4)),!0}inject(t,e,i){if(!i)return setTimeout(this.inject.bind(this,t,e,!0),0);if(void 0===e&&(e=1),Array.isArray(t)){for(let s=0;s{if(0!=this.state)return;r||console.log(`try connect window again ${(new Date).toString()}`),this._websocket&&(this._websocket.close(),delete this._websocket),t||((t=window.location.href)&&t.indexOf("#")>0&&(t=t.slice(0,t.indexOf("#"))),t&&t.lastIndexOf("/")>0&&(t=t.slice(0,t.lastIndexOf("/")+1))),this.href=t,e++,r&&console.log(`Opening web socket at ${t}`),e>2&&(0,B.Ae)(`Trying to connect ${t}`);let a=t;"file"==this.kind?(a+="root.filedump",this._websocket=new D(this),console.log(`configure protocol log ${a}`)):"websocket"===this.kind&&r?(a=a.replace("http://","ws://").replace("https://","wss://")+"root.websocket",i&&(a+="?"+i),console.log(`configure websocket ${a}`),this._websocket=new WebSocket(a)):(a+="root.longpoll",console.log(`configure longpoll ${a}`),this._websocket=new M(a,"rawlongpoll"===this.kind,i)),this._websocket&&(this._websocket.onopen=()=>{e>2&&(0,B.Ae)(),this.state=1,this.send("READY="+(this.key||""),0),this.invokeReceiver(!1,"onWebsocketOpened")},this._websocket.onmessage=n=>{let u=n.data;if(this.next_binary){let R=this.next_binary;if(delete this.next_binary,u instanceof Blob){let E=new FileReader,C=this.reserveQueueItem();E.onload=q=>this.markQueueItemDone(C,q.target.result,0),E.readAsArrayBuffer(u,n.offset||0)}else this.provideData(R,u,n.offset||0);return}if(!(0,f.isStr)(u))return console.log("unsupported message kind: "+typeof u);let g=u.indexOf(":"),x=parseInt(u.slice(0,g)),y=u.indexOf(":",g+1),k=u.indexOf(":",y+1),S=parseInt(u.slice(y+1,k));if(this.ackn++,this.cansend+=x,u=u.slice(k+1),0==S){if(console.log(`GET chid=0 message ${u}`),"CLOSE"==u)this.close(!0),this.invokeReceiver(!0,"onWebsocketClosed");else if(0==u.indexOf("NEW_KEY=")){let R=u.slice(8);this.close(!0),typeof sessionStorage<"u"&&sessionStorage.setItem("RWebWindow_Key",R),location.reload(!0)}}else"$$binary$$"==u?this.next_binary=S:"$$nullbinary$$"==u?this.provideData(S,new ArrayBuffer(0),0):this.provideData(S,u);this.ackn>7&&this.send("READY",0)},this._websocket.onclose=n=>{delete this._websocket,(this.state>0||"force_close"===n)&&(console.log("websocket closed"),this.state=0,this.invokeReceiver(!0,"onWebsocketClosed"))},this._websocket.onerror=n=>{console.log(`websocket error ${n} state ${this.state}`),this.state>0&&(this.invokeReceiver(!0,"onWebsocketError",n),this.state=0)},(0,f.isBatchMode)()||setTimeout(s,3e3))};s(!0)}askReload(){this.send("GENERATE_KEY",0)}addReloadKeyHandler(){"file"!=this.kind&&window.addEventListener("keydown",t=>{("R"==t.key||"r"==t.key)&&t.ctrlKey&&(t.stopPropagation(),t.preventDefault(),console.log("Prevent Ctrl-R propogation - ask reload RWebWindow!"),this.askReload())})}}class j extends w{constructor(t,e){super(t,e,!0),this._websocket=null,this.tooltip_allowed=f.settings.Tooltip,this.v7canvas=!0}cleanup(){delete this._websocket,delete this._submreq,this._changed_layout&&this.setLayoutKind("simple"),delete this._changed_layout,super.cleanup()}getLayoutKind(){let t=this.selectDom("origin");return(t.empty()?"":t.property("layout"))||"simple"}setLayoutKind(t,e){let i=this.selectDom("origin");i.empty()||(t||(t="simple"),i.property("layout",t),i.property("layout_selector","simple"!=t&&e?e:null),this._changed_layout="simple"!==t)}changeLayout(t,e){var i=this;return(0,F.Z)(function*(){if(i.getLayoutKind()==t)return!0;let r=i.selectDom("origin"),a=r.select(".side_panel"),n=i.selectDom(),u=[];for(;n.node().firstChild;)u.push(n.node().removeChild(n.node().firstChild));if(a.empty()||(0,Z.Eq)(a.node()),i.setLayoutKind("simple"),r.html(""),"simple"==t){n=r;for(let g=0;g{console.log("save",t,i.length),this.sendWebsocket("SAVE:"+t+":"+i)})}sendSaveCommand(t){this.sendWebsocket("PRODUCE:"+t)}sendWebsocket(t){return!!this._websocket?.canSend()&&(this._websocket.send(t),!0)}closeWebsocket(t){this._websocket&&(this._websocket.close(t),this._websocket.cleanup(),delete this._websocket)}useWebsocket(t){this.closeWebsocket(),this._websocket=t,this._websocket.setReceiver(this),this._websocket.connect()}onWebsocketOpened(){}onWebsocketClosed(){this.embed_canvas||(0,B.Hw)()}onWebsocketMsg(t,e){if(console.log("GET_MSG "+e.slice(0,30)),"CLOSE"==e)this.onWebsocketClosed(),this.closeWebsocket(!0);else if("SNAP:"==e.slice(0,5)){let i=(e=e.slice(5)).indexOf(":"),s=e.slice(0,i),r=(0,f.parse)(e.slice(i+1));this.syncDraw(!0).then(()=>this.redrawPadSnap(r)).then(()=>{t.send("SNAPDONE:"+s),this.confirmDraw()})}else if("JSON"==e.slice(0,4)){let i=(0,f.parse)(e.slice(4));this.redrawObject(i)}else if("REPL_REQ:"==e.slice(0,9))this.processDrawableReply(e.slice(9));else if("CMD:"==e.slice(0,4)){let i=(e=e.slice(4)).indexOf(":"),s=e.slice(0,i),r=e.slice(i+1),a="REPLY:"+s+":";if("SVG"==r||"PNG"==r||"JPEG"==r)this.createImage(r.toLowerCase()).then(n=>t.send(a+n));else if(0==r.indexOf("ADDPANEL:")){let n=r.slice(9);if((0,f.isFunc)(this.showUI5Panel)){let u=new z(t.kind);u.setReceiver({cpainter:this,onWebsocketOpened(){},onWebsocketMsg(x,y){let k=0==y.indexOf("SHOWPANEL:")?y.slice(10):"";this.cpainter.showUI5Panel(k,x).then(S=>t.send(a+(S?"true":"false")))},onWebsocketClosed(){t.send(a+"false")},onWebsocketError(){t.send(a+"false")}});let g=t.href;if(0==n.indexOf("../")){let x=g.lastIndexOf("/",g.length-2);g=g.slice(0,x)+n.slice(2)}else g+=n;u.connect(g)}else t.send(a+"false")}else console.log("Unrecognized command "+r),t.send(a)}else if("DXPROJ:"==e.slice(0,7)||"DYPROJ:"==e.slice(0,7)){let i=e[1],s=(0,f.parse)(e.slice(7));this.drawProjection(i,s)}else if("SHOW:"==e.slice(0,5)){let i=e.slice(5),s="1"==i[i.length-1];this.showSection(i.slice(0,i.length-2),s)}else console.log(`unrecognized msg len: ${e.length} msg: ${e.slice(0,30)}`)}submitDrawableRequest(t,e,i,s){if(!(this._websocket&&e&&e._typename&&i.snapid&&(0,f.isStr)(i.snapid)))return null;if(t&&s){i._requests||(i._requests={});let a=i._requests[t];if(a){let n=(new Date).getTime();if(!a._tm||n-a._tm<5e3)return a._nextreq=e,!1;delete i._requests[t]}i._requests[t]=e}e.id=i.snapid,s?(this._nextreqid||(this._nextreqid=1),e.reqid=this._nextreqid++):e.reqid=0;let r=JSON.stringify(e);return e.reqid&&(e._kind=t,e._painter=i,e._method=s,e._tm=(new Date).getTime(),this._submreq||(this._submreq={}),this._submreq[e.reqid]=e),this.sendWebsocket("REQ:"+r),e}submitMenuRequest(t,e,i){var s=this;return(0,F.Z)(function*(){return new Promise(r=>{s.submitDrawableRequest("",{_typename:"ROOT::Experimental::RDrawableMenuRequest",menukind:e||"",menureqid:i},t,r)})})()}submitExec(t,e,i){if(this._websocket){if(i&&(0,f.isStr)(i)){let s=i.length;if(s>2&&i.indexOf("#x")==s-2?i="x":s>2&&i.indexOf("#y")==s-2?i="y":s>2&&i.indexOf("#z")==s-2&&(i="z"),"x"!=i&&"y"!=i&&"z"!=i)return console.log(`not recoginzed subelem ${i} in SubmitExec`);e=i+"axis#"+e}this.submitDrawableRequest("",{_typename:"ROOT::Experimental::RDrawableExecRequest",exec:e},t)}}processDrawableReply(t){let e=(0,f.parse)(t);if(!e||!e.reqid||!this._submreq)return!1;let i=this._submreq[e.reqid];if(!i)return!1;delete this._submreq[e.reqid],i._kind&&i._painter?._requests&&i._painter._requests[i._kind]===i&&delete i._painter._requests[i._kind],i._method&&i._method(e,i),i._nextreq&&!i._painter._requests[i._kind]&&this.submitDrawableRequest(i._kind,i._nextreq,i._painter,i._method)}showSection(t,e){var i=this;return(0,F.Z)(function*(){switch(t){case"Menu":case"StatusBar":case"Editor":case"ToolBar":break;case"ToolTips":i.setTooltipAllowed(e)}return!0})()}processChanges(t,e,i){if(this._websocket&&this._websocket.canSend(2)&&(0,f.isStr)(t))switch(e||(e=this),t){case"sbits":console.log("Status bits in RCanvas are changed - that to do?");break;case"frame":case"zoom":console.log("Frame moved or zoom is changed - that to do?");break;case"pave_moved":console.log("TPave is moved inside RCanvas - that to do?");break;default:"exec:"==t.slice(0,5)&&e?.snapid?this.submitExec(e,t.slice(5),i):console.log("UNPROCESSED CHANGES",t)}}clickPadButton(t,e){return"ToggleGed"==t?this.activateGed(this,null,"toggle"):"ToggleStatus"==t?this.activateStatusBar("toggle"):void super.clickPadButton(t,e)}hasEventStatus(){if(this.testUI5())return!1;if(this.brlayout)return this.brlayout.hasStatus();let t=(0,K.nh)();return!!t&&t.hasStatusLine()}activateStatusBar(t){this.testUI5()||(this.brlayout?this.brlayout.createStatusLine(23,t):(0,K.nh)()?.createStatusLine(23,t),this.processChanges("sbits",this))}showCanvasStatus(...t){this.testUI5()||(this.brlayout||(0,K.nh)()?.brlayout)?.showStatus(...t)}hasGed(){return!this.testUI5()&&(this.brlayout?.hasContent()??!1)}removeGed(){this.testUI5()||(this.registerForPadEvents(null),this.ged_view&&(this.ged_view.getController().cleanupGed(),this.ged_view.destroy(),delete this.ged_view),this.brlayout?.deleteContent(!0),this.processChanges("sbits",this))}getUi5PanelData(){return{jsroot:{settings:f.settings,create:f.create,parse:f.parse,toJSON:f.toJSON,loadScript:f.loadScript,EAxisBits:Z.VO,getColorExec:B.Aq}}}activateGed(t,e,i){var s=this;return(0,F.Z)(function*(){if(s.testUI5()||!s.brlayout)return!1;if(s.brlayout.hasContent())return"toggle"===i||!1===i?s.removeGed():t?.getPadPainter()?.selectObjectPainter(t),!0;if(!1===i)return!1;let r=s.brlayout.createBrowserBtns();return B.KL.createSVG(r,B.KL.diamand,15,"toggle fix-pos mode").style("margin","3px").on("click",()=>s.brlayout.toggleKind("fix")),B.KL.createSVG(r,B.KL.circle,15,"toggle float mode").style("margin","3px").on("click",()=>s.brlayout.toggleKind("float")),B.KL.createSVG(r,B.KL.cross,15,"delete GED").style("margin","3px").on("click",()=>s.removeGed()),s.brlayout.setBrowserContent("
Loading GED ...
"),s.brlayout.setBrowserTitle("GED"),s.brlayout.toggleBrowserKind(e||"float"),new Promise(a=>{B.OA.then(n=>{(0,W.Ys)("#ged_placeholder").text(""),n.ui.define(["sap/ui/model/json/JSONModel","sap/ui/core/mvc/XMLView"],(u,g)=>{let x=new u({handle:null});g.create({viewName:"rootui5.canv.view.Ged",viewData:s.getUi5PanelData("Ged")}).then(y=>{y.setModel(x),y.placeAt("ged_placeholder"),s.ged_view=y,s.registerForPadEvents(y.getController().padEventsReceiver.bind(y.getController())),t?.getPadPainter()?.selectObjectPainter(t),s.processChanges("sbits",s),a(!0)})})})})})()}produceJSON(){return console.error("RCanvasPainter.produceJSON not yet implemented"),""}static draw(t,e){return(0,F.Z)(function*(){let i=!e;i&&(e=(0,f.create)("ROOT::Experimental::RCanvas"));let s=new j(t,e);return s.normal_canvas=!i,s.createCanvasSvg(0),(0,Z.O5)({pp:s,active:!1}),s.drawPrimitives().then(()=>(s.addPadButtons(),s.showPadButtons(),s))})()}}function P(_,t){let e=new j(_,null);return e.normal_canvas=!1,e.batch_mode=(0,f.isBatchMode)(),e.syncDraw(!0).then(()=>e.redrawPadSnap(t)).then(()=>(e.confirmDraw(),e.showPadButtons(),e))}function I(_,t){return Y.apply(this,arguments)}function Y(){return(Y=(0,F.Z)(function*(_,t){return _?(_.getCanvSvg().empty()?j.draw(_.getDom(),null):Promise.resolve(!0)).then(()=>{if(!1!==t&&_.getFrameSvg().select(".main_layer").empty())return o.draw(_.getDom(),null,(0,f.isStr)(t)?t:"")}).then(()=>(_.addToPadPrimitives(),_)):Promise.reject(Error("Painter not provided in ensureRCanvas"))})).apply(this,arguments)}function N(_,t){let e=this.getFramePainter();if(!e)return console.log("no frame painter - no title");let i=e.getFrameRect(),s=i.x,r=i.y,a=i.width,n=this.getPadPainter().getPadHeight(),u=this.getObject(),g=this.v7EvalLength("margin",n,.02),x=a,y=this.v7EvalLength("height",n,.05),k=this.v7EvalFont("text",{size:.07,color:"black",align:22});if("drag"==_){y=t.height,g=r-t.y-t.height;let R={};this.v7AttrChange(R,"margin",g/n),this.v7AttrChange(R,"height",y/n),this.v7SendAttrChanges(R,!1)}this.createG(),this.draw_g.attr("transform",`translate(${s},${Math.round(r-g-y)})`);let S={x:x/2,y:y/2,text:u.fText,latex:1};return this.startTextDrawing(k,"font"),this.drawText(S),this.finishTextDrawing().then(()=>{(0,f.isBatchMode)()||(0,c.uI)(this,{x:s,y:Math.round(r-g-y),width:x,height:y,minwidth:20,minheight:20,no_change_x:!0,redraw:R=>this.redraw("drag",R)})})}function X(){let _=this.getObject(),t=this.getCanvSvg(),e=t.select(".canvas_defs"),i="custom_font_"+_.fFamily+_.fWeight+_.fStyle;e.empty()&&(e=t.insert("svg:defs",":first-child").attr("class","canvas_defs"));let s=e.select("."+i);return s.empty()&&(s=e.append("style").attr("type","text/css").attr("class",i)),s.text(`@font-face { font-family: "${_.fFamily}"; font-weight: ${_.fWeight?_.fWeight:"normal"}; font-style: ${_.fStyle?_.fStyle:"normal"}; src: ${_.fSrc}; }`),_.fDefault&&(this.getPadPainter()._dfltRFont=_),!0}function G(_,t,e){let i=new m.C(_,t,e);return i.disable_zooming=!0,I(i,!1).then(()=>i.redraw()).then(()=>i)}function U(_,t,e){let i=new o(_,t);return"3d"==e&&(i.mode3d=!0),I(i,!1).then(()=>i.redraw())}(0,f.registerMethods)("ROOT::Experimental::RPalette",{extractRColor:_=>_.fColor||"black",getColor(_){return this.palette[_]},getContourIndex(_){let s,t=this.fContour,e=0,i=t.length-1;if(_=t[i])return i-1;if(this.fCustomContour){for(;e_?i=s:e=s;return e}return Math.floor((_-t[0])/(t[i-1]-t[0])*(i-1))},getContourColor(_){let t=this.getContourIndex(_);return t<0?"":this.getColor(t)},getContour(){return this.fContour&&this.fContour.length>1?this.fContour:null},deleteContour(){delete this.fContour},calcColor(_,t,e){let i=e.fOrdinal-t.fOrdinal,s=e.fOrdinal-_,r=_-t.fOrdinal;if(!this.fInterpolate||i<=0)return s1&&(_=1);let t,e=this.fColors[0];for(let i=0;i_)return this.calcColor(_,t,e)}return this.extractRColor(e.fColor)},setFullRange(_,t){this.full_min=_,this.full_max=t},createContour(_,t,e,i,s){if(this.fContour=[],delete this.fCustomContour,this.colzmin=e,this.colzmax=i,_){this.colzmax<=0&&(this.colzmax=1),this.colzmin<=0&&(this.colzmin=void 0===s||s<=0?1e-4*this.colzmax:s<3||s>100?.3*s:1),this.colzmin>=this.colzmax&&(this.colzmin=1e-4*this.colzmax);let r=Math.log(this.colzmin)/Math.log(10),n=(Math.log(this.colzmax)/Math.log(10)-r)/t;this.fContour.push(this.colzmin);for(let u=1;u {\n if (dflt === undefined) return res;\n let typ1 = typeof dflt, typ2 = typeof res;\n if (typ1 == typ2) return res;\n if (typ1 == 'boolean') {\n if (typ2 == 'string') return (res != '') && (res != '0') && (res != 'no') && (res != 'off');\n return !!res;\n }\n if ((typ1 == 'number') && (typ2 == 'string'))\n return parseFloat(res);\n return res;\n };\n\n if (obj.fAttr && obj.fAttr.m) {\n let value = obj.fAttr.m[name];\n if (value) return type_check(value.v); // found value direct in attributes\n }\n\n if (this.rstyle && this.rstyle.fBlocks) {\n let blks = this.rstyle.fBlocks;\n for (let k = 0; k < blks.length; ++k) {\n let block = blks[k],\n match = (this.csstype && (block.selector == this.csstype)) ||\n (obj.fId && (block.selector == ('#' + obj.fId))) ||\n (obj.fCssClass && (block.selector == ('.' + obj.fCssClass)));\n\n if (match && block.map && block.map.m) {\n let value = block.map.m[name.toLowerCase()];\n if (value) return type_check(value.v);\n }\n }\n }\n\n return dflt;\n }\n\n /** @summary Set v7 attributes value */\n v7SetAttr(name, value) {\n let obj = this.getObject();\n if (this.cssprefix) name = this.cssprefix + name;\n\n if (obj && obj.fAttr && obj.fAttr.m)\n obj.fAttr.m[name] = { v: value };\n }\n\n /** @summary Decode pad length from string, return pixel value */\n v7EvalLength(name, sizepx, dflt) {\n if (sizepx <= 0) sizepx = 1;\n\n let value = this.v7EvalAttr(name);\n\n if (value === undefined)\n return Math.round(dflt*sizepx);\n\n if (typeof value == 'number')\n return Math.round(value*sizepx);\n\n if (value === null)\n return 0;\n\n let norm = 0, px = 0, val = value, operand = 0, pos = 0;\n\n while (val) {\n // skip empty spaces\n while ((pos < val.length) && ((val[pos] == ' ') || (val[pos] == '\\t')))\n ++pos;\n\n if (pos >= val.length)\n break;\n\n if ((val[pos] == '-') || (val[pos] == '+')) {\n if (operand) {\n console.log('Fail to parse RPadLength ' + value);\n return dflt;\n }\n operand = (val[pos] == '-') ? -1 : 1;\n pos++;\n continue;\n }\n\n if (pos > 0) { val = val.slice(pos); pos = 0; }\n\n while ((pos < val.length) && (((val[pos] >= '0') && (val[pos] <= '9')) || (val[pos] == '.'))) pos++;\n\n let v = parseFloat(val.slice(0, pos));\n if (!Number.isFinite(v)) {\n console.log('Fail to parse RPadLength ' + value);\n return Math.round(dflt*sizepx);\n }\n\n val = val.slice(pos);\n pos = 0;\n if (!operand) operand = 1;\n if (val && (val[0] == '%')) {\n val = val.slice(1);\n norm += operand*v*0.01;\n } else if ((val.length > 1) && (val[0] == 'p') && (val[1] == 'x')) {\n val = val.slice(2);\n px += operand*v;\n } else {\n norm += operand*v;\n }\n\n operand = 0;\n }\n\n return Math.round(norm*sizepx + px);\n }\n\n /** @summary Evaluate RColor using attribute storage and configured RStyle */\n v7EvalColor(name, dflt) {\n let val = this.v7EvalAttr(name, '');\n if (!val || !isStr(val)) return dflt;\n\n if (val == 'auto') {\n let pp = this.getPadPainter();\n if (pp?._auto_color_cnt !== undefined) {\n let pal = pp.getHistPalette(),\n cnt = pp._auto_color_cnt++,\n num = pp._num_primitives - 1;\n if (num < 2) num = 2;\n val = pal ? pal.getColorOrdinal((cnt % num) / num) : 'blue';\n if (!this._auto_colors) this._auto_colors = {};\n this._auto_colors[name] = val;\n } else if (this._auto_colors && this._auto_colors[name]) {\n val = this._auto_colors[name];\n } else {\n console.error(`Autocolor ${name} not defined yet - please check code`);\n val = '';\n }\n } else if (val[0] == '[') {\n let ordinal = parseFloat(val.slice(1, val.length-1));\n val = 'black';\n if (Number.isFinite(ordinal)) {\n let pp = this.getPadPainter(),\n pal = pp?.getHistPalette();\n if (pal) val = pal.getColorOrdinal(ordinal);\n }\n }\n return val;\n }\n\n /** @summary Evaluate RAttrText properties\n * @return {Object} FontHandler, can be used directly for the text drawing */\n v7EvalFont(name, dflts, fontScale) {\n\n if (!dflts) dflts = {}; else\n if (typeof dflts == 'number') dflts = { size: dflts };\n\n let pp = this.getPadPainter(),\n rfont = pp?._dfltRFont || { fFamily: 'Arial', fStyle: '', fWeight: '' },\n text_size = this.v7EvalAttr(name + '_size', dflts.size || 12),\n text_angle = this.v7EvalAttr(name + '_angle', 0),\n text_align = this.v7EvalAttr(name + '_align', dflts.align || 'none'),\n text_color = this.v7EvalColor(name + '_color', dflts.color || 'none'),\n font_family = this.v7EvalAttr(name + '_font_family', rfont.fFamily || 'Arial'),\n font_style = this.v7EvalAttr(name + '_font_style', rfont.fStyle || ''),\n font_weight = this.v7EvalAttr(name + '_font_weight', rfont.fWeight || '');\n\n if (isStr(text_size)) text_size = parseFloat(text_size);\n if (!Number.isFinite(text_size) || (text_size <= 0)) text_size = 12;\n if (!fontScale) fontScale = pp?.getPadHeight() || 100;\n\n let handler = new FontHandler(null, text_size, fontScale, font_family, font_style, font_weight);\n\n if (text_angle) handler.setAngle(360 - text_angle);\n if (text_align !== 'none') handler.setAlign(text_align);\n if (text_color !== 'none') handler.setColor(text_color);\n\n return handler;\n }\n\n /** @summary Create this.fillatt object based on v7 fill attributes */\n createv7AttFill(prefix) {\n if (!prefix || !isStr(prefix)) prefix = 'fill_';\n\n let color = this.v7EvalColor(prefix + 'color', ''),\n pattern = this.v7EvalAttr(prefix + 'style', 0);\n\n this.createAttFill({ pattern, color, color_as_svg: true });\n }\n\n /** @summary Create this.lineatt object based on v7 line attributes */\n createv7AttLine(prefix) {\n if (!prefix || !isStr(prefix)) prefix = 'line_';\n\n let color = this.v7EvalColor(prefix + 'color', 'black'),\n width = this.v7EvalAttr(prefix + 'width', 1),\n style = this.v7EvalAttr(prefix + 'style', 1),\n pattern = this.v7EvalAttr(prefix + 'pattern');\n\n this.createAttLine({ color, width, style, pattern });\n\n if (prefix == 'border_')\n this.lineatt.setBorder(this.v7EvalAttr(prefix + 'rx', 0), this.v7EvalAttr(prefix + 'ry', 0));\n }\n\n /** @summary Create this.markeratt object based on v7 attributes */\n createv7AttMarker(prefix) {\n if (!prefix || !isStr(prefix)) prefix = 'marker_';\n\n let color = this.v7EvalColor(prefix + 'color', 'black'),\n size = this.v7EvalAttr(prefix + 'size', 0.01),\n style = this.v7EvalAttr(prefix + 'style', 1),\n refsize = 1;\n if (size < 1) {\n let pp = this.getPadPainter();\n refsize = pp?.getPadHeight() || 100;\n }\n\n this.createAttMarker({ color, size, style, refsize });\n }\n\n /** @summary Create RChangeAttr, which can be applied on the server side\n * @private */\n v7AttrChange(req, name, value, kind) {\n if (!this.snapid)\n return false;\n\n if (!req._typename) {\n req._typename = 'ROOT::Experimental::RChangeAttrRequest';\n req.ids = [];\n req.names = [];\n req.values = [];\n req.update = true;\n }\n\n if (this.cssprefix) name = this.cssprefix + name;\n req.ids.push(this.snapid);\n req.names.push(name);\n let obj = null;\n\n if ((value === null) || (value === undefined)) {\n if (!kind) kind = 'none';\n if (kind !== 'none') console.error(`Trying to set ${kind} for none value`);\n }\n\n if (!kind)\n switch(typeof value) {\n case 'number': kind = 'double'; break;\n case 'boolean': kind = 'boolean'; break;\n }\n\n obj = { _typename: 'ROOT::Experimental::RAttrMap::' };\n switch(kind) {\n case 'none': obj._typename += 'NoValue_t'; break;\n case 'boolean': obj._typename += 'BoolValue_t'; obj.v = value ? true : false; break;\n case 'int': obj._typename += 'IntValue_t'; obj.v = parseInt(value); break;\n case 'double': obj._typename += 'DoubleValue_t'; obj.v = parseFloat(value); break;\n default: obj._typename += 'StringValue_t'; obj.v = isStr(value) ? value : JSON.stringify(value); break;\n }\n\n req.values.push(obj);\n return true;\n }\n\n /** @summary Sends accumulated attribute changes to server */\n v7SendAttrChanges(req, do_update) {\n let canp = this.getCanvPainter();\n if (canp && req?._typename) {\n if (do_update !== undefined)\n req.update = do_update ? true : false;\n canp.v7SubmitRequest('', req);\n }\n }\n\n /** @summary Submit request to server-side drawable\n * @param kind defines request kind, only single request a time can be submitted\n * @param req is object derived from DrawableRequest, including correct _typename\n * @param method is method of painter object which will be called when getting reply */\n v7SubmitRequest(kind, req, method) {\n let canp = this.getCanvPainter();\n if (!isFunc(canp?.submitDrawableRequest)) return null;\n\n // special situation when snapid not yet assigned - just keep ref until snapid is there\n // maybe keep full list - for now not clear if really needed\n if (!this.snapid) {\n this._pending_request = { kind, req, method };\n return req;\n }\n\n return canp.submitDrawableRequest(kind, req, this, method);\n }\n\n /** @summary Assign snapid to the painter\n * @desc Overwrite default method */\n assignSnapId(id) {\n this.snapid = id;\n if (this.snapid && this._pending_request) {\n let p = this._pending_request;\n this.v7SubmitRequest(p.kind, p.req, p.method);\n delete this._pending_request;\n }\n }\n\n /** @summary Return communication mode with the server\n * @desc\n * kOffline means no server there,\n * kLessTraffic advise not to send commands if offline functionality available\n * kNormal is standard functionality with RCanvas on server side */\n v7CommMode() {\n let canp = this.getCanvPainter();\n if (!canp || !canp.submitDrawableRequest || !canp._websocket)\n return kOffline;\n\n return kNormal;\n }\n\n v7NormalMode() { return this.v7CommMode() == kNormal; }\n\n v7OfflineMode() { return this.v7CommMode() == kOffline; }\n\n} // class RObjectPainter\n\nexport { RObjectPainter };\n","import { settings, isBatchMode, isFunc } from '../core.mjs';\nimport { select as d3_select, pointer as d3_pointer,\n drag as d3_drag, timeFormat as d3_timeFormat,\n scaleTime as d3_scaleTime, scaleSymlog as d3_scaleSymlog,\n scaleLog as d3_scaleLog, scaleLinear as d3_scaleLinear } from '../d3.mjs';\nimport { AxisPainterMethods, chooseTimeFormat } from './TAxisPainter.mjs';\nimport { createMenu } from '../gui/menu.mjs';\nimport { addDragHandler } from './TFramePainter.mjs';\nimport { RObjectPainter } from '../base/RObjectPainter.mjs';\n\n\n/**\n * @summary Axis painter for v7\n *\n * @private\n */\n\nclass RAxisPainter extends RObjectPainter {\n\n /** @summary constructor */\n constructor(dom, arg1, axis, cssprefix) {\n let drawable = cssprefix ? arg1.getObject() : arg1;\n super(dom, drawable, '', cssprefix ? arg1.csstype : 'axis');\n Object.assign(this, AxisPainterMethods);\n this.initAxisPainter();\n\n this.axis = axis;\n if (cssprefix) { // drawing from the frame\n this.embedded = true; // indicate that painter embedded into the histo painter\n //this.csstype = arg1.csstype; // for the moment only via frame one can set axis attributes\n this.cssprefix = cssprefix;\n this.rstyle = arg1.rstyle;\n } else {\n // this.csstype = 'axis';\n this.cssprefix = 'axis_';\n }\n }\n\n /** @summary cleanup painter */\n cleanup() {\n delete this.axis;\n delete this.axis_g;\n this.cleanupAxisPainter();\n super.cleanup();\n }\n\n /** @summary Use in GED to identify kind of axis */\n getAxisType() { return 'RAttrAxis'; }\n\n /** @summary Configure only base parameters, later same handle will be used for drawing */\n configureZAxis(name, fp) {\n this.name = name;\n this.kind = 'normal';\n this.log = false;\n let _log = this.v7EvalAttr('log', 0);\n if (_log) {\n this.log = true;\n this.logbase = 10;\n if (Math.abs(_log - Math.exp(1)) < 0.1)\n this.logbase = Math.exp(1);\n else if (_log > 1.9)\n this.logbase = Math.round(_log);\n }\n fp.logz = this.log;\n }\n\n /** @summary Configure axis painter\n * @desc Axis can be drawn inside frame group with offset to 0 point for the frame\n * Therefore one should distinguish when caclulated coordinates used for axis drawing itself or for calculation of frame coordinates\n * @private */\n configureAxis(name, min, max, smin, smax, vertical, frame_range, axis_range, opts) {\n if (!opts) opts = {};\n this.name = name;\n this.full_min = min;\n this.full_max = max;\n this.kind = 'normal';\n this.vertical = vertical;\n this.log = false;\n let _log = this.v7EvalAttr('log', 0),\n _symlog = this.v7EvalAttr('symlog', 0);\n this.reverse = opts.reverse || false;\n\n if (this.v7EvalAttr('time')) {\n this.kind = 'time';\n this.timeoffset = 0;\n let toffset = this.v7EvalAttr('timeOffset');\n if (toffset !== undefined) {\n toffset = parseFloat(toffset);\n if (Number.isFinite(toffset)) this.timeoffset = toffset*1000;\n }\n } else if (this.axis && this.axis.fLabelsIndex) {\n this.kind = 'labels';\n delete this.own_labels;\n } else if (opts.labels) {\n this.kind = 'labels';\n } else {\n this.kind = 'normal';\n }\n\n if (this.kind == 'time') {\n this.func = d3_scaleTime().domain([this.convertDate(smin), this.convertDate(smax)]);\n } else if (_symlog && (_symlog > 0)) {\n this.symlog = _symlog;\n this.func = d3_scaleSymlog().constant(_symlog).domain([smin,smax]);\n } else if (_log) {\n if (smax <= 0) smax = 1;\n if ((smin <= 0) || (smin >= smax))\n smin = smax * 0.0001;\n this.log = true;\n this.logbase = 10;\n if (Math.abs(_log - Math.exp(1)) < 0.1)\n this.logbase = Math.exp(1);\n else if (_log > 1.9)\n this.logbase = Math.round(_log);\n this.func = d3_scaleLog().base(this.logbase).domain([smin,smax]);\n } else {\n this.func = d3_scaleLinear().domain([smin,smax]);\n }\n\n this.scale_min = smin;\n this.scale_max = smax;\n\n this.gr_range = axis_range || 1000; // when not specified, one can ignore it\n\n let range = frame_range ? frame_range : [0, this.gr_range];\n\n this.axis_shift = range[1] - this.gr_range;\n\n if (this.reverse)\n this.func.range([range[1], range[0]]);\n else\n this.func.range(range);\n\n if (this.kind == 'time')\n this.gr = val => this.func(this.convertDate(val));\n else if (this.log)\n this.gr = val => (val < this.scale_min) ? (this.vertical ? this.func.range()[0]+5 : -5) : this.func(val);\n else\n this.gr = this.func;\n\n delete this.format;// remove formatting func\n\n let ndiv = this.v7EvalAttr('ndiv', 508);\n\n this.nticks = ndiv % 100;\n this.nticks2 = (ndiv % 10000 - this.nticks) / 100;\n this.nticks3 = Math.floor(ndiv/10000);\n\n if (this.nticks > 20) this.nticks = 20;\n\n let gr_range = Math.abs(this.gr_range) || 100;\n\n if (this.kind == 'time') {\n if (this.nticks > 8) this.nticks = 8;\n\n let scale_range = this.scale_max - this.scale_min,\n tf1 = this.v7EvalAttr('timeFormat', ''),\n tf2 = chooseTimeFormat(scale_range / gr_range, false);\n\n if (!tf1 || (scale_range < 0.1 * (this.full_max - this.full_min)))\n tf1 = chooseTimeFormat(scale_range / this.nticks, true);\n\n this.tfunc1 = this.tfunc2 = d3_timeFormat(tf1);\n if (tf2!==tf1)\n this.tfunc2 = d3_timeFormat(tf2);\n\n this.format = this.formatTime;\n\n } else if (this.log) {\n if (this.nticks2 > 1) {\n this.nticks *= this.nticks2; // all log ticks (major or minor) created centrally\n this.nticks2 = 1;\n }\n this.noexp = this.v7EvalAttr('noexp', false);\n if ((this.scale_max < 300) && (this.scale_min > 0.3) && (this.logbase == 10)) this.noexp = true;\n this.moreloglabels = this.v7EvalAttr('moreloglbls', false);\n\n this.format = this.formatLog;\n } else if (this.kind == 'labels') {\n this.nticks = 50; // for text output allow max 50 names\n let scale_range = this.scale_max - this.scale_min;\n if (this.nticks > scale_range)\n this.nticks = Math.round(scale_range);\n this.nticks2 = 1;\n\n this.format = this.formatLabels;\n } else {\n this.order = 0;\n this.ndig = 0;\n this.format = this.formatNormal;\n }\n }\n\n /** @summary Return scale min */\n getScaleMin() {\n return this.func ? this.func.domain()[0] : 0;\n }\n\n /** @summary Return scale max */\n getScaleMax() {\n return this.func ? this.func.domain()[1] : 0;\n }\n\n /** @summary Provide label for axis value */\n formatLabels(d) {\n let indx = Math.round(d);\n if (this.axis && this.axis.fLabelsIndex) {\n if ((indx < 0) || (indx >= this.axis.fNBinsNoOver)) return null;\n for (let i = 0; i < this.axis.fLabelsIndex.length; ++i) {\n let pair = this.axis.fLabelsIndex[i];\n if (pair.second === indx) return pair.first;\n }\n } else {\n let labels = this.getObject().fLabels;\n if (labels && (indx >= 0) && (indx < labels.length))\n return labels[indx];\n }\n return null;\n }\n\n /** @summary Creates array with minor/middle/major ticks */\n createTicks(only_major_as_array, optionNoexp, optionNoopt, optionInt) {\n\n if (optionNoopt && this.nticks && (this.kind == 'normal')) this.noticksopt = true;\n\n let handle = { nminor: 0, nmiddle: 0, nmajor: 0, func: this.func };\n\n handle.minor = handle.middle = handle.major = this.produceTicks(this.nticks);\n\n if (only_major_as_array) {\n let res = handle.major, delta = (this.scale_max - this.scale_min)*1e-5;\n if (res[0] > this.scale_min + delta) res.unshift(this.scale_min);\n if (res[res.length-1] < this.scale_max - delta) res.push(this.scale_max);\n return res;\n }\n\n if ((this.nticks2 > 1) && (!this.log || (this.logbase === 10))) {\n handle.minor = handle.middle = this.produceTicks(handle.major.length, this.nticks2);\n\n let gr_range = Math.abs(this.func.range()[1] - this.func.range()[0]);\n\n // avoid black filling by middle-size\n if ((handle.middle.length <= handle.major.length) || (handle.middle.length > gr_range/3.5)) {\n handle.minor = handle.middle = handle.major;\n } else if ((this.nticks3 > 1) && !this.log) {\n handle.minor = this.produceTicks(handle.middle.length, this.nticks3);\n if ((handle.minor.length <= handle.middle.length) || (handle.minor.length > gr_range/1.7)) handle.minor = handle.middle;\n }\n }\n\n handle.reset = function() {\n this.nminor = this.nmiddle = this.nmajor = 0;\n };\n\n handle.next = function(doround) {\n if (this.nminor >= this.minor.length) return false;\n\n this.tick = this.minor[this.nminor++];\n this.grpos = this.func(this.tick);\n if (doround) this.grpos = Math.round(this.grpos);\n this.kind = 3;\n\n if ((this.nmiddle < this.middle.length) && (Math.abs(this.grpos - this.func(this.middle[this.nmiddle])) < 1)) {\n this.nmiddle++;\n this.kind = 2;\n }\n\n if ((this.nmajor < this.major.length) && (Math.abs(this.grpos - this.func(this.major[this.nmajor])) < 1) ) {\n this.nmajor++;\n this.kind = 1;\n }\n return true;\n };\n\n handle.last_major = function() {\n return (this.kind !== 1) ? false : this.nmajor == this.major.length;\n };\n\n handle.next_major_grpos = function() {\n if (this.nmajor >= this.major.length) return null;\n return this.func(this.major[this.nmajor]);\n };\n\n this.order = 0;\n this.ndig = 0;\n\n // at the moment when drawing labels, we can try to find most optimal text representation for them\n\n if ((this.kind == 'normal') && !this.log && (handle.major.length > 0)) {\n\n let maxorder = 0, minorder = 0, exclorder3 = false;\n\n if (!optionNoexp) {\n let maxtick = Math.max(Math.abs(handle.major[0]),Math.abs(handle.major[handle.major.length-1])),\n mintick = Math.min(Math.abs(handle.major[0]),Math.abs(handle.major[handle.major.length-1])),\n ord1 = (maxtick > 0) ? Math.round(Math.log10(maxtick)/3)*3 : 0,\n ord2 = (mintick > 0) ? Math.round(Math.log10(mintick)/3)*3 : 0;\n\n exclorder3 = (maxtick < 2e4); // do not show 10^3 for values below 20000\n\n if (maxtick || mintick) {\n maxorder = Math.max(ord1,ord2) + 3;\n minorder = Math.min(ord1,ord2) - 3;\n }\n }\n\n // now try to find best combination of order and ndig for labels\n\n let bestorder = 0, bestndig = this.ndig, bestlen = 1e10;\n\n for (let order = minorder; order <= maxorder; order+=3) {\n if (exclorder3 && (order===3)) continue;\n this.order = order;\n this.ndig = 0;\n let lbls = [], indx = 0, totallen = 0;\n while (indx 11) break; // not too many digits, anyway it will be exponential\n lbls = []; indx = 0; totallen = 0;\n }\n\n // for order == 0 we should virually remove '0.' and extra label on top\n if (!order && (this.ndig < 4))\n totallen -= (handle.major.length * 2 + 3);\n\n if (totallen < bestlen) {\n bestlen = totallen;\n bestorder = this.order;\n bestndig = this.ndig;\n }\n }\n\n this.order = bestorder;\n this.ndig = bestndig;\n\n if (optionInt) {\n if (this.order) console.warn(`Axis painter - integer labels are configured, but axis order ${this.order} is preferable`);\n if (this.ndig) console.warn(`Axis painter - integer labels are configured, but ${this.ndig} decimal digits are required`);\n this.ndig = 0;\n this.order = 0;\n }\n }\n\n return handle;\n }\n\n /** @summary Is labels should be centered */\n isCenteredLabels() {\n if (this.kind === 'labels') return true;\n if (this.kind === 'log') return false;\n return this.v7EvalAttr('labels_center', false);\n }\n\n /** @summary Used to move axis labels instead of zooming\n * @private */\n processLabelsMove(arg, pos) {\n if (this.optionUnlab || !this.axis_g) return false;\n\n let label_g = this.axis_g.select('.axis_labels');\n if (!label_g || (label_g.size() != 1)) return false;\n\n if (arg == 'start') {\n // no moving without labels\n let box = label_g.node().getBBox();\n\n label_g.append('rect')\n .classed('zoom', true)\n .attr('x', box.x)\n .attr('y', box.y)\n .attr('width', box.width)\n .attr('height', box.height)\n .style('cursor', 'move');\n if (this.vertical) {\n this.drag_pos0 = pos[0];\n } else {\n this.drag_pos0 = pos[1];\n }\n\n return true;\n }\n\n let offset = label_g.property('fix_offset');\n\n if (this.vertical) {\n offset += Math.round(pos[0] - this.drag_pos0);\n label_g.attr('transform', `translate(${offset})`);\n } else {\n offset += Math.round(pos[1] - this.drag_pos0);\n label_g.attr('transform', `translate(0,${offset})`);\n }\n if (!offset) label_g.attr('transform', null);\n\n if (arg == 'stop') {\n label_g.select('rect.zoom').remove();\n delete this.drag_pos0;\n if (offset != label_g.property('fix_offset')) {\n label_g.property('fix_offset', offset);\n let side = label_g.property('side') || 1;\n this.labelsOffset = offset / (this.vertical ? -side : side);\n this.changeAxisAttr(1, 'labels_offset', this.labelsOffset / this.scalingSize);\n }\n }\n\n return true;\n }\n\n /** @summary Add interactive elements to draw axes title */\n addTitleDrag(title_g, side) {\n if (!settings.MoveResize || isBatchMode()) return;\n\n let drag_rect = null,\n acc_x, acc_y, new_x, new_y, alt_pos, curr_indx,\n drag_move = d3_drag().subject(Object);\n\n drag_move\n .on('start', evnt => {\n\n evnt.sourceEvent.preventDefault();\n evnt.sourceEvent.stopPropagation();\n\n let box = title_g.node().getBBox(), // check that elements visible, request precise value\n title_length = this.vertical ? box.height : box.width;\n\n new_x = acc_x = title_g.property('shift_x');\n new_y = acc_y = title_g.property('shift_y');\n\n if (this.titlePos == 'center')\n curr_indx = 1;\n else\n curr_indx = (this.titlePos == 'left') ? 0 : 2;\n\n // let d = ((this.gr_range > 0) && this.vertical) ? title_length : 0;\n alt_pos = [0, this.gr_range/2, this.gr_range]; // possible positions\n let off = this.vertical ? -title_length : title_length,\n swap = this.isReverseAxis() ? 2 : 0;\n if (this.title_align == 'middle') {\n alt_pos[swap] += off/2;\n alt_pos[2-swap] -= off/2;\n } else if ((this.title_align == 'begin') ^ this.isTitleRotated()) {\n alt_pos[1] -= off/2;\n alt_pos[2-swap] -= off;\n } else { // end\n alt_pos[swap] += off;\n alt_pos[1] += off/2;\n }\n\n alt_pos[curr_indx] = this.vertical ? acc_y : acc_x;\n\n drag_rect = title_g.append('rect')\n .classed('zoom', true)\n .attr('x', box.x)\n .attr('y', box.y)\n .attr('width', box.width)\n .attr('height', box.height)\n .style('cursor', 'move');\n// .style('pointer-events','none'); // let forward double click to underlying elements\n }).on('drag', evnt => {\n if (!drag_rect) return;\n\n evnt.sourceEvent.preventDefault();\n evnt.sourceEvent.stopPropagation();\n\n acc_x += evnt.dx;\n acc_y += evnt.dy;\n\n let set_x, set_y,\n p = this.vertical ? acc_y : acc_x, besti = 0;\n\n for (let i=1; i<3; ++i)\n if (Math.abs(p - alt_pos[i]) < Math.abs(p - alt_pos[besti])) besti = i;\n\n if (this.vertical) {\n set_x = acc_x;\n set_y = alt_pos[besti];\n } else {\n set_x = alt_pos[besti];\n set_y = acc_y;\n }\n\n new_x = set_x; new_y = set_y; curr_indx = besti;\n title_g.attr('transform', 'translate(' + Math.round(new_x) + ',' + Math.round(new_y) + ')');\n\n }).on('end', evnt => {\n if (!drag_rect) return;\n\n evnt.sourceEvent.preventDefault();\n evnt.sourceEvent.stopPropagation();\n\n let basepos = title_g.property('basepos') || 0;\n\n title_g.property('shift_x', new_x)\n .property('shift_y', new_y);\n\n this.titleOffset = (this.vertical ? basepos - new_x : new_y - basepos) * side;\n\n if (curr_indx == 1) {\n this.titlePos = 'center';\n } else if (curr_indx == 0) {\n this.titlePos = 'left';\n } else {\n this.titlePos = 'right';\n }\n\n this.changeAxisAttr(0, 'title_position', this.titlePos, 'title_offset', this.titleOffset / this.scalingSize);\n\n drag_rect.remove();\n drag_rect = null;\n });\n\n title_g.style('cursor', 'move').call(drag_move);\n }\n\n /** @summary checks if value inside graphical range, taking into account delta */\n isInsideGrRange(pos, delta1, delta2) {\n if (!delta1) delta1 = 0;\n if (delta2 === undefined) delta2 = delta1;\n if (this.gr_range < 0)\n return (pos >= this.gr_range - delta2) && (pos <= delta1);\n return (pos >= -delta1) && (pos <= this.gr_range + delta2);\n }\n\n /** @summary returns graphical range */\n getGrRange(delta) {\n if (!delta) delta = 0;\n if (this.gr_range < 0)\n return this.gr_range - delta;\n return this.gr_range + delta;\n }\n\n /** @summary If axis direction is negative coordinates direction */\n isReverseAxis() {\n return !this.vertical !== (this.getGrRange() > 0);\n }\n\n /** @summary Draw axis ticks\n * @private */\n drawMainLine(axis_g) {\n let ending = '';\n\n if (this.endingSize && this.endingStyle) {\n let sz = (this.gr_range > 0) ? -this.endingSize : this.endingSize,\n sz7 = Math.round(sz*0.7);\n sz = Math.round(sz);\n if (this.vertical)\n ending = `l${sz7},${sz}M0,${this.gr_range}l${-sz7},${sz}`;\n else\n ending = `l${sz},${sz7}M${this.gr_range},0l${sz},${-sz7}`;\n }\n\n axis_g.append('svg:path')\n .attr('d','M0,0' + (this.vertical ? 'v' : 'h') + this.gr_range + ending)\n .call(this.lineatt.func)\n .style('fill', ending ? 'none' : null);\n }\n\n /** @summary Draw axis ticks\n * @return {Object} with gaps on left and right side\n * @private */\n drawTicks(axis_g, side, main_draw) {\n if (main_draw) this.ticks = [];\n\n this.handle.reset();\n\n let res = '', ticks_plusminus = 0;\n if (this.ticksSide == 'both') {\n side = 1;\n ticks_plusminus = 1;\n }\n\n while (this.handle.next(true)) {\n\n let h1 = Math.round(this.ticksSize/4), h2 = 0;\n\n if (this.handle.kind < 3)\n h1 = Math.round(this.ticksSize/2);\n\n let grpos = this.handle.grpos - this.axis_shift;\n\n if ((this.startingSize || this.endingSize) && !this.isInsideGrRange(grpos, -Math.abs(this.startingSize), -Math.abs(this.endingSize))) continue;\n\n if (this.handle.kind == 1) {\n // if not showing labels, not show large tick\n if ((this.kind == 'labels') || (this.format(this.handle.tick,true) !== null)) h1 = this.ticksSize;\n\n if (main_draw) this.ticks.push(grpos); // keep graphical positions of major ticks\n }\n\n if (ticks_plusminus > 0) {\n h2 = -h1;\n } else if (side < 0) {\n h2 = -h1; h1 = 0;\n } else {\n h2 = 0;\n }\n\n res += this.vertical ? `M${h1},${grpos}H${h2}` : `M${grpos},${-h1}V${-h2}`;\n }\n\n if (res)\n axis_g.append('svg:path')\n .attr('d', res)\n .style('stroke', this.ticksColor || this.lineatt.color)\n .style('stroke-width', !this.ticksWidth || (this.ticksWidth == 1) ? null : this.ticksWidth);\n\n let gap0 = Math.round(0.25*this.ticksSize), gap = Math.round(1.25*this.ticksSize);\n return { '-1': (side > 0) || ticks_plusminus ? gap : gap0,\n '1': (side < 0) || ticks_plusminus ? gap : gap0 };\n }\n\n /** @summary Performs labels drawing\n * @return {Promise} with gaps in both direction */\n async drawLabels(axis_g, side, gaps) {\n let center_lbls = this.isCenteredLabels(),\n rotate_lbls = this.labelsFont.angle != 0,\n textscale = 1, maxtextlen = 0, lbls_tilt = false,\n label_g = axis_g.append('svg:g').attr('class','axis_labels').property('side', side),\n lbl_pos = this.handle.lbl_pos || this.handle.major,\n max_lbl_width = 0, max_lbl_height = 0;\n\n // function called when text is drawn to analyze width, required to correctly scale all labels\n function process_drawtext_ready(painter) {\n\n max_lbl_width = Math.max(max_lbl_width, this.result_width);\n max_lbl_height = Math.max(max_lbl_height, this.result_height);\n\n let textwidth = this.result_width;\n\n if (textwidth && ((!painter.vertical && !rotate_lbls) || (painter.vertical && rotate_lbls)) && !painter.log) {\n let maxwidth = this.gap_before*0.45 + this.gap_after*0.45;\n if (!this.gap_before) maxwidth = 0.9*this.gap_after; else\n if (!this.gap_after) maxwidth = 0.9*this.gap_before;\n textscale = Math.min(textscale, maxwidth / textwidth);\n }\n\n if ((textscale > 0.0001) && (textscale < 0.8) && !painter.vertical && !rotate_lbls && (maxtextlen > 5) && (side > 0))\n lbls_tilt = true;\n\n let scale = textscale * (lbls_tilt ? 3 : 1);\n if ((scale > 0.0001) && (scale < 1))\n painter.scaleTextDrawing(1/scale, label_g);\n }\n\n let lastpos = 0,\n fix_offset = Math.round((this.vertical ? -side : side) * this.labelsOffset),\n fix_coord = Math.round((this.vertical ? -side : side) * gaps[side]);\n\n if (fix_offset)\n label_g.attr('transform', this.vertical ? `translate(${fix_offset})` : `translate(0,${fix_offset})`);\n\n label_g.property('fix_offset', fix_offset);\n\n this.startTextDrawing(this.labelsFont, 'font', label_g);\n\n for (let nmajor = 0; nmajor < lbl_pos.length; ++nmajor) {\n\n let lbl = this.format(lbl_pos[nmajor], true);\n if (lbl === null) continue;\n\n let pos = Math.round(this.func(lbl_pos[nmajor])),\n arg = { text: lbl, latex: 1, draw_g: label_g };\n\n arg.gap_before = (nmajor > 0) ? Math.abs(Math.round(pos - this.func(lbl_pos[nmajor-1]))) : 0,\n arg.gap_after = (nmajor < lbl_pos.length-1) ? Math.abs(Math.round(this.func(lbl_pos[nmajor+1])-pos)) : 0;\n\n if (center_lbls) {\n let gap = arg.gap_after || arg.gap_before;\n pos = Math.round(pos - (this.vertical ? 0.5*gap : -0.5*gap));\n if (!this.isInsideGrRange(pos, 5)) continue;\n }\n\n maxtextlen = Math.max(maxtextlen, lbl.length);\n\n pos -= this.axis_shift;\n\n if ((this.startingSize || this.endingSize) && !this.isInsideGrRange(pos, -Math.abs(this.startingSize), -Math.abs(this.endingSize))) continue;\n\n if (this.vertical) {\n arg.x = fix_coord;\n arg.y = pos;\n arg.align = rotate_lbls ? ((side < 0) ? 23 : 20) : ((side < 0) ? 12 : 32);\n } else {\n arg.x = pos;\n arg.y = fix_coord;\n arg.align = rotate_lbls ? ((side < 0) ? 12 : 32) : ((side < 0) ? 20 : 23);\n }\n\n arg.post_process = process_drawtext_ready;\n\n this.drawText(arg);\n\n if (lastpos && (pos!=lastpos) && ((this.vertical && !rotate_lbls) || (!this.vertical && rotate_lbls))) {\n let axis_step = Math.abs(pos-lastpos);\n textscale = Math.min(textscale, 0.9*axis_step/this.labelsFont.size);\n }\n\n lastpos = pos;\n }\n\n if (this.order)\n this.drawText({ x: this.vertical ? side*5 : this.getGrRange(5),\n y: this.has_obstacle ? fix_coord : (this.vertical ? this.getGrRange(3) : -3*side),\n align: this.vertical ? ((side < 0) ? 30 : 10) : ((this.has_obstacle ^ (side < 0)) ? 13 : 10),\n latex: 1,\n text: '#times' + this.formatExp(10, this.order),\n draw_g: label_g\n });\n\n return this.finishTextDrawing(label_g).then(() => {\n\n if (lbls_tilt)\n label_g.selectAll('text').each(function () {\n let txt = d3_select(this), tr = txt.attr('transform');\n txt.attr('transform', tr + ' rotate(25)').style('text-anchor', 'start');\n });\n\n if (this.vertical) {\n gaps[side] += Math.round(rotate_lbls ? 1.2*max_lbl_height : max_lbl_width + 0.4*this.labelsFont.size) - side*fix_offset;\n } else {\n let tilt_height = lbls_tilt ? max_lbl_width * Math.sin(25/180*Math.PI) + max_lbl_height * (Math.cos(25/180*Math.PI) + 0.2) : 0;\n\n gaps[side] += Math.round(Math.max(rotate_lbls ? max_lbl_width + 0.4*this.labelsFont.size : 1.2*max_lbl_height, 1.2*this.labelsFont.size, tilt_height)) + fix_offset;\n }\n\n return gaps;\n });\n }\n\n /** @summary Add zomming rect to axis drawing */\n addZoomingRect(axis_g, side, lgaps) {\n if (settings.Zooming && !this.disable_zooming && !isBatchMode()) {\n let sz = Math.max(lgaps[side], 10),\n d = this.vertical ? `v${this.gr_range}h${-side*sz}v${-this.gr_range}`\n : `h${this.gr_range}v${side*sz}h${-this.gr_range}`;\n axis_g.append('svg:path')\n .attr('d',`M0,0${d}z`)\n .attr('class', 'axis_zoom')\n .style('opacity', '0')\n .style('cursor', 'crosshair');\n }\n }\n\n /** @summary Returns true if axis title is rotated */\n isTitleRotated() {\n return this.titleFont && (this.titleFont.angle != (this.vertical ? 270 : 0));\n }\n\n /** @summary Draw axis title */\n async drawTitle(axis_g, side, lgaps) {\n if (!this.fTitle)\n return this;\n\n let title_g = axis_g.append('svg:g').attr('class', 'axis_title'),\n title_shift_x = 0, title_shift_y = 0, title_basepos = 0;\n\n let rotated = this.isTitleRotated();\n\n this.startTextDrawing(this.titleFont, 'font', title_g);\n\n this.title_align = this.titleCenter ? 'middle' : (this.titleOpposite ^ (this.isReverseAxis() || rotated) ? 'begin' : 'end');\n\n if (this.vertical) {\n title_basepos = Math.round(-side*(lgaps[side]));\n title_shift_x = title_basepos + Math.round(-side*this.titleOffset);\n title_shift_y = Math.round(this.titleCenter ? this.gr_range/2 : (this.titleOpposite ? 0 : this.gr_range));\n this.drawText({ align: [this.title_align, ((side < 0) ^ rotated ? 'top' : 'bottom')],\n text: this.fTitle, draw_g: title_g });\n } else {\n title_shift_x = Math.round(this.titleCenter ? this.gr_range/2 : (this.titleOpposite ? 0 : this.gr_range));\n title_basepos = Math.round(side*lgaps[side]);\n title_shift_y = title_basepos + Math.round(side*this.titleOffset);\n this.drawText({ align: [this.title_align, ((side > 0) ^ rotated ? 'top' : 'bottom')],\n text: this.fTitle, draw_g: title_g });\n }\n\n title_g.attr('transform', `translate(${title_shift_x},${title_shift_y})`)\n .property('basepos', title_basepos)\n .property('shift_x', title_shift_x)\n .property('shift_y', title_shift_y);\n\n this.addTitleDrag(title_g, side);\n\n return this.finishTextDrawing(title_g);\n }\n\n /** @summary Extract major draw attributes, which are also used in interactive operations\n * @private */\n extractDrawAttributes(scalingSize) {\n let pp = this.getPadPainter(),\n rect = pp?.getPadRect() || { width: 10, height: 10 };\n\n this.scalingSize = scalingSize || (this.vertical ? rect.width : rect.height);\n\n this.createv7AttLine('line_');\n\n this.optionUnlab = this.v7EvalAttr('labels_hide', false);\n\n this.endingStyle = this.v7EvalAttr('ending_style', '');\n this.endingSize = Math.round(this.v7EvalLength('ending_size', this.scalingSize, this.endingStyle ? 0.02 : 0));\n this.startingSize = Math.round(this.v7EvalLength('starting_size', this.scalingSize, 0));\n this.ticksSize = this.v7EvalLength('ticks_size', this.scalingSize, 0.02);\n this.ticksSide = this.v7EvalAttr('ticks_side', 'normal');\n this.ticksColor = this.v7EvalColor('ticks_color', '');\n this.ticksWidth = this.v7EvalAttr('ticks_width', 1);\n if (scalingSize && (this.ticksSize < 0))\n this.ticksSize = -this.ticksSize;\n\n this.fTitle = this.v7EvalAttr('title_value', '');\n\n if (this.fTitle) {\n this.titleFont = this.v7EvalFont('title', { size: 0.03 }, scalingSize || pp?.getPadHeight() || 10);\n this.titleFont.roundAngle(180, this.vertical ? 270 : 0);\n\n this.titleOffset = this.v7EvalLength('title_offset', this.scalingSize, 0);\n this.titlePos = this.v7EvalAttr('title_position', 'right');\n this.titleCenter = (this.titlePos == 'center');\n this.titleOpposite = (this.titlePos == 'left');\n } else {\n delete this.titleFont;\n delete this.titleOffset;\n delete this.titlePos;\n }\n\n // TODO: remove old scaling factors for labels and ticks\n this.labelsFont = this.v7EvalFont('labels', { size: scalingSize ? 0.05 : 0.03 });\n this.labelsFont.roundAngle(180);\n if (this.labelsFont.angle) this.labelsFont.angle = 270;\n this.labelsOffset = this.v7EvalLength('labels_offset', this.scalingSize, 0);\n\n if (scalingSize) this.ticksSize = this.labelsFont.size*0.5; // old lego scaling factor\n\n if (this.maxTickSize && (this.ticksSize > this.maxTickSize))\n this.ticksSize = this.maxTickSize;\n }\n\n /** @summary Performs axis drawing\n * @return {Promise} which resolved when drawing is completed */\n async drawAxis(layer, transform, side) {\n let axis_g = layer;\n\n if (side === undefined) side = 1;\n\n if (!this.standalone) {\n axis_g = layer.select('.' + this.name + '_container');\n if (axis_g.empty())\n axis_g = layer.append('svg:g').attr('class', this.name + '_container');\n else\n axis_g.selectAll('*').remove();\n }\n\n axis_g.attr('transform', transform || null);\n\n this.extractDrawAttributes();\n this.axis_g = axis_g;\n this.side = side;\n\n if (this.ticksSide == 'invert') side = -side;\n\n if (this.standalone)\n this.drawMainLine(axis_g);\n\n let optionNoopt = false, // no ticks position optimization\n optionInt = false, // integer labels\n optionNoexp = false; // do not create exp\n\n this.handle = this.createTicks(false, optionNoexp, optionNoopt, optionInt);\n\n // first draw ticks\n let tgaps = this.drawTicks(axis_g, side, true);\n\n // draw labels\n let labelsPromise = this.optionUnlab ? Promise.resolve(tgaps) : this.drawLabels(axis_g, side, tgaps);\n\n return labelsPromise.then(lgaps => {\n // when drawing axis on frame, zoom rect should be always outside\n this.addZoomingRect(axis_g, this.standalone ? side : this.side, lgaps);\n\n return this.drawTitle(axis_g, side, lgaps);\n });\n }\n\n /** @summary Assign handler, which is called when axis redraw by interactive changes\n * @desc Used by palette painter to reassign iteractive handlers\n * @private */\n setAfterDrawHandler(handler) {\n this._afterDrawAgain = handler;\n }\n\n /** @summary Draw axis with the same settings, used by interactive changes */\n drawAxisAgain() {\n if (!this.axis_g || !this.side) return;\n\n this.axis_g.selectAll('*').remove();\n\n this.extractDrawAttributes();\n\n let side = this.side;\n if (this.ticksSide == 'invert') side = -side;\n\n if (this.standalone)\n this.drawMainLine(this.axis_g);\n\n // first draw ticks\n let tgaps = this.drawTicks(this.axis_g, side, false);\n\n let labelsPromise = this.optionUnlab ? Promise.resolve(tgaps) : this.drawLabels(this.axis_g, side, tgaps);\n\n return labelsPromise.then(lgaps => {\n // when drawing axis on frame, zoom rect should be always outside\n this.addZoomingRect(this.axis_g, this.standalone ? side : this.side, lgaps);\n\n return this.drawTitle(this.axis_g, side, lgaps);\n }).then(() => {\n if (isFunc(this._afterDrawAgain))\n this._afterDrawAgain();\n });\n }\n\n /** @summary Draw axis again on opposite frame size */\n drawAxisOtherPlace(layer, transform, side, only_ticks) {\n let axis_g = layer.select('.' + this.name + '_container2');\n if (axis_g.empty())\n axis_g = layer.append('svg:g').attr('class',this.name + '_container2');\n else\n axis_g.selectAll('*').remove();\n\n axis_g.attr('transform', transform || null);\n\n if (this.ticksSide == 'invert') side = -side;\n\n // draw ticks again\n let tgaps = this.drawTicks(axis_g, side, false);\n\n // draw labels again\n let promise = this.optionUnlab || only_ticks ? Promise.resolve(tgaps) : this.drawLabels(axis_g, side, tgaps);\n\n return promise.then(lgaps => {\n this.addZoomingRect(axis_g, side, lgaps);\n return true;\n });\n }\n\n /** @summary Change zooming in standalone mode */\n zoomStandalone(min,max) {\n this.changeAxisAttr(1, 'zoomMin', min, 'zoomMax', max);\n }\n\n /** @summary Redraw axis, used in standalone mode for RAxisDrawable */\n redraw() {\n\n let drawable = this.getObject(),\n pp = this.getPadPainter(),\n pos = pp.getCoordinate(drawable.fPos),\n len = pp.getPadLength(drawable.fVertical, drawable.fLength),\n reverse = this.v7EvalAttr('reverse', false),\n labels_len = drawable.fLabels.length,\n min = (labels_len > 0) ? 0 : this.v7EvalAttr('min', 0),\n max = (labels_len > 0) ? labels_len : this.v7EvalAttr('max', 100);\n\n // in vertical direction axis drawn in negative direction\n if (drawable.fVertical) len -= pp.getPadHeight();\n\n let smin = this.v7EvalAttr('zoomMin'),\n smax = this.v7EvalAttr('zoomMax');\n if (smin === smax) {\n smin = min; smax = max;\n }\n\n this.configureAxis('axis', min, max, smin, smax, drawable.fVertical, undefined, len, { reverse, labels: labels_len > 0 });\n\n this.createG();\n\n this.standalone = true; // no need to clean axis container\n\n let promise = this.drawAxis(this.draw_g, `translate(${pos.x},${pos.y})`);\n\n if (isBatchMode()) return promise;\n\n return promise.then(() => {\n if (settings.ContextMenu)\n this.draw_g.on('contextmenu', evnt => {\n evnt.stopPropagation(); // disable main context menu\n evnt.preventDefault(); // disable browser context menu\n createMenu(evnt, this).then(menu => {\n menu.add('header:RAxisDrawable');\n menu.add('Unzoom', () => this.zoomStandalone());\n this.fillAxisContextMenu(menu, '');\n menu.show();\n });\n });\n\n addDragHandler(this, { x: pos.x, y: pos.y, width: this.vertical ? 10 : len, height: this.vertical ? len : 10,\n only_move: true, redraw: d => this.positionChanged(d) });\n\n this.draw_g.on('dblclick', () => this.zoomStandalone());\n\n if (settings.ZoomWheel)\n this.draw_g.on('wheel', evnt => {\n evnt.stopPropagation();\n evnt.preventDefault();\n\n let pos = d3_pointer(evnt, this.draw_g.node()),\n coord = this.vertical ? (1 - pos[1] / len) : pos[0] / len,\n item = this.analyzeWheelEvent(evnt, coord);\n\n if (item.changed) this.zoomStandalone(item.min, item.max);\n });\n });\n }\n\n /** @summary Process interactive moving of the axis drawing */\n positionChanged(drag) {\n let drawable = this.getObject(),\n rect = this.getPadPainter().getPadRect(),\n xn = drag.x / rect.width,\n yn = 1 - drag.y / rect.height;\n\n drawable.fPos.fHoriz.fArr = [ xn ];\n drawable.fPos.fVert.fArr = [ yn ];\n\n this.submitCanvExec(`SetPos({${xn.toFixed(4)},${yn.toFixed(4)}})`);\n }\n\n /** @summary Change axis attribute, submit changes to server and redraw axis when specified\n * @desc Arguments as redraw_mode, name1, value1, name2, value2, ... */\n changeAxisAttr(redraw_mode) {\n let changes = {}, indx = 1;\n while (indx < arguments.length - 1) {\n this.v7AttrChange(changes, arguments[indx], arguments[indx+1]);\n this.v7SetAttr(arguments[indx], arguments[indx+1]);\n indx += 2;\n }\n this.v7SendAttrChanges(changes, false); // do not invoke canvas update on the server\n if (redraw_mode === 1) {\n if (this.standalone)\n this.redraw();\n else\n this.drawAxisAgain();\n } else if (redraw_mode)\n this.redrawPad();\n }\n\n /** @summary Change axis log scale kind */\n changeAxisLog(arg) {\n if ((this.kind == 'labels') || (this.kind == 'time')) return;\n if (arg === 'toggle') arg = this.log ? 0 : 10;\n\n arg = parseFloat(arg);\n if (Number.isFinite(arg)) this.changeAxisAttr(2, 'log', arg, 'symlog', 0);\n }\n\n /** @summary Provide context menu for axis */\n fillAxisContextMenu(menu, kind) {\n\n if (kind) menu.add('Unzoom', () => this.getFramePainter().unzoom(kind));\n\n menu.add('sub:Log scale', () => this.changeAxisLog('toggle'));\n menu.addchk(!this.log && !this.symlog, 'linear', 0, arg => this.changeAxisLog(arg));\n menu.addchk(this.log && !this.symlog && (this.logbase == 10), 'log10', () => this.changeAxisLog(10));\n menu.addchk(this.log && !this.symlog && (this.logbase == 2), 'log2', () => this.changeAxisLog(2));\n menu.addchk(this.log && !this.symlog && Math.abs(this.logbase - Math.exp(1)) < 0.1, 'ln', () => this.changeAxisLog(Math.exp(1)));\n menu.addchk(!this.log && this.symlog, 'symlog', 0, () =>\n menu.input('set symlog constant', this.symlog || 10, 'float').then(v => this.changeAxisAttr(2,'symlog', v)));\n menu.add('endsub:');\n\n menu.add('Divisions', () => menu.input('Set axis devisions', this.v7EvalAttr('ndiv', 508), 'int').then(val => this.changeAxisAttr(2, 'ndiv', val)));\n\n menu.add('sub:Ticks');\n menu.addRColorMenu('color', this.ticksColor, col => this.changeAxisAttr(1, 'ticks_color', col));\n menu.addSizeMenu('size', 0, 0.05, 0.01, this.ticksSize/this.scalingSize, sz => this.changeAxisAttr(1, 'ticks_size', sz));\n menu.addSelectMenu('side', ['normal', 'invert', 'both'], this.ticksSide, side => this.changeAxisAttr(1, 'ticks_side', side));\n menu.add('endsub:');\n\n if (!this.optionUnlab && this.labelsFont) {\n menu.add('sub:Labels');\n menu.addSizeMenu('offset', -0.05, 0.05, 0.01, this.labelsOffset/this.scalingSize,\n offset => this.changeAxisAttr(1, 'labels_offset', offset));\n menu.addRAttrTextItems(this.labelsFont, { noangle: 1, noalign: 1 },\n change => this.changeAxisAttr(1, 'labels_' + change.name, change.value));\n menu.addchk(this.labelsFont.angle, 'rotate', res => this.changeAxisAttr(1, 'labels_angle', res ? 180 : 0));\n menu.add('endsub:');\n }\n\n menu.add('sub:Title', () => menu.input('Enter axis title', this.fTitle).then(t => this.changeAxisAttr(1, 'title_value', t)));\n\n if (this.fTitle) {\n menu.addSizeMenu('offset', -0.05, 0.05, 0.01, this.titleOffset/this.scalingSize,\n offset => this.changeAxisAttr(1, 'title_offset', offset));\n\n menu.addSelectMenu('position', ['left', 'center', 'right'], this.titlePos,\n pos => this.changeAxisAttr(1, 'title_position', pos));\n\n menu.addchk(this.isTitleRotated(), 'rotate', flag => this.changeAxisAttr(1, 'title_angle', flag ? 180 : 0));\n\n menu.addRAttrTextItems(this.titleFont, { noangle: 1, noalign: 1 }, change => this.changeAxisAttr(1, 'title_' + change.name, change.value));\n }\n\n menu.add('endsub:');\n return true;\n }\n\n} // class RAxisPainter\n\nexport { RAxisPainter };\n","import { gStyle, settings, create, isBatchMode, isFunc, isStr, clTAxis } from '../core.mjs';\nimport { pointer as d3_pointer } from '../d3.mjs';\nimport { getSvgLineStyle } from '../base/TAttLineHandler.mjs';\nimport { TAxisPainter } from './TAxisPainter.mjs';\nimport { RAxisPainter } from './RAxisPainter.mjs';\nimport { FrameInteractive } from './TFramePainter.mjs';\nimport { RObjectPainter } from '../base/RObjectPainter.mjs';\n\n\n/**\n * @summary Painter class for RFrame, main handler for interactivity\n *\n * @private\n */\n\nclass RFramePainter extends RObjectPainter {\n\n /** @summary constructor\n * @param {object|string} dom - DOM element for drawing or element id\n * @param {object} tframe - RFrame object */\n constructor(dom, tframe) {\n super(dom, tframe, '', 'frame');\n this.mode3d = false;\n this.xmin = this.xmax = 0; // no scale specified, wait for objects drawing\n this.ymin = this.ymax = 0; // no scale specified, wait for objects drawing\n this.axes_drawn = false;\n this.keys_handler = null;\n this.projection = 0; // different projections\n this.v7_frame = true; // indicator of v7, used in interactive part\n }\n\n /** @summary Returns frame painter - object itself */\n getFramePainter() { return this; }\n\n /** @summary Returns true if it is ROOT6 frame\n * @private */\n is_root6() { return false; }\n\n /** @summary Set active flag for frame - can block some events\n * @private */\n setFrameActive(on) {\n this.enabledKeys = on && settings.HandleKeys ? true : false;\n // used only in 3D mode\n if (this.control)\n this.control.enableKeys = this.enabledKeys;\n }\n\n setLastEventPos(pnt) {\n // set position of last context menu event, can be\n this.fLastEventPnt = pnt;\n }\n\n getLastEventPos() {\n // return position of last event\n return this.fLastEventPnt;\n }\n\n /** @summary Update graphical attributes */\n updateAttributes(force) {\n if ((this.fX1NDC === undefined) || (force && !this.modified_NDC)) {\n\n let rect = this.getPadPainter().getPadRect();\n this.fX1NDC = this.v7EvalLength('margins_left', rect.width, settings.FrameNDC.fX1NDC) / rect.width;\n this.fY1NDC = this.v7EvalLength('margins_bottom', rect.height, settings.FrameNDC.fY1NDC) / rect.height;\n this.fX2NDC = 1 - this.v7EvalLength('margins_right', rect.width, 1-settings.FrameNDC.fX2NDC) / rect.width;\n this.fY2NDC = 1 - this.v7EvalLength('margins_top', rect.height, 1-settings.FrameNDC.fY2NDC) / rect.height;\n }\n\n if (!this.fillatt)\n this.createv7AttFill();\n\n this.createv7AttLine('border_');\n }\n\n /** @summary Returns coordinates transformation func */\n getProjectionFunc() {\n switch (this.projection) {\n // Aitoff2xy\n case 1: return (l, b) => {\n const DegToRad = Math.PI/180,\n alpha2 = (l/2)*DegToRad,\n delta = b*DegToRad,\n r2 = Math.sqrt(2),\n f = 2*r2/Math.PI,\n cdec = Math.cos(delta),\n denom = Math.sqrt(1. + cdec*Math.cos(alpha2));\n return {\n x: cdec*Math.sin(alpha2)*2.*r2/denom/f/DegToRad,\n y: Math.sin(delta)*r2/denom/f/DegToRad\n };\n };\n // mercator\n case 2: return (l, b) => { return { x: l, y: Math.log(Math.tan((Math.PI/2 + b/180*Math.PI)/2)) }; };\n // sinusoidal\n case 3: return (l, b) => { return { x: l*Math.cos(b/180*Math.PI), y: b } };\n // parabolic\n case 4: return (l, b) => { return { x: l*(2.*Math.cos(2*b/180*Math.PI/3) - 1), y: 180*Math.sin(b/180*Math.PI/3) }; };\n }\n }\n\n /** @summary Rcalculate frame ranges using specified projection functions\n * @desc Not yet used in v7 */\n recalculateRange(Proj) {\n this.projection = Proj || 0;\n\n if ((this.projection == 2) && ((this.scale_ymin <= -90 || this.scale_ymax >=90))) {\n console.warn(`Mercator Projection: latitude out of range ${this.scale_ymin} ${this.scale_ymax}`);\n this.projection = 0;\n }\n\n let func = this.getProjectionFunc();\n if (!func) return;\n\n let pnts = [ func(this.scale_xmin, this.scale_ymin),\n func(this.scale_xmin, this.scale_ymax),\n func(this.scale_xmax, this.scale_ymax),\n func(this.scale_xmax, this.scale_ymin) ];\n if (this.scale_xmin < 0 && this.scale_xmax > 0) {\n pnts.push(func(0, this.scale_ymin));\n pnts.push(func(0, this.scale_ymax));\n }\n if (this.scale_ymin < 0 && this.scale_ymax > 0) {\n pnts.push(func(this.scale_xmin, 0));\n pnts.push(func(this.scale_xmax, 0));\n }\n\n this.original_xmin = this.scale_xmin;\n this.original_xmax = this.scale_xmax;\n this.original_ymin = this.scale_ymin;\n this.original_ymax = this.scale_ymax;\n\n this.scale_xmin = this.scale_xmax = pnts[0].x;\n this.scale_ymin = this.scale_ymax = pnts[0].y;\n\n for (let n = 1; n < pnts.length; ++n) {\n this.scale_xmin = Math.min(this.scale_xmin, pnts[n].x);\n this.scale_xmax = Math.max(this.scale_xmax, pnts[n].x);\n this.scale_ymin = Math.min(this.scale_ymin, pnts[n].y);\n this.scale_ymax = Math.max(this.scale_ymax, pnts[n].y);\n }\n }\n\n /** @summary Draw axes grids\n * @desc Called immediately after axes drawing */\n drawGrids() {\n let layer = this.getFrameSvg().select('.grid_layer');\n\n layer.selectAll('.xgrid').remove();\n layer.selectAll('.ygrid').remove();\n\n let h = this.getFrameHeight(),\n w = this.getFrameWidth(),\n gridx = this.v7EvalAttr('gridX', false),\n gridy = this.v7EvalAttr('gridY', false),\n grid_style = getSvgLineStyle(gStyle.fGridStyle),\n grid_color = (gStyle.fGridColor > 0) ? this.getColor(gStyle.fGridColor) : 'black';\n\n if (this.x_handle)\n this.x_handle.draw_grid = gridx;\n\n // add a grid on x axis, if the option is set\n if (this.x_handle && this.x_handle.draw_grid) {\n let grid = '';\n for (let n = 0; n < this.x_handle.ticks.length; ++n)\n if (this.swap_xy)\n grid += `M0,${h+this.x_handle.ticks[n]}h${w}`;\n else\n grid += `M${this.x_handle.ticks[n]},0v${h}`;\n\n if (grid)\n layer.append('svg:path')\n .attr('class', 'xgrid')\n .attr('d', grid)\n .style('stroke',grid_color)\n .style('stroke-width', gStyle.fGridWidth)\n .style('stroke-dasharray', grid_style);\n }\n\n if (this.y_handle)\n this.y_handle.draw_grid = gridy;\n\n // add a grid on y axis, if the option is set\n if (this.y_handle && this.y_handle.draw_grid) {\n let grid = '';\n for (let n = 0; n < this.y_handle.ticks.length; ++n)\n if (this.swap_xy)\n grid += `M${this.y_handle.ticks[n]},0v${h}`;\n else\n grid += `M0,${h+this.y_handle.ticks[n]}h${w}`;\n\n if (grid)\n layer.append('svg:path')\n .attr('class', 'ygrid')\n .attr('d', grid)\n .style('stroke', grid_color)\n .style('stroke-width', gStyle.fGridWidth)\n .style('stroke-dasharray', grid_style);\n }\n }\n\n /** @summary Converts 'raw' axis value into text */\n axisAsText(axis, value) {\n let handle = this[axis+'_handle'];\n\n if (handle)\n return handle.axisAsText(value, settings[axis.toUpperCase() + 'ValuesFormat']);\n\n return value.toPrecision(4);\n }\n\n /** @summary Set axix range */\n _setAxisRange(prefix, vmin, vmax) {\n let nmin = prefix + 'min', nmax = prefix + 'max';\n if (this[nmin] != this[nmax]) return;\n let min = this.v7EvalAttr(prefix + '_min'),\n max = this.v7EvalAttr(prefix + '_max');\n\n if (min !== undefined) vmin = min;\n if (max !== undefined) vmax = max;\n\n if (vmin < vmax) {\n this[nmin] = vmin;\n this[nmax] = vmax;\n }\n\n let nzmin = 'zoom_' + prefix + 'min', nzmax = 'zoom_' + prefix + 'max';\n\n if ((this[nzmin] == this[nzmax]) && !this.zoomChangedInteractive(prefix)) {\n min = this.v7EvalAttr(prefix + '_zoomMin');\n max = this.v7EvalAttr(prefix + '_zoomMax');\n\n if ((min !== undefined) || (max !== undefined)) {\n this[nzmin] = (min === undefined) ? this[nmin] : min;\n this[nzmax] = (max === undefined) ? this[nmax] : max;\n }\n }\n }\n\n /** @summary Set axes ranges for drawing, check configured attributes if range already specified */\n setAxesRanges(xaxis, xmin, xmax, yaxis, ymin, ymax, zaxis, zmin, zmax) {\n if (this.axes_drawn) return;\n this.xaxis = xaxis;\n this._setAxisRange('x', xmin, xmax);\n this.yaxis = yaxis;\n this._setAxisRange('y', ymin, ymax);\n this.zaxis = zaxis;\n this._setAxisRange('z', zmin, zmax);\n }\n\n /** @summary Set secondary axes ranges */\n setAxes2Ranges(second_x, xaxis, xmin, xmax, second_y, yaxis, ymin, ymax) {\n if (second_x) {\n this.x2axis = xaxis;\n this._setAxisRange('x2', xmin, xmax);\n }\n if (second_y) {\n this.y2axis = yaxis;\n this._setAxisRange('y2', ymin, ymax);\n }\n }\n\n /** @summary Create x,y objects which maps user coordinates into pixels\n * @desc Must be used only for v6 objects, see TFramePainter for more details\n * @private */\n createXY(opts) {\n if (this.self_drawaxes) return;\n\n this.cleanXY(); // remove all previous configurations\n\n if (!opts) opts = {};\n\n this.v6axes = true;\n this.swap_xy = opts.swap_xy || false;\n this.reverse_x = opts.reverse_x || false;\n this.reverse_y = opts.reverse_y || false;\n\n this.logx = this.v7EvalAttr('x_log', 0);\n this.logy = this.v7EvalAttr('y_log', 0);\n\n let w = this.getFrameWidth(), h = this.getFrameHeight();\n\n this.scale_xmin = this.xmin;\n this.scale_xmax = this.xmax;\n\n this.scale_ymin = this.ymin;\n this.scale_ymax = this.ymax;\n\n if (opts.extra_y_space) {\n let log_scale = this.swap_xy ? this.logx : this.logy;\n if (log_scale && (this.scale_ymax > 0))\n this.scale_ymax = Math.exp(Math.log(this.scale_ymax)*1.1);\n else\n this.scale_ymax += (this.scale_ymax - this.scale_ymin)*0.1;\n }\n\n // if (opts.check_pad_range) {\n // take zooming out of pad or axis attributes - skip!\n // }\n\n if ((this.zoom_ymin == this.zoom_ymax) && (opts.zoom_ymin != opts.zoom_ymax) && !this.zoomChangedInteractive('y')) {\n this.zoom_ymin = opts.zoom_ymin;\n this.zoom_ymax = opts.zoom_ymax;\n }\n\n if (this.zoom_xmin != this.zoom_xmax) {\n this.scale_xmin = this.zoom_xmin;\n this.scale_xmax = this.zoom_xmax;\n }\n\n if (this.zoom_ymin != this.zoom_ymax) {\n this.scale_ymin = this.zoom_ymin;\n this.scale_ymax = this.zoom_ymax;\n }\n\n let xaxis = this.xaxis, yaxis = this.yaxis;\n if (xaxis?._typename != clTAxis) xaxis = create(clTAxis);\n if (yaxis?._typename != clTAxis) yaxis = create(clTAxis);\n\n this.x_handle = new TAxisPainter(this.getDom(), xaxis, true);\n this.x_handle.setPadName(this.getPadName());\n this.x_handle.optionUnlab = this.v7EvalAttr('x_labels_hide', false);\n\n this.x_handle.configureAxis('xaxis', this.xmin, this.xmax, this.scale_xmin, this.scale_xmax, this.swap_xy, this.swap_xy ? [0,h] : [0,w],\n { reverse: this.reverse_x,\n log: this.swap_xy ? this.logy : this.logx,\n symlog: this.swap_xy ? opts.symlog_y : opts.symlog_x,\n logcheckmin: this.swap_xy,\n logminfactor: 0.0001 });\n\n this.x_handle.assignFrameMembers(this,'x');\n\n this.y_handle = new TAxisPainter(this.getDom(), yaxis, true);\n this.y_handle.setPadName(this.getPadName());\n this.y_handle.optionUnlab = this.v7EvalAttr('y_labels_hide', false);\n\n this.y_handle.configureAxis('yaxis', this.ymin, this.ymax, this.scale_ymin, this.scale_ymax, !this.swap_xy, this.swap_xy ? [0,w] : [0,h],\n { reverse: this.reverse_y,\n log: this.swap_xy ? this.logx : this.logy,\n symlog: this.swap_xy ? opts.symlog_x : opts.symlog_y,\n logcheckmin: (opts.ndim < 2) || this.swap_xy,\n log_min_nz: opts.ymin_nz && (opts.ymin_nz < 0.01*this.ymax) ? 0.3 * opts.ymin_nz : 0,\n logminfactor: 3e-4 });\n\n this.y_handle.assignFrameMembers(this,'y');\n }\n\n /** @summary Identify if requested axes are drawn\n * @desc Checks if x/y axes are drawn. Also if second side is already there */\n hasDrawnAxes(second_x, second_y) {\n return !second_x && !second_y ? this.axes_drawn : false;\n }\n\n /** @summary Draw configured axes on the frame\n * @desc axes can be drawn only for main histogram */\n async drawAxes() {\n\n if (this.axes_drawn || (this.xmin == this.xmax) || (this.ymin == this.ymax))\n return this.axes_drawn;\n\n let ticksx = this.v7EvalAttr('ticksX', 1),\n ticksy = this.v7EvalAttr('ticksY', 1),\n sidex = 1, sidey = 1;\n\n if (this.v7EvalAttr('swapX', false)) sidex = -1;\n if (this.v7EvalAttr('swapY', false)) sidey = -1;\n\n let w = this.getFrameWidth(), h = this.getFrameHeight();\n\n if (!this.v6axes) {\n // this is partially same as v6 createXY method\n\n this.cleanupAxes();\n\n this.swap_xy = false;\n\n if (this.zoom_xmin != this.zoom_xmax) {\n this.scale_xmin = this.zoom_xmin;\n this.scale_xmax = this.zoom_xmax;\n } else {\n this.scale_xmin = this.xmin;\n this.scale_xmax = this.xmax;\n }\n\n if (this.zoom_ymin != this.zoom_ymax) {\n this.scale_ymin = this.zoom_ymin;\n this.scale_ymax = this.zoom_ymax;\n } else {\n this.scale_ymin = this.ymin;\n this.scale_ymax = this.ymax;\n }\n\n this.recalculateRange(0);\n\n this.x_handle = new RAxisPainter(this.getDom(), this, this.xaxis, 'x_');\n this.x_handle.setPadName(this.getPadName());\n this.x_handle.snapid = this.snapid;\n this.x_handle.draw_swapside = (sidex < 0);\n this.x_handle.draw_ticks = ticksx;\n\n this.y_handle = new RAxisPainter(this.getDom(), this, this.yaxis, 'y_');\n this.y_handle.setPadName(this.getPadName());\n this.y_handle.snapid = this.snapid;\n this.y_handle.draw_swapside = (sidey < 0);\n this.y_handle.draw_ticks = ticksy;\n\n this.z_handle = new RAxisPainter(this.getDom(), this, this.zaxis, 'z_');\n this.z_handle.setPadName(this.getPadName());\n this.z_handle.snapid = this.snapid;\n\n this.x_handle.configureAxis('xaxis', this.xmin, this.xmax, this.scale_xmin, this.scale_xmax, false, [0,w], w, { reverse: false });\n this.x_handle.assignFrameMembers(this,'x');\n\n this.y_handle.configureAxis('yaxis', this.ymin, this.ymax, this.scale_ymin, this.scale_ymax, true, [h,0], -h, { reverse: false });\n this.y_handle.assignFrameMembers(this,'y');\n\n // only get basic properties like log scale\n this.z_handle.configureZAxis('zaxis', this);\n }\n\n let layer = this.getFrameSvg().select('.axis_layer');\n\n this.x_handle.has_obstacle = false;\n\n let draw_horiz = this.swap_xy ? this.y_handle : this.x_handle,\n draw_vertical = this.swap_xy ? this.x_handle : this.y_handle,\n pp = this.getPadPainter(), pr;\n\n if (pp?._fast_drawing) {\n pr = Promise.resolve(true); // do nothing\n } else if (this.v6axes) {\n\n // in v7 ticksx/y values shifted by 1 relative to v6\n // In v7 ticksx == 0 means no ticks, ticksx == 1 equivalent to == 0 in v6\n\n let can_adjust_frame = false, disable_x_draw = false, disable_y_draw = false;\n\n draw_horiz.disable_ticks = (ticksx <= 0);\n draw_vertical.disable_ticks = (ticksy <= 0);\n\n let pr1 = draw_horiz.drawAxis(layer, w, h,\n draw_horiz.invert_side ? undefined : `translate(0,${h})`,\n (ticksx > 1) ? -h : 0, disable_x_draw,\n undefined, false);\n\n let pr2 = draw_vertical.drawAxis(layer, w, h,\n draw_vertical.invert_side ? `translate(${w})` : undefined,\n (ticksy > 1) ? w : 0, disable_y_draw,\n draw_vertical.invert_side ? 0 : this._frame_x, can_adjust_frame);\n\n pr = Promise.all([pr1,pr2]).then(() => this.drawGrids());\n\n } else {\n\n let arr = [];\n\n if (ticksx > 0)\n arr.push(draw_horiz.drawAxis(layer, (sidex > 0) ? `translate(0,${h})` : '', sidex));\n\n if (ticksy > 0)\n arr.push(draw_vertical.drawAxis(layer, (sidey > 0) ? `translate(0,${h})` : `translate(${w},${h})`, sidey));\n\n pr = Promise.all(arr).then(() => {\n arr = [];\n if (ticksx > 1)\n arr.push(draw_horiz.drawAxisOtherPlace(layer, (sidex < 0) ? `translate(0,${h})` : '', -sidex, ticksx == 2));\n\n if (ticksy > 1)\n arr.push(draw_vertical.drawAxisOtherPlace(layer, (sidey < 0) ? `translate(0,${h})` : `translate(${w},${h})`, -sidey, ticksy == 2));\n return Promise.all(arr);\n }).then(() => this.drawGrids());\n }\n\n return pr.then(() => {\n this.axes_drawn = true;\n return true;\n });\n }\n\n /** @summary Draw secondary configuread axes */\n drawAxes2(second_x, second_y) {\n let w = this.getFrameWidth(), h = this.getFrameHeight(),\n layer = this.getFrameSvg().select('.axis_layer'),\n pr1, pr2;\n\n if (second_x) {\n if (this.zoom_x2min != this.zoom_x2max) {\n this.scale_x2min = this.zoom_x2min;\n this.scale_x2max = this.zoom_x2max;\n } else {\n this.scale_x2min = this.x2min;\n this.scale_x2max = this.x2max;\n }\n this.x2_handle = new RAxisPainter(this.getDom(), this, this.x2axis, 'x2_');\n this.x2_handle.setPadName(this.getPadName());\n this.x2_handle.snapid = this.snapid;\n\n this.x2_handle.configureAxis('x2axis', this.x2min, this.x2max, this.scale_x2min, this.scale_x2max, false, [0,w], w, { reverse: false });\n this.x2_handle.assignFrameMembers(this,'x2');\n\n pr1 = this.x2_handle.drawAxis(layer, '', -1);\n }\n\n if (second_y) {\n if (this.zoom_y2min != this.zoom_y2max) {\n this.scale_y2min = this.zoom_y2min;\n this.scale_y2max = this.zoom_y2max;\n } else {\n this.scale_y2min = this.y2min;\n this.scale_y2max = this.y2max;\n }\n\n this.y2_handle = new RAxisPainter(this.getDom(), this, this.y2axis, 'y2_');\n this.y2_handle.setPadName(this.getPadName());\n this.y2_handle.snapid = this.snapid;\n\n this.y2_handle.configureAxis('y2axis', this.y2min, this.y2max, this.scale_y2min, this.scale_y2max, true, [h,0], -h, { reverse: false });\n this.y2_handle.assignFrameMembers(this,'y2');\n\n pr2 = this.y2_handle.drawAxis(layer, `translate(${w},${h})`, -1);\n }\n\n return Promise.all([pr1,pr2]);\n }\n\n /** @summary Return functions to create x/y points based on coordinates\n * @desc In default case returns frame painter itself\n * @private */\n getGrFuncs(second_x, second_y) {\n let use_x2 = second_x && this.grx2,\n use_y2 = second_y && this.gry2;\n if (!use_x2 && !use_y2) return this;\n\n return {\n use_x2: use_x2,\n grx: use_x2 ? this.grx2 : this.grx,\n x_handle: use_x2 ? this.x2_handle : this.x_handle,\n logx: use_x2 ? this.x2_handle.log : this.x_handle.log,\n scale_xmin: use_x2 ? this.scale_x2min : this.scale_xmin,\n scale_xmax: use_x2 ? this.scale_x2max : this.scale_xmax,\n use_y2: use_y2,\n gry: use_y2 ? this.gry2 : this.gry,\n y_handle: use_y2 ? this.y2_handle : this.y_handle,\n logy: use_y2 ? this.y2_handle.log : this.y_handle.log,\n scale_ymin: use_y2 ? this.scale_y2min : this.scale_ymin,\n scale_ymax: use_y2 ? this.scale_y2max : this.scale_ymax,\n swap_xy: this.swap_xy,\n fp: this,\n revertAxis(name, v) {\n if ((name == 'x') && this.use_x2) name = 'x2';\n if ((name == 'y') && this.use_y2) name = 'y2';\n return this.fp.revertAxis(name, v);\n },\n axisAsText(name, v) {\n if ((name == 'x') && this.use_x2) name = 'x2';\n if ((name == 'y') && this.use_y2) name = 'y2';\n return this.fp.axisAsText(name, v);\n }\n };\n }\n\n /** @summary function called at the end of resize of frame\n * @desc Used to update attributes on the server\n * @private */\n sizeChanged() {\n\n let changes = {};\n this.v7AttrChange(changes, 'margins_left', this.fX1NDC);\n this.v7AttrChange(changes, 'margins_bottom', this.fY1NDC);\n this.v7AttrChange(changes, 'margins_right', 1 - this.fX2NDC);\n this.v7AttrChange(changes, 'margins_top', 1 - this.fY2NDC);\n this.v7SendAttrChanges(changes, false); // do not invoke canvas update on the server\n\n this.redrawPad();\n }\n\n /** @summary Remove all x/y functions\n * @private */\n cleanXY() {\n // remove all axes drawings\n let clean = (name,grname) => {\n if (this[name]) {\n this[name].cleanup();\n delete this[name];\n }\n delete this[grname];\n };\n\n clean('x_handle', 'grx');\n clean('y_handle', 'gry');\n clean('z_handle', 'grz');\n clean('x2_handle', 'grx2');\n clean('y2_handle', 'gry2');\n\n delete this.v6axes; // marker that v6 axes are used\n }\n\n /** @summary Remove all axes drawings\n * @private */\n cleanupAxes() {\n this.cleanXY();\n\n if (this.draw_g) {\n this.draw_g.select('.grid_layer').selectAll('*').remove();\n this.draw_g.select('.axis_layer').selectAll('*').remove();\n }\n this.axes_drawn = false;\n }\n\n /** @summary Removes all drawn elements of the frame\n * @private */\n cleanFrameDrawings() {\n // cleanup all 3D drawings if any\n if (isFunc(this.create3DScene))\n this.create3DScene(-1);\n\n this.cleanupAxes();\n\n let clean = (name) => {\n this[name+'min'] = this[name+'max'] = 0;\n this[`zoom_${name}min`] = this[`zoom_${name}max`] = 0;\n this[`scale_${name}min`] = this[`scale_${name}max`] = 0;\n };\n\n clean('x');\n clean('y');\n clean('z');\n clean('x2');\n clean('y2');\n\n if (this.draw_g) {\n this.draw_g.select('.main_layer').selectAll('*').remove();\n this.draw_g.select('.upper_layer').selectAll('*').remove();\n }\n }\n\n /** @summary Fully cleanup frame\n * @private */\n cleanup() {\n\n this.cleanFrameDrawings();\n\n if (this.draw_g) {\n this.draw_g.selectAll('*').remove();\n this.draw_g.on('mousedown', null)\n .on('dblclick', null)\n .on('wheel', null)\n .on('contextmenu', null)\n .property('interactive_set', null);\n }\n\n if (this.keys_handler) {\n window.removeEventListener('keydown', this.keys_handler, false);\n this.keys_handler = null;\n }\n delete this.enabledKeys;\n delete this.self_drawaxes;\n\n delete this.xaxis;\n delete this.yaxis;\n delete this.zaxis;\n delete this.x2axis;\n delete this.y2axis;\n\n delete this.draw_g; // frame element managet by the pad\n\n delete this._click_handler;\n delete this._dblclick_handler;\n\n let pp = this.getPadPainter();\n if (pp?.frame_painter_ref === this)\n delete pp.frame_painter_ref;\n\n super.cleanup();\n }\n\n /** @summary Redraw frame\n * @private */\n redraw() {\n\n let pp = this.getPadPainter();\n if (pp) pp.frame_painter_ref = this;\n\n // first update all attributes from objects\n this.updateAttributes();\n\n let rect = pp?.getPadRect() ?? { width: 10, height: 10 },\n lm = Math.round(rect.width * this.fX1NDC),\n w = Math.round(rect.width * (this.fX2NDC - this.fX1NDC)),\n tm = Math.round(rect.height * (1 - this.fY2NDC)),\n h = Math.round(rect.height * (this.fY2NDC - this.fY1NDC)),\n rotate = false, fixpos = false, trans;\n\n if (pp?.options) {\n if (pp.options.RotateFrame) rotate = true;\n if (pp.options.FixFrame) fixpos = true;\n }\n\n if (rotate) {\n trans = `rotate(-90,${lm},${tm}) translate(${lm-h},${tm})`;\n [w, h] = [h, w];\n } else {\n trans = `translate(${lm},${tm})`;\n }\n\n // update values here to let access even when frame is not really updated\n this._frame_x = lm;\n this._frame_y = tm;\n this._frame_width = w;\n this._frame_height = h;\n this._frame_rotate = rotate;\n this._frame_fixpos = fixpos;\n\n if (this.mode3d) return this; // no need for real draw in mode3d\n\n // this is svg:g object - container for every other items belonging to frame\n this.draw_g = this.getFrameSvg();\n\n let top_rect, main_svg;\n\n if (this.draw_g.empty()) {\n\n this.draw_g = this.getLayerSvg('primitives_layer').append('svg:g').attr('class', 'root_frame');\n\n if (!isBatchMode())\n this.draw_g.append('svg:title').text('');\n\n top_rect = this.draw_g.append('svg:rect');\n\n // append for the moment three layers - for drawing and axis\n this.draw_g.append('svg:g').attr('class','grid_layer');\n\n main_svg = this.draw_g.append('svg:svg')\n .attr('class','main_layer')\n .attr('x', 0)\n .attr('y', 0)\n .attr('overflow', 'hidden');\n\n this.draw_g.append('svg:g').attr('class','axis_layer');\n this.draw_g.append('svg:g').attr('class','upper_layer');\n } else {\n top_rect = this.draw_g.select('rect');\n main_svg = this.draw_g.select('.main_layer');\n }\n\n this.axes_drawn = false;\n\n this.draw_g.attr('transform', trans);\n\n top_rect.attr('x', 0)\n .attr('y', 0)\n .attr('width', w)\n .attr('height', h)\n .attr('rx', this.lineatt.rx || null)\n .attr('ry', this.lineatt.ry || null)\n .call(this.fillatt.func)\n .call(this.lineatt.func);\n\n main_svg.attr('width', w)\n .attr('height', h)\n .attr('viewBox', `0 0 ${w} ${h}`);\n\n let pr = Promise.resolve(true);\n\n if (this.v7EvalAttr('drawAxes')) {\n this.self_drawaxes = true;\n this.setAxesRanges();\n pr = this.drawAxes().then(() => this.addInteractivity());\n }\n\n return pr.then(() => {\n if (!isBatchMode()) {\n top_rect.style('pointer-events', 'visibleFill'); // let process mouse events inside frame\n\n FrameInteractive.assign(this);\n this.addBasicInteractivity();\n }\n\n return this;\n });\n }\n\n /** @summary Returns frame width */\n getFrameWidth() { return this._frame_width || 0; }\n\n /** @summary Returns frame height */\n getFrameHeight() { return this._frame_height || 0; }\n\n /** @summary Returns frame rectangle plus extra info for hint display */\n getFrameRect() {\n return {\n x: this._frame_x || 0,\n y: this._frame_y || 0,\n width: this.getFrameWidth(),\n height: this.getFrameHeight(),\n transform: this.draw_g ? this.draw_g.attr('transform') : '',\n hint_delta_x: 0,\n hint_delta_y: 0\n }\n }\n\n /** @summary Returns palette associated with frame */\n getHistPalette() {\n return this.getPadPainter().getHistPalette();\n }\n\n /** @summary Configure user-defined click handler\n * @desc Function will be called every time when frame click was perfromed\n * As argument, tooltip object with selected bins will be provided\n * If handler function returns true, default handling of click will be disabled */\n configureUserClickHandler(handler) {\n this._click_handler = isFunc(handler) ? handler : null;\n }\n\n /** @summary Configure user-defined dblclick handler\n * @desc Function will be called every time when double click was called\n * As argument, tooltip object with selected bins will be provided\n * If handler function returns true, default handling of dblclick (unzoom) will be disabled */\n configureUserDblclickHandler(handler) {\n this._dblclick_handler = isFunc(handler) ? handler : null;\n }\n\n /** @summary function can be used for zooming into specified range\n * @desc if both limits for each axis 0 (like xmin == xmax == 0), axis will be unzoomed\n * @return {Promise} with boolean flag if zoom operation was performed */\n async zoom(xmin, xmax, ymin, ymax, zmin, zmax) {\n\n // disable zooming when axis conversion is enabled\n if (this.projection) return false;\n\n if (xmin === 'x') { xmin = xmax; xmax = ymin; ymin = undefined; } else\n if (xmin === 'y') { ymax = ymin; ymin = xmax; xmin = xmax = undefined; } else\n if (xmin === 'z') { zmin = xmax; zmax = ymin; xmin = xmax = ymin = undefined; }\n\n let zoom_x = (xmin !== xmax), zoom_y = (ymin !== ymax), zoom_z = (zmin !== zmax),\n unzoom_x = false, unzoom_y = false, unzoom_z = false;\n\n if (zoom_x) {\n let cnt = 0;\n if (xmin <= this.xmin) { xmin = this.xmin; cnt++; }\n if (xmax >= this.xmax) { xmax = this.xmax; cnt++; }\n if (cnt === 2) { zoom_x = false; unzoom_x = true; }\n } else {\n unzoom_x = (xmin === xmax) && (xmin === 0);\n }\n\n if (zoom_y) {\n let cnt = 0;\n if (ymin <= this.ymin) { ymin = this.ymin; cnt++; }\n if (ymax >= this.ymax) { ymax = this.ymax; cnt++; }\n if (cnt === 2) { zoom_y = false; unzoom_y = true; }\n } else {\n unzoom_y = (ymin === ymax) && (ymin === 0);\n }\n\n if (zoom_z) {\n let cnt = 0;\n // if (this.logz && this.ymin_nz && this.getDimension()===2) main_zmin = 0.3*this.ymin_nz;\n if (zmin <= this.zmin) { zmin = this.zmin; cnt++; }\n if (zmax >= this.zmax) { zmax = this.zmax; cnt++; }\n if (cnt === 2) { zoom_z = false; unzoom_z = true; }\n } else {\n unzoom_z = (zmin === zmax) && (zmin === 0);\n }\n\n let changed = false,\n r_x = '', r_y = '', r_z = '', is_any_check = false,\n req = {\n _typename: 'ROOT::Experimental::RFrame::RUserRanges',\n values: [0, 0, 0, 0, 0, 0],\n flags: [false, false, false, false, false, false]\n };\n\n const checkZooming = (painter, force) => {\n if (!force && !isFunc(painter.canZoomInside)) return;\n\n is_any_check = true;\n\n if (zoom_x && (force || painter.canZoomInside('x', xmin, xmax))) {\n this.zoom_xmin = xmin;\n this.zoom_xmax = xmax;\n changed = true; r_x = '0';\n zoom_x = false;\n req.values[0] = xmin; req.values[1] = xmax;\n req.flags[0] = req.flags[1] = true;\n }\n if (zoom_y && (force || painter.canZoomInside('y', ymin, ymax))) {\n this.zoom_ymin = ymin;\n this.zoom_ymax = ymax;\n changed = true; r_y = '1';\n zoom_y = false;\n req.values[2] = ymin; req.values[3] = ymax;\n req.flags[2] = req.flags[3] = true;\n }\n if (zoom_z && (force || painter.canZoomInside('z', zmin, zmax))) {\n this.zoom_zmin = zmin;\n this.zoom_zmax = zmax;\n changed = true; r_z = '2';\n zoom_z = false;\n req.values[4] = zmin; req.values[5] = zmax;\n req.flags[4] = req.flags[5] = true;\n }\n };\n\n // first process zooming (if any)\n if (zoom_x || zoom_y || zoom_z)\n this.forEachPainter(painter => checkZooming(painter));\n\n // force zooming when no any other painter can verify zoom range\n if (!is_any_check && this.self_drawaxes)\n checkZooming(null, true);\n\n // and process unzoom, if any\n if (unzoom_x || unzoom_y || unzoom_z) {\n if (unzoom_x) {\n if (this.zoom_xmin !== this.zoom_xmax) { changed = true; r_x = '0'; }\n this.zoom_xmin = this.zoom_xmax = 0;\n req.values[0] = req.values[1] = -1;\n }\n if (unzoom_y) {\n if (this.zoom_ymin !== this.zoom_ymax) { changed = true; r_y = '1'; }\n this.zoom_ymin = this.zoom_ymax = 0;\n req.values[2] = req.values[3] = -1;\n }\n if (unzoom_z) {\n if (this.zoom_zmin !== this.zoom_zmax) { changed = true; r_z = '2'; }\n this.zoom_zmin = this.zoom_zmax = 0;\n req.values[4] = req.values[5] = -1;\n }\n }\n\n if (!changed) return false;\n\n if (this.v7NormalMode())\n this.v7SubmitRequest('zoom', { _typename: 'ROOT::Experimental::RFrame::RZoomRequest', ranges: req });\n\n return this.interactiveRedraw('pad', 'zoom' + r_x + r_y + r_z).then(() => true);\n }\n\n /** @summary Provide zooming of single axis\n * @desc One can specify names like x/y/z but also second axis x2 or y2 */\n async zoomSingle(name, vmin, vmax) {\n\n let names = ['x','y','z','x2','y2'], indx = names.indexOf(name);\n\n // disable zooming when axis conversion is enabled\n if (this.projection || !this[name+'_handle'] || (indx < 0))\n return false;\n\n let zoom_v = (vmin !== vmax), unzoom_v = false;\n\n if (zoom_v) {\n let cnt = 0;\n if (vmin <= this[name+'min']) { vmin = this[name+'min']; cnt++; }\n if (vmax >= this[name+'max']) { vmax = this[name+'max']; cnt++; }\n if (cnt === 2) { zoom_v = false; unzoom_v = true; }\n } else {\n unzoom_v = (vmin === vmax) && (vmin === 0);\n }\n\n let changed = false, is_any_check = false,\n req = {\n _typename: 'ROOT::Experimental::RFrame::RUserRanges',\n values: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],\n flags: [false, false, false, false, false, false, false, false, false, false]\n };\n\n let checkZooming = (painter, force) => {\n if (!force && !isFunc(painter?.canZoomInside)) return;\n\n is_any_check = true;\n\n if (zoom_v && (force || painter.canZoomInside(name[0], vmin, vmax))) {\n this['zoom_' + name + 'min'] = vmin;\n this['zoom_' + name + 'max'] = vmax;\n changed = true;\n zoom_v = false;\n req.values[indx*2] = vmin; req.values[indx*2+1] = vmax;\n req.flags[indx*2] = req.flags[indx*2+1] = true;\n }\n };\n\n // first process zooming (if any)\n if (zoom_v)\n this.forEachPainter(painter => checkZooming(painter));\n\n // force zooming when no any other painter can verify zoom range\n if (!is_any_check && this.self_drawaxes)\n checkZooming(null, true);\n\n if (unzoom_v) {\n if (this[`zoom_${name}min`] !== this[`zoom_${name}max`]) changed = true;\n this[`zoom_${name}min`] = this[`zoom_${name}max`] = 0;\n req.values[indx*2] = req.values[indx*2+1] = -1;\n }\n\n if (!changed) return false;\n\n if (this.v7NormalMode())\n this.v7SubmitRequest('zoom', { _typename: 'ROOT::Experimental::RFrame::RZoomRequest', ranges: req });\n\n return this.interactiveRedraw('pad', 'zoom' + indx).then(() => true);\n }\n\n /** @summary Checks if specified axis zoomed */\n isAxisZoomed(axis) {\n return this['zoom_'+axis+'min'] !== this['zoom_'+axis+'max'];\n }\n\n /** @summary Unzoom specified axes\n * @return {Promise} with boolean flag if zoom is changed */\n async unzoom(dox, doy, doz) {\n if (dox == 'all')\n return this.unzoom('x2').then(() => this.unzoom('y2')).then(() => this.unzoom('xyz'));\n\n if ((dox == 'x2') || (dox == 'y2'))\n return this.zoomSingle(dox, 0, 0).then(changed => {\n if (changed) this.zoomChangedInteractive(dox, 'unzoom');\n return changed;\n });\n\n if (typeof dox === 'undefined') { dox = doy = doz = true; } else\n if (isStr(dox)) { doz = dox.indexOf('z') >= 0; doy = dox.indexOf('y') >= 0; dox = dox.indexOf('x') >= 0; }\n\n return this.zoom(dox ? 0 : undefined, dox ? 0 : undefined,\n doy ? 0 : undefined, doy ? 0 : undefined,\n doz ? 0 : undefined, doz ? 0 : undefined).then(changed => {\n\n if (changed && dox) this.zoomChangedInteractive('x', 'unzoom');\n if (changed && doy) this.zoomChangedInteractive('y', 'unzoom');\n if (changed && doz) this.zoomChangedInteractive('z', 'unzoom');\n\n return changed;\n });\n }\n\n /** @summary Mark/check if zoom for specific axis was changed interactively\n * @private */\n zoomChangedInteractive(axis, value) {\n if (axis == 'reset') {\n this.zoom_changed_x = this.zoom_changed_y = this.zoom_changed_z = undefined;\n return;\n }\n if (!axis || axis == 'any')\n return this.zoom_changed_x || this.zoom_changed_y || this.zoom_changed_z;\n\n if ((axis !== 'x') && (axis !== 'y') && (axis !== 'z')) return;\n\n let fld = 'zoom_changed_' + axis;\n if (value === undefined) return this[fld];\n\n if (value === 'unzoom') {\n // special handling of unzoom, only if was never changed before flag set to true\n this[fld] = (this[fld] === undefined);\n return;\n }\n\n if (value) this[fld] = true;\n }\n\n /** @summary Fill menu for frame when server is not there */\n fillObjectOfflineMenu(menu, kind) {\n if ((kind != 'x') && (kind != 'y')) return;\n\n menu.add('Unzoom', () => this.unzoom(kind));\n\n //if (this[kind+'_kind'] == 'normal')\n // menu.addchk(this['log'+kind], 'SetLog'+kind, this.toggleAxisLog.bind(this, kind));\n\n // here should be all axes attributes in offline\n }\n\n /** @summary Set grid drawing for specified axis */\n changeFrameAttr(attr, value) {\n let changes = {};\n this.v7AttrChange(changes, attr, value);\n this.v7SetAttr(attr, value);\n this.v7SendAttrChanges(changes, false); // do not invoke canvas update on the server\n this.redrawPad();\n }\n\n /** @summary Fill context menu */\n fillContextMenu(menu, kind, /* obj */) {\n\n // when fill and show context menu, remove all zooming\n\n if ((kind == 'x') || (kind == 'y') || (kind == 'x2') || (kind == 'y2')) {\n let handle = this[kind+'_handle'];\n if (!handle) return false;\n menu.add('header: ' + kind.toUpperCase() + ' axis');\n return handle.fillAxisContextMenu(menu, kind);\n }\n\n let alone = menu.size() == 0;\n\n if (alone)\n menu.add('header:Frame');\n else\n menu.add('separator');\n\n if (this.zoom_xmin !== this.zoom_xmax)\n menu.add('Unzoom X', () => this.unzoom('x'));\n if (this.zoom_ymin !== this.zoom_ymax)\n menu.add('Unzoom Y', () => this.unzoom('y'));\n if (this.zoom_zmin !== this.zoom_zmax)\n menu.add('Unzoom Z', () => this.unzoom('z'));\n if (this.zoom_x2min !== this.zoom_x2max)\n menu.add('Unzoom X2', () => this.unzoom('x2'));\n if (this.zoom_y2min !== this.zoom_y2max)\n menu.add('Unzoom Y2', () => this.unzoom('y2'));\n menu.add('Unzoom all', () => this.unzoom('all'));\n\n menu.add('separator');\n\n menu.addchk(this.isTooltipAllowed(), 'Show tooltips', () => this.setTooltipAllowed('toggle'));\n\n if (this.x_handle)\n menu.addchk(this.x_handle.draw_grid, 'Grid x', flag => this.changeFrameAttr('gridX', flag));\n if (this.y_handle)\n menu.addchk(this.y_handle.draw_grid, 'Grid y', flag => this.changeFrameAttr('gridY', flag));\n if (this.x_handle && !this.x2_handle)\n menu.addchk(this.x_handle.draw_swapside, 'Swap x', flag => this.changeFrameAttr('swapX', flag));\n if (this.y_handle && !this.y2_handle)\n menu.addchk(this.y_handle.draw_swapside, 'Swap y', flag => this.changeFrameAttr('swapY', flag));\n if (this.x_handle && !this.x2_handle) {\n menu.add('sub:Ticks x');\n menu.addchk(this.x_handle.draw_ticks == 0, 'off', () => this.changeFrameAttr('ticksX', 0));\n menu.addchk(this.x_handle.draw_ticks == 1, 'normal', () => this.changeFrameAttr('ticksX', 1));\n menu.addchk(this.x_handle.draw_ticks == 2, 'ticks on both sides', () => this.changeFrameAttr('ticksX', 2));\n menu.addchk(this.x_handle.draw_ticks == 3, 'labels on both sides', () => this.changeFrameAttr('ticksX', 3));\n menu.add('endsub:');\n }\n if (this.y_handle && !this.y2_handle) {\n menu.add('sub:Ticks y');\n menu.addchk(this.y_handle.draw_ticks == 0, 'off', () => this.changeFrameAttr('ticksY', 0));\n menu.addchk(this.y_handle.draw_ticks == 1, 'normal', () => this.changeFrameAttr('ticksY', 1));\n menu.addchk(this.y_handle.draw_ticks == 2, 'ticks on both sides', () => this.changeFrameAttr('ticksY', 2));\n menu.addchk(this.y_handle.draw_ticks == 3, 'labels on both sides', () => this.changeFrameAttr('ticksY', 3));\n menu.add('endsub:');\n }\n\n menu.addAttributesMenu(this, alone ? '' : 'Frame ');\n menu.add('separator');\n menu.add('Save as frame.png', () => this.getPadPainter().saveAs('png', 'frame', 'frame.png'));\n menu.add('Save as frame.svg', () => this.getPadPainter().saveAs('svg', 'frame', 'frame.svg'));\n\n return true;\n }\n\n /** @summary Convert graphical coordinate into axis value */\n revertAxis(axis, pnt) {\n let handle = this[axis+'_handle'];\n return handle ? handle.revertPoint(pnt) : 0;\n }\n\n /** @summary Show axis status message\n * @desc method called normally when mouse enter main object element\n * @private */\n showAxisStatus(axis_name, evnt) {\n\n let taxis = null, hint_name = axis_name, hint_title = 'axis',\n m = d3_pointer(evnt, this.getFrameSvg().node()), id = (axis_name == 'x') ? 0 : 1;\n\n if (taxis) { hint_name = taxis.fName; hint_title = taxis.fTitle || 'axis object'; }\n\n if (this.swap_xy) id = 1-id;\n\n let axis_value = this.revertAxis(axis_name, m[id]);\n\n this.showObjectStatus(hint_name, hint_title, axis_name + ' : ' + this.axisAsText(axis_name, axis_value), Math.round(m[0]) + ',' + Math.round(m[1]));\n }\n\n /** @summary Add interactive keys handlers\n * @private */\n addKeysHandler() {\n if (isBatchMode()) return;\n FrameInteractive.assign(this);\n this.addFrameKeysHandler();\n }\n\n /** @summary Add interactive functionality to the frame\n * @private */\n addInteractivity(for_second_axes) {\n\n if (isBatchMode() || (!settings.Zooming && !settings.ContextMenu))\n return true;\n FrameInteractive.assign(this);\n return this.addFrameInteractivity(for_second_axes);\n }\n\n /** @summary Set selected range back to pad object - to be implemented\n * @private */\n setRootPadRange(/* pad, is3d */) {\n // TODO: change of pad range and send back to root application\n }\n\n /** @summary Toggle log scale on the specified axes */\n toggleAxisLog(axis) {\n let handle = this[axis+'_handle'];\n if (handle) handle.changeAxisLog('toggle');\n }\n\n} // class RFramePainter\n\nexport { RFramePainter };\n","import { gStyle, settings, constants, internals, addMethods,\n isPromise, getPromise, isBatchMode, isObject, isFunc, isStr, btoa_func, clTPad } from '../core.mjs';\nimport { pointer as d3_pointer } from '../d3.mjs';\nimport { ColorPalette, addColor, getRootColors } from '../base/colors.mjs';\nimport { RObjectPainter } from '../base/RObjectPainter.mjs';\nimport { getElementRect, getAbsPosInCanvas, DrawOptions, compressSVG } from '../base/BasePainter.mjs';\nimport { selectActivePad, getActivePad } from '../base/ObjectPainter.mjs';\nimport { registerForResize, saveFile } from '../gui/utils.mjs';\nimport { BrowserLayout } from '../gui/display.mjs';\nimport { createMenu, closeMenu } from '../gui/menu.mjs';\nimport { PadButtonsHandler } from './TPadPainter.mjs';\n\n\n/**\n * @summary Painter class for RPad\n *\n * @private\n */\n\nclass RPadPainter extends RObjectPainter {\n\n /** @summary constructor */\n constructor(dom, pad, iscan) {\n super(dom, pad, '', 'pad');\n this.pad = pad;\n this.iscan = iscan; // indicate if working with canvas\n this.this_pad_name = '';\n if (!this.iscan && (pad !== null)) {\n if (pad.fObjectID)\n this.this_pad_name = 'pad' + pad.fObjectID; // use objectid as padname\n else\n this.this_pad_name = 'ppp' + internals.id_counter++; // artificical name\n }\n this.painters = []; // complete list of all painters in the pad\n this.has_canvas = true;\n this.forEachPainter = this.forEachPainterInPad;\n }\n\n /** @summary Indicates that is not Root6 pad painter\n * @private */\n isRoot6() { return false; }\n\n /** @summary Returns SVG element for the pad itself\n * @private */\n svg_this_pad() {\n return this.getPadSvg(this.this_pad_name);\n }\n\n /** @summary Returns main painter on the pad\n * @desc Typically main painter is TH1/TH2 object which is drawing axes\n * @private */\n getMainPainter() {\n return this.main_painter_ref || null;\n }\n\n /** @summary Assign main painter on the pad\n * @private */\n setMainPainter(painter, force) {\n if (!this.main_painter_ref || force)\n this.main_painter_ref = painter;\n }\n\n /** @summary cleanup pad and all primitives inside */\n cleanup() {\n if (this._doing_draw)\n console.error('pad drawing is not completed when cleanup is called');\n\n this.painters.forEach(p => p.cleanup());\n\n let svg_p = this.svg_this_pad();\n if (!svg_p.empty()) {\n svg_p.property('pad_painter', null);\n if (!this.iscan) svg_p.remove();\n }\n\n delete this.main_painter_ref;\n delete this.frame_painter_ref;\n delete this.pads_cache;\n delete this._pad_x;\n delete this._pad_y;\n delete this._pad_width;\n delete this._pad_height;\n delete this._doing_draw;\n delete this._dfltRFont;\n\n this.painters = [];\n this.pad = null;\n this.draw_object = null;\n this.pad_frame = null;\n this.this_pad_name = undefined;\n this.has_canvas = false;\n\n selectActivePad({ pp: this, active: false });\n\n super.cleanup();\n }\n\n /** @summary Returns frame painter inside the pad\n * @private */\n getFramePainter() { return this.frame_painter_ref; }\n\n /** @summary get pad width */\n getPadWidth() { return this._pad_width || 0; }\n\n /** @summary get pad height */\n getPadHeight() { return this._pad_height || 0; }\n\n /** @summary get pad rect */\n getPadRect() {\n return {\n x: this._pad_x || 0,\n y: this._pad_y || 0,\n width: this.getPadWidth(),\n height: this.getPadHeight()\n }\n }\n\n /** @summary Returns frame coordiantes - also when frame is not drawn */\n getFrameRect() {\n let fp = this.getFramePainter();\n if (fp) return fp.getFrameRect();\n\n let w = this.getPadWidth(),\n h = this.getPadHeight(),\n rect = {};\n\n rect.szx = Math.round(0.5*w);\n rect.szy = Math.round(0.5*h);\n rect.width = 2*rect.szx;\n rect.height = 2*rect.szy;\n rect.x = Math.round(w/2 - rect.szx);\n rect.y = Math.round(h/2 - rect.szy);\n rect.hint_delta_x = rect.szx;\n rect.hint_delta_y = rect.szy;\n rect.transform = `translate(${rect.x},${rect.y})`;\n return rect;\n }\n\n /** @summary return RPad object */\n getRootPad(is_root6) {\n return (is_root6 === undefined) || !is_root6 ? this.pad : null;\n }\n\n /** @summary Cleanup primitives from pad - selector lets define which painters to remove\n * @private */\n cleanPrimitives(selector) {\n if (!isFunc(selector)) return;\n\n for (let k = this.painters.length-1; k >= 0; --k)\n if (selector(this.painters[k])) {\n this.painters[k].cleanup();\n this.painters.splice(k, 1);\n }\n }\n\n /** @summary Try to find painter for specified object\n * @desc can be used to find painter for some special objects, registered as\n * histogram functions\n * @private */\n findPainterFor(selobj, selname, seltype) {\n return this.painters.find(p => {\n let pobj = p.getObject();\n if (!pobj) return;\n\n if (selobj && (pobj === selobj)) return true;\n if (!selname && !seltype) return;\n if (selname && (pobj.fName !== selname)) return;\n if (seltype && (pobj._typename !== seltype)) return;\n return true;\n });\n }\n\n /** @summary Returns palette associated with pad.\n * @desc Either from existing palette painter or just default palette */\n getHistPalette() {\n let pp = this.findPainterFor(undefined, undefined, 'ROOT::Experimental::RPaletteDrawable');\n\n if (pp) return pp.getHistPalette();\n\n if (!this.fDfltPalette) {\n this.fDfltPalette = {\n _typename: 'ROOT::Experimental::RPalette',\n fColors: [{ fOrdinal: 0, fColor: { fColor: 'rgb(53, 42, 135)' } },\n { fOrdinal: 0.125, fColor: { fColor: 'rgb(15, 92, 221)' } },\n { fOrdinal: 0.25, fColor: { fColor: 'rgb(20, 129, 214)' } },\n { fOrdinal: 0.375, fColor: { fColor: 'rgb(6, 164, 202)' } },\n { fOrdinal: 0.5, fColor: { fColor: 'rgb(46, 183, 164)' } },\n { fOrdinal: 0.625, fColor: { fColor: 'rgb(135, 191, 119)' } },\n { fOrdinal: 0.75, fColor: { fColor: 'rgb(209, 187, 89)' } },\n { fOrdinal: 0.875, fColor: { fColor: 'rgb(254, 200, 50)' } },\n { fOrdinal: 1, fColor: { fColor: 'rgb(249, 251, 14)' } }],\n fInterpolate: true,\n fNormalized: true\n };\n addMethods(this.fDfltPalette, 'ROOT::Experimental::RPalette');\n }\n\n return this.fDfltPalette;\n }\n\n /** @summary Returns number of painters\n * @private */\n getNumPainters() { return this.painters.length; }\n\n /** @summary Call function for each painter in pad\n * @param {function} userfunc - function to call\n * @param {string} kind - 'all' for all objects (default), 'pads' only pads and subpads, 'objects' only for object in current pad\n * @private */\n forEachPainterInPad(userfunc, kind) {\n if (!kind) kind = 'all';\n if (kind != 'objects') userfunc(this);\n for (let k = 0; k < this.painters.length; ++k) {\n let sub = this.painters[k];\n if (isFunc(sub.forEachPainterInPad)) {\n if (kind!='objects') sub.forEachPainterInPad(userfunc, kind);\n } else if (kind != 'pads') userfunc(sub);\n }\n }\n\n /** @summary register for pad events receiver\n * @desc in pad painter, while pad may be drawn without canvas\n * @private */\n registerForPadEvents(receiver) {\n this.pad_events_receiver = receiver;\n }\n\n /** @summary Generate pad events, normally handled by GED\n * @desc in pad painter, while pad may be drawn without canvas\n * @private */\n producePadEvent(what, padpainter, painter, position, place) {\n if ((what == 'select') && isFunc(this.selectActivePad))\n this.selectActivePad(padpainter, painter, position);\n\n if (this.pad_events_receiver)\n this.pad_events_receiver({ what, padpainter, painter, position, place });\n }\n\n /** @summary method redirect call to pad events receiver */\n selectObjectPainter(painter, pos, place) {\n\n let istoppad = (this.iscan || !this.has_canvas),\n canp = istoppad ? this : this.getCanvPainter();\n\n if (painter === undefined) painter = this;\n\n if (pos && !istoppad)\n pos = getAbsPosInCanvas(this.svg_this_pad(), pos);\n\n selectActivePad({ pp: this, active: true });\n\n canp.producePadEvent('select', this, painter, pos, place);\n }\n\n /** @summary Create SVG element for the canvas */\n createCanvasSvg(check_resize, new_size) {\n\n let factor = null, svg = null, lmt = 5, rect = null, btns, frect;\n\n if (check_resize > 0) {\n\n if (this._fixed_size) return (check_resize > 1); // flag used to force re-drawing of all subpads\n\n svg = this.getCanvSvg();\n\n if (svg.empty()) return false;\n\n factor = svg.property('height_factor');\n\n rect = this.testMainResize(check_resize, null, factor);\n\n if (!rect.changed) return false;\n\n if (!isBatchMode())\n btns = this.getLayerSvg('btns_layer', this.this_pad_name);\n\n frect = svg.select('.canvas_fillrect');\n\n } else {\n\n let render_to = this.selectDom();\n\n if (render_to.style('position') == 'static')\n render_to.style('position', 'relative');\n\n svg = render_to.append('svg')\n .attr('class', 'jsroot root_canvas')\n .property('pad_painter', this) // this is custom property\n .property('current_pad', '') // this is custom property\n .property('redraw_by_resize', false); // could be enabled to force redraw by each resize\n\n this.setTopPainter(); //assign canvas as top painter of that element\n\n if (!isBatchMode() && !this.online_canvas)\n svg.append('svg:title').text('ROOT canvas');\n\n frect = svg.append('svg:path').attr('class','canvas_fillrect');\n if (!isBatchMode())\n frect.style('pointer-events', 'visibleFill')\n .on('dblclick', evnt => this.enlargePad(evnt))\n .on('click', () => this.selectObjectPainter(this, null))\n .on('mouseenter', () => this.showObjectStatus())\n .on('contextmenu', settings.ContextMenu ? evnt => this.padContextMenu(evnt) : null);\n\n svg.append('svg:g').attr('class', 'primitives_layer');\n svg.append('svg:g').attr('class', 'info_layer');\n if (!isBatchMode())\n btns = svg.append('svg:g')\n .attr('class','btns_layer')\n .property('leftside', settings.ToolBarSide == 'left')\n .property('vertical', settings.ToolBarVert);\n\n factor = 0.66;\n if (this.pad && this.pad.fWinSize[0] && this.pad.fWinSize[1]) {\n factor = this.pad.fWinSize[1] / this.pad.fWinSize[0];\n if ((factor < 0.1) || (factor > 10)) factor = 0.66;\n }\n\n if (this._fixed_size) {\n render_to.style('overflow','auto');\n rect = { width: this.pad.fWinSize[0], height: this.pad.fWinSize[1] };\n if (!rect.width || !rect.height)\n rect = getElementRect(render_to);\n } else {\n rect = this.testMainResize(2, new_size, factor);\n }\n }\n\n this.createAttFill({ pattern: 1001, color: 0 });\n\n if ((rect.width <= lmt) || (rect.height <= lmt)) {\n svg.style('display', 'none');\n console.warn(`Hide canvas while geometry too small w=${rect.width} h=${rect.height}`);\n rect.width = 200; rect.height = 100; // just to complete drawing\n } else {\n svg.style('display', null);\n }\n\n if (this._fixed_size) {\n svg.attr('x', 0)\n .attr('y', 0)\n .attr('width', rect.width)\n .attr('height', rect.height)\n .style('position', 'absolute');\n } else {\n svg.attr('x', 0)\n .attr('y', 0)\n .style('width', '100%')\n .style('height', '100%')\n .style('position', 'absolute')\n .style('left', 0)\n .style('top', 0)\n .style('right', 0)\n .style('bottom', 0);\n }\n\n svg.style('filter', settings.DarkMode ? 'invert(100%)' : null);\n\n svg.attr('viewBox', `0 0 ${rect.width} ${rect.height}`)\n .attr('preserveAspectRatio', 'none') // we do not preserve relative ratio\n .property('height_factor', factor)\n .property('draw_x', 0)\n .property('draw_y', 0)\n .property('draw_width', rect.width)\n .property('draw_height', rect.height);\n\n this._pad_x = 0;\n this._pad_y = 0;\n this._pad_width = rect.width;\n this._pad_height = rect.height;\n\n frect.attr('d', `M0,0H${rect.width}V${rect.height}H0Z`)\n .call(this.fillatt.func);\n\n this._fast_drawing = settings.SmallPad && ((rect.width < settings.SmallPad.width) || (rect.height < settings.SmallPad.height));\n\n if (this.alignButtons && btns)\n this.alignButtons(btns, rect.width, rect.height);\n\n return true;\n }\n\n /** @summary Enlarge pad draw element when possible */\n enlargePad(evnt) {\n\n if (evnt) {\n evnt.preventDefault();\n evnt.stopPropagation();\n }\n\n let svg_can = this.getCanvSvg(),\n pad_enlarged = svg_can.property('pad_enlarged');\n\n if (this.iscan || !this.has_canvas || (!pad_enlarged && !this.hasObjectsToDraw() && !this.painters)) {\n if (this._fixed_size) return; // canvas cannot be enlarged in such mode\n if (!this.enlargeMain('toggle')) return;\n if (this.enlargeMain('state') == 'off') svg_can.property('pad_enlarged', null);\n } else if (!pad_enlarged) {\n this.enlargeMain(true, true);\n svg_can.property('pad_enlarged', this.pad);\n } else if (pad_enlarged === this.pad) {\n this.enlargeMain(false);\n svg_can.property('pad_enlarged', null);\n } else {\n console.error('missmatch with pad double click events');\n }\n\n let was_fast = this._fast_drawing;\n\n this.checkResize(true);\n\n if (this._fast_drawing != was_fast)\n this.showPadButtons();\n }\n\n /** @summary Create SVG element for the pad\n * @return true when pad is displayed and all its items should be redrawn */\n createPadSvg(only_resize) {\n\n if (!this.has_canvas) {\n this.createCanvasSvg(only_resize ? 2 : 0);\n return true;\n }\n\n let svg_parent = this.getPadSvg(this.pad_name), // this.pad_name MUST be here to select parent pad\n svg_can = this.getCanvSvg(),\n width = svg_parent.property('draw_width'),\n height = svg_parent.property('draw_height'),\n pad_enlarged = svg_can.property('pad_enlarged'),\n pad_visible = true,\n w = width, h = height, x = 0, y = 0,\n svg_pad = null, svg_rect = null, btns = null;\n\n if (this.pad && this.pad.fPos && this.pad.fSize) {\n x = Math.round(width * this.pad.fPos.fHoriz.fArr[0]);\n y = Math.round(height * this.pad.fPos.fVert.fArr[0]);\n w = Math.round(width * this.pad.fSize.fHoriz.fArr[0]);\n h = Math.round(height * this.pad.fSize.fVert.fArr[0]);\n }\n\n if (pad_enlarged) {\n pad_visible = false;\n if (pad_enlarged === this.pad)\n pad_visible = true;\n else\n this.forEachPainterInPad(pp => { if (pp.getObject() == pad_enlarged) pad_visible = true; }, 'pads');\n\n if (pad_visible) { w = width; h = height; x = y = 0; }\n }\n\n if (only_resize) {\n svg_pad = this.svg_this_pad();\n svg_rect = svg_pad.select('.root_pad_border');\n if (!isBatchMode())\n btns = this.getLayerSvg('btns_layer', this.this_pad_name);\n } else {\n svg_pad = svg_parent.select('.primitives_layer')\n .append('svg:svg') // here was g before, svg used to blend all drawin outside\n .classed('__root_pad_' + this.this_pad_name, true)\n .attr('pad', this.this_pad_name) // set extra attribute to mark pad name\n .property('pad_painter', this); // this is custom property\n\n if (!isBatchMode())\n svg_pad.append('svg:title').text('ROOT subpad');\n\n svg_rect = svg_pad.append('svg:path').attr('class', 'root_pad_border');\n\n svg_pad.append('svg:g').attr('class','primitives_layer');\n if (!isBatchMode())\n btns = svg_pad.append('svg:g')\n .attr('class','btns_layer')\n .property('leftside', settings.ToolBarSide != 'left')\n .property('vertical', settings.ToolBarVert);\n\n if (settings.ContextMenu)\n svg_rect.on('contextmenu', evnt => this.padContextMenu(evnt));\n\n if (!isBatchMode())\n svg_rect.style('pointer-events', 'visibleFill') // get events also for not visible rect\n .on('dblclick', evnt => this.enlargePad(evnt))\n .on('click', () => this.selectObjectPainter(this, null))\n .on('mouseenter', () => this.showObjectStatus());\n }\n\n this.createAttFill({ attr: this.pad });\n\n this.createAttLine({ attr: this.pad, color0: this.pad.fBorderMode == 0 ? 'none' : '' });\n\n svg_pad.style('display', pad_visible ? null : 'none')\n .attr('viewBox', `0 0 ${w} ${h}`) // due to svg\n .attr('preserveAspectRatio', 'none') // due to svg, we do not preserve relative ratio\n .attr('x', x) // due to svg\n .attr('y', y) // due to svg\n .attr('width', w) // due to svg\n .attr('height', h) // due to svg\n .property('draw_x', x) // this is to make similar with canvas\n .property('draw_y', y)\n .property('draw_width', w)\n .property('draw_height', h);\n\n this._pad_x = x;\n this._pad_y = y;\n this._pad_width = w;\n this._pad_height = h;\n\n svg_rect.attr('d', `M0,0H${w}V${h}H0Z`)\n .call(this.fillatt.func)\n .call(this.lineatt.func);\n\n this._fast_drawing = settings.SmallPad && ((w < settings.SmallPad.width) || (h < settings.SmallPad.height));\n\n // special case of 3D canvas overlay\n if (svg_pad.property('can3d') === constants.Embed3D.Overlay)\n this.selectDom().select('.draw3d_' + this.this_pad_name)\n .style('display', pad_visible ? '' : 'none');\n\n if (this.alignButtons && btns) this.alignButtons(btns, w, h);\n\n return pad_visible;\n }\n\n /** @summary returns true if any objects beside sub-pads exists in the pad */\n hasObjectsToDraw() {\n let arr = this.pad ? this.pad.fPrimitives : null;\n return arr && arr.find(obj => obj._typename != 'ROOT::Experimental::RPadDisplayItem') ? true : false;\n }\n\n /** @summary sync drawing/redrawing/resize of the pad\n * @param {string} kind - kind of draw operation, if true - always queued\n * @return {Promise} when pad is ready for draw operation or false if operation already queued\n * @private */\n syncDraw(kind) {\n let entry = { kind : kind || 'redraw' };\n if (this._doing_draw === undefined) {\n this._doing_draw = [ entry ];\n return Promise.resolve(true);\n }\n // if queued operation registered, ignore next calls, indx == 0 is running operation\n if ((entry.kind !== true) && (this._doing_draw.findIndex((e,i) => (i > 0) && (e.kind == entry.kind)) > 0))\n return false;\n this._doing_draw.push(entry);\n return new Promise(resolveFunc => {\n entry.func = resolveFunc;\n });\n }\n\n /** @summary confirms that drawing is completed, may trigger next drawing immediately\n * @private */\n confirmDraw() {\n if (this._doing_draw === undefined)\n return console.warn('failure, should not happen');\n this._doing_draw.shift();\n if (this._doing_draw.length == 0) {\n delete this._doing_draw;\n } else {\n let entry = this._doing_draw[0];\n if(entry.func) { entry.func(); delete entry.func; }\n }\n }\n\n /** @summary Draw single primitive */\n async drawObject(/*dom, obj, opt*/) {\n console.log('Not possible to draw object without loading of draw.mjs');\n return null;\n }\n\n /** @summary Draw pad primitives\n * @private */\n async drawPrimitives(indx) {\n\n if (indx === undefined) {\n if (this.iscan)\n this._start_tm = new Date().getTime();\n\n // set number of primitves\n this._num_primitives = this.pad && this.pad.fPrimitives ? this.pad.fPrimitives.length : 0;\n\n return this.syncDraw(true).then(() => this.drawPrimitives(0));\n }\n\n if (!this.pad || (indx >= this._num_primitives)) {\n\n this.confirmDraw();\n\n if (this._start_tm) {\n let spenttm = new Date().getTime() - this._start_tm;\n if (spenttm > 3000) console.log(`Canvas drawing took ${(spenttm*1e-3).toFixed(2)}s`);\n delete this._start_tm;\n }\n\n return;\n }\n\n // handle used to invoke callback only when necessary\n return this.drawObject(this.getDom(), this.pad.fPrimitives[indx], '').then(ppainter => {\n // mark painter as belonging to primitives\n if (isObject(ppainter))\n ppainter._primitive = true;\n\n return this.drawPrimitives(indx+1);\n });\n }\n\n /** @summary Process tooltip event in the pad\n * @private */\n processPadTooltipEvent(pnt) {\n let painters = [], hints = [];\n\n // first count - how many processors are there\n if (this.painters !== null)\n this.painters.forEach(obj => {\n if (isFunc(obj.processTooltipEvent)) painters.push(obj);\n });\n\n if (pnt) pnt.nproc = painters.length;\n\n painters.forEach(obj => {\n let hint = obj.processTooltipEvent(pnt);\n if (!hint) hint = { user_info: null };\n hints.push(hint);\n if (pnt && pnt.painters) hint.painter = obj;\n });\n\n return hints;\n }\n\n /** @summary Changes canvas dark mode\n * @private */\n changeDarkMode(mode) {\n this.getCanvSvg().style('filter', (mode ?? settings.DarkMode) ? 'invert(100%)' : null);\n }\n\n /** @summary Fill pad context menu\n * @private */\n fillContextMenu(menu) {\n\n if (this.iscan)\n menu.add('header: RCanvas');\n else\n menu.add('header: RPad');\n\n menu.addchk(this.isTooltipAllowed(), 'Show tooltips', () => this.setTooltipAllowed('toggle'));\n\n if (!this._websocket) {\n menu.addAttributesMenu(this);\n if (this.iscan)\n menu.addSettingsMenu(false, false, arg => {\n if (arg == 'dark') this.changeDarkMode();\n });\n }\n\n menu.add('separator');\n\n if (isFunc(this.hasMenuBar) && isFunc(this.actiavteMenuBar))\n menu.addchk(this.hasMenuBar(), 'Menu bar', flag => this.actiavteMenuBar(flag));\n\n if (isFunc(this.hasEventStatus) && isFunc(this.activateStatusBar))\n menu.addchk(this.hasEventStatus(), 'Event status', () => this.activateStatusBar('toggle'));\n\n if (this.enlargeMain() || (this.has_canvas && this.hasObjectsToDraw()))\n menu.addchk((this.enlargeMain('state') == 'on'), 'Enlarge ' + (this.iscan ? 'canvas' : 'pad'), () => this.enlargePad());\n\n let fname = this.this_pad_name || (this.iscan ? 'canvas' : 'pad');\n menu.add(`Save as ${fname}.png`, fname+'.png', arg => this.saveAs('png', false, arg));\n menu.add(`Save as ${fname}.svg`, fname+'.svg', arg => this.saveAs('svg', false, arg));\n\n return true;\n }\n\n /** @summary Show pad context menu\n * @private */\n padContextMenu(evnt) {\n if (evnt.stopPropagation) {\n let pos = d3_pointer(evnt, this.svg_this_pad().node());\n // this is normal event processing and not emulated jsroot event\n // for debug purposes keep original context menu for small region in top-left corner\n if ((pos.length==2) && (pos[0] >= 0) && (pos[0] < 10) && (pos[1] >= 0) && (pos[1] < 10)) return;\n\n evnt.stopPropagation(); // disable main context menu\n evnt.preventDefault(); // disable browser context menu\n\n this.getFramePainter()?.setLastEventPos();\n }\n\n createMenu(evnt, this).then(menu => {\n this.fillContextMenu(menu);\n return this.fillObjectExecMenu(menu);\n }).then(menu => menu.show());\n }\n\n /** @summary Redraw pad means redraw ourself\n * @return {Promise} when redrawing ready */\n async redrawPad(reason) {\n\n let sync_promise = this.syncDraw(reason);\n if (sync_promise === false) {\n console.log('Prevent RPad redrawing');\n return false;\n }\n\n let showsubitems = true;\n let redrawNext = indx => {\n while (indx < this.painters.length) {\n let sub = this.painters[indx++], res = 0;\n if (showsubitems || sub.this_pad_name)\n res = sub.redraw(reason);\n\n if (isPromise(res))\n return res.then(() => redrawNext(indx));\n }\n return true;\n };\n\n return sync_promise.then(() => {\n if (this.iscan) {\n this.createCanvasSvg(2);\n } else {\n showsubitems = this.createPadSvg(true);\n }\n return redrawNext(0);\n }).then(() => {\n if (getActivePad() === this)\n this.getCanvPainter()?.producePadEvent('padredraw', this);\n this.confirmDraw();\n return true;\n });\n }\n\n /** @summary redraw pad */\n redraw(reason) {\n return this.redrawPad(reason);\n }\n\n\n /** @summary Checks if pad should be redrawn by resize\n * @private */\n needRedrawByResize() {\n let elem = this.svg_this_pad();\n if (!elem.empty() && elem.property('can3d') === constants.Embed3D.Overlay) return true;\n\n for (let i = 0; i < this.painters.length; ++i)\n if (isFunc(this.painters[i].needRedrawByResize))\n if (this.painters[i].needRedrawByResize()) return true;\n\n return false;\n }\n\n /** @summary Check resize of canvas */\n checkCanvasResize(size, force) {\n\n if (!this.iscan && this.has_canvas) return false;\n\n let sync_promise = this.syncDraw('canvas_resize');\n if (sync_promise === false) return false;\n\n if ((size === true) || (size === false)) { force = size; size = null; }\n\n if (isObject(size) && size.force) force = true;\n\n if (!force) force = this.needRedrawByResize();\n\n let changed = false,\n redrawNext = indx => {\n if (!changed || (indx >= this.painters.length)) {\n this.confirmDraw();\n return changed;\n }\n\n return getPromise(this.painters[indx].redraw(force ? 'redraw' : 'resize')).then(() => redrawNext(indx+1));\n };\n\n return sync_promise.then(() => {\n\n changed = this.createCanvasSvg(force ? 2 : 1, size);\n\n // if canvas changed, redraw all its subitems.\n // If redrawing was forced for canvas, same applied for sub-elements\n return redrawNext(0);\n });\n }\n\n /** @summary update RPad object\n * @private */\n updateObject(obj) {\n if (!obj) return false;\n\n this.pad.fStyle = obj.fStyle;\n this.pad.fAttr = obj.fAttr;\n\n if (this.iscan) {\n this.pad.fTitle = obj.fTitle;\n this.pad.fWinSize = obj.fWinSize;\n } else {\n this.pad.fPos = obj.fPos;\n this.pad.fSize = obj.fSize;\n }\n\n return true;\n }\n\n\n /** @summary Add object painter to list of primitives\n * @private */\n addObjectPainter(objpainter, lst, indx) {\n if (objpainter && lst && lst[indx] && (objpainter.snapid === undefined)) {\n // keep snap id in painter, will be used for the\n if (this.painters.indexOf(objpainter) < 0)\n this.painters.push(objpainter);\n objpainter.assignSnapId(lst[indx].fObjectID);\n if (!objpainter.rstyle) objpainter.rstyle = lst[indx].fStyle || this.rstyle;\n }\n }\n\n /** @summary Extract properties from TObjectDisplayItem */\n extractTObjectProp(snap) {\n if (snap.fColIndex && snap.fColValue) {\n let colors = this.root_colors || getRootColors();\n for (let k = 0; k < snap.fColIndex.length; ++k)\n colors[snap.fColIndex[k]] = snap.fColValue[k];\n }\n\n // painter used only for evaluation of attributes\n let pattr = new RObjectPainter(), obj = snap.fObject;\n pattr.assignObject(snap);\n pattr.csstype = snap.fCssType;\n pattr.rstyle = snap.fStyle;\n\n snap.fOption = pattr.v7EvalAttr('options', '');\n\n const extract_color = (member_name, attr_name) => {\n let col = pattr.v7EvalColor(attr_name, '');\n if (col) obj[member_name] = addColor(col, this.root_colors);\n };\n\n // handle TAttLine\n if ((obj.fLineColor !== undefined) && (obj.fLineWidth !== undefined) && (obj.fLineStyle !== undefined)) {\n extract_color('fLineColor', 'line_color');\n obj.fLineWidth = pattr.v7EvalAttr('line_width', obj.fLineWidth);\n obj.fLineStyle = pattr.v7EvalAttr('line_style', obj.fLineStyle);\n }\n\n // handle TAttFill\n if ((obj.fFillColor !== undefined) && (obj.fFillStyle !== undefined)) {\n extract_color('fFillColor', 'fill_color');\n obj.fFillStyle = pattr.v7EvalAttr('fill_style', obj.fFillStyle);\n }\n\n // handle TAttMarker\n if ((obj.fMarkerColor !== undefined) && (obj.fMarkerStyle !== undefined) && (obj.fMarkerSize !== undefined)) {\n extract_color('fMarkerColor', 'marker_color');\n obj.fMarkerStyle = pattr.v7EvalAttr('marker_style', obj.fMarkerStyle);\n obj.fMarkerSize = pattr.v7EvalAttr('marker_size', obj.fMarkerSize);\n }\n\n // handle TAttText\n if ((obj.fTextColor !== undefined) && (obj.fTextAlign !== undefined) && (obj.fTextAngle !== undefined) && (obj.fTextSize !== undefined)) {\n extract_color('fTextColor', 'text_color');\n obj.fTextAlign = pattr.v7EvalAttr('text_align', obj.fTextAlign);\n obj.fTextAngle = pattr.v7EvalAttr('text_angle', obj.fTextAngle);\n obj.fTextSize = pattr.v7EvalAttr('text_size', obj.fTextSize);\n // TODO: v7 font handling differs much from v6, ignore for the moment\n }\n }\n\n /** @summary Function called when drawing next snapshot from the list\n * @return {Promise} with pad painter when ready\n * @private */\n async drawNextSnap(lst, indx) {\n\n if (indx === undefined) {\n indx = -1;\n // flag used to prevent immediate pad redraw during first draw\n this._snaps_map = {}; // to control how much snaps are drawn\n this._num_primitives = lst ? lst.length : 0;\n this._auto_color_cnt = 0;\n }\n\n delete this.next_rstyle;\n\n ++indx; // change to the next snap\n\n if (!lst || indx >= lst.length) {\n delete this._snaps_map;\n delete this._auto_color_cnt;\n return this;\n }\n\n let snap = lst[indx],\n snapid = snap.fObjectID,\n cnt = this._snaps_map[snapid],\n objpainter = null;\n\n if (cnt) cnt++; else cnt=1;\n this._snaps_map[snapid] = cnt; // check how many objects with same snapid drawn, use them again\n\n // empty object, no need to do something, take next\n if (snap.fDummy) return this.drawNextSnap(lst, indx);\n\n // first appropriate painter for the object\n // if same object drawn twice, two painters will exists\n for (let k = 0; k < this.painters.length; ++k) {\n if (this.painters[k].snapid === snapid)\n if (--cnt === 0) { objpainter = this.painters[k]; break; }\n }\n\n if (objpainter) {\n\n if (snap._typename == 'ROOT::Experimental::RPadDisplayItem') // subpad\n return objpainter.redrawPadSnap(snap).then(ppainter => {\n this.addObjectPainter(ppainter, lst, indx);\n return this.drawNextSnap(lst, indx);\n });\n\n if (snap._typename === 'ROOT::Experimental::TObjectDisplayItem')\n this.extractTObjectProp(snap);\n\n let promise;\n\n if (objpainter.updateObject(snap.fDrawable || snap.fObject || snap, snap.fOption || '', true))\n promise = objpainter.redraw();\n\n return getPromise(promise).then(() => this.drawNextSnap(lst, indx)); // call next\n }\n\n if (snap._typename == 'ROOT::Experimental::RPadDisplayItem') { // subpad\n\n let subpad = snap; // not subpad, but just attributes\n\n let padpainter = new RPadPainter(this.getDom(), subpad, false);\n padpainter.decodeOptions('');\n padpainter.addToPadPrimitives(this.this_pad_name); // only set parent pad name\n padpainter.assignSnapId(snap.fObjectID);\n padpainter.rstyle = snap.fStyle;\n\n padpainter.createPadSvg();\n\n if (snap.fPrimitives && snap.fPrimitives.length > 0)\n padpainter.addPadButtons();\n\n // we select current pad, where all drawing is performed\n let prev_name = padpainter.selectCurrentPad(padpainter.this_pad_name);\n\n return padpainter.drawNextSnap(snap.fPrimitives).then(() => {\n padpainter.selectCurrentPad(prev_name);\n return this.drawNextSnap(lst, indx);\n });\n }\n\n // will be used in addToPadPrimitives to assign style to sub-painters\n this.next_rstyle = lst[indx].fStyle || this.rstyle;\n\n if (snap._typename === 'ROOT::Experimental::TObjectDisplayItem') {\n\n // identifier used in RObjectDrawable\n const webSnapIds = { kNone: 0, kObject: 1, kColors: 4, kStyle: 5, kPalette: 6 };\n\n if (snap.fKind == webSnapIds.kStyle) {\n Object.assign(gStyle, snap.fObject);\n return this.drawNextSnap(lst, indx);\n }\n\n if (snap.fKind == webSnapIds.kColors) {\n let ListOfColors = [], arr = snap.fObject.arr;\n for (let n = 0; n < arr.length; ++n) {\n let name = arr[n].fString, p = name.indexOf('=');\n if (p > 0)\n ListOfColors[parseInt(name.slice(0,p))] = name.slice(p+1);\n }\n\n this.root_colors = ListOfColors;\n // set global list of colors\n // adoptRootColors(ListOfColors);\n return this.drawNextSnap(lst, indx);\n }\n\n if (snap.fKind == webSnapIds.kPalette) {\n let arr = snap.fObject.arr, palette = [];\n for (let n = 0; n < arr.length; ++n)\n palette[n] = arr[n].fString;\n this.custom_palette = new ColorPalette(palette);\n return this.drawNextSnap(lst, indx);\n }\n\n if (!this.getFramePainter())\n return this.drawObject(this.getDom(), { _typename: 'TFrame', $dummy: true }, '')\n .then(() => this.drawNextSnap(lst, indx-1)); // call same object again\n\n this.extractTObjectProp(snap);\n }\n\n // TODO - fDrawable is v7, fObject from v6, maybe use same data member?\n return this.drawObject(this.getDom(), snap.fDrawable || snap.fObject || snap, snap.fOption || '').then(objpainter => {\n this.addObjectPainter(objpainter, lst, indx);\n return this.drawNextSnap(lst, indx);\n });\n }\n\n /** @summary Search painter with specified snapid, also sub-pads are checked\n * @private */\n findSnap(snapid, onlyid) {\n\n function check(checkid) {\n if (!checkid || !isStr(checkid)) return false;\n if (checkid == snapid) return true;\n return onlyid && (checkid.length > snapid.length) &&\n (checkid.indexOf(snapid) == (checkid.length - snapid.length));\n }\n\n if (check(this.snapid)) return this;\n\n if (!this.painters) return null;\n\n for (let k=0;k {\n if (sub && (prim.fObjectID === sub.snapid)) {\n sub = null; isanyfound = true;\n }\n });\n\n if (sub) {\n // remove painter which does not found in the list of snaps\n this.painters.splice(k--,1);\n sub.cleanup(); // cleanup such painter\n isanyremove = true;\n if (this.main_painter_ref === sub)\n delete this.main_painter_ref;\n }\n }\n\n if (isanyremove)\n delete this.pads_cache;\n\n if (!isanyfound) {\n let fp = this.getFramePainter();\n // cannot preserve ROOT6 frame - it must be recreated\n if (fp?.is_root6()) fp = null;\n for (let k = 0; k < this.painters.length; ++k)\n if (fp !== this.painters[k])\n this.painters[k].cleanup();\n this.painters = [];\n delete this.main_painter_ref;\n if (fp) {\n this.painters.push(fp);\n fp.cleanFrameDrawings();\n fp.redraw(); // need to create all layers again\n }\n if (this.removePadButtons) this.removePadButtons();\n this.addPadButtons(true);\n }\n\n let prev_name = this.selectCurrentPad(this.this_pad_name);\n\n return this.drawNextSnap(snap.fPrimitives).then(() => {\n this.selectCurrentPad(prev_name);\n\n if (getActivePad() === this)\n this.getCanvPainter()?.producePadEvent('padredraw', this);\n return this;\n });\n }\n\n /** @summary Create image for the pad\n * @desc Used with web-based canvas to create images for server side\n * @return {Promise} with image data, coded with btoa() function\n * @private */\n async createImage(format) {\n // use https://github.com/MrRio/jsPDF in the future here\n if (format == 'pdf')\n return btoa_func('dummy PDF file');\n\n if ((format == 'png') || (format == 'jpeg') || (format == 'svg'))\n return this.produceImage(true, format).then(res => {\n if (!res || (format == 'svg')) return res;\n let separ = res.indexOf('base64,');\n return (separ > 0) ? res.slice(separ+7) : '';\n });\n\n return '';\n }\n\n /** @summary Show context menu for specified item\n * @private */\n itemContextMenu(name) {\n let rrr = this.svg_this_pad().node().getBoundingClientRect(),\n evnt = { clientX: rrr.left+10, clientY: rrr.top + 10 };\n\n // use timeout to avoid conflict with mouse click and automatic menu close\n if (name == 'pad')\n return setTimeout(() => this.padContextMenu(evnt), 50);\n\n let selp = null, selkind;\n\n switch(name) {\n case 'xaxis':\n case 'yaxis':\n case 'zaxis':\n selp = this.getMainPainter();\n selkind = name[0];\n break;\n case 'frame':\n selp = this.getFramePainter();\n break;\n default: {\n let indx = parseInt(name);\n if (Number.isInteger(indx)) selp = this.painters[indx];\n }\n }\n\n if (!isFunc(selp?.fillContextMenu)) return;\n\n createMenu(evnt, selp).then(menu => {\n if (selp.fillContextMenu(menu, selkind))\n selp.fillObjectExecMenu(menu, selkind).then(() => setTimeout(() => menu.show(), 50));\n });\n }\n\n /** @summary Save pad in specified format\n * @desc Used from context menu */\n saveAs(kind, full_canvas, filename) {\n if (!filename)\n filename = (this.this_pad_name || (this.iscan ? 'canvas' : 'pad')) + '.' + kind;\n\n this.produceImage(full_canvas, kind).then(imgdata => {\n if (!imgdata)\n return console.error(`Fail to produce image ${filename}`);\n\n saveFile(filename, (kind != 'svg') ? imgdata : 'data:image/svg+xml;charset=utf-8,'+encodeURIComponent(imgdata));\n });\n }\n\n /** @summary Search active pad\n * @return {Object} pad painter for active pad */\n findActivePad() {\n return null;\n }\n\n /** @summary Prodce image for the pad\n * @return {Promise} with created image */\n async produceImage(full_canvas, file_format) {\n\n let use_frame = (full_canvas === 'frame'),\n elem = use_frame ? this.getFrameSvg(this.this_pad_name) : (full_canvas ? this.getCanvSvg() : this.svg_this_pad()),\n painter = (full_canvas && !use_frame) ? this.getCanvPainter() : this,\n items = []; // keep list of replaced elements, which should be moved back at the end\n\n if (elem.empty())\n return '';\n\n if (!use_frame) // do not make transformations for the frame\n painter.forEachPainterInPad(pp => {\n\n let item = { prnt: pp.svg_this_pad() };\n items.push(item);\n\n // remove buttons from each subpad\n let btns = pp.getLayerSvg('btns_layer', this.this_pad_name);\n item.btns_node = btns.node();\n if (item.btns_node) {\n item.btns_prnt = item.btns_node.parentNode;\n item.btns_next = item.btns_node.nextSibling;\n btns.remove();\n }\n\n let main = pp.getFramePainter();\n if (!main || !isFunc(main.render3D) || !isFunc(main.access3dKind)) return;\n\n let can3d = main.access3dKind();\n\n if ((can3d !== constants.Embed3D.Overlay) && (can3d !== constants.Embed3D.Embed)) return;\n\n let sz2 = main.getSizeFor3d(constants.Embed3D.Embed), // get size and position of DOM element as it will be embed\n canvas = main.renderer.domElement;\n\n main.render3D(0); // WebGL clears buffers, therefore we should render scene and convert immediately\n\n let dataUrl = canvas.toDataURL('image/png');\n\n // remove 3D drawings\n\n if (can3d === constants.Embed3D.Embed) {\n item.foreign = item.prnt.select('.' + sz2.clname);\n item.foreign.remove();\n }\n\n let svg_frame = main.getFrameSvg();\n item.frame_node = svg_frame.node();\n if (item.frame_node) {\n item.frame_next = item.frame_node.nextSibling;\n svg_frame.remove();\n }\n\n // add svg image\n item.img = item.prnt.insert('image','.primitives_layer') // create image object\n .attr('x', sz2.x)\n .attr('y', sz2.y)\n .attr('width', canvas.width)\n .attr('height', canvas.height)\n .attr('href', dataUrl);\n\n }, 'pads');\n\n const reEncode = data => {\n data = encodeURIComponent(data);\n data = data.replace(/%([0-9A-F]{2})/g, function(match, p1) {\n let c = String.fromCharCode('0x'+p1);\n return c === '%' ? '%25' : c;\n });\n return decodeURIComponent(data);\n }, reconstruct = () => {\n for (let k = 0; k < items.length; ++k) {\n let item = items[k];\n\n if (item.img)\n item.img.remove(); // delete embed image\n\n let prim = item.prnt.select('.primitives_layer');\n\n if (item.foreign) // reinsert foreign object\n item.prnt.node().insertBefore(item.foreign.node(), prim.node());\n\n if (item.frame_node) // reinsert frame as first in list of primitives\n prim.node().insertBefore(item.frame_node, item.frame_next);\n\n if (item.btns_node) // reinsert buttons\n item.btns_prnt.insertBefore(item.btns_node, item.btns_next);\n }\n };\n\n let width = elem.property('draw_width'), height = elem.property('draw_height');\n if (use_frame) {\n let fp = this.getFramePainter();\n width = fp.getFrameWidth();\n height = fp.getFrameHeight();\n }\n\n let svg = `${elem.node().innerHTML}`;\n\n if (internals.processSvgWorkarounds)\n svg = internals.processSvgWorkarounds(svg);\n\n svg = compressSVG(svg);\n\n if (file_format == 'svg') {\n reconstruct();\n return svg; // return SVG file as is\n }\n\n let doctype = '',\n image = new Image();\n\n return new Promise(resolveFunc => {\n image.onload = function() {\n let canvas = document.createElement('canvas');\n canvas.width = image.width;\n canvas.height = image.height;\n let context = canvas.getContext('2d');\n context.drawImage(image, 0, 0);\n\n reconstruct();\n\n resolveFunc(canvas.toDataURL('image/' + file_format));\n }\n\n image.onerror = function(arg) {\n console.log(`IMAGE ERROR ${arg}`);\n reconstruct();\n resolveFunc(null);\n }\n\n image.src = 'data:image/svg+xml;base64,' + btoa_func(reEncode(doctype + svg));\n });\n }\n\n /** @summary Process pad button click */\n clickPadButton(funcname, evnt) {\n\n if (funcname == 'CanvasSnapShot')\n return this.saveAs('png', true);\n\n if (funcname == 'enlargePad')\n return this.enlargePad();\n\n if (funcname == 'PadSnapShot')\n return this.saveAs('png', false);\n\n if (funcname == 'PadContextMenus') {\n\n if (evnt) {\n evnt.preventDefault();\n evnt.stopPropagation();\n }\n\n if (closeMenu()) return;\n\n createMenu(evnt, this).then(menu => {\n menu.add('header:Menus');\n\n if (this.iscan)\n menu.add('Canvas', 'pad', this.itemContextMenu);\n else\n menu.add('Pad', 'pad', this.itemContextMenu);\n\n if (this.getFramePainter())\n menu.add('Frame', 'frame', this.itemContextMenu);\n\n let main = this.getMainPainter(); // here hist painter methods\n\n if (main) {\n menu.add('X axis', 'xaxis', this.itemContextMenu);\n menu.add('Y axis', 'yaxis', this.itemContextMenu);\n if (isFunc(main.getDimension) && (main.getDimension() > 1))\n menu.add('Z axis', 'zaxis', this.itemContextMenu);\n }\n\n if (this.painters?.length) {\n menu.add('separator');\n let shown = [];\n for (let n = 0; n < this.painters.length; ++n) {\n let obj = this.painters[n]?.getObject();\n if (!obj || (shown.indexOf(obj) >= 0)) continue;\n\n let name = obj._typename ? obj._typename + '::' : '';\n if (obj.fName) name += obj.fName;\n if (!name) name = 'item' + n;\n menu.add(name, n, this.itemContextMenu);\n }\n }\n\n menu.show();\n });\n\n return;\n }\n\n // click automatically goes to all sub-pads\n // if any painter indicates that processing completed, it returns true\n let done = false;\n\n for (let i = 0; i < this.painters.length; ++i) {\n let pp = this.painters[i];\n\n if (isFunc(pp.clickPadButton))\n pp.clickPadButton(funcname);\n\n if (!done && isFunc(pp.clickButton))\n done = pp.clickButton(funcname);\n }\n }\n\n /** @summary Add button to the pad\n * @private */\n addPadButton(btn, tooltip, funcname, keyname) {\n if (!settings.ToolBar || isBatchMode() || this.batch_mode) return;\n\n if (!this._buttons) this._buttons = [];\n // check if there are duplications\n\n for (let k = 0; k < this._buttons.length; ++k)\n if (this._buttons[k].funcname == funcname) return;\n\n this._buttons.push({ btn, tooltip, funcname, keyname });\n\n let iscan = this.iscan || !this.has_canvas;\n if (!iscan && (funcname.indexOf('Pad') != 0) && (funcname !== 'enlargePad')) {\n let cp = this.getCanvPainter();\n if (cp && (cp !== this)) cp.addPadButton(btn, tooltip, funcname);\n }\n }\n\n /** @summary Add buttons for pad or canvas\n * @private */\n addPadButtons(is_online) {\n\n this.addPadButton('camera', 'Create PNG', this.iscan ? 'CanvasSnapShot' : 'PadSnapShot', 'Ctrl PrintScreen');\n\n if (settings.ContextMenu)\n this.addPadButton('question', 'Access context menus', 'PadContextMenus');\n\n let add_enlarge = !this.iscan && this.has_canvas && this.hasObjectsToDraw()\n\n if (add_enlarge || this.enlargeMain('verify'))\n this.addPadButton('circle', 'Enlarge canvas', 'enlargePad');\n\n if (is_online && this.brlayout) {\n this.addPadButton('diamand', 'Toggle Ged', 'ToggleGed');\n this.addPadButton('three_circles', 'Toggle Status', 'ToggleStatus');\n }\n\n }\n\n /** @summary Show pad buttons\n * @private */\n showPadButtons() {\n if (!this._buttons) return;\n\n PadButtonsHandler.assign(this);\n this.showPadButtons();\n }\n\n /** @summary Calculates RPadLength value */\n getPadLength(vertical, len, frame_painter) {\n let sign = vertical ? -1 : 1,\n rect, res,\n getV = (indx, dflt) => (indx < len.fArr.length) ? len.fArr[indx] : dflt,\n getRect = () => {\n if (!rect)\n rect = frame_painter ? frame_painter.getFrameRect() : this.getPadRect();\n return rect;\n };\n\n if (frame_painter) {\n let user = getV(2), func = vertical ? 'gry' : 'grx';\n if ((user !== undefined) && frame_painter[func])\n res = frame_painter[func](user);\n }\n\n if (res === undefined)\n res = vertical ? getRect().height : 0;\n\n let norm = getV(0, 0), pixel = getV(1, 0);\n\n res += sign*pixel;\n\n if (norm)\n res += sign * (vertical ? getRect().height : getRect().width) * norm;\n\n return Math.round(res);\n }\n\n\n /** @summary Calculates pad position for RPadPos values\n * @param {object} pos - instance of RPadPos\n * @param {object} frame_painter - if drawing will be performed inside frame, frame painter */\n getCoordinate(pos, frame_painter) {\n return {\n x: this.getPadLength(false, pos.fHoriz, frame_painter),\n y: this.getPadLength(true, pos.fVert, frame_painter)\n }\n }\n\n /** @summary Decode pad draw options */\n decodeOptions(opt) {\n let pad = this.getObject();\n if (!pad) return;\n\n let d = new DrawOptions(opt);\n\n if (!this.options) this.options = {};\n\n Object.assign(this.options, { GlobalColors: true, LocalColors: false, IgnorePalette: false, RotateFrame: false, FixFrame: false });\n\n if (d.check('NOCOLORS') || d.check('NOCOL')) this.options.GlobalColors = this.options.LocalColors = false;\n if (d.check('LCOLORS') || d.check('LCOL')) { this.options.GlobalColors = false; this.options.LocalColors = true; }\n if (d.check('NOPALETTE') || d.check('NOPAL')) this.options.IgnorePalette = true;\n if (d.check('ROTATE')) this.options.RotateFrame = true;\n if (d.check('FIXFRAME')) this.options.FixFrame = true;\n\n if (d.check('WHITE')) pad.fFillColor = 0;\n if (d.check('LOGX')) pad.fLogx = 1;\n if (d.check('LOGY')) pad.fLogy = 1;\n if (d.check('LOGZ')) pad.fLogz = 1;\n if (d.check('LOG')) pad.fLogx = pad.fLogy = pad.fLogz = 1;\n if (d.check('GRIDX')) pad.fGridx = 1;\n if (d.check('GRIDY')) pad.fGridy = 1;\n if (d.check('GRID')) pad.fGridx = pad.fGridy = 1;\n if (d.check('TICKX')) pad.fTickx = 1;\n if (d.check('TICKY')) pad.fTicky = 1;\n if (d.check('TICK')) pad.fTickx = pad.fTicky = 1;\n }\n\n /** @summary draw RPad object */\n static async draw(dom, pad, opt) {\n let painter = new RPadPainter(dom, pad, false);\n painter.decodeOptions(opt);\n\n if (painter.getCanvSvg().empty()) {\n painter.has_canvas = false;\n painter.this_pad_name = '';\n painter.setTopPainter();\n } else {\n painter.addToPadPrimitives(painter.pad_name); // must be here due to pad painter\n }\n\n painter.createPadSvg();\n\n if (painter.matchObjectType(clTPad) && (!painter.has_canvas || painter.hasObjectsToDraw())) {\n painter.addPadButtons();\n }\n\n // we select current pad, where all drawing is performed\n let prev_name = painter.has_canvas ? painter.selectCurrentPad(painter.this_pad_name) : undefined;\n\n selectActivePad({ pp: painter, active: false });\n\n // flag used to prevent immediate pad redraw during first draw\n return painter.drawPrimitives().then(() => {\n painter.showPadButtons();\n // we restore previous pad name\n painter.selectCurrentPad(prev_name);\n return painter;\n });\n }\n\n} // class RPadPainter\n\nexport { RPadPainter };\n","import { httpRequest, createHttpRequest, loadScript, decodeUrl,\n browser, setBatchMode, isBatchMode, isObject, isFunc, isStr, btoa_func } from './core.mjs';\nimport { closeCurrentWindow, showProgress, loadOpenui5 } from './gui/utils.mjs';\n\n\n/**\n * @summary Class emulating web socket with long-poll http requests\n *\n * @private\n */\n\nclass LongPollSocket {\n\n constructor(addr, _raw, _args) {\n this.path = addr;\n this.connid = null;\n this.req = null;\n this.raw = _raw;\n this.args = _args;\n\n this.nextRequest('', 'connect');\n }\n\n /** @summary Submit next request */\n nextRequest(data, kind) {\n let url = this.path, reqmode = 'buf', post = null;\n if (kind === 'connect') {\n url += this.raw ? '?raw_connect' : '?txt_connect';\n if (this.args) url += '&' + this.args;\n console.log(`longpoll connect ${url} raw = ${this.raw}`);\n this.connid = 'connect';\n } else if (kind === 'close') {\n if ((this.connid === null) || (this.connid === 'close')) return;\n url += `?connection=${this.connid}&close`;\n this.connid = 'close';\n reqmode = 'text;sync'; // use sync mode to close connection before browser window closed\n } else if ((this.connid === null) || (typeof this.connid !== 'number')) {\n if (!browser.qt5) console.error('No connection');\n return;\n } else {\n url += '?connection=' + this.connid;\n if (kind === 'dummy') url += '&dummy';\n }\n\n if (data) {\n if (this.raw) {\n // special workaround to avoid POST request, use base64 coding\n url += '&post=' + btoa_func(data);\n } else {\n // send data with post request - most efficient way\n reqmode = 'postbuf';\n post = data;\n }\n }\n\n createHttpRequest(url, reqmode, function(res) {\n // this set to the request itself, res is response\n\n if (this.handle.req === this)\n this.handle.req = null; // get response for existing dummy request\n\n if (res === null)\n return this.handle.processRequest(null);\n\n if (this.handle.raw) {\n // raw mode - all kind of reply data packed into binary buffer\n // first 4 bytes header 'txt:' or 'bin:'\n // after the 'bin:' there is length of optional text argument like 'bin:14 :optional_text'\n // and immedaitely after text binary data. Server sends binary data so, that offset should be multiple of 8\n\n let str = '', i = 0, u8Arr = new Uint8Array(res), offset = u8Arr.length;\n if (offset < 4) {\n if (!browser.qt5) console.error(`longpoll got short message in raw mode ${offset}`);\n return this.handle.processRequest(null);\n }\n\n while (i < 4) str += String.fromCharCode(u8Arr[i++]);\n if (str != 'txt:') {\n str = '';\n while ((i < offset) && (String.fromCharCode(u8Arr[i]) != ':'))\n str += String.fromCharCode(u8Arr[i++]);\n ++i;\n offset = i + parseInt(str.trim());\n }\n\n str = '';\n while (i < offset) str += String.fromCharCode(u8Arr[i++]);\n\n if (str) {\n if (str == '<>')\n this.handle.processRequest(-1111);\n else\n this.handle.processRequest(str);\n }\n if (offset < u8Arr.length)\n this.handle.processRequest(res, offset);\n } else if (this.getResponseHeader('Content-Type') == 'application/x-binary') {\n // binary reply with optional header\n let extra_hdr = this.getResponseHeader('LongpollHeader');\n if (extra_hdr) this.handle.processRequest(extra_hdr);\n this.handle.processRequest(res, 0);\n } else {\n // text reply\n if (res && !isStr(res)) {\n let str = '', u8Arr = new Uint8Array(res);\n for (let i = 0; i < u8Arr.length; ++i)\n str += String.fromCharCode(u8Arr[i]);\n res = str;\n }\n if (res == '<>')\n this.handle.processRequest(-1111);\n else\n this.handle.processRequest(res);\n }\n }, function(/*err,status*/) {\n this.handle.processRequest(null, 'error');\n }, true).then(req => {\n req.handle = this;\n if (!this.req)\n this.req = req; // any request can be used for response, do not submit dummy until req is there\n req.send(post);\n });\n }\n\n /** @summary Process request */\n processRequest(res, _offset) {\n if (res === null) {\n if (isFunc(this.onerror))\n this.onerror('receive data with connid ' + (this.connid || '---'));\n if ((_offset == 'error') && isFunc(this.onclose))\n this.onclose('force_close');\n this.connid = null;\n return;\n } else if (res === -1111) {\n res = '';\n }\n\n let dummy_tmout = 5;\n\n if (this.connid === 'connect') {\n if (!res) {\n this.connid = null;\n if (isFunc(this.onerror))\n this.onerror('connection rejected');\n return;\n }\n\n this.connid = parseInt(res);\n dummy_tmout = 100; // when establishing connection, wait a bit longer to submit dummy package\n console.log(`Get new longpoll connection with id ${this.connid}`);\n if (isFunc(this.onopen))\n this.onopen();\n } else if (this.connid === 'close') {\n if (isFunc(this.onclose))\n this.onclose();\n return;\n } else {\n if (isFunc(this.onmessage) && res)\n this.onmessage({ data: res, offset: _offset });\n }\n\n // minimal timeout to reduce load, generate dummy only if client not submit new request immediately\n if (!this.req)\n setTimeout(() => { if (!this.req) this.nextRequest('', 'dummy'); }, dummy_tmout);\n }\n\n /** @summary Send data */\n send(str) { this.nextRequest(str); }\n\n /** @summary Close connection */\n close() { this.nextRequest('', 'close'); }\n\n} // class LongPollSocket\n\n// ========================================================================================\n\n/**\n * @summary Class re-playing socket data from stored protocol\n *\n * @private\n */\n\nclass FileDumpSocket {\n\n constructor(receiver) {\n this.receiver = receiver;\n this.protocol = [];\n this.cnt = 0;\n httpRequest('protocol.json', 'text').then(res => this.getProtocol(res));\n }\n\n /** @summary Get stored protocol */\n getProtocol(res) {\n if (!res) return;\n this.protocol = JSON.parse(res);\n if (isFunc(this.onopen)) this.onopen();\n this.nextOperation();\n }\n\n /** @summary Emulate send - just cound operation */\n send(/* str */) {\n if (this.protocol[this.cnt] == 'send') {\n this.cnt++;\n setTimeout(() => this.nextOperation(), 10);\n }\n }\n\n /** @summary Emulate close */\n close() {}\n\n /** @summary Read data for next operation */\n nextOperation() {\n // when file request running - just ignore\n if (this.wait_for_file) return;\n let fname = this.protocol[this.cnt];\n if (!fname) return;\n if (fname == 'send') return; // waiting for send\n this.wait_for_file = true;\n this.cnt++;\n httpRequest(fname, (fname.indexOf('.bin') > 0 ? 'buf' : 'text')).then(res => {\n this.wait_for_file = false;\n if (!res) return;\n if (this.receiver.provideData)\n this.receiver.provideData(1, res, 0);\n setTimeout(() => this.nextOperation(), 10);\n });\n }\n\n} // class FileDumpSocket\n\n\n/**\n * @summary Client communication handle for RWebWindow.\n *\n * @desc Should be created with {@link connectWebWindow} function\n */\n\nclass WebWindowHandle {\n\n constructor(socket_kind, credits) {\n this.kind = socket_kind;\n this.state = 0;\n this.credits = credits || 10;\n this.cansend = this.credits;\n this.ackn = this.credits;\n }\n\n /** @summary Returns arguments specified in the RWebWindow::SetUserArgs() method\n * @desc Can be any valid JSON expression. Undefined by default.\n * @param {string} [field] - if specified and user args is object, returns correspondent object member\n * @return user arguments object */\n getUserArgs(field) {\n if (field && isStr(field))\n return isObject(this.user_args) ? this.user_args[field] : undefined;\n\n return this.user_args;\n }\n\n /** @summary Set user args\n * @desc Normally set via RWebWindow::SetUserArgs() method */\n setUserArgs(args) { this.user_args = args; }\n\n /** @summary Set callbacks receiver.\n * @param {object} obj - object with receiver functions\n * @param {function} obj.onWebsocketMsg - called when new data receieved from RWebWindow\n * @param {function} obj.onWebsocketOpened - called when connection established\n * @param {function} obj.onWebsocketClosed - called when connection closed\n * @param {function} obj.onWebsocketError - called when get error via the connection */\n setReceiver(obj) { this.receiver = obj; }\n\n /** @summary Cleanup and close connection. */\n cleanup() {\n delete this.receiver;\n this.close(true);\n }\n\n /** @summary Invoke method in the receiver.\n * @private */\n invokeReceiver(brdcst, method, arg, arg2) {\n if (this.receiver && isFunc(this.receiver[method]))\n this.receiver[method](this, arg, arg2);\n\n if (brdcst && this.channels) {\n let ks = Object.keys(this.channels);\n for (let n = 0; n < ks.length; ++n)\n this.channels[ks[n]].invokeReceiver(false, method, arg, arg2);\n }\n }\n\n /** @summary Provide data for receiver. When no queue - do it directly.\n * @private */\n provideData(chid, _msg, _len) {\n if (this.wait_first_recv) {\n delete this.wait_first_recv;\n return this.invokeReceiver(false, 'onWebsocketOpened');\n }\n\n if ((chid > 1) && this.channels) {\n const channel = this.channels[chid];\n if (channel)\n return channel.provideData(1, _msg, _len);\n }\n\n const force_queue = _len && (_len < 0);\n\n if (!force_queue && (!this.msgqueue || !this.msgqueue.length))\n return this.invokeReceiver(false, 'onWebsocketMsg', _msg, _len);\n\n if (!this.msgqueue) this.msgqueue = [];\n if (force_queue) _len = undefined;\n\n this.msgqueue.push({ ready: true, msg: _msg, len: _len });\n }\n\n /** @summary Reserve entry in queue for data, which is not yet decoded.\n * @private */\n reserveQueueItem() {\n if (!this.msgqueue) this.msgqueue = [];\n let item = { ready: false, msg: null, len: 0 };\n this.msgqueue.push(item);\n return item;\n }\n\n /** @summary Provide data for item which was reserved before.\n * @private */\n markQueueItemDone(item, _msg, _len) {\n item.ready = true;\n item.msg = _msg;\n item.len = _len;\n this.processQueue();\n }\n\n /** @summary Process completed messages in the queue\n * @private */\n processQueue() {\n if (this._loop_msgqueue || !this.msgqueue) return;\n this._loop_msgqueue = true;\n while ((this.msgqueue.length > 0) && this.msgqueue[0].ready) {\n let front = this.msgqueue.shift();\n this.invokeReceiver(false, 'onWebsocketMsg', front.msg, front.len);\n }\n if (this.msgqueue.length == 0)\n delete this.msgqueue;\n delete this._loop_msgqueue;\n }\n\n /** @summary Close connection */\n close(force) {\n if (this.master) {\n this.master.send('CLOSECH=' + this.channelid, 0);\n delete this.master.channels[this.channelid];\n delete this.master;\n return;\n }\n\n if (this.timerid) {\n clearTimeout(this.timerid);\n delete this.timerid;\n }\n\n if (this._websocket && (this.state > 0)) {\n this.state = force ? -1 : 0; // -1 prevent socket from reopening\n this._websocket.onclose = null; // hide normal handler\n this._websocket.close();\n delete this._websocket;\n }\n }\n\n /** @summary Checks number of credits for send operation\n * @param {number} [numsend = 1] - number of required send operations\n * @return true if one allow to send specified number of text message to server */\n canSend(numsend) { return this.cansend >= (numsend || 1); }\n\n /** @summary Returns number of possible send operations relative to number of credits */\n getRelCanSend() { return !this.credits ? 1 : this.cansend / this.credits; }\n\n /** @summary Send text message via the connection.\n * @param {string} msg - text message to send\n * @param {number} [chid] - channel id, 1 by default, 0 used only for internal communication */\n send(msg, chid) {\n if (this.master)\n return this.master.send(msg, this.channelid);\n\n if (!this._websocket || (this.state <= 0)) return false;\n\n if (!Number.isInteger(chid)) chid = 1; // when not configured, channel 1 is used - main widget\n\n if (this.cansend <= 0) console.error(`should be queued before sending cansend: ${this.cansend}`);\n\n let prefix = `${this.ackn}:${this.cansend}:${chid}:`;\n this.ackn = 0;\n this.cansend--; // decrease number of allowed send packets\n\n this._websocket.send(prefix + msg);\n\n if ((this.kind === 'websocket') || (this.kind === 'longpoll')) {\n if (this.timerid) clearTimeout(this.timerid);\n this.timerid = setTimeout(() => this.keepAlive(), 10000);\n }\n\n return true;\n }\n\n /** @summary Inject message(s) into input queue, for debug purposes only\n * @private */\n inject(msg, chid, immediate) {\n // use timeout to avoid too deep call stack\n if (!immediate)\n return setTimeout(this.inject.bind(this, msg, chid, true), 0);\n\n if (chid === undefined) chid = 1;\n\n if (Array.isArray(msg)) {\n for (let k = 0; k < msg.length; ++k)\n this.provideData(chid, isStr(msg[k]) ? msg[k] : JSON.stringify(msg[k]), -1);\n this.processQueue();\n } else if (msg) {\n this.provideData(chid, isStr(msg) ? msg : JSON.stringify(msg));\n }\n }\n\n /** @summary Send keep-alive message.\n * @desc Only for internal use, only when used with websockets\n * @private */\n keepAlive() {\n delete this.timerid;\n this.send('KEEPALIVE', 0);\n }\n\n /** @summary Method open channel, which will share same connection, but can be used independently from main\n * @private */\n createChannel() {\n if (this.master)\n return master.createChannel();\n\n let channel = new WebWindowHandle('channel', this.credits);\n channel.wait_first_recv = true; // first received message via the channel is confirmation of established connection\n\n if (!this.channels) {\n this.channels = {};\n this.freechannelid = 2;\n }\n\n channel.master = this;\n channel.channelid = this.freechannelid++;\n\n // register\n this.channels[channel.channelid] = channel;\n\n // now server-side entity should be initialized and init message send from server side!\n return channel;\n }\n\n /** @summary Returns used channel ID, 1 by default */\n getChannelId() { return this.channelid && this.master ? this.channelid : 1; }\n\n /** @summary Assign href parameter\n * @param {string} [path] - absolute path, when not specified window.location.url will be used\n * @private */\n setHRef(path) { this.href = path; }\n\n /** @summary Return href part\n * @param {string} [relative_path] - relative path to the handle\n * @private */\n getHRef(relative_path) {\n if (!relative_path || !this.kind || !this.href) return this.href;\n\n let addr = this.href;\n if (relative_path.indexOf('../') == 0) {\n let ddd = addr.lastIndexOf('/',addr.length-2);\n addr = addr.slice(0,ddd) + relative_path.slice(2);\n } else {\n addr += relative_path;\n }\n\n return addr;\n }\n\n /** @summary Create configured socket for current object.\n * @private */\n connect(href) {\n\n this.close();\n if (!href && this.href) href = this.href;\n\n let ntry = 0, args = (this.key ? ('key=' + this.key) : '');\n if (this.token) {\n if (args) args += '&';\n args += 'token=' + this.token;\n }\n\n const retry_open = first_time => {\n\n if (this.state != 0) return;\n\n if (!first_time) console.log(`try connect window again ${new Date().toString()}`);\n\n if (this._websocket) {\n this._websocket.close();\n delete this._websocket;\n }\n\n if (!href) {\n href = window.location.href;\n if (href && href.indexOf('#') > 0) href = href.slice(0, href.indexOf('#'));\n if (href && href.lastIndexOf('/') > 0) href = href.slice(0, href.lastIndexOf('/') + 1);\n }\n this.href = href;\n ntry++;\n\n if (first_time) console.log(`Opening web socket at ${href}`);\n\n if (ntry > 2) showProgress(`Trying to connect ${href}`);\n\n let path = href;\n\n if (this.kind == 'file') {\n path += 'root.filedump';\n this._websocket = new FileDumpSocket(this);\n console.log(`configure protocol log ${path}`);\n } else if ((this.kind === 'websocket') && first_time) {\n path = path.replace('http://', 'ws://').replace('https://', 'wss://') + 'root.websocket';\n if (args) path += '?' + args;\n console.log(`configure websocket ${path}`);\n this._websocket = new WebSocket(path);\n } else {\n path += 'root.longpoll';\n console.log(`configure longpoll ${path}`);\n this._websocket = new LongPollSocket(path, (this.kind === 'rawlongpoll'), args);\n }\n\n if (!this._websocket) return;\n\n this._websocket.onopen = () => {\n if (ntry > 2) showProgress();\n this.state = 1;\n\n let key = this.key || '';\n\n this.send('READY=' + key, 0); // need to confirm connection\n this.invokeReceiver(false, 'onWebsocketOpened');\n };\n\n this._websocket.onmessage = e => {\n let msg = e.data;\n\n if (this.next_binary) {\n\n let binchid = this.next_binary;\n delete this.next_binary;\n\n if (msg instanceof Blob) {\n // convert Blob object to BufferArray\n let reader = new FileReader, qitem = this.reserveQueueItem();\n // The file's text will be printed here\n reader.onload = event => this.markQueueItemDone(qitem, event.target.result, 0);\n reader.readAsArrayBuffer(msg, e.offset || 0);\n } else {\n // this is from CEF or LongPoll handler\n this.provideData(binchid, msg, e.offset || 0);\n }\n\n return;\n }\n\n if (!isStr(msg))\n return console.log(`unsupported message kind: ${typeof msg}`);\n\n let i1 = msg.indexOf(':'),\n credit = parseInt(msg.slice(0, i1)),\n i2 = msg.indexOf(':', i1 + 1),\n // cansend = parseInt(msg.slice(i1 + 1, i2)), // TODO: take into account when sending messages\n i3 = msg.indexOf(':', i2 + 1),\n chid = parseInt(msg.slice(i2 + 1, i3));\n\n this.ackn++; // count number of received packets,\n this.cansend += credit; // how many packets client can send\n\n msg = msg.slice(i3 + 1);\n\n if (chid == 0) {\n console.log(`GET chid=0 message ${msg}`);\n if (msg == 'CLOSE') {\n this.close(true); // force closing of socket\n this.invokeReceiver(true, 'onWebsocketClosed');\n } else if (msg.indexOf('NEW_KEY=') == 0) {\n let newkey = msg.slice(8);\n this.close(true);\n if (typeof sessionStorage !== 'undefined')\n sessionStorage.setItem('RWebWindow_Key', newkey);\n location.reload(true);\n }\n } else if (msg == '$$binary$$') {\n this.next_binary = chid;\n } else if (msg == '$$nullbinary$$') {\n this.provideData(chid, new ArrayBuffer(0), 0);\n } else {\n this.provideData(chid, msg);\n }\n\n if (this.ackn > 7)\n this.send('READY', 0); // send dummy message to server\n };\n\n this._websocket.onclose = arg => {\n delete this._websocket;\n if ((this.state > 0) || (arg === 'force_close')) {\n console.log('websocket closed');\n this.state = 0;\n this.invokeReceiver(true, 'onWebsocketClosed');\n }\n };\n\n this._websocket.onerror = err => {\n console.log(`websocket error ${err} state ${this.state}`);\n if (this.state > 0) {\n this.invokeReceiver(true, 'onWebsocketError', err);\n this.state = 0;\n }\n };\n\n // only in interactive mode try to reconnect\n if (!isBatchMode())\n setTimeout(retry_open, 3000); // after 3 seconds try again\n\n } // retry_open\n\n retry_open(true); // call for the first time\n }\n\n /** @summary Send newkey request to application\n * @desc If server creates newkey and response - webpage will be reaload\n * After key generation done, connection will not be working any longer\n * WARNING - only call when you know that you are doing\n * @private */\n askReload() {\n this.send('GENERATE_KEY', 0);\n }\n\n /** @summary Instal Ctrl-R handler to realod web window\n * @desc Instead of default window reload invokes {@link askReload} method\n * WARNING - only call when you know that you are doing\n * @private */\n addReloadKeyHandler() {\n\n if (this.kind == 'file') return;\n\n window.addEventListener( 'keydown', evnt => {\n if (((evnt.key == 'R') || (evnt.key == 'r')) && evnt.ctrlKey) {\n evnt.stopPropagation();\n evnt.preventDefault();\n console.log('Prevent Ctrl-R propogation - ask reload RWebWindow!');\n this.askReload();\n }\n });\n }\n\n} // class WebWindowHandle\n\n\n/** @summary Method used to initialize connection to web window.\n * @param {object} arg - arguments\n * @param {string} [arg.socket_kind] - kind of connection longpoll|websocket, detected automatically from URL\n * @param {number} [arg.credits = 10] - number of packets which can be send to server without acknowledge\n * @param {object} arg.receiver - instance of receiver for websocket events, allows to initiate connection immediately\n * @param {string} [arg.first_recv] - required prefix in the first message from RWebWindow, remain part of message will be returned in handle.first_msg\n * @param {string} [arg.href] - URL to RWebWindow, using window.location.href by default\n * @return {Promise} for ready-to-use {@link WebWindowHandle} instance */\nasync function connectWebWindow(arg) {\n\n if (isFunc(arg))\n arg = { callback: arg };\n else if (!isObject(arg))\n arg = {};\n\n let d = decodeUrl();\n\n // special holder script, prevents headless chrome browser from too early exit\n if (d.has('headless') && d.get('key') && (browser.isChromeHeadless || browser.isChrome) && !arg.ignore_chrome_batch_holder)\n loadScript('root_batch_holder.js?key=' + d.get('key'));\n\n if (!arg.platform)\n arg.platform = d.get('platform');\n\n if (arg.platform == 'qt5')\n browser.qt5 = true;\n else if (arg.platform == 'cef3')\n browser.cef3 = true;\n\n if (arg.batch === undefined)\n arg.batch = d.has('headless');\n\n if (arg.batch) setBatchMode(true);\n\n if (!arg.socket_kind)\n arg.socket_kind = d.get('ws');\n\n if (!arg.socket_kind) {\n if (browser.qt5)\n arg.socket_kind = 'rawlongpoll';\n else if (browser.cef3)\n arg.socket_kind = 'longpoll';\n else\n arg.socket_kind = 'websocket';\n }\n\n // only for debug purposes\n // arg.socket_kind = 'longpoll';\n\n let main = new Promise(resolveFunc => {\n let handle = new WebWindowHandle(arg.socket_kind, arg.credits);\n handle.setUserArgs(arg.user_args);\n if (arg.href) handle.setHRef(arg.href); // apply href now while connect can be called from other place\n\n if (window) {\n window.onbeforeunload = () => handle.close(true);\n if (browser.qt5) window.onqt5unload = window.onbeforeunload;\n }\n\n handle.key = d.get('key');\n handle.token = d.get('token');\n\n if (typeof sessionStorage !== 'undefined') {\n let new_key = sessionStorage.getItem('RWebWindow_Key');\n sessionStorage.removeItem('RWebWindow_Key');\n if (new_key) {\n console.log(`Use key ${new_key} from session storage`);\n handle.key = new_key;\n }\n }\n\n if (arg.receiver) {\n // when receiver exists, it handles itself callbacks\n handle.setReceiver(arg.receiver);\n handle.connect();\n return resolveFunc(handle);\n }\n\n if (!arg.first_recv)\n return resolveFunc(handle);\n\n handle.setReceiver({\n onWebsocketOpened() {}, // dummy function when websocket connected\n\n onWebsocketMsg(handle, msg) {\n if (msg.indexOf(arg.first_recv) != 0)\n return handle.close();\n handle.first_msg = msg.slice(arg.first_recv.length);\n resolveFunc(handle);\n },\n\n onWebsocketClosed() { closeCurrentWindow(); } // when connection closed, close panel as well\n });\n\n handle.connect();\n });\n\n if (!arg.ui5) return main;\n\n return Promise.all([main, loadOpenui5(arg)]).then(arr => arr[0]);\n}\n\nexport { WebWindowHandle, connectWebWindow };\n","import { settings, create, parse, toJSON, loadScript, registerMethods, isBatchMode, isFunc, isStr } from '../core.mjs';\nimport { select as d3_select, rgb as d3_rgb } from '../d3.mjs';\nimport { closeCurrentWindow, showProgress, loadOpenui5, ToolbarIcons, getColorExec } from '../gui/utils.mjs';\nimport { GridDisplay, getHPainter } from '../gui/display.mjs';\nimport { selectActivePad, cleanup, resize, EAxisBits } from '../base/ObjectPainter.mjs';\nimport { RObjectPainter } from '../base/RObjectPainter.mjs';\nimport { RAxisPainter } from './RAxisPainter.mjs';\nimport { RFramePainter } from './RFramePainter.mjs';\nimport { RPadPainter } from './RPadPainter.mjs';\nimport { addDragHandler } from './TFramePainter.mjs';\nimport { WebWindowHandle } from '../webwindow.mjs';\n\n\n/**\n * @summary Painter class for RCanvas\n *\n * @private\n */\n\nclass RCanvasPainter extends RPadPainter {\n\n /** @summary constructor */\n constructor(dom, canvas) {\n super(dom, canvas, true);\n this._websocket = null;\n this.tooltip_allowed = settings.Tooltip;\n this.v7canvas = true;\n }\n\n /** @summary Cleanup canvas painter */\n cleanup() {\n delete this._websocket;\n delete this._submreq;\n\n if (this._changed_layout)\n this.setLayoutKind('simple');\n delete this._changed_layout;\n\n super.cleanup();\n }\n\n /** @summary Returns layout kind */\n getLayoutKind() {\n let origin = this.selectDom('origin'),\n layout = origin.empty() ? '' : origin.property('layout');\n return layout || 'simple';\n }\n\n /** @summary Set canvas layout kind */\n setLayoutKind(kind, main_selector) {\n let origin = this.selectDom('origin');\n if (!origin.empty()) {\n if (!kind) kind = 'simple';\n origin.property('layout', kind);\n origin.property('layout_selector', (kind != 'simple') && main_selector ? main_selector : null);\n this._changed_layout = (kind !== 'simple'); // use in cleanup\n }\n }\n\n /** @summary Changes layout\n * @return {Promise} indicating when finished */\n async changeLayout(layout_kind, mainid) {\n let current = this.getLayoutKind();\n if (current == layout_kind)\n return true;\n\n let origin = this.selectDom('origin'),\n sidebar = origin.select('.side_panel'),\n main = this.selectDom(), lst = [];\n\n while (main.node().firstChild)\n lst.push(main.node().removeChild(main.node().firstChild));\n\n if (!sidebar.empty())\n cleanup(sidebar.node());\n\n this.setLayoutKind('simple'); // restore defaults\n origin.html(''); // cleanup origin\n\n if (layout_kind == 'simple') {\n main = origin;\n for (let k = 0; k < lst.length; ++k)\n main.node().appendChild(lst[k]);\n this.setLayoutKind(layout_kind);\n } else {\n let grid = new GridDisplay(origin.node(), layout_kind);\n\n if (mainid == undefined)\n mainid = (layout_kind.indexOf('vert') == 0) ? 0 : 1;\n\n main = d3_select(grid.getGridFrame(mainid));\n sidebar = d3_select(grid.getGridFrame(1 - mainid));\n\n main.classed('central_panel', true).style('position', 'relative');\n sidebar.classed('side_panel', true).style('position', 'relative');\n\n // now append all childs to the new main\n for (let k = 0; k < lst.length; ++k)\n main.node().appendChild(lst[k]);\n\n this.setLayoutKind(layout_kind, '.central_panel');\n\n // remove reference to MDIDisplay, solves resize problem\n origin.property('mdi', null);\n }\n\n // resize main drawing and let draw extras\n resize(main.node());\n return true;\n }\n\n /** @summary Toggle projection\n * @return {Promise} indicating when ready\n * @private */\n async toggleProjection(kind) {\n delete this.proj_painter;\n\n if (kind) this.proj_painter = 1; // just indicator that drawing can be preformed\n\n if (isFunc(this.showUI5ProjectionArea))\n return this.showUI5ProjectionArea(kind);\n\n let layout = 'simple', mainid;\n\n switch(kind) {\n case 'X':\n case 'bottom': layout = 'vert2_31'; mainid = 0; break;\n case 'Y':\n case 'left': layout = 'horiz2_13'; mainid = 1; break;\n case 'top': layout = 'vert2_13'; mainid = 1; break;\n case 'right': layout = 'horiz2_31'; mainid = 0; break;\n }\n\n return this.changeLayout(layout, mainid);\n }\n\n /** @summary Draw projection for specified histogram\n * @private */\n async drawProjection( /*kind,hist*/) {\n // dummy for the moment\n return false;\n }\n\n /** @summary Draw in side panel\n * @private */\n async drawInSidePanel(canv, opt) {\n let side = this.selectDom('origin').select('.side_panel');\n return side.empty() ? null : this.drawObject(side.node(), canv, opt);\n }\n\n /** @summary Checks if canvas shown inside ui5 widget\n * @desc Function should be used only from the func which supposed to be replaced by ui5\n * @private */\n testUI5() {\n if (!this.use_openui) return false;\n console.warn('full ui5 should be used - not loaded yet? Please check!!');\n return true;\n }\n\n /** @summary Show message\n * @desc Used normally with web-based canvas and handled in ui5\n * @private */\n showMessage(msg) {\n if (!this.testUI5())\n showProgress(msg, 7000);\n }\n\n /** @summary Function called when canvas menu item Save is called */\n saveCanvasAsFile(fname) {\n let pnt = fname.indexOf('.');\n this.createImage(fname.slice(pnt+1))\n .then(res => { console.log('save', fname, res.length); this.sendWebsocket('SAVE:' + fname + ':' + res); });\n }\n\n /** @summary Send command to server to save canvas with specified name\n * @desc Should be only used in web-based canvas\n * @private */\n sendSaveCommand(fname) {\n this.sendWebsocket('PRODUCE:' + fname);\n }\n\n /** @summary Send message via web socket\n * @private */\n sendWebsocket(msg) {\n if (this._websocket?.canSend()) {\n this._websocket.send(msg);\n return true;\n }\n\n return false;\n }\n\n /** @summary Close websocket connection to canvas\n * @private */\n closeWebsocket(force) {\n if (this._websocket) {\n this._websocket.close(force);\n this._websocket.cleanup();\n delete this._websocket;\n }\n }\n\n /** @summary Use provided connection for the web canvas\n * @private */\n useWebsocket(handle) {\n this.closeWebsocket();\n\n this._websocket = handle;\n this._websocket.setReceiver(this);\n this._websocket.connect();\n }\n\n /** @summary Hanler for websocket open event\n * @private */\n onWebsocketOpened(/*handle*/) {\n }\n\n /** @summary Hanler for websocket close event\n * @private */\n onWebsocketClosed(/*handle*/) {\n if (!this.embed_canvas)\n closeCurrentWindow();\n }\n\n /** @summary Hanler for websocket message\n * @private */\n onWebsocketMsg(handle, msg) {\n console.log('GET_MSG ' + msg.slice(0,30));\n\n if (msg == 'CLOSE') {\n this.onWebsocketClosed();\n this.closeWebsocket(true);\n } else if (msg.slice(0,5) == 'SNAP:') {\n msg = msg.slice(5);\n let p1 = msg.indexOf(':'),\n snapid = msg.slice(0,p1),\n snap = parse(msg.slice(p1+1));\n this.syncDraw(true)\n .then(() => this.redrawPadSnap(snap))\n .then(() => {\n handle.send('SNAPDONE:' + snapid); // send ready message back when drawing completed\n this.confirmDraw();\n });\n } else if (msg.slice(0,4) == 'JSON') {\n let obj = parse(msg.slice(4));\n // console.log('get JSON ', msg.length-4, obj._typename);\n this.redrawObject(obj);\n } else if (msg.slice(0,9) == 'REPL_REQ:') {\n this.processDrawableReply(msg.slice(9));\n } else if (msg.slice(0,4) == 'CMD:') {\n msg = msg.slice(4);\n let p1 = msg.indexOf(':'),\n cmdid = msg.slice(0,p1),\n cmd = msg.slice(p1+1),\n reply = 'REPLY:' + cmdid + ':';\n if ((cmd == 'SVG') || (cmd == 'PNG') || (cmd == 'JPEG')) {\n this.createImage(cmd.toLowerCase())\n .then(res => handle.send(reply + res));\n } else if (cmd.indexOf('ADDPANEL:') == 0) {\n let relative_path = cmd.slice(9);\n if (!isFunc(this.showUI5Panel)) {\n handle.send(reply + 'false');\n } else {\n\n let conn = new WebWindowHandle(handle.kind);\n\n // set interim receiver until first message arrives\n conn.setReceiver({\n cpainter: this,\n\n onWebsocketOpened() {\n },\n\n onWebsocketMsg(panel_handle, msg) {\n let panel_name = (msg.indexOf('SHOWPANEL:') == 0) ? msg.slice(10) : '';\n this.cpainter.showUI5Panel(panel_name, panel_handle)\n .then(res => handle.send(reply + (res ? 'true' : 'false')));\n },\n\n onWebsocketClosed() {\n // if connection failed,\n handle.send(reply + 'false');\n },\n\n onWebsocketError() {\n // if connection failed,\n handle.send(reply + 'false');\n }\n\n });\n\n let addr = handle.href;\n if (relative_path.indexOf('../') == 0) {\n let ddd = addr.lastIndexOf('/',addr.length-2);\n addr = addr.slice(0,ddd) + relative_path.slice(2);\n } else {\n addr += relative_path;\n }\n // only when connection established, panel will be activated\n conn.connect(addr);\n }\n } else {\n console.log('Unrecognized command ' + cmd);\n handle.send(reply);\n }\n } else if ((msg.slice(0,7) == 'DXPROJ:') || (msg.slice(0,7) == 'DYPROJ:')) {\n let kind = msg[1],\n hist = parse(msg.slice(7));\n this.drawProjection(kind, hist);\n } else if (msg.slice(0,5) == 'SHOW:') {\n let that = msg.slice(5),\n on = that[that.length-1] == '1';\n this.showSection(that.slice(0,that.length-2), on);\n } else {\n console.log(`unrecognized msg len: ${msg.length} msg: ${msg.slice(0,30)}`);\n }\n }\n\n /** @summary Submit request to RDrawable object on server side */\n submitDrawableRequest(kind, req, painter, method) {\n\n if (!this._websocket || !req || !req._typename ||\n !painter.snapid || !isStr(painter.snapid)) return null;\n\n if (kind && method) {\n // if kind specified - check if such request already was submitted\n if (!painter._requests) painter._requests = {};\n\n let prevreq = painter._requests[kind];\n\n if (prevreq) {\n let tm = new Date().getTime();\n if (!prevreq._tm || (tm - prevreq._tm < 5000)) {\n prevreq._nextreq = req; // submit when got reply\n return false;\n }\n delete painter._requests[kind]; // let submit new request after timeout\n }\n\n painter._requests[kind] = req; // keep reference on the request\n }\n\n req.id = painter.snapid;\n\n if (method) {\n if (!this._nextreqid) this._nextreqid = 1;\n req.reqid = this._nextreqid++;\n } else {\n req.reqid = 0; // request will not be replied\n }\n\n let msg = JSON.stringify(req);\n\n if (req.reqid) {\n req._kind = kind;\n req._painter = painter;\n req._method = method;\n req._tm = new Date().getTime();\n\n if (!this._submreq) this._submreq = {};\n this._submreq[req.reqid] = req; // fast access to submitted requests\n }\n\n // console.log('Sending request ', msg.slice(0,60));\n\n this.sendWebsocket('REQ:' + msg);\n return req;\n }\n\n /** @summary Submit menu request\n * @private */\n async submitMenuRequest(painter, menukind, reqid) {\n return new Promise(resolveFunc => {\n this.submitDrawableRequest('', {\n _typename: 'ROOT::Experimental::RDrawableMenuRequest',\n menukind: menukind || '',\n menureqid: reqid, // used to identify menu request\n }, painter, resolveFunc);\n });\n }\n\n /** @summary Submit executable command for given painter */\n submitExec(painter, exec, subelem) {\n // snapid is intentionally ignored - only painter.snapid has to be used\n if (!this._websocket) return;\n\n if (subelem && isStr(subelem)) {\n let len = subelem.length;\n if ((len > 2) && (subelem.indexOf('#x') == len - 2)) subelem = 'x'; else\n if ((len > 2) && (subelem.indexOf('#y') == len - 2)) subelem = 'y'; else\n if ((len > 2) && (subelem.indexOf('#z') == len - 2)) subelem = 'z';\n\n if ((subelem == 'x') || (subelem == 'y') || (subelem == 'z'))\n exec = subelem + 'axis#' + exec;\n else\n return console.log(`not recoginzed subelem ${subelem} in SubmitExec`);\n }\n\n this.submitDrawableRequest('', {\n _typename: 'ROOT::Experimental::RDrawableExecRequest',\n exec: exec\n }, painter);\n }\n\n /** @summary Process reply from request to RDrawable */\n processDrawableReply(msg) {\n let reply = parse(msg);\n if (!reply || !reply.reqid || !this._submreq) return false;\n\n let req = this._submreq[reply.reqid];\n if (!req) return false;\n\n // remove reference first\n delete this._submreq[reply.reqid];\n\n // remove blocking reference for that kind\n if (req._kind && req._painter?._requests)\n if (req._painter._requests[req._kind] === req)\n delete req._painter._requests[req._kind];\n\n if (req._method)\n req._method(reply, req);\n\n // resubmit last request of that kind\n if (req._nextreq && !req._painter._requests[req._kind])\n this.submitDrawableRequest(req._kind, req._nextreq, req._painter, req._method);\n }\n\n /** @summary Show specified section in canvas */\n async showSection(that, on) {\n switch(that) {\n case 'Menu': break;\n case 'StatusBar': break;\n case 'Editor': break;\n case 'ToolBar': break;\n case 'ToolTips': this.setTooltipAllowed(on); break;\n }\n return true;\n }\n\n /** @summary Method informs that something was changed in the canvas\n * @desc used to update information on the server (when used with web6gui)\n * @private */\n processChanges(kind, painter, subelem) {\n // check if we could send at least one message more - for some meaningful actions\n if (!this._websocket || !this._websocket.canSend(2) || !isStr(kind)) return;\n\n let msg = '';\n if (!painter) painter = this;\n switch (kind) {\n case 'sbits':\n console.log('Status bits in RCanvas are changed - that to do?');\n break;\n case 'frame': // when moving frame\n case 'zoom': // when changing zoom inside frame\n console.log('Frame moved or zoom is changed - that to do?');\n break;\n case 'pave_moved':\n console.log('TPave is moved inside RCanvas - that to do?');\n break;\n default:\n if ((kind.slice(0,5) == 'exec:') && painter?.snapid) {\n this.submitExec(painter, kind.slice(5), subelem);\n } else {\n console.log('UNPROCESSED CHANGES', kind);\n }\n }\n\n if (msg) {\n console.log('RCanvas::processChanges want to send ' + msg.length + ' ' + msg.slice(0,40));\n }\n }\n\n /** @summary Handle pad button click event\n * @private */\n clickPadButton(funcname, evnt) {\n if (funcname == 'ToggleGed') return this.activateGed(this, null, 'toggle');\n if (funcname == 'ToggleStatus') return this.activateStatusBar('toggle');\n super.clickPadButton(funcname, evnt);\n }\n\n /** @summary returns true when event status area exist for the canvas */\n hasEventStatus() {\n if (this.testUI5()) return false;\n if (this.brlayout)\n return this.brlayout.hasStatus();\n let hp = getHPainter();\n return hp ? hp.hasStatusLine() : false;\n }\n\n /** @summary Show/toggle event status bar\n * @private */\n activateStatusBar(state) {\n if (this.testUI5()) return;\n if (this.brlayout)\n this.brlayout.createStatusLine(23, state);\n else\n getHPainter()?.createStatusLine(23, state);\n\n this.processChanges('sbits', this);\n }\n\n /** @summary Show online canvas status\n * @private */\n showCanvasStatus(...msgs) {\n if (this.testUI5()) return;\n\n let br = this.brlayout || getHPainter()?.brlayout;\n\n br?.showStatus(...msgs);\n }\n\n /** @summary Returns true if GED is present on the canvas */\n hasGed() {\n if (this.testUI5()) return false;\n return this.brlayout?.hasContent() ?? false;\n }\n\n /** @summary Function used to de-activate GED\n * @private */\n removeGed() {\n if (this.testUI5()) return;\n\n this.registerForPadEvents(null);\n\n if (this.ged_view) {\n this.ged_view.getController().cleanupGed();\n this.ged_view.destroy();\n delete this.ged_view;\n }\n this.brlayout?.deleteContent(true);\n this.processChanges('sbits', this);\n }\n\n /** @summary Get view data for ui5 panel\n * @private */\n getUi5PanelData(/* panel_name */) {\n return { jsroot: { settings, create, parse, toJSON, loadScript, EAxisBits, getColorExec } };\n }\n\n /** @summary Function used to activate GED\n * @return {Promise} when GED is there\n * @private */\n async activateGed(objpainter, kind, mode) {\n if (this.testUI5() || !this.brlayout)\n return false;\n\n if (this.brlayout.hasContent()) {\n if ((mode === 'toggle') || (mode === false))\n this.removeGed();\n else\n objpainter?.getPadPainter()?.selectObjectPainter(objpainter);\n\n return true;\n }\n\n if (mode === false)\n return false;\n\n let btns = this.brlayout.createBrowserBtns();\n\n ToolbarIcons.createSVG(btns, ToolbarIcons.diamand, 15, 'toggle fix-pos mode')\n .style('margin','3px').on('click', () => this.brlayout.toggleKind('fix'));\n\n ToolbarIcons.createSVG(btns, ToolbarIcons.circle, 15, 'toggle float mode')\n .style('margin','3px').on('click', () => this.brlayout.toggleKind('float'));\n\n ToolbarIcons.createSVG(btns, ToolbarIcons.cross, 15, 'delete GED')\n .style('margin','3px').on('click', () => this.removeGed());\n\n // be aware, that jsroot_browser_hierarchy required for flexible layout that element use full browser area\n this.brlayout.setBrowserContent(\"
Loading GED ...
\");\n this.brlayout.setBrowserTitle('GED');\n this.brlayout.toggleBrowserKind(kind || 'float');\n\n return new Promise(resolveFunc => {\n\n loadOpenui5.then(sap => {\n\n d3_select('#ged_placeholder').text('');\n\n sap.ui.define(['sap/ui/model/json/JSONModel', 'sap/ui/core/mvc/XMLView'], (JSONModel,XMLView) => {\n\n let oModel = new JSONModel({ handle: null });\n\n XMLView.create({\n viewName: 'rootui5.canv.view.Ged',\n viewData: this.getUi5PanelData('Ged')\n }).then(oGed => {\n\n oGed.setModel(oModel);\n\n oGed.placeAt('ged_placeholder');\n\n this.ged_view = oGed;\n\n // TODO: should be moved into Ged controller - it must be able to detect canvas painter itself\n this.registerForPadEvents(oGed.getController().padEventsReceiver.bind(oGed.getController()));\n\n objpainter?.getPadPainter()?.selectObjectPainter(objpainter);\n\n this.processChanges('sbits', this);\n\n resolveFunc(true);\n });\n });\n });\n });\n }\n\n /** @summary produce JSON for RCanvas, which can be used to display canvas once again\n * @private */\n produceJSON() {\n console.error('RCanvasPainter.produceJSON not yet implemented');\n return '';\n }\n\n /** @summary draw RCanvas object */\n static async draw(dom, can /*, opt */) {\n let nocanvas = !can;\n if (nocanvas)\n can = create('ROOT::Experimental::RCanvas');\n\n let painter = new RCanvasPainter(dom, can);\n painter.normal_canvas = !nocanvas;\n painter.createCanvasSvg(0);\n\n selectActivePad({ pp: painter, active: false });\n\n return painter.drawPrimitives().then(() => {\n painter.addPadButtons();\n painter.showPadButtons();\n return painter;\n });\n }\n\n} // class RCanvasPainter\n\n\n/** @summary draw RPadSnapshot object\n * @private */\nfunction drawRPadSnapshot(dom, snap /*, opt*/) {\n let painter = new RCanvasPainter(dom, null);\n painter.normal_canvas = false;\n painter.batch_mode = isBatchMode();\n return painter.syncDraw(true).then(() => painter.redrawPadSnap(snap)).then(() => {\n painter.confirmDraw();\n painter.showPadButtons();\n return painter;\n });\n}\n\n/** @summary Ensure RCanvas and RFrame for the painter object\n * @param {Object} painter - painter object to process\n * @param {string|boolean} frame_kind - false for no frame or '3d' for special 3D mode\n * @desc Assigns DOM, creates and draw RCanvas and RFrame if necessary, add painter to pad list of painters\n * @return {Promise} for ready */\nasync function ensureRCanvas(painter, frame_kind) {\n if (!painter)\n return Promise.reject(Error('Painter not provided in ensureRCanvas'));\n\n // simple check - if canvas there, can use painter\n let pr = painter.getCanvSvg().empty() ? RCanvasPainter.draw(painter.getDom(), null /* , noframe */) : Promise.resolve(true);\n\n return pr.then(() => {\n if ((frame_kind !== false) && painter.getFrameSvg().select('.main_layer').empty())\n return RFramePainter.draw(painter.getDom(), null, isStr(frame_kind) ? frame_kind : '');\n }).then(() => {\n painter.addToPadPrimitives();\n return painter;\n });\n}\n\n\n/** @summary Function used for direct draw of RFrameTitle\n * @private */\nfunction drawRFrameTitle(reason, drag) {\n let fp = this.getFramePainter();\n if (!fp)\n return console.log('no frame painter - no title');\n\n let rect = fp.getFrameRect(),\n fx = rect.x,\n fy = rect.y,\n fw = rect.width,\n // fh = rect.height,\n ph = this.getPadPainter().getPadHeight(),\n title = this.getObject(),\n title_margin = this.v7EvalLength('margin', ph, 0.02),\n title_width = fw,\n title_height = this.v7EvalLength('height', ph, 0.05),\n textFont = this.v7EvalFont('text', { size: 0.07, color: 'black', align: 22 });\n\n if (reason == 'drag') {\n title_height = drag.height;\n title_margin = fy - drag.y - drag.height;\n let changes = {};\n this.v7AttrChange(changes, 'margin', title_margin / ph);\n this.v7AttrChange(changes, 'height', title_height / ph);\n this.v7SendAttrChanges(changes, false); // do not invoke canvas update on the server\n }\n\n this.createG();\n\n this.draw_g.attr('transform',`translate(${fx},${Math.round(fy-title_margin-title_height)})`);\n\n let arg = { x: title_width/2, y: title_height/2, text: title.fText, latex: 1 };\n\n this.startTextDrawing(textFont, 'font');\n\n this.drawText(arg);\n\n return this.finishTextDrawing().then(() => {\n if (!isBatchMode())\n addDragHandler(this, { x: fx, y: Math.round(fy-title_margin-title_height), width: title_width, height: title_height,\n minwidth: 20, minheight: 20, no_change_x: true, redraw: d => this.redraw('drag', d) });\n });\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////\n\nregisterMethods('ROOT::Experimental::RPalette', {\n\n extractRColor(rcolor) {\n return rcolor.fColor || 'black';\n },\n\n getColor(indx) {\n return this.palette[indx];\n },\n\n getContourIndex(zc) {\n let cntr = this.fContour, l = 0, r = cntr.length-1, mid;\n\n if (zc < cntr[0]) return -1;\n if (zc >= cntr[r]) return r-1;\n\n if (this.fCustomContour) {\n while (l < r-1) {\n mid = Math.round((l+r)/2);\n if (cntr[mid] > zc) r = mid; else l = mid;\n }\n return l;\n }\n\n // last color in palette starts from level cntr[r-1]\n return Math.floor((zc-cntr[0]) / (cntr[r-1] - cntr[0]) * (r-1));\n },\n\n getContourColor(zc) {\n let zindx = this.getContourIndex(zc);\n return (zindx < 0) ? '' : this.getColor(zindx);\n },\n\n getContour() {\n return this.fContour && (this.fContour.length > 1) ? this.fContour : null;\n },\n\n deleteContour() {\n delete this.fContour;\n },\n\n calcColor(value, entry1, entry2) {\n let dist = entry2.fOrdinal - entry1.fOrdinal,\n r1 = entry2.fOrdinal - value,\n r2 = value - entry1.fOrdinal;\n\n if (!this.fInterpolate || (dist <= 0))\n return (r1 < r2) ? entry2.fColor : entry1.fColor;\n\n // interpolate\n let col1 = d3_rgb(this.extractRColor(entry1.fColor)),\n col2 = d3_rgb(this.extractRColor(entry2.fColor)),\n color = d3_rgb(Math.round((col1.r*r1 + col2.r*r2)/dist),\n Math.round((col1.g*r1 + col2.g*r2)/dist),\n Math.round((col1.b*r1 + col2.b*r2)/dist));\n\n return color.toString();\n },\n\n createPaletteColors(len) {\n let arr = [], indx = 0;\n\n while (arr.length < len) {\n let value = arr.length / (len-1);\n\n let entry = this.fColors[indx];\n\n if ((Math.abs(entry.fOrdinal - value) < 0.0001) || (indx == this.fColors.length - 1)) {\n arr.push(this.extractRColor(entry.fColor));\n continue;\n }\n\n let next = this.fColors[indx+1];\n if (next.fOrdinal <= value)\n indx++;\n else\n arr.push(this.calcColor(value, entry, next));\n }\n\n return arr;\n },\n\n getColorOrdinal(value) {\n // extract color with ordinal value between 0 and 1\n if (!this.fColors)\n return 'black';\n if ((typeof value != 'number') || (value < 0))\n value = 0;\n else if (value > 1)\n value = 1;\n\n // TODO: implement better way to find index\n\n let entry, next = this.fColors[0];\n for (let indx = 0; indx < this.fColors.length-1; ++indx) {\n entry = next;\n\n if (Math.abs(entry.fOrdinal - value) < 0.0001)\n return this.extractRColor(entry.fColor);\n\n next = this.fColors[indx+1];\n if (next.fOrdinal > value)\n return this.calcColor(value, entry, next);\n }\n\n return this.extractRColor(next.fColor);\n },\n\n setFullRange(min, max) {\n // set full z scale range, used in zooming\n this.full_min = min;\n this.full_max = max;\n },\n\n createContour(logz, nlevels, zmin, zmax, zminpositive) {\n this.fContour = [];\n delete this.fCustomContour;\n this.colzmin = zmin;\n this.colzmax = zmax;\n\n if (logz) {\n if (this.colzmax <= 0) this.colzmax = 1.;\n if (this.colzmin <= 0)\n if ((zminpositive === undefined) || (zminpositive <= 0))\n this.colzmin = 0.0001*this.colzmax;\n else\n this.colzmin = ((zminpositive < 3) || (zminpositive>100)) ? 0.3*zminpositive : 1;\n if (this.colzmin >= this.colzmax) this.colzmin = 0.0001*this.colzmax;\n\n let logmin = Math.log(this.colzmin)/Math.log(10),\n logmax = Math.log(this.colzmax)/Math.log(10),\n dz = (logmax-logmin)/nlevels;\n this.fContour.push(this.colzmin);\n for (let level=1; level painter.redraw())\n .then(() => painter);\n}\n\n/** @summary draw RFrame object\n * @private */\nfunction drawRFrame(dom, obj, opt) {\n let p = new RFramePainter(dom, obj);\n if (opt == '3d') p.mode3d = true;\n return ensureRCanvas(p, false).then(() => p.redraw());\n}\n\nexport { ensureRCanvas, drawRPadSnapshot,\n drawRFrameTitle, drawRFont, drawRAxis, drawRFrame,\n RObjectPainter, RPadPainter, RCanvasPainter };\n"],"x_google_ignoreList":[0,1,2,3,4,5]} \ No newline at end of file diff --git a/docs/897.d28d5cc28efaa79d.js b/docs/717.a696fd693dce2cca.js similarity index 93% rename from docs/897.d28d5cc28efaa79d.js rename to docs/717.a696fd693dce2cca.js index 75eb5be13..431b8c6c9 100644 --- a/docs/897.d28d5cc28efaa79d.js +++ b/docs/717.a696fd693dce2cca.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[897],{5897:(N,X,x)=>{x.r(X),x.d(X,{TMultiGraphPainter:()=>G});var u=x(5368),h=x(1773),D=x(5611),F=x(2454),w=x(9608),H=x(3879);class T extends F.tK{constructor(t,r){super(t,r),this.firstpainter=null,this.autorange=!1,this.painters=[]}cleanup(){this.painters=[],super.cleanup()}updateObject(t){if(!this.matchObjectType(t))return!1;let r=this.getObject(),a=t.fGraphs,f=this.getPadPainter();r.fTitle=t.fTitle;let m=!1;if(this.firstpainter){let e=t.fHistogram;this.autorange&&!e&&(e=this.scanGraphsRange(a)),this.firstpainter.updateObject(e)&&(m=!0)}for(let e=0;e{e?._typename&&e?.fName&&f?.findPainterFor(null,e.fName,e._typename)?.updateObject(e)}),m}scanGraphsRange(t,r,a){let m,e,f=this.getObject(),s=!1,o=!1,y=!1,p="",i={xmin:0,xmax:0,ymin:0,ymax:0,first:!0};a&&(s=a.fLogx,o=a.fLogy,i.xmin=a.fUxmin,i.xmax=a.fUxmax,i.ymin=a.fUymin,i.ymax=a.fUymax,i.first=!1),this._3d&&r&&!r.fXaxis.fLabels&&(r=null),r||(this.autorange=!0,t.arr[0]?.fHistogram?.fXaxis?.fTimeDisplay&&(y=!0,p=t.arr[0].fHistogram.fXaxis.fTimeFormat)),t.arr.forEach(n=>{if(0!=n.fNpoints){i.first&&(i.xmin=i.xmax=n.fX[0],i.ymin=i.ymax=n.fY[0],i.first=!1);for(let c=0;c=0&&(e=0),m>0&&i.ymax<=0&&(m=0);let I=e,L=m;if(g<0&&i.xmin>=0&&(g=s?.9*i.xmin:0),d>0&&i.xmax<=0&&(d=s?1.1*i.xmax:0),f.fMinimum!=h.kNoZoom&&(i.ymin=e=f.fMinimum),f.fMaximum!=h.kNoZoom&&(i.ymax=m=f.fMaximum),e<0&&i.ymin>=0&&o&&(e=.9*i.ymin),m>0&&i.ymax<=0&&o&&(m=1.1*i.ymax),e<=0&&o&&(e=.001*m),!o&&e>0&&e<.05*m&&(e=0),g<=0&&s&&(g=d>1e3?1:.001*d),!r){let n,c;if(this._3d){n=(r=(0,h.create)("TH2I")).fXaxis,n.fXmin=0,n.fXmax=t.arr.length,n.fNbins=t.arr.length,n.fLabels=(0,h.create)(h.clTHashList);for(let l=0;l=0){let l=r.fTitle.split(";");r.fTitle=l[0],l[1]&&(n.fTitle=l[1]),l[2]&&(c.fTitle=l[2])}n.fXmin=g,n.fXmax=d,n.fTimeDisplay=y,y&&(n.fTimeFormat=p)}let v=this._3d?r.fZaxis:r.fYaxis;return v.fXmin=Math.min(e,I),v.fXmax=Math.max(m,L),r.fMinimum=e,r.fMaximum=m,r}drawAxisHist(t,r){var a=this;return(0,u.Z)(function*(){return w.f.draw(a.getDom(),t,"AXIS"+r)})()}drawNextFunction(t){var r=this;return(0,u.Z)(function*(){let a=r.getObject();return!a.fFunctions||t>=a.fFunctions.arr.length?r:r.getPadPainter().drawObject(r.getDom(),a.fFunctions.arr[t],a.fFunctions.opt[t]).then(()=>r.drawNextFunction(t+1))})()}drawGraph(t,r){var a=this;return(0,u.Z)(function*(){return H.TGraphPainter.draw(a.getDom(),t,r)})()}drawNextGraph(t,r){var a=this;return(0,u.Z)(function*(){let f=a.getObject().fGraphs;if(t>=f.arr.length)return a._pfc=a._plc=a._pmc=!1,a.drawNextFunction(0);if(a._pfc||a._plc||a._pmc){let e=a.getMainPainter();if((0,h.isFunc)(e?.createAutoColor)){let s=e.createAutoColor(f.arr.length);a._pfc&&(f.arr[t].fFillColor=s),a._plc&&(f.arr[t].fLineColor=s),a._pmc&&(f.arr[t].fMarkerColor=s)}}return a.drawGraph(f.arr[t],f.opt[t]||r||"",f.arr.length-t).then(e=>(e&&a.painters.push(e),a.drawNextGraph(t+1,r)))})()}static _drawMG(t,r){return(0,u.Z)(function*(){let a=new D.pc(r);t._3d=a.check("3D"),t._pfc=a.check("PFC"),t._plc=a.check("PLC"),t._pmc=a.check("PMC");let f="";["USE_PAD_TITLE","LOGXY","LOGX","LOGY","LOGZ","GRIDXY","GRIDX","GRIDY","TICKXY","TICKX","TICKY","FB"].forEach(s=>{a.check(s)&&(f+=";"+s)});let e=Promise.resolve(!0);if(a.check("A")||!t.getMainPainter()){let s=t.getObject(),o=t.getPadPainter(),y=t.scanGraphsRange(s.fGraphs,s.fHistogram,o?.getRootPad(!0));e=t.drawAxisHist(y,f).then(p=>{t.firstpainter=p,p.$secondary="hist",s.fHistogram&&(t.$primary=!0)})}return e.then(()=>(t.addToPadPrimitives(),t.drawNextGraph(0,a.remain())))})()}static draw(t,r,a){return(0,u.Z)(function*(){return T._drawMG(new T(t,r),a)})()}}var Z=x(5759),C=x(3767);class G extends T{drawAxisHist(t,r){var a=this;return(0,u.Z)(function*(){return a._3d?Z.TH2Painter.draw(a.getDom(),t,"AXIS3D"+r):w.f.draw(a.getDom(),t,"AXIS"+r)})()}drawGraph(t,r,a){var f=this;return(0,u.Z)(function*(){return f._3d&&(r+="pos3d_"+a),C.o.draw(f.getDom(),t,r)})()}static draw(t,r,a){return(0,u.Z)(function*(){return G._drawMG(new G(t,r),a)})()}}}}]); -//# sourceMappingURL=897.d28d5cc28efaa79d.js.map \ No newline at end of file +"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[717],{3717:(N,X,x)=>{x.r(X),x.d(X,{TMultiGraphPainter:()=>G});var u=x(4788),h=x(9542),D=x(3675),F=x(6458),w=x(9670),H=x(8241);class T extends F.tK{constructor(t,r){super(t,r),this.firstpainter=null,this.autorange=!1,this.painters=[]}cleanup(){this.painters=[],super.cleanup()}updateObject(t){if(!this.matchObjectType(t))return!1;let r=this.getObject(),a=t.fGraphs,f=this.getPadPainter();r.fTitle=t.fTitle;let m=!1;if(this.firstpainter){let e=t.fHistogram;this.autorange&&!e&&(e=this.scanGraphsRange(a)),this.firstpainter.updateObject(e)&&(m=!0)}for(let e=0;e{e?._typename&&e?.fName&&f?.findPainterFor(null,e.fName,e._typename)?.updateObject(e)}),m}scanGraphsRange(t,r,a){let m,e,f=this.getObject(),s=!1,o=!1,y=!1,p="",i={xmin:0,xmax:0,ymin:0,ymax:0,first:!0};a&&(s=a.fLogx,o=a.fLogy,i.xmin=a.fUxmin,i.xmax=a.fUxmax,i.ymin=a.fUymin,i.ymax=a.fUymax,i.first=!1),this._3d&&r&&!r.fXaxis.fLabels&&(r=null),r||(this.autorange=!0,t.arr[0]?.fHistogram?.fXaxis?.fTimeDisplay&&(y=!0,p=t.arr[0].fHistogram.fXaxis.fTimeFormat)),t.arr.forEach(n=>{if(0!=n.fNpoints){i.first&&(i.xmin=i.xmax=n.fX[0],i.ymin=i.ymax=n.fY[0],i.first=!1);for(let c=0;c=0&&(e=0),m>0&&i.ymax<=0&&(m=0);let I=e,L=m;if(g<0&&i.xmin>=0&&(g=s?.9*i.xmin:0),d>0&&i.xmax<=0&&(d=s?1.1*i.xmax:0),f.fMinimum!=h.kNoZoom&&(i.ymin=e=f.fMinimum),f.fMaximum!=h.kNoZoom&&(i.ymax=m=f.fMaximum),e<0&&i.ymin>=0&&o&&(e=.9*i.ymin),m>0&&i.ymax<=0&&o&&(m=1.1*i.ymax),e<=0&&o&&(e=.001*m),!o&&e>0&&e<.05*m&&(e=0),g<=0&&s&&(g=d>1e3?1:.001*d),!r){let n,c;if(this._3d){n=(r=(0,h.create)("TH2I")).fXaxis,n.fXmin=0,n.fXmax=t.arr.length,n.fNbins=t.arr.length,n.fLabels=(0,h.create)(h.clTHashList);for(let l=0;l=0){let l=r.fTitle.split(";");r.fTitle=l[0],l[1]&&(n.fTitle=l[1]),l[2]&&(c.fTitle=l[2])}n.fXmin=g,n.fXmax=d,n.fTimeDisplay=y,y&&(n.fTimeFormat=p)}let v=this._3d?r.fZaxis:r.fYaxis;return v.fXmin=Math.min(e,I),v.fXmax=Math.max(m,L),r.fMinimum=e,r.fMaximum=m,r}drawAxisHist(t,r){var a=this;return(0,u.Z)(function*(){return w.f.draw(a.getDom(),t,"AXIS"+r)})()}drawNextFunction(t){var r=this;return(0,u.Z)(function*(){let a=r.getObject();return!a.fFunctions||t>=a.fFunctions.arr.length?r:r.getPadPainter().drawObject(r.getDom(),a.fFunctions.arr[t],a.fFunctions.opt[t]).then(()=>r.drawNextFunction(t+1))})()}drawGraph(t,r){var a=this;return(0,u.Z)(function*(){return H.TGraphPainter.draw(a.getDom(),t,r)})()}drawNextGraph(t,r){var a=this;return(0,u.Z)(function*(){let f=a.getObject().fGraphs;if(t>=f.arr.length)return a._pfc=a._plc=a._pmc=!1,a.drawNextFunction(0);if(a._pfc||a._plc||a._pmc){let e=a.getMainPainter();if((0,h.isFunc)(e?.createAutoColor)){let s=e.createAutoColor(f.arr.length);a._pfc&&(f.arr[t].fFillColor=s),a._plc&&(f.arr[t].fLineColor=s),a._pmc&&(f.arr[t].fMarkerColor=s)}}return a.drawGraph(f.arr[t],f.opt[t]||r||"",f.arr.length-t).then(e=>(e&&a.painters.push(e),a.drawNextGraph(t+1,r)))})()}static _drawMG(t,r){return(0,u.Z)(function*(){let a=new D.pc(r);t._3d=a.check("3D"),t._pfc=a.check("PFC"),t._plc=a.check("PLC"),t._pmc=a.check("PMC");let f="";["USE_PAD_TITLE","LOGXY","LOGX","LOGY","LOGZ","GRIDXY","GRIDX","GRIDY","TICKXY","TICKX","TICKY","FB"].forEach(s=>{a.check(s)&&(f+=";"+s)});let e=Promise.resolve(!0);if(a.check("A")||!t.getMainPainter()){let s=t.getObject(),o=t.getPadPainter(),y=t.scanGraphsRange(s.fGraphs,s.fHistogram,o?.getRootPad(!0));e=t.drawAxisHist(y,f).then(p=>{t.firstpainter=p,p.$secondary="hist",s.fHistogram&&(t.$primary=!0)})}return e.then(()=>(t.addToPadPrimitives(),t.drawNextGraph(0,a.remain())))})()}static draw(t,r,a){return(0,u.Z)(function*(){return T._drawMG(new T(t,r),a)})()}}var Z=x(8189),C=x(3761);class G extends T{drawAxisHist(t,r){var a=this;return(0,u.Z)(function*(){return a._3d?Z.TH2Painter.draw(a.getDom(),t,"AXIS3D"+r):w.f.draw(a.getDom(),t,"AXIS"+r)})()}drawGraph(t,r,a){var f=this;return(0,u.Z)(function*(){return f._3d&&(r+="pos3d_"+a),C.o.draw(f.getDom(),t,r)})()}static draw(t,r,a){return(0,u.Z)(function*(){return G._drawMG(new G(t,r),a)})()}}}}]); +//# sourceMappingURL=717.a696fd693dce2cca.js.map \ No newline at end of file diff --git a/docs/897.d28d5cc28efaa79d.js.map b/docs/717.a696fd693dce2cca.js.map similarity index 99% rename from docs/897.d28d5cc28efaa79d.js.map rename to docs/717.a696fd693dce2cca.js.map index d5db2554e..0ca9ebc9b 100644 --- a/docs/897.d28d5cc28efaa79d.js.map +++ b/docs/717.a696fd693dce2cca.js.map @@ -1 +1 @@ -{"version":3,"file":"897.d28d5cc28efaa79d.js","mappings":"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","names":["TMultiGraphPainter","ObjectPainter","constructor","dom","mgraph","super","this","firstpainter","autorange","painters","cleanup","updateObject","obj","matchObjectType","getObject","graphs","fGraphs","pp","getPadPainter","fTitle","isany","histo","fHistogram","scanGraphsRange","i","arr","length","fFunctions","forEach","func","_typename","fName","findPainterFor","pad","maximum","minimum","logx","logy","time_display","time_format","rw","xmin","xmax","ymin","ymax","first","fLogx","fLogy","fUxmin","fUxmax","fUymin","fUymax","_3d","fXaxis","fLabels","fTimeDisplay","fTimeFormat","gr","fNpoints","fX","fY","Math","min","max","dx","dy","uxmin","uxmax","log10","glob_minimum","glob_maximum","fMinimum","kNoZoom","fMaximum","xaxis","yaxis","create","fXmin","fXmax","fNbins","clTHashList","lbl","clTObjString","fString","fUniqueID","Add","fYaxis","fZaxis","indexOf","t","split","axis","drawAxisHist","hopt","TH1Painter","_this","getDom","drawNextFunction","indx","_this2","drawObject","opt","then","drawGraph","TGraphPainter","_this3","drawNextGraph","_this4","_pfc","_plc","_pmc","mp","getMainPainter","isFunc","createAutoColor","icolor","fFillColor","fLineColor","fMarkerColor","subp","push","static","painter","d","DrawOptions","check","name","promise","Promise","resolve","getRootPad","ap","$secondary","$primary","addToPadPrimitives","remain","_drawMG","TMultiGraphPainter2D","TH2Painter","pos3d"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/hist2d/TMultiGraphPainter.mjs","../node_modules/jsroot/modules/hist/TMultiGraphPainter.mjs"],"sourcesContent":["import { create, isFunc, clTObjString, clTHashList, kNoZoom } from '../core.mjs';\nimport { DrawOptions } from '../base/BasePainter.mjs';\nimport { ObjectPainter } from '../base/ObjectPainter.mjs';\nimport { TH1Painter } from './TH1Painter.mjs';\nimport { TGraphPainter } from './TGraphPainter.mjs';\n\n/**\n * @summary Painter for TMultiGraph object.\n *\n * @private\n */\n\nclass TMultiGraphPainter extends ObjectPainter {\n\n /** @summary Create painter\n * @param {object|string} dom - DOM element for drawing or element id\n * @param {object} obj - TMultiGraph object to draw */\n constructor(dom, mgraph) {\n super(dom, mgraph);\n this.firstpainter = null;\n this.autorange = false;\n this.painters = []; // keep painters to be able update objects\n }\n\n /** @summary Cleanup multigraph painter */\n cleanup() {\n this.painters = [];\n super.cleanup();\n }\n\n /** @summary Update multigraph object */\n updateObject(obj) {\n if (!this.matchObjectType(obj)) return false;\n\n let mgraph = this.getObject(),\n graphs = obj.fGraphs,\n pp = this.getPadPainter();\n\n mgraph.fTitle = obj.fTitle;\n\n let isany = false;\n if (this.firstpainter) {\n let histo = obj.fHistogram;\n if (this.autorange && !histo)\n histo = this.scanGraphsRange(graphs);\n\n if (this.firstpainter.updateObject(histo))\n isany = true;\n }\n\n for (let i = 0; i < graphs.arr.length; ++i)\n if ((i < this.painters.length) && this.painters[i].updateObject(graphs.arr[i]))\n isany = true;\n\n obj.fFunctions?.arr?.forEach(func => {\n if (func?._typename && func?.fName)\n pp?.findPainterFor(null, func.fName, func._typename)?.updateObject(func);\n });\n\n return isany;\n }\n\n /** @summary Scan graphs range\n * @return {object} histogram for axes drawing */\n scanGraphsRange(graphs, histo, pad) {\n let mgraph = this.getObject(),\n maximum, minimum, logx = false, logy = false,\n time_display = false, time_format = '',\n rw = { xmin: 0, xmax: 0, ymin: 0, ymax: 0, first: true };\n\n if (pad) {\n logx = pad.fLogx;\n logy = pad.fLogy;\n rw.xmin = pad.fUxmin;\n rw.xmax = pad.fUxmax;\n rw.ymin = pad.fUymin;\n rw.ymax = pad.fUymax;\n rw.first = false;\n }\n\n // ignore existing histo in 3d case\n if (this._3d && histo && !histo.fXaxis.fLabels)\n histo = null;\n\n if (!histo) {\n this.autorange = true;\n\n if (graphs.arr[0]?.fHistogram?.fXaxis?.fTimeDisplay) {\n time_display = true;\n time_format = graphs.arr[0].fHistogram.fXaxis.fTimeFormat;\n }\n }\n\n graphs.arr.forEach(gr => {\n if (gr.fNpoints == 0) return;\n if (rw.first) {\n rw.xmin = rw.xmax = gr.fX[0];\n rw.ymin = rw.ymax = gr.fY[0];\n rw.first = false;\n }\n for (let i = 0; i < gr.fNpoints; ++i) {\n rw.xmin = Math.min(rw.xmin, gr.fX[i]);\n rw.xmax = Math.max(rw.xmax, gr.fX[i]);\n rw.ymin = Math.min(rw.ymin, gr.fY[i]);\n rw.ymax = Math.max(rw.ymax, gr.fY[i]);\n }\n });\n\n if (rw.xmin == rw.xmax)\n rw.xmax += 1.;\n if (rw.ymin == rw.ymax)\n rw.ymax += 1.;\n let dx = 0.05 * (rw.xmax - rw.xmin),\n dy = 0.05 * (rw.ymax - rw.ymin),\n uxmin = rw.xmin - dx,\n uxmax = rw.xmax + dx;\n if (logy) {\n if (rw.ymin <= 0)\n rw.ymin = 0.001 * rw.ymax;\n minimum = rw.ymin / (1 + 0.5 * Math.log10(rw.ymax / rw.ymin));\n maximum = rw.ymax * (1 + 0.2 * Math.log10(rw.ymax / rw.ymin));\n } else {\n minimum = rw.ymin - dy;\n maximum = rw.ymax + dy;\n }\n if (minimum < 0 && rw.ymin >= 0)\n minimum = 0;\n if (maximum > 0 && rw.ymax <= 0)\n maximum = 0;\n\n let glob_minimum = minimum, glob_maximum = maximum;\n\n if (uxmin < 0 && rw.xmin >= 0)\n uxmin = logx ? 0.9 * rw.xmin : 0;\n if (uxmax > 0 && rw.xmax <= 0)\n uxmax = logx? 1.1 * rw.xmax : 0;\n\n if (mgraph.fMinimum != kNoZoom)\n rw.ymin = minimum = mgraph.fMinimum;\n if (mgraph.fMaximum != kNoZoom)\n rw.ymax = maximum = mgraph.fMaximum;\n\n if (minimum < 0 && rw.ymin >= 0 && logy)\n minimum = 0.9 * rw.ymin;\n if (maximum > 0 && rw.ymax <= 0 && logy)\n maximum = 1.1 * rw.ymax;\n if (minimum <= 0 && logy)\n minimum = 0.001 * maximum;\n if (!logy && minimum > 0 && minimum < 0.05*maximum)\n minimum = 0;\n if (uxmin <= 0 && logx)\n uxmin = (uxmax > 1000) ? 1 : 0.001 * uxmax;\n\n // Create a temporary histogram to draw the axis (if necessary)\n if (!histo) {\n let xaxis, yaxis;\n if (this._3d) {\n histo = create('TH2I');\n xaxis = histo.fXaxis;\n xaxis.fXmin = 0;\n xaxis.fXmax = graphs.arr.length;\n xaxis.fNbins = graphs.arr.length;\n xaxis.fLabels = create(clTHashList);\n for (let i = 0; i < graphs.arr.length; i++) {\n let lbl = create(clTObjString);\n lbl.fString = graphs.arr[i].fTitle || `gr${i}`;\n lbl.fUniqueID = graphs.arr.length - i; // graphs drawn in reverse order\n xaxis.fLabels.Add(lbl, '');\n }\n xaxis = histo.fYaxis;\n yaxis = histo.fZaxis;\n } else {\n histo = create('TH1I');\n xaxis = histo.fXaxis;\n yaxis = histo.fYaxis;\n }\n histo.fTitle = mgraph.fTitle;\n if (histo.fTitle.indexOf(';') >= 0) {\n let t = histo.fTitle.split(';');\n histo.fTitle = t[0];\n if (t[1]) xaxis.fTitle = t[1];\n if (t[2]) yaxis.fTitle = t[2];\n }\n\n xaxis.fXmin = uxmin;\n xaxis.fXmax = uxmax;\n xaxis.fTimeDisplay = time_display;\n if (time_display) xaxis.fTimeFormat = time_format;\n }\n\n let axis = this._3d ? histo.fZaxis : histo.fYaxis;\n axis.fXmin = Math.min(minimum, glob_minimum);\n axis.fXmax = Math.max(maximum, glob_maximum);\n histo.fMinimum = minimum;\n histo.fMaximum = maximum;\n\n return histo;\n }\n\n /** @summary draw speical histogram for axis\n * @return {Promise} when ready */\n async drawAxisHist(histo, hopt) {\n return TH1Painter.draw(this.getDom(), histo, 'AXIS' + hopt);\n }\n\n /** @summary method draws next function from the functions list */\n async drawNextFunction(indx) {\n\n let mgraph = this.getObject();\n\n if (!mgraph.fFunctions || (indx >= mgraph.fFunctions.arr.length))\n return this;\n\n let pp = this.getPadPainter()\n\n return pp.drawObject(this.getDom(), mgraph.fFunctions.arr[indx], mgraph.fFunctions.opt[indx])\n .then(() => this.drawNextFunction(indx+1));\n }\n\n /** @summary Draw graph */\n async drawGraph(gr, opt /*, pos3d */ ) {\n return TGraphPainter.draw(this.getDom(), gr, opt);\n }\n\n /** @summary method draws next graph */\n async drawNextGraph(indx, opt) {\n\n let graphs = this.getObject().fGraphs;\n\n // at the end of graphs drawing draw functions (if any)\n if (indx >= graphs.arr.length) {\n this._pfc = this._plc = this._pmc = false; // disable auto coloring at the end\n return this.drawNextFunction(0);\n }\n\n // if there is auto colors assignment, try to provide it\n if (this._pfc || this._plc || this._pmc) {\n let mp = this.getMainPainter();\n if (isFunc(mp?.createAutoColor)) {\n let icolor = mp.createAutoColor(graphs.arr.length);\n if (this._pfc) graphs.arr[indx].fFillColor = icolor;\n if (this._plc) graphs.arr[indx].fLineColor = icolor;\n if (this._pmc) graphs.arr[indx].fMarkerColor = icolor;\n }\n }\n\n let o = graphs.opt[indx] || opt || '';\n\n return this.drawGraph(graphs.arr[indx], o, graphs.arr.length - indx).then(subp => {\n if (subp) this.painters.push(subp);\n\n return this.drawNextGraph(indx+1, opt);\n });\n }\n\n /** @summary Draw multigraph object using painter instance\n * @private */\n static async _drawMG(painter, opt) {\n\n let d = new DrawOptions(opt);\n\n painter._3d = d.check('3D');\n painter._pfc = d.check('PFC');\n painter._plc = d.check('PLC');\n painter._pmc = d.check('PMC');\n\n let hopt = '', checkhopt = ['USE_PAD_TITLE', 'LOGXY', 'LOGX', 'LOGY', 'LOGZ', 'GRIDXY', 'GRIDX', 'GRIDY', 'TICKXY', 'TICKX', 'TICKY', 'FB'];\n checkhopt.forEach(name => { if (d.check(name)) hopt += ';' + name; });\n\n let promise = Promise.resolve(true);\n if (d.check('A') || !painter.getMainPainter()) {\n let mgraph = painter.getObject(),\n pp = painter.getPadPainter(),\n histo = painter.scanGraphsRange(mgraph.fGraphs, mgraph.fHistogram, pp?.getRootPad(true));\n\n promise = painter.drawAxisHist(histo, hopt).then(ap => {\n painter.firstpainter = ap;\n ap.$secondary = 'hist'; // mark histogram painter as secondary\n if (mgraph.fHistogram) painter.$primary = true; // mark mg painter as primary\n });\n }\n\n return promise.then(() => {\n painter.addToPadPrimitives();\n return painter.drawNextGraph(0, d.remain());\n });\n }\n\n /** @summary Draw TMultiGraph object */\n static async draw(dom, mgraph, opt) {\n return TMultiGraphPainter._drawMG(new TMultiGraphPainter(dom, mgraph), opt);\n }\n\n} // class TMultiGraphPainter\n\n\nexport { TMultiGraphPainter };\n","import { TMultiGraphPainter as TMultiGraphPainter2D } from '../hist2d/TMultiGraphPainter.mjs';\nimport { TH1Painter } from '../hist2d/TH1Painter.mjs';\nimport { TH2Painter } from './TH2Painter.mjs';\nimport { TGraphPainter } from './TGraphPainter.mjs';\n\n\nclass TMultiGraphPainter extends TMultiGraphPainter2D {\n\n /** @summary draw speical histogram for axis\n * @return {Promise} when ready */\n async drawAxisHist(histo, hopt) {\n return this._3d ? TH2Painter.draw(this.getDom(), histo, 'AXIS3D' + hopt)\n : TH1Painter.draw(this.getDom(), histo, 'AXIS' + hopt);\n }\n\n /** @summary draw multigraph in 3D */\n async drawGraph(gr, opt, pos3d) {\n if (this._3d) opt += 'pos3d_'+pos3d;\n return TGraphPainter.draw(this.getDom(), gr, opt);\n }\n\n /** @summary Draw TMultiGraph object */\n static async draw(dom, mgraph, opt) {\n return TMultiGraphPainter._drawMG(new TMultiGraphPainter(dom, mgraph), opt);\n }\n\n} // class TMultiGraphPainter\n\nexport { TMultiGraphPainter };\n"],"x_google_ignoreList":[0,1]} \ No newline at end of file +{"version":3,"file":"717.a696fd693dce2cca.js","mappings":"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","names":["TMultiGraphPainter","ObjectPainter","constructor","dom","mgraph","super","this","firstpainter","autorange","painters","cleanup","updateObject","obj","matchObjectType","getObject","graphs","fGraphs","pp","getPadPainter","fTitle","isany","histo","fHistogram","scanGraphsRange","i","arr","length","fFunctions","forEach","func","_typename","fName","findPainterFor","pad","maximum","minimum","logx","logy","time_display","time_format","rw","xmin","xmax","ymin","ymax","first","fLogx","fLogy","fUxmin","fUxmax","fUymin","fUymax","_3d","fXaxis","fLabels","fTimeDisplay","fTimeFormat","gr","fNpoints","fX","fY","Math","min","max","dx","dy","uxmin","uxmax","log10","glob_minimum","glob_maximum","fMinimum","kNoZoom","fMaximum","xaxis","yaxis","create","fXmin","fXmax","fNbins","clTHashList","lbl","clTObjString","fString","fUniqueID","Add","fYaxis","fZaxis","indexOf","t","split","axis","drawAxisHist","hopt","TH1Painter","_this","getDom","drawNextFunction","indx","_this2","drawObject","opt","then","drawGraph","TGraphPainter","_this3","drawNextGraph","_this4","_pfc","_plc","_pmc","mp","getMainPainter","isFunc","createAutoColor","icolor","fFillColor","fLineColor","fMarkerColor","subp","push","static","painter","d","DrawOptions","check","name","promise","Promise","resolve","getRootPad","ap","$secondary","$primary","addToPadPrimitives","remain","_drawMG","TMultiGraphPainter2D","TH2Painter","pos3d"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/hist2d/TMultiGraphPainter.mjs","../node_modules/jsroot/modules/hist/TMultiGraphPainter.mjs"],"sourcesContent":["import { create, isFunc, clTObjString, clTHashList, kNoZoom } from '../core.mjs';\nimport { DrawOptions } from '../base/BasePainter.mjs';\nimport { ObjectPainter } from '../base/ObjectPainter.mjs';\nimport { TH1Painter } from './TH1Painter.mjs';\nimport { TGraphPainter } from './TGraphPainter.mjs';\n\n/**\n * @summary Painter for TMultiGraph object.\n *\n * @private\n */\n\nclass TMultiGraphPainter extends ObjectPainter {\n\n /** @summary Create painter\n * @param {object|string} dom - DOM element for drawing or element id\n * @param {object} obj - TMultiGraph object to draw */\n constructor(dom, mgraph) {\n super(dom, mgraph);\n this.firstpainter = null;\n this.autorange = false;\n this.painters = []; // keep painters to be able update objects\n }\n\n /** @summary Cleanup multigraph painter */\n cleanup() {\n this.painters = [];\n super.cleanup();\n }\n\n /** @summary Update multigraph object */\n updateObject(obj) {\n if (!this.matchObjectType(obj)) return false;\n\n let mgraph = this.getObject(),\n graphs = obj.fGraphs,\n pp = this.getPadPainter();\n\n mgraph.fTitle = obj.fTitle;\n\n let isany = false;\n if (this.firstpainter) {\n let histo = obj.fHistogram;\n if (this.autorange && !histo)\n histo = this.scanGraphsRange(graphs);\n\n if (this.firstpainter.updateObject(histo))\n isany = true;\n }\n\n for (let i = 0; i < graphs.arr.length; ++i)\n if ((i < this.painters.length) && this.painters[i].updateObject(graphs.arr[i]))\n isany = true;\n\n obj.fFunctions?.arr?.forEach(func => {\n if (func?._typename && func?.fName)\n pp?.findPainterFor(null, func.fName, func._typename)?.updateObject(func);\n });\n\n return isany;\n }\n\n /** @summary Scan graphs range\n * @return {object} histogram for axes drawing */\n scanGraphsRange(graphs, histo, pad) {\n let mgraph = this.getObject(),\n maximum, minimum, logx = false, logy = false,\n time_display = false, time_format = '',\n rw = { xmin: 0, xmax: 0, ymin: 0, ymax: 0, first: true };\n\n if (pad) {\n logx = pad.fLogx;\n logy = pad.fLogy;\n rw.xmin = pad.fUxmin;\n rw.xmax = pad.fUxmax;\n rw.ymin = pad.fUymin;\n rw.ymax = pad.fUymax;\n rw.first = false;\n }\n\n // ignore existing histo in 3d case\n if (this._3d && histo && !histo.fXaxis.fLabels)\n histo = null;\n\n if (!histo) {\n this.autorange = true;\n\n if (graphs.arr[0]?.fHistogram?.fXaxis?.fTimeDisplay) {\n time_display = true;\n time_format = graphs.arr[0].fHistogram.fXaxis.fTimeFormat;\n }\n }\n\n graphs.arr.forEach(gr => {\n if (gr.fNpoints == 0) return;\n if (rw.first) {\n rw.xmin = rw.xmax = gr.fX[0];\n rw.ymin = rw.ymax = gr.fY[0];\n rw.first = false;\n }\n for (let i = 0; i < gr.fNpoints; ++i) {\n rw.xmin = Math.min(rw.xmin, gr.fX[i]);\n rw.xmax = Math.max(rw.xmax, gr.fX[i]);\n rw.ymin = Math.min(rw.ymin, gr.fY[i]);\n rw.ymax = Math.max(rw.ymax, gr.fY[i]);\n }\n });\n\n if (rw.xmin == rw.xmax)\n rw.xmax += 1.;\n if (rw.ymin == rw.ymax)\n rw.ymax += 1.;\n let dx = 0.05 * (rw.xmax - rw.xmin),\n dy = 0.05 * (rw.ymax - rw.ymin),\n uxmin = rw.xmin - dx,\n uxmax = rw.xmax + dx;\n if (logy) {\n if (rw.ymin <= 0)\n rw.ymin = 0.001 * rw.ymax;\n minimum = rw.ymin / (1 + 0.5 * Math.log10(rw.ymax / rw.ymin));\n maximum = rw.ymax * (1 + 0.2 * Math.log10(rw.ymax / rw.ymin));\n } else {\n minimum = rw.ymin - dy;\n maximum = rw.ymax + dy;\n }\n if (minimum < 0 && rw.ymin >= 0)\n minimum = 0;\n if (maximum > 0 && rw.ymax <= 0)\n maximum = 0;\n\n let glob_minimum = minimum, glob_maximum = maximum;\n\n if (uxmin < 0 && rw.xmin >= 0)\n uxmin = logx ? 0.9 * rw.xmin : 0;\n if (uxmax > 0 && rw.xmax <= 0)\n uxmax = logx? 1.1 * rw.xmax : 0;\n\n if (mgraph.fMinimum != kNoZoom)\n rw.ymin = minimum = mgraph.fMinimum;\n if (mgraph.fMaximum != kNoZoom)\n rw.ymax = maximum = mgraph.fMaximum;\n\n if (minimum < 0 && rw.ymin >= 0 && logy)\n minimum = 0.9 * rw.ymin;\n if (maximum > 0 && rw.ymax <= 0 && logy)\n maximum = 1.1 * rw.ymax;\n if (minimum <= 0 && logy)\n minimum = 0.001 * maximum;\n if (!logy && minimum > 0 && minimum < 0.05*maximum)\n minimum = 0;\n if (uxmin <= 0 && logx)\n uxmin = (uxmax > 1000) ? 1 : 0.001 * uxmax;\n\n // Create a temporary histogram to draw the axis (if necessary)\n if (!histo) {\n let xaxis, yaxis;\n if (this._3d) {\n histo = create('TH2I');\n xaxis = histo.fXaxis;\n xaxis.fXmin = 0;\n xaxis.fXmax = graphs.arr.length;\n xaxis.fNbins = graphs.arr.length;\n xaxis.fLabels = create(clTHashList);\n for (let i = 0; i < graphs.arr.length; i++) {\n let lbl = create(clTObjString);\n lbl.fString = graphs.arr[i].fTitle || `gr${i}`;\n lbl.fUniqueID = graphs.arr.length - i; // graphs drawn in reverse order\n xaxis.fLabels.Add(lbl, '');\n }\n xaxis = histo.fYaxis;\n yaxis = histo.fZaxis;\n } else {\n histo = create('TH1I');\n xaxis = histo.fXaxis;\n yaxis = histo.fYaxis;\n }\n histo.fTitle = mgraph.fTitle;\n if (histo.fTitle.indexOf(';') >= 0) {\n let t = histo.fTitle.split(';');\n histo.fTitle = t[0];\n if (t[1]) xaxis.fTitle = t[1];\n if (t[2]) yaxis.fTitle = t[2];\n }\n\n xaxis.fXmin = uxmin;\n xaxis.fXmax = uxmax;\n xaxis.fTimeDisplay = time_display;\n if (time_display) xaxis.fTimeFormat = time_format;\n }\n\n let axis = this._3d ? histo.fZaxis : histo.fYaxis;\n axis.fXmin = Math.min(minimum, glob_minimum);\n axis.fXmax = Math.max(maximum, glob_maximum);\n histo.fMinimum = minimum;\n histo.fMaximum = maximum;\n\n return histo;\n }\n\n /** @summary draw speical histogram for axis\n * @return {Promise} when ready */\n async drawAxisHist(histo, hopt) {\n return TH1Painter.draw(this.getDom(), histo, 'AXIS' + hopt);\n }\n\n /** @summary method draws next function from the functions list */\n async drawNextFunction(indx) {\n\n let mgraph = this.getObject();\n\n if (!mgraph.fFunctions || (indx >= mgraph.fFunctions.arr.length))\n return this;\n\n let pp = this.getPadPainter()\n\n return pp.drawObject(this.getDom(), mgraph.fFunctions.arr[indx], mgraph.fFunctions.opt[indx])\n .then(() => this.drawNextFunction(indx+1));\n }\n\n /** @summary Draw graph */\n async drawGraph(gr, opt /*, pos3d */ ) {\n return TGraphPainter.draw(this.getDom(), gr, opt);\n }\n\n /** @summary method draws next graph */\n async drawNextGraph(indx, opt) {\n\n let graphs = this.getObject().fGraphs;\n\n // at the end of graphs drawing draw functions (if any)\n if (indx >= graphs.arr.length) {\n this._pfc = this._plc = this._pmc = false; // disable auto coloring at the end\n return this.drawNextFunction(0);\n }\n\n // if there is auto colors assignment, try to provide it\n if (this._pfc || this._plc || this._pmc) {\n let mp = this.getMainPainter();\n if (isFunc(mp?.createAutoColor)) {\n let icolor = mp.createAutoColor(graphs.arr.length);\n if (this._pfc) graphs.arr[indx].fFillColor = icolor;\n if (this._plc) graphs.arr[indx].fLineColor = icolor;\n if (this._pmc) graphs.arr[indx].fMarkerColor = icolor;\n }\n }\n\n let o = graphs.opt[indx] || opt || '';\n\n return this.drawGraph(graphs.arr[indx], o, graphs.arr.length - indx).then(subp => {\n if (subp) this.painters.push(subp);\n\n return this.drawNextGraph(indx+1, opt);\n });\n }\n\n /** @summary Draw multigraph object using painter instance\n * @private */\n static async _drawMG(painter, opt) {\n\n let d = new DrawOptions(opt);\n\n painter._3d = d.check('3D');\n painter._pfc = d.check('PFC');\n painter._plc = d.check('PLC');\n painter._pmc = d.check('PMC');\n\n let hopt = '', checkhopt = ['USE_PAD_TITLE', 'LOGXY', 'LOGX', 'LOGY', 'LOGZ', 'GRIDXY', 'GRIDX', 'GRIDY', 'TICKXY', 'TICKX', 'TICKY', 'FB'];\n checkhopt.forEach(name => { if (d.check(name)) hopt += ';' + name; });\n\n let promise = Promise.resolve(true);\n if (d.check('A') || !painter.getMainPainter()) {\n let mgraph = painter.getObject(),\n pp = painter.getPadPainter(),\n histo = painter.scanGraphsRange(mgraph.fGraphs, mgraph.fHistogram, pp?.getRootPad(true));\n\n promise = painter.drawAxisHist(histo, hopt).then(ap => {\n painter.firstpainter = ap;\n ap.$secondary = 'hist'; // mark histogram painter as secondary\n if (mgraph.fHistogram) painter.$primary = true; // mark mg painter as primary\n });\n }\n\n return promise.then(() => {\n painter.addToPadPrimitives();\n return painter.drawNextGraph(0, d.remain());\n });\n }\n\n /** @summary Draw TMultiGraph object */\n static async draw(dom, mgraph, opt) {\n return TMultiGraphPainter._drawMG(new TMultiGraphPainter(dom, mgraph), opt);\n }\n\n} // class TMultiGraphPainter\n\n\nexport { TMultiGraphPainter };\n","import { TMultiGraphPainter as TMultiGraphPainter2D } from '../hist2d/TMultiGraphPainter.mjs';\nimport { TH1Painter } from '../hist2d/TH1Painter.mjs';\nimport { TH2Painter } from './TH2Painter.mjs';\nimport { TGraphPainter } from './TGraphPainter.mjs';\n\n\nclass TMultiGraphPainter extends TMultiGraphPainter2D {\n\n /** @summary draw speical histogram for axis\n * @return {Promise} when ready */\n async drawAxisHist(histo, hopt) {\n return this._3d ? TH2Painter.draw(this.getDom(), histo, 'AXIS3D' + hopt)\n : TH1Painter.draw(this.getDom(), histo, 'AXIS' + hopt);\n }\n\n /** @summary draw multigraph in 3D */\n async drawGraph(gr, opt, pos3d) {\n if (this._3d) opt += 'pos3d_'+pos3d;\n return TGraphPainter.draw(this.getDom(), gr, opt);\n }\n\n /** @summary Draw TMultiGraph object */\n static async draw(dom, mgraph, opt) {\n return TMultiGraphPainter._drawMG(new TMultiGraphPainter(dom, mgraph), opt);\n }\n\n} // class TMultiGraphPainter\n\nexport { TMultiGraphPainter };\n"],"x_google_ignoreList":[0,1]} \ No newline at end of file diff --git a/docs/726.d688e74f08d3451b.js b/docs/726.d688e74f08d3451b.js deleted file mode 100644 index 0ee381928..000000000 --- a/docs/726.d688e74f08d3451b.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[726],{9726:(A,D,f)=>{f.r(D),f.d(D,{TASImagePainter:()=>B});var d=f(5368),g=f(1773),_=f(263),M=f(2454),w=f(6902),x=f(1518);class B extends M.tK{decodeOptions(e){this.options={Zscale:!1},e&&e.indexOf("z")>=0&&(this.options.Zscale=!0)}createRGBA(e){let t=this.getObject();if(!t?.fPalette)return null;let r=new Array(4*(e+1)),a=1,l=t.fPalette;for(let n=0;n<=e;++n){let o=1*n/e;for(;l.fPoints[a]=n&&(n=l+1);let o=0,h=e.fWidth,u=0,P=e.fHeight;return t&&t.zoom_xmin!=t.zoom_xmax&&(o=Math.round(t.zoom_xmin*e.fWidth),h=Math.round(t.zoom_xmax*e.fWidth)),t&&t.zoom_ymin!=t.zoom_ymax&&(u=Math.round(t.zoom_ymin*e.fHeight),P=Math.round(t.zoom_ymax*e.fHeight)),((0,g.isNodeJs)()?f.e(305).then(f.t.bind(f,8305,19)).then(i=>i.default.createCanvas(h-o,P-u)):new Promise(i=>{let s=document.createElement("canvas");s.width=h-o,s.height=P-u,i(s)})).then(i=>{let s=i.getContext("2d"),m=s.getImageData(0,0,i.width,i.height),b=m.data;for(let c=u;c(n.url&&e.createG(!!r).append("image").attr("href",n.url).attr("width",a.width).attr("height",a.height).attr("preserveAspectRatio",n.constRatio?null:"none"),n.url&&e.isMainPainter()&&n.is_buf&&r?e.drawColorPalette(e.options.Zscale,!0).then(()=>(r.setAxesRanges((0,g.create)(g.clTAxis),0,1,(0,g.create)(g.clTAxis),0,1,null,0,0),r.createXY({ndim:2,check_pad_range:!1}),r.addInteractivity())):e))})()}canZoomInside(e,t,r){let a=this.getObject();return!!a?.fImgBuf&&("x"==e&&(r-t)*a.fWidth>3||"y"==e&&(r-t)*a.fHeight>3)}drawColorPalette(e,t){var r=this;return(0,d.Z)(function*(){if(!r.isMainPainter())return null;if(!r.draw_palette){let o=(0,g.create)(g.clTPaletteAxis);Object.assign(o,{fX1NDC:.91,fX2NDC:.95,fY1NDC:.1,fY2NDC:.9,fInit:1}),o.fAxis.fChopt="+",r.draw_palette=o,r.fPalette=!0}let a=r.getPadPainter().findPainterFor(r.draw_palette);if(!e)return a&&(a.Enabled=!1,a.removeG()),null;let l=r.getFramePainter();if(t&&l){let o=r.draw_palette;o.fX2NDC=l.fX2NDC+.01+(o.fX2NDC-o.fX1NDC),o.fX1NDC=l.fX2NDC+.01,o.fY1NDC=l.fY1NDC,o.fY2NDC=l.fY2NDC}if(a)return a.Enabled=!0,a.drawPave("");let n=r.selectCurrentPad(r.getPadName());return w.TPavePainter.draw(r.getDom(),r.draw_palette).then(o=>{a=o,r.selectCurrentPad(n),a.$secondary=!0,a.redraw=function(){}})})()}toggleColz(){let e=this.getObject();e&&e.fPalette&&(this.options.Zscale=!this.options.Zscale,this.drawColorPalette(this.options.Zscale,!0))}redraw(e){let t=this.draw_g?this.draw_g.select("image"):null,r=this.getFramePainter();if(!t||t.empty()||"zoom"===e||!r)return this.drawImage();t.attr("width",r.getFrameWidth()).attr("height",r.getFrameHeight())}clickButton(e){return!!this.isMainPainter()&&"ToggleColorZ"===e&&(this.toggleColz(),!0)}fillToolbar(){let e=this.getPadPainter(),t=this.getObject();e&&t?.fPalette&&(e.addPadButton("th2colorz","Toggle color palette","ToggleColorZ"),e.showPadButtons())}static draw(e,t,r){return(0,d.Z)(function*(){let a=new B(e,t,r);return a.decodeOptions(r),(0,x.ensureTCanvas)(a,!1).then(()=>a.drawImage()).then(()=>(a.fillToolbar(),a))})()}}}}]); -//# sourceMappingURL=726.d688e74f08d3451b.js.map \ No newline at end of file diff --git a/docs/727.68369a4ece2d6e5d.js b/docs/727.68369a4ece2d6e5d.js deleted file mode 100644 index 2ab858cc8..000000000 --- a/docs/727.68369a4ece2d6e5d.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[727],{3727:(E,g,m)=>{m.r(g),m.d(g,{TSplinePainter:()=>x});var M=m(5368),p=m(1773),u=m(5611),P=m(2454),X=m(7320);class x extends P.tK{updateObject(t,i){let e=this.getObject();return e._typename==t._typename&&(e!==t&&Object.assign(e,t),void 0!==i&&this.decodeOptions(i),!0)}eval(t,i){let e=i-t.fX;return"TSplinePoly3"==t._typename?t.fY+e*(t.fB+e*(t.fC+e*t.fD)):"TSplinePoly5"==t._typename?t.fY+e*(t.fB+e*(t.fC+e*(t.fD+e*(t.fE+e*t.fF)))):t.fY+e}findX(t){let i=this.getObject(),e=0,n=i.fNp-1;if(t<=i.fXmin)return 0;if(t>=i.fXmax)return n;if(i.fKstep)e=Math.round((t-i.fXmin)/i.fDelta),ti.fPoly[e+1].fX&&++e;else for(;n-e>1;){let a=Math.round((e+n)/2);t>i.fPoly[a].fX?e=a:n=a}return e}createDummyHisto(){let t=0,i=1,e=0,n=1,a=this.getObject();a?.fPoly&&(t=i=a.fPoly[0].fX,e=n=a.fPoly[0].fY,a.fPoly.forEach(l=>{t=Math.min(l.fX,t),i=Math.max(l.fX,i),e=Math.min(l.fY,e),n=Math.max(l.fY,n)}),n>0&&(n*=1+p.gStyle.fHistTopMargin),e<0&&(e*=1+p.gStyle.fHistTopMargin));let s=(0,p.create)("TH1I");return s.fName=a.fName+"_hist",s.fTitle=a.fTitle,s.fXaxis.fXmin=t,s.fXaxis.fXmax=i,s.fYaxis.fXmin=e,s.fYaxis.fXmax=n,s}processTooltipEvent(t){let s,l,i=!1,e=this.getObject(),a=this.getFramePainter()?.getGrFuncs(this.options.second_x,this.options.second_y),r=null,o=0;if(null!==t&&e&&a?(s=a.revertAxis("x",t.x),o=this.findX(s),r=e.fPoly[o],l=this.eval(r,s),oe.fXmax)&&(i=!0))):i=!0,i)return this.draw_g&&this.draw_g.select(".tooltip_bin").remove(),null;let h=this.draw_g.select(".tooltip_bin"),c=this.lineatt.width+3;h.empty()&&(h=this.draw_g.append("svg:circle").attr("class","tooltip_bin").style("pointer-events","none").attr("r",c).style("fill","none").call(this.lineatt.func));let f={name:this.getObject().fName,title:this.getObject().fTitle,x:a.grx(s),y:a.gry(l),color1:this.lineatt.color,lines:[],exact:null!==r||Math.abs(a.gry(l)-t.y)-this.knot_size&&o-this.knot_size&&h(n.addToPadPrimitives(),n.redraw(),n))})()}}}}]); -//# sourceMappingURL=727.68369a4ece2d6e5d.js.map \ No newline at end of file diff --git a/docs/728.960e13d793eca2ea.js b/docs/728.960e13d793eca2ea.js deleted file mode 100644 index 62840db3d..000000000 --- a/docs/728.960e13d793eca2ea.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[728],{6728:(b,y,p)=>{p.r(y),p.d(y,{TGraphPolarPainter:()=>M,TGraphPolargramPainter:()=>x});var P=p(5368),g=p(1773),u=p(2912),w=p(5611),_=p(2454),E=p(1671),T=p(1518),v=p(2989);class x extends _.tK{constructor(t,e){super(t,e),this.$polargram=!0,this.zoom_rmin=this.zoom_rmax=0}translate(t,e,a){let i=this.r(e),r=i/this.szx*this.szy,s={x:i*Math.cos(-t-this.angle),y:r*Math.sin(-t-this.angle),rx:i,ry:r};return a||(s.x=Math.round(s.x),s.y=Math.round(s.y),s.rx=Math.round(s.rx),s.ry=Math.round(s.ry)),s}format(t){return t===Math.round(t)?t.toString():this.ndig>10?t.toExponential(4):t.toFixed(this.ndig>0?this.ndig:0)}axisAsText(t,e){return"r"==t?e===Math.round(e)?e.toString():this.ndig>10?e.toExponential(4):e.toFixed(this.ndig+2):(e*=180/Math.PI)===Math.round(e)?e.toString():e.toFixed(1)}getFrameRect(){let t=this.getPadPainter(),e=t.getRootPad(!0),a=t.getPadWidth(),i=t.getPadHeight(),r={};return e?(r.szx=Math.round(Math.max(.1,.5-Math.max(e.fLeftMargin,e.fRightMargin))*a),r.szy=Math.round(Math.max(.1,.5-Math.max(e.fBottomMargin,e.fTopMargin))*i)):(r.szx=Math.round(.5*a),r.szy=Math.round(.5*i)),r.width=2*r.szx,r.height=2*r.szy,r.x=Math.round(a/2-r.szx),r.y=Math.round(i/2-r.szy),r.hint_delta_x=r.szx,r.hint_delta_y=r.szy,r.transform=`translate(${r.x},${r.y})`,r}mouseEvent(t,e){let i=this.getLayerSvg("primitives_layer").select(".interactive_ellipse");if(i.empty())return;let r=null;if("leave"!==t){let s=(0,u.cx)(e,i.node());r={x:s[0],y:s[1],touch:!1}}this.processFrameTooltipEvent(r)}mouseWheel(t){t.stopPropagation(),t.preventDefault(),this.processFrameTooltipEvent(null);let e=this.getObject();if(!e)return;let a=t.wheelDelta?-t.wheelDelta:t.deltaY||t.detail;if(!a)return;a=a<0?-.2:.2;let i=this.scale_rmin,r=this.scale_rmax;r+=a*(r-i),(ie.fRwrmax)&&(i=r=0),(this.zoom_rmin!=i||this.zoom_rmax!=r)&&(this.zoom_rmin=i,this.zoom_rmax=r,this.redrawPad())}redraw(){if(!this.isMainPainter())return;let t=this.getObject(),e=this.getPadPainter().getFrameRect();this.createG(),this.draw_g.attr("transform",`translate(${Math.round(e.x+e.width/2)},${Math.round(e.y+e.height/2)})`),this.szx=e.szx,this.szy=e.szy,this.scale_rmin=t.fRwrmin,this.scale_rmax=t.fRwrmax,this.zoom_rmin!=this.zoom_rmax&&(this.scale_rmin=this.zoom_rmin,this.scale_rmax=this.zoom_rmax),this.r=(0,u.BY)().domain([this.scale_rmin,this.scale_rmax]).range([0,this.szx]),this.angle=t.fAxisAngle||0;let a=this.r.ticks(5),i=Math.floor(t.fNdivRad%1e4/100);this.createAttLine({attr:t}),this.gridatt||(this.gridatt=new E.rE({color:t.fLineColor,style:2,width:1}));let r=Math.abs(t.fRwrmax-t.fRwrmin);this.ndig=r<=0?-3:Math.round(Math.log10(a.length/r));let s=[],l=0;for(;l=0){if(++this.ndig>10)break;s=[],l=0}else s.push(n),l++}let f=!1;a[a.length-1]1&&(nthis.scale_rmax)break;d=this.r(z),h=d/this.szx*this.szy,this.draw_g.append("ellipse").attr("cx",0).attr("cy",0).attr("rx",Math.round(d)).attr("ry",Math.round(h)).style("fill","none").call(this.gridatt.func)}}}let o=t.fNdivPol%100;return 8!==o&&3!==o&&(o=8),this.finishTextDrawing().then(()=>{let n=Math.round(t.fPolarTextSize*this.szy*2);this.startTextDrawing(t.fPolarLabelFont,n),s=8==o?["0","#frac{#pi}{4}","#frac{#pi}{2}","#frac{3#pi}{4}","#pi","#frac{5#pi}{4}","#frac{3#pi}{2}","#frac{7#pi}{4}"]:["0","#frac{2#pi}{3}","#frac{4#pi}{3}"];let d=[12,11,21,31,32,33,23,13];for(let h=0;h{if(i=Math.floor(t.fNdivPol%1e4/100),i>1)for(let h=0;hthis.mouseEvent("enter",h)).on("mousemove",h=>this.mouseEvent("move",h)).on("mouseleave",h=>this.mouseEvent("leave",h))),d.attr("rx",this.szx).attr("ry",this.szy),(0,u.Ys)(d.node().parentNode).attr("transform",this.draw_g.attr("transform")),g.settings.Zooming&&g.settings.ZoomWheel&&d.on("wheel",h=>this.mouseWheel(h))})}static draw(t,e){return(0,P.Z)(function*(){let a=(0,_.SO)(t);if(a){if(a.getObject()===e)return a;throw Error("Cannot superimpose TGraphPolargram with any other drawings")}let i=new x(t,e);return(0,T.ensureTCanvas)(i,!1).then(()=>(i.setAsMainPainter(),i.redraw())).then(()=>i)})()}}class M extends _.tK{redraw(){this.drawGraphPolar()}decodeOptions(t){let e=new w.pc(t||"L");this.options||(this.options={}),Object.assign(this.options,{mark:e.check("P"),err:e.check("E"),fill:e.check("F"),line:e.check("L"),curve:e.check("C")}),this.storeDrawOpt(t)}drawGraphPolar(){let t=this.getObject(),e=this.getMainPainter();if(!t||!e?.$polargram)return;this.options.mark&&this.createAttMarker({attr:t}),(this.options.err||this.options.line||this.options.curve)&&this.createAttLine({attr:t}),this.options.fill&&this.createAttFill({attr:t}),this.createG(),this.draw_g.attr("transform",e.draw_g.attr("transform"));let a="",i="",r="",s=[];for(let l=0;le.scale_rmax)continue;if(this.options.err){let o=e.translate(t.fX[l],t.fY[l]-t.fEY[l]),n=e.translate(t.fX[l],t.fY[l]+t.fEY[l]);i+=`M${o.x},${o.y}L${n.x},${n.y}`,o=e.translate(t.fX[l]+t.fEX[l],t.fY[l]),n=e.translate(t.fX[l]-t.fEX[l],t.fY[l]),i+=`M${o.x},${o.y}A${n.rx},${n.ry},0,0,1,${n.x},${n.y}`}let f=e.translate(t.fX[l],t.fY[l]);this.options.mark&&(a+=this.markeratt.create(f.x,f.y)),(this.options.line||this.options.fill)&&(r+=(r?"L":"M")+f.x+","+f.y),this.options.curve&&(f.grx=f.x,f.gry=f.y,s.push(f))}this.options.fill&&r&&this.draw_g.append("svg:path").attr("d",r+"Z").call(this.fillatt.func),this.options.line&&r&&this.draw_g.append("svg:path").attr("d",r).style("fill","none").call(this.lineatt.func),this.options.curve&&s.length&&this.draw_g.append("svg:path").attr("d",(0,w.Cq)("bezier",s).path).style("fill","none").call(this.lineatt.func),i&&this.draw_g.append("svg:path").attr("d",i).style("fill","none").call(this.lineatt.func),a&&this.draw_g.append("svg:path").attr("d",a).call(this.markeratt.func)}createPolargram(){let t=(0,g.create)("TGraphPolargram"),e=this.getObject(),a=e.fY[0]||0,i=a;for(let r=0;rl)return null;let f={name:this.getObject().fName,title:this.getObject().fTitle,x:s.x,y:s.y,color1:this.markeratt&&this.markeratt.used?this.markeratt.color:this.lineatt.color,exact:Math.sqrt(i)<4,lines:[this.getObjectHint()],binindx:r,menu_dist:l,radius:l};return f.lines.push("r = "+a.axisAsText("r",e.fY[r])),f.lines.push("phi = "+a.axisAsText("phi",e.fX[r])),e.fEY&&e.fEY[r]&&f.lines.push("error r = "+a.axisAsText("r",e.fEY[r])),e.fEX&&e.fEX[r]&&f.lines.push("error phi = "+a.axisAsText("phi",e.fEX[r])),f}showTooltip(t){if(!this.draw_g)return;let e=this.draw_g.select(".tooltip_bin");t?(e.empty()&&(e=this.draw_g.append("svg:ellipse").attr("class","tooltip_bin").style("pointer-events","none")),t.changed=e.property("current_bin")!==t.binindx,t.changed&&e.attr("cx",t.x).attr("cy",t.y).attr("rx",Math.round(t.radius)).attr("ry",Math.round(t.radius)).style("fill","none").style("stroke",t.color1).property("current_bin",t.binindx)):e.remove()}processTooltipEvent(t){let e=this.extractTooltip(t);return(!t||!t.disabled)&&this.showTooltip(e),e}static draw(t,e,a){return(0,P.Z)(function*(){let i=new M(t,e);i.decodeOptions(a);let r=i.getMainPainter();if(r&&!r.$polargram)return console.error("Cannot superimpose TGraphPolar with plain histograms"),null;let s=Promise.resolve(null);return r||(e.fPolargram||(e.fPolargram=i.createPolargram()),s=x.draw(t,e.fPolargram)),s.then(()=>(i.addToPadPrimitives(),i.drawGraphPolar(),i))})()}}}}]); -//# sourceMappingURL=728.960e13d793eca2ea.js.map \ No newline at end of file diff --git a/docs/765.d54816cb7021354f.js b/docs/765.d54816cb7021354f.js deleted file mode 100644 index cee9afde7..000000000 --- a/docs/765.d54816cb7021354f.js +++ /dev/null @@ -1,2 +0,0 @@ -(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[765],{1680:()=>{}}]); -//# sourceMappingURL=765.d54816cb7021354f.js.map \ No newline at end of file diff --git a/docs/832.c41e44530d6fa14d.js b/docs/832.c41e44530d6fa14d.js new file mode 100644 index 000000000..1b190a287 --- /dev/null +++ b/docs/832.c41e44530d6fa14d.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[832],{832:(L,X,c)=>{c.r(X),c.d(X,{THStackPainter:()=>M});var E=c(4788),h=c(9542),v=c(3675),H=c(6458),A=c(629),N=c(8189),D=c(49);class M extends H.tK{constructor(r,i,s){super(r,i,s),this.firstpainter=null,this.painters=[]}cleanup(){this.getPadPainter()?.cleanPrimitives(r=>r===this.firstpainter||this.painters.indexOf(r)>=0),delete this.firstpainter,delete this.painters,super.cleanup()}buildStack(r){if(!r.fHists)return!1;let i=r.fHists.arr.length;if(i<=0)return!1;let s=(0,h.create)(h.clTList);s.Add((0,h.clone)(r.fHists.arr[0]),r.fHists.opt[0]);for(let e=1;e{let d={min:0,max:0},P=!0,O=!0;if(o.fMinimum!==h.kNoZoom&&(d.min=o.fMinimum,P=!1),o.fMaximum!==h.kNoZoom&&(d.max=o.fMaximum,O=!1),!P&&!O)return d;let S=1,C=o.fXaxis.fNbins,w=1,k=1,T=!0;o.fXaxis.TestBit(H.VO.kAxisRange)&&(S=o.fXaxis.fFirst,C=o.fXaxis.fLast),0===o._typename.indexOf(h.clTH2)&&(k=o.fYaxis.fNbins,o.fYaxis.TestBit(H.VO.kAxisRange)&&(w=o.fYaxis.fFirst,k=o.fYaxis.fLast));for(let u=w;u<=k;++u)for(let x=S;x<=C;++x){let _=o.getBinContent(x,u),g=p?o.getBinError(o.getBin(x,u)):0;P&&(T||_-gd.max)&&(d.max=_+g),T=!1}return d};if(this.options.nostack)for(let o=0;o{if(t&&(1==this.options.ndim?t.fLogy:t.fLogz)){s<=0&&(s=1),i<=0&&(i=1e-4*s);let o=1/(1+.5*Math.log10(s/i)),p=1+.2*Math.log10(s/i);i*=o,s*=p}else i>0&&i<.05*s&&(i=0)};s*=1+h.gStyle.fHistTopMargin,a();let f=s,l=i,m=!1;return e.fMaximum!=h.kNoZoom&&(s=e.fMaximum*(1+h.gStyle.fHistTopMargin),f=Math.max(s,f),m=!0),e.fMinimum!=h.kNoZoom&&(i=e.fMinimum,l=Math.min(i,l),m=!0),m?a():i=s=h.kNoZoom,{min:i,max:s,min0:l,max0:f,zoomed:m,hopt:`hmin:${l};hmax:${f};minimum:${i};maximum:${s}`}}drawNextHisto(r,i){var s=this;return(0,E.Z)(function*(){let e=s.getObject(),t=s.options.nostack?e.fHists:e.fStack,n=t?.arr?.length||0;if(r>=n)return s;let a=s.options.horder?r:n-r-1,f=t.arr[a],l=t.opt[a]||f.fOption||s.options.hopt;if(l.toUpperCase().indexOf(s.options.hopt)<0&&(l+=" "+s.options.hopt),s.options.draw_errors&&!l&&(l="E"),s.options._pfc||s.options._plc||s.options._pmc){let m=s.getMainPainter();if((0,h.isFunc)(m?.createAutoColor)){let o=m.createAutoColor(n);s.options._pfc&&(f.fFillColor=o),s.options._plc&&(f.fLineColor=o),s.options._pmc&&(f.fMarkerColor=o)}}if(i){let m=i.getSubPadPainter(r+1);if(!m)return s;let o=m.selectCurrentPad(m.this_pad_name);return s.hdraw_func(m.getDom(),f,l).then(p=>(s.painters.push(p),m.selectCurrentPad(o),s.drawNextHisto(r+1,i)))}return a>0&&!s.options.nostack&&(f.$baseh=t.arr[a-1]),s.hdraw_func(s.getDom(),f,l+" same nostat").then(m=>(s.painters.push(m),s.drawNextHisto(r+1,i)))})()}decodeOptions(r){this.options||(this.options={}),Object.assign(this.options,{ndim:1,nostack:!1,same:!1,horder:!0,has_errors:!1,draw_errors:!1,hopt:""});let i=this.getObject(),s=i.fHistogram||(i.fHists?i.fHists.arr[0]:null)||(i.fStack?i.fStack.arr[0]:null);const e=a=>{if(a.fSumw2&&a.fSumw2.length>0)for(let f=0;f0)return!0;return!1};if(s&&0==s._typename.indexOf(h.clTH2)&&(this.options.ndim=2),2==this.options.ndim&&!r&&(r="lego1"),i.fHists&&!this.options.nostack)for(let a=0;athis.painters.indexOf(t)>=0),this.painters=[],this.did_update=!0;else for(let t=0;t{if(e.decodeOptions(s),e.hdraw_func=1==e.options.ndim?A.TH1Painter.draw:N.TH2Painter.draw,e.options.pads)return t=e.getPadPainter(),t.doingDraw()&&t.pad?.fPrimitives&&t.pad.fPrimitives.arr.length>1&&0==t.pad.fPrimitives.arr.indexOf(i)?(n=!0,void console.log("special case with THStack with is already rendered - do nothing")):(t.cleanPrimitives(m=>m!==e),t.divide(e.options.nhist));if(e.options.nostack||(e.options.nostack=!e.buildStack(i)),e.options.same)return;let a=!i.fHistogram;a&&(i.fHistogram=e.createHistogram(i));let f=e.getMinMax(e.options.errors||e.options.draw_errors);return e.hdraw_func(r,i.fHistogram,e.options.hopt+";axis;"+f.hopt).then(m=>{e.addToPadPrimitives(),e.firstpainter=m,m.$secondary="hist",a||(e.$primary=!0)})}).then(()=>n?e:e.drawNextHisto(0,t))})()}}}}]); +//# sourceMappingURL=832.c41e44530d6fa14d.js.map \ No newline at end of file diff --git a/docs/969.4da6fba206d57e9b.js.map b/docs/832.c41e44530d6fa14d.js.map similarity index 99% rename from docs/969.4da6fba206d57e9b.js.map rename to docs/832.c41e44530d6fa14d.js.map index 978699729..6b61c5070 100644 --- a/docs/969.4da6fba206d57e9b.js.map +++ b/docs/832.c41e44530d6fa14d.js.map @@ -1 +1 @@ -{"version":3,"file":"969.4da6fba206d57e9b.js","mappings":"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","names":["THStackPainter","ObjectPainter","constructor","dom","stack","opt","super","this","firstpainter","painters","cleanup","getPadPainter","cleanPrimitives","objp","indexOf","buildStack","fHists","nhists","arr","length","lst","create","clTList","Add","clone","i","hnext","hnextopt","hprev","fNbins","fXaxis","fXmin","fXmax","console","warn","fName","Clear","n","fArray","fStack","getMinMax","iserr","min","max","getObject","pad","getRootPad","getHistMinMax","hist","witherr","res","domin","domax","fMinimum","kNoZoom","fMaximum","i1","i2","j1","j2","first","TestBit","EAxisBits","fFirst","fLast","_typename","clTH2","fYaxis","j","val","getBinContent","err","getBinError","getBin","options","nostack","resh","Math","adjustRange","ndim","fLogy","fLogz","kmin","log10","kmax","gStyle","max0","min0","zoomed","hopt","drawNextHisto","indx","pad_painter","_this","hlst","rindx","horder","fOption","toUpperCase","draw_errors","_pfc","_plc","_pmc","mp","getMainPainter","isFunc","createAutoColor","icolor","fFillColor","fLineColor","fMarkerColor","subpad_painter","getSubPadPainter","prev_name","selectCurrentPad","this_pad_name","hdraw_func","getDom","then","subp","push","$baseh","decodeOptions","Object","assign","same","has_errors","fHistogram","hasErrors","fSumw2","k","nhist","d","DrawOptions","check","pads","remain","dolego","errors","createHistogram","histos","numhistos","histo","fTitle","h0","h","fLabels","updateObject","obj","matchObjectType","src","mm","minimum","maximum","_checked_zooming","ymin","ymax","zmin","zmax","did_update","redraw","static","painter","skip_drawing","ensureTCanvas","TH1Painter","TH2Painter","doingDraw","fPrimitives","log","p","divide","no_histogram","addToPadPrimitives","$secondary","$primary"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/hist/THStackPainter.mjs"],"sourcesContent":["import { clone, create, createHistogram, isFunc, gStyle, clTList, clTH2, kNoZoom } from '../core.mjs';\nimport { DrawOptions } from '../base/BasePainter.mjs';\nimport { ObjectPainter, EAxisBits } from '../base/ObjectPainter.mjs';\nimport { TH1Painter } from './TH1Painter.mjs';\nimport { TH2Painter } from './TH2Painter.mjs';\nimport { ensureTCanvas } from '../gpad/TCanvasPainter.mjs';\n\n\n/**\n * @summary Painter class for THStack\n *\n * @private\n */\n\nclass THStackPainter extends ObjectPainter {\n\n /** @summary constructor\n * @param {object|string} dom - DOM element for drawing or element id\n * @param {object} stack - THStack object\n * @param {string} [opt] - draw options */\n constructor(dom, stack, opt) {\n super(dom, stack, opt);\n this.firstpainter = null;\n this.painters = []; // keep painters to be able update objects\n }\n\n /** @summary Cleanup THStack painter */\n cleanup() {\n this.getPadPainter()?.cleanPrimitives(objp => { return (objp === this.firstpainter) || (this.painters.indexOf(objp) >= 0); });\n delete this.firstpainter;\n delete this.painters;\n super.cleanup();\n }\n\n /** @summary Build sum of all histograms\n * @desc Build a separate list fStack containing the running sum of all histograms */\n buildStack(stack) {\n if (!stack.fHists) return false;\n let nhists = stack.fHists.arr.length;\n if (nhists <= 0) return false;\n let lst = create(clTList);\n lst.Add(clone(stack.fHists.arr[0]), stack.fHists.opt[0]);\n for (let i = 1; i < nhists; ++i) {\n let hnext = clone(stack.fHists.arr[i]),\n hnextopt = stack.fHists.opt[i],\n hprev = lst.arr[i-1];\n\n if ((hnext.fNbins != hprev.fNbins) ||\n (hnext.fXaxis.fXmin != hprev.fXaxis.fXmin) ||\n (hnext.fXaxis.fXmax != hprev.fXaxis.fXmax)) {\n console.warn(`When drawing THStack, cannot sum-up histograms ${hnext.fName} and ${hprev.fName}`);\n lst.Clear();\n return false;\n }\n\n // trivial sum of histograms\n for (let n = 0; n < hnext.fArray.length; ++n)\n hnext.fArray[n] += hprev.fArray[n];\n\n lst.Add(hnext, hnextopt);\n }\n stack.fStack = lst;\n return true;\n }\n\n /** @summary Returns stack min/max values */\n getMinMax(iserr) {\n let min = 0, max = 0,\n stack = this.getObject(),\n pad = this.getPadPainter().getRootPad(true);\n\n const getHistMinMax = (hist, witherr) => {\n let res = { min: 0, max: 0 },\n domin = true, domax = true;\n if (hist.fMinimum !== kNoZoom) {\n res.min = hist.fMinimum;\n domin = false;\n }\n if (hist.fMaximum !== kNoZoom) {\n res.max = hist.fMaximum;\n domax = false;\n }\n\n if (!domin && !domax) return res;\n\n let i1 = 1, i2 = hist.fXaxis.fNbins, j1 = 1, j2 = 1, first = true;\n\n if (hist.fXaxis.TestBit(EAxisBits.kAxisRange)) {\n i1 = hist.fXaxis.fFirst;\n i2 = hist.fXaxis.fLast;\n }\n\n if (hist._typename.indexOf(clTH2) === 0) {\n j2 = hist.fYaxis.fNbins;\n if (hist.fYaxis.TestBit(EAxisBits.kAxisRange)) {\n j1 = hist.fYaxis.fFirst;\n j2 = hist.fYaxis.fLast;\n }\n }\n for (let j = j1; j <= j2; ++j)\n for (let i = i1; i <= i2; ++i) {\n let val = hist.getBinContent(i, j),\n err = witherr ? hist.getBinError(hist.getBin(i,j)) : 0;\n if (domin && (first || (val-err < res.min))) res.min = val-err;\n if (domax && (first || (val+err > res.max))) res.max = val+err;\n first = false;\n }\n\n return res;\n };\n\n if (this.options.nostack) {\n for (let i = 0; i < stack.fHists.arr.length; ++i) {\n let resh = getHistMinMax(stack.fHists.arr[i], iserr);\n if (i == 0) {\n min = resh.min; max = resh.max;\n } else {\n min = Math.min(min, resh.min);\n max = Math.max(max, resh.max);\n }\n }\n } else {\n min = getHistMinMax(stack.fStack.arr[0], iserr).min;\n max = getHistMinMax(stack.fStack.arr[stack.fStack.arr.length-1], iserr).max;\n }\n\n const adjustRange = () => {\n if (pad && (this.options.ndim == 1 ? pad.fLogy : pad.fLogz)) {\n if (max <= 0) max = 1;\n if (min <= 0) min = 1e-4*max;\n let kmin = 1/(1 + 0.5*Math.log10(max / min)),\n kmax = 1 + 0.2*Math.log10(max / min);\n min *= kmin;\n max *= kmax;\n } else if ((min > 0) && (min < 0.05*max)) {\n min = 0;\n }\n };\n\n max *= (1 + gStyle.fHistTopMargin);\n\n adjustRange();\n\n let max0 = max, min0 = min, zoomed = false;\n\n if (stack.fMaximum != kNoZoom) {\n max = stack.fMaximum*(1 + gStyle.fHistTopMargin);\n max0 = Math.max(max, max0);\n zoomed = true;\n }\n\n if (stack.fMinimum != kNoZoom) {\n min = stack.fMinimum;\n min0 = Math.min(min, min0);\n zoomed = true;\n }\n\n if (zoomed)\n adjustRange();\n else\n min = max = kNoZoom;\n\n return { min, max, min0, max0, zoomed, hopt: `hmin:${min0};hmax:${max0};minimum:${min};maximum:${max}` };\n }\n\n /** @summary Draw next stack histogram */\n async drawNextHisto(indx, pad_painter) {\n\n let stack = this.getObject(),\n hlst = this.options.nostack ? stack.fHists : stack.fStack,\n nhists = hlst?.arr?.length || 0;\n\n if (indx >= nhists)\n return this;\n\n let rindx = this.options.horder ? indx : nhists-indx-1,\n hist = hlst.arr[rindx],\n hopt = hlst.opt[rindx] || hist.fOption || this.options.hopt;\n\n if (hopt.toUpperCase().indexOf(this.options.hopt) < 0)\n hopt += ' ' + this.options.hopt;\n if (this.options.draw_errors && !hopt)\n hopt = 'E';\n\n if (this.options._pfc || this.options._plc || this.options._pmc) {\n let mp = this.getMainPainter();\n if (isFunc(mp?.createAutoColor)) {\n let icolor = mp.createAutoColor(nhists);\n if (this.options._pfc) hist.fFillColor = icolor;\n if (this.options._plc) hist.fLineColor = icolor;\n if (this.options._pmc) hist.fMarkerColor = icolor;\n }\n }\n\n // handling of 'pads' draw option\n if (pad_painter) {\n let subpad_painter = pad_painter.getSubPadPainter(indx+1);\n if (!subpad_painter)\n return this;\n\n let prev_name = subpad_painter.selectCurrentPad(subpad_painter.this_pad_name);\n\n return this.hdraw_func(subpad_painter.getDom(), hist, hopt).then(subp => {\n this.painters.push(subp);\n subpad_painter.selectCurrentPad(prev_name);\n return this.drawNextHisto(indx+1, pad_painter);\n });\n }\n\n // special handling of stacked histograms - set $baseh object for correct drawing\n // also used to provide tooltips\n if ((rindx > 0) && !this.options.nostack)\n hist.$baseh = hlst.arr[rindx - 1];\n\n return this.hdraw_func(this.getDom(), hist, hopt + ' same nostat').then(subp => {\n this.painters.push(subp);\n return this.drawNextHisto(indx+1, pad_painter);\n });\n }\n\n /** @summary Decode draw options of THStack painter */\n decodeOptions(opt) {\n if (!this.options) this.options = {};\n Object.assign(this.options, { ndim: 1, nostack: false, same: false, horder: true, has_errors: false, draw_errors: false, hopt: '' });\n\n let stack = this.getObject(),\n hist = stack.fHistogram || (stack.fHists ? stack.fHists.arr[0] : null) || (stack.fStack ? stack.fStack.arr[0] : null);\n\n const hasErrors = hist => {\n if (hist.fSumw2 && (hist.fSumw2.length > 0))\n for (let n = 0; n < hist.fSumw2.length; ++n)\n if (hist.fSumw2[n] > 0) return true;\n return false;\n };\n\n if (hist && (hist._typename.indexOf(clTH2) == 0))\n this.options.ndim = 2;\n\n if ((this.options.ndim == 2) && !opt)\n opt = 'lego1';\n\n if (stack.fHists && !this.options.nostack)\n for (let k = 0; k < stack.fHists.arr.length; ++k)\n this.options.has_errors = this.options.has_errors || hasErrors(stack.fHists.arr[k]);\n\n this.options.nhist = stack.fHists ? stack.fHists.arr.length : 1;\n\n let d = new DrawOptions(opt);\n\n this.options.nostack = d.check('NOSTACK');\n if (d.check('STACK')) this.options.nostack = false;\n this.options.same = d.check('SAME');\n\n d.check('NOCLEAR'); // ignore noclear option\n\n this.options._pfc = d.check('PFC');\n this.options._plc = d.check('PLC');\n this.options._pmc = d.check('PMC');\n\n this.options.pads = d.check('PADS');\n if (this.options.pads) this.options.nostack = true;\n\n this.options.hopt = d.remain(); // use remaining draw options for histogram draw\n\n let dolego = d.check('LEGO');\n\n this.options.errors = d.check('E');\n\n // if any histogram appears with pre-calculated errors, use E for all histograms\n if (!this.options.nostack && this.options.has_errors && !dolego && !d.check('HIST') && (this.options.hopt.indexOf('E') < 0))\n this.options.draw_errors = true;\n\n this.options.horder = this.options.nostack || dolego;\n }\n\n /** @summary Create main histogram for THStack axis drawing */\n createHistogram(stack) {\n let histos = stack.fHists,\n numhistos = histos ? histos.arr.length : 0;\n\n if (!numhistos) {\n let histo = createHistogram('TH1I', 100);\n histo.fTitle = stack.fTitle;\n return histo;\n }\n\n let h0 = histos.arr[0],\n histo = createHistogram((this.options.ndim == 1) ? 'TH1I' : 'TH2I', h0.fXaxis.fNbins, h0.fYaxis.fNbins);\n histo.fName = 'axis_hist';\n Object.assign(histo.fXaxis, h0.fXaxis);\n if (this.options.ndim==2)\n Object.assign(histo.fYaxis, h0.fYaxis);\n\n // this code is not exists in ROOT painter, can be skipped?\n for (let n = 1; n < numhistos; ++n) {\n let h = histos.arr[n];\n\n if (!histo.fXaxis.fLabels) {\n histo.fXaxis.fXmin = Math.min(histo.fXaxis.fXmin, h.fXaxis.fXmin);\n histo.fXaxis.fXmax = Math.max(histo.fXaxis.fXmax, h.fXaxis.fXmax);\n }\n\n if ((this.options.ndim==2) && !histo.fYaxis.fLabels) {\n histo.fYaxis.fXmin = Math.min(histo.fYaxis.fXmin, h.fYaxis.fXmin);\n histo.fYaxis.fXmax = Math.max(histo.fYaxis.fXmax, h.fYaxis.fXmax);\n }\n }\n\n histo.fTitle = stack.fTitle;\n\n return histo;\n }\n\n /** @summary Update thstack object */\n updateObject(obj) {\n if (!this.matchObjectType(obj)) return false;\n\n let stack = this.getObject();\n\n stack.fHists = obj.fHists;\n stack.fStack = obj.fStack;\n stack.fTitle = obj.fTitle;\n stack.fMinimum = obj.fMinimum;\n stack.fMaximum = obj.fMaximum;\n\n if (!this.options.nostack)\n this.options.nostack = !this.buildStack(stack);\n\n if (this.firstpainter) {\n let src = obj.fHistogram;\n if (!src)\n src = stack.fHistogram = this.createHistogram(stack);\n\n let mm = this.getMinMax(this.options.errors || this.options.draw_errors);\n\n this.firstpainter.options.minimum = mm.min;\n this.firstpainter.options.maximum = mm.max;\n this.firstpainter._checked_zooming = false; // force to check 3d zooming\n\n if (this.options.ndim == 1) {\n this.firstpainter.ymin = mm.min0;\n this.firstpainter.ymax = mm.max0;\n } else {\n this.firstpainter.zmin = mm.min0;\n this.firstpainter.zmax = mm.max0;\n }\n\n this.firstpainter.updateObject(src);\n }\n\n // and now update histograms\n let hlst = this.options.nostack ? stack.fHists : stack.fStack,\n nhists = (hlst && hlst.arr) ? hlst.arr.length : 0;\n\n if (nhists !== this.painters.length) {\n this.getPadPainter()?.cleanPrimitives(objp => { return this.painters.indexOf(objp) >= 0; });\n this.painters = [];\n this.did_update = true;\n } else {\n for (let indx = 0; indx < nhists; ++indx) {\n let rindx = this.options.horder ? indx : nhists-indx-1;\n let hist = hlst.arr[rindx];\n this.painters[indx].updateObject(hist);\n }\n }\n\n return true;\n }\n\n /** @summary Redraw THStack\n * @desc Do something if previous update had changed number of histograms */\n redraw() {\n if (this.did_update) {\n delete this.did_update;\n return this.drawNextHisto(0, this.options.pads ? this.getPadPainter() : null);\n }\n }\n\n /** @summary draw THStack object */\n static async draw(dom, stack, opt) {\n if (!stack.fHists || !stack.fHists.arr)\n return null; // drawing not needed\n\n let painter = new THStackPainter(dom, stack, opt),\n pad_painter = null,\n skip_drawing = false;\n\n return ensureTCanvas(painter, false).then(() => {\n\n painter.decodeOptions(opt);\n\n painter.hdraw_func = (painter.options.ndim == 1) ? TH1Painter.draw : TH2Painter.draw;\n\n if (painter.options.pads) {\n pad_painter = painter.getPadPainter();\n if (pad_painter.doingDraw() && pad_painter.pad?.fPrimitives &&\n pad_painter.pad.fPrimitives.arr.length > 1 && (pad_painter.pad.fPrimitives.arr.indexOf(stack) == 0)) {\n skip_drawing = true;\n console.log('special case with THStack with is already rendered - do nothing');\n return;\n }\n\n pad_painter.cleanPrimitives(p => p !== painter);\n return pad_painter.divide(painter.options.nhist);\n }\n\n if (!painter.options.nostack)\n painter.options.nostack = !painter.buildStack(stack);\n\n if (painter.options.same) return;\n\n let no_histogram = !stack.fHistogram;\n\n if (no_histogram)\n stack.fHistogram = painter.createHistogram(stack);\n\n let mm = painter.getMinMax(painter.options.errors || painter.options.draw_errors),\n hopt = painter.options.hopt + ';axis;' + mm.hopt;\n\n return painter.hdraw_func(dom, stack.fHistogram, hopt).then(subp => {\n painter.addToPadPrimitives();\n painter.firstpainter = subp;\n subp.$secondary = 'hist'; // mark histogram painter as secondary\n if (!no_histogram) painter.$primary = true; // mark stack as provider for histogram\n });\n }).then(() => skip_drawing ? painter : painter.drawNextHisto(0, pad_painter));\n }\n\n} // class THStackPainter\n\nexport { THStackPainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file +{"version":3,"file":"832.c41e44530d6fa14d.js","mappings":"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","names":["THStackPainter","ObjectPainter","constructor","dom","stack","opt","super","this","firstpainter","painters","cleanup","getPadPainter","cleanPrimitives","objp","indexOf","buildStack","fHists","nhists","arr","length","lst","create","clTList","Add","clone","i","hnext","hnextopt","hprev","fNbins","fXaxis","fXmin","fXmax","console","warn","fName","Clear","n","fArray","fStack","getMinMax","iserr","min","max","getObject","pad","getRootPad","getHistMinMax","hist","witherr","res","domin","domax","fMinimum","kNoZoom","fMaximum","i1","i2","j1","j2","first","TestBit","EAxisBits","fFirst","fLast","_typename","clTH2","fYaxis","j","val","getBinContent","err","getBinError","getBin","options","nostack","resh","Math","adjustRange","ndim","fLogy","fLogz","kmin","log10","kmax","gStyle","max0","min0","zoomed","hopt","drawNextHisto","indx","pad_painter","_this","hlst","rindx","horder","fOption","toUpperCase","draw_errors","_pfc","_plc","_pmc","mp","getMainPainter","isFunc","createAutoColor","icolor","fFillColor","fLineColor","fMarkerColor","subpad_painter","getSubPadPainter","prev_name","selectCurrentPad","this_pad_name","hdraw_func","getDom","then","subp","push","$baseh","decodeOptions","Object","assign","same","has_errors","fHistogram","hasErrors","fSumw2","k","nhist","d","DrawOptions","check","pads","remain","dolego","errors","createHistogram","histos","numhistos","histo","fTitle","h0","h","fLabels","updateObject","obj","matchObjectType","src","mm","minimum","maximum","_checked_zooming","ymin","ymax","zmin","zmax","did_update","redraw","static","painter","skip_drawing","ensureTCanvas","TH1Painter","TH2Painter","doingDraw","fPrimitives","log","p","divide","no_histogram","addToPadPrimitives","$secondary","$primary"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/hist/THStackPainter.mjs"],"sourcesContent":["import { clone, create, createHistogram, isFunc, gStyle, clTList, clTH2, kNoZoom } from '../core.mjs';\nimport { DrawOptions } from '../base/BasePainter.mjs';\nimport { ObjectPainter, EAxisBits } from '../base/ObjectPainter.mjs';\nimport { TH1Painter } from './TH1Painter.mjs';\nimport { TH2Painter } from './TH2Painter.mjs';\nimport { ensureTCanvas } from '../gpad/TCanvasPainter.mjs';\n\n\n/**\n * @summary Painter class for THStack\n *\n * @private\n */\n\nclass THStackPainter extends ObjectPainter {\n\n /** @summary constructor\n * @param {object|string} dom - DOM element for drawing or element id\n * @param {object} stack - THStack object\n * @param {string} [opt] - draw options */\n constructor(dom, stack, opt) {\n super(dom, stack, opt);\n this.firstpainter = null;\n this.painters = []; // keep painters to be able update objects\n }\n\n /** @summary Cleanup THStack painter */\n cleanup() {\n this.getPadPainter()?.cleanPrimitives(objp => { return (objp === this.firstpainter) || (this.painters.indexOf(objp) >= 0); });\n delete this.firstpainter;\n delete this.painters;\n super.cleanup();\n }\n\n /** @summary Build sum of all histograms\n * @desc Build a separate list fStack containing the running sum of all histograms */\n buildStack(stack) {\n if (!stack.fHists) return false;\n let nhists = stack.fHists.arr.length;\n if (nhists <= 0) return false;\n let lst = create(clTList);\n lst.Add(clone(stack.fHists.arr[0]), stack.fHists.opt[0]);\n for (let i = 1; i < nhists; ++i) {\n let hnext = clone(stack.fHists.arr[i]),\n hnextopt = stack.fHists.opt[i],\n hprev = lst.arr[i-1];\n\n if ((hnext.fNbins != hprev.fNbins) ||\n (hnext.fXaxis.fXmin != hprev.fXaxis.fXmin) ||\n (hnext.fXaxis.fXmax != hprev.fXaxis.fXmax)) {\n console.warn(`When drawing THStack, cannot sum-up histograms ${hnext.fName} and ${hprev.fName}`);\n lst.Clear();\n return false;\n }\n\n // trivial sum of histograms\n for (let n = 0; n < hnext.fArray.length; ++n)\n hnext.fArray[n] += hprev.fArray[n];\n\n lst.Add(hnext, hnextopt);\n }\n stack.fStack = lst;\n return true;\n }\n\n /** @summary Returns stack min/max values */\n getMinMax(iserr) {\n let min = 0, max = 0,\n stack = this.getObject(),\n pad = this.getPadPainter().getRootPad(true);\n\n const getHistMinMax = (hist, witherr) => {\n let res = { min: 0, max: 0 },\n domin = true, domax = true;\n if (hist.fMinimum !== kNoZoom) {\n res.min = hist.fMinimum;\n domin = false;\n }\n if (hist.fMaximum !== kNoZoom) {\n res.max = hist.fMaximum;\n domax = false;\n }\n\n if (!domin && !domax) return res;\n\n let i1 = 1, i2 = hist.fXaxis.fNbins, j1 = 1, j2 = 1, first = true;\n\n if (hist.fXaxis.TestBit(EAxisBits.kAxisRange)) {\n i1 = hist.fXaxis.fFirst;\n i2 = hist.fXaxis.fLast;\n }\n\n if (hist._typename.indexOf(clTH2) === 0) {\n j2 = hist.fYaxis.fNbins;\n if (hist.fYaxis.TestBit(EAxisBits.kAxisRange)) {\n j1 = hist.fYaxis.fFirst;\n j2 = hist.fYaxis.fLast;\n }\n }\n for (let j = j1; j <= j2; ++j)\n for (let i = i1; i <= i2; ++i) {\n let val = hist.getBinContent(i, j),\n err = witherr ? hist.getBinError(hist.getBin(i,j)) : 0;\n if (domin && (first || (val-err < res.min))) res.min = val-err;\n if (domax && (first || (val+err > res.max))) res.max = val+err;\n first = false;\n }\n\n return res;\n };\n\n if (this.options.nostack) {\n for (let i = 0; i < stack.fHists.arr.length; ++i) {\n let resh = getHistMinMax(stack.fHists.arr[i], iserr);\n if (i == 0) {\n min = resh.min; max = resh.max;\n } else {\n min = Math.min(min, resh.min);\n max = Math.max(max, resh.max);\n }\n }\n } else {\n min = getHistMinMax(stack.fStack.arr[0], iserr).min;\n max = getHistMinMax(stack.fStack.arr[stack.fStack.arr.length-1], iserr).max;\n }\n\n const adjustRange = () => {\n if (pad && (this.options.ndim == 1 ? pad.fLogy : pad.fLogz)) {\n if (max <= 0) max = 1;\n if (min <= 0) min = 1e-4*max;\n let kmin = 1/(1 + 0.5*Math.log10(max / min)),\n kmax = 1 + 0.2*Math.log10(max / min);\n min *= kmin;\n max *= kmax;\n } else if ((min > 0) && (min < 0.05*max)) {\n min = 0;\n }\n };\n\n max *= (1 + gStyle.fHistTopMargin);\n\n adjustRange();\n\n let max0 = max, min0 = min, zoomed = false;\n\n if (stack.fMaximum != kNoZoom) {\n max = stack.fMaximum*(1 + gStyle.fHistTopMargin);\n max0 = Math.max(max, max0);\n zoomed = true;\n }\n\n if (stack.fMinimum != kNoZoom) {\n min = stack.fMinimum;\n min0 = Math.min(min, min0);\n zoomed = true;\n }\n\n if (zoomed)\n adjustRange();\n else\n min = max = kNoZoom;\n\n return { min, max, min0, max0, zoomed, hopt: `hmin:${min0};hmax:${max0};minimum:${min};maximum:${max}` };\n }\n\n /** @summary Draw next stack histogram */\n async drawNextHisto(indx, pad_painter) {\n\n let stack = this.getObject(),\n hlst = this.options.nostack ? stack.fHists : stack.fStack,\n nhists = hlst?.arr?.length || 0;\n\n if (indx >= nhists)\n return this;\n\n let rindx = this.options.horder ? indx : nhists-indx-1,\n hist = hlst.arr[rindx],\n hopt = hlst.opt[rindx] || hist.fOption || this.options.hopt;\n\n if (hopt.toUpperCase().indexOf(this.options.hopt) < 0)\n hopt += ' ' + this.options.hopt;\n if (this.options.draw_errors && !hopt)\n hopt = 'E';\n\n if (this.options._pfc || this.options._plc || this.options._pmc) {\n let mp = this.getMainPainter();\n if (isFunc(mp?.createAutoColor)) {\n let icolor = mp.createAutoColor(nhists);\n if (this.options._pfc) hist.fFillColor = icolor;\n if (this.options._plc) hist.fLineColor = icolor;\n if (this.options._pmc) hist.fMarkerColor = icolor;\n }\n }\n\n // handling of 'pads' draw option\n if (pad_painter) {\n let subpad_painter = pad_painter.getSubPadPainter(indx+1);\n if (!subpad_painter)\n return this;\n\n let prev_name = subpad_painter.selectCurrentPad(subpad_painter.this_pad_name);\n\n return this.hdraw_func(subpad_painter.getDom(), hist, hopt).then(subp => {\n this.painters.push(subp);\n subpad_painter.selectCurrentPad(prev_name);\n return this.drawNextHisto(indx+1, pad_painter);\n });\n }\n\n // special handling of stacked histograms - set $baseh object for correct drawing\n // also used to provide tooltips\n if ((rindx > 0) && !this.options.nostack)\n hist.$baseh = hlst.arr[rindx - 1];\n\n return this.hdraw_func(this.getDom(), hist, hopt + ' same nostat').then(subp => {\n this.painters.push(subp);\n return this.drawNextHisto(indx+1, pad_painter);\n });\n }\n\n /** @summary Decode draw options of THStack painter */\n decodeOptions(opt) {\n if (!this.options) this.options = {};\n Object.assign(this.options, { ndim: 1, nostack: false, same: false, horder: true, has_errors: false, draw_errors: false, hopt: '' });\n\n let stack = this.getObject(),\n hist = stack.fHistogram || (stack.fHists ? stack.fHists.arr[0] : null) || (stack.fStack ? stack.fStack.arr[0] : null);\n\n const hasErrors = hist => {\n if (hist.fSumw2 && (hist.fSumw2.length > 0))\n for (let n = 0; n < hist.fSumw2.length; ++n)\n if (hist.fSumw2[n] > 0) return true;\n return false;\n };\n\n if (hist && (hist._typename.indexOf(clTH2) == 0))\n this.options.ndim = 2;\n\n if ((this.options.ndim == 2) && !opt)\n opt = 'lego1';\n\n if (stack.fHists && !this.options.nostack)\n for (let k = 0; k < stack.fHists.arr.length; ++k)\n this.options.has_errors = this.options.has_errors || hasErrors(stack.fHists.arr[k]);\n\n this.options.nhist = stack.fHists ? stack.fHists.arr.length : 1;\n\n let d = new DrawOptions(opt);\n\n this.options.nostack = d.check('NOSTACK');\n if (d.check('STACK')) this.options.nostack = false;\n this.options.same = d.check('SAME');\n\n d.check('NOCLEAR'); // ignore noclear option\n\n this.options._pfc = d.check('PFC');\n this.options._plc = d.check('PLC');\n this.options._pmc = d.check('PMC');\n\n this.options.pads = d.check('PADS');\n if (this.options.pads) this.options.nostack = true;\n\n this.options.hopt = d.remain(); // use remaining draw options for histogram draw\n\n let dolego = d.check('LEGO');\n\n this.options.errors = d.check('E');\n\n // if any histogram appears with pre-calculated errors, use E for all histograms\n if (!this.options.nostack && this.options.has_errors && !dolego && !d.check('HIST') && (this.options.hopt.indexOf('E') < 0))\n this.options.draw_errors = true;\n\n this.options.horder = this.options.nostack || dolego;\n }\n\n /** @summary Create main histogram for THStack axis drawing */\n createHistogram(stack) {\n let histos = stack.fHists,\n numhistos = histos ? histos.arr.length : 0;\n\n if (!numhistos) {\n let histo = createHistogram('TH1I', 100);\n histo.fTitle = stack.fTitle;\n return histo;\n }\n\n let h0 = histos.arr[0],\n histo = createHistogram((this.options.ndim == 1) ? 'TH1I' : 'TH2I', h0.fXaxis.fNbins, h0.fYaxis.fNbins);\n histo.fName = 'axis_hist';\n Object.assign(histo.fXaxis, h0.fXaxis);\n if (this.options.ndim==2)\n Object.assign(histo.fYaxis, h0.fYaxis);\n\n // this code is not exists in ROOT painter, can be skipped?\n for (let n = 1; n < numhistos; ++n) {\n let h = histos.arr[n];\n\n if (!histo.fXaxis.fLabels) {\n histo.fXaxis.fXmin = Math.min(histo.fXaxis.fXmin, h.fXaxis.fXmin);\n histo.fXaxis.fXmax = Math.max(histo.fXaxis.fXmax, h.fXaxis.fXmax);\n }\n\n if ((this.options.ndim==2) && !histo.fYaxis.fLabels) {\n histo.fYaxis.fXmin = Math.min(histo.fYaxis.fXmin, h.fYaxis.fXmin);\n histo.fYaxis.fXmax = Math.max(histo.fYaxis.fXmax, h.fYaxis.fXmax);\n }\n }\n\n histo.fTitle = stack.fTitle;\n\n return histo;\n }\n\n /** @summary Update thstack object */\n updateObject(obj) {\n if (!this.matchObjectType(obj)) return false;\n\n let stack = this.getObject();\n\n stack.fHists = obj.fHists;\n stack.fStack = obj.fStack;\n stack.fTitle = obj.fTitle;\n stack.fMinimum = obj.fMinimum;\n stack.fMaximum = obj.fMaximum;\n\n if (!this.options.nostack)\n this.options.nostack = !this.buildStack(stack);\n\n if (this.firstpainter) {\n let src = obj.fHistogram;\n if (!src)\n src = stack.fHistogram = this.createHistogram(stack);\n\n let mm = this.getMinMax(this.options.errors || this.options.draw_errors);\n\n this.firstpainter.options.minimum = mm.min;\n this.firstpainter.options.maximum = mm.max;\n this.firstpainter._checked_zooming = false; // force to check 3d zooming\n\n if (this.options.ndim == 1) {\n this.firstpainter.ymin = mm.min0;\n this.firstpainter.ymax = mm.max0;\n } else {\n this.firstpainter.zmin = mm.min0;\n this.firstpainter.zmax = mm.max0;\n }\n\n this.firstpainter.updateObject(src);\n }\n\n // and now update histograms\n let hlst = this.options.nostack ? stack.fHists : stack.fStack,\n nhists = (hlst && hlst.arr) ? hlst.arr.length : 0;\n\n if (nhists !== this.painters.length) {\n this.getPadPainter()?.cleanPrimitives(objp => { return this.painters.indexOf(objp) >= 0; });\n this.painters = [];\n this.did_update = true;\n } else {\n for (let indx = 0; indx < nhists; ++indx) {\n let rindx = this.options.horder ? indx : nhists-indx-1;\n let hist = hlst.arr[rindx];\n this.painters[indx].updateObject(hist);\n }\n }\n\n return true;\n }\n\n /** @summary Redraw THStack\n * @desc Do something if previous update had changed number of histograms */\n redraw() {\n if (this.did_update) {\n delete this.did_update;\n return this.drawNextHisto(0, this.options.pads ? this.getPadPainter() : null);\n }\n }\n\n /** @summary draw THStack object */\n static async draw(dom, stack, opt) {\n if (!stack.fHists || !stack.fHists.arr)\n return null; // drawing not needed\n\n let painter = new THStackPainter(dom, stack, opt),\n pad_painter = null,\n skip_drawing = false;\n\n return ensureTCanvas(painter, false).then(() => {\n\n painter.decodeOptions(opt);\n\n painter.hdraw_func = (painter.options.ndim == 1) ? TH1Painter.draw : TH2Painter.draw;\n\n if (painter.options.pads) {\n pad_painter = painter.getPadPainter();\n if (pad_painter.doingDraw() && pad_painter.pad?.fPrimitives &&\n pad_painter.pad.fPrimitives.arr.length > 1 && (pad_painter.pad.fPrimitives.arr.indexOf(stack) == 0)) {\n skip_drawing = true;\n console.log('special case with THStack with is already rendered - do nothing');\n return;\n }\n\n pad_painter.cleanPrimitives(p => p !== painter);\n return pad_painter.divide(painter.options.nhist);\n }\n\n if (!painter.options.nostack)\n painter.options.nostack = !painter.buildStack(stack);\n\n if (painter.options.same) return;\n\n let no_histogram = !stack.fHistogram;\n\n if (no_histogram)\n stack.fHistogram = painter.createHistogram(stack);\n\n let mm = painter.getMinMax(painter.options.errors || painter.options.draw_errors),\n hopt = painter.options.hopt + ';axis;' + mm.hopt;\n\n return painter.hdraw_func(dom, stack.fHistogram, hopt).then(subp => {\n painter.addToPadPrimitives();\n painter.firstpainter = subp;\n subp.$secondary = 'hist'; // mark histogram painter as secondary\n if (!no_histogram) painter.$primary = true; // mark stack as provider for histogram\n });\n }).then(() => skip_drawing ? painter : painter.drawNextHisto(0, pad_painter));\n }\n\n} // class THStackPainter\n\nexport { THStackPainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file diff --git a/docs/696.b99abdfe255d4b8c.js b/docs/946.e9493c0284811601.js similarity index 93% rename from docs/696.b99abdfe255d4b8c.js rename to docs/946.e9493c0284811601.js index 1dd68ba61..3a16181e6 100644 --- a/docs/696.b99abdfe255d4b8c.js +++ b/docs/946.e9493c0284811601.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[696],{4696:(D,y,o)=>{o.r(y),o.d(y,{TEfficiencyPainter:()=>E});var H=o(5368),l=o(1773),M=o(2454),p=o(3879),x=o(1827),A=o(4251),C=o(7553);const T=(0,l.BIT)(14),L=(0,l.BIT)(15),B=(0,l.BIT)(17),w=(0,l.BIT)(18),m=(c,t)=>c.fBeta_bin_params.length>t?c.fBeta_bin_params[t].first:c.fBeta_alpha,u=(c,t)=>c.fBeta_bin_params.length>t?c.fBeta_bin_params[t].second:c.fBeta_beta;class E extends M.tK{getEfficiency(t,a){let f=t.fTotalHistogram.fArray[a],n=t.fPassedHistogram.fArray[a];if(t.TestBit(T)){let _,h,e=t.TestBit(B)?m(t,a):t.fBeta_alpha,r=t.TestBit(B)?u(t,a):t.fBeta_beta;if(t.TestBit(w)){let g=f,P=t.fTotalHistogram.fSumw2?t.fTotalHistogram.fSumw2[a]:Math.abs(f);if(P<=0)return n/g;let O=g/P;_=n*O+e,h=(g-n)*O+r}else _=n+e,h=f-n+r;return t.TestBit(L)?((e,r)=>{if(e<=0||r<=0)return 0;if(e<=1||r<=1){if(er)return 1;if(e==r)return.5}return(e-1)/(e+r-2)})(_,h):((e,r)=>e<=0||r<=0?0:e/(e+r))(_,h)}return f?n/f:0}getEfficiencyErrorLow(t,a,i){let s=t.fTotalHistogram.fArray[a],f=t.fPassedHistogram.fArray[a],n=0,e=0;return t.TestBit(T)&&(n=t.TestBit(B)?m(t,a):t.fBeta_alpha,e=t.TestBit(B)?u(t,a):t.fBeta_beta),i-this.fBoundary(s,f,t.fConfLevel,!1,n,e)}getEfficiencyErrorUp(t,a,i){let s=t.fTotalHistogram.fArray[a],f=t.fPassedHistogram.fArray[a],n=0,e=0;return t.TestBit(T)&&(n=t.TestBit(B)?m(t,a):t.fBeta_alpha,e=t.TestBit(B)?u(t,a):t.fBeta_beta),this.fBoundary(s,f,t.fConfLevel,!0,n,e)-i}copyAttributes(t,a){["fLineColor","fLineStyle","fLineWidth","fFillColor","fFillStyle","fMarkerColor","fMarkerStyle","fMarkerSize"].forEach(i=>t[i]=a[i])}createGraph(){let t=(0,l.create)(p.clTGraphAsymmErrors);return t.fName="eff_graph",t}createHisto(t){const s=(0,l.createHistogram)("TH2F",t.fTotalHistogram.fXaxis.fNbins,t.fTotalHistogram.fYaxis.fNbins);return Object.assign(s.fXaxis,t.fTotalHistogram.fXaxis),Object.assign(s.fYaxis,t.fTotalHistogram.fYaxis),s.fName="eff_histo",s}fillGraph(t,a){const i=this.getObject(),s=i.fTotalHistogram.fXaxis,f=s.fNbins,n=a.indexOf("e0")>=0;for(let e=0,r=0;e=a.fFunctions.arr.length?this:x.TF1Painter.draw(this.getDom(),a.fFunctions.arr[t],a.fFunctions.opt[t]).then(()=>this.drawFunction(t+1))}static draw(t,a,i){return(0,H.Z)(function*(){if(!a||!a.fTotalHistogram)return null;(!i||!(0,l.isStr)(i))&&(i=""),i=i.toLowerCase();let s=0;if(0==a.fTotalHistogram._typename.indexOf(l.clTH1))s=1;else{if(0!=a.fTotalHistogram._typename.indexOf(l.clTH2))return null;s=2}let n,f=new E(t,a);if(f.ndim=s,f.fBoundary=(0,C.getTEfficiencyBoundaryFunc)(a.fStatisticOption,a.TestBit(T)),1==s){i||(i="ap"),i.indexOf("same")<0&&i.indexOf("a")<0&&(i+="a"),i.indexOf("p")<0&&(i+="p");let e=f.createGraph(a);f.fillGraph(e,i),n=p.TGraphPainter.draw(t,e,i)}else{i||(i="col");let e=f.createHisto(a);f.fillHisto(e,i),n=A.S.draw(t,e,i)}return n.then(()=>(f.addToPadPrimitives(),f.drawFunction(0)))})()}}}}]); -//# sourceMappingURL=696.b99abdfe255d4b8c.js.map \ No newline at end of file +"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[946],{8946:(D,y,o)=>{o.r(y),o.d(y,{TEfficiencyPainter:()=>E});var H=o(4788),l=o(9542),M=o(6458),p=o(8241),x=o(9428),A=o(7823),C=o(6976);const T=(0,l.BIT)(14),L=(0,l.BIT)(15),B=(0,l.BIT)(17),w=(0,l.BIT)(18),m=(c,t)=>c.fBeta_bin_params.length>t?c.fBeta_bin_params[t].first:c.fBeta_alpha,u=(c,t)=>c.fBeta_bin_params.length>t?c.fBeta_bin_params[t].second:c.fBeta_beta;class E extends M.tK{getEfficiency(t,a){let f=t.fTotalHistogram.fArray[a],n=t.fPassedHistogram.fArray[a];if(t.TestBit(T)){let _,h,e=t.TestBit(B)?m(t,a):t.fBeta_alpha,r=t.TestBit(B)?u(t,a):t.fBeta_beta;if(t.TestBit(w)){let g=f,P=t.fTotalHistogram.fSumw2?t.fTotalHistogram.fSumw2[a]:Math.abs(f);if(P<=0)return n/g;let O=g/P;_=n*O+e,h=(g-n)*O+r}else _=n+e,h=f-n+r;return t.TestBit(L)?((e,r)=>{if(e<=0||r<=0)return 0;if(e<=1||r<=1){if(er)return 1;if(e==r)return.5}return(e-1)/(e+r-2)})(_,h):((e,r)=>e<=0||r<=0?0:e/(e+r))(_,h)}return f?n/f:0}getEfficiencyErrorLow(t,a,i){let s=t.fTotalHistogram.fArray[a],f=t.fPassedHistogram.fArray[a],n=0,e=0;return t.TestBit(T)&&(n=t.TestBit(B)?m(t,a):t.fBeta_alpha,e=t.TestBit(B)?u(t,a):t.fBeta_beta),i-this.fBoundary(s,f,t.fConfLevel,!1,n,e)}getEfficiencyErrorUp(t,a,i){let s=t.fTotalHistogram.fArray[a],f=t.fPassedHistogram.fArray[a],n=0,e=0;return t.TestBit(T)&&(n=t.TestBit(B)?m(t,a):t.fBeta_alpha,e=t.TestBit(B)?u(t,a):t.fBeta_beta),this.fBoundary(s,f,t.fConfLevel,!0,n,e)-i}copyAttributes(t,a){["fLineColor","fLineStyle","fLineWidth","fFillColor","fFillStyle","fMarkerColor","fMarkerStyle","fMarkerSize"].forEach(i=>t[i]=a[i])}createGraph(){let t=(0,l.create)(p.clTGraphAsymmErrors);return t.fName="eff_graph",t}createHisto(t){const s=(0,l.createHistogram)("TH2F",t.fTotalHistogram.fXaxis.fNbins,t.fTotalHistogram.fYaxis.fNbins);return Object.assign(s.fXaxis,t.fTotalHistogram.fXaxis),Object.assign(s.fYaxis,t.fTotalHistogram.fYaxis),s.fName="eff_histo",s}fillGraph(t,a){const i=this.getObject(),s=i.fTotalHistogram.fXaxis,f=s.fNbins,n=a.indexOf("e0")>=0;for(let e=0,r=0;e=a.fFunctions.arr.length?this:x.TF1Painter.draw(this.getDom(),a.fFunctions.arr[t],a.fFunctions.opt[t]).then(()=>this.drawFunction(t+1))}static draw(t,a,i){return(0,H.Z)(function*(){if(!a||!a.fTotalHistogram)return null;(!i||!(0,l.isStr)(i))&&(i=""),i=i.toLowerCase();let s=0;if(0==a.fTotalHistogram._typename.indexOf(l.clTH1))s=1;else{if(0!=a.fTotalHistogram._typename.indexOf(l.clTH2))return null;s=2}let n,f=new E(t,a);if(f.ndim=s,f.fBoundary=(0,C.getTEfficiencyBoundaryFunc)(a.fStatisticOption,a.TestBit(T)),1==s){i||(i="ap"),i.indexOf("same")<0&&i.indexOf("a")<0&&(i+="a"),i.indexOf("p")<0&&(i+="p");let e=f.createGraph(a);f.fillGraph(e,i),n=p.TGraphPainter.draw(t,e,i)}else{i||(i="col");let e=f.createHisto(a);f.fillHisto(e,i),n=A.S.draw(t,e,i)}return n.then(()=>(f.addToPadPrimitives(),f.drawFunction(0)))})()}}}}]); +//# sourceMappingURL=946.e9493c0284811601.js.map \ No newline at end of file diff --git a/docs/696.b99abdfe255d4b8c.js.map b/docs/946.e9493c0284811601.js.map similarity index 99% rename from docs/696.b99abdfe255d4b8c.js.map rename to docs/946.e9493c0284811601.js.map index 15646e3b8..2e31b3107 100644 --- a/docs/696.b99abdfe255d4b8c.js.map +++ b/docs/946.e9493c0284811601.js.map @@ -1 +1 @@ -{"version":3,"file":"696.b99abdfe255d4b8c.js","mappings":"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","names":["kIsBayesian","BIT","kPosteriorMode","kUseBinPrior","kUseWeights","getBetaAlpha","obj","bin","fBeta_bin_params","length","first","fBeta_alpha","getBetaBeta","second","fBeta_beta","TEfficiencyPainter","ObjectPainter","getEfficiency","total","fTotalHistogram","fArray","passed","fPassedHistogram","TestBit","aa","bb","alpha","beta","tw","tw2","fSumw2","Math","abs","norm","a","b","BetaMode","BetaMean","getEfficiencyErrorLow","value","this","fBoundary","fConfLevel","getEfficiencyErrorUp","copyAttributes","eff","forEach","name","createGraph","gr","create","clTGraphAsymmErrors","fName","createHisto","hist","createHistogram","fXaxis","fNbins","fYaxis","Object","assign","fillGraph","opt","getObject","xaxis","npoints","plot0Bins","indexOf","n","j","getBinContent","fX","GetBinCenter","fY","fEXlow","GetBinLowEdge","fEXhigh","fEYlow","fEYhigh","fNpoints","fTitle","fillHisto","nbinsx","nbinsy","kNoStats","i","getBin","fBits","drawFunction","indx","fFunctions","arr","TF1Painter","getDom","then","static","dom","isStr","toLowerCase","ndim","_typename","clTH1","clTH2","promise","painter","getTEfficiencyBoundaryFunc","fStatisticOption","TGraphPainter","TH2Painter","addToPadPrimitives"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/hist/TEfficiencyPainter.mjs"],"sourcesContent":["import { BIT, create, createHistogram, isStr, clTH1, clTH2 } from '../core.mjs';\nimport { ObjectPainter } from '../base/ObjectPainter.mjs';\nimport { TGraphPainter, clTGraphAsymmErrors } from '../hist2d/TGraphPainter.mjs';\nimport { TF1Painter } from '../hist/TF1Painter.mjs';\nimport { TH2Painter } from '../hist2d/TH2Painter.mjs';\nimport { getTEfficiencyBoundaryFunc } from '../base/math.mjs';\n\n\nconst kIsBayesian = BIT(14), ///< Bayesian statistics are used\n kPosteriorMode = BIT(15), ///< Use posterior mean for best estimate (Bayesian statistics)\n // kShortestInterval = BIT(16), ///< Use shortest interval, not implemented - too complicated\n kUseBinPrior = BIT(17), ///< Use a different prior for each bin\n kUseWeights = BIT(18), ///< Use weights\n getBetaAlpha = (obj,bin) => (obj.fBeta_bin_params.length > bin) ? obj.fBeta_bin_params[bin].first : obj.fBeta_alpha,\n getBetaBeta = (obj,bin) => (obj.fBeta_bin_params.length > bin) ? obj.fBeta_bin_params[bin].second : obj.fBeta_beta;\n\n/**\n * @summary Painter for TEfficiency object\n *\n * @private\n */\n\nclass TEfficiencyPainter extends ObjectPainter {\n\n /** @summary Caluclate efficiency */\n getEfficiency(obj, bin) {\n\n const BetaMean = (a,b) => (a <= 0 || b <= 0 ) ? 0 : a / (a + b),\n BetaMode = (a,b) => {\n if (a <= 0 || b <= 0 ) return 0;\n if ( a <= 1 || b <= 1) {\n if (a < b) return 0;\n if (a > b) return 1;\n if (a == b) return 0.5; // cannot do otherwise\n }\n return (a - 1.0) / (a + b -2.0);\n };\n\n let total = obj.fTotalHistogram.fArray[bin], // should work for both 1-d and 2-d\n passed = obj.fPassedHistogram.fArray[bin]; // should work for both 1-d and 2-d\n\n if(obj.TestBit(kIsBayesian)) {\n // parameters for the beta prior distribution\n let alpha = obj.TestBit(kUseBinPrior) ? getBetaAlpha(obj, bin) : obj.fBeta_alpha,\n beta = obj.TestBit(kUseBinPrior) ? getBetaBeta(obj, bin) : obj.fBeta_beta;\n\n let aa,bb;\n if(obj.TestBit(kUseWeights)) {\n let tw = total, // fTotalHistogram->GetBinContent(bin);\n tw2 = obj.fTotalHistogram.fSumw2 ? obj.fTotalHistogram.fSumw2[bin] : Math.abs(total),\n pw = passed; // fPassedHistogram->GetBinContent(bin);\n\n if (tw2 <= 0 ) return pw/tw;\n\n // tw/tw2 renormalize the weights\n let norm = tw/tw2;\n aa = pw * norm + alpha;\n bb = (tw - pw) * norm + beta;\n } else {\n aa = passed + alpha;\n bb = total - passed + beta;\n }\n\n if (!obj.TestBit(kPosteriorMode) )\n return BetaMean(aa,bb);\n else\n return BetaMode(aa,bb);\n }\n\n return total ? passed/total : 0;\n }\n\n /** @summary Caluclate efficiency error low */\n getEfficiencyErrorLow(obj, bin, value) {\n let total = obj.fTotalHistogram.fArray[bin],\n passed = obj.fPassedHistogram.fArray[bin],\n alpha = 0, beta = 0;\n if (obj.TestBit(kIsBayesian)) {\n alpha = obj.TestBit(kUseBinPrior) ? getBetaAlpha(obj, bin) : obj.fBeta_alpha;\n beta = obj.TestBit(kUseBinPrior) ? getBetaBeta(obj, bin) : obj.fBeta_beta;\n }\n\n return value - this.fBoundary(total, passed, obj.fConfLevel, false, alpha, beta);\n }\n\n /** @summary Caluclate efficiency error low up */\n getEfficiencyErrorUp(obj, bin, value) {\n let total = obj.fTotalHistogram.fArray[bin],\n passed = obj.fPassedHistogram.fArray[bin],\n alpha = 0, beta = 0;\n if (obj.TestBit(kIsBayesian)) {\n alpha = obj.TestBit(kUseBinPrior) ? getBetaAlpha(obj, bin) : obj.fBeta_alpha;\n beta = obj.TestBit(kUseBinPrior) ? getBetaBeta(obj, bin) : obj.fBeta_beta;\n }\n\n return this.fBoundary(total, passed, obj.fConfLevel, true, alpha, beta) - value;\n }\n\n /** @summary Copy drawning attributes */\n copyAttributes(obj, eff) {\n ['fLineColor', 'fLineStyle', 'fLineWidth', 'fFillColor', 'fFillStyle', 'fMarkerColor', 'fMarkerStyle', 'fMarkerSize'].forEach(name => obj[name] = eff[name]);\n }\n\n /** @summary Create graph for the drawing of 1-dim TEfficiency */\n createGraph(/*eff*/) {\n let gr = create(clTGraphAsymmErrors);\n gr.fName = 'eff_graph';\n return gr;\n }\n\n /** @summary Create histogram for the drawing of 2-dim TEfficiency */\n createHisto(eff) {\n const nbinsx = eff.fTotalHistogram.fXaxis.fNbins,\n nbinsy = eff.fTotalHistogram.fYaxis.fNbins,\n hist = createHistogram('TH2F', nbinsx, nbinsy);\n Object.assign(hist.fXaxis, eff.fTotalHistogram.fXaxis);\n Object.assign(hist.fYaxis, eff.fTotalHistogram.fYaxis);\n hist.fName = 'eff_histo';\n return hist;\n }\n\n /** @summary Fill graph with points from efficiency object */\n fillGraph(gr, opt) {\n const eff = this.getObject(),\n xaxis = eff.fTotalHistogram.fXaxis,\n npoints = xaxis.fNbins,\n plot0Bins = (opt.indexOf('e0') >= 0);\n\n for (let n = 0, j = 0; n < npoints; ++n) {\n if (!plot0Bins && eff.fTotalHistogram.getBinContent(n+1) === 0) continue;\n\n let value = this.getEfficiency(eff, n+1);\n\n gr.fX[j] = xaxis.GetBinCenter(n+1);\n gr.fY[j] = value;\n gr.fEXlow[j] = xaxis.GetBinCenter(n+1) - xaxis.GetBinLowEdge(n+1);\n gr.fEXhigh[j] = xaxis.GetBinLowEdge(n+2) - xaxis.GetBinCenter(n+1);\n gr.fEYlow[j] = this.getEfficiencyErrorLow(eff, n+1, value);\n gr.fEYhigh[j] = this.getEfficiencyErrorUp(eff, n+1, value);\n\n gr.fNpoints = ++j;\n }\n\n gr.fTitle = eff.fTitle;\n this.copyAttributes(gr, eff);\n }\n\n /** @summary Fill graph with points from efficiency object */\n fillHisto(hist) {\n const eff = this.getObject(),\n nbinsx = hist.fXaxis.fNbins,\n nbinsy = hist.fYaxis.fNbins,\n kNoStats = BIT(9);\n\n for (let i = 0; i < nbinsx+2; ++i)\n for (let j = 0; j < nbinsy+2; ++j) {\n let bin = hist.getBin(i, j),\n value = this.getEfficiency(eff, bin);\n hist.fArray[bin] = value;\n }\n\n hist.fTitle = eff.fTitle;\n hist.fBits = hist.fBits | kNoStats;\n this.copyAttributes(hist, eff);\n }\n\n /** @summary Draw function */\n drawFunction(indx) {\n const eff = this.getObject();\n\n if (!eff || !eff.fFunctions || indx >= eff.fFunctions.arr.length)\n return this;\n\n return TF1Painter.draw(this.getDom(), eff.fFunctions.arr[indx], eff.fFunctions.opt[indx]).then(() => this.drawFunction(indx+1));\n }\n\n /** @summary Draw TEfficiency object */\n static async draw(dom, eff, opt) {\n if (!eff || !eff.fTotalHistogram)\n return null;\n\n if (!opt || !isStr(opt)) opt = '';\n opt = opt.toLowerCase();\n\n let ndim = 0;\n if (eff.fTotalHistogram._typename.indexOf(clTH1) == 0)\n ndim = 1;\n else if (eff.fTotalHistogram._typename.indexOf(clTH2) == 0)\n ndim = 2;\n else\n return null;\n\n let painter = new TEfficiencyPainter(dom, eff);\n painter.ndim = ndim;\n\n painter.fBoundary = getTEfficiencyBoundaryFunc(eff.fStatisticOption, eff.TestBit(kIsBayesian));\n\n let promise;\n\n if (ndim == 1) {\n if (!opt) opt = 'ap';\n if ((opt.indexOf('same') < 0) && (opt.indexOf('a') < 0)) opt += 'a';\n if (opt.indexOf('p') < 0) opt += 'p';\n\n let gr = painter.createGraph(eff);\n painter.fillGraph(gr, opt);\n promise = TGraphPainter.draw(dom, gr, opt);\n } else {\n if (!opt) opt = 'col';\n let hist = painter.createHisto(eff);\n painter.fillHisto(hist, opt);\n promise = TH2Painter.draw(dom, hist, opt);\n }\n\n return promise.then(() => {\n painter.addToPadPrimitives();\n return painter.drawFunction(0);\n });\n }\n\n} // class TEfficiencyPainter\n\nexport { TEfficiencyPainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file +{"version":3,"file":"946.e9493c0284811601.js","mappings":"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","names":["kIsBayesian","BIT","kPosteriorMode","kUseBinPrior","kUseWeights","getBetaAlpha","obj","bin","fBeta_bin_params","length","first","fBeta_alpha","getBetaBeta","second","fBeta_beta","TEfficiencyPainter","ObjectPainter","getEfficiency","total","fTotalHistogram","fArray","passed","fPassedHistogram","TestBit","aa","bb","alpha","beta","tw","tw2","fSumw2","Math","abs","norm","a","b","BetaMode","BetaMean","getEfficiencyErrorLow","value","this","fBoundary","fConfLevel","getEfficiencyErrorUp","copyAttributes","eff","forEach","name","createGraph","gr","create","clTGraphAsymmErrors","fName","createHisto","hist","createHistogram","fXaxis","fNbins","fYaxis","Object","assign","fillGraph","opt","getObject","xaxis","npoints","plot0Bins","indexOf","n","j","getBinContent","fX","GetBinCenter","fY","fEXlow","GetBinLowEdge","fEXhigh","fEYlow","fEYhigh","fNpoints","fTitle","fillHisto","nbinsx","nbinsy","kNoStats","i","getBin","fBits","drawFunction","indx","fFunctions","arr","TF1Painter","getDom","then","static","dom","isStr","toLowerCase","ndim","_typename","clTH1","clTH2","promise","painter","getTEfficiencyBoundaryFunc","fStatisticOption","TGraphPainter","TH2Painter","addToPadPrimitives"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/hist/TEfficiencyPainter.mjs"],"sourcesContent":["import { BIT, create, createHistogram, isStr, clTH1, clTH2 } from '../core.mjs';\nimport { ObjectPainter } from '../base/ObjectPainter.mjs';\nimport { TGraphPainter, clTGraphAsymmErrors } from '../hist2d/TGraphPainter.mjs';\nimport { TF1Painter } from '../hist/TF1Painter.mjs';\nimport { TH2Painter } from '../hist2d/TH2Painter.mjs';\nimport { getTEfficiencyBoundaryFunc } from '../base/math.mjs';\n\n\nconst kIsBayesian = BIT(14), ///< Bayesian statistics are used\n kPosteriorMode = BIT(15), ///< Use posterior mean for best estimate (Bayesian statistics)\n // kShortestInterval = BIT(16), ///< Use shortest interval, not implemented - too complicated\n kUseBinPrior = BIT(17), ///< Use a different prior for each bin\n kUseWeights = BIT(18), ///< Use weights\n getBetaAlpha = (obj,bin) => (obj.fBeta_bin_params.length > bin) ? obj.fBeta_bin_params[bin].first : obj.fBeta_alpha,\n getBetaBeta = (obj,bin) => (obj.fBeta_bin_params.length > bin) ? obj.fBeta_bin_params[bin].second : obj.fBeta_beta;\n\n/**\n * @summary Painter for TEfficiency object\n *\n * @private\n */\n\nclass TEfficiencyPainter extends ObjectPainter {\n\n /** @summary Caluclate efficiency */\n getEfficiency(obj, bin) {\n\n const BetaMean = (a,b) => (a <= 0 || b <= 0 ) ? 0 : a / (a + b),\n BetaMode = (a,b) => {\n if (a <= 0 || b <= 0 ) return 0;\n if ( a <= 1 || b <= 1) {\n if (a < b) return 0;\n if (a > b) return 1;\n if (a == b) return 0.5; // cannot do otherwise\n }\n return (a - 1.0) / (a + b -2.0);\n };\n\n let total = obj.fTotalHistogram.fArray[bin], // should work for both 1-d and 2-d\n passed = obj.fPassedHistogram.fArray[bin]; // should work for both 1-d and 2-d\n\n if(obj.TestBit(kIsBayesian)) {\n // parameters for the beta prior distribution\n let alpha = obj.TestBit(kUseBinPrior) ? getBetaAlpha(obj, bin) : obj.fBeta_alpha,\n beta = obj.TestBit(kUseBinPrior) ? getBetaBeta(obj, bin) : obj.fBeta_beta;\n\n let aa,bb;\n if(obj.TestBit(kUseWeights)) {\n let tw = total, // fTotalHistogram->GetBinContent(bin);\n tw2 = obj.fTotalHistogram.fSumw2 ? obj.fTotalHistogram.fSumw2[bin] : Math.abs(total),\n pw = passed; // fPassedHistogram->GetBinContent(bin);\n\n if (tw2 <= 0 ) return pw/tw;\n\n // tw/tw2 renormalize the weights\n let norm = tw/tw2;\n aa = pw * norm + alpha;\n bb = (tw - pw) * norm + beta;\n } else {\n aa = passed + alpha;\n bb = total - passed + beta;\n }\n\n if (!obj.TestBit(kPosteriorMode) )\n return BetaMean(aa,bb);\n else\n return BetaMode(aa,bb);\n }\n\n return total ? passed/total : 0;\n }\n\n /** @summary Caluclate efficiency error low */\n getEfficiencyErrorLow(obj, bin, value) {\n let total = obj.fTotalHistogram.fArray[bin],\n passed = obj.fPassedHistogram.fArray[bin],\n alpha = 0, beta = 0;\n if (obj.TestBit(kIsBayesian)) {\n alpha = obj.TestBit(kUseBinPrior) ? getBetaAlpha(obj, bin) : obj.fBeta_alpha;\n beta = obj.TestBit(kUseBinPrior) ? getBetaBeta(obj, bin) : obj.fBeta_beta;\n }\n\n return value - this.fBoundary(total, passed, obj.fConfLevel, false, alpha, beta);\n }\n\n /** @summary Caluclate efficiency error low up */\n getEfficiencyErrorUp(obj, bin, value) {\n let total = obj.fTotalHistogram.fArray[bin],\n passed = obj.fPassedHistogram.fArray[bin],\n alpha = 0, beta = 0;\n if (obj.TestBit(kIsBayesian)) {\n alpha = obj.TestBit(kUseBinPrior) ? getBetaAlpha(obj, bin) : obj.fBeta_alpha;\n beta = obj.TestBit(kUseBinPrior) ? getBetaBeta(obj, bin) : obj.fBeta_beta;\n }\n\n return this.fBoundary(total, passed, obj.fConfLevel, true, alpha, beta) - value;\n }\n\n /** @summary Copy drawning attributes */\n copyAttributes(obj, eff) {\n ['fLineColor', 'fLineStyle', 'fLineWidth', 'fFillColor', 'fFillStyle', 'fMarkerColor', 'fMarkerStyle', 'fMarkerSize'].forEach(name => obj[name] = eff[name]);\n }\n\n /** @summary Create graph for the drawing of 1-dim TEfficiency */\n createGraph(/*eff*/) {\n let gr = create(clTGraphAsymmErrors);\n gr.fName = 'eff_graph';\n return gr;\n }\n\n /** @summary Create histogram for the drawing of 2-dim TEfficiency */\n createHisto(eff) {\n const nbinsx = eff.fTotalHistogram.fXaxis.fNbins,\n nbinsy = eff.fTotalHistogram.fYaxis.fNbins,\n hist = createHistogram('TH2F', nbinsx, nbinsy);\n Object.assign(hist.fXaxis, eff.fTotalHistogram.fXaxis);\n Object.assign(hist.fYaxis, eff.fTotalHistogram.fYaxis);\n hist.fName = 'eff_histo';\n return hist;\n }\n\n /** @summary Fill graph with points from efficiency object */\n fillGraph(gr, opt) {\n const eff = this.getObject(),\n xaxis = eff.fTotalHistogram.fXaxis,\n npoints = xaxis.fNbins,\n plot0Bins = (opt.indexOf('e0') >= 0);\n\n for (let n = 0, j = 0; n < npoints; ++n) {\n if (!plot0Bins && eff.fTotalHistogram.getBinContent(n+1) === 0) continue;\n\n let value = this.getEfficiency(eff, n+1);\n\n gr.fX[j] = xaxis.GetBinCenter(n+1);\n gr.fY[j] = value;\n gr.fEXlow[j] = xaxis.GetBinCenter(n+1) - xaxis.GetBinLowEdge(n+1);\n gr.fEXhigh[j] = xaxis.GetBinLowEdge(n+2) - xaxis.GetBinCenter(n+1);\n gr.fEYlow[j] = this.getEfficiencyErrorLow(eff, n+1, value);\n gr.fEYhigh[j] = this.getEfficiencyErrorUp(eff, n+1, value);\n\n gr.fNpoints = ++j;\n }\n\n gr.fTitle = eff.fTitle;\n this.copyAttributes(gr, eff);\n }\n\n /** @summary Fill graph with points from efficiency object */\n fillHisto(hist) {\n const eff = this.getObject(),\n nbinsx = hist.fXaxis.fNbins,\n nbinsy = hist.fYaxis.fNbins,\n kNoStats = BIT(9);\n\n for (let i = 0; i < nbinsx+2; ++i)\n for (let j = 0; j < nbinsy+2; ++j) {\n let bin = hist.getBin(i, j),\n value = this.getEfficiency(eff, bin);\n hist.fArray[bin] = value;\n }\n\n hist.fTitle = eff.fTitle;\n hist.fBits = hist.fBits | kNoStats;\n this.copyAttributes(hist, eff);\n }\n\n /** @summary Draw function */\n drawFunction(indx) {\n const eff = this.getObject();\n\n if (!eff || !eff.fFunctions || indx >= eff.fFunctions.arr.length)\n return this;\n\n return TF1Painter.draw(this.getDom(), eff.fFunctions.arr[indx], eff.fFunctions.opt[indx]).then(() => this.drawFunction(indx+1));\n }\n\n /** @summary Draw TEfficiency object */\n static async draw(dom, eff, opt) {\n if (!eff || !eff.fTotalHistogram)\n return null;\n\n if (!opt || !isStr(opt)) opt = '';\n opt = opt.toLowerCase();\n\n let ndim = 0;\n if (eff.fTotalHistogram._typename.indexOf(clTH1) == 0)\n ndim = 1;\n else if (eff.fTotalHistogram._typename.indexOf(clTH2) == 0)\n ndim = 2;\n else\n return null;\n\n let painter = new TEfficiencyPainter(dom, eff);\n painter.ndim = ndim;\n\n painter.fBoundary = getTEfficiencyBoundaryFunc(eff.fStatisticOption, eff.TestBit(kIsBayesian));\n\n let promise;\n\n if (ndim == 1) {\n if (!opt) opt = 'ap';\n if ((opt.indexOf('same') < 0) && (opt.indexOf('a') < 0)) opt += 'a';\n if (opt.indexOf('p') < 0) opt += 'p';\n\n let gr = painter.createGraph(eff);\n painter.fillGraph(gr, opt);\n promise = TGraphPainter.draw(dom, gr, opt);\n } else {\n if (!opt) opt = 'col';\n let hist = painter.createHisto(eff);\n painter.fillHisto(hist, opt);\n promise = TH2Painter.draw(dom, hist, opt);\n }\n\n return promise.then(() => {\n painter.addToPadPrimitives();\n return painter.drawFunction(0);\n });\n }\n\n} // class TEfficiencyPainter\n\nexport { TEfficiencyPainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file diff --git a/docs/969.4da6fba206d57e9b.js b/docs/969.4da6fba206d57e9b.js deleted file mode 100644 index cfd518115..000000000 --- a/docs/969.4da6fba206d57e9b.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[969],{7562:(L,X,c)=>{c.r(X),c.d(X,{THStackPainter:()=>M});var E=c(5368),h=c(1773),v=c(5611),H=c(2454),A=c(7320),N=c(5759),D=c(1518);class M extends H.tK{constructor(r,i,s){super(r,i,s),this.firstpainter=null,this.painters=[]}cleanup(){this.getPadPainter()?.cleanPrimitives(r=>r===this.firstpainter||this.painters.indexOf(r)>=0),delete this.firstpainter,delete this.painters,super.cleanup()}buildStack(r){if(!r.fHists)return!1;let i=r.fHists.arr.length;if(i<=0)return!1;let s=(0,h.create)(h.clTList);s.Add((0,h.clone)(r.fHists.arr[0]),r.fHists.opt[0]);for(let e=1;e{let d={min:0,max:0},P=!0,O=!0;if(o.fMinimum!==h.kNoZoom&&(d.min=o.fMinimum,P=!1),o.fMaximum!==h.kNoZoom&&(d.max=o.fMaximum,O=!1),!P&&!O)return d;let S=1,C=o.fXaxis.fNbins,w=1,k=1,T=!0;o.fXaxis.TestBit(H.VO.kAxisRange)&&(S=o.fXaxis.fFirst,C=o.fXaxis.fLast),0===o._typename.indexOf(h.clTH2)&&(k=o.fYaxis.fNbins,o.fYaxis.TestBit(H.VO.kAxisRange)&&(w=o.fYaxis.fFirst,k=o.fYaxis.fLast));for(let u=w;u<=k;++u)for(let x=S;x<=C;++x){let _=o.getBinContent(x,u),g=p?o.getBinError(o.getBin(x,u)):0;P&&(T||_-gd.max)&&(d.max=_+g),T=!1}return d};if(this.options.nostack)for(let o=0;o{if(t&&(1==this.options.ndim?t.fLogy:t.fLogz)){s<=0&&(s=1),i<=0&&(i=1e-4*s);let o=1/(1+.5*Math.log10(s/i)),p=1+.2*Math.log10(s/i);i*=o,s*=p}else i>0&&i<.05*s&&(i=0)};s*=1+h.gStyle.fHistTopMargin,a();let f=s,l=i,m=!1;return e.fMaximum!=h.kNoZoom&&(s=e.fMaximum*(1+h.gStyle.fHistTopMargin),f=Math.max(s,f),m=!0),e.fMinimum!=h.kNoZoom&&(i=e.fMinimum,l=Math.min(i,l),m=!0),m?a():i=s=h.kNoZoom,{min:i,max:s,min0:l,max0:f,zoomed:m,hopt:`hmin:${l};hmax:${f};minimum:${i};maximum:${s}`}}drawNextHisto(r,i){var s=this;return(0,E.Z)(function*(){let e=s.getObject(),t=s.options.nostack?e.fHists:e.fStack,n=t?.arr?.length||0;if(r>=n)return s;let a=s.options.horder?r:n-r-1,f=t.arr[a],l=t.opt[a]||f.fOption||s.options.hopt;if(l.toUpperCase().indexOf(s.options.hopt)<0&&(l+=" "+s.options.hopt),s.options.draw_errors&&!l&&(l="E"),s.options._pfc||s.options._plc||s.options._pmc){let m=s.getMainPainter();if((0,h.isFunc)(m?.createAutoColor)){let o=m.createAutoColor(n);s.options._pfc&&(f.fFillColor=o),s.options._plc&&(f.fLineColor=o),s.options._pmc&&(f.fMarkerColor=o)}}if(i){let m=i.getSubPadPainter(r+1);if(!m)return s;let o=m.selectCurrentPad(m.this_pad_name);return s.hdraw_func(m.getDom(),f,l).then(p=>(s.painters.push(p),m.selectCurrentPad(o),s.drawNextHisto(r+1,i)))}return a>0&&!s.options.nostack&&(f.$baseh=t.arr[a-1]),s.hdraw_func(s.getDom(),f,l+" same nostat").then(m=>(s.painters.push(m),s.drawNextHisto(r+1,i)))})()}decodeOptions(r){this.options||(this.options={}),Object.assign(this.options,{ndim:1,nostack:!1,same:!1,horder:!0,has_errors:!1,draw_errors:!1,hopt:""});let i=this.getObject(),s=i.fHistogram||(i.fHists?i.fHists.arr[0]:null)||(i.fStack?i.fStack.arr[0]:null);const e=a=>{if(a.fSumw2&&a.fSumw2.length>0)for(let f=0;f0)return!0;return!1};if(s&&0==s._typename.indexOf(h.clTH2)&&(this.options.ndim=2),2==this.options.ndim&&!r&&(r="lego1"),i.fHists&&!this.options.nostack)for(let a=0;athis.painters.indexOf(t)>=0),this.painters=[],this.did_update=!0;else for(let t=0;t{if(e.decodeOptions(s),e.hdraw_func=1==e.options.ndim?A.TH1Painter.draw:N.TH2Painter.draw,e.options.pads)return t=e.getPadPainter(),t.doingDraw()&&t.pad?.fPrimitives&&t.pad.fPrimitives.arr.length>1&&0==t.pad.fPrimitives.arr.indexOf(i)?(n=!0,void console.log("special case with THStack with is already rendered - do nothing")):(t.cleanPrimitives(m=>m!==e),t.divide(e.options.nhist));if(e.options.nostack||(e.options.nostack=!e.buildStack(i)),e.options.same)return;let a=!i.fHistogram;a&&(i.fHistogram=e.createHistogram(i));let f=e.getMinMax(e.options.errors||e.options.draw_errors);return e.hdraw_func(r,i.fHistogram,e.options.hopt+";axis;"+f.hopt).then(m=>{e.addToPadPrimitives(),e.firstpainter=m,m.$secondary="hist",a||(e.$primary=!0)})}).then(()=>n?e:e.drawNextHisto(0,t))})()}}}}]); -//# sourceMappingURL=969.4da6fba206d57e9b.js.map \ No newline at end of file diff --git a/docs/99.0ba42481a501907f.js b/docs/99.0ba42481a501907f.js new file mode 100644 index 000000000..ce75455a6 --- /dev/null +++ b/docs/99.0ba42481a501907f.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkphoenix_app=self.webpackChunkphoenix_app||[]).push([[99],{5099:(_,r,a)=>{a.r(r),a.d(r,{TArrowPainter:()=>d});var x=a(4788),f=a(9542),g=a(6458),M=a(49),c=a(9622);class d extends g.tK{rotate(t,s,i){let h=this.wsize*Math.cos(t),e=this.wsize*Math.sin(t),n="";return void 0!==s&&void 0!==i?n=`M${Math.round(s-h)},${Math.round(i-e)}`:(h=-h,e=-e),n+=`l${Math.round(h)},${Math.round(e)}`,s&&void 0===i&&(n+="z"),n}createPath(){let t=Math.atan2(this.y2-this.y1,this.x2-this.x1),s=this.wsize*Math.cos(this.angle2),i=s*Math.cos(t),h=s*Math.sin(t),e="";return this.beg&&(e+=this.rotate(t-Math.PI-this.angle2,this.x1,this.y1)+this.rotate(t-Math.PI+this.angle2,this.beg>10)),this.mid%10==2&&(e+=this.rotate(t-Math.PI-this.angle2,(this.x1+this.x2-i)/2,(this.y1+this.y2-h)/2)+this.rotate(t-Math.PI+this.angle2,this.mid>10)),this.mid%10==1&&(e+=this.rotate(t-this.angle2,(this.x1+this.x2+i)/2,(this.y1+this.y2+h)/2)+this.rotate(t+this.angle2,this.mid>10)),this.end&&(e+=this.rotate(t-this.angle2,this.x2,this.y2)+this.rotate(t+this.angle2,this.end>10)),`M${Math.round(this.x1+(this.beg>10?i:0))},${Math.round(this.y1+(this.beg>10?h:0))}L${Math.round(this.x2-(this.end>10?i:0))},${Math.round(this.y2-(this.end>10?h:0))}`+e}moveStart(t,s){let i=Math.sqrt((this.x1-this.x2)**2+(this.y1-this.y2)**2),h=Math.sqrt((t-this.x1)**2+(s-this.y1)**2)/i,e=Math.sqrt((t-this.x2)**2+(s-this.y2)**2)/i;this.side=h>.9?1:e>.9?-1:0}moveDrag(t,s){1!=this.side&&(this.x1+=t,this.y1+=s),-1!=this.side&&(this.x2+=t,this.y2+=s),this.draw_g.select("path").attr("d",this.createPath())}moveEnd(t){if(t)return;let s=this.getObject(),i="";s.fX1=this.svgToAxis("x",this.x1,this.isndc),s.fX2=this.svgToAxis("x",this.x2,this.isndc),s.fY1=this.svgToAxis("y",this.y1,this.isndc),s.fY2=this.svgToAxis("y",this.y2,this.isndc),1!=this.side&&(i+=`SetX1(${s.fX1});;SetY1(${s.fY1});;`),-1!=this.side&&(i+=`SetX2(${s.fX2});;SetY2(${s.fY2});;`),this.submitCanvExec(i+"Notify();;")}redraw(){let t=this.getObject(),s=(0,f.BIT)(14),i=t.fOption,h=this.getPadPainter().getPadRect();this.wsize=Math.max(3,Math.round(Math.max(h.width,h.height)*t.fArrowSize*.8)),this.isndc=t.TestBit(s),this.angle2=t.fAngle/2/180*Math.PI,this.beg=this.mid=this.end=0,0==i.indexOf("<")&&(this.beg=0==i.indexOf("<|")?12:2),i.indexOf("->-")>=0?this.mid=1:i.indexOf("-|>-")>=0?this.mid=11:i.indexOf("-<-")>=0?this.mid=2:i.indexOf("-<|-")>=0&&(this.mid=12);let e=i.lastIndexOf(">"),n=i.lastIndexOf("|>"),l=i.length;e>=0&&e==l-1&&(this.end=n>=0&&n==l-2?11:1),this.createAttLine({attr:t}),this.createG(),this.x1=this.axisToSvg("x",t.fX1,this.isndc,!0),this.y1=this.axisToSvg("y",t.fY1,this.isndc,!0),this.x2=this.axisToSvg("x",t.fX2,this.isndc,!0),this.y2=this.axisToSvg("y",t.fY2,this.isndc,!0);let o=this.draw_g.append("svg:path").attr("d",this.createPath()).call(this.lineatt.func);return this.beg>10||this.end>10?(this.createAttFill({attr:t}),o.call(this.fillatt.func)):o.style("fill","none"),(0,f.isBatchMode)()||(0,c.Z)(this),this}static draw(t,s,i){return(0,x.Z)(function*(){let h=new d(t,s,i);return(0,M.ensureTCanvas)(h,!1).then(()=>h.redraw())})()}}}}]); +//# sourceMappingURL=99.0ba42481a501907f.js.map \ No newline at end of file diff --git a/docs/99.0ba42481a501907f.js.map b/docs/99.0ba42481a501907f.js.map new file mode 100644 index 000000000..a5bd5a9ae --- /dev/null +++ b/docs/99.0ba42481a501907f.js.map @@ -0,0 +1 @@ +{"version":3,"file":"99.0ba42481a501907f.js","mappings":"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","names":["TArrowPainter","ObjectPainter","rotate","angle","x0","y0","dx","this","wsize","Math","cos","dy","sin","res","undefined","round","createPath","atan2","y2","y1","x2","x1","dlen","angle2","path","beg","PI","mid","end","moveStart","x","y","fullsize","sqrt","sz1","sz2","side","moveDrag","draw_g","select","attr","moveEnd","not_changed","arrow","getObject","exec","fX1","svgToAxis","isndc","fX2","fY1","fY2","submitCanvExec","redraw","kLineNDC","BIT","oo","fOption","rect","getPadPainter","getPadRect","max","width","height","fArrowSize","TestBit","fAngle","indexOf","p1","lastIndexOf","p2","len","length","createAttLine","createG","axisToSvg","elem","append","call","lineatt","func","createAttFill","fillatt","style","isBatchMode","addMoveHandler","static","dom","obj","opt","painter","ensureTCanvas","then"],"sourceRoot":"webpack:///","sources":["../node_modules/jsroot/modules/draw/TArrowPainter.mjs"],"sourcesContent":["import { BIT, isBatchMode } from '../core.mjs';\nimport { ObjectPainter } from '../base/ObjectPainter.mjs';\nimport { ensureTCanvas } from '../gpad/TCanvasPainter.mjs';\nimport { addMoveHandler } from '../gui/utils.mjs';\n\n\n/** @summary Drawing TArrow\n * @private */\nclass TArrowPainter extends ObjectPainter {\n\n /** @summary Create line segment with rotation */\n rotate(angle, x0, y0) {\n let dx = this.wsize * Math.cos(angle), dy = this.wsize * Math.sin(angle), res = '';\n if ((x0 !== undefined) && (y0 !== undefined)) {\n res = `M${Math.round(x0-dx)},${Math.round(y0-dy)}`;\n } else {\n dx = -dx; dy = -dy;\n }\n res += `l${Math.round(dx)},${Math.round(dy)}`;\n if (x0 && (y0 === undefined)) res += 'z';\n return res;\n }\n\n /** @summary Create SVG path for the arrow */\n createPath() {\n let angle = Math.atan2(this.y2 - this.y1, this.x2 - this.x1),\n dlen = this.wsize * Math.cos(this.angle2),\n dx = dlen*Math.cos(angle), dy = dlen*Math.sin(angle),\n path = '';\n\n if (this.beg)\n path += this.rotate(angle - Math.PI - this.angle2, this.x1, this.y1) +\n this.rotate(angle - Math.PI + this.angle2, this.beg > 10);\n\n if (this.mid % 10 == 2)\n path += this.rotate(angle - Math.PI - this.angle2, (this.x1+this.x2-dx)/2, (this.y1+this.y2-dy)/2) +\n this.rotate(angle - Math.PI + this.angle2, this.mid > 10);\n\n if (this.mid % 10 == 1)\n path += this.rotate(angle - this.angle2, (this.x1+this.x2+dx)/2, (this.y1+this.y2+dy)/2) +\n this.rotate(angle + this.angle2, this.mid > 10);\n\n if (this.end)\n path += this.rotate(angle - this.angle2, this.x2, this.y2) +\n this.rotate(angle + this.angle2, this.end > 10);\n\n return `M${Math.round(this.x1 + (this.beg > 10 ? dx : 0))},${Math.round(this.y1 + (this.beg > 10 ? dy : 0))}` +\n `L${Math.round(this.x2 - (this.end > 10 ? dx : 0))},${Math.round(this.y2 - (this.end > 10 ? dy : 0))}` +\n path;\n }\n\n /** @summary Start interactive moving */\n moveStart(x,y) {\n let fullsize = Math.sqrt((this.x1-this.x2)**2 + (this.y1-this.y2)**2),\n sz1 = Math.sqrt((x-this.x1)**2 + (y-this.y1)**2)/fullsize,\n sz2 = Math.sqrt((x-this.x2)**2 + (y-this.y2)**2)/fullsize;\n if (sz1 > 0.9)\n this.side = 1;\n else if (sz2 > 0.9)\n this.side = -1;\n else\n this.side = 0;\n }\n\n /** @summary Continue interactive moving */\n moveDrag(dx,dy) {\n if (this.side != 1) { this.x1 += dx; this.y1 += dy; }\n if (this.side != -1) { this.x2 += dx; this.y2 += dy; }\n this.draw_g.select('path').attr('d', this.createPath());\n }\n\n /** @summary Finish interactive moving */\n moveEnd(not_changed) {\n if (not_changed) return;\n let arrow = this.getObject(), exec = '';\n arrow.fX1 = this.svgToAxis('x', this.x1, this.isndc);\n arrow.fX2 = this.svgToAxis('x', this.x2, this.isndc);\n arrow.fY1 = this.svgToAxis('y', this.y1, this.isndc);\n arrow.fY2 = this.svgToAxis('y', this.y2, this.isndc);\n if (this.side != 1) exec += `SetX1(${arrow.fX1});;SetY1(${arrow.fY1});;`;\n if (this.side != -1) exec += `SetX2(${arrow.fX2});;SetY2(${arrow.fY2});;`;\n this.submitCanvExec(exec + 'Notify();;');\n }\n\n /** @summary Redraw arrow */\n redraw() {\n let arrow = this.getObject(), kLineNDC = BIT(14),\n oo = arrow.fOption, rect = this.getPadPainter().getPadRect();\n\n this.wsize = Math.max(3, Math.round(Math.max(rect.width, rect.height) * arrow.fArrowSize*0.8));\n this.isndc = arrow.TestBit(kLineNDC);\n this.angle2 = arrow.fAngle/2/180 * Math.PI;\n this.beg = this.mid = this.end = 0;\n\n if (oo.indexOf('<') == 0)\n this.beg = (oo.indexOf('<|') == 0) ? 12 : 2;\n if (oo.indexOf('->-') >= 0)\n this.mid = 1;\n else if (oo.indexOf('-|>-') >= 0)\n this.mid = 11;\n else if (oo.indexOf('-<-') >= 0)\n this.mid = 2;\n else if (oo.indexOf('-<|-') >= 0)\n this.mid = 12;\n\n let p1 = oo.lastIndexOf('>'), p2 = oo.lastIndexOf('|>'), len = oo.length;\n if ((p1 >= 0) && (p1 == len-1))\n this.end = ((p2 >= 0) && (p2 == len-2)) ? 11 : 1;\n\n this.createAttLine({ attr: arrow });\n\n this.createG();\n\n this.x1 = this.axisToSvg('x', arrow.fX1, this.isndc, true);\n this.y1 = this.axisToSvg('y', arrow.fY1, this.isndc, true);\n this.x2 = this.axisToSvg('x', arrow.fX2, this.isndc, true);\n this.y2 = this.axisToSvg('y', arrow.fY2, this.isndc, true);\n\n let elem = this.draw_g.append('svg:path')\n .attr('d', this.createPath())\n .call(this.lineatt.func);\n\n if ((this.beg > 10) || (this.end > 10)) {\n this.createAttFill({ attr: arrow });\n elem.call(this.fillatt.func);\n } else {\n elem.style('fill','none');\n }\n\n if (!isBatchMode())\n addMoveHandler(this);\n\n return this;\n }\n\n /** @summary Draw TArrow object */\n static async draw(dom, obj, opt) {\n let painter = new TArrowPainter(dom, obj,opt);\n return ensureTCanvas(painter, false).then(() => painter.redraw());\n }\n\n} // class TArrowPainter\n\nexport { TArrowPainter };\n"],"x_google_ignoreList":[0]} \ No newline at end of file diff --git a/docs/api-docs/changelog.html b/docs/api-docs/changelog.html index 75f461c8a..b4d54e76f 100644 --- a/docs/api-docs/changelog.html +++ b/docs/api-docs/changelog.html @@ -34,6 +34,8 @@

Change Log

All notable changes to this project will be documented in this file. See Conventional Commits for commit guidelines.

+

2.14.0 (2023-03-22)

+

Note: Version bump only for package phoenix-event-display

2.13.0 (2023-03-02)

Reverts