Skip to main content

astroimsim_data/
detector.rs

1use std::time::Instant;
2use astroimsim_geometry::grid2d::GRID2D;
3use astroimsim_geometry::points::Point;
4use astroimsim_geometry::coordinate_system::{CoordinateSystem, Coordinates};
5use uvex_fitrs::{Fits, Hdu};
6use crate::point_sources::FullSpectrumSourceList;
7use crate::psf_grid::PsfGrid;
8use std::fs;
9use crate::spatial_effect::SpatialEffect;
10
11pub enum EffectType{
12    Exposure(f64),
13    Once
14}
15
16#[derive(Clone,Debug)]
17pub struct Detector {
18    pub label: String,
19    pub grid: GRID2D,
20    pub data: Vec<Vec<[f64;2]>>,
21}
22
23impl Detector {
24
25
26    pub fn new(label:String, grid: GRID2D)->Detector{
27        Detector{
28            label,
29            grid,
30            data:vec![vec![]]
31        }
32
33    }
34
35    pub fn write(&mut self, directory_path:String, label:usize){
36
37
38        let width = self.data[0].len();
39        let height = self.data.len();
40        let shape = [width, height];
41
42        let mut fuv_path = directory_path.clone();
43        fuv_path.push_str(&format!("/fuv_{label}.fits"));
44        
45        let mut nuv_path = directory_path.clone();
46            nuv_path.push_str(&format!("/nuv_{label}.fits"));
47        
48        let fuv_counts:Vec<f64> = self.data.iter().flatten().map(|a|a[0]).collect();
49        let nuv_counts:Vec<f64> = self.data.iter().flatten().map(|a|a[1]).collect();
50        
51        let mut fuv_counts_primary_hdu = Hdu::new(&shape, fuv_counts);
52        let mut nuv_counts_primary_hdu = Hdu::new(&shape, nuv_counts);
53        
54        Fits::create(fuv_path, fuv_counts_primary_hdu).expect("Failed to create");
55        Fits::create(nuv_path, nuv_counts_primary_hdu).expect("Failed to create");
56
57    }
58
59    pub fn show(path:&str){
60        //Users/mayabasu/Desktop/Output/fuv/1.fits
61    }
62
63    pub fn create_constant_background(&mut self, fuv_background_brightness:f64,nuv_background_brightness:f64){
64        let mut data = Vec::with_capacity(self.grid.y_num);
65        for row in 0..self.grid.y_num{
66            let mut row_vec = Vec::with_capacity(self.grid.x_num);
67            for column in 0..self.grid.x_num{
68                row_vec.push([fuv_background_brightness,nuv_background_brightness])
69            }
70            data.push(row_vec);
71        }
72        self.data= data;
73    }
74    pub fn multiply_effect(&mut self, effect:&SpatialEffect,index:usize, effect_type: EffectType){
75        assert_eq!(effect.grid.num_points, self.grid.num_points, "Grids are not equal");
76        for row in 0..self.grid.y_num{
77            for column in 0..self.grid.x_num{
78                match effect_type{
79                    EffectType::Exposure(time) => {self.data[column][row][index] = self.data[column][row][index]*effect.data[column][row]*time;}
80                    EffectType::Once => {self.data[column][row][index] = self.data[column][row][index]*effect.data[column][row];}
81                }
82
83            }
84        }
85    }
86
87    pub fn add_effect(&mut self, effect:&SpatialEffect,index:usize,effect_type: EffectType){
88        assert_eq!(effect.grid.num_points, self.grid.num_points, "Grids are not equal");
89        for row in 0..self.grid.y_num{
90            for column in 0..self.grid.x_num{
91                match effect_type{
92                    EffectType::Exposure(time) => {self.data[column][row][index] = self.data[column][row][index]+effect.data[column][row]*time;}
93                    EffectType::Once => {self.data[column][row][index] = self.data[column][row][index]+effect.data[column][row];}
94                }
95
96            }
97        }
98    }
99    
100    pub fn multiply_interpolated_effect(&mut self, effect:&SpatialEffect, index:usize){
101        for row in 0..self.grid.y_num {
102            for column in 0..self.grid.x_num {
103                let grid_number = self.grid.grid_number(column, row);
104                let location = self.grid.locate(grid_number);
105                let effect = effect.get_data(&location);
106                self.data[column][row][index] = self.data[column][row][index] * effect;
107            }
108        }
109    }
110
111}
112
113pub struct DetectorArray{
114    pub label: String,
115    pub detectors: Vec<Detector>,
116    pub coordinate_system: CoordinateSystem
117}
118
119
120
121
122