Changeset 38986 for trunk/Ohana/src/opihi
- Timestamp:
- Oct 27, 2015, 4:49:06 PM (11 years ago)
- Location:
- trunk/Ohana
- Files:
-
- 18 edited
-
. (modified) (1 prop)
-
src/opihi/cmd.astro/fitplx.c (modified) (9 diffs)
-
src/opihi/cmd.basic/date.c (modified) (3 diffs)
-
src/opihi/cmd.data/box.c (modified) (3 diffs)
-
src/opihi/cmd.data/device.c (modified) (2 diffs)
-
src/opihi/cmd.data/read_vectors.c (modified) (1 diff)
-
src/opihi/cmd.data/uniq.c (modified) (2 diffs)
-
src/opihi/dvo/mextract.c (modified) (4 diffs)
-
src/opihi/lib.data/gaussian.c (modified) (2 diffs)
-
src/opihi/lib.shell/ConfigInit.c (modified) (1 diff)
-
src/opihi/lib.shell/SocketOps.c (modified) (2 diffs)
-
src/opihi/lib.shell/gprint.c (modified) (1 diff)
-
src/opihi/pantasks (modified) (1 prop)
-
src/opihi/pantasks/CheckJobs.c (modified) (4 diffs)
-
src/opihi/pantasks/CheckTasks.c (modified) (2 diffs)
-
src/opihi/pantasks/TaskOps.c (modified) (1 diff)
-
src/opihi/pantasks/pantasks_server.c.in (modified) (3 diffs)
-
src/opihi/pantasks/test/local.sh (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana
-
Property svn:mergeinfo
set to
/branches/eam_branches/ipp-20150625/Ohana merged eligible
-
Property svn:mergeinfo
set to
-
trunk/Ohana/src/opihi/cmd.astro/fitplx.c
r37807 r38986 7 7 8 8 typedef struct { 9 double *X; 10 double *Y; 11 double *t; 12 double *pX; 13 double *pY; 14 double *dX; 15 double *dY; 16 int *index; 17 int Npts; 18 } PlxFitData; 19 20 typedef struct { 9 21 double Ro, dRo; 10 22 double Do, dDo; … … 17 29 double chisq; 18 30 int Nfit; 31 int getChisq; 19 32 } PlxFit; 33 34 int VectorRobustStats (Vector *vector, double *median, double *sigma); 35 double VectorFractionInterpolate (double *values, float fraction, int Npts); 36 37 int PlxSetMeanEpoch (double *R, double *D, double *T, double *Rmean, double *Dmean, double *Tmean, int *mask, int Ntotal); 38 int PlxSetEpochPosition (PlxFitData *fitdata, double *R, double *D, double *dR, double *dD, double *T, int *mask, int Ntotal, Coords *coords, double Tmean); 39 int PlxOutlierClip (PlxFitData *fitdata, int *mask, int Noutlier, float dPsigMax, Vector *dPvec, int VERBOSE); 40 41 int PlxFitDataAlloc (PlxFitData *data, int N); 42 void PlxFitDataFree (PlxFitData *data); 43 int PlxBootstrapResample (PlxFitData *src, PlxFitData *tgt); 20 44 21 45 int FitPMandPar (PlxFit *fit, double *X, double *dX, double *Y, double *dY, double *T, double *pR, double *pD, int Npts, int VERBOSE); … … 47 71 } 48 72 73 int Noutlier = 0; 74 float dPsigMax = FLT_MAX; 75 if ((N = get_argument (argc, argv, "-outlier-tests"))) { 76 remove_argument (N, &argc, argv); 77 Noutlier = atoi(argv[N]); 78 remove_argument (N, &argc, argv); 79 dPsigMax = atof(argv[N]); 80 remove_argument (N, &argc, argv); 81 } 82 83 int Nresample = 0; 84 if ((N = get_argument (argc, argv, "-bootstrap-resample"))) { 85 remove_argument (N, &argc, argv); 86 Nresample = atoi(argv[N]); 87 remove_argument (N, &argc, argv); 88 } 89 90 Vector *dPvec = NULL; 91 if ((N = get_argument (argc, argv, "-dPsig"))) { 92 if (!Noutlier) { gprint (GP_ERR, "-dPsig requires -outlier-tests to be non-zero\n"); return FALSE; } 93 remove_argument (N, &argc, argv); 94 if (!(dPvec = SelectVector (argv[N], ANYVECTOR, TRUE))) return FALSE; 95 remove_argument (N, &argc, argv); 96 } 97 49 98 if (argc != 6) { 50 gprint (GP_ERR, "USAGE: fitplx (ra) (dR) (dec) (dD) (mjd) [-mask mask]\n"); 51 // what about the errors? 99 gprint (GP_ERR, "USAGE: fitplx (ra) (dR) (dec) (dD) (mjd) [-mask mask] [-v] [-vv]\n"); 100 gprint (GP_ERR, " -outlier-tests Nsamples dPsigMax : run Nsample bootstrap-resamples to define the path deviations and reject based on dPsigMax\n"); 101 gprint (GP_ERR, " -dPsig vec : save path deviations in vec\n"); 52 102 return (FALSE); 53 103 } … … 77 127 } 78 128 79 N = tvec->Nelements; // XXX check other lengths 80 81 // find mean values to remove 82 double Npts = 0; 83 double Tmean = 0; 84 double Rmean = 0; 85 double Dmean = 0; 86 double Tmin = +1000000; 87 double Tmax = -1000000; 88 for (i = 0; i < N; i++) { 89 if (mask && !mask[i]) continue; 90 Rmean += R[i]; 91 Dmean += D[i]; 92 Tmean += T[i]; 93 Tmin = MIN(Tmin, T[i]); 94 Tmax = MAX(Tmax, T[i]); 95 Npts += 1.0; 96 } 97 Rmean /= Npts; 98 Dmean /= Npts; 99 Tmean /= Npts; 100 101 float Trange = Tmax - Tmin; 102 // fprintf (stderr, "R,D : %f,%f, T: %f, Trange: %f, Tmin: %f, Tmax: %f\n", Rmean, Dmean, Tmean, Trange, Tmin, Tmax); 129 // Ntotal : all points supplied by user 130 // Nsubset : unmasked points 131 int Ntotal = tvec->Nelements; // XXX check other lengths 132 if (dPvec) ResetVector (dPvec, OPIHI_FLT, Ntotal); 133 134 double Rmean, Dmean, Tmean; 135 PlxSetMeanEpoch (R, D, T, &Rmean, &Dmean, &Tmean, mask, Ntotal); 103 136 104 137 /* project coordinates to a plane centered on the object with units of arcsec */ … … 109 142 coords.cdelt1 = coords.cdelt2 = 1.0 / 3600.0; 110 143 111 double *X, *Y, *t, *pX, *pY, *dX, *dY; 112 ALLOCATE (X, double, N); 113 ALLOCATE (Y, double, N); 114 ALLOCATE (dX, double, N); 115 ALLOCATE (dY, double, N); 116 ALLOCATE (t, double, N); 117 ALLOCATE (pX, double, N); 118 ALLOCATE (pY, double, N); 119 120 float pXmin = +2.0; 121 float pXmax = -2.0; 122 float pYmin = +2.0; 123 float pYmax = -2.0; 124 125 int n = 0; 126 for (i = 0; i < N; i++) { 127 if (mask && !mask[i]) continue; 128 RD_to_XY (&X[n], &Y[n], R[i], D[i], &coords); 129 dX[n] = dR[i]; 130 dY[n] = dD[i]; 131 t[n] = (T[i] - Tmean) / 365.25; 132 ParFactor (&pX[n], &pY[n], R[i], D[i], T[i]); 133 pXmin = MIN (pXmin, pX[n]); 134 pXmax = MAX (pXmax, pX[n]); 135 pYmin = MIN (pYmin, pY[n]); 136 pYmax = MAX (pYmax, pY[n]); 137 n++; 138 } 139 float dXRange = pXmax - pXmin; 140 float dYRange = pYmax - pYmin; 141 float parRange = hypot (dXRange, dYRange); 142 143 // fprintf (stderr, "par factor range: %f\n", parRange); 144 145 PlxFit fit; 146 if (!FitPMandPar (&fit, X, dX, Y, dY, t, pX, pY, n, VERBOSE)) { 144 PlxFitData fitdata; 145 PlxFitDataAlloc (&fitdata, Ntotal); 146 PlxSetEpochPosition (&fitdata, R, D, dR, dD, T, mask, Ntotal, &coords, Tmean); 147 148 PlxFit fit; memset (&fit, 0, sizeof(PlxFit)); 149 150 // determine dPsig for detections based on Noutlier attempts 151 if (Noutlier) { 152 int clipRetry = TRUE; 153 for (i = 0; clipRetry && (i < 3); i++) { 154 clipRetry = !PlxOutlierClip (&fitdata, mask, Noutlier, dPsigMax, dPvec, VERBOSE); 155 156 // using the new mask values, reset fitdata 157 PlxSetMeanEpoch (R, D, T, &Rmean, &Dmean, &Tmean, mask, Ntotal); 158 PlxSetEpochPosition (&fitdata, R, D, dR, dD, T, mask, Ntotal, &coords, Tmean); 159 if (VERBOSE) fprintf (stderr, "keep %d of %d\n", fitdata.Npts, Ntotal); 160 } 161 } 162 163 for (i = 0; (VERBOSE == 2) && (i < fitdata.Npts); i++) { 164 int n = fitdata.index[i]; 165 int maskValue = mask ? mask[n] : 0; 166 fprintf (stderr, "%f %f : %f %d : %f %f %f\n", R[n], D[n], T[n], maskValue, fitdata.t[i], fitdata.X[i], fitdata.Y[i]); 167 } 168 169 fit.getChisq = TRUE; 170 if (!FitPMandPar (&fit, 171 fitdata.X, fitdata.dX, 172 fitdata.Y, fitdata.dY, 173 fitdata.t, fitdata.pX, fitdata.pY, fitdata.Npts, VERBOSE)) { 147 174 return FALSE; 148 175 } 176 177 if (Nresample){ 178 PlxFitData sample; 179 PlxFitDataAlloc (&sample, fitdata.Npts); 180 181 PlxFit *testfit = NULL; 182 ALLOCATE (testfit, PlxFit, Nresample); 183 184 int Ngood = 0; 185 for (i = 0; i < Nresample; i++) { 186 PlxBootstrapResample (&fitdata, &sample); 187 188 if (i % 100000 == 99999) fprintf (stderr, "."); 189 190 // fit the sample 191 testfit[Ngood].getChisq = FALSE; 192 if (!FitPMandPar (&testfit[Ngood], 193 sample.X, sample.dX, 194 sample.Y, sample.dY, sample.t, 195 sample.pX, sample.pY, sample.Npts, VERBOSE)) continue; 196 Ngood ++; 197 } 198 199 Vector *pvec, *uRvec, *uDvec, *Rvec, *Dvec; 200 201 // save the Nresample histograms 202 if ((pvec = SelectVector ("plxVector", ANYVECTOR, TRUE)) == NULL) ESCAPE ("missing vector %s\n", "plxVector"); 203 if ((uRvec = SelectVector ("uRVector", ANYVECTOR, TRUE)) == NULL) ESCAPE ("missing vector %s\n", "uDVector"); 204 if ((uDvec = SelectVector ("uDVector", ANYVECTOR, TRUE)) == NULL) ESCAPE ("missing vector %s\n", "uRVector"); 205 if ((Rvec = SelectVector ("RoVector", ANYVECTOR, TRUE)) == NULL) ESCAPE ("missing vector %s\n", "RoVector"); 206 if ((Dvec = SelectVector ("DoVector", ANYVECTOR, TRUE)) == NULL) ESCAPE ("missing vector %s\n", "DoVector"); 207 208 ResetVector ( pvec, OPIHI_FLT, Ngood); 209 ResetVector (uRvec, OPIHI_FLT, Ngood); 210 ResetVector (uDvec, OPIHI_FLT, Ngood); 211 ResetVector ( Rvec, OPIHI_FLT, Ngood); 212 ResetVector ( Dvec, OPIHI_FLT, Ngood); 213 214 for (i = 0; i < Ngood; i++) { 215 pvec->elements.Flt[i] = testfit[i].p; 216 uRvec->elements.Flt[i] = testfit[i].uR; 217 uDvec->elements.Flt[i] = testfit[i].uD; 218 Rvec->elements.Flt[i] = testfit[i].Ro; 219 Dvec->elements.Flt[i] = testfit[i].Do; 220 } 221 222 // now calculate median and sigma for each vector 223 VectorRobustStats (pvec, &fit.p, &fit.dp); 224 VectorRobustStats (uRvec, &fit.uR, &fit.duR); 225 VectorRobustStats (uDvec, &fit.uD, &fit.duD); 226 VectorRobustStats (Rvec, &fit.Ro, &fit.dRo); 227 VectorRobustStats (Dvec, &fit.Do, &fit.dDo); 228 } 229 230 // fprintf (stderr, "%f +/- %f | %f %f\n", fit.p, fit.dp, fit.uR, fit.uD); 231 232 /* 233 FILE *f = fopen ("test.pf.dat", "w"); 234 for (i = 0; i < Ntotal; i++) { 235 double Xf = fit.Ro + fit.uR*fitdata.t[i] + fit.p*fitdata.pX[i]; 236 double Yf = fit.Do + fit.uD*fitdata.t[i] + fit.p*fitdata.pY[i]; 237 fprintf (f, "%f : %f %f : %f %f : %f : %f %f : %f %f\n", T[i], R[i], D[i], Xf, Yf, fitdata.t[i], fitdata.X[i], fitdata.Y[i], fitdata.pX[i], fitdata.pY[i]); 238 } 239 fclose (f); 240 */ 149 241 150 242 // fprintf (stderr, "Roff, Doff: %f, %f; dRo, dDo: %f, %f\n", fit.Ro, fit.Do, fit.dRo, fit.dDo); … … 152 244 XY_to_RD (&Rmean, &Dmean, fit.Ro, fit.Do, &coords); 153 245 if (VERBOSE) { 154 fprintf (stderr, "Ro, Do: %f, %f +/- %f, %f \n", Rmean, Dmean, fit.dRo, fit.dDo);246 fprintf (stderr, "Ro, Do: %f, %f +/- %f, %f (%f, %f)\n", Rmean, Dmean, fit.dRo, fit.dDo, fit.Ro, fit.Do); 155 247 fprintf (stderr, "uR, uD: %f, %f; duR, duD: %f, %f\n", fit.uR, fit.uD, fit.duR, fit.duD); 156 248 fprintf (stderr, "par: %f +/- %f\n", fit.p, fit.dp); … … 164 256 set_variable ("uR", fit.uR); 165 257 set_variable ("uD", fit.uD); 166 set_variable ("duR", fit.duR);167 set_variable ("duD", fit.duD);258 set_variable ("duR", fit.duR); 259 set_variable ("duD", fit.duD); 168 260 set_variable ("plx", fit.p); 169 261 set_variable ("dplx", fit.dp); 170 262 171 263 set_variable ("Tmean", Tmean); 172 set_variable ("Trange", Trange);173 set_variable ("Prange", parRange);174 264 175 265 set_variable ("chisq", fit.chisq); … … 293 383 fit[0].dp = sqrt(A[4][4]); 294 384 295 // add up the chi square for the fit 296 chisq = 0.0; 297 for (i = 0; i < Npts; i++) { 298 Xf = fit[0].Ro + fit[0].uR*T[i] + fit[0].p*pR[i]; 299 Yf = fit[0].Do + fit[0].uD*T[i] + fit[0].p*pD[i]; 300 wx = (fabs(dX[i]) < 0.0001) ? 1.0 : 1.0 / SQ(dX[i]); 301 wy = (fabs(dY[i]) < 0.0001) ? 1.0 : 1.0 / SQ(dY[i]); 302 chisq += SQ(X[i] - Xf) * wx; 303 chisq += SQ(Y[i] - Yf) * wy; 304 // if (VERBOSE) fprintf (stderr, "chisq contrib : %f %f : %f %f : %f %f : %f %f : %f\n", Xf, Yf, X[i] - Xf, Y[i] - Yf, dX[i], dY[i], (X[i] - Xf) / dX[i], (Y[i] - Yf) / dY[i], chisq); 305 } 385 // (optionally) add up the chi square for the fit 386 if (fit->getChisq) { 387 chisq = 0.0; 388 for (i = 0; i < Npts; i++) { 389 Xf = fit[0].Ro + fit[0].uR*T[i] + fit[0].p*pR[i]; 390 Yf = fit[0].Do + fit[0].uD*T[i] + fit[0].p*pD[i]; 391 wx = (fabs(dX[i]) < 0.0001) ? 1.0 : 1.0 / SQ(dX[i]); 392 wy = (fabs(dY[i]) < 0.0001) ? 1.0 : 1.0 / SQ(dY[i]); 393 chisq += SQ(X[i] - Xf) * wx; 394 chisq += SQ(Y[i] - Yf) * wy; 395 // if (VERBOSE) fprintf (stderr, "chisq contrib : %f %f : %f %f : %f %f : %f %f : %f\n", Xf, Yf, X[i] - Xf, Y[i] - Yf, dX[i], dY[i], (X[i] - Xf) / dX[i], (Y[i] - Yf) / dY[i], chisq); 396 } 397 // the reduced chisq is divided by (Ndof = 2*Npts - 5) 398 fit[0].chisq = chisq / (2.0*Npts - 5.0); 399 } 400 306 401 fit[0].Nfit = Npts; 307 308 // the reduced chisq is divided by (Ndof = 2*Npts - 5)309 fit[0].chisq = chisq / (2.0*Npts - 5.0);310 402 return (TRUE); 311 403 } … … 349 441 return TRUE; 350 442 } 443 444 // allocate arrays but not the container 445 int PlxFitDataAlloc (PlxFitData *data, int N) { 446 447 data->Npts = N; 448 ALLOCATE (data->X, double, N); 449 ALLOCATE (data->Y, double, N); 450 ALLOCATE (data->dX, double, N); 451 ALLOCATE (data->dY, double, N); 452 ALLOCATE (data->t, double, N); 453 ALLOCATE (data->pX, double, N); 454 ALLOCATE (data->pY, double, N); 455 ALLOCATE (data->index, int, N); 456 return TRUE; 457 } 458 459 void PlxFitDataFree (PlxFitData *data) { 460 FREE (data->X); 461 FREE (data->Y); 462 FREE (data->dX); 463 FREE (data->dY); 464 FREE (data->t); 465 FREE (data->pX); 466 FREE (data->pY); 467 FREE (data->index); 468 } 469 470 int PlxBootstrapResample (PlxFitData *src, PlxFitData *tgt) { 471 int i; 472 tgt->Npts = src->Npts; 473 for (i = 0; i < src->Npts; i++) { 474 int N = tgt->Npts * drand48(); 475 // int N = i; 476 tgt->X [i] = src->X [N]; 477 tgt->Y [i] = src->Y [N]; 478 tgt->dX[i] = src->dX[N]; 479 tgt->dY[i] = src->dY[N]; 480 tgt->t [i] = src->t [N]; 481 tgt->pX[i] = src->pX[N]; 482 tgt->pY[i] = src->pY[N]; 483 } 484 return TRUE; 485 } 486 487 int PlxSetMeanEpoch (double *R, double *D, double *T, double *Rmean, double *Dmean, double *Tmean, int *mask, int Ntotal) { 488 489 int i; 490 491 // find mean values to remove 492 double Nmean = 0; 493 *Tmean = 0; 494 *Rmean = 0; 495 *Dmean = 0; 496 double Tmin = +1000000; 497 double Tmax = -1000000; 498 for (i = 0; i < Ntotal; i++) { 499 if (mask && !mask[i]) continue; 500 *Rmean += R[i]; 501 *Dmean += D[i]; 502 *Tmean += T[i]; 503 Tmin = MIN(Tmin, T[i]); 504 Tmax = MAX(Tmax, T[i]); 505 Nmean += 1.0; 506 } 507 *Rmean /= Nmean; 508 *Dmean /= Nmean; 509 *Tmean /= Nmean; 510 511 double Trange = Tmax - Tmin; 512 513 // fprintf (stderr, "R,D : %f,%f, T: %f, Trange: %f, Tmin: %f, Tmax: %f\n", *Rmean, *Dmean, *Tmean, Trange, Tmin, Tmax); 514 515 set_variable ("Trange", Trange); 516 return TRUE; 517 } 518 519 // generate the fit values (projected X,Y; parallax factors; 520 int PlxSetEpochPosition (PlxFitData *fitdata, double *R, double *D, double *dR, double *dD, double *T, int *mask, int Ntotal, Coords *coords, double Tmean) { 521 522 int i; 523 524 float pXmin = +2.0; 525 float pXmax = -2.0; 526 float pYmin = +2.0; 527 float pYmax = -2.0; 528 529 int Nsubset = 0; 530 for (i = 0; i < Ntotal; i++) { 531 if (mask && !mask[i]) continue; 532 RD_to_XY (&fitdata->X[Nsubset], &fitdata->Y[Nsubset], R[i], D[i], coords); 533 fitdata->dX[Nsubset] = dR[i]; 534 fitdata->dY[Nsubset] = dD[i]; 535 fitdata->t[Nsubset] = (T[i] - Tmean) / 365.25; 536 ParFactor (&fitdata->pX[Nsubset], &fitdata->pY[Nsubset], R[i], D[i], T[i]); 537 pXmin = MIN (pXmin, fitdata->pX[Nsubset]); 538 pXmax = MAX (pXmax, fitdata->pX[Nsubset]); 539 pYmin = MIN (pYmin, fitdata->pY[Nsubset]); 540 pYmax = MAX (pYmax, fitdata->pY[Nsubset]); 541 fitdata->index[Nsubset] = i; 542 Nsubset++; 543 } 544 fitdata->Npts = Nsubset; 545 float dXRange = pXmax - pXmin; 546 float dYRange = pYmax - pYmin; 547 float parRange = hypot (dXRange, dYRange); 548 549 set_variable ("Prange", parRange); 550 // fprintf (stderr, "par factor range: %f\n", parRange); 551 552 return TRUE; 553 } 554 555 /* Outlier clipping based on bootstrap-resampling tests of the plx path 556 * generate Noutlier resampled datasets 557 * fit the Noutlier plx paths 558 * determine and save the distribution of dXsig and dYsig for each point 559 * sort the resulting distributions and find dPsig (median point) for each measurement 560 * find the 90% point of dPsig : if > dPsigMax, only clip the 10% most deviant points 561 * set the dPvec values if desired 562 * -- mask is modified, dPvec values are set 563 * -- fitdata is unchanged 564 */ 565 566 # define MAX_REJECT 0.1 567 568 int PlxOutlierClip (PlxFitData *fitdata, int *mask, int Noutlier, float dPsigMax, Vector *dPvec, int VERBOSE) { 569 570 int i, n; 571 572 PlxFit testfit; 573 testfit.getChisq = FALSE; 574 575 PlxFitData sample; 576 PlxFitDataAlloc (&sample, fitdata->Npts); 577 578 double **dXsig, **dYsig; 579 ALLOCATE (dXsig, double *, fitdata->Npts); 580 ALLOCATE (dYsig, double *, fitdata->Npts); 581 for (i = 0; i < fitdata->Npts; i++) { 582 ALLOCATE (dXsig[i], double, Noutlier); 583 ALLOCATE (dYsig[i], double, Noutlier); 584 } 585 586 int Nsamples = 0; 587 for (n = 0; n < Noutlier; n++) { 588 // bootstrap resample (fitdata -> sample) 589 PlxBootstrapResample (fitdata, &sample); 590 591 if (n % 100000 == 99999) fprintf (stderr, "."); 592 593 // fit the sample 594 if (!FitPMandPar (&testfit, 595 sample.X, sample.dX, 596 sample.Y, sample.dY, sample.t, 597 sample.pX, sample.pY, sample.Npts, VERBOSE)) continue; 598 599 // fprintf (stderr, "%f +/- %f | %f %f\n", testfit.p, testfit.dp, testfit.uR, testfit.uD); 600 601 // find the distances to the path 602 for (i = 0; i < fitdata->Npts; i++) { 603 double Xf = testfit.Ro + testfit.uR*fitdata->t[i] + testfit.p*fitdata->pX[i]; 604 double Yf = testfit.Do + testfit.uD*fitdata->t[i] + testfit.p*fitdata->pY[i]; 605 dXsig[i][Nsamples] = fabs(fitdata->X[i] - Xf) / fitdata->dX[i]; 606 dYsig[i][Nsamples] = fabs(fitdata->Y[i] - Yf) / fitdata->dY[i]; 607 // fprintf (stderr, "%f : %f %f : %f %f : %f %f : %f %f %f\n", T[i], Xf, Yf, fitdata->X[i], fitdata->Y[i], fitdata->dX[i], fitdata->dY[i], fitdata->t[i], fitdata->pX[i], fitdata->pY[i]); 608 } 609 Nsamples ++; 610 } 611 612 double *dPsig; 613 ALLOCATE (dPsig, double, fitdata->Npts); 614 615 for (i = 0; i < fitdata->Npts; i++) { 616 dsort (dXsig[i], Nsamples); 617 dsort (dYsig[i], Nsamples); 618 619 // choose the median values 620 double dXsigMedian, dYsigMedian; 621 if (Nsamples % 2) { 622 int Ncenter = Nsamples / 2; 623 dXsigMedian = dXsig[i][Ncenter]; 624 dYsigMedian = dYsig[i][Ncenter]; 625 } else { 626 int Ncenter = Nsamples / 2 - 1; 627 dXsigMedian = 0.5*(dXsig[i][Ncenter] + dXsig[i][Ncenter + 1]); 628 dYsigMedian = 0.5*(dYsig[i][Ncenter] + dYsig[i][Ncenter + 1]); 629 } 630 // XXX replace with hypotenuse? 631 dPsig[i] = 0.5*(dXsigMedian + dYsigMedian); 632 // fprintf (stderr, "%d %10.6f %10.6f %10.6f %f %f : %f\n", i, R[i], D[i], T[i], dXsig[i][Ncenter], dYsig[i][Ncenter], dPsig[i]); 633 } 634 635 // make a copy of dPsig[] and check if > 10% are > dPsigMax 636 double *dPsigSort; 637 ALLOCATE (dPsigSort, double, fitdata->Npts); 638 for (i = 0; i < fitdata->Npts; i++) { 639 dPsigSort[i] = dPsig[i]; 640 } 641 dsort (dPsigSort, fitdata->Npts); 642 int Nmax = (1.0 - MAX_REJECT)*fitdata->Npts; 643 644 int completeClip = TRUE; 645 if (dPsigSort[Nmax] > dPsigMax) { 646 if (VERBOSE) fprintf (stderr, "too many outliers: %f at 90\n", dPsigSort[Nmax]); 647 dPsigMax = dPsigSort[Nmax]; 648 completeClip = FALSE; 649 } 650 651 for (i = 0; i < fitdata->Npts; i++) { 652 if (dPsig[i] < dPsigMax) continue; 653 int n = fitdata->index[i]; 654 // fprintf (stderr, "clip %d: %f : %f\n", i, fitdata->t[i], dPsig[i]); 655 mask[n] = 0; // mask these points 656 } 657 658 // only set dPvec if we have completed the clipping? 659 if (dPvec) { 660 for (i = 0; i < dPvec->Nelements; i++) { 661 dPvec->elements.Flt[i] = NAN; 662 } 663 for (i = 0; i < fitdata->Npts; i++) { 664 int n = fitdata->index[i]; 665 dPvec->elements.Flt[n] = dPsig[i]; 666 } 667 } 668 669 free (dPsig); 670 free (dPsigSort); 671 672 for (i = 0; i < fitdata->Npts; i++) { 673 free (dXsig[i]); 674 free (dYsig[i]); 675 } 676 free (dXsig); 677 free (dYsig); 678 679 return completeClip; 680 } 681 682 int VectorRobustStats (Vector *vector, double *median, double *sigma) { 683 684 // warn if vector->Nelements > 1000? 10000?) 685 // warn if vector is not float 686 687 // we need to copy the vector to avoid changing the sort order 688 double *values = NULL; 689 ALLOCATE (values, double, vector->Nelements); 690 691 int i; 692 int Npts = 0; 693 for (i = 0; i < vector->Nelements; i++) { 694 if (!isfinite(vector->elements.Flt[i])) continue; 695 values[Npts] = vector->elements.Flt[i]; 696 Npts++; 697 } 698 699 dsort (values, Npts); 700 701 if (Npts % 2) { 702 int Ncenter = Npts / 2; 703 *median = values[Ncenter]; 704 } else { 705 int Ncenter = Npts / 2 - 1; 706 *median = 0.5*(values[Ncenter] + values[Ncenter + 1]); 707 } 708 709 double Slo = VectorFractionInterpolate (values, 0.158655, Npts); 710 double Shi = VectorFractionInterpolate (values, 0.841345, Npts); 711 712 *sigma = (Shi - Slo) / 2.0; 713 714 return TRUE; 715 } 716 717 double VectorFractionInterpolate (double *values, float fraction, int Npts) { 718 719 float F = fraction * Npts; 720 int N = fraction * Npts; 721 722 if (N < 0 ) return NAN; 723 if (N >= Npts - 2) return NAN; 724 725 // interpolate between N,N+1 726 727 double S = (F - N) * (values[N+1] - values[N]) + values[N]; 728 return S; 729 } -
trunk/Ohana/src/opihi/cmd.basic/date.c
r27435 r38986 3 3 int date (int argc, char **argv) { 4 4 5 int N, SECONDS, REFTIME; 5 int N, SECONDS; 6 double REFTIME; 6 7 struct timeval now; 7 8 char *tstring = NULL; … … 16 17 } 17 18 18 REFTIME = 0 ;19 REFTIME = 0.0; 19 20 if ((N = get_argument (argc, argv, "-reftime"))) { 20 21 remove_argument (N, &argc, argv); 21 REFTIME = ato i(argv[N]);22 REFTIME = atof (argv[N]); 22 23 remove_argument (N, &argc, argv); 23 24 } … … 37 38 gettimeofday (&now, NULL); 38 39 if (SECONDS) { 40 double nowSec = now.tv_sec + 1e-6*now.tv_usec; 39 41 if (varName) { 40 set_ int_variable (varName, now.tv_sec - REFTIME);42 set_variable (varName, nowSec - REFTIME); 41 43 } else { 42 gprint (GP_ERR, "% d\n", (int) now.tv_sec - REFTIME);44 gprint (GP_ERR, "%.12g\n", nowSec - REFTIME); 43 45 } 44 46 } else { -
trunk/Ohana/src/opihi/cmd.data/box.c
r34749 r38986 48 48 if (strlen (graphmode.ticks) != 4) { goto usage; } 49 49 for (i = 0; i < strlen (graphmode.ticks); i++) { 50 if ((graphmode.ticks[i] != '0') && (graphmode.ticks[i] != '1') && (graphmode.ticks[i] != '2') ) { goto usage; }50 if ((graphmode.ticks[i] != '0') && (graphmode.ticks[i] != '1') && (graphmode.ticks[i] != '2') && (graphmode.ticks[i] != '3')) { goto usage; } 51 51 } 52 52 } … … 139 139 remove_argument (N, &argc, argv); 140 140 graphmode.padYp = atof(argv[N]); 141 remove_argument (N, &argc, argv); 142 } 143 144 if ((N = get_argument (argc, argv, "-fminor"))) { 145 remove_argument (N, &argc, argv); 146 graphmode.fMinorXm = atof(argv[N]); 147 graphmode.fMinorXp = atof(argv[N]); 148 graphmode.fMinorYm = atof(argv[N]); 149 graphmode.fMinorYp = atof(argv[N]); 150 remove_argument (N, &argc, argv); 151 } 152 if ((N = get_argument (argc, argv, "-xfminor"))) { 153 remove_argument (N, &argc, argv); 154 graphmode.fMinorXm = atof(argv[N]); 155 remove_argument (N, &argc, argv); 156 } 157 if ((N = get_argument (argc, argv, "+xfminor"))) { 158 remove_argument (N, &argc, argv); 159 graphmode.fMinorXp = atof(argv[N]); 160 remove_argument (N, &argc, argv); 161 } 162 if ((N = get_argument (argc, argv, "-yfminor"))) { 163 remove_argument (N, &argc, argv); 164 graphmode.fMinorYm = atof(argv[N]); 165 remove_argument (N, &argc, argv); 166 } 167 if ((N = get_argument (argc, argv, "+yfminor"))) { 168 remove_argument (N, &argc, argv); 169 graphmode.fMinorYp = atof(argv[N]); 170 remove_argument (N, &argc, argv); 171 } 172 173 if ((N = get_argument (argc, argv, "-flabel"))) { 174 remove_argument (N, &argc, argv); 175 graphmode.fLabelRangeXm = atof(argv[N]); 176 graphmode.fLabelRangeXp = atof(argv[N]); 177 graphmode.fLabelRangeYm = atof(argv[N]); 178 graphmode.fLabelRangeYp = atof(argv[N]); 179 remove_argument (N, &argc, argv); 180 } 181 if ((N = get_argument (argc, argv, "-xflabel"))) { 182 remove_argument (N, &argc, argv); 183 graphmode.fLabelRangeXm = atof(argv[N]); 184 remove_argument (N, &argc, argv); 185 } 186 if ((N = get_argument (argc, argv, "+xflabel"))) { 187 remove_argument (N, &argc, argv); 188 graphmode.fLabelRangeXp = atof(argv[N]); 189 remove_argument (N, &argc, argv); 190 } 191 if ((N = get_argument (argc, argv, "-yflabel"))) { 192 remove_argument (N, &argc, argv); 193 graphmode.fLabelRangeYm = atof(argv[N]); 194 remove_argument (N, &argc, argv); 195 } 196 if ((N = get_argument (argc, argv, "+yflabel"))) { 197 remove_argument (N, &argc, argv); 198 graphmode.fLabelRangeYp = atof(argv[N]); 141 199 remove_argument (N, &argc, argv); 142 200 } … … 174 232 gprint (GP_ERR, " alternatively, set each axis independently with:\n"); 175 233 gprint (GP_ERR, " -xpad, -ypad, +xpad, +ypad\n"); 234 gprint (GP_ERR, " \n"); 235 gprint (GP_ERR, " -fminor : set the number of minor ticks per major (all axes)\n"); 236 gprint (GP_ERR, " alternatively, set each axis independently with:\n"); 237 gprint (GP_ERR, " -xfminor, -yfminor, +xfminor, +yfminor\n"); 238 gprint (GP_ERR, " \n"); 239 gprint (GP_ERR, " -flabel : set the fraction of axis over which major ticks have labels (all axes)\n"); 240 gprint (GP_ERR, " alternatively, set each axis independently with:\n"); 241 gprint (GP_ERR, " -xflabel, -yflabel, +xflabel, +yflabel\n"); 176 242 177 243 return (FALSE); -
trunk/Ohana/src/opihi/cmd.data/device.c
r14590 r38986 6 6 char *name;; 7 7 /* set / get current graphics device */ 8 9 int QUIET = FALSE; 10 if ((N = get_argument (argc, argv, "-q"))) { 11 remove_argument (N, &argc, argv); 12 QUIET = TRUE; 13 } 8 14 9 15 name = NULL; … … 23 29 if (!GetGraph (NULL, &kapa, name)) return (FALSE); 24 30 } 25 gprint (GP_ERR, "kapa %s\n", name);31 if (!QUIET) gprint (GP_ERR, "kapa %s\n", name); 26 32 27 33 return (TRUE); -
trunk/Ohana/src/opihi/cmd.data/read_vectors.c
r38553 r38986 511 511 if (!gfits_fread_ftable_data (f, &table, padIfShort)) ESCAPE ("error reading table for extension %d\n", Nextend); 512 512 } else { 513 if (!gfits_fread_ftable_range (f, padIfShort, &table, start, Nrows)) ESCAPE ("error reading table for extension %d\n", Nextend); 513 // arg3 (FALSE) : seek to this segment start 514 if (!gfits_fread_ftable_range (f, padIfShort, FALSE, &table, start, Nrows)) ESCAPE ("error reading table for extension %d\n", Nextend); 514 515 } 515 516 -
trunk/Ohana/src/opihi/cmd.data/uniq.c
r20936 r38986 1 1 # include "data.h" 2 // NOTE: if there are only a few uniq values, the old algorithm is not bad. 3 // for 10000 uniq values, 30M points take ~20sec in the new algorithm, 4 // 3M points takess 45 sec in the old method. 2 5 3 6 int uniq (int argc, char **argv) { 4 7 5 int Nnew, i, j, found;8 int Nnew, i, N; 6 9 Vector *ivec, *ovec; 7 10 11 Vector *cvec = NULL; 12 if ((N = get_argument (argc, argv, "-c"))) { 13 remove_argument (N, &argc, argv); 14 if ((cvec = SelectVector (argv[N], ANYVECTOR, TRUE)) == NULL) { 15 gprint (GP_ERR, "invalid vector %s\n", argv[N]); 16 return FALSE; 17 } 18 remove_argument (N, &argc, argv); 19 } 20 8 21 if (argc != 3) { 9 gprint (GP_ERR, "USAGE: uniq (in) (out) \n");22 gprint (GP_ERR, "USAGE: uniq (in) (out) -c count\n"); 10 23 return (FALSE); 11 24 } … … 16 29 /* allocate the maximum possible needed */ 17 30 ResetVector (ovec, ivec->type, ivec->Nelements); 31 if (cvec) { 32 ResetVector (cvec, OPIHI_INT, ivec->Nelements); 33 } 18 34 19 35 Nnew = 0; 20 36 21 37 if (ivec->type == OPIHI_FLT) { 22 opihi_flt *v1 = ivec[0].elements.Flt; 23 for (i = 0; i < ivec[0].Nelements; i++, v1++) { 24 opihi_flt *v2 = ovec[0].elements.Flt; 25 found = FALSE; 26 for (j = 0; !found && (j < Nnew); j++, v2++) { 27 if (*v1 == *v2) found = TRUE; 38 // copy the input data to a temporary array to avoid damaging it with sort 39 opihi_flt *indata = NULL; 40 ALLOCATE (indata, opihi_flt, ivec[0].Nelements); 41 memcpy (indata, ivec->elements.Flt, ivec[0].Nelements*sizeof(opihi_flt)); 42 43 dsort (indata, ivec->Nelements); 44 45 Nnew = 0; 46 opihi_flt *vtgt = ovec[0].elements.Flt; 47 48 opihi_flt *vsrc = indata; 49 50 for (i = 0; i < ivec->Nelements; Nnew++) { 51 vtgt[Nnew] = *vsrc; 52 int Ndup = 0; 53 opihi_flt lastValue = *vsrc; 54 while ((i < ivec->Nelements) && (*vsrc == lastValue)) { 55 i++; 56 vsrc ++; 57 Ndup ++; 28 58 } 29 if (!found) { 30 ovec[0].elements.Flt[Nnew] = *v1; 31 Nnew ++; 59 if (cvec) { 60 cvec->elements.Int[Nnew] = Ndup; 32 61 } 33 62 } 63 free (indata); 34 64 } else { 35 opihi_int *v1 = ivec[0].elements.Int; 36 for (i = 0; i < ivec[0].Nelements; i++, v1++) { 37 opihi_int *v2 = ovec[0].elements.Int; 38 found = FALSE; 39 for (j = 0; !found && (j < Nnew); j++, v2++) { 40 if (*v1 == *v2) found = TRUE; 65 // copy the input data to a temporary array to avoid damaging it with sort 66 opihi_int *indata = NULL; 67 ALLOCATE (indata, opihi_int, ivec[0].Nelements); 68 memcpy (indata, ivec->elements.Int, ivec[0].Nelements*sizeof(opihi_int)); 69 70 isort (indata, ivec->Nelements); 71 72 Nnew = 0; 73 opihi_int *vtgt = ovec[0].elements.Int; 74 75 opihi_int *vsrc = indata; 76 77 for (i = 0; i < ivec->Nelements; Nnew++) { 78 vtgt[Nnew] = *vsrc; 79 int Ndup = 0; 80 opihi_int lastValue = *vsrc; 81 while ((i < ivec->Nelements) && (*vsrc == lastValue)) { 82 i++; 83 vsrc ++; 84 Ndup ++; 41 85 } 42 if (!found) { 43 ovec[0].elements.Int[Nnew] = *v1; 44 Nnew ++; 86 if (cvec) { 87 cvec->elements.Int[Nnew] = Ndup; 45 88 } 46 89 } 90 free (indata); 47 91 } 48 92 49 93 // free up extra memory 50 94 ResetVector (ovec, ivec->type, Nnew); 95 if (cvec) ResetVector (cvec, OPIHI_INT, Nnew); 51 96 52 97 return (TRUE); -
trunk/Ohana/src/opihi/dvo/mextract.c
r38471 r38986 213 213 } 214 214 215 //int needLensing = dbFieldNeedLensing (fields, Nfields);215 int needLensing = dbFieldNeedLensing (fields, Nfields); 216 216 int needStarpar = dbFieldNeedStarpar (fields, Nfields, FALSE); 217 217 … … 234 234 catalog.filename = HOST_ID ? hostfile : skylist[0].filename[i]; 235 235 catalog.catflags = DVO_LOAD_AVERAGE | DVO_LOAD_MEASURE | DVO_LOAD_SECFILT; 236 //catalog.catflags |= needLensing ? DVO_LOAD_LENSING : DVO_SKIP_LENSING;236 catalog.catflags |= needLensing ? DVO_LOAD_LENSING : DVO_SKIP_LENSING; 237 237 catalog.catflags |= needStarpar ? DVO_LOAD_STARPAR : DVO_SKIP_STARPAR; 238 238 catalog.Nsecfilt = Nsecfilt; … … 274 274 StarPar *starpar = needStarpar ? &catalog.starpar[Nstarpar] : NULL; 275 275 276 // int Nlensing = average->lensobjOffset;277 // Lensobj *lensobj = needLensobj ? &catalog.lensobj[m] : NULL;276 int Nlensing = average->lensingOffset; 277 Lensing *lensing = needLensing ? &catalog.lensing[Nlensing] : NULL; 278 278 279 279 int Nsec = j*Nsecfilt; … … 281 281 282 282 for (n = 0; n < Nfields; n++) { 283 values[n] = dbExtractMeasures (average, secfilt, &catalog.measure[m], NULL, starpar, &fields[n]);283 values[n] = dbExtractMeasures (average, secfilt, &catalog.measure[m], lensing, starpar, &fields[n]); 284 284 } 285 285 // fprintf (stderr, "object: ave: %f, cat: %f, averef %d\n", fields[n].name, values[2], values[3], catalog.measure[m].averef); -
trunk/Ohana/src/opihi/lib.data/gaussian.c
r3894 r38986 20 20 21 21 int i; 22 long A, B;23 22 double val, x, dx, dx1, dx2, dx3, df; 24 23 double mean, sigma; … … 27 26 if (Ngaussint == Nbin) return; 28 27 29 A = time(NULL); 30 for (B = 0; A == time(NULL); B++); 31 srand48(B); 28 long A = time(NULL); 29 srand48(A); 32 30 33 31 Ngaussint = Nbin; -
trunk/Ohana/src/opihi/lib.shell/ConfigInit.c
r16900 r38986 38 38 } 39 39 40 // XXX this is a bit dangerous : answer may have an arbitrary 41 // length, but we do not know the available space in 'ptr' 42 // we really should be passing in the buffer size and limiting the copy 43 44 40 45 if (!strcmp (mode, "%s")) strcpy ((char *) ptr, answer); 41 46 if (!strcmp (mode, "%d")) *(int *) ptr = atoi (answer); -
trunk/Ohana/src/opihi/lib.shell/SocketOps.c
r32632 r38986 23 23 status = gethostname (myHostname, HOST_NAME_MAX); 24 24 25 fprintf (stderr, "target host: %s, real host: %s\n", hostname, myHostname); 25 if (strcmp (hostname, myHostname)) { 26 fprintf (stderr, "target host: %s, real host: %s\n", hostname, myHostname); 27 fprintf (stderr, "please run on the correct host\n"); 28 exit (2); 29 } 26 30 27 31 GetPortRange (&start, &stop, portinfo); … … 197 201 198 202 host = gethostbyname (hostname); 203 if (!host) { 204 gprint (GP_ERR, "cannot connect to pantasks server %s\n", hostname); 205 exit (3); 206 } 207 199 208 bzero (hostip, 80); 200 209 for (i = 0; i < host[0].h_length; i++) { -
trunk/Ohana/src/opihi/lib.shell/gprint.c
r27592 r38986 255 255 if (file == NULL) { 256 256 // XXX this is a problem: we are leaving open the old file 257 fprintf (stderr, " cannot open file %s\n", stream[0].name);257 fprintf (stderr, "gprint cannot open file %s\n", stream[0].name); 258 258 free (stream[0].name); 259 259 file = (dest == GP_LOG) ? stdout : stderr; -
trunk/Ohana/src/opihi/pantasks
-
Property svn:mergeinfo
set to
/branches/eam_branches/ipp-20150616/Ohana/src/opihi/pantasks merged eligible /branches/eam_branches/ipp-20150625/Ohana/src/opihi/pantasks merged eligible
-
Property svn:mergeinfo
set to
-
trunk/Ohana/src/opihi/pantasks/CheckJobs.c
r27614 r38986 1 1 # include "pantasks.h" 2 static int Ncheck = 0; 2 3 3 4 float CheckJobs () { … … 12 13 float time_running, next_timeout; 13 14 14 // int Ncheck; 15 // Ncheck = 0; 15 Ncheck ++; 16 16 17 17 // actual maximum delay is controlled in job_threads.c … … 21 21 /** test all jobs: ready to test? finished? **/ 22 22 while ((job = NextJob ()) != NULL) { 23 // Ncheck ++;24 23 25 24 task = job[0].task; … … 220 219 SetTaskTimer (&job[0].last); 221 220 } 222 // fprintf (stderr, "check %d jobs\n", Ncheck); 221 223 222 JobTaskUnlock(); 224 223 return (next_timeout); -
trunk/Ohana/src/opihi/pantasks/CheckTasks.c
r31666 r38986 1 1 # include "pantasks.h" 2 static int Ncheck = 0; 2 3 3 4 float CheckTasks () { … … 7 8 int status; 8 9 float time_running, next_timeout, fuzz; 10 11 Ncheck ++; 9 12 10 13 // actual maximum delay is controlled in job_threads.c -
trunk/Ohana/src/opihi/pantasks/TaskOps.c
r36623 r38986 22 22 void FreeTasks () { 23 23 int i; 24 for (i = 0; i < Ntasks; i++) { 24 int ntasks = Ntasks; 25 Ntasks = 0; 26 for (i = 0; i < ntasks; i++) { 25 27 FreeTask (tasks[i]); 26 28 } -
trunk/Ohana/src/opihi/pantasks/pantasks_server.c.in
r32632 r38986 19 19 20 20 char hostname[256], portinfo[256]; 21 char log_stdout[1024], log_stderr[1024] ;21 char log_stdout[1024], log_stderr[1024], tmpname[1024]; 22 22 pthread_t JobsAndTasksThread; 23 23 pthread_t clientsThread; … … 34 34 stdin = freopen ("/dev/zero", "r", stdin); 35 35 36 // this block redirects the actual stderr, stdout steams to the output files 37 if (VarConfig ("PANTASKS_SERVER_STDOUT", "%s", log_stdout) != NULL) { 36 // this block redirects the actual stderr, stdout streams to the output files 37 if (VarConfig ("PANTASKS_SERVER_STDOUT", "%s", tmpname) != NULL) { 38 strcpy (log_stdout, tmpname); 38 39 if (strcmp (log_stdout, "stdout")) { 39 40 stdout = freopen (log_stdout, "a", stdout); … … 44 45 } 45 46 } 46 if (VarConfig ("PANTASKS_SERVER_STDERR", "%s", log_stderr) != NULL) { 47 if (VarConfig ("PANTASKS_SERVER_STDERR", "%s", tmpname) != NULL) { 48 strcpy (log_stderr, tmpname); 47 49 if (strcmp (log_stderr, "stderr")) { 48 50 stderr = freopen (log_stderr, "a", stderr); -
trunk/Ohana/src/opihi/pantasks/test/local.sh
r10647 r38986 1 1 2 2 ## a basic test of memory allocation 3 if (not($?VERBOSE)) set VERBOSE = 0 3 4 4 5 exec rm -f tmp.txt … … 38 39 $startmem = $word:1 39 40 end 41 40 42 macro memcheck 41 43 list word -x "ps -p $PID -o rss"
Note:
See TracChangeset
for help on using the changeset viewer.
