Changeset 20415
- Timestamp:
- Oct 27, 2008, 12:50:07 PM (18 years ago)
- Location:
- branches/cnb_branch_20081011/psModules/src/astrom
- Files:
-
- 3 edited
-
pmAstrometryObjects.c (modified) (6 diffs)
-
pmAstrometryVisual.c (modified) (10 diffs)
-
pmAstrometryVisual.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
branches/cnb_branch_20081011/psModules/src/astrom/pmAstrometryObjects.c
r20335 r20415 8 8 * @author EAM, IfA 9 9 * 10 * @version $Revision: 1.41.4. 1$ $Name: not supported by cvs2svn $11 * @date $Date: 2008-10-2 2 23:35:13$10 * @version $Revision: 1.41.4.2 $ $Name: not supported by cvs2svn $ 11 * @date $Date: 2008-10-27 22:50:07 $ 12 12 * 13 13 * Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii … … 120 120 i++; 121 121 } 122 123 122 return (matches); 124 123 } … … 659 658 } 660 659 661 pmAstromVisualPlotGridMatch (raw, ref,gridNP, stats->offset.x, stats->offset.y,662 maxOffpix, Scale, Offset);660 pmAstromVisualPlotGridMatch(raw, ref, gridNP, stats->offset.x, stats->offset.y, 661 maxOffpix, Scale, Offset); 663 662 664 663 psFree (imStats); … … 847 846 psVector *xHistNew = psVectorSmooth(NULL, xHist, tweakSmooth, tweakNsigma); 848 847 psVector *yHistNew = psVectorSmooth(NULL, yHist, tweakSmooth, tweakNsigma); 849 psFree(xHist);850 psFree(yHist);851 xHist = xHistNew;852 yHist = yHistNew;853 848 854 849 // select peak in x and in y … … 857 852 double yMax = 0; 858 853 for (int i = 0; i < nBin; i++) { 859 if (xHist ->data.F32[i] > xMax) {854 if (xHistNew->data.F32[i] > xMax) { 860 855 xBin = i; 861 xMax = xHist ->data.F32[i];862 } 863 if (yHist ->data.F32[i] > yMax) {856 xMax = xHistNew->data.F32[i]; 857 } 858 if (yHistNew->data.F32[i] > yMax) { 864 859 yBin = i; 865 yMax = yHist ->data.F32[i];860 yMax = yHistNew->data.F32[i]; 866 861 } 867 862 } … … 876 871 tweak->offset.y += yPeak; 877 872 873 pmAstromVisualPlotTweak (xHist, yHist, xHistNew, yHistNew, xBin, yBin); 874 878 875 psFree (rot); 879 876 psFree (xHist); 880 877 psFree (yHist); 878 psFree (xHistNew); 879 psFree (yHistNew); 881 880 882 881 return tweak; -
branches/cnb_branch_20081011/psModules/src/astrom/pmAstrometryVisual.c
r20336 r20415 1 /****************************************************/ 2 /* Diagnostic plots for pmAstrometry routines. */ 3 /****************************************************/ 4 1 /** Diagnostic plots called from within pmAstrometry routines. 2 * @author Chris Beaumont 3 * @date October 2008 4 */ 5 6 /* Include Files */ 5 7 #ifdef HAVE_CONFIG_H 6 8 #include <config.h> 7 9 #endif 8 10 9 /********************************************************************/10 /* INCLUDE FILES */11 /********************************************************************/12 11 #include <stdio.h> 13 12 #include <strings.h> … … 29 28 # define KAPAY 800 30 29 30 31 31 //variables to determine when things are plotted 32 32 static bool isVisual = false; 33 33 static bool plotGridMatch = false; 34 34 static bool plotTweak = true; 35 35 36 36 // variables to store plotting window indices … … 38 38 39 39 40 /******************************/ 41 /* Initialization Routines */ 42 /******************************/ 40 /* Utility Routine Prototypes */ 41 bool pmAstromVisualScaleGraphdata(Graphdata *graphdata, psVector *xVec, psVector *yVec, bool clip); 42 43 44 /* Initialization Routines */ 43 45 44 46 … … 50 52 51 53 52 /** open ,name, and resize a window if necessary */54 /** open name, and resize a window if necessary */ 53 55 bool pmAstromVisualInitWindow (int *kapid, char *name) { 54 56 if (*kapid == -1) { … … 66 68 67 69 /** ask the user how to proceed */ 68 bool pmAstromVisualAskUser( bool *plotflag ) { 70 bool pmAstromVisualAskUser(bool *plotflag) 71 { 69 72 char key[10]; 70 73 fprintf (stdout, "[c]ontinue? [s]kip the rest of these plots? [a]bort all visual plots?"); … … 83 86 84 87 /** destroy windows at the end of a run*/ 85 bool pmAstromVisualClose() { 88 bool pmAstromVisualClose() 89 { 86 90 if(kapa != -1) 87 91 KiiClose(kapa); … … 89 93 } 90 94 91 // // TEMPORARY - cant get psAstrometryObjects.h to link?? 92 // typedef struct 93 // { 94 // psPlane *pix; ///< the position in the pmReadout frame 95 // psPlane *cell; ///< the position in the pmCell frame 96 // psPlane *chip; ///< the position in the pmChip frame 97 // psPlane *FP; ///< the position in the pmFPA frame 98 // psPlane *TP; ///< the position in the tangent plane 99 // psSphere *sky; ///< the position on the Celestial Sphere. 100 // double Mag; ///< object magnitude XXX what filter? 101 // double dMag; ///< error on object magnitude 102 // } 103 // pmAstromObj; 104 105 /** plotting routines */ 106 107 /* 95 96 /* plotting routines */ 97 98 /** 108 99 * Plot the offset between every pair of reference and raw source locations. The peak of this 109 100 * distribution nominally gives the offset, scale difference, and rotation of the two catalogs. 110 * Overplots the location of this peak as determined by pmAstromGridAngle. 101 * Overplots the location of this peak as determined by pmAstromGridAngle, as well as some profiles 102 * along horizontal and vertical cuts through this peak. 111 103 */ 112 bool pmAstromVisualPlotGridMatch (const psArray *raw, const psArray *ref, 113 psImage *gridNP, float offsetX, float offsetY, 114 double maxOffpix, double Scale, double Offset) { 115 104 bool pmAstromVisualPlotGridMatch (const psArray *raw, ///< raw stars 105 const psArray *ref, ///< reference stars 106 psImage *gridNP, ///< a 2D histogram of raw-ref star distances 107 double offsetX, ///< The X location (FP coordinates) of the peak of gridNP 108 double offsetY, ///< the Y location (FP coordinates) of the peak of gridNP 109 double maxOffpix, ///< The half-width of gridNP in FP coordinates 110 double Scale, ///< The pixel size of gridNP in histogram-bin-coordinates 111 double Offset ///< The (x,y) location (histogram-bin coordinates) of the FP point (0,0) in gridNP 112 ) 113 { 114 //make sure we want to plot this 116 115 if (!isVisual || !plotGridMatch) return true; 117 116 if (!pmAstromVisualInitWindow(&kapa, "pmAstrom:plots")) 118 117 return false; 119 118 120 // vectors to hold dX and dY 121 int nplot = raw->n * ref->n; 122 float dXplot[nplot]; 123 float dYplot[nplot]; 124 125 pmAstromObj *ob1; 126 pmAstromObj *ob2; 119 KapaSection section = {"s1", 0.05, 0.05, .75, .75}; 120 KapaSection sectionY = {"s2", 0.8, 0.05, .15, .75}; 121 KapaSection sectionX = {"s3", .05, .8, .75, .15}; 122 123 Graphdata graphdata; 124 int nplot = raw->n * ref->n; // number of points to plot 125 float dXplot[nplot]; // x data points 126 float dYplot[nplot]; // y data points 127 pmAstromObj *ob1; pmAstromObj *ob2; // shortcuts to the data in raw and ref 128 psU32 **NP = gridNP->data.U32; // shortcut to the gridNP data 129 float vertHistSlice[gridNP->numRows]; // vertical histogram slice through peak 130 float horizHistSlice[gridNP->numCols]; // horizontal histogram slice through peak 131 float horizontalIndices[gridNP->numCols]; // the horizontal offset corresponding to each bin of horizHistSlice 132 float verticalIndices[gridNP->numRows]; // the vertical offset corresponding to each bin of vertHistSlice 133 int maxHorizontalSlice = 0; // peak value of horizHistSlice 134 int maxVerticalSlice = 0; // peak value of vertHistSlice 135 int peakXbin = (int) (offsetX / Scale + Offset); // X bin index of peak 136 int peakYbin = (int) (offsetY / Scale + Offset); // Y bin index of peak 137 138 139 // set up plot information 140 KapaClearPlots(kapa); 141 KapaInitGraph(&graphdata); 142 KapaSetSection(kapa, §ion); 143 144 graphdata.xmin = -1.0 * maxOffpix; 145 graphdata.xmax = 1.0 * maxOffpix; 146 graphdata.ymin = -1.0 * maxOffpix; 147 graphdata.ymax = 1.0 * maxOffpix; 148 KapaSetLimits(kapa, &graphdata); 149 150 KapaSetFont(kapa, "helvetica", 14); 151 KapaBox(kapa, &graphdata); 152 KapaSendLabel (kapa, "X offset (FP)", KAPA_LABEL_XM); 153 KapaSendLabel (kapa, "Y offset (FP)", KAPA_LABEL_YM); 154 KapaSendLabel (kapa, "pmAstromGridAngle residuals. Box: Correlation Peak.", 155 KAPA_LABEL_XP); 156 graphdata.style = 2; 157 graphdata.ptype = 0; 158 graphdata.size = 0.4; 159 graphdata.color = KapaColorByName ("black"); 160 161 // calculate the plot points 127 162 float dX, dY; 128 163 for (int i = 0; i < raw->n; i++) { 129 164 ob1 = (pmAstromObj *)raw->data[i]; 130 165 for (int j = 0; j < ref->n; j++) { 131 ob2 = (pmAstromObj *)r aw->data[j];166 ob2 = (pmAstromObj *)ref->data[j]; 132 167 dX = ob1->FP->x - ob2->FP->x; 133 168 dY = ob1->FP->y - ob2->FP->y; … … 137 172 } 138 173 139 #if 0 140 // vectors to hold the 1D histogram along horizontal and vertical slices 141 // passing through the peak. Note: Xbin(x pos) = (x pos) / Scale + Offset 142 psU32 **NP = gridNP->data.U32; 143 int vertHistSlice[gridNP->numRows]; 144 int horizHistSlice[gridNP->numCols]; 145 int peakXbin = (offsetX - Offset) * Scale; 146 int peakYbin = (offsetY - Offset) * Scale; 147 for (int i = 0; i < gridNP->numRows; i++) {} 148 # endif 149 150 // plot information 151 KapaSection section = {"s1", 0.00, 0.00, 1.0, 1.0}; 152 Graphdata graphdata; 153 KapaClearPlots(kapa); 154 KapaInitGraph(&graphdata); 155 KapaSetSection(kapa, §ion); 156 graphdata.xmin = offsetX - 1.5 * maxOffpix; 157 graphdata.xmax = offsetX + 1.5 * maxOffpix; 158 graphdata.ymin = offsetY - 1.5 * maxOffpix; 159 graphdata.ymax = offsetY + 1.5 * maxOffpix; 160 161 KapaSetLimits(kapa, &graphdata); 162 KapaSetFont(kapa, "helvetica", 14); 163 KapaBox(kapa, &graphdata); 164 KapaSendLabel (kapa, "X offset", KAPA_LABEL_XM); 165 KapaSendLabel (kapa, "Y offset", KAPA_LABEL_YM); 166 KapaSendLabel (kapa, "pmAstromGridAngle residuals. Big Box: Serach Region. Small Box: Correlation Peak.", 167 KAPA_LABEL_XP); 168 graphdata.style = 2; 169 graphdata.ptype = 0; 170 graphdata.size = 0.4; 171 graphdata.color = KapaColorByName ("black"); 174 // calculate the points for the profiles 175 for (int i = 0; i < gridNP->numRows; i++) { 176 vertHistSlice[i] = NP[i][peakXbin]; 177 verticalIndices[i] = (i - Offset) * Scale; 178 if (vertHistSlice[i] > maxVerticalSlice) { 179 maxVerticalSlice = vertHistSlice[i]; 180 } 181 } 182 for (int i = 0; i < gridNP->numCols; i++) { 183 horizHistSlice[i] = NP[peakYbin][i]; 184 horizontalIndices[i] = (i - Offset) * Scale; 185 if (horizHistSlice[i] > maxHorizontalSlice) { 186 maxHorizontalSlice = horizHistSlice[i]; 187 } 188 } 189 190 //Plot the offsets 172 191 KapaPrepPlot(kapa, nplot, &graphdata); 173 192 KapaPlotVector (kapa, nplot, dXplot, "x"); … … 193 212 KapaPlotVector (kapa, 5, ybin, "y"); 194 213 214 //plot X profile 215 KapaSetSection(kapa, §ionX); 216 graphdata.color = KapaColorByName("black"); 217 graphdata.ptype = 1; 218 graphdata.style = 1; 219 graphdata.ymin = 0; 220 graphdata.ymax = maxHorizontalSlice + 0.5; 221 KapaSetLimits(kapa, &graphdata); 222 223 KapaBox(kapa, &graphdata); 224 KapaPrepPlot(kapa, gridNP->numCols, &graphdata); 225 KapaPlotVector (kapa, gridNP->numCols, horizontalIndices, "x"); 226 KapaPlotVector (kapa, gridNP->numCols, horizHistSlice, "y"); 227 float xslice[2] = {offsetX - Scale / 2., offsetX - Scale / 2.}; 228 float yslice[2] = {-5, 100}; 229 graphdata.color = KapaColorByName("red"); 230 KapaPrepPlot(kapa, 2, &graphdata); 231 KapaPlotVector (kapa, 2, xslice, "x"); 232 KapaPlotVector (kapa, 2, yslice, "y"); 233 234 //plot Y profile 235 KapaSetSection(kapa, §ionY); 236 graphdata.color = KapaColorByName("black"); 237 graphdata.ptype = 1; 238 graphdata.style = 1; 239 graphdata.ymin = -maxOffpix; 240 graphdata.ymax = maxOffpix; 241 graphdata.xmin = -1.0 ; 242 graphdata.xmax = maxVerticalSlice + 0.5; 243 KapaSetLimits(kapa, &graphdata); 244 245 KapaBox(kapa, &graphdata); 246 KapaPrepPlot(kapa, gridNP->numRows, &graphdata); 247 KapaPlotVector (kapa, gridNP->numRows, vertHistSlice, "x"); 248 KapaPlotVector (kapa, gridNP->numRows, verticalIndices, "y"); 249 yslice[0] = yslice[1] = offsetY - Scale / 2.; 250 xslice[0] = -5; xslice[1] = 100; 251 graphdata.color = KapaColorByName("red"); 252 KapaPrepPlot(kapa, 2, &graphdata); 253 KapaPlotVector (kapa, 2, xslice, "x"); 254 KapaPlotVector (kapa, 2, yslice, "y"); 255 195 256 pmAstromVisualAskUser(&plotGridMatch); 196 257 return true; 197 } 258 } // end of pmAstromVisualPlotGridMatch 259 260 261 /** Plot the refinements that pmAstromGridTweak makes to the offset between raw and ref stars */ 262 bool pmAstromVisualPlotTweak (psVector *xHist, psVector *yHist, psVector *xHistNew, psVector *yHistNew, int xBin, int yBin) 263 { 264 //make sure we want to plot this 265 if (!isVisual || !plotTweak) return true; 266 if (!pmAstromVisualInitWindow(&kapa, "pmAstrom:plots")) { 267 return false; 268 } 269 270 Graphdata graphdata; 271 KapaSection section1 = {"s1", 0.05, 0.05, 0.90, 0.4}; 272 KapaSection section2 = {"s2", 0.05, 0.5, 0.90, 0.4}; 273 274 psVector *xIndices = psVectorAlloc (xHist->n, PS_TYPE_F32); 275 psVector *yIndices = psVectorAlloc (yHist->n, PS_TYPE_F32); 276 277 278 //populate the Indices vectors 279 for(int i = 0; i < xHist->n; i++) { 280 xIndices->data.F32[i] = i; 281 } 282 for(int i = 0; i < yHist->n; i++) { 283 yIndices->data.F32[i] = i; 284 } 285 286 // set up plot information 287 KapaClearPlots(kapa); 288 KapaInitGraph(&graphdata); 289 290 // plot the X histogram 291 pmAstromVisualScaleGraphdata(&graphdata, xIndices, xHistNew, false); 292 KapaSetSection(kapa, §ion1); 293 KapaSetLimits (kapa, &graphdata); 294 KapaSetFont(kapa, "helvetica", 14); 295 KapaBox(kapa, &graphdata); 296 KapaSendLabel (kapa, "X offset Bin", KAPA_LABEL_XM); 297 KapaSendLabel (kapa, "Number of Sources", KAPA_LABEL_YM); 298 KapaSendLabel (kapa, "Horizontal Profile", 299 KAPA_LABEL_XP); 300 graphdata.style = 2; 301 graphdata.ptype = 0; 302 graphdata.size = 0.4; 303 graphdata.color = KapaColorByName ("black"); 304 305 KapaPrepPlot (kapa, xHist->n, &graphdata); 306 KapaPlotVector (kapa, xHist->n, xIndices->data.F32, "x"); 307 KapaPlotVector (kapa, xHist->n, xHist->data.F32, "y"); 308 309 //overplot smoothed line 310 graphdata.style = 1; 311 graphdata.color = KapaColorByName ("red"); 312 KapaPrepPlot (kapa, xHist->n, &graphdata); 313 KapaPlotVector (kapa, xHist->n, xIndices->data.F32, "x"); 314 KapaPlotVector (kapa, xHist->n, xHistNew->data.F32, "y"); 315 316 //overplot the peak 317 float x[2] = {xBin, xBin}; 318 float y[2] = {-500, 500}; 319 graphdata.color = KapaColorByName ("black"); 320 KapaPrepPlot (kapa, 2, &graphdata); 321 KapaPlotVector (kapa, 2, x, "x"); 322 KapaPlotVector (kapa, 2, y, "y"); 323 324 //plot the Y histogram 325 pmAstromVisualScaleGraphdata(&graphdata, yIndices, yHistNew, false); 326 KapaSetSection(kapa, §ion2); 327 KapaSetLimits (kapa, &graphdata); 328 KapaSetFont(kapa, "helvetica", 14); 329 KapaBox(kapa, &graphdata); 330 KapaSendLabel (kapa, "X offset Bin", KAPA_LABEL_XM); 331 KapaSendLabel (kapa, "Number of Sources", KAPA_LABEL_YM); 332 KapaSendLabel (kapa, "Vertical Profile", 333 KAPA_LABEL_XP); 334 graphdata.style = 2; 335 graphdata.ptype = 0; 336 graphdata.size = 0.4; 337 graphdata.color = KapaColorByName ("black"); 338 339 KapaPrepPlot (kapa, yHist->n, &graphdata); 340 KapaPlotVector (kapa, yHist->n, yIndices->data.F32, "x"); 341 KapaPlotVector (kapa, yHist->n, yHist->data.F32, "y"); 342 343 //overplot smoothed line 344 graphdata.style = 1; 345 graphdata.color = KapaColorByName ("red"); 346 KapaPrepPlot (kapa, yHist->n, &graphdata); 347 KapaPlotVector (kapa, yHist->n, yIndices->data.F32, "x"); 348 KapaPlotVector (kapa, yHist->n, yHistNew->data.F32, "y"); 349 350 //overplot the peak 351 x[0] = x[1] = yBin; 352 graphdata.color = KapaColorByName ("black"); 353 KapaPrepPlot (kapa, 2, &graphdata); 354 KapaPlotVector (kapa, 2, x, "x"); 355 KapaPlotVector (kapa, 2, y, "y"); 356 357 //plot title 358 KapaSection section3 = {"s3", 0, 0, 1, 1}; 359 KapaSetSection( kapa, §ion3); 360 KapaSendLabel (kapa, "Tweaking the Astrometry Grid Solution. Smoothed profiles + peak location", 361 KAPA_LABEL_XP); 362 363 pmAstromVisualAskUser(&plotTweak); 364 365 psFree(xIndices); 366 psFree(yIndices); 367 return true; 368 } 369 370 371 /** psastroVisualScaleGraphdata 372 * Scale the graphdata structure based on x and y coordinates. Use sigma clipping to 373 * prevent outliers from making te plot region too big. 374 */ 375 bool pmAstromVisualScaleGraphdata(Graphdata *graphdata, psVector *xVec, psVector *yVec, bool clip) { 376 377 graphdata->xmin = +FLT_MAX; 378 graphdata->xmax = -FLT_MAX; 379 graphdata->ymin = +FLT_MAX; 380 graphdata->ymax = -FLT_MAX; 381 382 //determine standard deviation of xVec and yVec 383 psStats *statsX = psStatsAlloc(PS_STAT_SAMPLE_MEDIAN | PS_STAT_SAMPLE_STDEV); 384 psStats *statsY = psStatsAlloc(PS_STAT_SAMPLE_MEDIAN | PS_STAT_SAMPLE_STDEV); 385 psVectorStats (statsX, xVec, NULL, NULL, 0); 386 psVectorStats (statsY, yVec, NULL, NULL, 0); 387 388 float xhi = statsX->sampleMedian + 3 *statsX->sampleStdev; 389 float xlo = statsX->sampleMedian - 3 *statsX->sampleStdev; 390 float yhi = statsY->sampleMedian + 3 *statsY->sampleStdev; 391 float ylo = statsY->sampleMedian - 3 *statsY->sampleStdev; 392 393 // don't sigma clip 394 if (!clip) { 395 xhi = +FLT_MAX; 396 xlo = -FLT_MAX; 397 yhi = +FLT_MAX; 398 ylo = -FLT_MAX; 399 } 400 401 // abort if there is no good data 402 if (!isfinite(xhi) || !isfinite(xlo) || !isfinite(yhi) || !isfinite(ylo)) { 403 graphdata->xmin = -1; 404 graphdata->ymin = -1; 405 graphdata->xmax = 1; 406 graphdata->ymax = 1; 407 psFree(statsX); 408 psFree(statsY); 409 return false; 410 } 411 412 for(int i = 0; i < xVec->n; i++) { 413 if (!isfinite(xVec->data.F32[i])) continue; 414 if (xVec->data.F32[i] > xhi || xVec->data.F32[i] < xlo) continue; 415 graphdata->xmin = PS_MIN (graphdata->xmin, xVec->data.F32[i]); 416 graphdata->xmax = PS_MAX (graphdata->xmax, xVec->data.F32[i]); 417 } 418 419 for (int i = 0; i < yVec->n; i++) { 420 if (!isfinite(xVec->data.F32[i])) continue; 421 if (yVec->data.F32[i] > yhi || yVec->data.F32[i] < ylo) continue; 422 graphdata->ymin = PS_MIN (graphdata->ymin, yVec->data.F32[i]); 423 graphdata->ymax = PS_MAX (graphdata->ymax, yVec->data.F32[i]); 424 } 425 426 // add a whitespace border 427 float range = graphdata->xmax - graphdata->xmin; 428 if (range == 0) range = 1; 429 graphdata->xmin -= .05 * range; 430 graphdata->xmax += .05 * range; 431 432 range = graphdata->ymax - graphdata->ymin; 433 if (range == 0) range = 1; 434 graphdata->ymin -= .05 * range; 435 graphdata->ymax += .05 * range; 436 437 psFree (statsX); 438 psFree (statsY); 439 return true; 440 } 441 198 442 199 443 … … 204 448 bool pmAstromVisualAskUser (bool *plotflag) { return true; } 205 449 bool pmAstromVisualClose() { return true; } 206 bool pmAstromVisualPlotGridMatch (const psArray *raw, const psArray *ref, psImage *gridNP, float offsetX, floatoffsetY, double maxOffpix, double Scale, double Offset) { return true; }450 bool pmAstromVisualPlotGridMatch (const psArray *raw, const psArray *ref, psImage *gridNP, double offsetX, double offsetY, double maxOffpix, double Scale, double Offset) { return true; } 207 451 208 452 # endif -
branches/cnb_branch_20081011/psModules/src/astrom/pmAstrometryVisual.h
r20336 r20415 3 3 bool pmAstromVisualAskUser (bool *plotflag); 4 4 bool pmAstromVisualClose(); 5 bool pmAstromVisualPlotGridMatch (const psArray *raw, const psArray *ref, psImage *gridNP, float offsetX, float offsetY, double maxOffpix, double Scale, double Offset); 5 bool pmAstromVisualPlotGridMatch (const psArray *raw, const psArray *ref, psImage *gridNP, double offsetX, double offsetY, double maxOffpix, double Scale, double Offset); 6 bool pmAstromVisualPlotTweak (psVector *xHist, psVector *yHist, psVector *xHistNew, psVector *yHistNew, int xBin, int yBin);
Note:
See TracChangeset
for help on using the changeset viewer.
