Skip to main content

Matcher

Struct Matcher 

Source
pub struct Matcher<T> { /* private fields */ }
Expand description

A prebuilt, declination-sorted index for repeated queries against one catalogue.

Produces results identical to rank for the same objects, pointing, and constraint — the index is a performance optimization only. Build it once, then query many pointings.

§Example

use skymath::{Angle, Equatorial, ParseMode};
use target_match::{Constraint, Field, Matcher, Membership, Optics, RadiusPolicy, SkyObject};

struct Target {
    name: &'static str,
    ra: f64,
    dec: f64,
}
impl SkyObject for Target {
    fn position(&self) -> Equatorial {
        Equatorial::j2000(Angle::from_degrees(self.ra), Angle::from_degrees(self.dec)).unwrap()
    }
}

let matcher = Matcher::from_objects(vec![
    Target { name: "M 31", ra: 10.6847, dec: 41.2688 },
    Target { name: "M 33", ra: 23.4621, dec: 30.6599 },
]);
assert_eq!(matcher.objects().len(), 2);

let pointing = Equatorial::parse_j2000("00:42:44.3", "+41:16:09", ParseMode::Strict).unwrap();
let field = Field::from_optics(Optics {
    focal_mm: 800.0,
    pixel_um: (3.76, 3.76),
    binning: (1, 1),
    pixels: (6248, 4176),
})
.unwrap();

let hits = matcher.query(pointing, Constraint::within(&field, RadiusPolicy::Circumscribed).nearest_one());
assert_eq!(hits[0].object.name, "M 31");

let m = matcher.is_framed(
    pointing,
    &matcher.objects()[0],
    Membership::Circular { radius: Angle::from_degrees(1.0) },
);
assert!(m.in_frame);

Implementations§

Source§

impl<T: SkyObject> Matcher<T>

Source

pub fn from_objects(objects: Vec<T>) -> Self

Build an index from a set of objects (original order is preserved for tie-breaking and objects).

§Example
use skymath::{Angle, Equatorial};
use target_match::{Matcher, SkyObject};

struct Target { ra_deg: f64, dec_deg: f64 }
impl SkyObject for Target {
    fn position(&self) -> Equatorial {
        Equatorial::j2000(Angle::from_degrees(self.ra_deg), Angle::from_degrees(self.dec_deg)).unwrap()
    }
}

let matcher = Matcher::from_objects(vec![
    Target { ra_deg: 10.6847, dec_deg: 41.2688 },
    Target { ra_deg: 23.4621, dec_deg: 30.6599 },
]);
assert_eq!(matcher.objects().len(), 2);
Source

pub fn objects(&self) -> &[T]

The stored objects, in their original insertion order.

§Example
use skymath::{Angle, Equatorial};
use target_match::{Matcher, SkyObject};

struct Target { name: &'static str, ra_deg: f64, dec_deg: f64 }
impl SkyObject for Target {
    fn position(&self) -> Equatorial {
        Equatorial::j2000(Angle::from_degrees(self.ra_deg), Angle::from_degrees(self.dec_deg)).unwrap()
    }
}

let matcher = Matcher::from_objects(vec![Target { name: "M 31", ra_deg: 10.6847, dec_deg: 41.2688 }]);
assert_eq!(matcher.objects()[0].name, "M 31");
Source

pub fn query(&self, pointing: Equatorial, c: Constraint) -> Vec<Match<'_, T>>

Query the index for a pointing under a constraint. Results are identical to calling rank with objects.

§Example
use skymath::{Angle, Equatorial, ParseMode};
use target_match::{Constraint, Field, Matcher, Optics, RadiusPolicy, SkyObject};

struct Target { name: &'static str, ra_deg: f64, dec_deg: f64 }
impl SkyObject for Target {
    fn position(&self) -> Equatorial {
        Equatorial::j2000(Angle::from_degrees(self.ra_deg), Angle::from_degrees(self.dec_deg)).unwrap()
    }
}

let matcher = Matcher::from_objects(vec![Target { name: "M 31", ra_deg: 10.6847, dec_deg: 41.2688 }]);
let pointing = Equatorial::parse_j2000("00:42:44.3", "+41:16:09", ParseMode::Strict).unwrap();
let field = Field::from_optics(Optics {
    focal_mm: 800.0, pixel_um: (3.76, 3.76), binning: (1, 1), pixels: (6248, 4176),
})
.unwrap();

let hits = matcher.query(pointing, Constraint::within(&field, RadiusPolicy::Circumscribed).nearest_one());
assert_eq!(hits[0].object.name, "M 31");
Source

pub fn is_framed<'a>( &self, pointing: Equatorial, object: &'a T, m: Membership, ) -> Match<'a, T>

Evaluate a single stored-or-external object against a frame (see is_framed).

§Example
use skymath::{Angle, Equatorial, ParseMode};
use target_match::{Matcher, Membership, SkyObject};

struct Target { ra_deg: f64, dec_deg: f64 }
impl SkyObject for Target {
    fn position(&self) -> Equatorial {
        Equatorial::j2000(Angle::from_degrees(self.ra_deg), Angle::from_degrees(self.dec_deg)).unwrap()
    }
}

let matcher = Matcher::from_objects(vec![Target { ra_deg: 10.6847, dec_deg: 41.2688 }]);
let pointing = Equatorial::parse_j2000("00:42:44.3", "+41:16:09", ParseMode::Strict).unwrap();

let obj = &matcher.objects()[0];
let m = matcher.is_framed(pointing, obj, Membership::Circular { radius: Angle::from_degrees(1.0) });
assert!(m.in_frame);

Auto Trait Implementations§

§

impl<T> Freeze for Matcher<T>

§

impl<T> RefUnwindSafe for Matcher<T>
where T: RefUnwindSafe,

§

impl<T> Send for Matcher<T>
where T: Send,

§

impl<T> Sync for Matcher<T>
where T: Sync,

§

impl<T> Unpin for Matcher<T>
where T: Unpin,

§

impl<T> UnsafeUnpin for Matcher<T>

§

impl<T> UnwindSafe for Matcher<T>
where T: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.