@ohif/extension-tmtv 3.13.0-beta.13 → 3.13.0-beta.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! For license information please see ohif-extension-tmtv.umd.js.LICENSE.txt */
|
|
2
|
-
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@cornerstonejs/adapters"),require("@cornerstonejs/core"),require("@cornerstonejs/tools"),require("@ohif/core"),require("@ohif/core/src"),require("@ohif/core/src/utils"),require("@ohif/extension-cornerstone"),require("@ohif/extension-default"),require("@ohif/i18n"),require("@ohif/ui-next"),require("dcmjs")):"function"==typeof define&&define.amd?define(["@cornerstonejs/adapters","@cornerstonejs/core","@cornerstonejs/tools","@ohif/core","@ohif/core/src","@ohif/core/src/utils","@ohif/extension-cornerstone","@ohif/extension-default","@ohif/i18n","@ohif/ui-next","dcmjs"],t):"object"==typeof exports?exports["ohif-extension-tmtv"]=t(require("@cornerstonejs/adapters"),require("@cornerstonejs/core"),require("@cornerstonejs/tools"),require("@ohif/core"),require("@ohif/core/src"),require("@ohif/core/src/utils"),require("@ohif/extension-cornerstone"),require("@ohif/extension-default"),require("@ohif/i18n"),require("@ohif/ui-next"),require("dcmjs")):e["ohif-extension-tmtv"]=t(e["@cornerstonejs/adapters"],e["@cornerstonejs/core"],e["@cornerstonejs/tools"],e["@ohif/core"],e["@ohif/core/src"],e["@ohif/core/src/utils"],e["@ohif/extension-cornerstone"],e["@ohif/extension-default"],e["@ohif/i18n"],e["@ohif/ui-next"],e.dcmjs)}(globalThis,(e,t,n,o,a,r,i,s,c,l,u)=>(()=>{var p={856:(e,t,n)=>{"use strict";var o=n(183);function a(){}function r(){}r.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,r,i){if(i!==o){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:r,resetWarningCache:a};return n.PropTypes=n,n}},598:(e,t,n)=>{e.exports=n(856)()},183:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},249:(e,t)=>{"use strict";var n=Symbol.for("react.element"),o=Symbol.for("react.portal"),a=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),c=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),p=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),m=Symbol.iterator;var f={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,y={};function h(e,t,n){this.props=e,this.context=t,this.refs=y,this.updater=n||f}function v(){}function S(e,t,n){this.props=e,this.context=t,this.refs=y,this.updater=n||f}h.prototype.isReactComponent={},h.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},h.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},v.prototype=h.prototype;var I=S.prototype=new v;I.constructor=S,g(I,h.prototype),I.isPureReactComponent=!0;var b=Array.isArray,T=Object.prototype.hasOwnProperty,w={current:null},E={key:!0,ref:!0,__self:!0,__source:!0};function x(e,t,o){var a,r={},i=null,s=null;if(null!=t)for(a in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)T.call(t,a)&&!E.hasOwnProperty(a)&&(r[a]=t[a]);var c=arguments.length-2;if(1===c)r.children=o;else if(1<c){for(var l=Array(c),u=0;u<c;u++)l[u]=arguments[u+2];r.children=l}if(e&&e.defaultProps)for(a in c=e.defaultProps)void 0===r[a]&&(r[a]=c[a]);return{$$typeof:n,type:e,key:i,ref:s,props:r,_owner:w.current}}function R(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var O=/\/+/g;function C(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(e){return t[e]})}(""+e.key):t.toString(36)}function D(e,t,a,r,i){var s=typeof e;"undefined"!==s&&"boolean"!==s||(e=null);var c=!1;if(null===e)c=!0;else switch(s){case"string":case"number":c=!0;break;case"object":switch(e.$$typeof){case n:case o:c=!0}}if(c)return i=i(c=e),e=""===r?"."+C(c,0):r,b(i)?(a="",null!=e&&(a=e.replace(O,"$&/")+"/"),D(i,t,a,"",function(e){return e})):null!=i&&(R(i)&&(i=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,a+(!i.key||c&&c.key===i.key?"":(""+i.key).replace(O,"$&/")+"/")+e)),t.push(i)),1;if(c=0,r=""===r?".":r+":",b(e))for(var l=0;l<e.length;l++){var u=r+C(s=e[l],l);c+=D(s,t,a,u,i)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=m&&e[m]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),l=0;!(s=e.next()).done;)c+=D(s=s.value,t,a,u=r+C(s,l++),i);else if("object"===s)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return c}function N(e,t,n){if(null==e)return e;var o=[],a=0;return D(e,o,"","",function(e){return t.call(n,e,a++)}),o}function M(e){if(-1===e._status){var t=e._result;(t=t()).then(function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)},function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)}),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var P={current:null},L={transition:null},U={ReactCurrentDispatcher:P,ReactCurrentBatchConfig:L,ReactCurrentOwner:w};function j(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:N,forEach:function(e,t,n){N(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return N(e,function(){t++}),t},toArray:function(e){return N(e,function(e){return e})||[]},only:function(e){if(!R(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=h,t.Fragment=a,t.Profiler=i,t.PureComponent=S,t.StrictMode=r,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=U,t.act=j,t.cloneElement=function(e,t,o){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var a=g({},e.props),r=e.key,i=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,s=w.current),void 0!==t.key&&(r=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(l in t)T.call(t,l)&&!E.hasOwnProperty(l)&&(a[l]=void 0===t[l]&&void 0!==c?c[l]:t[l])}var l=arguments.length-2;if(1===l)a.children=o;else if(1<l){c=Array(l);for(var u=0;u<l;u++)c[u]=arguments[u+2];a.children=c}return{$$typeof:n,type:e.type,key:r,ref:i,props:a,_owner:s}},t.createContext=function(e){return(e={$$typeof:c,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:s,_context:e},e.Consumer=e},t.createElement=x,t.createFactory=function(e){var t=x.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:l,render:e}},t.isValidElement=R,t.lazy=function(e){return{$$typeof:d,_payload:{_status:-1,_result:e},_init:M}},t.memo=function(e,t){return{$$typeof:p,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=L.transition;L.transition={};try{e()}finally{L.transition=t}},t.unstable_act=j,t.useCallback=function(e,t){return P.current.useCallback(e,t)},t.useContext=function(e){return P.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return P.current.useDeferredValue(e)},t.useEffect=function(e,t){return P.current.useEffect(e,t)},t.useId=function(){return P.current.useId()},t.useImperativeHandle=function(e,t,n){return P.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return P.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return P.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return P.current.useMemo(e,t)},t.useReducer=function(e,t,n){return P.current.useReducer(e,t,n)},t.useRef=function(e){return P.current.useRef(e)},t.useState=function(e){return P.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return P.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return P.current.useTransition()},t.version="18.3.1"},326:(e,t,n)=>{"use strict";e.exports=n(249)},741:e=>{e.exports={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}},142:t=>{"use strict";t.exports=e},557:e=>{"use strict";e.exports=t},713:e=>{"use strict";e.exports=n},2:e=>{"use strict";e.exports=o},459:e=>{"use strict";e.exports=a},141:e=>{"use strict";e.exports=r},669:e=>{"use strict";e.exports=i},438:e=>{"use strict";e.exports=s},545:e=>{"use strict";e.exports=c},55:e=>{"use strict";e.exports=l},111:e=>{"use strict";e.exports=u}},d={};function m(e){var t=d[e];if(void 0!==t)return t.exports;var n=d[e]={exports:{}};return p[e](n,n.exports,m),n.exports}m.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return m.d(t,{a:t}),t},m.d=(e,t)=>{for(var n in t)m.o(t,n)&&!m.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},m.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),m.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var f={};return(()=>{"use strict";m.r(f),m.d(f,{default:()=>Ue});const e=JSON.parse('{"UU":"@ohif/extension-tmtv"}').UU,t=e=>({type:"cameraPosition",id:e,source:!0,target:!0}),n={type:"hydrateseg",id:"sameFORId",source:!0,target:!0,options:{matchingRules:["sameFOR"]}},o={viewportOptions:{viewportId:"ctAXIAL",viewportType:"volume",orientation:"axial",toolGroupId:"ctToolGroup",initialImageOptions:{preset:"first"},syncGroups:[t("axialSync"),{type:"voi",id:"ctWLSync",source:!0,target:!0,options:{syncColormap:!0}},n]},displaySets:[{id:"ctDisplaySet"}]},a={viewportOptions:{viewportId:"ctSAGITTAL",viewportType:"volume",orientation:"sagittal",toolGroupId:"ctToolGroup",syncGroups:[t("sagittalSync"),{type:"voi",id:"ctWLSync",source:!0,target:!0,options:{syncColormap:!0}},n]},displaySets:[{id:"ctDisplaySet"}]},r={viewportOptions:{viewportId:"ctCORONAL",viewportType:"volume",orientation:"coronal",toolGroupId:"ctToolGroup",syncGroups:[t("coronalSync"),{type:"voi",id:"ctWLSync",source:!0,target:!0,options:{syncColormap:!0}},n]},displaySets:[{id:"ctDisplaySet"}]},i={viewportOptions:{viewportId:"ptAXIAL",viewportType:"volume",background:[1,1,1],orientation:"axial",toolGroupId:"ptToolGroup",initialImageOptions:{preset:"first"},syncGroups:[t("axialSync"),{type:"voi",id:"ptWLSync",source:!0,target:!0,options:{syncColormap:!0}},{type:"voi",id:"ptFusionWLSync",source:!0,target:!1,options:{syncColormap:!1,syncInvertState:!1}},n]},displaySets:[{options:{voi:{custom:"getPTVOIRange"},voiInverted:!0},id:"ptDisplaySet"}]},s={viewportOptions:{viewportId:"ptSAGITTAL",viewportType:"volume",orientation:"sagittal",background:[1,1,1],toolGroupId:"ptToolGroup",syncGroups:[t("sagittalSync"),{type:"voi",id:"ptWLSync",source:!0,target:!0,options:{syncColormap:!0}},{type:"voi",id:"ptFusionWLSync",source:!0,target:!1,options:{syncColormap:!1,syncInvertState:!1}},n]},displaySets:[{options:{voi:{custom:"getPTVOIRange"},voiInverted:!0},id:"ptDisplaySet"}]},c={viewportOptions:{viewportId:"ptCORONAL",viewportType:"volume",orientation:"coronal",background:[1,1,1],toolGroupId:"ptToolGroup",syncGroups:[t("coronalSync"),{type:"voi",id:"ptWLSync",source:!0,target:!0,options:{syncColormap:!0}},{type:"voi",id:"ptFusionWLSync",source:!0,target:!1,options:{syncColormap:!1,syncInvertState:!1}},n]},displaySets:[{options:{voi:{custom:"getPTVOIRange"},voiInverted:!0},id:"ptDisplaySet"}]},l={viewportOptions:{viewportId:"fusionAXIAL",viewportType:"volume",orientation:"axial",toolGroupId:"fusionToolGroup",initialImageOptions:{preset:"first"},syncGroups:[t("axialSync"),{type:"voi",id:"ctWLSync",source:!1,target:!0},{type:"voi",id:"fusionWLSync",source:!0,target:!0,options:{syncColormap:!0}},{type:"voi",id:"ptFusionWLSync",source:!1,target:!0,options:{syncColormap:!1,syncInvertState:!1}},n]},displaySets:[{id:"ctDisplaySet"},{id:"ptDisplaySet",options:{colormap:{name:"hsv",opacity:[{value:0,opacity:0},{value:.1,opacity:.8},{value:1,opacity:.9}]},voi:{custom:"getPTVOIRange"}}}]},u={viewportOptions:{viewportId:"fusionSAGITTAL",viewportType:"volume",orientation:"sagittal",toolGroupId:"fusionToolGroup",syncGroups:[t("sagittalSync"),{type:"voi",id:"ctWLSync",source:!1,target:!0},{type:"voi",id:"fusionWLSync",source:!0,target:!0,options:{syncColormap:!0}},{type:"voi",id:"ptFusionWLSync",source:!1,target:!0,options:{syncColormap:!1,syncInvertState:!1}},n]},displaySets:[{id:"ctDisplaySet"},{id:"ptDisplaySet",options:{colormap:{name:"hsv",opacity:[{value:0,opacity:0},{value:.1,opacity:.8},{value:1,opacity:.9}]},voi:{custom:"getPTVOIRange"}}}]},p={viewportOptions:{viewportId:"fusionCoronal",viewportType:"volume",orientation:"coronal",toolGroupId:"fusionToolGroup",syncGroups:[t("coronalSync"),{type:"voi",id:"ctWLSync",source:!1,target:!0},{type:"voi",id:"fusionWLSync",source:!0,target:!0,options:{syncColormap:!0}},{type:"voi",id:"ptFusionWLSync",source:!1,target:!0,options:{syncColormap:!1,syncInvertState:!1}},n]},displaySets:[{id:"ctDisplaySet"},{id:"ptDisplaySet",options:{colormap:{name:"hsv",opacity:[{value:0,opacity:0},{value:.1,opacity:.8},{value:1,opacity:.9}]},voi:{custom:"getPTVOIRange"}}}]},d={viewportOptions:{viewportId:"mipSagittal",viewportType:"volume",orientation:"sagittal",background:[1,1,1],toolGroupId:"mipToolGroup",syncGroups:[{type:"voi",id:"ptWLSync",source:!0,target:!0,options:{syncColormap:!0}},{type:"voi",id:"ptFusionWLSync",source:!0,target:!1,options:{syncColormap:!1,syncInvertState:!1}},n],customViewportProps:{hideOverlays:!0}},displaySets:[{options:{blendMode:"MIP",slabThickness:"fullVolume",voi:{custom:"getPTVOIRange"},voiInverted:!0},id:"ptDisplaySet"}]},g={id:"@ohif/extension-tmtv.hangingProtocolModule.ptCT",locked:!0,name:"Default",createdDate:"2021-02-23T19:22:08.894Z",modifiedDate:"2022-10-04T19:22:08.894Z",availableTo:{},editableBy:{},imageLoadStrategy:"interleaveTopToBottom",protocolMatchingRules:[{attribute:"ModalitiesInStudy",constraint:{contains:["CT","PT"]}},{attribute:"StudyDescription",constraint:{contains:"PETCT"}},{attribute:"StudyDescription",constraint:{contains:"PET/CT"}}],displaySetSelectors:{ctDisplaySet:{seriesMatchingRules:[{attribute:"Modality",constraint:{equals:{value:"CT"}},required:!0},{attribute:"isReconstructable",constraint:{equals:{value:!0}},required:!0},{attribute:"SeriesDescription",constraint:{contains:"CT"}},{attribute:"SeriesDescription",constraint:{contains:"CT WB"}}]},ptDisplaySet:{seriesMatchingRules:[{attribute:"Modality",constraint:{equals:"PT"},required:!0},{attribute:"isReconstructable",constraint:{equals:{value:!0}},required:!0},{attribute:"SeriesDescription",constraint:{contains:"Corrected"}},{weight:2,attribute:"SeriesDescription",constraint:{doesNotContain:{value:"Uncorrected"}}}]}},stages:[{name:"default",id:"default",viewportStructure:{layoutType:"grid",properties:{rows:3,columns:4,layoutOptions:[{x:0,y:0,width:1/4,height:1/3},{x:1/4,y:0,width:1/4,height:1/3},{x:.5,y:0,width:1/4,height:1/3},{x:0,y:1/3,width:1/4,height:1/3},{x:1/4,y:1/3,width:1/4,height:1/3},{x:.5,y:1/3,width:1/4,height:1/3},{x:0,y:2/3,width:1/4,height:1/3},{x:1/4,y:2/3,width:1/4,height:1/3},{x:.5,y:2/3,width:1/4,height:1/3},{x:3/4,y:0,width:1/4,height:1}]}},viewports:[o,a,r,i,s,c,l,u,p,d],createdDate:"2021-02-23T18:32:42.850Z"},{name:"Fusion 2x2",id:"Fusion-2x2",viewportStructure:{layoutType:"grid",properties:{rows:2,columns:2}},viewports:[o,l,i,d]},{name:"2x3-layout",id:"2x3-layout",viewportStructure:{layoutType:"grid",properties:{rows:2,columns:3}},viewports:[o,a,r,i,s,c]},{name:"2x4-layout",id:"2x4-layout",viewportStructure:{layoutType:"grid",properties:{rows:2,columns:4,layoutOptions:[{x:0,y:0,width:1/4,height:.5},{x:1/4,y:0,width:1/4,height:.5},{x:.5,y:0,width:1/4,height:.5},{x:3/4,y:0,width:1/4,height:1},{x:0,y:.5,width:1/4,height:.5},{x:1/4,y:.5,width:1/4,height:.5},{x:.5,y:.5,width:1/4,height:.5}]}},viewports:[c,s,i,d,p,u,l]}],numberOfPriorsReferenced:-1};const y=function(){return[{name:g.id,protocol:g}]};var h=m(326),v=m(598),S=m.n(v),I=m(2),b=m.n(I);function T(e){return T="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},T(e)}function w(e){var t=function(e,t){if("object"!=T(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var o=n.call(e,t||"default");if("object"!=T(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==T(t)?t:t+""}function E(e,t,n){return(t=w(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}m(741);Object.create(null);function x(){if(console&&console.warn){for(var e,t=arguments.length,n=new Array(t),o=0;o<t;o++)n[o]=arguments[o];"string"==typeof n[0]&&(n[0]="react-i18next:: ".concat(n[0])),(e=console).warn.apply(e,n)}}var R={};function O(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];"string"==typeof t[0]&&R[t[0]]||("string"==typeof t[0]&&(R[t[0]]=new Date),x.apply(void 0,t))}var C=function(e,t){return function(){if(e.isInitialized)t();else{e.on("initialized",function n(){setTimeout(function(){e.off("initialized",n)},0),t()})}}};function D(e,t,n){e.loadNamespaces(t,C(e,n))}function N(e,t,n,o){"string"==typeof n&&(n=[n]),n.forEach(function(t){e.options.ns.indexOf(t)<0&&e.options.ns.push(t)}),e.loadLanguages(t,C(e,o))}var M=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,P={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'," ":" "," ":" ","©":"©","©":"©","®":"®","®":"®","…":"…","…":"…","/":"/","/":"/"},L=function(e){return P[e]};var U,j={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:function(e){return e.replace(M,L)}};function _(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,w(o.key),o)}}var k=(0,h.createContext)(),A=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.usedNamespaces={}}return function(e,t,n){t&&_(e.prototype,t),n&&_(e,n),Object.defineProperty(e,"prototype",{writable:!1})}(e,[{key:"addUsedNamespaces",value:function(e){var t=this;e.forEach(function(e){t.usedNamespaces[e]||(t.usedNamespaces[e]=!0)})}},{key:"getUsedNamespaces",value:function(){return Object.keys(this.usedNamespaces)}}]),e}();function F(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=Array(t);n<t;n++)o[n]=e[n];return o}function V(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var o,a,r,i,s=[],c=!0,l=!1;try{if(r=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(o=r.call(n)).done)&&(s.push(o.value),s.length!==t);c=!0);}catch(e){l=!0,a=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(l)throw a}}return s}}(e,t)||function(e,t){if(e){if("string"==typeof e)return F(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?F(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function q(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,o)}return n}function G(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?q(Object(n),!0).forEach(function(t){E(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):q(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function $(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.i18n,o=(0,h.useContext)(k)||{},a=o.i18n,r=o.defaultNS,i=n||a||U;if(i&&!i.reportNamespaces&&(i.reportNamespaces=new A),!i){O("You will need to pass in an i18next instance by using initReactI18next");var s=function(e,t){return"string"==typeof t?t:t&&"object"===T(t)&&"string"==typeof t.defaultValue?t.defaultValue:Array.isArray(e)?e[e.length-1]:e},c=[s,{},!1];return c.t=s,c.i18n={},c.ready=!1,c}i.options.react&&void 0!==i.options.react.wait&&O("It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.");var l=G(G(G({},j),i.options.react),t),u=l.useSuspense,p=l.keyPrefix,d=e||r||i.options&&i.options.defaultNS;d="string"==typeof d?[d]:d||["translation"],i.reportNamespaces.addUsedNamespaces&&i.reportNamespaces.addUsedNamespaces(d);var m=(i.isInitialized||i.initializedStoreOnce)&&d.every(function(e){return function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return t.languages&&t.languages.length?void 0!==t.options.ignoreJSONStructure?t.hasLoadedNamespace(e,{lng:n.lng,precheck:function(t,o){if(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!o(t.isLanguageChangingTo,e))return!1}}):function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=t.languages[0],a=!!t.options&&t.options.fallbackLng,r=t.languages[t.languages.length-1];if("cimode"===o.toLowerCase())return!0;var i=function(e,n){var o=t.services.backendConnector.state["".concat(e,"|").concat(n)];return-1===o||2===o};return!(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!i(t.isLanguageChangingTo,e)||!t.hasResourceBundle(o,e)&&t.services.backendConnector.backend&&(!t.options.resources||t.options.partialBundledLanguages)&&(!i(o,e)||a&&!i(r,e)))}(e,t,n):(O("i18n.languages were undefined or empty",t.languages),!0)}(e,i,l)});function f(){return i.getFixedT(t.lng||null,"fallback"===l.nsMode?d:d[0],p)}var g=V((0,h.useState)(f),2),y=g[0],v=g[1],S=d.join();t.lng&&(S="".concat(t.lng).concat(S));var I,b,w,E=(I=S,w=(0,h.useRef)(),(0,h.useEffect)(function(){w.current=b?w.current:I},[I,b]),w.current),x=(0,h.useRef)(!0);(0,h.useEffect)(function(){var e=l.bindI18n,n=l.bindI18nStore;function o(){x.current&&v(f)}return x.current=!0,m||u||(t.lng?N(i,t.lng,d,function(){x.current&&v(f)}):D(i,d,function(){x.current&&v(f)})),m&&E&&E!==S&&x.current&&v(f),e&&i&&i.on(e,o),n&&i&&i.store.on(n,o),function(){x.current=!1,e&&i&&e.split(" ").forEach(function(e){return i.off(e,o)}),n&&i&&n.split(" ").forEach(function(e){return i.store.off(e,o)})}},[i,S]);var R=(0,h.useRef)(!0);(0,h.useEffect)(function(){x.current&&!R.current&&v(f),R.current=!1},[i,p]);var C=[y,i,m];if(C.t=y,C.i18n=i,C.ready=m,m)return C;if(!m&&!u)return C;throw new Promise(function(e){t.lng?N(i,t.lng,d,function(){return e()}):D(i,d,function(){return e()})})}var W=m(55),B=m(459);function H(){return H=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)({}).hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},H.apply(null,arguments)}const z={PatientWeight:null,PatientSex:null,SeriesTime:null,RadiopharmaceuticalInformationSequence:{RadionuclideTotalDose:null,RadionuclideHalfLife:null,RadiopharmaceuticalStartTime:null}},Y=({children:e,className:t,...n})=>h.createElement("div",H({className:`flex flex-row items-center space-x-4 ${t||""}`},n),e);function J(){const{commandsManager:e,servicesManager:t}=(0,B.useSystem)(),{t:n}=$("PanelSUV"),{displaySetService:o,hangingProtocolService:a}=t.services,[r,i]=(0,h.useState)(z),[s,c]=(0,h.useState)(null),l=e=>{i(t=>{const n={...t};return Object.keys(e).forEach(o=>{"object"==typeof e[o]?n[o]={...t[o],...e[o]}:n[o]=e[o]}),n})},u=t=>{const n=e.runCommand("getMatchingPTDisplaySet",{viewportMatchDetails:t});if(!n)return;return{ptDisplaySet:n,metadata:e.runCommand("getPTMetadata",{ptDisplaySet:n})}};return(0,h.useEffect)(()=>{const e=o.getActiveDisplaySets(),{viewportMatchDetails:t}=a.getMatchDetails();if(!e.length)return;const n=u(t);if(!n)return;const{ptDisplaySet:r,metadata:s}=n;c(r),i(s)},[]),(0,h.useEffect)(()=>{const{unsubscribe:e}=a.subscribe(a.EVENTS.PROTOCOL_CHANGED,({viewportMatchDetails:e})=>{const t=u(e);if(!t)return;const{ptDisplaySet:n,metadata:o}=t;c(n),i(o)});return()=>{e()}},[]),h.createElement(h.Fragment,null,h.createElement("div",{className:"ohif-scrollbar flex min-h-0 flex-auto select-none flex-col justify-between overflow-auto"},h.createElement("div",{className:"flex min-h-0 flex-1 flex-col bg-background text-base"},h.createElement(W.PanelSection,{defaultOpen:!0},h.createElement(W.PanelSection.Header,null,n("Patient Information")),h.createElement(W.PanelSection.Content,null,h.createElement("div",{className:"bg-muted flex flex-col gap-3 p-2"},h.createElement(Y,null,h.createElement(Y.Label,null,n("Patient Sex")),h.createElement(Y.Input,{value:r.PatientSex||"",onChange:e=>{l({PatientSex:e.target.value})}})),h.createElement(Y,null,h.createElement(Y.Label,{unit:"kg"},n("Weight")),h.createElement(Y.Input,{value:r.PatientWeight||"",onChange:e=>{l({PatientWeight:e.target.value})},id:"weight-input"})),h.createElement(Y,null,h.createElement(Y.Label,{unit:"bq"},n("Total Dose")),h.createElement(Y.Input,{value:r.RadiopharmaceuticalInformationSequence.RadionuclideTotalDose||"",onChange:e=>{l({RadiopharmaceuticalInformationSequence:{RadionuclideTotalDose:e.target.value}})}})),h.createElement(Y,null,h.createElement(Y.Label,{unit:"s"},n("Half Life")),h.createElement(Y.Input,{value:r.RadiopharmaceuticalInformationSequence.RadionuclideHalfLife||"",onChange:e=>{l({RadiopharmaceuticalInformationSequence:{RadionuclideHalfLife:e.target.value}})}})),h.createElement(Y,null,h.createElement(Y.Label,{unit:"s"},n("Injection Time")),h.createElement(Y.Input,{value:r.RadiopharmaceuticalInformationSequence.RadiopharmaceuticalStartTime||"",onChange:e=>{l({RadiopharmaceuticalInformationSequence:{RadiopharmaceuticalStartTime:e.target.value}})}})),h.createElement(Y,null,h.createElement(Y.Label,{unit:"s"},n("Acquisition Time")),h.createElement(Y.Input,{value:r.SeriesTime||"",onChange:()=>{}})),h.createElement(W.Button,{variant:"default",size:"sm",className:"self-end px-4",onClick:function(){if(!s)throw new Error("No ptDisplaySet found");I.DicomMetadataStore.updateMetadataForSeries(s.StudyInstanceUID,s.SeriesInstanceUID,r),o.setDisplaySetMetadataInvalidated(s.displaySetInstanceUID),setTimeout(()=>{e.runCommand("resetCrosshairs")},0)}},n("Reload Data"))))))))}Y.Label=({children:e,unit:t,className:n,...o})=>h.createElement(W.Label,H({className:`min-w-32 flex-shrink-0 ${n||""}`},o),e,t&&h.createElement("span",{className:"text-muted-foreground"}," ",t)),Y.Input=({className:e,...t})=>h.createElement(W.Input,H({className:`h-7 flex-1 ${e||""}`},t)),Y.Label.displayName="InputRow.Label",Y.Input.displayName="InputRow.Input",J.propTypes={servicesManager:S().shape({services:S().shape({measurementService:S().shape({getMeasurements:S().func.isRequired,subscribe:S().func.isRequired,EVENTS:S().object.isRequired,VALUE_TYPES:S().object.isRequired}).isRequired}).isRequired}).isRequired};var K=m(669);const X=async({commandsManager:e,segmentationService:t})=>{const n=t.getSegmentations(),o=await e.run("calculateTMTV",{segmentations:n});n.forEach(e=>{e.cachedStats={...e.cachedStats,tmtv:o},t.addOrUpdateSegmentation(e)})};var Z=m(141);function Q(){const{commandsManager:e,servicesManager:t}=(0,B.useSystem)(),{segmentationService:n}=t.services,{segmentationsWithRepresentations:o}=(0,K.useActiveViewportSegmentationRepresentations)(),a=o?.map(e=>e.segmentation.segmentationId)||[],r=o?.map(e=>e.segmentation)||[];(0,h.useEffect)(()=>{(async()=>{for(const t of a)await X({segmentationId:t,commandsManager:e,segmentationService:n})})()},[]),(0,h.useEffect)(()=>{const t=(0,Z.debounce)(async t=>{const{segmentationId:o}=t;await X({segmentationId:o,commandsManager:e,segmentationService:n})},100),o=n.subscribe(n.EVENTS.SEGMENTATION_DATA_MODIFIED,e=>{t(e)});return()=>{o.unsubscribe()}},[e,n]);const i=n.getSegmentationGroupStats(a),s=i?.tmtv;return h.createElement("div",{className:"mb-1 flex flex-col"},h.createElement("div",{className:"invisible-scrollbar overflow-y-auto overflow-x-hidden"},h.createElement("div",{className:"bg-popover flex items-baseline justify-between px-2 py-1"},h.createElement("div",{className:"py-1"},h.createElement("span",{className:"text-muted-foreground text-base font-bold uppercase"},"TMTV: "),h.createElement("span",{className:"text-foreground"},s?`${s.toFixed(3)} mL`:"")),h.createElement("div",{className:"flex items-center"},h.createElement(W.Button,{dataCY:"exportTmtvCsvReport",size:"sm",variant:"ghost",onClick:()=>{r.length&&e.runCommand("exportTMTVReportCSV",{segmentations:r,tmtv:s,config:{}})}},h.createElement("span",{className:"pl-1"},"CSV"))))))}const ee=Q;var te=m(438);function ne({configuration:e}){return h.createElement(h.Fragment,null,h.createElement(K.PanelSegmentation,{configuration:e},h.createElement(Q,null)))}var oe=m(545),ae=m.n(oe);const re=function({commandsManager:e,extensionManager:t,servicesManager:n}){const{toolbarService:o}=n.services;return[{name:"petSUV",iconName:"tab-patient-info",iconLabel:"Patient Info",label:"Patient Info",component:()=>h.createElement(J,null)},{name:"tmtv",iconName:"tab-segmentation",iconLabel:"Segmentation",component:()=>h.createElement(h.Fragment,null,h.createElement(te.Toolbox,{buttonSectionId:o.sections.roiThresholdToolbox,title:ae().t("ROIThresholdConfiguration:Threshold Tools")}),h.createElement(ne,{commandsManager:e,servicesManager:n}))},{name:"tmtvBox",iconName:"tab-segmentation",iconLabel:"Segmentation",label:"Segmentation Toolbox",component:()=>h.createElement(te.Toolbox,{buttonSectionId:o.sections.roiThresholdToolbox,title:ae().t("ROIThresholdConfiguration:Threshold Tools")})},{name:"tmtvExport",iconName:"tab-segmentation",iconLabel:"Segmentation",label:"Segmentation Export",component:()=>h.createElement(ee,null)}]};var ie=m(713);const se=["RectangleROIStartEndThreshold","CircleROIStartEndThreshold"],ce={toAnnotation:(e,t)=>{},toMeasurement:(e,t,n)=>{const{annotation:o,viewportId:a}=e,{metadata:r,data:i,annotationUID:s}=o;if(!r||!i)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:c,referencedImageId:l,FrameOfReferenceUID:u}=r;if(!se.includes(c))throw new Error("Tool not supported");const{SOPInstanceUID:p,SeriesInstanceUID:d,StudyInstanceUID:m}=(0,K.getSOPInstanceAttributes)(l,n,a);let f;return f=p?t.getDisplaySetForSOPInstanceUID(p,d):t.getDisplaySetsForSeries(d),{uid:s,SOPInstanceUID:p,FrameOfReferenceUID:u,metadata:r,referenceSeriesUID:d,referenceStudyUID:m,toolName:r.toolName,displaySetInstanceUID:f.displaySetInstanceUID,label:r.label,data:i.cachedStats,type:"RectangleROIStartEndThreshold"}}},le={toAnnotation:(e,t)=>{},toMeasurement:(e,t,n)=>{const{annotation:o,viewportId:a}=e,{metadata:r,data:i,annotationUID:s}=o;if(!r||!i)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:c,referencedImageId:l,FrameOfReferenceUID:u}=r;if(!se.includes(c))throw new Error("Tool not supported");const{SOPInstanceUID:p,SeriesInstanceUID:d,StudyInstanceUID:m}=(0,K.getSOPInstanceAttributes)(l,n,a);let f;f=p?t.getDisplaySetForSOPInstanceUID(p,d):t.getDisplaySetsForSeries(d);const{cachedStats:g}=i;return{uid:s,SOPInstanceUID:p,FrameOfReferenceUID:u,metadata:r,referenceSeriesUID:d,referenceStudyUID:m,toolName:r.toolName,displaySetInstanceUID:f.displaySetInstanceUID,label:r.label,data:i.cachedStats,type:"CircleROIStartEndThreshold"}}},ue=(e,t,n)=>({RectangleROIStartEndThreshold:{toAnnotation:ce.toAnnotation,toMeasurement:e=>ce.toMeasurement(e,t,n),matchingCriteria:[{valueType:e.VALUE_TYPES.ROI_THRESHOLD_MANUAL}]},CircleROIStartEndThreshold:{toAnnotation:le.toAnnotation,toMeasurement:e=>le.toMeasurement(e,t,n),matchingCriteria:[{valueType:e.VALUE_TYPES.ROI_THRESHOLD_MANUAL}]}}),{CORNERSTONE_3D_TOOLS_SOURCE_NAME:pe,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:de}=K.Enums;var me=m(557);function fe(e,t){const{imageIds:n}=e,o=me.cache.getVolumeContainingImageId(n[0]);if(!o)throw new Error("No volume found for display set");const{volume:a}=o,{voxelManager:r}=a,{fn:i,baseValue:s}=function(){const e=-1/0,t=(e,t)=>(e>t&&(t=e),t);return{fn:t,baseValue:e}}();let c=s;const l=ie.utilities.rectangleROITool.getBoundsIJKFromRectangleAnnotations(t,a);return r.forEach(({value:e})=>{c=i(e,c)},{boundsIJK:l}),c}const ge=function(e,t,n){if("range"===n.strategy)return{ptLower:Number(n.ptLower),ptUpper:Number(n.ptUpper),ctLower:Number(n.ctLower),ctUpper:Number(n.ctUpper)};const{weight:o}=n;return{ctLower:-1/0,ctUpper:1/0,ptLower:o*fe(t,e.map(e=>ie.annotation.state.getAnnotation(e))),ptUpper:1/0}},{downloadCsv:ye}=I.utils;var he=m(111),ve=m.n(he),Se=m(142);const{datasetToBlob:Ie}=ve().data,be=I.classes.MetadataProvider;const Te=function(e){const t=Se.adaptersRT.Cornerstone3D.RTSS.generateRTSSFromAnnotations(e,be,I.DicomMetadataStore),n=Ie(t);var o=URL.createObjectURL(n);window.location.assign(o)},{SegmentationRepresentations:we}=ie.Enums,{formatPN:Ee}=I.utils,xe=I.classes.MetadataProvider,Re=["RectangleROIStartEndThreshold","RectangleROIThreshold","CircleROIStartEndThreshold"],Oe=({servicesManager:e,commandsManager:t,extensionManager:n})=>{const{viewportGridService:o,uiNotificationService:a,displaySetService:r,hangingProtocolService:i,toolGroupService:s,cornerstoneViewportService:c,segmentationService:l}=e.services,u=n.getModuleEntry("@ohif/extension-cornerstone.utilityModule.common"),{getEnabledElement:p}=u.exports;function d(){const{activeViewportId:e}=o.getState(),{element:t}=p(e)||{};return me.getEnabledElement(t)}function m(e){return e.reduce((e,t)=>{const n=ie.annotation.selection.getAnnotationsSelectedByToolName(t);return e.concat(n)},[])}const f={getMatchingPTDisplaySet:({viewportMatchDetails:e})=>{let t=null;for(const[,n]of e){const{displaySetsInfo:e}=n,o=e.map(({displaySetInstanceUID:e})=>r.getDisplaySetByUID(e));if(o&&0!==o.length&&(t=o.find(e=>"PT"===e.Modality),t))break}return t},getPTMetadata:({ptDisplaySet:e})=>{const t=n.getDataSources()[0].getImageIdsForDisplaySet(e)[0],o=xe.get("instance",t);if("PT"!==o.Modality)return;return{SeriesTime:o.SeriesTime,Modality:o.Modality,PatientSex:o.PatientSex,PatientWeight:o.PatientWeight,RadiopharmaceuticalInformationSequence:{RadionuclideTotalDose:o.RadiopharmaceuticalInformationSequence[0].RadionuclideTotalDose,RadionuclideHalfLife:o.RadiopharmaceuticalInformationSequence[0].RadionuclideHalfLife,RadiopharmaceuticalStartTime:o.RadiopharmaceuticalInformationSequence[0].RadiopharmaceuticalStartTime,RadiopharmaceuticalStartDateTime:o.RadiopharmaceuticalInformationSequence[0].RadiopharmaceuticalStartDateTime}}},createNewLabelmapFromPT:async({label:e})=>{const{viewportMatchDetails:t}=i.getMatchDetails(),n=f.getMatchingPTDisplaySet({viewportMatchDetails:t});let o=null;for(const[e,{displaySetsInfo:a}]of t.entries()){if(a.some(({displaySetInstanceUID:e})=>e===n.displaySetInstanceUID)){o=e;break}}if(!n)return void a.error("No matching PT display set found");const s=l.getSegmentationRepresentations(o),c=r.getDisplaySetByUID(n.displaySetInstanceUID),u=await l.createLabelmapForDisplaySet(c,{label:`Segmentation ${s.length+1}`,segments:{1:{label:`${ae().t("Segment")} 1`,active:!0}}});return l.addSegmentationRepresentation(o,{segmentationId:u}),u},thresholdSegmentationByRectangleROITool:({segmentationId:e,config:t,segmentIndex:n})=>{const o=ie.segmentation.state.getSegmentation(e),{representationData:s}=o,{displaySetMatchDetails:c}=i.getMatchDetails(),l=c.get("ctDisplaySet"),u=c.get("ptDisplaySet"),p=r.getDisplaySetByUID(l.displaySetInstanceUID),d=r.getDisplaySetByUID(u.displaySetInstanceUID),{volumeId:f}=s[we.Labelmap],g=me.cache.getVolume(f),y=m(Re);if(0===y.length)return void a.show({title:"Commands Module",message:"No ROIThreshold Tool is Selected",type:"error"});const{ptLower:h,ptUpper:v,ctLower:S,ctUpper:I}=ge(y,d,t),{imageIds:b}=d,T=me.cache.getVolumeContainingImageId(b[0]);if(!T)return void a.error("No PT volume found");const{imageIds:w}=p,E=me.cache.getVolumeContainingImageId(w[0]);if(!E)return void a.error("No CT volume found");const x=T.volume,R=E.volume;return ie.utilities.segmentation.rectangleROIThresholdVolumeByRange(y,g,[{volume:x,lower:h,upper:v},{volume:R,lower:S,upper:I}],{overwrite:!0,segmentIndex:n,segmentationId:e})},calculateTMTV:async({segmentations:e})=>{const t=e.map(e=>e.segmentationId),n=await ie.utilities.segmentation.computeMetabolicStats({segmentationIds:t,segmentIndex:1});return l.setSegmentationGroupStats(t,n),n},exportTMTVReportCSV:async({segmentations:e,tmtv:n,config:o,options:a})=>{const r=t.runCommand("getSegmentationCSVReport",{segmentations:e});let i=0;for(const e in r){i+=r[e].namedStats_lesionGlycolysis.value}const s=[{key:"Total Lesion Glycolysis",value:{tlg:i.toFixed(4)}},{key:"Threshold Configuration",value:{...o}}];void 0!==n&&s.unshift({key:"Total Metabolic Tumor Volume",value:{tmtv:n}}),function(e,t,n={}){const o=e[Object.keys(e)[0]],a=Object.keys(o),r=[a.map(e=>e.toLowerCase().startsWith("namedstats_")?e.substring(11):e).join(",")];Object.values(e).forEach(e=>{const t=[];a.forEach(n=>{t.push(e[n]&&"object"==typeof e[n]?Array.isArray(e[n])?e[n].join(" "):e[n].value&&Array.isArray(e[n].value)?e[n].value.join(" "):e[n].value??e[n]:e[n])}),r.push(t.join(","))}),r.push(""),r.push(""),r.push(""),r.push(`Patient ID,${o.PatientID}`),r.push(`Study Date,${o.StudyDate}`),r.push(""),t.forEach(({key:e,value:t})=>{const n=[];n.push(`${e}`),Object.keys(t).forEach(e=>{n.push(`${e}`),n.push(`${t[e]}`)}),r.push(n.join(","))}),ye(r.join("\n"),{filename:n.filename??`${o.PatientID}_tmtv.csv`})}(r,s,a)},setStartSliceForROIThresholdTool:()=>{const{viewport:e}=d(),{focalPoint:t}=e.getCamera(),n=m(Re)[0],o=ie.annotation.state.getAnnotation(n);o.data.startCoordinate=t,o.invalidated=!0,e.render()},setEndSliceForROIThresholdTool:()=>{const{viewport:e}=d(),t=m(Re)[0],n=ie.annotation.state.getAnnotation(t),o=e.getCamera().focalPoint;n.data.endCoordinate=o,n.invalidated=!0,e.render()},createTMTVRTReport:()=>{const e=ie.annotation.state.getAnnotationManager(),n=[];Object.keys(e.annotations).forEach(t=>{const o=e.annotations[t],a=Re.reduce((e,t)=>[...e,...o[t]??[]],[]);n.push(...a)}),t.runCommand("exportRTReportForAnnotations",{annotations:n})},getSegmentationCSVReport:({segmentations:e})=>{e&&e.length||(e=l.getSegmentations());const t={};for(const n of e){const{label:e,segmentationId:o,representationData:a}=n,r=o,i={id:r,label:e};if(!a){t[r]=i;continue}const{cachedStats:s}=n.segments[1]||{};s&&Object.entries(s).forEach(([e,t])=>{"object"!=typeof t?i[e]=t:Object.entries(t).forEach(([t,n])=>{i[`${e}_${t}`]=n})});const c=n.representationData[we.Labelmap];if(!c){t[r]=i;continue}const l=ie.utilities.segmentation.getReferenceVolumeForSegmentationVolume(c.volumeId);if(!l){t[r]=i;continue}if(!l.imageIds||!l.imageIds.length){t[r]=i;continue}const u=l.imageIds[0],p=b().classes.MetadataProvider.get("instance",u);p?t[r]={...i,PatientID:p.PatientID??"000000",PatientName:Ee(p.PatientName),StudyInstanceUID:p.StudyInstanceUID,SeriesInstanceUID:p.SeriesInstanceUID,StudyDate:p.StudyDate}:t[r]=i}return t},exportRTReportForAnnotations:({annotations:e})=>{Te(e)},setFusionPTColormap:({toolGroupId:e,colormap:n})=>{const o=s.getToolGroup(e);if(!o)return;const{viewportMatchDetails:a}=i.getMatchDetails(),r=f.getMatchingPTDisplaySet({viewportMatchDetails:a});if(!r)return;const l=o.getViewportIds(),u=[];l.forEach(e=>{t.runCommand("setViewportColormap",{viewportId:e,displaySetInstanceUID:r.displaySetInstanceUID,colormap:{name:n}}),u.push(c.getCornerstoneViewport(e))}),u.forEach(e=>{e.render()})}},g={setEndSliceForROIThresholdTool:{commandFn:f.setEndSliceForROIThresholdTool},setStartSliceForROIThresholdTool:{commandFn:f.setStartSliceForROIThresholdTool},getMatchingPTDisplaySet:{commandFn:f.getMatchingPTDisplaySet},getPTMetadata:{commandFn:f.getPTMetadata},createNewLabelmapFromPT:{commandFn:f.createNewLabelmapFromPT},thresholdSegmentationByRectangleROITool:{commandFn:f.thresholdSegmentationByRectangleROITool},calculateTMTV:{commandFn:f.calculateTMTV},exportTMTVReportCSV:{commandFn:f.exportTMTVReportCSV},createTMTVRTReport:{commandFn:f.createTMTVRTReport},getSegmentationCSVReport:{commandFn:f.getSegmentationCSVReport},exportRTReportForAnnotations:{commandFn:f.exportRTReportForAnnotations},setFusionPTColormap:{commandFn:f.setFusionPTColormap}};return{actions:f,definitions:g,defaultContext:"TMTV:CORNERSTONE"}},Ce="roi_stat";const De=function({config:e,dispatch:t,runCommand:n}){const{t:o}=$("ROIThresholdConfiguration"),a=[{value:Ce,label:o("Max"),placeHolder:o("Max")},{value:"range",label:o("Range"),placeHolder:o("Range")}];return h.createElement("div",{className:"bg-muted flex flex-col space-y-4 p-px"},h.createElement("div",{className:"flex items-end space-x-3"},h.createElement("div",{className:"flex min-w-0 flex-1 flex-col"},h.createElement(W.Select,{value:e.strategy,onValueChange:e=>{t({type:"setStrategy",payload:{strategy:e}})}},h.createElement(W.SelectTrigger,{className:"w-full"},h.createElement(W.SelectValue,{placeholder:a.find(t=>t.value===e.strategy)?.placeHolder})),h.createElement(W.SelectContent,{className:""},a.map(e=>h.createElement(W.SelectItem,{key:e.value,value:e.value},e.label))))),h.createElement("div",{className:"flex-shrink-0"},h.createElement("div",{className:"flex justify-end space-x-2"},h.createElement(W.Button,{variant:"secondary",onClick:()=>n("setStartSliceForROIThresholdTool")},o("Start")),h.createElement(W.Button,{variant:"secondary",onClick:()=>n("setEndSliceForROIThresholdTool")},o("End"))))),e.strategy===Ce&&h.createElement("div",{className:"mr-0"},h.createElement("div",{className:"mb-2"},h.createElement(W.Label,null,o("Percentage of Max SUV"))),h.createElement(W.Input,{"data-cy":"percentage-of-max-suv-input",className:"w-full",type:"text",value:e.weight,onChange:e=>{let n=e.target.value;"."===n&&(n="0."),isNaN(Number(n))||Number(n)<0||Number(n)>1||t({type:"setWeight",payload:{weight:n}})}})),e.strategy!==Ce&&h.createElement("div",{className:"mr-2 text-sm"},h.createElement("div",{className:"flex flex-col space-y-2"},h.createElement(W.Label,null,o("Lower & Upper Ranges")),h.createElement("div",{className:"flex items-center"},h.createElement("div",{className:"w-10 text-left"},h.createElement(W.Label,null,"CT")),h.createElement("div",{className:"flex flex-1 space-x-2"},h.createElement("div",{className:"flex-1"},h.createElement(W.Input,{className:"w-full",type:"text",value:e.ctLower,onChange:e=>{t({type:"setThreshold",payload:{ctLower:e.target.value}})}})),h.createElement("div",{className:"flex-1"},h.createElement(W.Input,{className:"w-full",type:"text",value:e.ctUpper,onChange:e=>{t({type:"setThreshold",payload:{ctUpper:e.target.value}})}})))),h.createElement("div",{className:"flex items-center"},h.createElement("div",{className:"w-10 text-left"},h.createElement(W.Label,null,"PT")),h.createElement("div",{className:"flex flex-1 space-x-2"},h.createElement("div",{className:"flex-1"},h.createElement(W.Input,{className:"w-full",type:"text",value:e.ptLower,onChange:e=>{t({type:"setThreshold",payload:{ptLower:e.target.value}})}})),h.createElement("div",{className:"flex-1"},h.createElement(W.Input,{className:"w-full",type:"text",value:e.ptUpper,onChange:e=>{t({type:"setThreshold",payload:{ptUpper:e.target.value}})}})))))))},Ne=Ce;function Me(e,t){const{payload:n}=t,{strategy:o,ctLower:a,ctUpper:r,ptLower:i,ptUpper:s,weight:c}=n;switch(t.type){case"setStrategy":return{...e,strategy:o};case"setThreshold":return{...e,ctLower:a||e.ctLower,ctUpper:r||e.ctUpper,ptLower:i||e.ptLower,ptUpper:s||e.ptUpper};case"setWeight":return{...e,weight:c};default:return e}}const Pe=function(){const{commandsManager:e}=(0,I.useSystem)(),t=(0,K.useSegmentations)()[0],{t:n}=$("ROIThresholdConfiguration"),o=(0,h.useCallback)((t,n={})=>e.runCommand(t,n),[e]),[a,r]=(0,h.useReducer)(Me,{strategy:Ne,ctLower:-1024,ctUpper:1024,ptLower:2.5,ptUpper:100,weight:.41}),i=(0,h.useCallback)(()=>{if(!t)return;const e=t.segmentationId,n=ie.segmentation.segmentIndex.getActiveSegmentIndex(e);o("thresholdSegmentationByRectangleROITool",{segmentationId:e,config:a,segmentIndex:n})},[t,a]);return h.createElement("div",{className:"invisible-scrollbar mb-1 flex flex-col overflow-y-auto overflow-x-hidden"},h.createElement(De,{config:a,dispatch:r,runCommand:o}),t&&h.createElement(W.Button,{variant:"default",className:"my-3 mr-auto w-20",onClick:i},n("Run")))};const Le={id:e,preRegistration({servicesManager:e,commandsManager:t,extensionManager:n,configuration:o={}}){!function({servicesManager:e}){const{measurementService:t,displaySetService:n,cornerstoneViewportService:o}=e.services;(0,ie.addTool)(ie.RectangleROIStartEndThresholdTool),(0,ie.addTool)(ie.CircleROIStartEndThresholdTool);const{RectangleROIStartEndThreshold:a,CircleROIStartEndThreshold:r}=ue(t,n,o),i=t.getSource(pe,de);t.addMapping(i,"RectangleROIStartEndThreshold",a.matchingCriteria,a.toAnnotation,a.toMeasurement),t.addMapping(i,"CircleROIStartEndThreshold",r.matchingCriteria,r.toAnnotation,r.toMeasurement)}({servicesManager:e,commandsManager:t,extensionManager:n,configuration:o})},getToolbarModule:function(){return[{name:"tmtv.RectangleROIThresholdOptions",defaultComponent:Pe}]},getPanelModule:re,getHangingProtocolModule:y,getCommandsModule:({servicesManager:e,commandsManager:t,extensionManager:n})=>Oe({servicesManager:e,commandsManager:t,extensionManager:n})},Ue=Le})(),f})());
|
|
2
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@cornerstonejs/adapters"),require("@cornerstonejs/core"),require("@cornerstonejs/tools"),require("@ohif/core"),require("@ohif/core/src"),require("@ohif/core/src/utils"),require("@ohif/extension-cornerstone"),require("@ohif/extension-default"),require("@ohif/i18n"),require("@ohif/ui-next"),require("dcmjs")):"function"==typeof define&&define.amd?define(["@cornerstonejs/adapters","@cornerstonejs/core","@cornerstonejs/tools","@ohif/core","@ohif/core/src","@ohif/core/src/utils","@ohif/extension-cornerstone","@ohif/extension-default","@ohif/i18n","@ohif/ui-next","dcmjs"],t):"object"==typeof exports?exports["ohif-extension-tmtv"]=t(require("@cornerstonejs/adapters"),require("@cornerstonejs/core"),require("@cornerstonejs/tools"),require("@ohif/core"),require("@ohif/core/src"),require("@ohif/core/src/utils"),require("@ohif/extension-cornerstone"),require("@ohif/extension-default"),require("@ohif/i18n"),require("@ohif/ui-next"),require("dcmjs")):e["ohif-extension-tmtv"]=t(e["@cornerstonejs/adapters"],e["@cornerstonejs/core"],e["@cornerstonejs/tools"],e["@ohif/core"],e["@ohif/core/src"],e["@ohif/core/src/utils"],e["@ohif/extension-cornerstone"],e["@ohif/extension-default"],e["@ohif/i18n"],e["@ohif/ui-next"],e.dcmjs)}(globalThis,(e,t,n,o,a,r,i,s,c,l,u)=>(()=>{var p={856(e,t,n){"use strict";var o=n(183);function a(){}function r(){}r.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,r,i){if(i!==o){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:r,resetWarningCache:a};return n.PropTypes=n,n}},598(e,t,n){e.exports=n(856)()},183(e){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},249(e,t){"use strict";var n=Symbol.for("react.element"),o=Symbol.for("react.portal"),a=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),c=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),p=Symbol.for("react.memo"),d=Symbol.for("react.lazy"),m=Symbol.iterator;var f={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,y={};function h(e,t,n){this.props=e,this.context=t,this.refs=y,this.updater=n||f}function v(){}function S(e,t,n){this.props=e,this.context=t,this.refs=y,this.updater=n||f}h.prototype.isReactComponent={},h.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},h.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},v.prototype=h.prototype;var I=S.prototype=new v;I.constructor=S,g(I,h.prototype),I.isPureReactComponent=!0;var b=Array.isArray,T=Object.prototype.hasOwnProperty,w={current:null},E={key:!0,ref:!0,__self:!0,__source:!0};function x(e,t,o){var a,r={},i=null,s=null;if(null!=t)for(a in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)T.call(t,a)&&!E.hasOwnProperty(a)&&(r[a]=t[a]);var c=arguments.length-2;if(1===c)r.children=o;else if(1<c){for(var l=Array(c),u=0;u<c;u++)l[u]=arguments[u+2];r.children=l}if(e&&e.defaultProps)for(a in c=e.defaultProps)void 0===r[a]&&(r[a]=c[a]);return{$$typeof:n,type:e,key:i,ref:s,props:r,_owner:w.current}}function R(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var O=/\/+/g;function C(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,function(e){return t[e]})}(""+e.key):t.toString(36)}function D(e,t,a,r,i){var s=typeof e;"undefined"!==s&&"boolean"!==s||(e=null);var c=!1;if(null===e)c=!0;else switch(s){case"string":case"number":c=!0;break;case"object":switch(e.$$typeof){case n:case o:c=!0}}if(c)return i=i(c=e),e=""===r?"."+C(c,0):r,b(i)?(a="",null!=e&&(a=e.replace(O,"$&/")+"/"),D(i,t,a,"",function(e){return e})):null!=i&&(R(i)&&(i=function(e,t){return{$$typeof:n,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(i,a+(!i.key||c&&c.key===i.key?"":(""+i.key).replace(O,"$&/")+"/")+e)),t.push(i)),1;if(c=0,r=""===r?".":r+":",b(e))for(var l=0;l<e.length;l++){var u=r+C(s=e[l],l);c+=D(s,t,a,u,i)}else if(u=function(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=m&&e[m]||e["@@iterator"])?e:null}(e),"function"==typeof u)for(e=u.call(e),l=0;!(s=e.next()).done;)c+=D(s=s.value,t,a,u=r+C(s,l++),i);else if("object"===s)throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.");return c}function N(e,t,n){if(null==e)return e;var o=[],a=0;return D(e,o,"","",function(e){return t.call(n,e,a++)}),o}function M(e){if(-1===e._status){var t=e._result;(t=t()).then(function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)},function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)}),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var P={current:null},L={transition:null},U={ReactCurrentDispatcher:P,ReactCurrentBatchConfig:L,ReactCurrentOwner:w};function j(){throw Error("act(...) is not supported in production builds of React.")}t.Children={map:N,forEach:function(e,t,n){N(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return N(e,function(){t++}),t},toArray:function(e){return N(e,function(e){return e})||[]},only:function(e){if(!R(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=h,t.Fragment=a,t.Profiler=i,t.PureComponent=S,t.StrictMode=r,t.Suspense=u,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=U,t.act=j,t.cloneElement=function(e,t,o){if(null==e)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+e+".");var a=g({},e.props),r=e.key,i=e.ref,s=e._owner;if(null!=t){if(void 0!==t.ref&&(i=t.ref,s=w.current),void 0!==t.key&&(r=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(l in t)T.call(t,l)&&!E.hasOwnProperty(l)&&(a[l]=void 0===t[l]&&void 0!==c?c[l]:t[l])}var l=arguments.length-2;if(1===l)a.children=o;else if(1<l){c=Array(l);for(var u=0;u<l;u++)c[u]=arguments[u+2];a.children=c}return{$$typeof:n,type:e.type,key:r,ref:i,props:a,_owner:s}},t.createContext=function(e){return(e={$$typeof:c,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null}).Provider={$$typeof:s,_context:e},e.Consumer=e},t.createElement=x,t.createFactory=function(e){var t=x.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:l,render:e}},t.isValidElement=R,t.lazy=function(e){return{$$typeof:d,_payload:{_status:-1,_result:e},_init:M}},t.memo=function(e,t){return{$$typeof:p,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=L.transition;L.transition={};try{e()}finally{L.transition=t}},t.unstable_act=j,t.useCallback=function(e,t){return P.current.useCallback(e,t)},t.useContext=function(e){return P.current.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e){return P.current.useDeferredValue(e)},t.useEffect=function(e,t){return P.current.useEffect(e,t)},t.useId=function(){return P.current.useId()},t.useImperativeHandle=function(e,t,n){return P.current.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return P.current.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return P.current.useLayoutEffect(e,t)},t.useMemo=function(e,t){return P.current.useMemo(e,t)},t.useReducer=function(e,t,n){return P.current.useReducer(e,t,n)},t.useRef=function(e){return P.current.useRef(e)},t.useState=function(e){return P.current.useState(e)},t.useSyncExternalStore=function(e,t,n){return P.current.useSyncExternalStore(e,t,n)},t.useTransition=function(){return P.current.useTransition()},t.version="18.3.1"},326(e,t,n){"use strict";e.exports=n(249)},741(e){e.exports={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}},142(t){"use strict";t.exports=e},557(e){"use strict";e.exports=t},713(e){"use strict";e.exports=n},2(e){"use strict";e.exports=o},459(e){"use strict";e.exports=a},141(e){"use strict";e.exports=r},669(e){"use strict";e.exports=i},438(e){"use strict";e.exports=s},545(e){"use strict";e.exports=c},55(e){"use strict";e.exports=l},111(e){"use strict";e.exports=u}},d={};function m(e){var t=d[e];if(void 0!==t)return t.exports;var n=d[e]={exports:{}};return p[e](n,n.exports,m),n.exports}m.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return m.d(t,{a:t}),t},m.d=(e,t)=>{for(var n in t)m.o(t,n)&&!m.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},m.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),m.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var f={};return(()=>{"use strict";m.r(f),m.d(f,{default:()=>Ue});const e=JSON.parse('{"UU":"@ohif/extension-tmtv"}').UU,t=e=>({type:"cameraPosition",id:e,source:!0,target:!0}),n={type:"hydrateseg",id:"sameFORId",source:!0,target:!0,options:{matchingRules:["sameFOR"]}},o={viewportOptions:{viewportId:"ctAXIAL",viewportType:"volume",orientation:"axial",toolGroupId:"ctToolGroup",initialImageOptions:{preset:"first"},syncGroups:[t("axialSync"),{type:"voi",id:"ctWLSync",source:!0,target:!0,options:{syncColormap:!0}},n]},displaySets:[{id:"ctDisplaySet"}]},a={viewportOptions:{viewportId:"ctSAGITTAL",viewportType:"volume",orientation:"sagittal",toolGroupId:"ctToolGroup",syncGroups:[t("sagittalSync"),{type:"voi",id:"ctWLSync",source:!0,target:!0,options:{syncColormap:!0}},n]},displaySets:[{id:"ctDisplaySet"}]},r={viewportOptions:{viewportId:"ctCORONAL",viewportType:"volume",orientation:"coronal",toolGroupId:"ctToolGroup",syncGroups:[t("coronalSync"),{type:"voi",id:"ctWLSync",source:!0,target:!0,options:{syncColormap:!0}},n]},displaySets:[{id:"ctDisplaySet"}]},i={viewportOptions:{viewportId:"ptAXIAL",viewportType:"volume",background:[1,1,1],orientation:"axial",toolGroupId:"ptToolGroup",initialImageOptions:{preset:"first"},syncGroups:[t("axialSync"),{type:"voi",id:"ptWLSync",source:!0,target:!0,options:{syncColormap:!0}},{type:"voi",id:"ptFusionWLSync",source:!0,target:!1,options:{syncColormap:!1,syncInvertState:!1}},n]},displaySets:[{options:{voi:{custom:"getPTVOIRange"},voiInverted:!0},id:"ptDisplaySet"}]},s={viewportOptions:{viewportId:"ptSAGITTAL",viewportType:"volume",orientation:"sagittal",background:[1,1,1],toolGroupId:"ptToolGroup",syncGroups:[t("sagittalSync"),{type:"voi",id:"ptWLSync",source:!0,target:!0,options:{syncColormap:!0}},{type:"voi",id:"ptFusionWLSync",source:!0,target:!1,options:{syncColormap:!1,syncInvertState:!1}},n]},displaySets:[{options:{voi:{custom:"getPTVOIRange"},voiInverted:!0},id:"ptDisplaySet"}]},c={viewportOptions:{viewportId:"ptCORONAL",viewportType:"volume",orientation:"coronal",background:[1,1,1],toolGroupId:"ptToolGroup",syncGroups:[t("coronalSync"),{type:"voi",id:"ptWLSync",source:!0,target:!0,options:{syncColormap:!0}},{type:"voi",id:"ptFusionWLSync",source:!0,target:!1,options:{syncColormap:!1,syncInvertState:!1}},n]},displaySets:[{options:{voi:{custom:"getPTVOIRange"},voiInverted:!0},id:"ptDisplaySet"}]},l={viewportOptions:{viewportId:"fusionAXIAL",viewportType:"volume",orientation:"axial",toolGroupId:"fusionToolGroup",initialImageOptions:{preset:"first"},syncGroups:[t("axialSync"),{type:"voi",id:"ctWLSync",source:!1,target:!0},{type:"voi",id:"fusionWLSync",source:!0,target:!0,options:{syncColormap:!0}},{type:"voi",id:"ptFusionWLSync",source:!1,target:!0,options:{syncColormap:!1,syncInvertState:!1}},n]},displaySets:[{id:"ctDisplaySet"},{id:"ptDisplaySet",options:{colormap:{name:"hsv",opacity:[{value:0,opacity:0},{value:.1,opacity:.8},{value:1,opacity:.9}]},voi:{custom:"getPTVOIRange"}}}]},u={viewportOptions:{viewportId:"fusionSAGITTAL",viewportType:"volume",orientation:"sagittal",toolGroupId:"fusionToolGroup",syncGroups:[t("sagittalSync"),{type:"voi",id:"ctWLSync",source:!1,target:!0},{type:"voi",id:"fusionWLSync",source:!0,target:!0,options:{syncColormap:!0}},{type:"voi",id:"ptFusionWLSync",source:!1,target:!0,options:{syncColormap:!1,syncInvertState:!1}},n]},displaySets:[{id:"ctDisplaySet"},{id:"ptDisplaySet",options:{colormap:{name:"hsv",opacity:[{value:0,opacity:0},{value:.1,opacity:.8},{value:1,opacity:.9}]},voi:{custom:"getPTVOIRange"}}}]},p={viewportOptions:{viewportId:"fusionCoronal",viewportType:"volume",orientation:"coronal",toolGroupId:"fusionToolGroup",syncGroups:[t("coronalSync"),{type:"voi",id:"ctWLSync",source:!1,target:!0},{type:"voi",id:"fusionWLSync",source:!0,target:!0,options:{syncColormap:!0}},{type:"voi",id:"ptFusionWLSync",source:!1,target:!0,options:{syncColormap:!1,syncInvertState:!1}},n]},displaySets:[{id:"ctDisplaySet"},{id:"ptDisplaySet",options:{colormap:{name:"hsv",opacity:[{value:0,opacity:0},{value:.1,opacity:.8},{value:1,opacity:.9}]},voi:{custom:"getPTVOIRange"}}}]},d={viewportOptions:{viewportId:"mipSagittal",viewportType:"volume",orientation:"sagittal",background:[1,1,1],toolGroupId:"mipToolGroup",syncGroups:[{type:"voi",id:"ptWLSync",source:!0,target:!0,options:{syncColormap:!0}},{type:"voi",id:"ptFusionWLSync",source:!0,target:!1,options:{syncColormap:!1,syncInvertState:!1}},n],customViewportProps:{hideOverlays:!0}},displaySets:[{options:{blendMode:"MIP",slabThickness:"fullVolume",voi:{custom:"getPTVOIRange"},voiInverted:!0},id:"ptDisplaySet"}]},g={id:"@ohif/extension-tmtv.hangingProtocolModule.ptCT",locked:!0,name:"Default",createdDate:"2021-02-23T19:22:08.894Z",modifiedDate:"2022-10-04T19:22:08.894Z",availableTo:{},editableBy:{},imageLoadStrategy:"interleaveTopToBottom",protocolMatchingRules:[{attribute:"ModalitiesInStudy",constraint:{contains:["CT","PT"]}},{attribute:"StudyDescription",constraint:{contains:"PETCT"}},{attribute:"StudyDescription",constraint:{contains:"PET/CT"}}],displaySetSelectors:{ctDisplaySet:{seriesMatchingRules:[{attribute:"Modality",constraint:{equals:{value:"CT"}},required:!0},{attribute:"isReconstructable",constraint:{equals:{value:!0}},required:!0},{attribute:"SeriesDescription",constraint:{contains:"CT"}},{attribute:"SeriesDescription",constraint:{contains:"CT WB"}}]},ptDisplaySet:{seriesMatchingRules:[{attribute:"Modality",constraint:{equals:"PT"},required:!0},{attribute:"isReconstructable",constraint:{equals:{value:!0}},required:!0},{attribute:"SeriesDescription",constraint:{contains:"Corrected"}},{weight:2,attribute:"SeriesDescription",constraint:{doesNotContain:{value:"Uncorrected"}}}]}},stages:[{name:"default",id:"default",viewportStructure:{layoutType:"grid",properties:{rows:3,columns:4,layoutOptions:[{x:0,y:0,width:1/4,height:1/3},{x:1/4,y:0,width:1/4,height:1/3},{x:.5,y:0,width:1/4,height:1/3},{x:0,y:1/3,width:1/4,height:1/3},{x:1/4,y:1/3,width:1/4,height:1/3},{x:.5,y:1/3,width:1/4,height:1/3},{x:0,y:2/3,width:1/4,height:1/3},{x:1/4,y:2/3,width:1/4,height:1/3},{x:.5,y:2/3,width:1/4,height:1/3},{x:3/4,y:0,width:1/4,height:1}]}},viewports:[o,a,r,i,s,c,l,u,p,d],createdDate:"2021-02-23T18:32:42.850Z"},{name:"Fusion 2x2",id:"Fusion-2x2",viewportStructure:{layoutType:"grid",properties:{rows:2,columns:2}},viewports:[o,l,i,d]},{name:"2x3-layout",id:"2x3-layout",viewportStructure:{layoutType:"grid",properties:{rows:2,columns:3}},viewports:[o,a,r,i,s,c]},{name:"2x4-layout",id:"2x4-layout",viewportStructure:{layoutType:"grid",properties:{rows:2,columns:4,layoutOptions:[{x:0,y:0,width:1/4,height:.5},{x:1/4,y:0,width:1/4,height:.5},{x:.5,y:0,width:1/4,height:.5},{x:3/4,y:0,width:1/4,height:1},{x:0,y:.5,width:1/4,height:.5},{x:1/4,y:.5,width:1/4,height:.5},{x:.5,y:.5,width:1/4,height:.5}]}},viewports:[c,s,i,d,p,u,l]}],numberOfPriorsReferenced:-1};const y=function(){return[{name:g.id,protocol:g}]};var h=m(326),v=m(598),S=m.n(v),I=m(2),b=m.n(I);function T(e){return T="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},T(e)}function w(e){var t=function(e,t){if("object"!=T(e)||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var o=n.call(e,t||"default");if("object"!=T(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==T(t)?t:t+""}function E(e,t,n){return(t=w(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}m(741);Object.create(null);function x(){if(console&&console.warn){for(var e,t=arguments.length,n=new Array(t),o=0;o<t;o++)n[o]=arguments[o];"string"==typeof n[0]&&(n[0]="react-i18next:: ".concat(n[0])),(e=console).warn.apply(e,n)}}var R={};function O(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];"string"==typeof t[0]&&R[t[0]]||("string"==typeof t[0]&&(R[t[0]]=new Date),x.apply(void 0,t))}var C=function(e,t){return function(){if(e.isInitialized)t();else{e.on("initialized",function n(){setTimeout(function(){e.off("initialized",n)},0),t()})}}};function D(e,t,n){e.loadNamespaces(t,C(e,n))}function N(e,t,n,o){"string"==typeof n&&(n=[n]),n.forEach(function(t){e.options.ns.indexOf(t)<0&&e.options.ns.push(t)}),e.loadLanguages(t,C(e,o))}var M=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,P={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'," ":" "," ":" ","©":"©","©":"©","®":"®","®":"®","…":"…","…":"…","/":"/","/":"/"},L=function(e){return P[e]};var U,j={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:function(e){return e.replace(M,L)}};function _(e,t){for(var n=0;n<t.length;n++){var o=t[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,w(o.key),o)}}var k=(0,h.createContext)(),A=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.usedNamespaces={}}return function(e,t,n){t&&_(e.prototype,t),n&&_(e,n),Object.defineProperty(e,"prototype",{writable:!1})}(e,[{key:"addUsedNamespaces",value:function(e){var t=this;e.forEach(function(e){t.usedNamespaces[e]||(t.usedNamespaces[e]=!0)})}},{key:"getUsedNamespaces",value:function(){return Object.keys(this.usedNamespaces)}}]),e}();function F(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=Array(t);n<t;n++)o[n]=e[n];return o}function V(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var o,a,r,i,s=[],c=!0,l=!1;try{if(r=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(o=r.call(n)).done)&&(s.push(o.value),s.length!==t);c=!0);}catch(e){l=!0,a=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(l)throw a}}return s}}(e,t)||function(e,t){if(e){if("string"==typeof e)return F(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?F(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function q(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,o)}return n}function G(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?q(Object(n),!0).forEach(function(t){E(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):q(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function $(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.i18n,o=(0,h.useContext)(k)||{},a=o.i18n,r=o.defaultNS,i=n||a||U;if(i&&!i.reportNamespaces&&(i.reportNamespaces=new A),!i){O("You will need to pass in an i18next instance by using initReactI18next");var s=function(e,t){return"string"==typeof t?t:t&&"object"===T(t)&&"string"==typeof t.defaultValue?t.defaultValue:Array.isArray(e)?e[e.length-1]:e},c=[s,{},!1];return c.t=s,c.i18n={},c.ready=!1,c}i.options.react&&void 0!==i.options.react.wait&&O("It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.");var l=G(G(G({},j),i.options.react),t),u=l.useSuspense,p=l.keyPrefix,d=e||r||i.options&&i.options.defaultNS;d="string"==typeof d?[d]:d||["translation"],i.reportNamespaces.addUsedNamespaces&&i.reportNamespaces.addUsedNamespaces(d);var m=(i.isInitialized||i.initializedStoreOnce)&&d.every(function(e){return function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return t.languages&&t.languages.length?void 0!==t.options.ignoreJSONStructure?t.hasLoadedNamespace(e,{lng:n.lng,precheck:function(t,o){if(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!o(t.isLanguageChangingTo,e))return!1}}):function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=t.languages[0],a=!!t.options&&t.options.fallbackLng,r=t.languages[t.languages.length-1];if("cimode"===o.toLowerCase())return!0;var i=function(e,n){var o=t.services.backendConnector.state["".concat(e,"|").concat(n)];return-1===o||2===o};return!(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!i(t.isLanguageChangingTo,e)||!t.hasResourceBundle(o,e)&&t.services.backendConnector.backend&&(!t.options.resources||t.options.partialBundledLanguages)&&(!i(o,e)||a&&!i(r,e)))}(e,t,n):(O("i18n.languages were undefined or empty",t.languages),!0)}(e,i,l)});function f(){return i.getFixedT(t.lng||null,"fallback"===l.nsMode?d:d[0],p)}var g=V((0,h.useState)(f),2),y=g[0],v=g[1],S=d.join();t.lng&&(S="".concat(t.lng).concat(S));var I,b,w,E=(I=S,w=(0,h.useRef)(),(0,h.useEffect)(function(){w.current=b?w.current:I},[I,b]),w.current),x=(0,h.useRef)(!0);(0,h.useEffect)(function(){var e=l.bindI18n,n=l.bindI18nStore;function o(){x.current&&v(f)}return x.current=!0,m||u||(t.lng?N(i,t.lng,d,function(){x.current&&v(f)}):D(i,d,function(){x.current&&v(f)})),m&&E&&E!==S&&x.current&&v(f),e&&i&&i.on(e,o),n&&i&&i.store.on(n,o),function(){x.current=!1,e&&i&&e.split(" ").forEach(function(e){return i.off(e,o)}),n&&i&&n.split(" ").forEach(function(e){return i.store.off(e,o)})}},[i,S]);var R=(0,h.useRef)(!0);(0,h.useEffect)(function(){x.current&&!R.current&&v(f),R.current=!1},[i,p]);var C=[y,i,m];if(C.t=y,C.i18n=i,C.ready=m,m)return C;if(!m&&!u)return C;throw new Promise(function(e){t.lng?N(i,t.lng,d,function(){return e()}):D(i,d,function(){return e()})})}var W=m(55),B=m(459);function H(){return H=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)({}).hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},H.apply(null,arguments)}const z={PatientWeight:null,PatientSex:null,SeriesTime:null,RadiopharmaceuticalInformationSequence:{RadionuclideTotalDose:null,RadionuclideHalfLife:null,RadiopharmaceuticalStartTime:null}},Y=({children:e,className:t,...n})=>h.createElement("div",H({className:`flex flex-row items-center space-x-4 ${t||""}`},n),e);function J(){const{commandsManager:e,servicesManager:t}=(0,B.useSystem)(),{t:n}=$("PanelSUV"),{displaySetService:o,hangingProtocolService:a}=t.services,[r,i]=(0,h.useState)(z),[s,c]=(0,h.useState)(null),l=e=>{i(t=>{const n={...t};return Object.keys(e).forEach(o=>{"object"==typeof e[o]?n[o]={...t[o],...e[o]}:n[o]=e[o]}),n})},u=t=>{const n=e.runCommand("getMatchingPTDisplaySet",{viewportMatchDetails:t});if(!n)return;return{ptDisplaySet:n,metadata:e.runCommand("getPTMetadata",{ptDisplaySet:n})}};return(0,h.useEffect)(()=>{const e=o.getActiveDisplaySets(),{viewportMatchDetails:t}=a.getMatchDetails();if(!e.length)return;const n=u(t);if(!n)return;const{ptDisplaySet:r,metadata:s}=n;c(r),i(s)},[]),(0,h.useEffect)(()=>{const{unsubscribe:e}=a.subscribe(a.EVENTS.PROTOCOL_CHANGED,({viewportMatchDetails:e})=>{const t=u(e);if(!t)return;const{ptDisplaySet:n,metadata:o}=t;c(n),i(o)});return()=>{e()}},[]),h.createElement(h.Fragment,null,h.createElement("div",{className:"ohif-scrollbar flex min-h-0 flex-auto select-none flex-col justify-between overflow-auto"},h.createElement("div",{className:"flex min-h-0 flex-1 flex-col bg-background text-base"},h.createElement(W.PanelSection,{defaultOpen:!0},h.createElement(W.PanelSection.Header,null,n("Patient Information")),h.createElement(W.PanelSection.Content,null,h.createElement("div",{className:"bg-muted flex flex-col gap-3 p-2"},h.createElement(Y,null,h.createElement(Y.Label,null,n("Patient Sex")),h.createElement(Y.Input,{value:r.PatientSex||"",onChange:e=>{l({PatientSex:e.target.value})}})),h.createElement(Y,null,h.createElement(Y.Label,{unit:"kg"},n("Weight")),h.createElement(Y.Input,{value:r.PatientWeight||"",onChange:e=>{l({PatientWeight:e.target.value})},id:"weight-input"})),h.createElement(Y,null,h.createElement(Y.Label,{unit:"bq"},n("Total Dose")),h.createElement(Y.Input,{value:r.RadiopharmaceuticalInformationSequence.RadionuclideTotalDose||"",onChange:e=>{l({RadiopharmaceuticalInformationSequence:{RadionuclideTotalDose:e.target.value}})}})),h.createElement(Y,null,h.createElement(Y.Label,{unit:"s"},n("Half Life")),h.createElement(Y.Input,{value:r.RadiopharmaceuticalInformationSequence.RadionuclideHalfLife||"",onChange:e=>{l({RadiopharmaceuticalInformationSequence:{RadionuclideHalfLife:e.target.value}})}})),h.createElement(Y,null,h.createElement(Y.Label,{unit:"s"},n("Injection Time")),h.createElement(Y.Input,{value:r.RadiopharmaceuticalInformationSequence.RadiopharmaceuticalStartTime||"",onChange:e=>{l({RadiopharmaceuticalInformationSequence:{RadiopharmaceuticalStartTime:e.target.value}})}})),h.createElement(Y,null,h.createElement(Y.Label,{unit:"s"},n("Acquisition Time")),h.createElement(Y.Input,{value:r.SeriesTime||"",onChange:()=>{}})),h.createElement(W.Button,{variant:"default",size:"sm",className:"self-end px-4",onClick:function(){if(!s)throw new Error("No ptDisplaySet found");I.DicomMetadataStore.updateMetadataForSeries(s.StudyInstanceUID,s.SeriesInstanceUID,r),o.setDisplaySetMetadataInvalidated(s.displaySetInstanceUID),setTimeout(()=>{e.runCommand("resetCrosshairs")},0)}},n("Reload Data"))))))))}Y.Label=({children:e,unit:t,className:n,...o})=>h.createElement(W.Label,H({className:`min-w-32 flex-shrink-0 ${n||""}`},o),e,t&&h.createElement("span",{className:"text-muted-foreground"}," ",t)),Y.Input=({className:e,...t})=>h.createElement(W.Input,H({className:`h-7 flex-1 ${e||""}`},t)),Y.Label.displayName="InputRow.Label",Y.Input.displayName="InputRow.Input",J.propTypes={servicesManager:S().shape({services:S().shape({measurementService:S().shape({getMeasurements:S().func.isRequired,subscribe:S().func.isRequired,EVENTS:S().object.isRequired,VALUE_TYPES:S().object.isRequired}).isRequired}).isRequired}).isRequired};var K=m(669);const X=async({commandsManager:e,segmentationService:t})=>{const n=t.getSegmentations(),o=await e.run("calculateTMTV",{segmentations:n});n.forEach(e=>{e.cachedStats={...e.cachedStats,tmtv:o},t.addOrUpdateSegmentation(e)})};var Z=m(141);function Q(){const{commandsManager:e,servicesManager:t}=(0,B.useSystem)(),{segmentationService:n}=t.services,{segmentationsWithRepresentations:o}=(0,K.useActiveViewportSegmentationRepresentations)(),a=o?.map(e=>e.segmentation.segmentationId)||[],r=o?.map(e=>e.segmentation)||[];(0,h.useEffect)(()=>{(async()=>{for(const t of a)await X({segmentationId:t,commandsManager:e,segmentationService:n})})()},[]),(0,h.useEffect)(()=>{const t=(0,Z.debounce)(async t=>{const{segmentationId:o}=t;await X({segmentationId:o,commandsManager:e,segmentationService:n})},100),o=n.subscribe(n.EVENTS.SEGMENTATION_DATA_MODIFIED,e=>{t(e)});return()=>{o.unsubscribe()}},[e,n]);const i=n.getSegmentationGroupStats(a),s=i?.tmtv;return h.createElement("div",{className:"mb-1 flex flex-col"},h.createElement("div",{className:"invisible-scrollbar overflow-y-auto overflow-x-hidden"},h.createElement("div",{className:"bg-popover flex items-baseline justify-between px-2 py-1"},h.createElement("div",{className:"py-1"},h.createElement("span",{className:"text-muted-foreground text-base font-bold uppercase"},"TMTV: "),h.createElement("span",{className:"text-foreground"},s?`${s.toFixed(3)} mL`:"")),h.createElement("div",{className:"flex items-center"},h.createElement(W.Button,{dataCY:"exportTmtvCsvReport",size:"sm",variant:"ghost",onClick:()=>{r.length&&e.runCommand("exportTMTVReportCSV",{segmentations:r,tmtv:s,config:{}})}},h.createElement("span",{className:"pl-1"},"CSV"))))))}const ee=Q;var te=m(438);function ne({configuration:e}){return h.createElement(h.Fragment,null,h.createElement(K.PanelSegmentation,{configuration:e},h.createElement(Q,null)))}var oe=m(545),ae=m.n(oe);const re=function({commandsManager:e,extensionManager:t,servicesManager:n}){const{toolbarService:o}=n.services;return[{name:"petSUV",iconName:"tab-patient-info",iconLabel:"Patient Info",label:"Patient Info",component:()=>h.createElement(J,null)},{name:"tmtv",iconName:"tab-segmentation",iconLabel:"Segmentation",component:()=>h.createElement(h.Fragment,null,h.createElement(te.Toolbox,{buttonSectionId:o.sections.roiThresholdToolbox,title:ae().t("ROIThresholdConfiguration:Threshold Tools")}),h.createElement(ne,{commandsManager:e,servicesManager:n}))},{name:"tmtvBox",iconName:"tab-segmentation",iconLabel:"Segmentation",label:"Segmentation Toolbox",component:()=>h.createElement(te.Toolbox,{buttonSectionId:o.sections.roiThresholdToolbox,title:ae().t("ROIThresholdConfiguration:Threshold Tools")})},{name:"tmtvExport",iconName:"tab-segmentation",iconLabel:"Segmentation",label:"Segmentation Export",component:()=>h.createElement(ee,null)}]};var ie=m(713);const se=["RectangleROIStartEndThreshold","CircleROIStartEndThreshold"],ce={toAnnotation:(e,t)=>{},toMeasurement:(e,t,n)=>{const{annotation:o,viewportId:a}=e,{metadata:r,data:i,annotationUID:s}=o;if(!r||!i)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:c,referencedImageId:l,FrameOfReferenceUID:u}=r;if(!se.includes(c))throw new Error("Tool not supported");const{SOPInstanceUID:p,SeriesInstanceUID:d,StudyInstanceUID:m}=(0,K.getSOPInstanceAttributes)(l,n,a);let f;return f=p?t.getDisplaySetForSOPInstanceUID(p,d):t.getDisplaySetsForSeries(d),{uid:s,SOPInstanceUID:p,FrameOfReferenceUID:u,metadata:r,referenceSeriesUID:d,referenceStudyUID:m,toolName:r.toolName,displaySetInstanceUID:f.displaySetInstanceUID,label:r.label,data:i.cachedStats,type:"RectangleROIStartEndThreshold"}}},le={toAnnotation:(e,t)=>{},toMeasurement:(e,t,n)=>{const{annotation:o,viewportId:a}=e,{metadata:r,data:i,annotationUID:s}=o;if(!r||!i)return console.warn("Length tool: Missing metadata or data"),null;const{toolName:c,referencedImageId:l,FrameOfReferenceUID:u}=r;if(!se.includes(c))throw new Error("Tool not supported");const{SOPInstanceUID:p,SeriesInstanceUID:d,StudyInstanceUID:m}=(0,K.getSOPInstanceAttributes)(l,n,a);let f;f=p?t.getDisplaySetForSOPInstanceUID(p,d):t.getDisplaySetsForSeries(d);const{cachedStats:g}=i;return{uid:s,SOPInstanceUID:p,FrameOfReferenceUID:u,metadata:r,referenceSeriesUID:d,referenceStudyUID:m,toolName:r.toolName,displaySetInstanceUID:f.displaySetInstanceUID,label:r.label,data:i.cachedStats,type:"CircleROIStartEndThreshold"}}},ue=(e,t,n)=>({RectangleROIStartEndThreshold:{toAnnotation:ce.toAnnotation,toMeasurement:e=>ce.toMeasurement(e,t,n),matchingCriteria:[{valueType:e.VALUE_TYPES.ROI_THRESHOLD_MANUAL}]},CircleROIStartEndThreshold:{toAnnotation:le.toAnnotation,toMeasurement:e=>le.toMeasurement(e,t,n),matchingCriteria:[{valueType:e.VALUE_TYPES.ROI_THRESHOLD_MANUAL}]}}),{CORNERSTONE_3D_TOOLS_SOURCE_NAME:pe,CORNERSTONE_3D_TOOLS_SOURCE_VERSION:de}=K.Enums;var me=m(557);function fe(e,t){const{imageIds:n}=e,o=me.cache.getVolumeContainingImageId(n[0]);if(!o)throw new Error("No volume found for display set");const{volume:a}=o,{voxelManager:r}=a,{fn:i,baseValue:s}=function(){const e=-1/0,t=(e,t)=>(e>t&&(t=e),t);return{fn:t,baseValue:e}}();let c=s;const l=ie.utilities.rectangleROITool.getBoundsIJKFromRectangleAnnotations(t,a);return r.forEach(({value:e})=>{c=i(e,c)},{boundsIJK:l}),c}const ge=function(e,t,n){if("range"===n.strategy)return{ptLower:Number(n.ptLower),ptUpper:Number(n.ptUpper),ctLower:Number(n.ctLower),ctUpper:Number(n.ctUpper)};const{weight:o}=n;return{ctLower:-1/0,ctUpper:1/0,ptLower:o*fe(t,e.map(e=>ie.annotation.state.getAnnotation(e))),ptUpper:1/0}},{downloadCsv:ye}=I.utils;var he=m(111),ve=m.n(he),Se=m(142);const{datasetToBlob:Ie}=ve().data,be=I.classes.MetadataProvider;const Te=function(e){const t=Se.adaptersRT.Cornerstone3D.RTSS.generateRTSSFromAnnotations(e,be,I.DicomMetadataStore),n=Ie(t);var o=URL.createObjectURL(n);window.location.assign(o)},{SegmentationRepresentations:we}=ie.Enums,{formatPN:Ee}=I.utils,xe=I.classes.MetadataProvider,Re=["RectangleROIStartEndThreshold","RectangleROIThreshold","CircleROIStartEndThreshold"],Oe=({servicesManager:e,commandsManager:t,extensionManager:n})=>{const{viewportGridService:o,uiNotificationService:a,displaySetService:r,hangingProtocolService:i,toolGroupService:s,cornerstoneViewportService:c,segmentationService:l}=e.services,u=n.getModuleEntry("@ohif/extension-cornerstone.utilityModule.common"),{getEnabledElement:p}=u.exports;function d(){const{activeViewportId:e}=o.getState(),{element:t}=p(e)||{};return me.getEnabledElement(t)}function m(e){return e.reduce((e,t)=>{const n=ie.annotation.selection.getAnnotationsSelectedByToolName(t);return e.concat(n)},[])}const f={getMatchingPTDisplaySet:({viewportMatchDetails:e})=>{let t=null;for(const[,n]of e){const{displaySetsInfo:e}=n,o=e.map(({displaySetInstanceUID:e})=>r.getDisplaySetByUID(e));if(o&&0!==o.length&&(t=o.find(e=>"PT"===e.Modality),t))break}return t},getPTMetadata:({ptDisplaySet:e})=>{const t=n.getDataSources()[0].getImageIdsForDisplaySet(e)[0],o=xe.get("instance",t);if("PT"!==o.Modality)return;return{SeriesTime:o.SeriesTime,Modality:o.Modality,PatientSex:o.PatientSex,PatientWeight:o.PatientWeight,RadiopharmaceuticalInformationSequence:{RadionuclideTotalDose:o.RadiopharmaceuticalInformationSequence[0].RadionuclideTotalDose,RadionuclideHalfLife:o.RadiopharmaceuticalInformationSequence[0].RadionuclideHalfLife,RadiopharmaceuticalStartTime:o.RadiopharmaceuticalInformationSequence[0].RadiopharmaceuticalStartTime,RadiopharmaceuticalStartDateTime:o.RadiopharmaceuticalInformationSequence[0].RadiopharmaceuticalStartDateTime}}},createNewLabelmapFromPT:async({label:e})=>{const{viewportMatchDetails:t}=i.getMatchDetails(),n=f.getMatchingPTDisplaySet({viewportMatchDetails:t});let o=null;for(const[e,{displaySetsInfo:a}]of t.entries()){if(a.some(({displaySetInstanceUID:e})=>e===n.displaySetInstanceUID)){o=e;break}}if(!n)return void a.error("No matching PT display set found");const s=l.getSegmentationRepresentations(o),c=r.getDisplaySetByUID(n.displaySetInstanceUID),u=await l.createLabelmapForDisplaySet(c,{label:`Segmentation ${s.length+1}`,segments:{1:{label:`${ae().t("Segment")} 1`,active:!0}}});return l.addSegmentationRepresentation(o,{segmentationId:u}),u},thresholdSegmentationByRectangleROITool:({segmentationId:e,config:t,segmentIndex:n})=>{const o=ie.segmentation.state.getSegmentation(e),{representationData:s}=o,{displaySetMatchDetails:c}=i.getMatchDetails(),l=c.get("ctDisplaySet"),u=c.get("ptDisplaySet"),p=r.getDisplaySetByUID(l.displaySetInstanceUID),d=r.getDisplaySetByUID(u.displaySetInstanceUID),{volumeId:f}=s[we.Labelmap],g=me.cache.getVolume(f),y=m(Re);if(0===y.length)return void a.show({title:"Commands Module",message:"No ROIThreshold Tool is Selected",type:"error"});const{ptLower:h,ptUpper:v,ctLower:S,ctUpper:I}=ge(y,d,t),{imageIds:b}=d,T=me.cache.getVolumeContainingImageId(b[0]);if(!T)return void a.error("No PT volume found");const{imageIds:w}=p,E=me.cache.getVolumeContainingImageId(w[0]);if(!E)return void a.error("No CT volume found");const x=T.volume,R=E.volume;return ie.utilities.segmentation.rectangleROIThresholdVolumeByRange(y,g,[{volume:x,lower:h,upper:v},{volume:R,lower:S,upper:I}],{overwrite:!0,segmentIndex:n,segmentationId:e})},calculateTMTV:async({segmentations:e})=>{const t=e.map(e=>e.segmentationId),n=await ie.utilities.segmentation.computeMetabolicStats({segmentationIds:t,segmentIndex:1});return l.setSegmentationGroupStats(t,n),n},exportTMTVReportCSV:async({segmentations:e,tmtv:n,config:o,options:a})=>{const r=t.runCommand("getSegmentationCSVReport",{segmentations:e});let i=0;for(const e in r){i+=r[e].namedStats_lesionGlycolysis.value}const s=[{key:"Total Lesion Glycolysis",value:{tlg:i.toFixed(4)}},{key:"Threshold Configuration",value:{...o}}];void 0!==n&&s.unshift({key:"Total Metabolic Tumor Volume",value:{tmtv:n}}),function(e,t,n={}){const o=e[Object.keys(e)[0]],a=Object.keys(o),r=[a.map(e=>e.toLowerCase().startsWith("namedstats_")?e.substring(11):e).join(",")];Object.values(e).forEach(e=>{const t=[];a.forEach(n=>{t.push(e[n]&&"object"==typeof e[n]?Array.isArray(e[n])?e[n].join(" "):e[n].value&&Array.isArray(e[n].value)?e[n].value.join(" "):e[n].value??e[n]:e[n])}),r.push(t.join(","))}),r.push(""),r.push(""),r.push(""),r.push(`Patient ID,${o.PatientID}`),r.push(`Study Date,${o.StudyDate}`),r.push(""),t.forEach(({key:e,value:t})=>{const n=[];n.push(`${e}`),Object.keys(t).forEach(e=>{n.push(`${e}`),n.push(`${t[e]}`)}),r.push(n.join(","))}),ye(r.join("\n"),{filename:n.filename??`${o.PatientID}_tmtv.csv`})}(r,s,a)},setStartSliceForROIThresholdTool:()=>{const{viewport:e}=d(),{focalPoint:t}=e.getCamera(),n=m(Re)[0],o=ie.annotation.state.getAnnotation(n);o.data.startCoordinate=t,o.invalidated=!0,e.render()},setEndSliceForROIThresholdTool:()=>{const{viewport:e}=d(),t=m(Re)[0],n=ie.annotation.state.getAnnotation(t),o=e.getCamera().focalPoint;n.data.endCoordinate=o,n.invalidated=!0,e.render()},createTMTVRTReport:()=>{const e=ie.annotation.state.getAnnotationManager(),n=[];Object.keys(e.annotations).forEach(t=>{const o=e.annotations[t],a=Re.reduce((e,t)=>[...e,...o[t]??[]],[]);n.push(...a)}),t.runCommand("exportRTReportForAnnotations",{annotations:n})},getSegmentationCSVReport:({segmentations:e})=>{e&&e.length||(e=l.getSegmentations());const t={};for(const n of e){const{label:e,segmentationId:o,representationData:a}=n,r=o,i={id:r,label:e};if(!a){t[r]=i;continue}const{cachedStats:s}=n.segments[1]||{};s&&Object.entries(s).forEach(([e,t])=>{"object"!=typeof t?i[e]=t:Object.entries(t).forEach(([t,n])=>{i[`${e}_${t}`]=n})});const c=n.representationData[we.Labelmap];if(!c){t[r]=i;continue}const l=ie.utilities.segmentation.getReferenceVolumeForSegmentationVolume(c.volumeId);if(!l){t[r]=i;continue}if(!l.imageIds||!l.imageIds.length){t[r]=i;continue}const u=l.imageIds[0],p=b().classes.MetadataProvider.get("instance",u);p?t[r]={...i,PatientID:p.PatientID??"000000",PatientName:Ee(p.PatientName),StudyInstanceUID:p.StudyInstanceUID,SeriesInstanceUID:p.SeriesInstanceUID,StudyDate:p.StudyDate}:t[r]=i}return t},exportRTReportForAnnotations:({annotations:e})=>{Te(e)},setFusionPTColormap:({toolGroupId:e,colormap:n})=>{const o=s.getToolGroup(e);if(!o)return;const{viewportMatchDetails:a}=i.getMatchDetails(),r=f.getMatchingPTDisplaySet({viewportMatchDetails:a});if(!r)return;const l=o.getViewportIds(),u=[];l.forEach(e=>{t.runCommand("setViewportColormap",{viewportId:e,displaySetInstanceUID:r.displaySetInstanceUID,colormap:{name:n}}),u.push(c.getCornerstoneViewport(e))}),u.forEach(e=>{e.render()})}},g={setEndSliceForROIThresholdTool:{commandFn:f.setEndSliceForROIThresholdTool},setStartSliceForROIThresholdTool:{commandFn:f.setStartSliceForROIThresholdTool},getMatchingPTDisplaySet:{commandFn:f.getMatchingPTDisplaySet},getPTMetadata:{commandFn:f.getPTMetadata},createNewLabelmapFromPT:{commandFn:f.createNewLabelmapFromPT},thresholdSegmentationByRectangleROITool:{commandFn:f.thresholdSegmentationByRectangleROITool},calculateTMTV:{commandFn:f.calculateTMTV},exportTMTVReportCSV:{commandFn:f.exportTMTVReportCSV},createTMTVRTReport:{commandFn:f.createTMTVRTReport},getSegmentationCSVReport:{commandFn:f.getSegmentationCSVReport},exportRTReportForAnnotations:{commandFn:f.exportRTReportForAnnotations},setFusionPTColormap:{commandFn:f.setFusionPTColormap}};return{actions:f,definitions:g,defaultContext:"TMTV:CORNERSTONE"}},Ce="roi_stat";const De=function({config:e,dispatch:t,runCommand:n}){const{t:o}=$("ROIThresholdConfiguration"),a=[{value:Ce,label:o("Max"),placeHolder:o("Max")},{value:"range",label:o("Range"),placeHolder:o("Range")}];return h.createElement("div",{className:"bg-muted flex flex-col space-y-4 p-px"},h.createElement("div",{className:"flex items-end space-x-3"},h.createElement("div",{className:"flex min-w-0 flex-1 flex-col"},h.createElement(W.Select,{value:e.strategy,onValueChange:e=>{t({type:"setStrategy",payload:{strategy:e}})}},h.createElement(W.SelectTrigger,{className:"w-full"},h.createElement(W.SelectValue,{placeholder:a.find(t=>t.value===e.strategy)?.placeHolder})),h.createElement(W.SelectContent,{className:""},a.map(e=>h.createElement(W.SelectItem,{key:e.value,value:e.value},e.label))))),h.createElement("div",{className:"flex-shrink-0"},h.createElement("div",{className:"flex justify-end space-x-2"},h.createElement(W.Button,{variant:"secondary",onClick:()=>n("setStartSliceForROIThresholdTool")},o("Start")),h.createElement(W.Button,{variant:"secondary",onClick:()=>n("setEndSliceForROIThresholdTool")},o("End"))))),e.strategy===Ce&&h.createElement("div",{className:"mr-0"},h.createElement("div",{className:"mb-2"},h.createElement(W.Label,null,o("Percentage of Max SUV"))),h.createElement(W.Input,{"data-cy":"percentage-of-max-suv-input",className:"w-full",type:"text",value:e.weight,onChange:e=>{let n=e.target.value;"."===n&&(n="0."),isNaN(Number(n))||Number(n)<0||Number(n)>1||t({type:"setWeight",payload:{weight:n}})}})),e.strategy!==Ce&&h.createElement("div",{className:"mr-2 text-sm"},h.createElement("div",{className:"flex flex-col space-y-2"},h.createElement(W.Label,null,o("Lower & Upper Ranges")),h.createElement("div",{className:"flex items-center"},h.createElement("div",{className:"w-10 text-left"},h.createElement(W.Label,null,"CT")),h.createElement("div",{className:"flex flex-1 space-x-2"},h.createElement("div",{className:"flex-1"},h.createElement(W.Input,{className:"w-full",type:"text",value:e.ctLower,onChange:e=>{t({type:"setThreshold",payload:{ctLower:e.target.value}})}})),h.createElement("div",{className:"flex-1"},h.createElement(W.Input,{className:"w-full",type:"text",value:e.ctUpper,onChange:e=>{t({type:"setThreshold",payload:{ctUpper:e.target.value}})}})))),h.createElement("div",{className:"flex items-center"},h.createElement("div",{className:"w-10 text-left"},h.createElement(W.Label,null,"PT")),h.createElement("div",{className:"flex flex-1 space-x-2"},h.createElement("div",{className:"flex-1"},h.createElement(W.Input,{className:"w-full",type:"text",value:e.ptLower,onChange:e=>{t({type:"setThreshold",payload:{ptLower:e.target.value}})}})),h.createElement("div",{className:"flex-1"},h.createElement(W.Input,{className:"w-full",type:"text",value:e.ptUpper,onChange:e=>{t({type:"setThreshold",payload:{ptUpper:e.target.value}})}})))))))},Ne=Ce;function Me(e,t){const{payload:n}=t,{strategy:o,ctLower:a,ctUpper:r,ptLower:i,ptUpper:s,weight:c}=n;switch(t.type){case"setStrategy":return{...e,strategy:o};case"setThreshold":return{...e,ctLower:a||e.ctLower,ctUpper:r||e.ctUpper,ptLower:i||e.ptLower,ptUpper:s||e.ptUpper};case"setWeight":return{...e,weight:c};default:return e}}const Pe=function(){const{commandsManager:e}=(0,I.useSystem)(),t=(0,K.useSegmentations)()[0],{t:n}=$("ROIThresholdConfiguration"),o=(0,h.useCallback)((t,n={})=>e.runCommand(t,n),[e]),[a,r]=(0,h.useReducer)(Me,{strategy:Ne,ctLower:-1024,ctUpper:1024,ptLower:2.5,ptUpper:100,weight:.41}),i=(0,h.useCallback)(()=>{if(!t)return;const e=t.segmentationId,n=ie.segmentation.segmentIndex.getActiveSegmentIndex(e);o("thresholdSegmentationByRectangleROITool",{segmentationId:e,config:a,segmentIndex:n})},[t,a]);return h.createElement("div",{className:"invisible-scrollbar mb-1 flex flex-col overflow-y-auto overflow-x-hidden"},h.createElement(De,{config:a,dispatch:r,runCommand:o}),t&&h.createElement(W.Button,{variant:"default",className:"my-3 mr-auto w-20",onClick:i},n("Run")))};const Le={id:e,preRegistration({servicesManager:e,commandsManager:t,extensionManager:n,configuration:o={}}){!function({servicesManager:e}){const{measurementService:t,displaySetService:n,cornerstoneViewportService:o}=e.services;(0,ie.addTool)(ie.RectangleROIStartEndThresholdTool),(0,ie.addTool)(ie.CircleROIStartEndThresholdTool);const{RectangleROIStartEndThreshold:a,CircleROIStartEndThreshold:r}=ue(t,n,o),i=t.getSource(pe,de);t.addMapping(i,"RectangleROIStartEndThreshold",a.matchingCriteria,a.toAnnotation,a.toMeasurement),t.addMapping(i,"CircleROIStartEndThreshold",r.matchingCriteria,r.toAnnotation,r.toMeasurement)}({servicesManager:e,commandsManager:t,extensionManager:n,configuration:o})},getToolbarModule:function(){return[{name:"tmtv.RectangleROIThresholdOptions",defaultComponent:Pe}]},getPanelModule:re,getHangingProtocolModule:y,getCommandsModule:({servicesManager:e,commandsManager:t,extensionManager:n})=>Oe({servicesManager:e,commandsManager:t,extensionManager:n})},Ue=Le})(),f})());
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ohif/extension-tmtv",
|
|
3
|
-
"version": "3.13.0-beta.
|
|
3
|
+
"version": "3.13.0-beta.15",
|
|
4
4
|
"description": "OHIF extension for Total Metabolic Tumor Volume",
|
|
5
5
|
"author": "OHIF",
|
|
6
6
|
"license": "MIT",
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
"test:unit:ci": "jest --ci --runInBand --collectCoverage --passWithNoTests"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
|
-
"@ohif/core": "3.13.0-beta.
|
|
34
|
-
"@ohif/ui": "3.13.0-beta.
|
|
33
|
+
"@ohif/core": "3.13.0-beta.15",
|
|
34
|
+
"@ohif/ui": "3.13.0-beta.15",
|
|
35
35
|
"dcmjs": "0.49.4",
|
|
36
36
|
"dicom-parser": "1.8.21",
|
|
37
37
|
"hammerjs": "2.0.8",
|