BiasCorrectQ.Program.GetBiasCorrectedFlow C# (CSharp) Method

GetBiasCorrectedFlow() private static method

private static GetBiasCorrectedFlow ( double value, List obs_flow, List obs_exc, LNFit obs_stats, List sim_flow, List sim_exc, LNFit sim_stats ) : double
value double
obs_flow List
obs_exc List
obs_stats LNFit
sim_flow List
sim_exc List
sim_stats LNFit
return double
        private static double GetBiasCorrectedFlow(double value,
            List<double> obs_flow, List<double> obs_exc, LNFit obs_stats,
            List<double> sim_flow, List<double> sim_exc, LNFit sim_stats)
        {
            double rval;

            //if simulated value is zero return zero
            if (value > -0.001 && value < 0.001)
            {
            return 0;
            }

            double quantile = -1;
            double ln3anom = (Math.Log(value) - sim_stats.lnmean) / sim_stats.lnstd;
            double thresh = 3.5;

            //check if flow higher or lower than any quantile value
            bool outRangeFlow = (value > sim_flow[0]
                             || value < sim_flow[sim_flow.Count - 1]);

            if (!outRangeFlow)
            {
            quantile = Interpolate(value, sim_flow, sim_exc);
            }

            //check if quantile is out of range of observed quantile
            bool outRangeQuantile = (quantile > obs_exc[obs_exc.Count - 1]
                                 || quantile < obs_exc[0] || outRangeFlow);

            if (outRangeQuantile)
            {
            rval = Math.Exp(obs_stats.lnstd * ln3anom + obs_stats.lnmean);
            }
            else
            {
            rval = Interpolate(quantile, obs_exc, obs_flow);
            }

            //if simulated value is sufficiently out of range as defined by
            //threshold value, use simple scaling technique
            if (ln3anom < (-1 * thresh) || ln3anom > thresh)
            {
            rval = value / sim_stats.mean * obs_stats.mean;
            }

            return rval;
        }