private static InfoObj[] GetNearbyStars(sky6StarChart tsxsc, int xC, int yC) { sky6ObjectInformation tsxod = new sky6ObjectInformation(); tsxsc.ClickFind(xC, yC); int objcnt = tsxod.Count; InfoObj[] infoObj = new InfoObj[objcnt]; for (int i = 0; i < objcnt; i++) { tsxod.Index = i; tsxod.Property(TheSky64Lib.Sk6ObjectInformationProperty.sk6ObjInfoProp_NAME1); infoObj[i].CatalogedName = tsxod.ObjInfoPropOut; tsxod.Property(TheSky64Lib.Sk6ObjectInformationProperty.sk6ObjInfoProp_MAG); infoObj[i].CatalogMag = tsxod.ObjInfoPropOut; tsxod.Property(TheSky64Lib.Sk6ObjectInformationProperty.sk6ObjInfoProp_RA_2000); infoObj[i].CatalogRA = tsxod.ObjInfoPropOut; tsxod.Property(TheSky64Lib.Sk6ObjectInformationProperty.sk6ObjInfoProp_DEC_2000); infoObj[i].CatalogDec = tsxod.ObjInfoPropOut; if (infoObj[i].CatalogedName.Contains("Gaia")) { tsxod.Property(TheSky64Lib.Sk6ObjectInformationProperty.sk6ObjInfoProp_DB_FIELD_1); //FIlter G infoObj[i].CatalogMagG = Convert.ToDouble(tsxod.ObjInfoPropOut); tsxod.Property(TheSky64Lib.Sk6ObjectInformationProperty.sk6ObjInfoProp_DB_FIELD_2); //Filter PB infoObj[i].CatalogMagB = Convert.ToDouble(tsxod.ObjInfoPropOut); tsxod.Property(TheSky64Lib.Sk6ObjectInformationProperty.sk6ObjInfoProp_DB_FIELD_3); //Filter PR infoObj[i].CatalogMagR = Convert.ToDouble(tsxod.ObjInfoPropOut); } else if (infoObj[i].CatalogedName.Contains("APASS")) { tsxod.Property(TheSky64Lib.Sk6ObjectInformationProperty.sk6ObjInfoProp_STAR_MAGB); infoObj[i].CatalogMagB = tsxod.ObjInfoPropOut; tsxod.Property(TheSky64Lib.Sk6ObjectInformationProperty.sk6ObjInfoProp_STAR_MAGV); infoObj[i].CatalogMagV = tsxod.ObjInfoPropOut; tsxod.Property(TheSky64Lib.Sk6ObjectInformationProperty.sk6ObjInfoProp_STAR_MAGR); infoObj[i].CatalogMagR = tsxod.ObjInfoPropOut; tsxod.Property(TheSky64Lib.Sk6ObjectInformationProperty.sk6ObjInfoProp_DB_FIELD_4); char[] s = new char[] { ' ' }; infoObj[i].CatalogMagG = Convert.ToDouble(tsxod.ObjInfoPropOut.Split(s, StringSplitOptions.RemoveEmptyEntries)[0]); } } return(infoObj); }
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()); }