IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Nov 12, 2025, 5:00:47 PM (8 months ago)
Author:
eugene
Message:

fixes to cgrid for inverted regions; add features tdhistogram and region; free memory on exit

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/opihi/cmd.data/tdhistogram.c

    r41891 r42942  
    55int tdhistogram (int argc, char **argv) {
    66
    7   int i, Nx, Ny, Nz, N;
     7  int i, N;
    88  float *val;
    99  Buffer *bf;
    1010  Vector *vx, *vy, *vz, *range;
    1111  opihi_flt *x, *y, *z;
     12  int kapa;
     13  Graphdata graphmode;
     14
     15  int useGraph = FALSE;
     16  if ((N = get_argument (argc, argv, "-graph"))) {
     17    remove_argument (N, &argc, argv);
     18    useGraph = TRUE;
     19    if (!style_args (&graphmode, &argc, argv, &kapa)) return FALSE;
     20  }
    1221
    1322  int reuse = FALSE;
    1423  if ((N = get_argument (argc, argv, "-reuse"))) {
     24    if (useGraph) { gprint (GP_ERR, "-reuse and -graph are incompatible\n"); return FALSE; }
    1525    remove_argument (N, &argc, argv);
    1626    reuse = TRUE;
     27  }
     28
     29  int Nx = 100;
     30  double dx = NAN;
     31  if ((N = get_argument (argc, argv, "-dx"))) {
     32    if (useGraph) { gprint (GP_ERR, "-dx and -graph are incompatible\n"); return FALSE; }
     33    remove_argument (N, &argc, argv);
     34    dx = atof(argv[N]);
     35    remove_argument (N, &argc, argv);
     36  }
     37  if ((N = get_argument (argc, argv, "-Nx"))) {
     38    if (useGraph) { gprint (GP_ERR, "-Nx and -graph are incompatible\n"); return FALSE; }
     39    if (isfinite(dx)) { gprint (GP_ERR, "-Nx and -dx are incompatible\n"); return FALSE; }
     40    remove_argument (N, &argc, argv);
     41    Nx = atoi(argv[N]);
     42    remove_argument (N, &argc, argv);
     43  }
     44
     45  int Ny = 100;
     46  double dy = NAN;
     47  if ((N = get_argument (argc, argv, "-dy"))) {
     48    if (useGraph) { gprint (GP_ERR, "-dx and -graph are incompatible\n"); return FALSE; }
     49    remove_argument (N, &argc, argv);
     50    dy = atof(argv[N]);
     51    remove_argument (N, &argc, argv);
     52  }
     53  if ((N = get_argument (argc, argv, "-Ny"))) {
     54    if (useGraph) { gprint (GP_ERR, "-Ny and -graph are incompatible\n"); return FALSE; }
     55    if (isfinite(dy)) { gprint (GP_ERR, "-Ny and -dy are incompatible\n"); return FALSE; }
     56    remove_argument (N, &argc, argv);
     57    Ny = atoi(argv[N]);
     58    remove_argument (N, &argc, argv);
     59  }
     60
     61  int Nz = 100;
     62  double dz = NAN;
     63  if ((N = get_argument (argc, argv, "-dz"))) {
     64    remove_argument (N, &argc, argv);
     65    dz = atof(argv[N]);
     66    remove_argument (N, &argc, argv);
     67  }
     68  if ((N = get_argument (argc, argv, "-Nz"))) {
     69    if (useGraph) { gprint (GP_ERR, "-Nz and -graph are incompatible\n"); return FALSE; }
     70    if (isfinite(dz)) { gprint (GP_ERR, "-Nz and -dz are incompatible\n"); return FALSE; }
     71    remove_argument (N, &argc, argv);
     72    Nz = atoi(argv[N]);
     73    remove_argument (N, &argc, argv);
     74  }
     75
     76  int binning = 1;
     77  if ((N = get_argument (argc, argv, "-binning"))) {
     78    if (!useGraph) { gprint (GP_ERR, "-binning requires -graph\n"); return FALSE; }
     79    remove_argument (N, &argc, argv);
     80    binning = atoi(argv[N]);
     81    remove_argument (N, &argc, argv);
    1782  }
    1883
     
    2489  }
    2590
    26   double dx = NAN;
    27   if ((N = get_argument (argc, argv, "-dx"))) {
    28     remove_argument (N, &argc, argv);
    29     dx = atof(argv[N]);
    30     remove_argument (N, &argc, argv);
    31   }
    32   double dy = NAN;
    33   if ((N = get_argument (argc, argv, "-dy"))) {
    34     remove_argument (N, &argc, argv);
    35     dy = atof(argv[N]);
    36     remove_argument (N, &argc, argv);
    37   }
    38   double dz = NAN;
    39   if ((N = get_argument (argc, argv, "-dz"))) {
    40     remove_argument (N, &argc, argv);
    41     dz = atof(argv[N]);
    42     remove_argument (N, &argc, argv);
    43   }
    44 
    45   int valid = (!reuse && (argc == 11)) || (reuse && (argc == 5));
     91  int valid = (reuse && (argc == 5)) || (useGraph && (argc == 7)) || (argc == 11);
    4692  if (!valid) {
    4793    gprint (GP_ERR, "USAGE: tdhistogram buffer x y z (Xmin) (Xmax) (Ymin) (Ymax) (Zmin) (Zmax) [-dx dx] [-dy dy] [-dz dz] [-range range]\n");
     94    gprint (GP_ERR, "USAGE: tdhistogram buffer x y z (Zmin) (Zmax) -graph [-binning N] [-dz dz] [-range range]\n");
    4895    gprint (GP_ERR, "   OR: tdhistogram buffer x y z -reuse\n");
    4996    gprint (GP_ERR, "   -dx, -dy, -dy specify the bin size in these directions\n");
    5097    gprint (GP_ERR, "   -range : generate an output vector corresponding to the elements in the z-direction\n");
     98    gprint (GP_ERR, "   -graph : use X,Y range from active graph\n");
     99    gprint (GP_ERR, "   -binning N : use binning to define bin sizes relative to graph\n");
    51100    gprint (GP_ERR, " output buffer is 3D\n");
    52101    return (FALSE);
     
    63112  double Xmin, Xmax, Ymin, Ymax, Zmin, Zmax;
    64113
    65   if (!reuse) {
    66     Xmin = atof(argv[5]);
    67     Xmax = atof(argv[6]);
    68     if (!isfinite(dx)) {
    69       Nx = 100;
    70       dx = (Xmax - Xmin) / (Nx - 1);
    71     } else {
    72       Nx = (Xmax - Xmin) / dx + 1;
    73     }
    74     if (dx < 0) {
    75       gprint (GP_ERR, "invalid value for delta: %f\n", dx);
    76       return (FALSE);
    77     }
    78     Ymin = atof(argv[7]);
    79     Ymax = atof(argv[8]);
    80     if (!isfinite(dy)) {
    81       Ny = 100;
    82       dy = (Ymax - Ymin) / (Ny - 1);
    83     } else {
    84       Ny = (Ymax - Ymin) / dy + 1;
    85     }
    86     if (dy < 0) {
    87       gprint (GP_ERR, "invalid value for delta: %f\n", dy);
    88       return (FALSE);
    89     }
    90     Zmin = atof(argv[9]);
    91     Zmax = atof(argv[10]);
    92     if (!isfinite(dz)) {
    93       Nz = 100;
    94       dz = (Zmax - Zmin) / (Nz - 1);
    95     } else {
    96       Nz = (Zmax - Zmin) / dz + 1;
    97     }
    98     if (dz < 0) {
    99       gprint (GP_ERR, "invalid value for delta: %f\n", dz);
    100       return (FALSE);
    101     }
    102 
    103     if (Nz > 1000) {
    104       gprint (GP_ERR, "warning: delta of %f will result in %d histogram bins\n", dz, Nz);
    105       return (FALSE);
    106     }
    107   } else {
     114  if (reuse) {
    108115    gfits_scan (&bf[0].header, "XMIN", "%lf", 1, &Xmin);
    109116    gfits_scan (&bf[0].header, "XMAX", "%lf", 1, &Xmax);
     
    118125    Ny = bf[0].header.Naxis[1];
    119126    Nz = bf[0].header.Naxis[2];
    120   }
    121 
     127    goto got_range;
     128  }
     129
     130  if (useGraph) {
     131    int Xpix, Ypix;
     132    KapaGetImageRange (kapa, &Xmin, &Xmax, &Ymax, &Ymin, &Xpix, &Ypix);
     133    Xmax = graphmode.xmax;
     134    Xmin = graphmode.xmin;
     135    Ymax = graphmode.ymax;
     136    Ymin = graphmode.ymin;
     137
     138    // (dX, dY) are the pixel scale of the output image (output pixels / input pixels)
     139
     140    dx = binning * (Xmax - Xmin) / (Xpix - 1);
     141    dy = binning * (Ymax - Ymin) / (Ypix - 1);
     142
     143    Nx = abs((Xmax - Xmin) / dx) + 1;
     144    Ny = abs((Ymax - Ymin) / dy) + 1;
     145 
     146    // XXX : note that Zmin and Zmax have a different argv location in useGraph
     147    Zmin = atof(argv[5]);
     148    Zmax = atof(argv[6]);
     149
     150    goto set_Zvalues;
     151  }
     152
     153  // This section is only used if !reuse and !useGraph
     154  Xmin = atof(argv[5]);
     155  Xmax = atof(argv[6]);
     156  if (!isfinite(dx)) {
     157    dx = (Xmax - Xmin) / (Nx - 1);
     158  } else {
     159    Nx = (Xmax - Xmin) / dx + 1;
     160  }
     161  if (dx < 0) {
     162    gprint (GP_ERR, "invalid value for delta: %f\n", dx);
     163    return (FALSE);
     164  }
     165  Ymin = atof(argv[7]);
     166  Ymax = atof(argv[8]);
     167  if (!isfinite(dy)) {
     168    dy = (Ymax - Ymin) / (Ny - 1);
     169  } else {
     170    Ny = (Ymax - Ymin) / dy + 1;
     171  }
     172  if (dy < 0) {
     173    gprint (GP_ERR, "invalid value for delta: %f\n", dy);
     174    return (FALSE);
     175  }
     176  // XXX : note that Zmin and Zmax have a different argv location in useGraph
     177  Zmin = atof(argv[9]);
     178  Zmax = atof(argv[10]);
     179
     180set_Zvalues:
     181  if (!isfinite(dz)) {
     182    dz = (Zmax - Zmin) / (Nz - 1);
     183  } else {
     184    Nz = (Zmax - Zmin) / dz + 1;
     185  }
     186  if (dz < 0) {
     187    gprint (GP_ERR, "invalid value for delta: %f\n", dz);
     188    return (FALSE);
     189  }
     190  if (Nz > 1000) {
     191    gprint (GP_ERR, "warning: delta of %f will result in %d histogram bins\n", dz, Nz);
     192    return (FALSE);
     193  }
     194
     195got_range:
    122196  REQUIRE_VECTOR_FLT (vx, FALSE);
    123197  REQUIRE_VECTOR_FLT (vy, FALSE);
Note: See TracChangeset for help on using the changeset viewer.