private void EnsureReferenceSums(FilterResponse filterResponse, List <AbsFluxSpectra> standardSpectras) { m_SynthetizedReferneceFluxMagnitudes.Clear(); var standardAbsFluxFitMagErrors = new List <double>(); foreach (CalSpecStar star in CalSpecDatabase.Instance.Stars) { AbsFluxSpectra fittedSpectra = standardSpectras.FirstOrDefault(x => x.m_CalSpecStar.CalSpecStarId == star.CalSpecStarId); if (fittedSpectra == null) { continue; } List <double> wavelengths = fittedSpectra.ResolvedWavelengths; List <double> fluxes = fittedSpectra.AbsoluteFluxes; List <double> residuals = fittedSpectra.Residuals; double referenceSum = 0; double prevNonNaNVal = 0; double residualSum = 0; double prevNonNaNResidualVal = 0; foreach (int wavelength in filterResponse.Response.Keys) { double responseCoeff = filterResponse.Response[wavelength]; double val = InterpolateValue(wavelengths, fluxes, wavelength); if (!double.IsNaN(val)) { prevNonNaNVal = val; } referenceSum += prevNonNaNVal * responseCoeff; double residualVal = InterpolateValue(wavelengths, residuals, wavelength); if (!double.IsNaN(residualVal)) { prevNonNaNResidualVal = residualVal; } residualSum += prevNonNaNResidualVal * responseCoeff; } standardAbsFluxFitMagErrors.Add(Math.Abs(Math.Log10((referenceSum + residualSum) / referenceSum))); m_SynthetizedReferneceFluxMagnitudes.Add(referenceSum, GetReferenceMagnitude(filterResponse, star)); } // NOTE: Is this a good way to estimate the error? m_AverageAbsFluxFitMagError = standardAbsFluxFitMagErrors.Average(); // / Math.Sqrt(standardAbsFluxFitMagErrors.Count); }
private double ComputeSyntheticMag(FilterResponse filterResponse, AbsFluxSpectra spectra, out double magError) { double targetSum = 0; double prevNonNaNVal = 0; foreach (int wavelength in filterResponse.Response.Keys) { double responseCoeff = filterResponse.Response[wavelength]; double targetVal = InterpolateValue(spectra.ResolvedWavelengths, spectra.AbsoluteFluxes, wavelength); if (!double.IsNaN(targetVal)) { prevNonNaNVal = targetVal; } targetSum += prevNonNaNVal * responseCoeff; } var allMags = new List <double>(); foreach (double conv in m_SynthetizedReferneceFluxMagnitudes.Keys) { double mag = m_SynthetizedReferneceFluxMagnitudes[conv] + 2.5 * Math.Log10(conv / targetSum); allMags.Add(mag); } // First itteration double averageMag = allMags.Average(); double threeSigma = 3 * Math.Sqrt(allMags.Select(x => (averageMag - x) * (averageMag - x)).Sum()) / (allMags.Count - 1); allMags = allMags.Where(x => (Math.Abs(x - averageMag) <= threeSigma)).ToList(); // Second itteration after removing outliers averageMag = allMags.Average(); magError = m_AverageAbsFluxFitMagError + Math.Sqrt(allMags.Select(x => (averageMag - x) * (averageMag - x)).Sum()) / (allMags.Count - 1); return(averageMag); }