void MultiPeakFit::insertPeakFunctionCurve(double *x, double *y, int peak) { QStringList curves = d_output_graph->curvesList(); int index = 0; for (int i = 0; i<(int)curves.count(); i++ ){ if (curves[i].startsWith(tr("Peak"))) index++; } QString title = tr("Peak") + QString::number(++index); FunctionCurve *c = new FunctionCurve(FunctionCurve::Normal, title); c->setPen(QPen(ColorBox::color(d_peaks_color), 1)); c->setData(x, y, d_points); c->setRange(d_x[0], d_x[d_n-1]); QString formula = "y0+"+peakFormula(peak + 1, d_profile); QString parameter = QString::number(d_results[d_p-1], 'e', d_prec); formula.replace(d_param_names[d_p-1], parameter); for (int j=0; j<3; j++){ int p = 3*peak + j; parameter = QString::number(d_results[p], 'e', d_prec); formula.replace(d_param_names[p], parameter); } c->setFormula(formula.replace("--", "+").replace("-+", "-").replace("+-", "-")); d_output_graph->insertPlotItem(c, Graph::Line); d_output_graph->addFitCurve(c); }
void MultiPeakFit::insertPeakFunctionCurve(int peak) { QStringList curves = d_output_graph->curveNamesList(); int index = 0; for (int i = 0; i<(int)curves.count(); i++ ){ if (curves[i].startsWith(tr("Peak"))) index++; } QString title = tr("Peak") + QString::number(++index); FunctionCurve *c = new FunctionCurve(FunctionCurve::Normal, title); c->setPen(QPen(d_peaks_color, 1)); c->setRange(d_from, d_to); c->setFormula("y0 + " + peakFormula(peak + 1, d_profile)); c->setConstant(d_param_names[d_p - 1], d_results[d_p - 1]);//y0 - offset for (int j=0; j<3; j++){ int p = 3*peak + j; c->setConstant(d_param_names[p], d_results[p]); } if (d_curve){ c->setCurveType(d_curve->curveType()); c->setAxis(d_curve->xAxis(), d_curve->yAxis()); } c->loadData(d_points); d_output_graph->insertPlotItem(c, Graph::Line); d_output_graph->addFitCurve(c); }
QString MultiPeakFit::generateFormula(int peaks, PeakProfile profile) { if (peaks == 1){ switch (profile){ case Gauss: return "y0+A*sqrt(2/PI)/w*exp(-2*((x-xc)/w)^2)"; break; case Lorentz: return "y0+2*A/PI*w/(4*(x-xc)^2+w^2)"; break; } } QString formula = "y0+"; for (int i = 0; i<peaks; i++){ formula += peakFormula(i+1, profile); if (i < peaks - 1) formula += "+"; } return formula; }