refact querying ressources (moc, tiles, allsky map)

This commit is contained in:
Matthieu Baumann
2025-07-02 10:30:14 +02:00
committed by Matthieu Baumann
parent f9722a69ff
commit 9ea92b3bff
13 changed files with 109 additions and 236 deletions

View File

@@ -11,7 +11,7 @@
import A from '../src/js/A.js';
let aladin;
A.init.then(() => {
aladin = A.aladin('#aladin-lite-div', {cooFrame: "icrs", log: false, backgroundColor: 'red'});
aladin = A.aladin('#aladin-lite-div', {cooFrame: "icrs", log: false, backgroundColor: 'rgba(0, 0, 0, 255)'});
aladin.displayFITS(
//'https://fits.gsfc.nasa.gov/samples/FOCx38i0101t_c0f.fits', // url of the fits file

View File

@@ -1,3 +1,5 @@
use crate::downloader::request::moc::MOCRequest;
use crate::downloader::request::tile::TileRequest;
use crate::math::angle::ToAngle;
use crate::math::spectra::Freq;
use crate::renderable::hips::HiPS;
@@ -119,7 +121,7 @@ use crate::time::Time;
use cgmath::InnerSpace;
use crate::downloader::query;
use crate::downloader::request;
use crate::downloader::request::{self, RequestType};
use al_api::resources::Resources;
impl App {
@@ -393,7 +395,6 @@ impl App {
}*/
}
use crate::downloader::request::Resource;
use al_api::cell::HEALPixCellProjeted;
use crate::healpix::cell::HEALPixCell;
@@ -596,24 +597,26 @@ impl App {
for rsc in rscs_received {
match rsc {
Resource::Tile(tile) => {
RequestType::Tile(tile) => {
//if !_has_camera_zoomed {
if let Some(hips) = self.layers.get_mut_hips_from_cdid(tile.get_hips_cdid()) {
if let Some(hips) = self.layers.get_mut_hips_from_cdid(&tile.hips_cdid) {
let cfg = hips.get_config_mut();
if cfg.get_format() == tile.format {
let fov_coverage = self.camera.get_cov(cfg.get_frame());
let included_in_coverage = fov_coverage.intersects_cell(tile.cell());
let included_in_coverage = fov_coverage.intersects_cell(&tile.cell);
//let is_tile_root = tile.cell().depth() == delta_depth;
//let _depth = tile.cell().depth();
// do not perform tex_sub costly GPU calls while the camera is zooming
if tile.cell().is_root() || included_in_coverage {
if tile.cell.is_root() || included_in_coverage {
let image = tile.request.get_data().clone();
//if let Some(image) = image.as_ref() {
if let Some(ImageType::FitsRawBytes {
raw_bytes: raw_bytes_buf,
..
}) = &*tile.image.borrow()
}) = &*image.clone().borrow()
{
// check if the metadata has not been set
if hips.get_fits_params().is_none() {
@@ -629,7 +632,6 @@ impl App {
}
};
let image = tile.image.clone();
if let Some(img) = &*image.borrow() {
/*if tile_copied {
self.downloader
@@ -641,13 +643,15 @@ impl App {
self.request_redraw = true;
//tile_copied = true;
match hips {
HiPS::D2(hips) => {
hips.add_tile(&tile.cell, img, tile.time_req)?
}
HiPS::D2(hips) => hips.add_tile(
&tile.cell,
img,
tile.request.time_request,
)?,
HiPS::D3(hips) => hips.add_tile(
&tile.cell,
img,
tile.time_req,
tile.request.time_request,
tile.channel.unwrap() as u16,
)?,
}
@@ -657,10 +661,8 @@ impl App {
}
}
}
Resource::Allsky(allsky) => {
let hips_cdid = allsky.get_hips_cdid();
if let Some(hips) = self.layers.get_mut_hips_from_cdid(hips_cdid) {
RequestType::Allsky(allsky) => {
if let Some(hips) = self.layers.get_mut_hips_from_cdid(&allsky.hips_cdid) {
let is_missing = allsky.missing();
if is_missing {
// The allsky image is missing so we donwload all the tiles contained into
@@ -678,12 +680,12 @@ impl App {
}
}
}
Resource::Moc(fetched_moc) => {
let moc_hips_cdid = fetched_moc.get_hips_cdid();
RequestType::Moc(moc) => {
let moc_hips_cdid = moc.hips_cdid;
//let url = &moc_url[..moc_url.find("/Moc.fits").unwrap_abort()];
if let Some(hips) = self.layers.get_mut_hips_from_cdid(moc_hips_cdid) {
let request::moc::FetchedMoc { moc, .. } = fetched_moc;
if let Some(moc) = &*moc.borrow() {
if let Some(hips) = self.layers.get_mut_hips_from_cdid(&moc_hips_cdid) {
let MOCRequest { request, .. } = moc;
if let Some(moc) = &*request.get_data().borrow() {
match (hips, moc) {
(HiPS::D2(hips), Moc::Space(moc)) => {
hips.set_moc(moc.clone());

View File

@@ -10,13 +10,13 @@ pub struct Downloader {
requests: Vec<RequestType>,
queried_list: HashSet<QueryId>,
cache: Cache<QueryId, Resource>,
cache: Cache<QueryId, RequestType>,
}
use crate::fifo_cache::Cache;
use query::Query;
use request::{RequestType, Resource};
use request::RequestType;
impl Default for Downloader {
fn default() -> Self {
@@ -62,26 +62,23 @@ impl Downloader {
}
}
pub fn get_received_resources(&mut self) -> Vec<Resource> {
pub fn get_received_resources(&mut self) -> Vec<RequestType> {
let mut rscs = vec![];
let mut not_finished_requests = vec![];
let mut finished_query_list = vec![];
self.requests = self
.requests
.drain(..)
.filter(|request| {
// If the request resolves into a resource
if let Some(rsc) = request.into() {
rscs.push(rsc);
finished_query_list.push(request.id().clone());
false
// The request is not resolved, we keep it
} else {
true
}
})
.collect();
while let Some(request) = self.requests.pop() {
if request.is_resolved() {
finished_query_list.push(request.id().clone());
rscs.push(request);
// The request is not resolved, we keep it
} else {
not_finished_requests.push(request);
}
}
self.requests = not_finished_requests;
for query_id in finished_query_list.into_iter() {
self.queried_list.remove(&query_id);
@@ -98,7 +95,7 @@ impl Downloader {
self.queried_list.contains(id)
}
pub fn delay(&mut self, r: Resource) {
/*pub fn delay(&mut self, r: RequestType) {
match r {
Resource::Tile(tile) => {
let k = format!(
@@ -111,5 +108,5 @@ impl Downloader {
}
_ => unimplemented!(),
}
}
}*/
}

View File

@@ -14,7 +14,13 @@ pub struct AllskyRequest {
pub id: QueryId,
pub channel: Option<u32>,
request: Request<Vec<ImageType>>,
pub request: Request<Vec<ImageType>>,
}
impl AllskyRequest {
pub fn missing(&self) -> bool {
self.request.data.borrow().is_none()
}
}
impl From<AllskyRequest> for RequestType {
@@ -297,56 +303,5 @@ use al_core::texture::format::RGBA8U;
use crate::time::Time;
use std::cell::RefCell;
use std::rc::Rc;
pub struct Allsky {
pub image: Rc<RefCell<Option<Vec<ImageType>>>>,
pub time_req: Time,
//pub depth_tile: u8,
pub hips_cdid: CreatorDid,
url: Url,
pub channel: Option<u32>,
}
use crate::Abort;
impl Allsky {
pub fn missing(&self) -> bool {
self.image.borrow().is_none()
}
pub fn get_hips_cdid(&self) -> &CreatorDid {
&self.hips_cdid
}
pub fn get_url(&self) -> &Url {
&self.url
}
}
impl<'a> From<&'a AllskyRequest> for Option<Allsky> {
fn from(request: &'a AllskyRequest) -> Self {
let AllskyRequest {
request,
hips_cdid,
//depth_tile,
url,
channel,
..
} = request;
if request.is_resolved() {
let Request::<Vec<ImageType>> {
time_request, data, ..
} = request;
Some(Allsky {
time_req: *time_request,
// This is a clone on a Arc, it is supposed to be fast
image: data.clone(),
hips_cdid: hips_cdid.clone(),
url: url.clone(),
//depth_tile: *depth_tile,
channel: *channel,
})
} else {
None
}
}
}

View File

@@ -13,7 +13,7 @@ pub struct MOCRequest {
//pub id: QueryId,
pub hips_cdid: CreatorDid,
pub params: MOCOptions,
request: Request<Moc>,
pub request: Request<Moc>,
}
impl From<MOCRequest> for RequestType {
@@ -68,6 +68,10 @@ impl From<query::Moc> for MOCRequest {
DataproductType::SpectralCube => {
Moc::FreqSpace(FreqSpaceMoc::from_fits_raw_bytes(&bytes)?)
}
DataproductType::Cube => {
let moc = SpaceMoc::from_fits_raw_bytes(&bytes)?;
Moc::FreqSpace(FreqSpaceMoc::from_space_moc(moc))
}
_ => Moc::Space(SpaceMoc::from_fits_raw_bytes(&bytes)?),
})
});
@@ -84,36 +88,3 @@ impl From<query::Moc> for MOCRequest {
use std::cell::RefCell;
use std::rc::Rc;
pub struct FetchedMoc {
pub moc: Rc<RefCell<Option<Moc>>>,
pub params: MOCOptions,
pub hips_cdid: Url,
}
impl FetchedMoc {
pub fn get_hips_cdid(&self) -> &Url {
&self.hips_cdid
}
}
impl<'a> From<&'a MOCRequest> for Option<FetchedMoc> {
fn from(request: &'a MOCRequest) -> Self {
let MOCRequest {
request,
hips_cdid,
params,
..
} = request;
if request.is_resolved() {
let Request::<Moc> { data, .. } = request;
Some(FetchedMoc {
// This is a clone on a Arc, it is supposed to be fast
moc: data.clone(),
hips_cdid: hips_cdid.clone(),
params: params.clone(),
})
} else {
None
}
}
}

View File

@@ -11,8 +11,8 @@ use std::cell::{Cell, RefCell};
use std::rc::Rc;
pub type Url = String;
pub struct Request<R> {
data: Rc<RefCell<Option<R>>>,
time_request: Time,
pub data: Rc<RefCell<Option<R>>>,
pub time_request: Time,
// Flag telling if the tile has been copied so that
// the HtmlImageElement can be reused to download another tile
//ready: bool,
@@ -75,6 +75,10 @@ where
pub fn resolve_status(&self) -> ResolvedStatus {
self.resolved.get()
}
pub fn get_data(&self) -> Rc<RefCell<Option<R>>> {
self.data.clone()
}
}
use allsky::AllskyRequest;
@@ -83,7 +87,7 @@ use tile::TileRequest;
pub enum RequestType {
Tile(TileRequest),
Allsky(AllskyRequest),
Moc(MOCRequest), //..
Moc(MOCRequest),
}
use crate::downloader::QueryId;
@@ -95,30 +99,30 @@ impl RequestType {
RequestType::Moc(request) => &request.hips_cdid,
}
}
pub fn is_resolved(&self) -> bool {
match self {
RequestType::Tile(request) => request.request.is_resolved(),
RequestType::Allsky(request) => request.request.is_resolved(),
RequestType::Moc(request) => request.request.is_resolved(),
}
}
}
impl<'a> From<&'a RequestType> for Option<Resource> {
fn from(request: &'a RequestType) -> Self {
/*
impl From<RequestType> for Option<Resource> {
fn from(request: RequestType) -> Self {
match request {
RequestType::Tile(request) => Option::<Tile>::from(request).map(Resource::Tile),
RequestType::Allsky(request) => Option::<Allsky>::from(request).map(Resource::Allsky),
RequestType::Moc(request) => Option::<FetchedMoc>::from(request).map(Resource::Moc),
}
}
}
}*/
use crate::Abort;
use allsky::Allsky;
use tile::Tile;
pub enum Resource {
Tile(Tile),
Allsky(Allsky),
Moc(FetchedMoc),
}
use web_sys::RequestCredentials;
use self::moc::FetchedMoc;
async fn query_html_image(
url: &str,
credentials: RequestCredentials,

View File

@@ -11,14 +11,14 @@ use super::{Request, RequestType};
use crate::downloader::request::query_html_image;
use crate::downloader::QueryId;
pub struct TileRequest {
request: Request<ImageType>,
pub request: Request<ImageType>,
pub id: QueryId,
cell: HEALPixCell,
hips_cdid: CreatorDid,
url: Url,
format: ImageFormatType,
channel: Option<u32>,
pub cell: HEALPixCell,
pub hips_cdid: CreatorDid,
pub url: Url,
pub format: ImageFormatType,
pub channel: Option<u32>,
}
impl From<TileRequest> for RequestType {
@@ -121,66 +121,5 @@ impl From<query::Tile> for TileRequest {
use crate::time::Time;
use std::cell::RefCell;
use std::rc::Rc;
pub struct Tile {
pub image: Rc<RefCell<Option<ImageType>>>,
pub time_req: Time,
pub cell: HEALPixCell,
pub format: ImageFormatType,
pub channel: Option<u32>,
hips_cdid: CreatorDid,
url: Url,
}
use crate::Abort;
impl Tile {
#[inline(always)]
pub fn missing(&self) -> bool {
self.image.borrow().is_none()
}
#[inline(always)]
pub fn get_hips_cdid(&self) -> &CreatorDid {
&self.hips_cdid
}
#[inline(always)]
pub fn get_url(&self) -> &Url {
&self.url
}
#[inline(always)]
pub fn cell(&self) -> &HEALPixCell {
&self.cell
}
}
impl<'a> From<&'a TileRequest> for Option<Tile> {
fn from(request: &'a TileRequest) -> Self {
let TileRequest {
cell,
request,
hips_cdid,
url,
format,
channel,
..
} = request;
if request.is_resolved() {
let Request::<ImageType> {
time_request, data, ..
} = request;
Some(Tile {
cell: *cell,
time_req: *time_request,
// This is a clone on a Arc, it is supposed to be fast
image: data.clone(),
hips_cdid: hips_cdid.clone(),
url: url.clone(),
format: *format,
channel: *channel,
})
} else {
None
}
}
}

View File

@@ -49,6 +49,12 @@ use std::io::Cursor;
use crate::math::spectra::Freq;
use crate::math::spectra::SpectralUnit;
impl FreqSpaceMoc {
/// Create a FreqSpaceMoc from a
pub fn from_space_moc(moc: SpaceMoc) -> Self {
let moc_2d = Moc2DRanges::new(vec![0..u64::MAX], vec![moc.0.into_moc_ranges().0]);
FreqSpaceMoc(HpxRanges2D(moc_2d))
}
pub fn from_fits_raw_bytes(bytes: &[u8]) -> Result<Self, JsValue> {
let sfmoc = match fits::from_fits_ivoa_custom(Cursor::new(bytes), true)
.map_err(|e| JsValue::from_str(&e.to_string()))?
@@ -138,9 +144,8 @@ impl FreqSpaceMoc {
todo!()
}
pub fn intersects_cell(&self, hpx_cell: &HEALPixCell, f: Freq) -> bool {
pub fn intersects_cell(&self, hpx_cell: &HEALPixCell, f_hash: u64) -> bool {
let z29_rng = hpx_cell.z_29_rng();
let f_hash = f.hash();
self.0.contains(f_hash, &z29_rng)
}
@@ -152,6 +157,8 @@ impl FreqSpaceMoc {
}
use core::ops::Deref;
use super::SpaceMoc;
impl Deref for FreqSpaceMoc {
type Target = moclib::hpxranges2d::FreqSpaceMoc<u64, u64>;

View File

@@ -4,6 +4,7 @@ use std::collections::HashMap;
use al_core::texture::format::PixelType;
use crate::downloader::request::allsky::AllskyRequest;
use crate::renderable::hips::HpxTile;
use cgmath::Vector3;
@@ -18,7 +19,6 @@ use al_core::WebGlContext;
use super::texture::{HpxTexture2D, HpxTexture2DUniforms};
use crate::downloader::request::allsky::Allsky;
use crate::healpix::cell::HEALPixCell;
use crate::healpix::cell::NUM_HPX_TILES_DEPTH_ZERO;
use crate::renderable::hips::config::HiPSConfig;
@@ -218,16 +218,14 @@ fn create_hpx_texture_storage(
}
impl HiPS2DBuffer {
pub fn push_allsky(&mut self, allsky: Allsky) -> Result<(), JsValue> {
let Allsky {
image, time_req, ..
} = allsky;
pub fn push_allsky(&mut self, allsky: AllskyRequest) -> Result<(), JsValue> {
let AllskyRequest { request, .. } = allsky;
{
let mutex_locked = image.borrow();
let mutex_locked = request.data.borrow();
let images = mutex_locked.as_ref().unwrap_abort();
for (idx, image) in images.iter().enumerate() {
self.push(&HEALPixCell(0, idx as u64), image, time_req)?;
self.push(&HEALPixCell(0, idx as u64), image, request.time_request)?;
}
}

View File

@@ -3,6 +3,7 @@ pub mod texture;
use crate::app::BLENDING_ANIM_DURATION;
use crate::downloader::query;
use crate::downloader::request::allsky::AllskyRequest;
use crate::math::angle::ToAngle;
use crate::renderable::hips::HpxTile;
use al_api::hips::ImageExt;
@@ -32,7 +33,6 @@ use crate::camera::CameraViewPort;
use crate::shader::ShaderManager;
use crate::utils;
use crate::downloader::request::allsky::Allsky;
use crate::healpix::{cell::HEALPixCell, moc::SpaceMoc};
use crate::time::Time;
@@ -698,7 +698,7 @@ impl HiPS2D {
self.buffer.push(cell, image, time_request)
}
pub fn add_allsky(&mut self, allsky: Allsky) -> Result<(), JsValue> {
pub fn add_allsky(&mut self, allsky: AllskyRequest) -> Result<(), JsValue> {
self.buffer.push_allsky(allsky)
}

View File

@@ -4,7 +4,7 @@ use al_core::image::Image;
use al_core::WebGlContext;
use super::texture::HpxTexture3D;
use crate::downloader::request::allsky::Allsky;
use crate::downloader::request::allsky::AllskyRequest;
use crate::healpix::cell::HEALPixCell;
use crate::renderable::hips::config::HiPSConfig;
use crate::renderable::hips::HpxTileBuffer;
@@ -40,23 +40,22 @@ impl HiPSCubeBuffer {
})
}
pub fn push_allsky(&mut self, allsky: Allsky) -> Result<(), JsValue> {
let Allsky {
image,
time_req,
pub fn push_allsky(&mut self, allsky: AllskyRequest) -> Result<(), JsValue> {
let AllskyRequest {
request,
//depth_tile,
channel,
..
} = allsky;
{
let mutex_locked = image.borrow();
let mutex_locked = request.data.borrow();
let images = mutex_locked.as_ref().unwrap_abort();
for (idx, image) in images.iter().enumerate() {
self.push(
&HEALPixCell(0, idx as u64),
image,
time_req,
request.time_request,
channel.map(|c| c as u16).unwrap_or(0),
)?;
}

View File

@@ -1,6 +1,7 @@
pub mod cube;
pub mod texture;
use crate::downloader::request::allsky::AllskyRequest;
use crate::healpix::moc::FreqSpaceMoc;
use crate::math::spectra::SpectralUnit;
use crate::renderable::hips::HpxTile;
@@ -28,7 +29,6 @@ use crate::downloader::query;
use crate::shader::ShaderManager;
use crate::downloader::request::allsky::Allsky;
use crate::healpix::cell::HEALPixCell;
use crate::time::Time;
@@ -214,11 +214,12 @@ impl HiPS3D {
.get_hpx_cells(depth_tile, survey_frame)
.into_iter()
.filter(move |tile_cell| {
if let Some(moc) = self.moc.as_ref() {
moc.intersects_cell(tile_cell, self.freq)
/*if let Some(moc) = self.moc.as_ref() {
moc.intersects_cell(tile_cell, self.freq.0 as u64)
} else {
true
}
}*/
true
});
Some(tile_cells_iter)
@@ -299,7 +300,7 @@ impl HiPS3D {
for cell in &self.hpx_cells_in_view {
// filter textures that are not in the moc
let cell = if let Some(moc) = self.moc.as_ref() {
if moc.intersects_cell(cell, self.freq) {
if moc.intersects_cell(cell, self.freq.0 as u64) {
Some(&cell)
} else if channel == PixelType::RGB8U {
// Rasterizer does not render tiles that are not in the MOC
@@ -601,7 +602,7 @@ impl HiPS3D {
self.buffer.push(cell, image, time_request, slice_idx)
}
pub fn add_allsky(&mut self, allsky: Allsky) -> Result<(), JsValue> {
pub fn add_allsky(&mut self, allsky: AllskyRequest) -> Result<(), JsValue> {
self.buffer.push_allsky(allsky)
}

View File

@@ -8,7 +8,7 @@ pub mod uv;
pub use d2::HiPS2D;
use crate::downloader::request::allsky::Allsky;
use crate::downloader::request::allsky::AllskyRequest;
use crate::renderable::HiPSConfig;
use crate::time::Time;
use crate::CameraViewPort;
@@ -145,7 +145,7 @@ impl HiPS {
}
#[inline]
pub fn add_allsky(&mut self, allsky: Allsky) -> Result<(), JsValue> {
pub fn add_allsky(&mut self, allsky: AllskyRequest) -> Result<(), JsValue> {
match self {
HiPS::D2(hips) => hips.add_allsky(allsky),
HiPS::D3(hips) => hips.add_allsky(allsky),