From f5c9b9a0e02dd7e387e004b8555f8ebc72af3e88 Mon Sep 17 00:00:00 2001 From: "William (Lindy) Lindstrom" Date: Wed, 13 Nov 2024 23:20:00 +0000 Subject: [PATCH 01/17] add library used for aladin sun,moon positioning see tom_targets/templates/tom_targets/partials/aladin_skymap.html for where and how this library is used. --- tom_targets/static/tom_targets/js/suncalc.js | 318 +++++++++++++++++++ 1 file changed, 318 insertions(+) create mode 100644 tom_targets/static/tom_targets/js/suncalc.js diff --git a/tom_targets/static/tom_targets/js/suncalc.js b/tom_targets/static/tom_targets/js/suncalc.js new file mode 100644 index 000000000..e8f8cc696 --- /dev/null +++ b/tom_targets/static/tom_targets/js/suncalc.js @@ -0,0 +1,318 @@ +/* + (c) 2011-2015, Vladimir Agafonkin + SunCalc is a JavaScript library for calculating sun/moon position and light phases. + https://github.com/mourner/suncalc +*/ + +(function () { 'use strict'; + + // shortcuts for easier to read formulas + + var PI = Math.PI, + sin = Math.sin, + cos = Math.cos, + tan = Math.tan, + asin = Math.asin, + atan = Math.atan2, + acos = Math.acos, + rad = PI / 180; + + // sun calculations are based on http://aa.quae.nl/en/reken/zonpositie.html formulas + + + // date/time constants and conversions + + var dayMs = 1000 * 60 * 60 * 24, + J1970 = 2440588, + J2000 = 2451545; + + function toJulian(date) { return date.valueOf() / dayMs - 0.5 + J1970; } + function fromJulian(j) { return new Date((j + 0.5 - J1970) * dayMs); } + function toDays(date) { return toJulian(date) - J2000; } + + + // general calculations for position + + var e = rad * 23.4397; // obliquity of the Earth + + function rightAscension(l, b) { return atan(sin(l) * cos(e) - tan(b) * sin(e), cos(l)); } + function declination(l, b) { return asin(sin(b) * cos(e) + cos(b) * sin(e) * sin(l)); } + + function azimuth(H, phi, dec) { return atan(sin(H), cos(H) * sin(phi) - tan(dec) * cos(phi)); } + function altitude(H, phi, dec) { return asin(sin(phi) * sin(dec) + cos(phi) * cos(dec) * cos(H)); } + + function siderealTime(d, lw) { return rad * (280.16 + 360.9856235 * d) - lw; } + + function astroRefraction(h) { + if (h < 0) // the following formula works for positive altitudes only. + h = 0; // if h = -0.08901179 a div/0 would occur. + + // formula 16.4 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998. + // 1.02 / tan(h + 10.26 / (h + 5.10)) h in degrees, result in arc minutes -> converted to rad: + return 0.0002967 / Math.tan(h + 0.00312536 / (h + 0.08901179)); + } + + // general sun calculations + + function solarMeanAnomaly(d) { return rad * (357.5291 + 0.98560028 * d); } + + function eclipticLongitude(M) { + + var C = rad * (1.9148 * sin(M) + 0.02 * sin(2 * M) + 0.0003 * sin(3 * M)), // equation of center + P = rad * 102.9372; // perihelion of the Earth + + return M + C + P + PI; + } + + function sunCoords(d) { + + var M = solarMeanAnomaly(d), + L = eclipticLongitude(M); + + return { + dec: declination(L, 0), + ra: rightAscension(L, 0) + }; + } + + + var SunCalc = {}; + + + // calculates sun position for a given date and latitude/longitude + + SunCalc.getPosition = function (date, lat, lng) { + + var lw = rad * -lng, + phi = rad * lat, + d = toDays(date), + + c = sunCoords(d), + H = siderealTime(d, lw) - c.ra; + + return { + azimuth: azimuth(H, phi, c.dec), + altitude: altitude(H, phi, c.dec) + }; + }; + + + // sun times configuration (angle, morning name, evening name) + + var times = SunCalc.times = [ + [-0.833, 'sunrise', 'sunset' ], + [ -0.3, 'sunriseEnd', 'sunsetStart' ], + [ -6, 'dawn', 'dusk' ], + [ -12, 'nauticalDawn', 'nauticalDusk'], + [ -18, 'nightEnd', 'night' ], + [ 6, 'goldenHourEnd', 'goldenHour' ] + ]; + + // adds a custom time to the times config + + SunCalc.addTime = function (angle, riseName, setName) { + times.push([angle, riseName, setName]); + }; + + + // calculations for sun times + + var J0 = 0.0009; + + function julianCycle(d, lw) { return Math.round(d - J0 - lw / (2 * PI)); } + + function approxTransit(Ht, lw, n) { return J0 + (Ht + lw) / (2 * PI) + n; } + function solarTransitJ(ds, M, L) { return J2000 + ds + 0.0053 * sin(M) - 0.0069 * sin(2 * L); } + + function hourAngle(h, phi, d) { return acos((sin(h) - sin(phi) * sin(d)) / (cos(phi) * cos(d))); } + function observerAngle(height) { return -2.076 * Math.sqrt(height) / 60; } + + // returns set time for the given sun altitude + function getSetJ(h, lw, phi, dec, n, M, L) { + + var w = hourAngle(h, phi, dec), + a = approxTransit(w, lw, n); + return solarTransitJ(a, M, L); + } + + + // calculates sun times for a given date, latitude/longitude, and, optionally, + // the observer height (in meters) relative to the horizon + + SunCalc.getTimes = function (date, lat, lng, height) { + + height = height || 0; + + var lw = rad * -lng, + phi = rad * lat, + + dh = observerAngle(height), + + d = toDays(date), + n = julianCycle(d, lw), + ds = approxTransit(0, lw, n), + + M = solarMeanAnomaly(ds), + L = eclipticLongitude(M), + dec = declination(L, 0), + + Jnoon = solarTransitJ(ds, M, L), + + i, len, time, h0, Jset, Jrise; + + + var result = { + solarNoon: fromJulian(Jnoon), + nadir: fromJulian(Jnoon - 0.5) + }; + + for (i = 0, len = times.length; i < len; i += 1) { + time = times[i]; + h0 = (time[0] + dh) * rad; + + Jset = getSetJ(h0, lw, phi, dec, n, M, L); + Jrise = Jnoon - (Jset - Jnoon); + + result[time[1]] = fromJulian(Jrise); + result[time[2]] = fromJulian(Jset); + } + + return result; + }; + + + // moon calculations, based on http://aa.quae.nl/en/reken/hemelpositie.html formulas + + SunCalc.geocentricMoonCoords = function (d) { // geocentric ecliptic coordinates of the moon + + var L = rad * (218.316 + 13.176396 * d), // ecliptic longitude + M = rad * (134.963 + 13.064993 * d), // mean anomaly + F = rad * (93.272 + 13.229350 * d), // mean distance + + l = L + rad * 6.289 * sin(M), // longitude + b = rad * 5.128 * sin(F), // latitude + dt = 385001 - 20905 * cos(M); // distance to the moon in km + + return { + ra: rightAscension(l, b), + dec: declination(l, b), + dist: dt + }; + } + + SunCalc.getMoonPosition = function (date, lat, lng) { + + var lw = rad * -lng, + phi = rad * lat, + d = toDays(date), + + c = SunCalc.geocentricMoonCoords(d), + H = siderealTime(d, lw) - c.ra, + h = altitude(H, phi, c.dec), + // formula 14.1 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998. + pa = atan(sin(H), tan(phi) * cos(c.dec) - sin(c.dec) * cos(H)); + + h = h + astroRefraction(h); // altitude correction for refraction + + return { + azimuth: azimuth(H, phi, c.dec), + altitude: h, + distance: c.dist, + parallacticAngle: pa + }; + }; + + + // calculations for illumination parameters of the moon, + // based on http://idlastro.gsfc.nasa.gov/ftp/pro/astro/mphase.pro formulas and + // Chapter 48 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998. + + SunCalc.getMoonIllumination = function (date) { + + var d = toDays(date || new Date()), + s = sunCoords(d), + m = SunCalc.geocentricMoonCoords(d), + + sdist = 149598000, // distance from Earth to Sun in km + + phi = acos(sin(s.dec) * sin(m.dec) + cos(s.dec) * cos(m.dec) * cos(s.ra - m.ra)), + inc = atan(sdist * sin(phi), m.dist - sdist * cos(phi)), + angle = atan(cos(s.dec) * sin(s.ra - m.ra), sin(s.dec) * cos(m.dec) - + cos(s.dec) * sin(m.dec) * cos(s.ra - m.ra)); + + return { + fraction: (1 + cos(inc)) / 2, + phase: 0.5 + 0.5 * inc * (angle < 0 ? -1 : 1) / Math.PI, + angle: angle + }; + }; + + + function hoursLater(date, h) { + return new Date(date.valueOf() + h * dayMs / 24); + } + + // calculations for moon rise/set times are based on http://www.stargazing.net/kepler/moonrise.html article + + SunCalc.getMoonTimes = function (date, lat, lng, inUTC) { + var t = new Date(date); + if (inUTC) t.setUTCHours(0, 0, 0, 0); + else t.setHours(0, 0, 0, 0); + + var hc = 0.133 * rad, + h0 = SunCalc.getMoonPosition(t, lat, lng).altitude - hc, + h1, h2, rise, set, a, b, xe, ye, d, roots, x1, x2, dx; + + // go in 2-hour chunks, each time seeing if a 3-point quadratic curve crosses zero (which means rise or set) + for (var i = 1; i <= 24; i += 2) { + h1 = SunCalc.getMoonPosition(hoursLater(t, i), lat, lng).altitude - hc; + h2 = SunCalc.getMoonPosition(hoursLater(t, i + 1), lat, lng).altitude - hc; + + a = (h0 + h2) / 2 - h1; + b = (h2 - h0) / 2; + xe = -b / (2 * a); + ye = (a * xe + b) * xe + h1; + d = b * b - 4 * a * h1; + roots = 0; + + if (d >= 0) { + dx = Math.sqrt(d) / (Math.abs(a) * 2); + x1 = xe - dx; + x2 = xe + dx; + if (Math.abs(x1) <= 1) roots++; + if (Math.abs(x2) <= 1) roots++; + if (x1 < -1) x1 = x2; + } + + if (roots === 1) { + if (h0 < 0) rise = i + x1; + else set = i + x1; + + } else if (roots === 2) { + rise = i + (ye < 0 ? x2 : x1); + set = i + (ye < 0 ? x1 : x2); + } + + if (rise && set) break; + + h0 = h2; + } + + var result = {}; + + if (rise) result.rise = hoursLater(t, rise); + if (set) result.set = hoursLater(t, set); + + if (!rise && !set) result[ye > 0 ? 'alwaysUp' : 'alwaysDown'] = true; + + return result; + }; + + + // export as Node module / AMD module / browser variable + if (typeof exports === 'object' && typeof module !== 'undefined') module.exports = SunCalc; + else if (typeof define === 'function' && define.amd) define(SunCalc); + else window.SunCalc = SunCalc; + + }()); + \ No newline at end of file From bcd653e1072a42d563d8393a8833e792c9745724 Mon Sep 17 00:00:00 2001 From: "William (Lindy) Lindstrom" Date: Wed, 13 Nov 2024 23:28:29 +0000 Subject: [PATCH 02/17] load suncalc.js for use in finding sun,moon positions for aladin Co-authored-by: --- .../templates/tom_targets/partials/aladin_skymap.html | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tom_targets/templates/tom_targets/partials/aladin_skymap.html b/tom_targets/templates/tom_targets/partials/aladin_skymap.html index 4972a968a..338755b5f 100644 --- a/tom_targets/templates/tom_targets/partials/aladin_skymap.html +++ b/tom_targets/templates/tom_targets/partials/aladin_skymap.html @@ -1,6 +1,11 @@ +{% load static %}
+ + + + From 1876e1f901ab0d3b92cddc54318ff8f623c0a171 Mon Sep 17 00:00:00 2001 From: "William (Lindy) Lindstrom" Date: Thu, 14 Nov 2024 23:37:58 +0000 Subject: [PATCH 06/17] remove suncalc.js to use astropy instead --- tom_targets/static/tom_targets/js/suncalc.js | 318 ------------------ .../tom_targets/partials/aladin_skymap.html | 13 - 2 files changed, 331 deletions(-) delete mode 100644 tom_targets/static/tom_targets/js/suncalc.js diff --git a/tom_targets/static/tom_targets/js/suncalc.js b/tom_targets/static/tom_targets/js/suncalc.js deleted file mode 100644 index e8f8cc696..000000000 --- a/tom_targets/static/tom_targets/js/suncalc.js +++ /dev/null @@ -1,318 +0,0 @@ -/* - (c) 2011-2015, Vladimir Agafonkin - SunCalc is a JavaScript library for calculating sun/moon position and light phases. - https://github.com/mourner/suncalc -*/ - -(function () { 'use strict'; - - // shortcuts for easier to read formulas - - var PI = Math.PI, - sin = Math.sin, - cos = Math.cos, - tan = Math.tan, - asin = Math.asin, - atan = Math.atan2, - acos = Math.acos, - rad = PI / 180; - - // sun calculations are based on http://aa.quae.nl/en/reken/zonpositie.html formulas - - - // date/time constants and conversions - - var dayMs = 1000 * 60 * 60 * 24, - J1970 = 2440588, - J2000 = 2451545; - - function toJulian(date) { return date.valueOf() / dayMs - 0.5 + J1970; } - function fromJulian(j) { return new Date((j + 0.5 - J1970) * dayMs); } - function toDays(date) { return toJulian(date) - J2000; } - - - // general calculations for position - - var e = rad * 23.4397; // obliquity of the Earth - - function rightAscension(l, b) { return atan(sin(l) * cos(e) - tan(b) * sin(e), cos(l)); } - function declination(l, b) { return asin(sin(b) * cos(e) + cos(b) * sin(e) * sin(l)); } - - function azimuth(H, phi, dec) { return atan(sin(H), cos(H) * sin(phi) - tan(dec) * cos(phi)); } - function altitude(H, phi, dec) { return asin(sin(phi) * sin(dec) + cos(phi) * cos(dec) * cos(H)); } - - function siderealTime(d, lw) { return rad * (280.16 + 360.9856235 * d) - lw; } - - function astroRefraction(h) { - if (h < 0) // the following formula works for positive altitudes only. - h = 0; // if h = -0.08901179 a div/0 would occur. - - // formula 16.4 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998. - // 1.02 / tan(h + 10.26 / (h + 5.10)) h in degrees, result in arc minutes -> converted to rad: - return 0.0002967 / Math.tan(h + 0.00312536 / (h + 0.08901179)); - } - - // general sun calculations - - function solarMeanAnomaly(d) { return rad * (357.5291 + 0.98560028 * d); } - - function eclipticLongitude(M) { - - var C = rad * (1.9148 * sin(M) + 0.02 * sin(2 * M) + 0.0003 * sin(3 * M)), // equation of center - P = rad * 102.9372; // perihelion of the Earth - - return M + C + P + PI; - } - - function sunCoords(d) { - - var M = solarMeanAnomaly(d), - L = eclipticLongitude(M); - - return { - dec: declination(L, 0), - ra: rightAscension(L, 0) - }; - } - - - var SunCalc = {}; - - - // calculates sun position for a given date and latitude/longitude - - SunCalc.getPosition = function (date, lat, lng) { - - var lw = rad * -lng, - phi = rad * lat, - d = toDays(date), - - c = sunCoords(d), - H = siderealTime(d, lw) - c.ra; - - return { - azimuth: azimuth(H, phi, c.dec), - altitude: altitude(H, phi, c.dec) - }; - }; - - - // sun times configuration (angle, morning name, evening name) - - var times = SunCalc.times = [ - [-0.833, 'sunrise', 'sunset' ], - [ -0.3, 'sunriseEnd', 'sunsetStart' ], - [ -6, 'dawn', 'dusk' ], - [ -12, 'nauticalDawn', 'nauticalDusk'], - [ -18, 'nightEnd', 'night' ], - [ 6, 'goldenHourEnd', 'goldenHour' ] - ]; - - // adds a custom time to the times config - - SunCalc.addTime = function (angle, riseName, setName) { - times.push([angle, riseName, setName]); - }; - - - // calculations for sun times - - var J0 = 0.0009; - - function julianCycle(d, lw) { return Math.round(d - J0 - lw / (2 * PI)); } - - function approxTransit(Ht, lw, n) { return J0 + (Ht + lw) / (2 * PI) + n; } - function solarTransitJ(ds, M, L) { return J2000 + ds + 0.0053 * sin(M) - 0.0069 * sin(2 * L); } - - function hourAngle(h, phi, d) { return acos((sin(h) - sin(phi) * sin(d)) / (cos(phi) * cos(d))); } - function observerAngle(height) { return -2.076 * Math.sqrt(height) / 60; } - - // returns set time for the given sun altitude - function getSetJ(h, lw, phi, dec, n, M, L) { - - var w = hourAngle(h, phi, dec), - a = approxTransit(w, lw, n); - return solarTransitJ(a, M, L); - } - - - // calculates sun times for a given date, latitude/longitude, and, optionally, - // the observer height (in meters) relative to the horizon - - SunCalc.getTimes = function (date, lat, lng, height) { - - height = height || 0; - - var lw = rad * -lng, - phi = rad * lat, - - dh = observerAngle(height), - - d = toDays(date), - n = julianCycle(d, lw), - ds = approxTransit(0, lw, n), - - M = solarMeanAnomaly(ds), - L = eclipticLongitude(M), - dec = declination(L, 0), - - Jnoon = solarTransitJ(ds, M, L), - - i, len, time, h0, Jset, Jrise; - - - var result = { - solarNoon: fromJulian(Jnoon), - nadir: fromJulian(Jnoon - 0.5) - }; - - for (i = 0, len = times.length; i < len; i += 1) { - time = times[i]; - h0 = (time[0] + dh) * rad; - - Jset = getSetJ(h0, lw, phi, dec, n, M, L); - Jrise = Jnoon - (Jset - Jnoon); - - result[time[1]] = fromJulian(Jrise); - result[time[2]] = fromJulian(Jset); - } - - return result; - }; - - - // moon calculations, based on http://aa.quae.nl/en/reken/hemelpositie.html formulas - - SunCalc.geocentricMoonCoords = function (d) { // geocentric ecliptic coordinates of the moon - - var L = rad * (218.316 + 13.176396 * d), // ecliptic longitude - M = rad * (134.963 + 13.064993 * d), // mean anomaly - F = rad * (93.272 + 13.229350 * d), // mean distance - - l = L + rad * 6.289 * sin(M), // longitude - b = rad * 5.128 * sin(F), // latitude - dt = 385001 - 20905 * cos(M); // distance to the moon in km - - return { - ra: rightAscension(l, b), - dec: declination(l, b), - dist: dt - }; - } - - SunCalc.getMoonPosition = function (date, lat, lng) { - - var lw = rad * -lng, - phi = rad * lat, - d = toDays(date), - - c = SunCalc.geocentricMoonCoords(d), - H = siderealTime(d, lw) - c.ra, - h = altitude(H, phi, c.dec), - // formula 14.1 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998. - pa = atan(sin(H), tan(phi) * cos(c.dec) - sin(c.dec) * cos(H)); - - h = h + astroRefraction(h); // altitude correction for refraction - - return { - azimuth: azimuth(H, phi, c.dec), - altitude: h, - distance: c.dist, - parallacticAngle: pa - }; - }; - - - // calculations for illumination parameters of the moon, - // based on http://idlastro.gsfc.nasa.gov/ftp/pro/astro/mphase.pro formulas and - // Chapter 48 of "Astronomical Algorithms" 2nd edition by Jean Meeus (Willmann-Bell, Richmond) 1998. - - SunCalc.getMoonIllumination = function (date) { - - var d = toDays(date || new Date()), - s = sunCoords(d), - m = SunCalc.geocentricMoonCoords(d), - - sdist = 149598000, // distance from Earth to Sun in km - - phi = acos(sin(s.dec) * sin(m.dec) + cos(s.dec) * cos(m.dec) * cos(s.ra - m.ra)), - inc = atan(sdist * sin(phi), m.dist - sdist * cos(phi)), - angle = atan(cos(s.dec) * sin(s.ra - m.ra), sin(s.dec) * cos(m.dec) - - cos(s.dec) * sin(m.dec) * cos(s.ra - m.ra)); - - return { - fraction: (1 + cos(inc)) / 2, - phase: 0.5 + 0.5 * inc * (angle < 0 ? -1 : 1) / Math.PI, - angle: angle - }; - }; - - - function hoursLater(date, h) { - return new Date(date.valueOf() + h * dayMs / 24); - } - - // calculations for moon rise/set times are based on http://www.stargazing.net/kepler/moonrise.html article - - SunCalc.getMoonTimes = function (date, lat, lng, inUTC) { - var t = new Date(date); - if (inUTC) t.setUTCHours(0, 0, 0, 0); - else t.setHours(0, 0, 0, 0); - - var hc = 0.133 * rad, - h0 = SunCalc.getMoonPosition(t, lat, lng).altitude - hc, - h1, h2, rise, set, a, b, xe, ye, d, roots, x1, x2, dx; - - // go in 2-hour chunks, each time seeing if a 3-point quadratic curve crosses zero (which means rise or set) - for (var i = 1; i <= 24; i += 2) { - h1 = SunCalc.getMoonPosition(hoursLater(t, i), lat, lng).altitude - hc; - h2 = SunCalc.getMoonPosition(hoursLater(t, i + 1), lat, lng).altitude - hc; - - a = (h0 + h2) / 2 - h1; - b = (h2 - h0) / 2; - xe = -b / (2 * a); - ye = (a * xe + b) * xe + h1; - d = b * b - 4 * a * h1; - roots = 0; - - if (d >= 0) { - dx = Math.sqrt(d) / (Math.abs(a) * 2); - x1 = xe - dx; - x2 = xe + dx; - if (Math.abs(x1) <= 1) roots++; - if (Math.abs(x2) <= 1) roots++; - if (x1 < -1) x1 = x2; - } - - if (roots === 1) { - if (h0 < 0) rise = i + x1; - else set = i + x1; - - } else if (roots === 2) { - rise = i + (ye < 0 ? x2 : x1); - set = i + (ye < 0 ? x1 : x2); - } - - if (rise && set) break; - - h0 = h2; - } - - var result = {}; - - if (rise) result.rise = hoursLater(t, rise); - if (set) result.set = hoursLater(t, set); - - if (!rise && !set) result[ye > 0 ? 'alwaysUp' : 'alwaysDown'] = true; - - return result; - }; - - - // export as Node module / AMD module / browser variable - if (typeof exports === 'object' && typeof module !== 'undefined') module.exports = SunCalc; - else if (typeof define === 'function' && define.amd) define(SunCalc); - else window.SunCalc = SunCalc; - - }()); - \ No newline at end of file diff --git a/tom_targets/templates/tom_targets/partials/aladin_skymap.html b/tom_targets/templates/tom_targets/partials/aladin_skymap.html index 364b05108..9807de525 100644 --- a/tom_targets/templates/tom_targets/partials/aladin_skymap.html +++ b/tom_targets/templates/tom_targets/partials/aladin_skymap.html @@ -1,11 +1,6 @@ -{% load static %}
- - - - From af1c69b5491bd3cd62c3f0ea95c2a831b438d03b Mon Sep 17 00:00:00 2001 From: "William (Lindy) Lindstrom" Date: Thu, 14 Nov 2024 23:49:55 +0000 Subject: [PATCH 11/17] name catalogOptions what they are - not dot_defintion which it isn't --- .../templates/tom_targets/partials/aladin_skymap.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tom_targets/templates/tom_targets/partials/aladin_skymap.html b/tom_targets/templates/tom_targets/partials/aladin_skymap.html index 8a4b4e81c..ae6855951 100644 --- a/tom_targets/templates/tom_targets/partials/aladin_skymap.html +++ b/tom_targets/templates/tom_targets/partials/aladin_skymap.html @@ -22,12 +22,12 @@ for (var i = 0; i < targets.length; i++) { var target = targets[i]; - var dot_definition = { + var catalogOptions = { name: target.name, - color: 'blue', + color: 'rgb(46, 107, 131)', // TOMToolkit Blue sourceSize: 16}; - var cat = A.catalog(dot_definition); + var cat = A.catalog(catalogOptions); aladin.addCatalog(cat); popup_info = ['RA: '.concat(target.ra, '
', 'Dec: ', target.dec)]; cat.addSources([A.marker(target.ra, target.dec, {popupTitle: target.name, popupDesc: popup_info})]); From 94bfa48b736ba79514c2d2f33770b1c0c53f43d2 Mon Sep 17 00:00:00 2001 From: "William (Lindy) Lindstrom" Date: Fri, 15 Nov 2024 00:03:34 +0000 Subject: [PATCH 12/17] nfc: comments, formatting, code organization --- .../tom_targets/partials/aladin_skymap.html | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/tom_targets/templates/tom_targets/partials/aladin_skymap.html b/tom_targets/templates/tom_targets/partials/aladin_skymap.html index ae6855951..4b89ed2e6 100644 --- a/tom_targets/templates/tom_targets/partials/aladin_skymap.html +++ b/tom_targets/templates/tom_targets/partials/aladin_skymap.html @@ -16,7 +16,8 @@ }); aladin.setCooGrid({ color: 'grey', labelSize: 10 }); - + + // extract the targets from the context var targets = {{ targets|safe }}; //targets cannot be a queryset; here it is a list of dictionaries for (var i = 0; i < targets.length; i++) { @@ -33,19 +34,19 @@ cat.addSources([A.marker(target.ra, target.dec, {popupTitle: target.name, popupDesc: popup_info})]); } + // extract Moon information from the context + const moonRaDeg = {{ moon_ra|safe }}; + const moonDecDeg = {{ moon_dec|safe }}; const moonIllumination = {{ moon_illumination|safe }}.toFixed(3); const moonGreyscale = 255 * moonIllumination; // add catalog for the Moon - const moonCatalog = A.catalog( - {name: 'Moon', + const moonCatalog = A.catalog({ + name: 'Moon', shape: 'circle', color: `rgb(${moonGreyscale}, ${moonGreyscale}, ${moonGreyscale})`, sourceSize: 26}); - const moonRaDeg = {{ moon_ra|safe }}; - const moonDecDeg = {{ moon_dec|safe }}; - const popupMoonDescription = `Illumination: ${moonIllumination}
RA: ${moonRaDeg.toFixed(4)}
Dec: ${moonDecDeg.toFixed(4)}`; moonCatalog.addSources([A.marker(moonRaDeg, moonDecDeg, @@ -56,8 +57,8 @@ aladin.addCatalog(moonCatalog); // now add the sun in its own catalog - const sunCatalog = A.catalog( - {name: 'Sun', + const sunCatalog = A.catalog({ + name: 'Sun', shape: 'circle', color: 'yellow', sourceSize: 15}); From e721c31d9b9a6c7da04aeff7a3190ee7966836b0 Mon Sep 17 00:00:00 2001 From: "William (Lindy) Lindstrom" Date: Fri, 15 Nov 2024 00:35:18 +0000 Subject: [PATCH 13/17] put targets in one catalog (vs. each in its own) --- .../tom_targets/partials/aladin_skymap.html | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/tom_targets/templates/tom_targets/partials/aladin_skymap.html b/tom_targets/templates/tom_targets/partials/aladin_skymap.html index 4b89ed2e6..7da8b3d0d 100644 --- a/tom_targets/templates/tom_targets/partials/aladin_skymap.html +++ b/tom_targets/templates/tom_targets/partials/aladin_skymap.html @@ -20,19 +20,20 @@ // extract the targets from the context var targets = {{ targets|safe }}; //targets cannot be a queryset; here it is a list of dictionaries + // define catalog for the targets + var catalogOptions = { + name: 'Targets', + color: 'rgb(46, 107, 131)', // TOMToolkit Blue + sourceSize: 16}; + var targetCatalog = A.catalog(catalogOptions); + + // add targets to the catalog for (var i = 0; i < targets.length; i++) { var target = targets[i]; - - var catalogOptions = { - name: target.name, - color: 'rgb(46, 107, 131)', // TOMToolkit Blue - sourceSize: 16}; - - var cat = A.catalog(catalogOptions); - aladin.addCatalog(cat); - popup_info = ['RA: '.concat(target.ra, '
', 'Dec: ', target.dec)]; - cat.addSources([A.marker(target.ra, target.dec, {popupTitle: target.name, popupDesc: popup_info})]); + popupInfo = ['RA: '.concat(target.ra, '
', 'Dec: ', target.dec)]; + targetCatalog.addSources([A.marker(target.ra, target.dec, {popupTitle: target.name, popupDesc: popupInfo})]); } + aladin.addCatalog(targetCatalog); // extract Moon information from the context const moonRaDeg = {{ moon_ra|safe }}; From 10bf258dc9a34536a1d8c3bde6cf9b7fc620ce8c Mon Sep 17 00:00:00 2001 From: Joey Chatelain Date: Tue, 19 Nov 2024 14:09:36 -0800 Subject: [PATCH 14/17] add symbolic representation of moon phase --- .../tom_targets/partials/aladin_skymap.html | 40 ++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/tom_targets/templates/tom_targets/partials/aladin_skymap.html b/tom_targets/templates/tom_targets/partials/aladin_skymap.html index 7da8b3d0d..c95d3849a 100644 --- a/tom_targets/templates/tom_targets/partials/aladin_skymap.html +++ b/tom_targets/templates/tom_targets/partials/aladin_skymap.html @@ -41,21 +41,43 @@ const moonIllumination = {{ moon_illumination|safe }}.toFixed(3); const moonGreyscale = 255 * moonIllumination; - // add catalog for the Moon - const moonCatalog = A.catalog({ - name: 'Moon', - shape: 'circle', - color: `rgb(${moonGreyscale}, ${moonGreyscale}, ${moonGreyscale})`, - sourceSize: 26}); + // get a unicode representation of the Moon based on illumination fraction + var unicodeMoon; + if (moonIllumination <= 0.125 ) { + unicodeMoon = "\uD83C\uDF11"; + } else if (moonIllumination <= 0.375) { + unicodeMoon = "\uD83C\uDF12"; + } else if (moonIllumination <= 0.625) { + unicodeMoon = "\uD83C\uDF13"; + } else if (moonIllumination <= 0.875) { + unicodeMoon = "\uD83C\uDF14"; + } else if (moonIllumination <= 1.0) { + unicodeMoon = "\uD83C\uDF15"; + } + + // Create a text based symbol for the moon centered on the source coordinates + var drawMoon = function(source, canvasCtx) { + + canvasCtx.globalAlpha = 1; + + canvasCtx.font = '25px Arial'; + canvasCtx.fillStyle = '#eee'; + canvasCtx.textBaseline = 'middle'; + canvasCtx.textAlign = 'center'; + canvasCtx.fillText(unicodeMoon, source.x, source.y); + }; + + // create a catalog for the moon + const moonImage = A.catalog({shape: drawMoon}); const popupMoonDescription = `Illumination: ${moonIllumination}
RA: ${moonRaDeg.toFixed(4)}
Dec: ${moonDecDeg.toFixed(4)}`; - moonCatalog.addSources([A.marker(moonRaDeg, moonDecDeg, + moonImage.addSources([A.marker(moonRaDeg, moonDecDeg, {popupTitle: 'Geocentric Moon', - popupDesc: popupMoonDescription + popupDesc: popupMoonDescription, })]); - aladin.addCatalog(moonCatalog); + aladin.addCatalog(moonImage); // now add the sun in its own catalog const sunCatalog = A.catalog({ From 80228b6716433e3d7b4f965930c5faaea8ecabc6 Mon Sep 17 00:00:00 2001 From: "William (Lindy) Lindstrom" Date: Wed, 20 Nov 2024 00:15:47 +0000 Subject: [PATCH 15/17] make Target symbols a standard color --- tom_targets/templates/tom_targets/partials/aladin_skymap.html | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tom_targets/templates/tom_targets/partials/aladin_skymap.html b/tom_targets/templates/tom_targets/partials/aladin_skymap.html index c95d3849a..a6591b41a 100644 --- a/tom_targets/templates/tom_targets/partials/aladin_skymap.html +++ b/tom_targets/templates/tom_targets/partials/aladin_skymap.html @@ -23,7 +23,7 @@ // define catalog for the targets var catalogOptions = { name: 'Targets', - color: 'rgb(46, 107, 131)', // TOMToolkit Blue + color: 'blue', sourceSize: 16}; var targetCatalog = A.catalog(catalogOptions); @@ -57,9 +57,7 @@ // Create a text based symbol for the moon centered on the source coordinates var drawMoon = function(source, canvasCtx) { - canvasCtx.globalAlpha = 1; - canvasCtx.font = '25px Arial'; canvasCtx.fillStyle = '#eee'; canvasCtx.textBaseline = 'middle'; From 200c95071f15b704ccded882633e15d8bc788145 Mon Sep 17 00:00:00 2001 From: "William (Lindy) Lindstrom" Date: Wed, 20 Nov 2024 00:16:34 +0000 Subject: [PATCH 16/17] clarify popupTitle wording --- tom_targets/templates/tom_targets/partials/aladin_skymap.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tom_targets/templates/tom_targets/partials/aladin_skymap.html b/tom_targets/templates/tom_targets/partials/aladin_skymap.html index a6591b41a..c82390674 100644 --- a/tom_targets/templates/tom_targets/partials/aladin_skymap.html +++ b/tom_targets/templates/tom_targets/partials/aladin_skymap.html @@ -71,7 +71,7 @@ const popupMoonDescription = `Illumination: ${moonIllumination}
RA: ${moonRaDeg.toFixed(4)}
Dec: ${moonDecDeg.toFixed(4)}`; moonImage.addSources([A.marker(moonRaDeg, moonDecDeg, - {popupTitle: 'Geocentric Moon', + {popupTitle: 'Moon (Geocentric)', popupDesc: popupMoonDescription, })]); @@ -90,7 +90,7 @@ const popupSunDescription = `RA: ${sunRaDeg.toFixed(4)}
Dec: ${sunDecDeg.toFixed(4)}`; sunCatalog.addSources([A.marker(sunRaDeg, sunDecDeg, - {popupTitle: 'Geocentric Sun', + {popupTitle: 'Sun (Geocentric)', popupDesc: popupSunDescription, })]); From b7cc2dfa48131bd32475e3fc569cad1e4c2a6dc7 Mon Sep 17 00:00:00 2001 From: "William (Lindy) Lindstrom" Date: Wed, 20 Nov 2024 00:17:20 +0000 Subject: [PATCH 17/17] match the size of the icons for the Sun and Moon --- tom_targets/templates/tom_targets/partials/aladin_skymap.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tom_targets/templates/tom_targets/partials/aladin_skymap.html b/tom_targets/templates/tom_targets/partials/aladin_skymap.html index c82390674..0ce2e3e72 100644 --- a/tom_targets/templates/tom_targets/partials/aladin_skymap.html +++ b/tom_targets/templates/tom_targets/partials/aladin_skymap.html @@ -82,7 +82,7 @@ name: 'Sun', shape: 'circle', color: 'yellow', - sourceSize: 15}); + sourceSize: 30}); // fontSize from Moon canvas plus 5 to match sizes const sunRaDeg = {{ sun_ra|safe }}; const sunDecDeg = {{ sun_dec|safe }};