Plot data for each orbital pass.
8 views (last 30 days)
Show older comments
Hello
This code was supposed to plot Ne vs MLT for each orbital pass of SWARM satellite. It looks like the passes are not correctly separeted. Can you comment on what is happening to this code?
Thank you so much
% Load the data
DATA = 'SW_EXTD_EFIA_LP_HM_20201101T000000_20201101T235959_0101.cdf';
info = cdfinfo(DATA);
vars = info.Variables;
lati = cell2mat(cdfread(DATA, 'Variables', {'Latitude'}));
loni = cell2mat(cdfread(DATA, 'Variables', {'Longitude'}));
Ne = cell2mat(cdfread(DATA, 'Variables', {'n'}));
ti = (cdfread(DATA, 'Variables', {'Timestamp'}));
MLT = cell2mat(cdfread(DATA, 'Variables', {'MLT'}));
MLAT = cell2mat(cdfread(DATA, 'Variables', {'MLat'}));
% Convert timestamps to MATLAB datenum format and then to minutes
for k = 1:length(ti)
datenum2(k) = todatenum(ti{k});
end
TT = datetime(datenum2, 'Format', 'HH:mm:ss', 'ConvertFrom', 'excel');
T1 = TT';
t_minutes = datenum(T1)*24*60; % convert t to minutes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Calculate the orbit period
alt = 500; % km
mu = 3.986004418e14; % m^3/s^2
R = 6378.137; % km
T = 2*pi*sqrt((R+alt)*1000/mu)/60; % minutes
% Identify the start and end times for each orbit pass
pass_num = 1;
start_index = 1;
for i = 2:length(t_minutes)
if (t_minutes(i) - t_minutes(i-1)) > T*1.5 % allow for some buffer time
end_index = i-1;
ne = Ne(start_index:end_index);
mlt = MLT(start_index:end_index);
% Plot the data for this pass
figure
plot(mlt, ne)
xlabel('MLT')
ylabel('Ne')
title(['Orbit Pass ', num2str(pass_num)])
pass_num = pass_num + 1;
start_index = i;
end
end
% Extract the data for the last orbit pass
end_index = length(t_minutes);
ne = Ne(start_index:end_index);
mlt = MLT(start_index:end_index);
% Plot the data for the last pass
figure
plot(mlt, ne)
xlabel('MLT')
ylabel('Ne')
title(['Orbit Pass ', num2str(pass_num)])
0 Comments
Answers (1)
Rasmita
on 9 Jun 2023
Hi,
It is my understanding that, you are trying to plot Ne vs MLT for each orbital pass of SWARM satellite. But the passes are not correctly separated.
In the provided code, the condition ‘(t_minutes(i) - t_minutes(i-1)) > T*1.5’ is used to determine the end of one pass and the start of the next pass. However, it does not accurately capture the transitions between passes, leading to incorrect separation.
Instead of this, look for the points where the MLT values wrap around from high to low or vice versa using the sign of gradient of the MLT, as this indicates the start or end of a new orbit pass.
Please refer to the below modified code:
% Identify the start and end times for each orbit pass
pass_num = 1;
start_index = 1;
grad_mlt = gradient(MLT);
for i = 2:length(grad_mlt)
if sign(grad_mlt(i)) ~= sign(grad_mlt(i-1)) % check for sign change
end_index = i-1;
ne = Ne(start_index:end_index);
mlt_pass = MLT(start_index:end_index);
% Plot the data for this pass
figure
plot(mlt_pass, ne)
xlabel('MLT')
ylabel('Ne')
title(['Orbit Pass ', num2str(pass_num)])
pass_num = pass_num + 1;
start_index = i;
end
end
% Extract the data for the last orbit pass
end_index = length(t_minutes);
ne = Ne(start_index:end_index);
mlt_pass = MLT(start_index:end_index);
% Plot the data for the last pass
figure
plot(mlt_pass, ne)
xlabel('MLT')
ylabel('Ne')
title(['Orbit Pass ', num2str(pass_num)])
For more information on ‘gradient’ function, please refer to the below documentation link:
For more information on ‘sign’ function, please refer to the below documentation link:
Hope this helps you resolve the query!
0 Comments
See Also
Categories
Find more on Reference Applications in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!