Skip to main content

crseo/wavefrontsensor/
sh24.rs

1use std::{
2    mem::take,
3    ops::{Deref, DerefMut},
4};
5
6use super::{Model, ShackHartmann};
7use crate::{
8    builders::SourceBuilder, wavefrontsensor::ShackHartmannBuilder, Builder, FromBuilder, Result,
9    WavefrontSensorBuilder,
10};
11
12/// `ShackHartmann` "SH24" builder for GMT AGWS model
13///
14/// Default properties:
15///  - n_sensor: 1
16///  - lenslet_array:
17///    - n_lenslet: 24
18///    - n_px_lenslet: 32px
19///    - lenslet_pitch: 25.5m/24
20///  - detector:
21///    - n_px_framelet: 12px
22///    - n_px_imagelet: Some(60px)
23///    - osf: Some(2)
24#[derive(Debug, Clone)]
25pub struct SH24<T: Model>(ShackHartmannBuilder<T>);
26
27impl<T: Model> Deref for SH24<T> {
28    type Target = ShackHartmannBuilder<T>;
29
30    fn deref(&self) -> &Self::Target {
31        &self.0
32    }
33}
34impl<T: Model> DerefMut for SH24<T> {
35    fn deref_mut(&mut self) -> &mut Self::Target {
36        &mut self.0
37    }
38}
39
40impl<T: Model> Default for SH24<T> {
41    fn default() -> Self {
42        SH24(
43            ShackHartmannBuilder::new()
44                .n_sensor(1)
45                .lenslet_array(24, 32, 25.5 / 24.0)
46                .detector(12, Some(60), 2, None),
47        )
48    }
49}
50impl<T: Model> SH24<T> {}
51impl<M, T> WavefrontSensorBuilder for T
52where
53    M: Model,
54    T: Deref<Target = ShackHartmannBuilder<M>>,
55{
56    fn guide_stars(&self, template: Option<SourceBuilder>) -> SourceBuilder {
57        self.deref().guide_stars(template)
58    }
59    /*
60        fn detector_noise_specs(self, noise_specs: NoiseDataSheet) -> Self {
61            Self(self.detector_noise_specs(noise_specs))
62        }
63    */
64}
65impl<M, T> Builder for T
66where
67    M: Model,
68    T: DerefMut<Target = ShackHartmannBuilder<M>> + Default,
69{
70    type Component = ShackHartmann<M>;
71    fn build(mut self) -> Result<ShackHartmann<M>> {
72        take(self.deref_mut()).build()
73    }
74}
75
76pub struct ShackHartmann24x24<T: Model>(ShackHartmann<T>);
77impl<T: Model> Deref for ShackHartmann24x24<T> {
78    type Target = ShackHartmann<T>;
79
80    fn deref(&self) -> &Self::Target {
81        &self.0
82    }
83}
84impl<T: Model> DerefMut for ShackHartmann24x24<T> {
85    fn deref_mut(&mut self) -> &mut Self::Target {
86        &mut self.0
87    }
88}
89
90impl<M, T> FromBuilder for T
91where
92    M: Model,
93    T: DerefMut<Target = ShackHartmann<M>>,
94{
95    type ComponentBuilder = ShackHartmannBuilder<M>;
96}