Exemple #1
0
// CurveFit::ParametersHaveProblems()
bool CurveFit::ParametersHaveProblems(Darray const& Xvals_, Darray const& Yvals_,
                                      Darray const& ParamsIn)
{
  if (ParamsIn.empty() || Xvals_.empty() || Yvals_.empty()) {
    errorMessage_ = "Parameters or coordinates are empty.";
    return true;
  }
  if (Xvals_.size() != Yvals_.size()) {
    errorMessage_ = "Number of X values != number of Y values.";
    return true;
  }
  if ( Xvals_.size() < ParamsIn.size() ) {
    errorMessage_ = "Number of parameters cannot be greater than number of XY values.";
    return true;
  }
  if (hasBounds_.empty())
    hasBounds_.assign(ParamsIn.size(), false);
  else {
    if (hasBounds_.size() != ParamsIn.size() ||
        Ubound_.size() != ParamsIn.size() ||
        Lbound_.size() != ParamsIn.size())
    {
      errorMessage_ = "Number of bounds does not match number of parameters.";
      return true;
    }
    for (dsize in = 0; in != ParamsIn.size(); in++) {
      if (hasBounds_[in]) {
        if ( Lbound_[in] >= Ubound_[in] ) {
          errorMessage_ = "Lower bound must be less than upper bound.";
          return true;
        }
        if (ParamsIn[in] <= Lbound_[in] ||
            ParamsIn[in] >= Ubound_[in])
        {
          errorMessage_ = "Initial parameter not within bounds.";
          return true;
        }
      }
    }
  }
  if (!Weights_.empty() && Weights_.size() != Xvals_.size()) {
    errorMessage_ = "Number of weights does not match number of XY values.";
    return true;
  }
  errorMessage_ = 0;
  return false;
}
Exemple #2
0
// Analysis_TI::Calc_Increment()
int Analysis_TI::Calc_Increment() {
  // Determine max points if not given.
  int maxpts = avg_max_;
  if (maxpts == -1) {
    for (unsigned int idx = 0; idx != input_dsets_.size(); idx++) {
      DataSet_1D const& ds = static_cast<DataSet_1D const&>( *(input_dsets_[idx]) );
      if (maxpts == -1)
        maxpts = (int)ds.Size();
      else if (maxpts != (int)ds.Size()) {
        mprintf("Warning: # points in '%s' (%zu) is different than %i.\n",
                ds.legend(), ds.Size(), maxpts);
        maxpts = std::min( maxpts, (int)ds.Size() );
        mprintf("Warning:   Will only use %i points.\n", maxpts);
      }
    }
  }
  if (maxpts < 1) {
    mprinterr("Error: Max points to use is < 1.\n");
    return 1;
  }
  if (avg_skip_ >= maxpts) {
    mprinterr("Error: 'avgskip' (%i) > max (%i).\n", avg_skip_, maxpts);
    return 1;
  }
  // sum: Hold the results of integration for each curve (increment)
  Darray sum;
  // points: Hold point values at which each avg is being calculated
  Iarray points;
  // Loop over input data sets. 
  for (unsigned int idx = 0; idx != input_dsets_.size(); idx++) {
    DataSet_1D const& ds = static_cast<DataSet_1D const&>( *(input_dsets_[idx]) );
    if (CheckSet(ds)) return 1; 
    // Calculate averages for each increment
    Darray avg;
    Iarray increments;
    int count = 0;
    int endpt = maxpts -1;
    double currentSum = 0.0;
    if (debug_ > 0) mprintf("DEBUG: Lambda %g\n", xval_[idx]);
    for (int pt = avg_skip_; pt != maxpts; pt++)
    {
      currentSum += ds.Dval(pt);
      count++;
      if (count == avg_increment_ || pt == endpt) {
        avg.push_back( currentSum / ((double)(pt - avg_skip_ + 1)) );
        increments.push_back(pt+1);
        if (debug_ > 0)
          mprintf("DEBUG:\t\tAvg from %i to %i: %g\n", avg_skip_+1, pt+1, avg.back());
        count = 0;
      }
    }
    if (sum.empty()) {
      sum.resize(avg.size());
      points = increments;
    } else if (sum.size() != avg.size()) {
      mprinterr("Error: Different # of increments for set '%s'; got %zu, expected %zu.\n",
                ds.legend(), avg.size(), sum.size());
      return 1;
    }
    // Create increment curve data sets
    if (curve_.empty()) {
      MetaData md(dAout_->Meta().Name(), "TIcurve");
      for (unsigned int j = 0; j != avg.size(); j++) {
        md.SetIdx( increments[j] );
        DataSet* ds = masterDSL_->AddSet(DataSet::XYMESH, md);
        if (ds == 0) return Analysis::ERR;
        ds->ModifyDim(Dimension::X).SetLabel("Lambda");
        ds->SetLegend( md.Name() + "_Skip" + integerToString(increments[j]) );
        if (curveout_ != 0) curveout_->AddDataSet( ds );
        curve_.push_back( ds );
      }
    }
    for (unsigned int j = 0; j != avg.size(); j++) {
      DataSet_Mesh& CR = static_cast<DataSet_Mesh&>( *(curve_[j]) );
      CR.AddXY(xval_[idx], avg[j]);
      if (mode_ == GAUSSIAN_QUAD)
        sum[j] += (wgt_[idx] * avg[j]);
    }
  } // END loop over data sets
  if (mode_ == TRAPEZOID) Integrate_Trapezoid(sum);
  // Store final integration values
  DataSet_Mesh& DA = static_cast<DataSet_Mesh&>( *dAout_ );
  DA.ModifyDim(Dimension::X).SetLabel("Point");
  for (unsigned int j = 0; j != points.size(); j++)
    DA.AddXY(points[j], sum[j]);

  return 0;
}