diff --git a/README.md b/README.md index ec6d6fc1..1be09c7b 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ JS9: astronomical image display everywhere ========================================== -![JS9](js9Readme.png) +![JS9](images/js9Readme.png) What does it do? ---------------- diff --git a/js9Readme.png b/images/js9Readme.png similarity index 100% rename from js9Readme.png rename to images/js9Readme.png diff --git a/js9-allinone.js b/js9-allinone.js index ef878ed9..a1d7ef09 100644 --- a/js9-allinone.js +++ b/js9-allinone.js @@ -4226,37 +4226,36 @@ this.setRotate(b);break;case "scale":this.setScale(b);break;case "scalemin":a=th f)&&f.push(h.display.image);try{for(e=0;ef.search(/(^| )-c/)&&(f+=" -c "+(this.raw.hdu.slice||1));if(g.reduce&&!this.parentFile&&(l=this.fileDimensions(),l=Math.floor(Math.max(l.xdim,l.ydim)/g.dim+.5),1b.radius2)&&a.error("radial profile source region must be an annulus"),b=[(b.radius1+b.radius2)/2,b.surfBrightness,b.surfError],h.data.push(b);return this.displayAnalysis("plot",h,{divid:a.globalOpts.analysisDiv})};a.Image.prototype.plot3d=function(c,b,d){var e,f,g=[];this.raw.header&&3===this.raw.header.NAXIS||a.error("plot3d requires a data cube with 3 dimensions");d=$.extend(!0,{},d,a.globalOpts.plot3d);d.cube=d.cube||"*:*:all";var h=d.cube.split(":");for(e=0;e=h.length&&a.cleanupFITSFile(g,!0)}this.raw=this.raws[0];if(g.current0&&g.current0.id)for(h=0;hg||d.alwaysCopy){h=$.extend(!0,{},f);h.current0=f;if(d.bitpix){switch(d.bitpix){case 8:h.data=new Uint8Array(f.height*f.width);break;case 16:h.data=new Int16Array(f.height*f.width);break;case -16:h.data=new Uint16Array(f.height*f.width);break;case 32:h.data=new Int32Array(f.height*f.width);break;case -32:h.data= -new Float32Array(f.height*f.width);break;case -64:h.data=new Float64Array(f.height*f.width)}var l=h.width*h.height;for(b=0;bthis.raw.bitpix&&0>e.argval.raw.bitpix?Math.min(this.raw.bitpix,e.argval.raw.bitpix):0>this.raw.bitpix&&0f||f>=a.height)){var g=0;var h=g+b.xoff;e=a.width;0>h&&(g-=h,e+=h,h=0);h+e>a.width&&(e-=h+e-a.width);if(0>=e)return!1;g=(c*a.width+g)*d;g=new Uint8Array(a.data.buffer, -g,e*d);h=(f*a.width+h)*d;e=new Uint8Array(b.data.buffer,h,e*d);e.set(g)}}return!0});return this};a.Image.prototype.rotateData=function(c){for(var b=[],d=0;dg&&(g=-g);break;default:h=parseInt(h,10)}a.notNull(l.CD1_1)?(g=-(h*Math.PI/180),e=Math.sin(g),g=Math.cos(g),m.CD1_1=l.CD1_1*g+l.CD1_2*e,m.CD1_2=l.CD1_1*-e+l.CD1_2*g,m.CD2_1=l.CD2_1*g+l.CD2_2*e,m.CD2_2=l.CD2_1*-e+l.CD2_2*g):(m.CROTA2=h,m.CDELT1=e,m.CDELT2=g);k.lcsUseRota2=!0;d.wcsinfo&&(m.ptype=d.wcsinfo.ptype);this.xeqStashSave("rotateData",b.slice(),k.rawid); -return this.reprojectData(m,k)};a.Image.prototype.reproject=function(c,b){var d,e,f,g=!1;var h={};var k=/SIMPLE|BITPIX|NAXIS|NAXIS[1-4]|AMDX|AMDY|CD[1-2]_[1-2]|CDELT[1-4]|CNPIX[1-4]|CO1_[1-9][0-9]|CO2_[1-9][0-9]|CROTA[1-4]|CRPIX[1-4]|CRVAL[1-4]|CTYPE[1-4]|CUNIT[1-4]|DATE|DATE_OBS|DC-FLAG|DEC|DETSEC|DETSIZE|EPOCH|EQUINOX|EQUINOX[a-z]|IMAGEH|IMAGEW|LATPOLE|LONGPOLE|MJD-OBS|PC00[1-4]00[1-4]|PC[1-4]_[1-4]|PIXSCALE|PIXSCAL[1-2]|PLTDECH|PLTDECM|PLTDECS|PLTDECSN|PLTRAH|PLTRAM|PLTRAS|PPO|PROJP[1-9]|PROJR0|PV[1-3]_[1-3]|PV[1-4]_[1-4]|RA|RADECSYS|SECPIX|SECPIX|SECPIX[1-2]|UT|UTMID|VELOCITY|VSOURCE|WCSAXES|WCSDEP|WCSDIM|WCSNAME|XPIXSIZE|YPIXSIZE|ZSOURCE|LTM|LTV/; +a.Image.prototype.setStatus=function(c,b){if(a.notNull(c)&&a.notNull(b))switch(b){case "error":case "complete":delete this.status.cur;break;default:this.status.cur=c}this.status[c]=b};a.Image.prototype.dataminmax=function(c,b){var d=this.raw;var e=this.params;var f=this.raw.data;var g=Number.isNaN(e.scalemin)||a.isNull(e.scalemin);var h=Number.isNaN(e.scalemax)||a.isNull(e.scalemax);if("dataminmax"===e.scaleclipping){if(d.dmin===e.scalemin||a.isNull(d.dmin))g=!0;if(d.dmax===e.scalemax||a.isNull(d.dmax))h= +!0}if(a.notNull(c)&&a.notNull(b))d.dmin=c,d.dmax=b;else if(d.dmin=Number.MAX_VALUE,d.dmax=Number.MIN_VALUE,0d.dmax&&(d.dmax=b))}else for(c=0;cd.dmax&&(d.dmax=b);else for(c=0;cd.dmax&&(d.dmax=b));g&&(e.scalemin=d.dmin);h&&(e.scalemax=d.dmax);e.precision=a.floatPrecision(e.scalemin, +e.scalemax);return this};a.Image.prototype.zscale=function(c){if(!a.zscale||!this.raw||!this.raw.data)return this;var b=this.raw.data;var d=b.length*b.BYTES_PER_ELEMENT;try{var e=a.vmalloc(d)}catch(f){a.error("image too large for zscale malloc: "+d,f)}try{a.vmemcpy(new Uint8Array(b.buffer),e)}catch(f){a.error("can't copy image to zscale heap: "+d,f)}b=a.zscale(e,this.raw.width,this.raw.height,this.raw.bitpix,this.params.zscalecontrast,this.params.zscalesamples,this.params.zscaleline);a.vfree(e);e= +b.trim().split(/\s+/);this.params.z1=parseFloat(e[0]);this.params.z2=parseFloat(e[1]);"zmax"===c?(this.params.scalemin=this.params.z1,this.params.scalemax=this.raw.dmax):c&&(this.params.scalemin=this.params.z1,this.params.scalemax=this.params.z2);this.params.precision=a.floatPrecision(this.params.scalemin,this.params.scalemax);return this};a.Image.prototype.countsInRegions=function(c){for(var b=[],d=0;df.search(/(^| )-c/)&&(f+=" -c "+(this.raw.hdu.slice||1));if(g.reduce&&!this.parentFile&&(l=this.fileDimensions(),l=Math.floor(Math.max(l.xdim,l.ydim)/g.dim+.5),1b.radius2)&&a.error("radial profile source region must be an annulus"),b=[(b.radius1+b.radius2)/2,b.surfBrightness,b.surfError],h.data.push(b);return this.displayAnalysis("plot",h,{divid:a.globalOpts.analysisDiv})};a.Image.prototype.plot3d=function(c,b,d){var e,f,g=[];this.raw.header&&3===this.raw.header.NAXIS|| +a.error("plot3d requires a data cube with 3 dimensions");d=$.extend(!0,{},d,a.globalOpts.plot3d);d.cube=d.cube||"*:*:all";var h=d.cube.split(":");for(e=0;e=h.length&&a.cleanupFITSFile(g,!0)}this.raw=this.raws[0];if(g.current0&&g.current0.id)for(h=0;hg||d.alwaysCopy){h=$.extend(!0,{},f);h.current0=f;if(d.bitpix){switch(d.bitpix){case 8:h.data= +new Uint8Array(f.height*f.width);break;case 16:h.data=new Int16Array(f.height*f.width);break;case -16:h.data=new Uint16Array(f.height*f.width);break;case 32:h.data=new Int32Array(f.height*f.width);break;case -32:h.data=new Float32Array(f.height*f.width);break;case -64:h.data=new Float64Array(f.height*f.width)}var l=h.width*h.height;for(b=0;bthis.raw.bitpix&&0>e.argval.raw.bitpix?Math.min(this.raw.bitpix, +e.argval.raw.bitpix):0>this.raw.bitpix&&0f||f>=a.height)){var g=0;var h=g+b.xoff;e=a.width;0>h&&(g-=h,e+=h,h=0);h+e>a.width&&(e-=h+e-a.width);if(0>=e)return!1;g=(c*a.width+g)*d;g=new Uint8Array(a.data.buffer,g,e*d);h=(f*a.width+h)*d;e=new Uint8Array(b.data.buffer,h,e*d);e.set(g)}}return!0});return this};a.Image.prototype.rotateData=function(c){for(var b=[],d=0;dg&&(g=-g);break;default:h=parseInt(h,10)}a.notNull(l.CD1_1)?(g=-(h*Math.PI/180),e=Math.sin(g),g=Math.cos(g),m.CD1_1=l.CD1_1*g+l.CD1_2*e,m.CD1_2=l.CD1_1*-e+l.CD1_2*g,m.CD2_1=l.CD2_1*g+l.CD2_2*e,m.CD2_2=l.CD2_1*-e+l.CD2_2*g):(m.CROTA2=h,m.CDELT1=e,m.CDELT2=g);k.lcsUseRota2=!0;d.wcsinfo&&(m.ptype=d.wcsinfo.ptype);this.xeqStashSave("rotateData",b.slice(),k.rawid);return this.reprojectData(m,k)};a.Image.prototype.reproject=function(c,b){var d,e,f,g=!1;var h={};var k=/SIMPLE|BITPIX|NAXIS|NAXIS[1-4]|AMDX|AMDY|CD[1-2]_[1-2]|CDELT[1-4]|CNPIX[1-4]|CO1_[1-9][0-9]|CO2_[1-9][0-9]|CROTA[1-4]|CRPIX[1-4]|CRVAL[1-4]|CTYPE[1-4]|CUNIT[1-4]|DATE|DATE_OBS|DC-FLAG|DEC|DETSEC|DETSIZE|EPOCH|EQUINOX|EQUINOX[a-z]|IMAGEH|IMAGEW|LATPOLE|LONGPOLE|MJD-OBS|PC00[1-4]00[1-4]|PC[1-4]_[1-4]|PIXSCALE|PIXSCAL[1-2]|PLTDECH|PLTDECM|PLTDECS|PLTDECSN|PLTRAH|PLTRAM|PLTRAS|PPO|PROJP[1-9]|PROJR0|PV[1-3]_[1-3]|PV[1-4]_[1-4]|RA|RADECSYS|SECPIX|SECPIX|SECPIX[1-2]|UT|UTMID|VELOCITY|VSOURCE|WCSAXES|WCSDEP|WCSDIM|WCSNAME|XPIXSIZE|YPIXSIZE|ZSOURCE|LTM|LTV/; var l=/TAN|SIN|ZEA|STG|ARC/,m=function(b,c){if(!c)return b;b=$.extend(!0,{},b);a.isNull(b.CRVAL1)&&!a.isNull(c.crval1)&&(b.CRVAL1=c.crval1);a.isNull(b.CRVAL2)&&!a.isNull(c.crval2)&&(b.CRVAL2=c.crval2);a.isNull(b.CRPIX1)&&!a.isNull(c.crpix1)&&(b.CRPIX1=c.crpix1);a.isNull(b.CRPIX2)&&!a.isNull(c.crpix2)&&(b.CRPIX2=c.crpix2);a.isNull(b.CDELT1)&&!a.isNull(c.cdelt1)&&(b.CDELT1=c.cdelt1);a.isNull(b.CDELT2)&&!a.isNull(c.cdelt2)&&(b.CDELT2=c.cdelt2);a.isNull(b.CROTA2)&&!a.isNull(c.crot)&&(b.CROTA2=c.crot); return b};if(a.reproject&&c&&this!==c){this.raws&&this.raws[0]||a.error("no raw data for reprojection");var n=this.raws[0];n.header&&n.wcsinfo||a.error("no WCS info available for reprojection");b=b||{};var p=$.extend(!0,{},n.header);for(r in p)p.hasOwnProperty(r)&&k.test(r)&&delete p[r];if("object"===typeof c){c.raw&&c.raw.header?d=c.raw.header:c.BITPIX&&c.NAXIS1&&c.NAXIS2?d=c:a.error("invalid wcs object input to reproject()");for(r in d)d.hasOwnProperty(r)&&k.test(r)&&(h[r]=d[r]);p=$.extend(!0,{}, h,p);if(!p.NAXIS||!p.NAXIS1||!p.NAXIS2)return;p.NAXIS1=Math.min(p.NAXIS1,a.globalOpts.image.xdim);p.NAXIS2=Math.min(p.NAXIS2,a.globalOpts.image.ydim);var r=a.raw2FITS(p,{addcr:!0});p="wcs_"+a.uniqueID()+".txt";a.vfile(p,r);a.globalOpts.reprojectLimits&&(r=a.globalOpts.image.xdim,h=a.globalOpts.image.ydim,k=a.globalOpts.image.xdim*a.globalOpts.image.ydim,n.header.NAXIS1*n.header.NAXIS2>k&&a.error("the max reproject size is "+r+" * "+h+". You can use the Bin/Filter/Section plugin to extract a section, then save it as FITS and reproject the smaller image."))}else p= @@ -4429,8 +4428,8 @@ b),c.dlayer.canvas.renderAll()}b.polyparams?c.dlayer.params.sel=b.polyparams.pol function(c,b){var d,e={},f=c.canvas,g=function(b){b=b.target;var d=b.polyparams.polygon,g=b.polyparams.point,h=d.get("points"),k=c.display.image;void 0!==g&&!1!==d.params.changeable&&(d.angle?e=a.rotatePoint({x:b.left,y:b.top},-d.angle,{x:d.left,y:d.top}):(e.x=b.left,e.y=b.top),h[g].x=(e.x-d.left)/d.scaleX,h[g].y=(e.y-d.top)/d.scaleY,a.resetPolygonCenter(d),a.Fabric._updateShape.call(k,d.params.layerName,d,null,"update"),k&&(k.params.listonchange||d.params.listonchange)&&k.listRegions(d,{mode:2}), f.renderAll())},h=function(b){var c,d={};for(c=0;cf;)f+=360;for(;360<=f;)f-=360;var l=f-h.lastangle;var m=a.rotatePoint({x:k.left, +function(a,b){var c=a.canvas;if(b&&b.params&&b.params.anchors&&!1!==b.params.changeable){for(a=0;af;)f+=360;for(;360<=f;)f-=360;var l=f-h.lastangle;var m=a.rotatePoint({x:k.left, y:k.top},l,{x:b.left,y:b.top});k.left=m.x;k.top=m.y;h.dleft=b.left-k.left;h.dtop=b.top-k.top;for(k.angle+=l;0>k.angle;)k.angle+=360;for(;360<=k.angle;)k.angle-=360;h.lastangle=f;break;case "scaling":h.dleft*=b.scaleX/h.lastscalex,h.dtop=b.scaleY/h.lastscaley*(h.dtop-h.textheight)+h.textheight,h.lastscalex=b.scaleX,h.lastscaley=b.scaleY,h.moved=!0,k.left=b.left-h.dleft,k.top=b.top-h.dtop}k.setCoords();c.display.image&&c.display.image.updateShapes(c.layerName,k,"updatechild")}};a.resetPolygonCenter= function(c){var b={};if(1===fabric.major_version){c._calcDimensions();var d=(c.minX+c.width/2)*c.scaleX;var e=(c.minY+c.height/2)*c.scaleY}else e=c._calcDimensions(),d=(e.left+e.width/2)*c.scaleX,e=(e.top+e.height/2)*c.scaleY;c.angle?b=a.rotatePoint({x:c.left+d,y:c.top+e},c.angle,{x:c.left,y:c.top}):(b.x=c.left+d,b.y=c.top+e);if(1").addClass(a.MouseTouch.BASE+"Container").attr("id",this.id+ "MouseTouchContainer").appendTo(this.divjq);var d=sprintf("
Drag an action to reconfigure JS9 mouse/touch events:

",a.MouseTouch.BASE+"Header");this.mousetouchHeadContainer=$("").addClass(a.MouseTouch.BASE+"Container").attr("id",this.id+"MouseTouchHeadContainer").html(d).appendTo(this.mousetouchContainer);this.mousetouchTextContainer=$("").addClass(a.MouseTouch.BASE+"Container").attr("id",this.id+"MouseTouchTextContainer").appendTo(this.mousetouchContainer); this.mousetouchActionContainer=$("").addClass(a.MouseTouch.BASE+"Container").attr("id",this.id+"MouseTouchActionContainer").appendTo(this.mousetouchContainer);if(a.TOUCHSUPPORTED){this.mousetouchTouchTextContainer=$("

").addClass(a.MouseTouch.BASE+"TextContainer").attr("id",this.id+"TouchTextContainer").html("").appendTo(this.mousetouchTextContainer);for(b=0;b").addClass(a.MouseTouch.BASE+"ActionContainer").attr("id",this.id+"TouchContainer").html("").appendTo(this.mousetouchActionContainer);for(b=0;b").addClass(a.MouseTouch.BASE+"TextContainer").attr("id",this.id+"MouseTextContainer").appendTo(this.mousetouchTextContainer);for(b=0;3>b;b++)a.MouseTouch.addText.call(this,this.mousetouchMouseTextContainer,a.MouseTouch.mouseText[b]);for(b=3;b").addClass(a.MouseTouch.BASE+"ActionContainer").attr("id",this.id+"MouseContainer").html("").appendTo(this.mousetouchActionContainer);for(b=0;b
Use mouse wheel or pinch to zoom:          
",a.MouseTouch.BASE+"Footer",this.display.id);this.mousetouchFootContainer=$("").addClass(a.MouseTouch.BASE+"Container").attr("id",this.id+"MouseTouchFootContainer").html(d).appendTo(this.mousetouchContainer); +for(b=a.MouseTouch.touchText.length;b").addClass(a.MouseTouch.BASE+"ActionContainer").attr("id",this.id+"TouchContainer").html("").appendTo(this.mousetouchActionContainer);for(b=0;b").addClass(a.MouseTouch.BASE+"TextContainer").attr("id",this.id+"MouseTextContainer").appendTo(this.mousetouchTextContainer);for(b=0;3>b;b++)a.MouseTouch.addText.call(this,this.mousetouchMouseTextContainer,a.MouseTouch.mouseText[b]);for(b=3;b").addClass(a.MouseTouch.BASE+"ActionContainer").attr("id",this.id+"MouseContainer").html("").appendTo(this.mousetouchActionContainer);for(b=0;b
Use mouse wheel or pinch to zoom:          
",a.MouseTouch.BASE+"Footer",this.display.id);this.mousetouchFootContainer=$("").addClass(a.MouseTouch.BASE+"Container").attr("id",this.id+"MouseTouchFootContainer").html(d).appendTo(this.mousetouchContainer); this.display.mousetouchZoom&&this.mousetouchContainer.find("input").attr("checked",!0)};a.Regions={};a.Regions.CLASS="JS9";a.Regions.NAME="Regions";a.Regions.opts={updateWCS:!0,panzoom:!0,tags:"source,include",strokeWidth:2,iradius:0,oradius:30,nannuli:2,width:60,height:60,radius:30,r1:30,r2:20,ptshape:"box",ptsize:2,linepoints:[{x:-30,y:30},{x:30,y:-30}],polypoints:[{x:-30,y:30},{x:30,y:30},{x:0,y:-30}],fontFamily:"Helvetica",fontSize:14,fontStyle:"normal",fontWeight:300,textAlign:"left",angle:0, aradius1:4,aradius2:8,configURL:"./params/regionsconfig.html",saveURL:"./params/regionssave.html",sortOverlapping:!0,title:"Edit region",noCenteredScaling:["box","line"],tagcolors:{include_source:"#00FF00",exclude_source:"#FF0000",include_background:"#FFD700",exclude_background:"#FF8C00",source:"#00FF00",background:"#FFD700",defcolor:"#00FF00"},onmousedown:function(c,b,d,e){var f;!a.specialKey(d)&&e.params&&(b=(new Date).getTime(),e.params.lasttime&&b-e.params.lasttime$.inArray(b[c],g)&&h.push(b[c]);for(c=0;c$.inArray(g[c],d)&&h.push(g[c]); +c};a.Regions.unremoveRegions=function(){var a=this.regstack.pop();return a?this.addShapes("regions",a):null};a.Regions.changeRegionTags=function(a,b,d){var c;a=a||"all";b=b||[];d=d||[];$.isArray(b)||(b=b.split(",").map(function(b){return b.trim()}));$.isArray(d)||(d=d.split(",").map(function(b){return b.trim()}));var f=this.getShapes("regions",a);for(a=0;a$.inArray(b[c],g)&&h.push(b[c]);for(c=0;c$.inArray(g[c],d)&&h.push(g[c]); this.changeShapes("regions",f[a].id,{tags:h})}};a.Regions.toggleRegionTags=function(a,b,d){var c;var f=this.getShapes("regions",a||"all");for(a=0;ac){var d=Math.max(b[a-1][1],b[a][1],b[a+1][1]);break}}else d=a.y;return{x:c,y:d}};switch(a.globalOpts.plotLibrary){case "flot":var l=-25;c.find(".plotAnnotation").remove();for(e=0;ec){var d=Math.max(a[b-1][1],a[b][1],a[b+1][1]);break}}else d=b.y;return{x:c,y:d}};switch(a.globalOpts.plotLibrary){case "flot":var l=-25;c.find(".plotAnnotation").remove();for(e=0;ef.left||f.left>c.width()||(m=sprintf("
%s
",f.left,f.top+l,h,"↓"+m.text),c.append(m))}break;case "plotly":l=-30;for(e=0;e>>0;if(0===e)return!1;b|=0;for(b=Math.max(0<=b?b:e-Math.abs(b),0);b$/,l=/<[0-9][0-9]*>/;c=c.replace(l,"");for(e=0;e":c};a.uniqueID=function(){var a=1;return function(){return a++}}();a.waiting=function(c,b){switch(c){case !0:if(window.hasOwnProperty("Spinner")&& +break;case -32:f=new Float32Array(c.data.buffer,b,c.width);g=new Float32Array(d.data.buffer,e,c.width);break;case -64:f=new Float64Array(c.data.buffer,b,c.width);g=new Float64Array(d.data.buffer,e,c.width);break;default:a.error("unknown bitpix value for flip: "+c.bitpix)}return[f,g]};a.memcpy=function(a,b,d,e,f){a=new Uint8Array(a,b,f);d=new Uint8Array(d,e,f);a.set(d)};a.jupyterFocus=function(a,b){window.hasOwnProperty("Jupyter")&&(a=a instanceof jQuery?a:$(a),a.find(b||"input, textarea").each(function(b, +a){Jupyter.keyboard_manager.register_events($(a))}))};a.getImageID=function(c,b,d){var e,f=0,g=1,h=a.images.length,k=/.*<([0-9][0-9]*)>$/,l=/<[0-9][0-9]*>/;c=c.replace(l,"");for(e=0;e":c};a.uniqueID=function(){var a=1;return function(){return a++}}();a.waiting=function(c,b){switch(c){case !0:if(window.hasOwnProperty("Spinner")&& "spinner"===a.globalOpts.waitType){if(b)if("object"===typeof b)var d=b.divjq[0];else"string"===typeof b&&(c=a.lookupDisplay(b))&&(d=c.divjq[0]);d||(d=$("body").get(0));a.spinner||(a.spinner={},c={color:a.globalOpts.spinColor,opacity:a.globalOpts.spinOpacity},a.spinner.spinner=new Spinner(c));a.spinner.spinner.spin(d)}else $("body").addClass("waiting");break;case !1:window.hasOwnProperty("Spinner")&&"spinner"===a.globalOpts.waitType?a.spinner&&a.spinner.spinner.stop():$("body").removeClass("waiting")}}; a.progress=function(c,b){if("boolean"===typeof c||"string"===typeof c)switch(c){case !0:case "indeterminate":b&&(a.progress.display=b,a.progress.display.displayMessage("progress",c));break;case !1:case "":a.progress.display&&(a.progress.display.clearMessage("progress"),delete a.progress.display)}else"number"===typeof c&&a.progress.display&&a.progress.display.displayMessage("progress",[c,b])};a.msgHandler=function(c,b){var d=[];var e=c.cmd,f=c.id,g=a.globalOpts.alerts,h=a.globalOpts.quietReturn?"": "OK";b&&(a.globalOpts.alerts=!1);if(a.publics[e]){$.isArray(c.args)||(c.args=[c.args]);for(d=0;d",47:"?"};var f="number"===typeof c?c:c.which||c.keyCode;var g=String(f);d.hasOwnProperty(g)&&(f=d[g]);f=!c.shiftKey&&65<=f&&90>=f?String.fromCharCode(f+32):!c.shiftKey&&b.hasOwnProperty(f)?b[f]:c.shiftKey&&e.hasOwnProperty(f)?e[f]:String.fromCharCode(f);a.specialKey(c)&&(f="M-"+ f);return f};a.eventToDisplayPos=function(a,b){a||(a=window.event);if(a.target)var c=a.target;else a.srcElement&&(c=a.srcElement);3===c.nodeType&&(c=c.parentNode);b=b||$(c).offset();if(a.originalEvent)if(a.originalEvent.touches&&a.originalEvent.touches.length){var e=a.originalEvent.touches;c=e[0].pageX;var f=e[0].pageY}else a.originalEvent.changedTouches&&a.originalEvent.changedTouches.length?(e=a.originalEvent.changedTouches,c=e[0].pageX,f=e[0].pageY):(c=a.pageX,f=a.pageY);else c=a.pageX,f=a.pageY; a=b.left+1;b=b.top+1;f={x:Math.floor(c-a),y:Math.floor(f-b)};if(e&&e.length)for(f.touches=[{x:f.x,y:f.y}],c=1;c=c.raw.wcs||0>=b.raw.wcs)return d;var e=d.x;d=d.y;var f=a.pix2wcs(c.raw.wcs,e,d).trim().split(/\s+/);var g=a.saostrtod(f[0]);":"===String.fromCharCode(a.saodtype())&&"galactic"!==c.params.wcssys&&"ecliptic"!==c.params.wcssys&&(g*=15);c=a.saostrtod(f[1]);f=a.wcs2pix(b.raw.wcs, -g,c).trim().split(/\s+/);b=parseFloat(f[0]);c=parseFloat(f[1]);.5>Math.abs(b-e)&&(b=e);.5>Math.abs(c-d)&&(c=d);return{x:b,y:c}};a.angdist=function(a,b,d,e){var c=function(a,b){var c=[],d=Math.cos(b);c[0]=Math.cos(a)*d;c[1]=Math.sin(a)*d;c[2]=Math.sin(b);return c};a=c(a*Math.PI/180,b*Math.PI/180);d=c(d*Math.PI/180,e*Math.PI/180);return 180*-function(a,b){var c=a[0];var d=a[1];a=a[2];var e=Math.sqrt(c*c+d*d+a*a);0!=e&&(c/=e,d/=e,a/=e);e=b[0];var f=b[1];var g=b[2];b=f*c-e*d;c=g*(c*c+d*d)-a*(e*c+f*d); -return 0!=b||0!=c?Math.atan2(b,c):0}(a,d)/Math.PI};a.rotatePoint=function(a,b,d){d=d||{x:0,y:0};b=Math.PI*b/180;var c=Math.cos(b);b=Math.sin(b);return{x:c*(a.x-d.x)-b*(a.y-d.y)+d.x,y:b*(a.x-d.x)+c*(a.y-d.y)+d.y}};a.matrixMultiply=function(a,b){var c,e,f,g=a.length,h=a[0].length,k=b[0].length;var l=Array(g);for(c=0;cMath.abs(b-e)&&(b=e);.5>Math.abs(c-d)&&(c=d);return{x:b,y:c}};a.angdist=function(a,b,d,e){var c=function(b,a){var c=[],d=Math.cos(a);c[0]=Math.cos(b)*d;c[1]=Math.sin(b)*d;c[2]=Math.sin(a);return c};a=c(a*Math.PI/180,b*Math.PI/180);d=c(d*Math.PI/180,e*Math.PI/180);return 180*-function(b,a){var c=b[0];var d=b[1];b=b[2];var e=Math.sqrt(c*c+d*d+b*b);0!=e&&(c/=e,d/=e,b/=e);e=a[0];var f=a[1];var g=a[2];a=f*c-e*d;c=g*(c*c+d*d)-b*(e*c+f*d); +return 0!=a||0!=c?Math.atan2(a,c):0}(a,d)/Math.PI};a.rotatePoint=function(a,b,d){d=d||{x:0,y:0};b=Math.PI*b/180;var c=Math.cos(b);b=Math.sin(b);return{x:c*(a.x-d.x)-b*(a.y-d.y)+d.x,y:b*(a.x-d.x)+c*(a.y-d.y)+d.y}};a.matrixMultiply=function(a,b){var c,e,f,g=a.length,h=a[0].length,k=b[0].length;var l=Array(g);for(c=0;cb;b++)for(c=0;2>c;c++)if(void 0===a[b][c]||Number.isNaN(a[b][c]))return null;0<=g?e+=g:f+=g;g=-a[0][1]*a[1][0];0<=g?e+=g:f+=g;b=e+f;if(0===b||1E-15>Math.abs(b/(e-f)))return null;b=1/b;h[0][0]=a[1][1]*b;h[1][0]=-a[1][0]*b;h[0][1]=-a[0][1]*b;h[1][1]=a[0][0]*b;h[2][0]=-(a[2][0]*h[0][0]+a[2][1]*h[1][0]);h[2][1]=-(a[2][0]*h[0][1]+a[2][1]*h[1][1]);return h};a.isNumber=function(a){return!isNaN(parseFloat(a))&&isFinite(a)};a.notNull=function(a){return void 0!==a&&null!==a};a.isNull=function(a){return void 0=== a||null===a};a.defNull=function(c,b){return a.notNull(c)?c:b};a.cardpars=function(c){var b=c.slice(0,8).trim();if("HISTORY"===b||"COMMENT"===b)return[b,c.slice(9).trim()];if("="===c[8])return c=c.slice(10).replace(/'/g," ").replace(/ \/.*/,"").trim(),"T"===c?c=!0:"F"===c?c=!1:a.isNumber(c)&&(c=parseFloat(c)),[b,c]};a.raw2FITS=function(c,b){var d,e=!1,f="",g={};var h=function(a,b,c,d){var e=a;if("XTENSION"!==b||c){var f=new RegExp(b+" *= *(-?[-+]?[0-9]*.?[0-9]*([eE][-+]?[0-9]+)?) *");a?(a=a.replace(f, "$1"),a=parseFloat(a)):a=void 0;a!==c&&(e=sprintf("%-8s= %20s / %-47s",b,c,d||""))}else e=sprintf("%s = %20s / %-47s","SIMPLE","T","file does conform to FITS standard");g[b]=!0;return e};if(!c)return f;b=b||{};"boolean"===typeof b&&(b={addcr:b});if(c.card||c.cardstr){var k=c.header||{};var l=c.card?c.card.length:c.ncard;for(d=0;d 0 ){ + if( raw.bitpix > 0 ){ // integer data: BLANK header value specifies data value to ignore - if( this.raw.header.BLANK !== undefined ){ - blankval = this.raw.header.BLANK; - for(i=0; i raw.dmax ){ raw.dmax = val; } } } } else { - for(i=0; i raw.dmax ){ raw.dmax = val; } } } } else { // float data: ignore NaN - for(i=0; i raw.dmax ){ raw.dmax = val; } } } } } // re-set scaling values, if necessary - if( reminscale ){ - this.params.scalemin = this.raw.dmin; - } - if( remaxscale ){ - this.params.scalemax = this.raw.dmax; - } - this.params.precision = - JS9.floatPrecision(this.params.scalemin, this.params.scalemax); + if( reminscale ){ params.scalemin = raw.dmin; } + if( remaxscale ){ params.scalemax = raw.dmax; } + // set new precision + params.precision = JS9.floatPrecision(params.scalemin, params.scalemax); // allow chaining return this; }; diff --git a/js9.min.js b/js9.min.js index ba975558..9f62cd5d 100644 --- a/js9.min.js +++ b/js9.min.js @@ -216,37 +216,36 @@ this.setRotate(b);break;case "scale":this.setScale(b);break;case "scalemin":a=th f)&&f.push(h.display.image);try{for(e=0;ef.search(/(^| )-c/)&&(f+=" -c "+(this.raw.hdu.slice||1));if(g.reduce&&!this.parentFile&&(l=this.fileDimensions(),l=Math.floor(Math.max(l.xdim,l.ydim)/g.dim+.5),1b.radius2)&&a.error("radial profile source region must be an annulus"),b=[(b.radius1+b.radius2)/2,b.surfBrightness,b.surfError],h.data.push(b);return this.displayAnalysis("plot",h,{divid:a.globalOpts.analysisDiv})};a.Image.prototype.plot3d=function(c,b,d){var e,f,g=[];this.raw.header&&3===this.raw.header.NAXIS||a.error("plot3d requires a data cube with 3 dimensions");d=$.extend(!0,{},d,a.globalOpts.plot3d);d.cube=d.cube||"*:*:all";var h=d.cube.split(":");for(e=0;e=h.length&&a.cleanupFITSFile(g,!0)}this.raw=this.raws[0];if(g.current0&&g.current0.id)for(h=0;hg||d.alwaysCopy){h=$.extend(!0,{},f);h.current0=f;if(d.bitpix){switch(d.bitpix){case 8:h.data=new Uint8Array(f.height*f.width);break;case 16:h.data=new Int16Array(f.height*f.width);break;case -16:h.data=new Uint16Array(f.height*f.width);break;case 32:h.data=new Int32Array(f.height*f.width);break;case -32:h.data= -new Float32Array(f.height*f.width);break;case -64:h.data=new Float64Array(f.height*f.width)}var l=h.width*h.height;for(b=0;bthis.raw.bitpix&&0>e.argval.raw.bitpix?Math.min(this.raw.bitpix,e.argval.raw.bitpix):0>this.raw.bitpix&&0f||f>=a.height)){var g=0;var h=g+b.xoff;e=a.width;0>h&&(g-=h,e+=h,h=0);h+e>a.width&&(e-=h+e-a.width);if(0>=e)return!1;g=(c*a.width+g)*d;g=new Uint8Array(a.data.buffer, -g,e*d);h=(f*a.width+h)*d;e=new Uint8Array(b.data.buffer,h,e*d);e.set(g)}}return!0});return this};a.Image.prototype.rotateData=function(c){for(var b=[],d=0;dg&&(g=-g);break;default:h=parseInt(h,10)}a.notNull(l.CD1_1)?(g=-(h*Math.PI/180),e=Math.sin(g),g=Math.cos(g),m.CD1_1=l.CD1_1*g+l.CD1_2*e,m.CD1_2=l.CD1_1*-e+l.CD1_2*g,m.CD2_1=l.CD2_1*g+l.CD2_2*e,m.CD2_2=l.CD2_1*-e+l.CD2_2*g):(m.CROTA2=h,m.CDELT1=e,m.CDELT2=g);k.lcsUseRota2=!0;d.wcsinfo&&(m.ptype=d.wcsinfo.ptype);this.xeqStashSave("rotateData",b.slice(),k.rawid); -return this.reprojectData(m,k)};a.Image.prototype.reproject=function(c,b){var d,e,f,g=!1;var h={};var k=/SIMPLE|BITPIX|NAXIS|NAXIS[1-4]|AMDX|AMDY|CD[1-2]_[1-2]|CDELT[1-4]|CNPIX[1-4]|CO1_[1-9][0-9]|CO2_[1-9][0-9]|CROTA[1-4]|CRPIX[1-4]|CRVAL[1-4]|CTYPE[1-4]|CUNIT[1-4]|DATE|DATE_OBS|DC-FLAG|DEC|DETSEC|DETSIZE|EPOCH|EQUINOX|EQUINOX[a-z]|IMAGEH|IMAGEW|LATPOLE|LONGPOLE|MJD-OBS|PC00[1-4]00[1-4]|PC[1-4]_[1-4]|PIXSCALE|PIXSCAL[1-2]|PLTDECH|PLTDECM|PLTDECS|PLTDECSN|PLTRAH|PLTRAM|PLTRAS|PPO|PROJP[1-9]|PROJR0|PV[1-3]_[1-3]|PV[1-4]_[1-4]|RA|RADECSYS|SECPIX|SECPIX|SECPIX[1-2]|UT|UTMID|VELOCITY|VSOURCE|WCSAXES|WCSDEP|WCSDIM|WCSNAME|XPIXSIZE|YPIXSIZE|ZSOURCE|LTM|LTV/; +a.Image.prototype.setStatus=function(c,b){if(a.notNull(c)&&a.notNull(b))switch(b){case "error":case "complete":delete this.status.cur;break;default:this.status.cur=c}this.status[c]=b};a.Image.prototype.dataminmax=function(c,b){var d=this.raw;var e=this.params;var f=this.raw.data;var g=Number.isNaN(e.scalemin)||a.isNull(e.scalemin);var h=Number.isNaN(e.scalemax)||a.isNull(e.scalemax);if("dataminmax"===e.scaleclipping){if(d.dmin===e.scalemin||a.isNull(d.dmin))g=!0;if(d.dmax===e.scalemax||a.isNull(d.dmax))h= +!0}if(a.notNull(c)&&a.notNull(b))d.dmin=c,d.dmax=b;else if(d.dmin=Number.MAX_VALUE,d.dmax=Number.MIN_VALUE,0d.dmax&&(d.dmax=b))}else for(c=0;cd.dmax&&(d.dmax=b);else for(c=0;cd.dmax&&(d.dmax=b));g&&(e.scalemin=d.dmin);h&&(e.scalemax=d.dmax);e.precision=a.floatPrecision(e.scalemin, +e.scalemax);return this};a.Image.prototype.zscale=function(c){if(!a.zscale||!this.raw||!this.raw.data)return this;var b=this.raw.data;var d=b.length*b.BYTES_PER_ELEMENT;try{var e=a.vmalloc(d)}catch(f){a.error("image too large for zscale malloc: "+d,f)}try{a.vmemcpy(new Uint8Array(b.buffer),e)}catch(f){a.error("can't copy image to zscale heap: "+d,f)}b=a.zscale(e,this.raw.width,this.raw.height,this.raw.bitpix,this.params.zscalecontrast,this.params.zscalesamples,this.params.zscaleline);a.vfree(e);e= +b.trim().split(/\s+/);this.params.z1=parseFloat(e[0]);this.params.z2=parseFloat(e[1]);"zmax"===c?(this.params.scalemin=this.params.z1,this.params.scalemax=this.raw.dmax):c&&(this.params.scalemin=this.params.z1,this.params.scalemax=this.params.z2);this.params.precision=a.floatPrecision(this.params.scalemin,this.params.scalemax);return this};a.Image.prototype.countsInRegions=function(c){for(var b=[],d=0;df.search(/(^| )-c/)&&(f+=" -c "+(this.raw.hdu.slice||1));if(g.reduce&&!this.parentFile&&(l=this.fileDimensions(),l=Math.floor(Math.max(l.xdim,l.ydim)/g.dim+.5),1b.radius2)&&a.error("radial profile source region must be an annulus"),b=[(b.radius1+b.radius2)/2,b.surfBrightness,b.surfError],h.data.push(b);return this.displayAnalysis("plot",h,{divid:a.globalOpts.analysisDiv})};a.Image.prototype.plot3d=function(c,b,d){var e,f,g=[];this.raw.header&&3===this.raw.header.NAXIS|| +a.error("plot3d requires a data cube with 3 dimensions");d=$.extend(!0,{},d,a.globalOpts.plot3d);d.cube=d.cube||"*:*:all";var h=d.cube.split(":");for(e=0;e=h.length&&a.cleanupFITSFile(g,!0)}this.raw=this.raws[0];if(g.current0&&g.current0.id)for(h=0;hg||d.alwaysCopy){h=$.extend(!0,{},f);h.current0=f;if(d.bitpix){switch(d.bitpix){case 8:h.data= +new Uint8Array(f.height*f.width);break;case 16:h.data=new Int16Array(f.height*f.width);break;case -16:h.data=new Uint16Array(f.height*f.width);break;case 32:h.data=new Int32Array(f.height*f.width);break;case -32:h.data=new Float32Array(f.height*f.width);break;case -64:h.data=new Float64Array(f.height*f.width)}var l=h.width*h.height;for(b=0;bthis.raw.bitpix&&0>e.argval.raw.bitpix?Math.min(this.raw.bitpix, +e.argval.raw.bitpix):0>this.raw.bitpix&&0f||f>=a.height)){var g=0;var h=g+b.xoff;e=a.width;0>h&&(g-=h,e+=h,h=0);h+e>a.width&&(e-=h+e-a.width);if(0>=e)return!1;g=(c*a.width+g)*d;g=new Uint8Array(a.data.buffer,g,e*d);h=(f*a.width+h)*d;e=new Uint8Array(b.data.buffer,h,e*d);e.set(g)}}return!0});return this};a.Image.prototype.rotateData=function(c){for(var b=[],d=0;dg&&(g=-g);break;default:h=parseInt(h,10)}a.notNull(l.CD1_1)?(g=-(h*Math.PI/180),e=Math.sin(g),g=Math.cos(g),m.CD1_1=l.CD1_1*g+l.CD1_2*e,m.CD1_2=l.CD1_1*-e+l.CD1_2*g,m.CD2_1=l.CD2_1*g+l.CD2_2*e,m.CD2_2=l.CD2_1*-e+l.CD2_2*g):(m.CROTA2=h,m.CDELT1=e,m.CDELT2=g);k.lcsUseRota2=!0;d.wcsinfo&&(m.ptype=d.wcsinfo.ptype);this.xeqStashSave("rotateData",b.slice(),k.rawid);return this.reprojectData(m,k)};a.Image.prototype.reproject=function(c,b){var d,e,f,g=!1;var h={};var k=/SIMPLE|BITPIX|NAXIS|NAXIS[1-4]|AMDX|AMDY|CD[1-2]_[1-2]|CDELT[1-4]|CNPIX[1-4]|CO1_[1-9][0-9]|CO2_[1-9][0-9]|CROTA[1-4]|CRPIX[1-4]|CRVAL[1-4]|CTYPE[1-4]|CUNIT[1-4]|DATE|DATE_OBS|DC-FLAG|DEC|DETSEC|DETSIZE|EPOCH|EQUINOX|EQUINOX[a-z]|IMAGEH|IMAGEW|LATPOLE|LONGPOLE|MJD-OBS|PC00[1-4]00[1-4]|PC[1-4]_[1-4]|PIXSCALE|PIXSCAL[1-2]|PLTDECH|PLTDECM|PLTDECS|PLTDECSN|PLTRAH|PLTRAM|PLTRAS|PPO|PROJP[1-9]|PROJR0|PV[1-3]_[1-3]|PV[1-4]_[1-4]|RA|RADECSYS|SECPIX|SECPIX|SECPIX[1-2]|UT|UTMID|VELOCITY|VSOURCE|WCSAXES|WCSDEP|WCSDIM|WCSNAME|XPIXSIZE|YPIXSIZE|ZSOURCE|LTM|LTV/; var l=/TAN|SIN|ZEA|STG|ARC/,m=function(b,c){if(!c)return b;b=$.extend(!0,{},b);a.isNull(b.CRVAL1)&&!a.isNull(c.crval1)&&(b.CRVAL1=c.crval1);a.isNull(b.CRVAL2)&&!a.isNull(c.crval2)&&(b.CRVAL2=c.crval2);a.isNull(b.CRPIX1)&&!a.isNull(c.crpix1)&&(b.CRPIX1=c.crpix1);a.isNull(b.CRPIX2)&&!a.isNull(c.crpix2)&&(b.CRPIX2=c.crpix2);a.isNull(b.CDELT1)&&!a.isNull(c.cdelt1)&&(b.CDELT1=c.cdelt1);a.isNull(b.CDELT2)&&!a.isNull(c.cdelt2)&&(b.CDELT2=c.cdelt2);a.isNull(b.CROTA2)&&!a.isNull(c.crot)&&(b.CROTA2=c.crot); return b};if(a.reproject&&c&&this!==c){this.raws&&this.raws[0]||a.error("no raw data for reprojection");var n=this.raws[0];n.header&&n.wcsinfo||a.error("no WCS info available for reprojection");b=b||{};var p=$.extend(!0,{},n.header);for(r in p)p.hasOwnProperty(r)&&k.test(r)&&delete p[r];if("object"===typeof c){c.raw&&c.raw.header?d=c.raw.header:c.BITPIX&&c.NAXIS1&&c.NAXIS2?d=c:a.error("invalid wcs object input to reproject()");for(r in d)d.hasOwnProperty(r)&&k.test(r)&&(h[r]=d[r]);p=$.extend(!0,{}, h,p);if(!p.NAXIS||!p.NAXIS1||!p.NAXIS2)return;p.NAXIS1=Math.min(p.NAXIS1,a.globalOpts.image.xdim);p.NAXIS2=Math.min(p.NAXIS2,a.globalOpts.image.ydim);var r=a.raw2FITS(p,{addcr:!0});p="wcs_"+a.uniqueID()+".txt";a.vfile(p,r);a.globalOpts.reprojectLimits&&(r=a.globalOpts.image.xdim,h=a.globalOpts.image.ydim,k=a.globalOpts.image.xdim*a.globalOpts.image.ydim,n.header.NAXIS1*n.header.NAXIS2>k&&a.error("the max reproject size is "+r+" * "+h+". You can use the Bin/Filter/Section plugin to extract a section, then save it as FITS and reproject the smaller image."))}else p= @@ -419,8 +418,8 @@ b),c.dlayer.canvas.renderAll()}b.polyparams?c.dlayer.params.sel=b.polyparams.pol function(c,b){var d,e={},f=c.canvas,g=function(b){b=b.target;var d=b.polyparams.polygon,g=b.polyparams.point,h=d.get("points"),k=c.display.image;void 0!==g&&!1!==d.params.changeable&&(d.angle?e=a.rotatePoint({x:b.left,y:b.top},-d.angle,{x:d.left,y:d.top}):(e.x=b.left,e.y=b.top),h[g].x=(e.x-d.left)/d.scaleX,h[g].y=(e.y-d.top)/d.scaleY,a.resetPolygonCenter(d),a.Fabric._updateShape.call(k,d.params.layerName,d,null,"update"),k&&(k.params.listonchange||d.params.listonchange)&&k.listRegions(d,{mode:2}), f.renderAll())},h=function(b){var c,d={};for(c=0;cf;)f+=360;for(;360<=f;)f-=360;var l=f-h.lastangle;var m=a.rotatePoint({x:k.left, +function(a,b){var c=a.canvas;if(b&&b.params&&b.params.anchors&&!1!==b.params.changeable){for(a=0;af;)f+=360;for(;360<=f;)f-=360;var l=f-h.lastangle;var m=a.rotatePoint({x:k.left, y:k.top},l,{x:b.left,y:b.top});k.left=m.x;k.top=m.y;h.dleft=b.left-k.left;h.dtop=b.top-k.top;for(k.angle+=l;0>k.angle;)k.angle+=360;for(;360<=k.angle;)k.angle-=360;h.lastangle=f;break;case "scaling":h.dleft*=b.scaleX/h.lastscalex,h.dtop=b.scaleY/h.lastscaley*(h.dtop-h.textheight)+h.textheight,h.lastscalex=b.scaleX,h.lastscaley=b.scaleY,h.moved=!0,k.left=b.left-h.dleft,k.top=b.top-h.dtop}k.setCoords();c.display.image&&c.display.image.updateShapes(c.layerName,k,"updatechild")}};a.resetPolygonCenter= function(c){var b={};if(1===fabric.major_version){c._calcDimensions();var d=(c.minX+c.width/2)*c.scaleX;var e=(c.minY+c.height/2)*c.scaleY}else e=c._calcDimensions(),d=(e.left+e.width/2)*c.scaleX,e=(e.top+e.height/2)*c.scaleY;c.angle?b=a.rotatePoint({x:c.left+d,y:c.top+e},c.angle,{x:c.left,y:c.top}):(b.x=c.left+d,b.y=c.top+e);if(1").addClass(a.MouseTouch.BASE+"Container").attr("id",this.id+ "MouseTouchContainer").appendTo(this.divjq);var d=sprintf("
Drag an action to reconfigure JS9 mouse/touch events:

",a.MouseTouch.BASE+"Header");this.mousetouchHeadContainer=$("").addClass(a.MouseTouch.BASE+"Container").attr("id",this.id+"MouseTouchHeadContainer").html(d).appendTo(this.mousetouchContainer);this.mousetouchTextContainer=$("").addClass(a.MouseTouch.BASE+"Container").attr("id",this.id+"MouseTouchTextContainer").appendTo(this.mousetouchContainer); this.mousetouchActionContainer=$("").addClass(a.MouseTouch.BASE+"Container").attr("id",this.id+"MouseTouchActionContainer").appendTo(this.mousetouchContainer);if(a.TOUCHSUPPORTED){this.mousetouchTouchTextContainer=$("

").addClass(a.MouseTouch.BASE+"TextContainer").attr("id",this.id+"TouchTextContainer").html("").appendTo(this.mousetouchTextContainer);for(b=0;b").addClass(a.MouseTouch.BASE+"ActionContainer").attr("id",this.id+"TouchContainer").html("").appendTo(this.mousetouchActionContainer);for(b=0;b").addClass(a.MouseTouch.BASE+"TextContainer").attr("id",this.id+"MouseTextContainer").appendTo(this.mousetouchTextContainer);for(b=0;3>b;b++)a.MouseTouch.addText.call(this,this.mousetouchMouseTextContainer,a.MouseTouch.mouseText[b]);for(b=3;b").addClass(a.MouseTouch.BASE+"ActionContainer").attr("id",this.id+"MouseContainer").html("").appendTo(this.mousetouchActionContainer);for(b=0;b
Use mouse wheel or pinch to zoom:          
",a.MouseTouch.BASE+"Footer",this.display.id);this.mousetouchFootContainer=$("").addClass(a.MouseTouch.BASE+"Container").attr("id",this.id+"MouseTouchFootContainer").html(d).appendTo(this.mousetouchContainer); +for(b=a.MouseTouch.touchText.length;b").addClass(a.MouseTouch.BASE+"ActionContainer").attr("id",this.id+"TouchContainer").html("").appendTo(this.mousetouchActionContainer);for(b=0;b").addClass(a.MouseTouch.BASE+"TextContainer").attr("id",this.id+"MouseTextContainer").appendTo(this.mousetouchTextContainer);for(b=0;3>b;b++)a.MouseTouch.addText.call(this,this.mousetouchMouseTextContainer,a.MouseTouch.mouseText[b]);for(b=3;b").addClass(a.MouseTouch.BASE+"ActionContainer").attr("id",this.id+"MouseContainer").html("").appendTo(this.mousetouchActionContainer);for(b=0;b
Use mouse wheel or pinch to zoom:          
",a.MouseTouch.BASE+"Footer",this.display.id);this.mousetouchFootContainer=$("").addClass(a.MouseTouch.BASE+"Container").attr("id",this.id+"MouseTouchFootContainer").html(d).appendTo(this.mousetouchContainer); this.display.mousetouchZoom&&this.mousetouchContainer.find("input").attr("checked",!0)};a.Regions={};a.Regions.CLASS="JS9";a.Regions.NAME="Regions";a.Regions.opts={updateWCS:!0,panzoom:!0,tags:"source,include",strokeWidth:2,iradius:0,oradius:30,nannuli:2,width:60,height:60,radius:30,r1:30,r2:20,ptshape:"box",ptsize:2,linepoints:[{x:-30,y:30},{x:30,y:-30}],polypoints:[{x:-30,y:30},{x:30,y:30},{x:0,y:-30}],fontFamily:"Helvetica",fontSize:14,fontStyle:"normal",fontWeight:300,textAlign:"left",angle:0, aradius1:4,aradius2:8,configURL:"./params/regionsconfig.html",saveURL:"./params/regionssave.html",sortOverlapping:!0,title:"Edit region",noCenteredScaling:["box","line"],tagcolors:{include_source:"#00FF00",exclude_source:"#FF0000",include_background:"#FFD700",exclude_background:"#FF8C00",source:"#00FF00",background:"#FFD700",defcolor:"#00FF00"},onmousedown:function(c,b,d,e){var f;!a.specialKey(d)&&e.params&&(b=(new Date).getTime(),e.params.lasttime&&b-e.params.lasttime$.inArray(b[c],g)&&h.push(b[c]);for(c=0;c$.inArray(g[c],d)&&h.push(g[c]); +c};a.Regions.unremoveRegions=function(){var a=this.regstack.pop();return a?this.addShapes("regions",a):null};a.Regions.changeRegionTags=function(a,b,d){var c;a=a||"all";b=b||[];d=d||[];$.isArray(b)||(b=b.split(",").map(function(b){return b.trim()}));$.isArray(d)||(d=d.split(",").map(function(b){return b.trim()}));var f=this.getShapes("regions",a);for(a=0;a$.inArray(b[c],g)&&h.push(b[c]);for(c=0;c$.inArray(g[c],d)&&h.push(g[c]); this.changeShapes("regions",f[a].id,{tags:h})}};a.Regions.toggleRegionTags=function(a,b,d){var c;var f=this.getShapes("regions",a||"all");for(a=0;ac){var d=Math.max(b[a-1][1],b[a][1],b[a+1][1]);break}}else d=a.y;return{x:c,y:d}};switch(a.globalOpts.plotLibrary){case "flot":var l=-25;c.find(".plotAnnotation").remove();for(e=0;ec){var d=Math.max(a[b-1][1],a[b][1],a[b+1][1]);break}}else d=b.y;return{x:c,y:d}};switch(a.globalOpts.plotLibrary){case "flot":var l=-25;c.find(".plotAnnotation").remove();for(e=0;ef.left||f.left>c.width()||(m=sprintf("
%s
",f.left,f.top+l,h,"↓"+m.text),c.append(m))}break;case "plotly":l=-30;for(e=0;e>>0;if(0===e)return!1;b|=0;for(b=Math.max(0<=b?b:e-Math.abs(b),0);b$/,l=/<[0-9][0-9]*>/;c=c.replace(l,"");for(e=0;e":c};a.uniqueID=function(){var a=1;return function(){return a++}}();a.waiting=function(c,b){switch(c){case !0:if(window.hasOwnProperty("Spinner")&& +break;case -32:f=new Float32Array(c.data.buffer,b,c.width);g=new Float32Array(d.data.buffer,e,c.width);break;case -64:f=new Float64Array(c.data.buffer,b,c.width);g=new Float64Array(d.data.buffer,e,c.width);break;default:a.error("unknown bitpix value for flip: "+c.bitpix)}return[f,g]};a.memcpy=function(a,b,d,e,f){a=new Uint8Array(a,b,f);d=new Uint8Array(d,e,f);a.set(d)};a.jupyterFocus=function(a,b){window.hasOwnProperty("Jupyter")&&(a=a instanceof jQuery?a:$(a),a.find(b||"input, textarea").each(function(b, +a){Jupyter.keyboard_manager.register_events($(a))}))};a.getImageID=function(c,b,d){var e,f=0,g=1,h=a.images.length,k=/.*<([0-9][0-9]*)>$/,l=/<[0-9][0-9]*>/;c=c.replace(l,"");for(e=0;e":c};a.uniqueID=function(){var a=1;return function(){return a++}}();a.waiting=function(c,b){switch(c){case !0:if(window.hasOwnProperty("Spinner")&& "spinner"===a.globalOpts.waitType){if(b)if("object"===typeof b)var d=b.divjq[0];else"string"===typeof b&&(c=a.lookupDisplay(b))&&(d=c.divjq[0]);d||(d=$("body").get(0));a.spinner||(a.spinner={},c={color:a.globalOpts.spinColor,opacity:a.globalOpts.spinOpacity},a.spinner.spinner=new Spinner(c));a.spinner.spinner.spin(d)}else $("body").addClass("waiting");break;case !1:window.hasOwnProperty("Spinner")&&"spinner"===a.globalOpts.waitType?a.spinner&&a.spinner.spinner.stop():$("body").removeClass("waiting")}}; a.progress=function(c,b){if("boolean"===typeof c||"string"===typeof c)switch(c){case !0:case "indeterminate":b&&(a.progress.display=b,a.progress.display.displayMessage("progress",c));break;case !1:case "":a.progress.display&&(a.progress.display.clearMessage("progress"),delete a.progress.display)}else"number"===typeof c&&a.progress.display&&a.progress.display.displayMessage("progress",[c,b])};a.msgHandler=function(c,b){var d=[];var e=c.cmd,f=c.id,g=a.globalOpts.alerts,h=a.globalOpts.quietReturn?"": "OK";b&&(a.globalOpts.alerts=!1);if(a.publics[e]){$.isArray(c.args)||(c.args=[c.args]);for(d=0;d",47:"?"};var f="number"===typeof c?c:c.which||c.keyCode;var g=String(f);d.hasOwnProperty(g)&&(f=d[g]);f=!c.shiftKey&&65<=f&&90>=f?String.fromCharCode(f+32):!c.shiftKey&&b.hasOwnProperty(f)?b[f]:c.shiftKey&&e.hasOwnProperty(f)?e[f]:String.fromCharCode(f);a.specialKey(c)&&(f="M-"+ f);return f};a.eventToDisplayPos=function(a,b){a||(a=window.event);if(a.target)var c=a.target;else a.srcElement&&(c=a.srcElement);3===c.nodeType&&(c=c.parentNode);b=b||$(c).offset();if(a.originalEvent)if(a.originalEvent.touches&&a.originalEvent.touches.length){var e=a.originalEvent.touches;c=e[0].pageX;var f=e[0].pageY}else a.originalEvent.changedTouches&&a.originalEvent.changedTouches.length?(e=a.originalEvent.changedTouches,c=e[0].pageX,f=e[0].pageY):(c=a.pageX,f=a.pageY);else c=a.pageX,f=a.pageY; a=b.left+1;b=b.top+1;f={x:Math.floor(c-a),y:Math.floor(f-b)};if(e&&e.length)for(f.touches=[{x:f.x,y:f.y}],c=1;c=c.raw.wcs||0>=b.raw.wcs)return d;var e=d.x;d=d.y;var f=a.pix2wcs(c.raw.wcs,e,d).trim().split(/\s+/);var g=a.saostrtod(f[0]);":"===String.fromCharCode(a.saodtype())&&"galactic"!==c.params.wcssys&&"ecliptic"!==c.params.wcssys&&(g*=15);c=a.saostrtod(f[1]);f=a.wcs2pix(b.raw.wcs, -g,c).trim().split(/\s+/);b=parseFloat(f[0]);c=parseFloat(f[1]);.5>Math.abs(b-e)&&(b=e);.5>Math.abs(c-d)&&(c=d);return{x:b,y:c}};a.angdist=function(a,b,d,e){var c=function(a,b){var c=[],d=Math.cos(b);c[0]=Math.cos(a)*d;c[1]=Math.sin(a)*d;c[2]=Math.sin(b);return c};a=c(a*Math.PI/180,b*Math.PI/180);d=c(d*Math.PI/180,e*Math.PI/180);return 180*-function(a,b){var c=a[0];var d=a[1];a=a[2];var e=Math.sqrt(c*c+d*d+a*a);0!=e&&(c/=e,d/=e,a/=e);e=b[0];var f=b[1];var g=b[2];b=f*c-e*d;c=g*(c*c+d*d)-a*(e*c+f*d); -return 0!=b||0!=c?Math.atan2(b,c):0}(a,d)/Math.PI};a.rotatePoint=function(a,b,d){d=d||{x:0,y:0};b=Math.PI*b/180;var c=Math.cos(b);b=Math.sin(b);return{x:c*(a.x-d.x)-b*(a.y-d.y)+d.x,y:b*(a.x-d.x)+c*(a.y-d.y)+d.y}};a.matrixMultiply=function(a,b){var c,e,f,g=a.length,h=a[0].length,k=b[0].length;var l=Array(g);for(c=0;cMath.abs(b-e)&&(b=e);.5>Math.abs(c-d)&&(c=d);return{x:b,y:c}};a.angdist=function(a,b,d,e){var c=function(b,a){var c=[],d=Math.cos(a);c[0]=Math.cos(b)*d;c[1]=Math.sin(b)*d;c[2]=Math.sin(a);return c};a=c(a*Math.PI/180,b*Math.PI/180);d=c(d*Math.PI/180,e*Math.PI/180);return 180*-function(b,a){var c=b[0];var d=b[1];b=b[2];var e=Math.sqrt(c*c+d*d+b*b);0!=e&&(c/=e,d/=e,b/=e);e=a[0];var f=a[1];var g=a[2];a=f*c-e*d;c=g*(c*c+d*d)-b*(e*c+f*d); +return 0!=a||0!=c?Math.atan2(a,c):0}(a,d)/Math.PI};a.rotatePoint=function(a,b,d){d=d||{x:0,y:0};b=Math.PI*b/180;var c=Math.cos(b);b=Math.sin(b);return{x:c*(a.x-d.x)-b*(a.y-d.y)+d.x,y:b*(a.x-d.x)+c*(a.y-d.y)+d.y}};a.matrixMultiply=function(a,b){var c,e,f,g=a.length,h=a[0].length,k=b[0].length;var l=Array(g);for(c=0;cb;b++)for(c=0;2>c;c++)if(void 0===a[b][c]||Number.isNaN(a[b][c]))return null;0<=g?e+=g:f+=g;g=-a[0][1]*a[1][0];0<=g?e+=g:f+=g;b=e+f;if(0===b||1E-15>Math.abs(b/(e-f)))return null;b=1/b;h[0][0]=a[1][1]*b;h[1][0]=-a[1][0]*b;h[0][1]=-a[0][1]*b;h[1][1]=a[0][0]*b;h[2][0]=-(a[2][0]*h[0][0]+a[2][1]*h[1][0]);h[2][1]=-(a[2][0]*h[0][1]+a[2][1]*h[1][1]);return h};a.isNumber=function(a){return!isNaN(parseFloat(a))&&isFinite(a)};a.notNull=function(a){return void 0!==a&&null!==a};a.isNull=function(a){return void 0=== a||null===a};a.defNull=function(c,b){return a.notNull(c)?c:b};a.cardpars=function(c){var b=c.slice(0,8).trim();if("HISTORY"===b||"COMMENT"===b)return[b,c.slice(9).trim()];if("="===c[8])return c=c.slice(10).replace(/'/g," ").replace(/ \/.*/,"").trim(),"T"===c?c=!0:"F"===c?c=!1:a.isNumber(c)&&(c=parseFloat(c)),[b,c]};a.raw2FITS=function(c,b){var d,e=!1,f="",g={};var h=function(a,b,c,d){var e=a;if("XTENSION"!==b||c){var f=new RegExp(b+" *= *(-?[-+]?[0-9]*.?[0-9]*([eE][-+]?[0-9]+)?) *");a?(a=a.replace(f, "$1"),a=parseFloat(a)):a=void 0;a!==c&&(e=sprintf("%-8s= %20s / %-47s",b,c,d||""))}else e=sprintf("%s = %20s / %-47s","SIMPLE","T","file does conform to FITS standard");g[b]=!0;return e};if(!c)return f;b=b||{};"boolean"===typeof b&&(b={addcr:b});if(c.card||c.cardstr){var k=c.header||{};var l=c.card?c.card.length:c.ncard;for(d=0;d