use crate::config::parameters::G;
use std::f64::consts::PI;
pub fn transit_depth(planet_radius: f64, star_radius: f64) -> f64 {
(planet_radius / star_radius).powi(2)
}
pub fn transit_duration(
semi_major: f64,
star_radius: f64,
planet_radius: f64,
inclination: f64,
period: f64,
) -> f64 {
let b = semi_major * inclination.cos() / star_radius;
let chord = ((1.0 + planet_radius / star_radius).powi(2) - b * b)
.max(0.0)
.sqrt();
period / PI * (chord * star_radius / semi_major).asin()
}
pub fn ingress_egress_duration(
semi_major: f64,
star_radius: f64,
planet_radius: f64,
inclination: f64,
period: f64,
) -> f64 {
let b = semi_major * inclination.cos() / star_radius;
let outer = ((1.0 + planet_radius / star_radius).powi(2) - b * b)
.max(0.0)
.sqrt();
let inner = ((1.0 - planet_radius / star_radius).powi(2) - b * b)
.max(0.0)
.sqrt();
period / PI * ((outer - inner) * star_radius / semi_major).asin()
}
pub fn impact_parameter(semi_major: f64, inclination: f64, star_radius: f64) -> f64 {
semi_major * inclination.cos() / star_radius
}
pub fn transit_probability(star_radius: f64, semi_major: f64) -> f64 {
star_radius / semi_major
}
pub fn limb_darkening_correction(depth: f64, u1: f64, u2: f64) -> f64 {
let c = 1.0 - u1 / 3.0 - u2 / 6.0;
depth / c
}
pub fn secondary_eclipse_depth(
planet_radius: f64,
star_radius: f64,
planet_temp: f64,
star_temp: f64,
) -> f64 {
(planet_radius / star_radius).powi(2) * (planet_temp / star_temp).powi(4)
}
pub fn transit_timing_variation(
perturber_mass: f64,
star_mass: f64,
period: f64,
resonance_ratio: f64,
) -> f64 {
let mu = perturber_mass / star_mass;
mu * period / (4.5 * PI) * (resonance_ratio - 1.0).abs().max(0.01).recip()
}
pub fn planet_mass_from_transit_and_rv(
depth: f64,
star_radius: f64,
rv_semi_amplitude: f64,
period: f64,
star_mass: f64,
) -> f64 {
let r_p = depth.sqrt() * star_radius;
let _ = r_p;
let a = (G * star_mass * (period / (2.0 * PI)).powi(2)).cbrt();
rv_semi_amplitude * star_mass * (a / (G * star_mass)).sqrt()
}