Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }