A tool designed to analyze the impact of solar radiation on spaceborne infrastructure, particularly in Low Earth Orbit (LEO). By leveraging data from large-scale deployments like SpaceX’s Starlink, CosmicDance provides insights into satellite orbital shifts and identifies risks such as premature orbital decay.
CosmicDance is a modular framework that utilizes multimodal datasets, including solar activity intensity and satellite tracking data. It maps these datasets in a time series to measure and visualize how orbital trajectories change at scale.
Use the following steps to build CosmicDance environment.
- Create conda environment from
environment.yml
conda env create -f dependencies/environment.ymlFor macOS use environment_macOS.yml
conda env create -f dependencies/environment_macOS.yml- Activate
cosmicdanceenvironment
conda deactivate && conda activate cosmicdance- Add user credentials for space-track in credentials/credentials_0.json
{
"identity": "[email protected]",
"password": "password"
}- Export
CosmicDancepath in the shell. This will allow seamless execution of scripts.
export PYTHONPATH=$(pwd)OR
For instance, if the repository is cloned at /home/suvam/Projects/CosmicDance
export PYTHONPATH="/home/suvam/Projects/CosmicDance"CosmicDance processes datasets in parallel by default. However, for each script, you can set PARALLEL_MODE to False to run the processing in serial mode.
Note: macOS users may encounter issues with parallel mode. It is recommended to set
PARALLEL_MODEtoFalsein such cases.
PARALLEL_MODE = FalseCosmicDance automatically acquires solar activity data (Dst index) from the World Data Center for Geomagnetism, Kyoto, NORAD Catalogue Numbers from CelesTrak, and TLEs from Space-Track through the following steps.
- Get Dst index
python starlink/build_dataset/acquire/Dst_index.py- Get satellite NORAD Catalog Number
python starlink/build_dataset/acquire/new_catalog_numbers.py- Download TLEs
python starlink/build_dataset/acquire/download_historic_tles.pyPrepare the dataset for orbital shift analysis by following these steps:
Prepare the time window (start and end timestamps) of solar activities above or below a certain intensity by following these steps:
- Solar storm times according to NOAA Space Weather Scales
python starlink/build_dataset/preprocess/DST/timespan_NOAA.py- Solar activities above some percentile
python starlink/build_dataset/preprocess/DST/timespan_percentile.py- Quiet time below some percentile
python starlink/build_dataset/preprocess/DST/timespan_quiet_day.pyPreprocess the TLEs by removing erroneous values and filtering out Starlink orbit-raising operations from the staging orbit after launch through the following steps:
- Convert TLEs from
JSONtoCSV
python starlink/build_dataset/preprocess/TLEs/JSON_to_CSV.py- Cleanup the TLEs
python starlink/build_dataset/preprocess/TLEs/cleanup.py- Remove TLEs before orbit raise (Starlink)
python starlink/build_dataset/preprocess/TLEs/remove_orbit_raise_maneuver.pyThe following steps map the multimodal datasets (solar activity and satellite orbital parameters) into a single time series using timestamps and identify abrupt changes in trajectory closely following a solar event:
- Generate launch date (or satellite) wise time series plot of orbital parameters with intensity of solar activities
python starlink/timeseries/view_timeseries_with_dst.py- The satellite (NORAD catalog number 45059) experienced an altitude drop of approximately 100 km immediately following a high-intensity solar activity and also notice an increased decay rate after the solar superstorm of May'24. For additional time series plots, refer to the notebook and the output directory of
view_timeseries_with_dst.py.
Measure the satellite orbital changes, specifically altitude, within high and low solar activity windows in a time series by following these steps:
- Orbital shifts after quiet day
Set relevant input output files using OUTPUT_DIR and EVENT_DATES_CSV
OUTPUT_DIR = "artifacts/OUTPUT/Starlink/measurement/track_altitude_change/quiet_day"
EVENT_DATES_CSV = "artifacts/OUTPUT/Starlink/timespans/quiet_day/below_ptile_80.csv"
DAYS = 15Execute the measurement script
python starlink/orbital_shifts/trace_altitude.py- Orbital shifts after high solar activity day
Set relevant input output files using OUTPUT_DIR and EVENT_DATES_CSV
OUTPUT_DIR = "artifacts/OUTPUT/Starlink/measurement/track_altitude_change/merged_above_ptile_99/RAW"
EVENT_DATES_CSV = "artifacts/OUTPUT/Starlink/timespans/percentile/merged_above_ptile_99.csv"
DAYS = 30Execute the measurement script
python starlink/orbital_shifts/trace_altitude.py- Segregate the type of shifts
python starlink/orbital_shifts/detect_altitude_shifts.py- Light sky-blue dotted lines represent the altitude changes of individual satellites. The thickness of the vertical red bars indicates the relative solar activity intensity compared to the first day. The thick green and dashed blue lines depict the 95th percentile and median altitude changes observed on that day, respectively. For more observations, refer to the notebook.
Measure the impact of solar event intensity and duration on orbital changes, specifically altitude, by following these steps:
- After low intensity solar activity days
Set relevant input output files using OUTPUT_DIR, OUTPUT_CSV, and DST_TIMESPAN
OUTPUT_DIR = "artifacts/OUTPUT/Starlink/measurement/maximum_altitude_change"
OUTPUT_CSV = f"{OUTPUT_DIR}/quiet_day_after_1_5_10.csv"
DST_TIMESPAN = "artifacts/OUTPUT/Starlink/timespans/quiet_day/merged_below_ptile_80.csv"Execute the measurement script
python starlink/altitude_change/for_intensity.py- After high intensity solar activity days
Set relevant input output files using OUTPUT_DIR, OUTPUT_CSV, and DST_TIMESPAN
OUTPUT_DIR = "artifacts/OUTPUT/Starlink/measurement/maximum_altitude_change"
OUTPUT_CSV = f"{OUTPUT_DIR}/event_day_after_1_5_10.csv"
DST_TIMESPAN = "artifacts/OUTPUT/Starlink/timespans/percentile/merged_above_ptile_95.csv"Execute the measurement script
python starlink/altitude_change/for_intensity.py- Short duration events
Set relevant input output files using OUTPUT_DIR, OUTPUT_CSV, and df_timespan
OUTPUT_DIR = "artifacts/OUTPUT/Starlink/measurement/maximum_altitude_change"
OUTPUT_CSV = f"{OUTPUT_DIR}/below_H9.csv"
df_timespan = df_timespan[df_timespan[DST.DURATION_HOURS] < 9]Execute the measurement script
python starlink/altitude_change/for_duration.py- Long duration events
Set relevant input output files using OUTPUT_DIR, OUTPUT_CSV, and df_timespan
OUTPUT_DIR = "artifacts/OUTPUT/Starlink/measurement/maximum_altitude_change"
OUTPUT_CSV = f"{OUTPUT_DIR}/above_H9.csv"
df_timespan = df_timespan[df_timespan[DST.DURATION_HOURS] > 9]Execute the measurement script
python starlink/altitude_change/for_duration.py- Compare the distribution of altitude change and drag during low and high solar intensity periods. For detailed analysis, see the notebook.
Solar events can cause satellite anomalies, tracking errors, and increased drag for satellites in Low Earth Orbit (LEO). Measure the satellite tracking and drag information as follows:
- Check for tracking anomaly
python starlink/superstorm/tracking_anomaly.py- Check for drag anomaly
python starlink/superstorm/drag_anomaly.py- Look for anomalies in notebook
CosmicDance can be used out of the box for any satellites or constellations
This work is licensed under the MIT License.
Basak, Suvam, et al. "CosmicDance: Measuring Low Earth Orbital Shifts Due to Solar Radiations" Proceedings of the ACM Internet Measurement conference. 2024.
@inproceedings {CosmicDance,
author = {Basak, Suvam and Pal, Amitangshu and Bhattacherjee, Debopam},
title = {CosmicDance: Measuring Low Earth Orbital Shifts Due to Solar Radiations},
booktitle = {{ACM IMC}},
year = {2024},
doi = {10.1145/3646547.3689024}
}Contributors whose support and expertise have been invaluable in the development of CosmicDance:




