public XYToRADec(string wcsfilepath, double Xpos, double Ypos) { //Open reference image in TSX. Plate solve. ccdsoftImage tsx_img = new ccdsoftImage(); tsx_img.Path = wcsfilepath; tsx_img.Open(); tsx_img.DetachOnClose = 0; try { tsx_img.InsertWCS(true); } catch { tsx_img.Close(); plateSolve = false; return; } tsx_img.XYToRADec(Xpos, Ypos); targetRA = tsx_img.XYToRADecResultRA(); targetDec = tsx_img.XYToRADecResultDec(); northangle = tsx_img.NorthAngle; imagescale = tsx_img.ScaleInArcsecondsPerPixel; imagewidth = tsx_img.WidthInPixels; imageheight = tsx_img.HeightInPixels; plateSolve = true; tsx_img.Close(); return; }
private TargetData SearchForLightSourceInventory(ccdsoftImage tsximg, TargetData lightSource) { sky6Utils tsxu = new sky6Utils(); double ra = lightSource.TargetRA; double dec = lightSource.TargetDec; double rDelta = 1000; double rmsDelta; int sIndex = -1; for (int iSource = 0; iSource < XPosArr.Length; iSource++) { tsximg.XYToRADec((double)XPosArr[iSource], (double)YPosArr[iSource]); double raSrc = tsximg.XYToRADecResultRA(); double decSrc = tsximg.XYToRADecResultDec();; tsxu.ComputeAngularSeparation(ra, dec, raSrc, decSrc); rmsDelta = tsxu.dOut0; if (rmsDelta <= rDelta) { rDelta = rmsDelta; sIndex = iSource; lightSource.InventoryArrayIndex = sIndex; lightSource.TargetToSourcePositionError = rDelta * 3600.0; lightSource.SourceRA = raSrc; lightSource.SourceDec = decSrc; lightSource.SourceUncorrectedMagnitude = (double)MagArr[sIndex]; lightSource.SourceX = (double)XPosArr[sIndex]; lightSource.SourceY = (double)YPosArr[sIndex]; } } return(lightSource); }
public string Display(string galaxyName, double suspectRAhrs, double suspectDecdeg) { const int sampleSize = 20; //Test code for PlateSolve2 Wrapper //CancellationToken cToken; TargetName = galaxyName; TargetRAhrs = suspectRAhrs; TargetDecdeg = suspectDecdeg; string followUpfileName = FollowUpPath + "\\" + TargetName + ".fit"; TargetImageDir = ImageBankPath + "\\" + TargetName; //Show suspect in astroimage form, if PlateSolve2 is installed // if not, then an exception will be thrown // //test code //fileName = "C:\\Users\\Rick McAlister\\Documents\\SuperScan\\Image Bank\\NGC 1023\\NGC 1023_2019-10-31-2138.fit"; //fileName = "C:\\Users\\Rick McAlister\\Documents\\SuperScan\\Image Bank\\NGC 1023\\CurrentImage.fit"; // TargetFits = new FitsFile(followUpfileName, true); double pixSize = 1; if (TargetFits.FocalLength != 0) { pixSize = (206.265 / TargetFits.FocalLength) * TargetFits.XpixSz; } // ccdsoftImage tsxim = new ccdsoftImage(); tsxim.Path = FollowUpPath + "\\" + galaxyName + ".fit"; tsxim.Open(); //Try to image link. If not successful, probably too few stars // if so, just return out of this; ImageLink tsxil = new ImageLink(); tsxil.pathToFITS = tsxim.Path; try { tsxil.execute(); } catch (Exception ex) { return("Image Link Error: " + ex.Message); } //Show pic on scrren tsxim.Visible = 0; ImageLinkResults tsxilr = new ImageLinkResults(); int rlt = tsxilr.succeeded; string rltText = tsxilr.errorText; try { //tsxim.InsertWCS(true); tsxim.ShowInventory(); } catch (Exception ex) { string evx = ex.Message; return(evx); } //Look for a light source within 10 pixels of the target RA/Dec //The developer is picking an arbitrary 10 pixel square box as "near" int iLS = FindClosestLightSource(tsxim, TargetRAhrs, TargetDecdeg, 10); if (iLS == -1) { return("No light source found at suspect location\r\n **Aborting check**"); } //Success -- light source at target location. Get magnitude and X,Y coordinates for all light sources var rMagArr = tsxim.InventoryArray((int)ccdsoftInventoryIndex.cdInventoryMagnitude); var rXArr = tsxim.InventoryArray((int)ccdsoftInventoryIndex.cdInventoryX); var rYArr = tsxim.InventoryArray((int)ccdsoftInventoryIndex.cdInventoryY); double rMag; string cName; int starIndex = 0; int starCount = 0; int minStarCount = sampleSize; double tMag = rMagArr[iLS]; //Collect a set of catalog stars that have positions that match up // with reference light sources of similar intensity to the target // light source. // // first, create data arrays for reference magnitudes and catalog magnitudes double[] refMag = new double[sampleSize]; double[] catMag = new double[sampleSize]; double[] difMag = new double[sampleSize]; //double[] meanDev = new double[sampleSize]; // second, create TSX objects for the star chart and object information sky6StarChart tsxsc = new sky6StarChart(); sky6ObjectInformation tsxoi = new sky6ObjectInformation(); //loop over all the stars in the light source magnitude array, // or until a sufficient number of stars are found that match up do { //Compare the reference light source magnitude to the target light source magnitude // if within 1 magnitude of each other then look up the associated star, if any rMag = (double)rMagArr[starIndex]; if (Math.Abs(tMag - rMag) <= 1.0) { //Get the RA/Dec location of the reference light source tsxim.XYToRADec(rXArr[starIndex], rYArr[starIndex]); double rRA = tsxim.XYToRADecResultRA(); double rDec = tsxim.XYToRADecResultDec(); //Center the star chart on the RA/Dec coordinates tsxsc.RightAscension = rRA; tsxsc.Declination = rDec; int Xcen = tsxsc.WidthInPixels / 2; int Ycen = tsxsc.HeightInPixels / 2; //find the star at the center of the chart tsxsc.ClickFind(Xcen, Ycen); //get the name of the star, if any tsxoi.Property(Sk6ObjectInformationProperty.sk6ObjInfoProp_SOURCE_CATALOG); string cSrc = tsxoi.ObjInfoPropOut; //if there is a name, then get its properties if (cSrc != "") { //Get the name of the star tsxoi.Property(Sk6ObjectInformationProperty.sk6ObjInfoProp_NAME1); cName = tsxoi.ObjInfoPropOut; //Get the catalog magnitude of the star tsxoi.Property(Sk6ObjectInformationProperty.sk6ObjInfoProp_MAG); catMag[starCount] = tsxoi.ObjInfoPropOut; refMag[starCount] = rMag; starCount++; } } starIndex++; } while ((starCount < minStarCount) && (starIndex < rMagArr.Length)); //Compute the difference bewtween reference magnitude and catalog magnitude for (int i = 0; i < starCount; i++) { difMag[i] = refMag[i] - catMag[i]; } //Compute the average difference double avgMagDif = 0; for (int i = 0; i < starCount; i++) { avgMagDif += difMag[i]; } avgMagDif = avgMagDif / starCount; //Compute the mean square of the deviation double avgMagDev = 0; for (int i = 0; i < starCount; i++) { avgMagDev += Math.Pow((difMag[i] - avgMagDif), 2); } avgMagDev = Math.Sqrt(avgMagDev / starCount); //Compute the adjusted magnitude for target double avgTgtAdjMag = tMag - avgMagDif; //Compute the adjusted magnitude error double meanDevTgtAdjMag = avgMagDev; //Return center of starchart to target location //Set the center of view to the suspect//s RA/Dec and light up the target icon // //Recenter the star chart on the RA/Dec coordinates tsxsc.RightAscension = TargetRAhrs; tsxsc.Declination = TargetDecdeg; int Xtcen = tsxsc.WidthInPixels / 2; int Ytcen = tsxsc.HeightInPixels / 2; //find the star at the center of the chart tsxsc.ClickFind(Xtcen, Ytcen); tsxoi.Property(Sk6ObjectInformationProperty.sk6ObjInfoProp_NAME1); string starName = tsxoi.ObjInfoPropOut; //Open astrodisplay form of follow up image tsxim = null; tsxoi = null; tsxsc = null; //Report on computed apparant magnitude return("Nearest star: " + starName + "\r\n" + "Adjusted apparent magnitude = " + avgTgtAdjMag.ToString() + " +/- " + meanDevTgtAdjMag.ToString()); }