Skip to main content

trail_test/
trail_test.rs

1use astroimage::ImageAnalyzer;
2
3fn analyze_file(label: &str, path: &str) {
4    println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
5    println!("{label}");
6    println!("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
7
8    let analyzer = ImageAnalyzer::new();
9    let r = analyzer.analyze(path).unwrap();
10
11    println!("  Stars detected:       {}", r.stars_detected);
12    println!("  Stars after filter:   {}", r.stars.len());
13    println!("  Median FWHM:          {:.3}", r.median_fwhm);
14    println!("  Median eccentricity:  {:.3}", r.median_eccentricity);
15    println!("  Median SNR:           {:.1}", r.median_snr);
16    println!("  PSF signal:           {:.1}", r.psf_signal);
17    println!("  Frame SNR:            {:.1}", r.frame_snr);
18    println!("  Trail R²:             {:.4}", r.trail_r_squared);
19    println!("  Possibly trailed:     {}", r.possibly_trailed);
20
21    // Show theta distribution
22    let n = r.stars.len();
23    if n >= 5 {
24        let mut thetas: Vec<f32> = r.stars.iter().map(|s| s.theta.to_degrees()).collect();
25        thetas.sort_by(|a, b| a.total_cmp(b));
26
27        let (sum_cos, sum_sin) = r.stars.iter().fold((0.0f64, 0.0f64), |(sc, ss), s| {
28            let a = 2.0 * s.theta as f64;
29            (sc + a.cos(), ss + a.sin())
30        });
31        let mean_theta = (sum_sin.atan2(sum_cos) * 0.5).to_degrees();
32
33        println!("\n  Theta ({} measured stars):", n);
34        println!("    Mean theta:   {mean_theta:.1}deg");
35        println!(
36            "    min={:.1}  p25={:.1}  median={:.1}  p75={:.1}  max={:.1}",
37            thetas[0],
38            thetas[n / 4],
39            thetas[n / 2],
40            thetas[3 * n / 4],
41            thetas[n - 1]
42        );
43    }
44
45    if !r.stars.is_empty() {
46        println!("\n  Top 5 stars:");
47        for (i, s) in r.stars.iter().take(5).enumerate() {
48            println!(
49                "    #{}: ecc={:.3} theta={:.1}deg fwhm={:.2} peak={:.0}",
50                i + 1,
51                s.eccentricity,
52                s.theta.to_degrees(),
53                s.fwhm,
54                s.peak
55            );
56        }
57    }
58    println!();
59}
60
61fn main() {
62    let good = "/Volumes/BigMac/Users/astrobureau/Pictures/Unsorted/edph/NINA/COPIED/CAMERA_DUO/Barnard 150/2024-09-28/LIGHT/2024-09-28_23-16-30_-10.00_180.00s_0281.fits";
63    let s_trail = "/Volumes/BigMac/Users/astrobureau/Pictures/Unsorted/edph/NINA/COPIED/CAMERA_DUO/Barnard 150/2024-09-28/LIGHT/2024-09-29_05-41-37_-9.90_180.00s_0381.fits";
64    let linear_trail = "/Volumes/BigMac/Users/astrobureau/Pictures/Unsorted/edph/NINA/COPIED/CAMERA_DUO/Barnard 150/2024-09-27/LIGHT/2024-09-28_05-41-28_-10.00_180.00s_0236.fits";
65
66    analyze_file("GOOD STARS (0281)", good);
67    analyze_file("S-SHAPED TRAILS (0381)", s_trail);
68    analyze_file("LINEAR TRAILS (0236)", linear_trail);
69}