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
11#[derive(Clone,Debug)]
12pub struct Detector {
13    pub label: String,
14    pub grid: GRID2D,
15    pub data: Vec<Vec<[f64;2]>>,
16}
17
18impl Detector {
19
20
21    pub fn new(label:String, grid: GRID2D)->Detector{
22        Detector{
23            label,
24            grid,
25            data:vec![vec![]]
26        }
27
28    }
29
30    pub fn write(&mut self,label:usize){
31
32
33        let width = self.data[0].len();
34        let height = self.data.len();
35        let shape = [width, height];
36
37        let mut fuv_counts_path = "/Users/mayabasu/Desktop/Output/fuv/testtt".to_string();
38            fuv_counts_path.push_str(label.to_string().as_str());
39        fuv_counts_path.push_str(".fits");
40
41        let mut nuv_counts_path = "/Users/mayabasu/Desktop/Output/nuv/testtt".to_string();
42            nuv_counts_path.push_str(label.to_string().as_str());
43        nuv_counts_path.push_str(".fits");
44
45        /*
46
47        let mut fuv_ave_path = "/Users/mayabasu/Desktop/Output/fuv/counts_".to_string();
48            fuv_ave_path.push_str(label.to_string().as_str());
49            fuv_ave_path.push_str(".fits");
50
51
52        let mut nuv_ave_path = "/Users/mayabasu/Desktop/Output/nuv/counts".to_string();
53            nuv_ave_path.push_str(label.to_string().as_str());
54                nuv_ave_path.push_str(".fits");
55
56
57
58
59        let fuv_ave:Vec<f64> = self.data.iter().flatten().map(|a|a[0]).collect();
60        let nuv_ave:Vec<f64> = self.data.iter().flatten().map(|a|a[1]).collect();
61
62         */
63
64
65        let fuv_counts:Vec<f64> = self.data.iter().flatten().map(|a|a[0]).collect();
66        let nuv_counts:Vec<f64> = self.data.iter().flatten().map(|a|a[1]).collect();
67
68
69
70
71        /*
72        let mut fuv_primary_hdu = Hdu::new(&shape, fuv_ave);
73        let mut nuv_primary_hdu = Hdu::new(&shape, nuv_ave);
74
75         */
76
77        let mut fuv_counts_primary_hdu = Hdu::new(&shape, fuv_counts);
78        let mut nuv_counts_primary_hdu = Hdu::new(&shape, nuv_counts);
79
80
81        // Insert values in header later
82        //primary_hdu.insert("KEYSTR", "My string");
83        /*
84        println!("{:?}",fuv_ave_path);
85        Fits::create(fuv_ave_path, fuv_primary_hdu).expect("Failed to create");
86        Fits::create(nuv_ave_path, nuv_primary_hdu).expect("Failed to create");
87
88         */
89        Fits::create(fuv_counts_path, fuv_counts_primary_hdu).expect("Failed to create");
90        Fits::create(nuv_counts_path, nuv_counts_primary_hdu).expect("Failed to create");
91
92
93
94
95
96    }
97
98    pub fn show(path:&str){
99        //Users/mayabasu/Desktop/Output/fuv/1.fits
100    }
101
102    pub fn create_constant_background(&mut self, fuv_background_brightness:f64,nuv_background_brightness:f64){
103        let mut data = Vec::with_capacity(self.grid.y_num);
104        for row in 0..self.grid.y_num{
105            let mut row_vec = Vec::with_capacity(self.grid.x_num);
106            for column in 0..self.grid.x_num{
107                row_vec.push([fuv_background_brightness,nuv_background_brightness])
108            }
109            data.push(row_vec);
110        }
111        self.data= data;
112    }
113    pub fn multiply_effect(&mut self, effect:SpatialEffect,index:usize){
114        assert_eq!(effect.grid.num_points, self.grid.num_points, "Grids are not equal");
115        for row in 0..self.grid.y_num{
116            for column in 0..self.grid.x_num{
117                self.data[column][row][index] = self.data[column][row][index]*effect.data[column][row];
118            }
119        }
120    }
121
122    pub fn add_effect(&mut self, effect:SpatialEffect,index:usize){
123        assert_eq!(effect.grid.num_points, self.grid.num_points, "Grids are not equal");
124        for row in 0..self.grid.y_num{
125            for column in 0..self.grid.x_num{
126                self.data[column][row][index] = self.data[column][row][index]+effect.data[column][row];
127            }
128        }
129    }
130
131}
132
133pub struct DetectorArray{
134    pub label: String,
135    pub detectors: Vec<Detector>,
136    pub coordinate_system: CoordinateSystem
137}
138
139
140
141
142