Example #1
0
/**
 * Compute pooled histogram h from histogram.
 *
 * <p>Remark: In the moment, only for m_hmode = 1, 2 (histogram resampling needed !)</p>
 */
INT16 CGEN_PUBLIC CHistogram::Poole(CHistogram* h)
{
  if (h == NULL)
    return (NOT_EXEC);
  if (CheckHisto() != O_K)
    return (NOT_EXEC);

  if (m_hmode > 2)
    return IERROR(this,HIS_POOLE, 0,0,0);

  CHistogram_minmax_poole(m_minmax, h->m_minmax);

  /* MWX 2004-03-10: Replaced by CData_Aggregate -->
   data_aggrop (m_hist, h->m_hist,  NULL, 0, OP_SUM, 3, T_DOUBLE, 0);
   */
  CData_Aggregate_Int(h->m_hist, m_hist, NULL, CMPLX(0), OP_SUM);
  /* <-- */
  h->m_nhist = 1;
  h->m_bins = m_bins;
  h->m_hmode = m_hmode;
  h->m_hdim = m_hdim;
  h->m_calls = m_calls;
  h->m_count = 0;
  h->m_ssize = m_ssize;
  if (m_hmode == 1)
  {
    m_min = dfetch(m_minmax,0,0);
    m_max = dfetch(m_minmax,1,0);
  }

  return (O_K);
}
Example #2
0
/**
 * Copy histogram block i to histogram block j.
 *
 * Remark: If j < 0, block i is copied to all histogram blocks.
 *
 * @return O_K if ok, NOT_EXEC if not executed
 */
INT16 CGEN_PUBLIC CHistogram::CopyBlock(INT32 i, INT32 j)
{
  INT32 l, rl;

  if (CheckHisto() != O_K)
    return (NOT_EXEC);
  if (i < 0 || i >= m_nhist)
    return (NOT_EXEC);

  rl = BytesPerBlock();

  if (j < 0)
  {
    for (l = 0; l < m_nhist; l++)
      dl_memmove ( (char*)xaddr(m_hist,l*m_bins,0),
          (char*)xaddr(m_hist,i*m_bins,0), rl);
    return (O_K);
  }

  if (j > -1 && j < m_hdim)
  {
    dl_memmove ( (char*)xaddr(m_hist,j*m_bins,0),
        (char*)xaddr(m_hist,i*m_bins,0), rl);
    return (O_K);
  }

  return (NOT_EXEC);
}
Example #3
0
/**
 * Check consistency between histogram and minmax data.
 */
INT16 CGEN_PROTECTED CHistogram::CheckConsist()
{
  INT16 ierr, mode;
  INT32 nhist;

  mode = HIS_MODE;
  nhist = data_nblock(m_hist);

  mode = CheckMinmax();
  if (mode == -1)
    return (NOT_EXEC);

  if ((ierr = CheckHisto()) != O_K)
    return (ierr);

  switch (mode)
  {
  case 1:
    if (data_nrec(m_minmax) != 2 || data_dim (m_minmax) != 1)
      return IERROR(this,HIS_INCONS,0,0,0);
    break;

  case 2:
    if (data_nrec(m_minmax) != 2)
      return IERROR(this,HIS_INCONS,0,0,0);
    if (data_dim(m_minmax) != data_dim(m_hist))
      return IERROR(this,HIS_INCONS,0,0,0);
    break;

  case 3:
    if (data_nrec(m_minmax) < 2 * nhist)
      return IERROR(this,HIS_INCONS,0,0,0);
    if (data_dim(m_minmax) != data_dim(m_hist))
      return IERROR(this,HIS_INCONS,0,0,0);
    break;

  default:
    return IERROR(this,HIS_INCONS,0,0,0);
  }

  return (O_K);
}
Example #4
0
/**
 * Select histogram block i, store to ihist.
 *
 * @param ihist histogram i
 * @param  i    histogram block index
 * @param  j    histogram component index (select only a component);
 *              -1 to select complete block
 * @return O_K if ok, NOT_EXEC if not executed
 */
