dt = 1; % 1 min intervals
nSamplesM = 2^12; % Upto 80 hours
lag = fftshift(-nSamplesM:1:nSamplesM-1)'.*dt;
% Generating auto-correlation matrices for the model
Rm = acf_fit_PCC(abs(lag));
RmErr = acf_fit_var(abs(lag));
% Input 2 : The autocorrelation matrix/function
RmMatrix = toeplitz(Rm(find(lag==0):find(lag==(nSamplesM-1)*dt)));
RmErrMatrix = toeplitz(RmErr(find(lag==0):find(lag==(nSamplesM-1)*dt)));
% Input 1: Probability distribution
X = MvLogNRand(repmat(-0.2518,nSamplesM,1),repmat(0.85,nSamplesM,1),nEnsemblesM,RmMatrix); %% Em^sh substitute in model
WI = zeros(nEnsemblesM,nSubsetSample); % Erroneous estimate at the ionosphere
HIXB = zeros(nEnsemblesM,nSubsetSample); % Error
WI_10 = zeros(nEnsemblesM,nSubsetSample); % When Magnitude error is 10% min relative error
WI_100 = zeros(nEnsemblesM,nSubsetSample); % When Magnitude error is 100%
WI_200 = zeros(nEnsemblesM,nSubsetSample); % When Magnitude error is 200%
XI = X(:,tsubset); % True value at the ionosphere
temp = X(i,:)'+ HNoiseX_B25(i,:)';
WI(i,:) = interp1(timeM',temp,t_WI_XI(i,tsubset)','nearest'); %Assuming 30% relative error
WI_10(i,:) = interp1(timeM',X(i,:)'+ 0.1.*0.3.^-1.*HNoiseX_B25(i,:)',t_WI_XI(i,tsubset)','nearest');
WI_100(i,:) = interp1(timeM',X(i,:)'+ 1.*0.3.^-1.*HNoiseX_B25(i,:)',t_WI_XI(i,tsubset)','nearest');
WI_200(i,:) = interp1(timeM',X(i,:)'+ 2.*0.3.^-1.*HNoiseX_B25(i,:)',t_WI_XI(i,tsubset)','nearest');
HIXB(i,:) =interp1(timeM',HNoiseX_B25(i,:)',t_WI_XI(i,tsubset)','nearest');
resize_figure(figS4_4,90,180);
tiledlayout(1,2,"TileSpacing","tight");
p0 = plot(XBins,XBins,'-k');
ylabel({'$ \langle X|X^* \rangle$ [mV/m]','Synthetic electric field (Shocked solar wind driver)'},'Interpreter','latex');
set(gca,'YColor',[0 0 0]);
p10 = plot_curve(EXIgWI_10,'#e69f00'); % 10% magnitude uncertainty (smaller than our calculation)
p30 = plot_curve(EXIgWI_30,'#cc79a7'); % 30% magnitude uncertainty (what we use)
p100 = plot_curve(EXIgWI_100,'#56b4e9'); % 100% magnitude uncertainty (larger than our calculation)
p200 = plot_curve(EXIgWI_200,'#009e73'); % 200% magnitude uncertainty (larger than our calculation)
xlabel({'$X^*$ [mV/m]','Synthetic erroneous solar wind driver'},'Interpreter','latex');
legend([p10,p30,p100,p200,p0],...
'min($\varepsilon/X$) $\sim 10\%$',...
'min($\varepsilon/X$) $\sim 30\%$',...
'min($\varepsilon/X$) $\sim 100\%$',...
'min($\varepsilon/X$) $\sim 200\%$',...
'Interpreter',"latex",'Location','northwest');
title('Sensitivity analysis for magnitude uncertainty','Interpreter',"none");
plot(0.1.*0.3.^-1.*bayanefit(XBins')./XBins',XBins,'','Color','#e69f00');
plot(bayanefit(XBins')./XBins',XBins,'','Color','#cc79a7');
plot(1.*0.3.^-1.*bayanefit(XBins')./XBins',XBins,'','Color','#56b4e9');
plot(2.*0.3.^-1.*bayanefit(XBins')./XBins',XBins,'','Color','#009e73');
xlabel('Relative uncertainty $\varepsilon$ normalized by $E_m^{sh}$','Interpreter',"latex");
ylabel({'Shocked solar wind merging electric field, True value','$E_m^{sh},X$'},'Interpreter',"latex");
title('Magnitude uncertainty $\varepsilon$','Interpreter',"latex");
set(gca,'YTick',[0,12,25],'XTick',[0,0.3,1,2,4],'XTickLabel',{"0","30%","100%","200%","400%"});
%exportgraphics(figS4_4,[outputFolder,'ExtendedDataFigure9.pdf'],'ContentType','vector');
exportgraphics(figS4_4,[outputFolder,'ExtendedDataFigure9.png'],'Resolution',600);
%--------------------------------------------------------------------------
% A - Input altitude vs. time matrix [nh x nT]
%--------------------------------------------------------------------------
% B - Interpolated altitude vs. time matrix, along the altitude directon
% with nans removed [nh x nT]
%--------------------------------------------------------------------------
% Modified: 17th Jan 2018
% Created : 25th Sep 2016
% Author : Nithin Sivadas
%--------------------------------------------------------------------------
if sum(isnan(y))< size(A,1)-2
B(:,ty)=interp1(xi,yi,x,'linear','extrap');
[isThereNAN, totalNAN] = check_nan(B);
function [isThereNAN, totalNAN] = check_nan(thisArray)
%--------------------------------------------------------------------------
% thisArray : An array or a matrix
%--------------------------------------------------------------------------
% isThereNAN : A boolean variable, True => there is nan values in the
% array, and False => there is no nan values in the array
% totalNAN : The total number of NAN values
%--------------------------------------------------------------------------
% Modified: 22nd Sep 2016
% Created : 22nd Sep 2016
% Author : Nithin Sivadas
%--------------------------------------------------------------------------
thisArrayNAN = isnan(thisArray);
totalNAN = sum(thisArrayNAN(:));
warning(['There are ',num2str(totalNAN),...
' nan values in your data. The results may not be accurate.']);
function resize_figure( figureHandle, vert, horz )
%--------------------------------------------------------------------------
% vert - Vertical page size in mm (Default Letter Size)
% horz - Horizontal page size in mm (Default Letter Size)
if nargin<3 || isempty(horz)
if nargin<2 || isempty(vert)
% Figure size displayed on screen
movegui(figureHandle, 'center');
set(figureHandle,'color','w');
set(figureHandle, 'Units', 'centimeters', 'Position', [0 0 xSize ySize])
% Function to plot a conditional expectation
function p = plot_curve(curve, color)
CI1 = interp_nans(curve.CI);
p=plot(curve.XBins, curve.YgX, 'Color', color);
plot_ci(curve.XBins,CI1,color,0.2);
function plot_ci(x,ci,color,alpha)
inBetween = [ci(:,1)', fliplr(ci(:,2)')];
fill(X2,inBetween,"",'FaceColor',color,'LineStyle','none','FaceAlpha',alpha);
function p = plot_2D_error(Y,X,P,yLabel)
set(p,'EdgeColor','none');
colorbar_thin('YLabel',yLabel);
% Function to calculate a conditional expectation of Y given X
function curve = create_curve(X, Y, Ei)
X1 = X(~isnan(X) & ~isnan(Y));
Y1 = Y(~isnan(X) & ~isnan(Y));
[xindx, E] = discretize(X(:),Ei);
curve.YgX(i) = nanmean(Y(xindx==i));
curve.stdYgX(i) = nanstd(Y(xindx==i));
curve.NSamples(i) = sum(xindx==i & ~isnan(Y));
curve.SEM(i) = nanstd(Y(xindx==i))./sqrt(curve.NSamples(i));
curve.ts(i,:) = tinv([0.025 0.975],curve.NSamples(i)-1);
curve.CI(i,:) = curve.YgX(i) + curve.ts(i,:)*curve.SEM(i);
curve.XBins(i) = 0.5*(E(i)+E(i+1));