private float ModelStarAmplitude(IStar star, float starMag, ModelConfig modelConfig, int bitPix, uint maxSignalValue) { if (Math.Abs(modelConfig.BVSlope) > 0.001) { UCAC4Entry ucac4Star = star as UCAC4Entry; if (ucac4Star != null) { double bv = ucac4Star.MagB - ucac4Star.MagV; if (double.IsNaN(bv)) { bv = 0.5; // Default value } starMag += (float)(modelConfig.BVSlope * bv); } } if (modelConfig.PSFMagnitudeModelling) { return((float)((double)(modelConfig.MaxPixelValue - (modelConfig.NoiseMean + modelConfig.DarkFrameMean) * modelConfig.Integration) / Math.Pow(10, (starMag - modelConfig.BrighestUnsaturatedStarMag) / 2.5))); } else { InitStarAmplitudeModelling(modelConfig, 0.02f, bitPix, maxSignalValue); double starMagPeak = ModelStarAmplitudePeak(modelConfig, starMag); return((float)starMagPeak); } }
private float GetStarMag(IStar star, ModelledFilter filter) { UCAC4Entry ucac4Star = star as UCAC4Entry; if (ucac4Star != null) { switch (filter) { case ModelledFilter.B: return(double.IsNaN(ucac4Star.MagB) || ucac4Star.MagB > 25 ? (float)ucac4Star.Mag : (float)ucac4Star.MagB); case ModelledFilter.V: return(double.IsNaN(ucac4Star.MagV) || ucac4Star.MagV > 25 ? (float)ucac4Star.Mag : (float)ucac4Star.MagV); case ModelledFilter.Sloan_g: return(double.IsNaN(ucac4Star.Mag_g) || ucac4Star.Mag_g > 25 ? (float)ucac4Star.Mag : (float)ucac4Star.Mag_g); case ModelledFilter.Sloan_r: return(double.IsNaN(ucac4Star.Mag_r) || ucac4Star.Mag_r > 25 ? (float)ucac4Star.Mag : (float)ucac4Star.Mag_r); case ModelledFilter.Sloan_i: return(double.IsNaN(ucac4Star.Mag_i) || ucac4Star.Mag_i > 25 ? (float)ucac4Star.Mag : (float)ucac4Star.Mag_i); } } else { switch (filter) { case ModelledFilter.B: return(double.IsNaN(star.MagB) || star.MagB > 25 ? (float)star.Mag : (float)star.MagB); case ModelledFilter.V: case ModelledFilter.Sloan_g: return(double.IsNaN(star.MagV) || star.MagV > 25 ? (float)star.Mag : (float)star.MagV); case ModelledFilter.Sloan_r: return(double.IsNaN(star.MagR) || star.MagR > 25 ? (float)star.Mag : (float)star.MagR); case ModelledFilter.Sloan_i: return((float)star.Mag); } } return((float)star.Mag); }
private void CalculateGagnitudeFit(Dictionary <IStar, double> measurements, double fixedColourCoeff) { List <MagFitEntry> datapoints = new List <MagFitEntry>(); foreach (IStar star in measurements.Keys) { UCAC4Entry ucac4 = (UCAC4Entry)star; if (!double.IsNaN(ucac4.Mag_r) && Math.Abs(ucac4.Mag_r) > 0.00001 && !double.IsNaN(ucac4.MagB) && !double.IsNaN(ucac4.MagV)) { datapoints.Add(new MagFitEntry() { APASS_Sloan_r = ucac4.Mag_r, APASS_BV_Colour = ucac4.MagB - ucac4.MagV, MedianIntensity = measurements[star], MedianIntensityError = 0.05 * measurements[star] }); } } float FIXED_COLOUR_COEFF = (float)fixedColourCoeff; for (int i = 0; i < datapoints.Count; i++) { datapoints[i].InstrMag = -2.5 * Math.Log10(datapoints[i].MedianIntensity) + 32 - datapoints[i].APASS_BV_Colour * FIXED_COLOUR_COEFF; datapoints[i].InstrMagErr = Math.Abs(-2.5 * Math.Log10((datapoints[i].MedianIntensity + datapoints[i].MedianIntensityError) / datapoints[i].MedianIntensity)); } datapoints = datapoints.Where(x => !double.IsNaN(x.InstrMag) && x.InstrMagErr < 0.2).ToList(); if (datapoints.Count < 4) { return; } double variance = 0; double Ka = 0; double Kb = 0; int MAX_ITTER = 2; for (int itt = 0; itt <= MAX_ITTER; itt++) { SafeMatrix A = new SafeMatrix(datapoints.Count, 2); SafeMatrix X = new SafeMatrix(datapoints.Count, 1); int idx = 0; for (int i = 0; i < datapoints.Count; i++) { A[idx, 0] = datapoints[i].InstrMag; A[idx, 1] = 1; X[idx, 0] = datapoints[i].APASS_Sloan_r; idx++; } SafeMatrix a_T = A.Transpose(); SafeMatrix aa = a_T * A; SafeMatrix aa_inv = aa.Inverse(); SafeMatrix bx = (aa_inv * a_T) * X; Ka = bx[0, 0]; Kb = bx[1, 0]; double resSum = 0; for (int i = 0; i < datapoints.Count; i++) { double computedMag = Ka * datapoints[i].InstrMag + Kb; double diff = computedMag - datapoints[i].APASS_Sloan_r; resSum += diff * diff; datapoints[i].Residual = diff; } variance = Math.Sqrt(resSum / datapoints.Count); if (itt < MAX_ITTER) { datapoints.RemoveAll(x => Math.Abs(x.Residual) > 2 * variance || Math.Abs(x.Residual) > 0.2); } } Trace.WriteLine(string.Format("r' + {3} * (B-V) + = {0} * M + {1} +/- {2}", Ka.ToString("0.0000"), Kb.ToString("0.0000"), variance.ToString("0.00"), FIXED_COLOUR_COEFF.ToString("0.00000"))); }
public AstrometricSolutionImpl(LeastSquareFittedAstrometry astrometry, StarMagnitudeFit photometry, AstrometricState state, FieldSolveContext fieldSolveContext, MeasurementContext measurementContext) { StarCatalog = fieldSolveContext.StarCatalogueFacade.CatalogNETCode; UtcTime = fieldSolveContext.UtcTime; FrameNoOfUtcTime = fieldSolveContext.FrameNoOfUtcTime; AutoLimitMagnitude = (float)fieldSolveContext.AutoLimitMagnitude; ResolvedFocalLength = (float)fieldSolveContext.FocalLength; if (astrometry != null) { ResolvedCenterRADeg = (float)astrometry.RA0Deg; ResolvedCenterDEDeg = (float)astrometry.DE0Deg; StdDevRAArcSec = (float)astrometry.StdDevRAArcSec; StdDevDEArcSec = (float)astrometry.StdDevDEArcSec; ArcSecsInPixel = 1 / astrometry.GetDistanceInPixels(1); } else { ResolvedCenterRADeg = float.NaN; ResolvedCenterDEDeg = float.NaN; StdDevRAArcSec = float.NaN; StdDevDEArcSec = float.NaN; ArcSecsInPixel = 0; } if (state.SelectedObject != null) { m_UserObject = new TangraUserObjectImpl(); m_UserObject.RADeg = (float)state.SelectedObject.RADeg; m_UserObject.DEDeg = (float)state.SelectedObject.DEDeg; m_UserObject.X = (float)state.SelectedObject.X0; m_UserObject.Y = (float)state.SelectedObject.Y0; if (state.IdentifiedObjects != null && state.IdentifiedObjects.Count == 1) { foreach (IIdentifiedObject idObj in state.IdentifiedObjects) { if (AngleUtility.Elongation(idObj.RAHours * 15.0, idObj.DEDeg, state.SelectedObject.RADeg, state.SelectedObject.DEDeg) * 3600 < 120) { m_UserObject.ResolvedName = idObj.ObjectName; break; } } } } InstrumentalDelay = measurementContext.InstrumentalDelay; InstrumentalDelayUnits = measurementContext.InstrumentalDelayUnits.ToString(); FrameTimeType = measurementContext.FrameTimeType.ToString(); IntegratedFramesCount = measurementContext.IntegratedFramesCount; IntegratedExposureSeconds = measurementContext.IntegratedExposureSeconds; AavIntegration = measurementContext.AavIntegration; AavStackedMode = measurementContext.AavStackedMode; VideoFileFormat = measurementContext.VideoFileFormat.ToString(); NativeVideoFormat = measurementContext.NativeVideoFormat; if (!string.IsNullOrEmpty(state.IdentifiedObjectToMeasure)) { ObjectDesignation = MPCObsLine.GetObjectCode(state.IdentifiedObjectToMeasure); } else if (state.IdentifiedObjects != null && state.IdentifiedObjects.Count == 1) { ObjectDesignation = MPCObsLine.GetObjectCode(state.IdentifiedObjects[0].ObjectName); } ObservatoryCode = fieldSolveContext.ObsCode; CatalogueCode = measurementContext.StarCatalogueFacade.CatalogNETCode; m_MeasurementsImpl = new List <TangraAstrometricMeasurementImpl>(); if (state.Measurements != null) { foreach (var mea in state.Measurements) { m_MeasurementsImpl.Add(new TangraAstrometricMeasurementImpl() { DEDeg = mea.DEDeg, RADeg = mea.RADeg, FrameNo = mea.FrameNo, SolutionUncertaintyRACosDEArcSec = mea.SolutionUncertaintyRACosDEArcSec, SolutionUncertaintyDEArcSec = mea.SolutionUncertaintyDEArcSec, FWHMArcSec = mea.FWHMArcSec, Detection = mea.Detection, SNR = mea.SNR, UncorrectedTimeStamp = mea.FrameTimeStamp, Mag = mea.Mag }); } } m_MatchedStarImpl = new List <TangraMatchedStarImpl>(); if (astrometry != null) { foreach (PlateConstStarPair pair in astrometry.FitInfo.AllStarPairs) { if (pair.FitInfo.UsedInSolution) { var star = new TangraMatchedStarImpl() { X = (float)pair.x, Y = (float)pair.y, RADeg = (float)pair.RADeg, DEDeg = (float)pair.DEDeg, StarNo = pair.StarNo, ExcludedForHighResidual = pair.FitInfo.ExcludedForHighResidual, ResidualRAArcSec = (float)pair.FitInfo.ResidualRAArcSec, ResidualDEArcSec = (float)pair.FitInfo.ResidualDEArcSec, DetectionCertainty = (float)pair.DetectionCertainty, PSFAmplitude = (int)pair.Intensity, IsSaturated = pair.IsSaturated, Mag = (float)pair.Mag }; TangraCatalogStarImpl catStar = null; IStar catalogStar = fieldSolveContext.CatalogueStars.Find(s => s.StarNo == pair.StarNo); if (catalogStar != null) { if (catalogStar is UCAC4Entry) { catStar = new TangraAPASSStar(); } else { catStar = new TangraCatalogStarImpl(); } catStar.StarNo = catalogStar.StarNo; catStar.MagR = (float)catalogStar.MagR; catStar.MagV = (float)catalogStar.MagV; catStar.MagB = (float)catalogStar.MagB; catStar.Mag = (float)catalogStar.Mag; if (catalogStar is UCAC3Entry) { UCAC3Entry ucac3Star = (UCAC3Entry)catalogStar; catStar.MagJ = (float)(ucac3Star.jmag * 0.001); catStar.MagK = (float)(ucac3Star.kmag * 0.001); catStar.RAJ2000Deg = (float)ucac3Star.RACat; catStar.DEJ2000Deg = (float)ucac3Star.DECat; } else if (catalogStar is UCAC2Entry) { UCAC2Entry ucac2Star = (UCAC2Entry)catalogStar; catStar.MagJ = (float)(ucac2Star._2m_J * 0.001); catStar.MagK = (float)(ucac2Star._2m_Ks * 0.001); catStar.RAJ2000Deg = (float)ucac2Star.RACat; catStar.DEJ2000Deg = (float)ucac2Star.DECat; } else if (catalogStar is NOMADEntry) { NOMADEntry nomadStar = (NOMADEntry)catalogStar; catStar.MagJ = (float)(nomadStar.m_J * 0.001); catStar.MagK = (float)(nomadStar.m_K * 0.001); catStar.RAJ2000Deg = (float)nomadStar.RACat; catStar.DEJ2000Deg = (float)nomadStar.DECat; } else if (catalogStar is UCAC4Entry) { UCAC4Entry ucac4Star = (UCAC4Entry)catalogStar; catStar.MagJ = (float)(ucac4Star.MagJ); catStar.MagK = (float)(ucac4Star.MagK); catStar.RAJ2000Deg = (float)ucac4Star.RACat; catStar.DEJ2000Deg = (float)ucac4Star.DECat; ((TangraAPASSStar)catStar).B = (float)ucac4Star.MagB; ((TangraAPASSStar)catStar).V = (float)ucac4Star.MagV; ((TangraAPASSStar)catStar).g = (float)ucac4Star.Mag_g; ((TangraAPASSStar)catStar).r = (float)ucac4Star.Mag_r; ((TangraAPASSStar)catStar).i = (float)ucac4Star.Mag_i; ((TangraAPASSStar)catStar).e_B = ucac4Star.apase_B * 0.001f; ((TangraAPASSStar)catStar).e_V = ucac4Star.apase_V * 0.001f; ((TangraAPASSStar)catStar).e_g = ucac4Star.apase_g * 0.001f; ((TangraAPASSStar)catStar).e_r = ucac4Star.apase_r * 0.001f; ((TangraAPASSStar)catStar).e_i = ucac4Star.apase_i * 0.001f; } } star.CatalogStar = catStar; if (photometry != null) { IStar photometryStar = photometry.StarNumbers.FirstOrDefault(s => s.StarNo == pair.StarNo); if (photometryStar != null) { int idx = photometry.StarNumbers.IndexOf(photometryStar); star.Intensity = (float)photometry.Intencities[idx]; star.IsSaturated = photometry.SaturatedFlags[idx]; star.MeaSignalMethod = ConvertSignalMethod(photometry.MeaSignalMethod); star.MeaBackgroundMethod = ConvertBackgroundMethod(photometry.MeaBackgroundMethod); star.MeaSingleApertureSize = photometry.MeaSingleAperture; star.MeaBackgroundPixelCount = photometry.MeaBackgroundPixelCount; star.MeaSaturationLevel = photometry.MeaSaturationLevel; } } m_MatchedStarImpl.Add(star); } } } }