INT16 CGEN_PUBLIC CHistogram::SelectBlock(CData* ihist, INT32 i, INT32 j)
{
  INT32 l, rl;

  if (CheckHisto() != O_K)
    return (NOT_EXEC);
  if (ihist == NULL)
    return (NOT_EXEC);
  if (i < 0 || i >= m_nhist)
    return (NOT_EXEC);

  rl = BytesPerBlock();

  data_reset (ihist);
  if (j < 0)
  {
    data_scopy (m_hist, ihist);
    data_arr_alloc (ihist,m_bins);
    copy_data_descr (m_hist, ihist);
    set_data_nblock (ihist, 1);
    dl_memmove ( (char*)data_ptr(ihist),
        (char*)xaddr(m_hist,i*m_bins,0), rl);
    return (O_K);
  }

  if (j > -1 && j < data_dim(m_hist))
  {
    comp_mdef (ihist,1,T_DOUBLE);
    data_arr_alloc (ihist,m_bins);
    copy_comp_text (m_hist, j, ihist, 0, 1);
    copy_data_descr(m_hist, ihist);
    set_data_nblock (ihist, 1);
    for (l = 0; l < m_bins; l++)
      dstore (dfetch(m_hist,i*m_bins+l,j), ihist,l,0);
    return (O_K);
  }

  return (NOT_EXEC);
}
Example #5
0
/**
 * Reorganize histogram.
 *
 * <p>Remarks</p>
 * <ul>
 *   <li>If (exist == NULL), the number of histogram blocks is set to nind,
 *       by adding empty blocks or removing blocks from the end.</li>
 *   <li>If (exist != NULL), histogram blocks may selected as follows:
 *       exist(i,0) == 0: block i is deleted;
 *       exist(i,0) >  0: block i is preserved</li>
 *   <li> Only preserved blocks will be available after reorganization! The
 *        index correspondence may be changed by this operation!nind is not used
 *        in this case.</li>
 * </ul>
 *
 * @param exist  -  index existing flag sequence (may be NULL)
 * @param nind   -  index number
 * @return O_K if ok, NOT_EXEC if not executed
 */
INT16 CGEN_PUBLIC CHistogram::ReorgEx(CData* exist, INT32 nind)
  {
  INT32 n, ifree, i, imax, rl;
  CData* h;

  if (CheckHisto() != O_K)
    return (NOT_EXEC);

  /* --- change only histogram number */
  if (exist == NULL)
  {
    if (nind > 0 && nind != data_nblock(m_hist))
    {
      data_realloc (m_hist, nind * m_bins);
      set_data_nblock(m_hist, nind);
      set_data_nrec (m_hist, nind * m_bins);
      return (O_K);
    } else
      return (NOT_EXEC);
  }

  /* --- reorganize according to exist */
  if (exist != NULL)
  {
    imax = data_nrec(exist);

    n = 0;
    for (i = 0; i < imax; i++)
    {
      if (dfetch (exist,i,0) > 0.0)
        n++;
    }

    if (n == imax)
      return (O_K);

    h = data_create("h");
    data_copy (m_hist,h);

    rl = BytesPerBlock();
    data_realloc (m_hist, n * m_bins);

    ifree = 0;

    for (i = 0; i < imax; i++)
    {
      if (dfetch (exist,i,0) > 0.0)
      {
        dl_memmove ( xaddr(m_hist,ifree,0),xaddr(h,i*m_bins,0), rl);
        ifree += m_bins;
      }
    }

    if (m_hmode == 3)
    {
      data_copy (m_hist,h);
      rl = 2 * data_reclen(m_minmax);
      data_realloc (m_minmax, n * 2);

      ifree = 0;

      for (i = 0; i < imax; i++)
      {
        if (dfetch (exist,i,0) > 0.0)
        {
          dl_memmove ( xaddr(m_minmax,ifree,0),xaddr(h,2*i,0), rl);
          ifree += 2;
        }
      }
    }

    data_destroy(h);

    set_data_nblock(m_hist, n);
    return (O_K);
  }

  return (O_K);
}