/*ARGSUSED1*/ void key (unsigned char key, int x, int y) { switch (key) { case 'f': ffunc(); break; case 'h': help(); break; case '\033': exit(EXIT_SUCCESS); break; default: break; } }
double QFRDRFCSFitFunctionSimulator::getFitError(const QString &id, const QFRawDataRecord *r) const { QScopedPointer<QFFitFunction> ffunc(getFitFunction(r)); if (ffunc) { for (int p=0; p<ffunc->paramCount(); p++) { QFFitFunction::ParameterDescription d=ffunc->getDescription(p); if (d.id==id) { if (params.contains(id)) { return params[id].error; } } } } return 0; }
/*ARGSUSED1*/ void key(unsigned char key, int x, int y) { switch(key) { case 'l': light(); break; case 'f': ffunc(); break; case 'F': Ffunc(); break; case 't': toggle_t(); break; case 'm': mfunc(); break; case 'w': wire(); break; case 'x': xfunc(); break; case 'h': help(); break; case '\033': exit(EXIT_SUCCESS); break; default: help(); break; } glutPostRedisplay(); }
double QFRDRFCSFitFunctionSimulator::getDefaultFitValue(const QString &id, const QFRawDataRecord *r) const { QScopedPointer<QFFitFunction> ffunc(getFitFunction(r)); if (ffunc) { for (int p=0; p<ffunc->paramCount(); p++) { QFFitFunction::ParameterDescription d=ffunc->getDescription(p); if (d.id==id) { /*double value=0; if (overrideFitFunctionPreset(id, value)) return value;*/ return d.initialValue; } } } return 0; }
void QFRDRFCSFitFunctionSimulator::updateParameterValues() { QScopedPointer<QFFitFunction> ffunc(getFitFunction(NULL)); if (!ffunc) return; double* fullParams=(double*)qfCalloc(ffunc->paramCount(), sizeof(double)); double* errors=(double*)qfCalloc(ffunc->paramCount(), sizeof(double)); for (int p=0; p<ffunc->paramCount(); p++) { QFFitFunction::ParameterDescription d=ffunc->getDescription(p); QString id=d.id; if (params.contains(id)) { fullParams[p]=params[id].value; errors[p]=params[id].error; } else { fullParams[p]=d.initialValue; /*double value=0; if (overrideFitFunctionPreset(d.id, value)) fullParams[p]=value;*/ errors[p]=0; } } ffunc->calcParameter(fullParams, errors); for (int i=0; i<m_fitParameters.size(); i++) { if (m_fitParameters[i]) { //m_fitParameters[i]->reloadValues(); QString id=m_fitParameters[i]->parameterID(); int num=ffunc->getParameterNum(id); if (!id.isEmpty()) { if (num>=0) m_fitParameters[i]->setValue(fullParams[num], errors[num], false); bool visible=ffunc->isParameterVisible(ffunc->getParameterNum(id), fullParams); m_fitParameters[i]->setVisible(visible); //layParameters->labelForField(m_fitParameters[i])->setVisible(visible); } } } qfFree(fullParams); qfFree(errors); }
/*ARGSUSED1*/ void key (unsigned char key, int x, int y) { switch (key) { case 'b': bfunc(); break; case 'c': cfunc(); break; case 'l': lfunc(); break; case 't': tfunc(); break; case 'f': ffunc(); break; case 'n': nfunc(); break; case 'u': ufunc(); break; case 'U': Ufunc(); break; case 'p': pfunc(); break; case 'P': Pfunc(); break; case 'w': wfunc(); break; case 'x': xfunc(); break; case 'X': Xfunc(); break; case 'y': yfunc(); break; case '\033': exit(EXIT_SUCCESS); break; default: break; } }
int main(void){ int a; int* b; void* v; int c; int d; int e; int h; int i; int j; float f; float z; float x; float y; float* g; int zzz[20]; a=a/c*d/e*h/i/j; f=z*x**&y/f*f; a=*(b+a); a=zzz[23]; a=*(zzz+23); a=!a; if (!(a+b)) a=a; a=ffunc(a,b,f,g,v); a=gfunc(a,b,f,g); a=hfunc(a,b,f); a=ifunc(a,b); b=intstarfunc(a); g=floatstarfunc(f); v=voidstarfunc(v); return 1; /* g=g/g/g/g/g;*/ /* a=a+c; f=f+f; b=b+a; b=a+b; g=g+a; g=a+g; a=a-c; f=f-f; b=b-a; g=g-a; a=g-g; a=b-b;*/ }
void QFRDRFCSFitFunctionSimulator::replotFitFunction() { JKQTPdatastore* ds=ui->pltFunction->getDatastore(); QScopedPointer<QFFitFunction> ffunc(getFitFunction(NULL)); if (!ffunc) return; try { ui->pltFunction->set_doDrawing(false); ui->pltFunction->clearGraphs(); ds->clear(); updateTau(); if (tauN) { ///////////////////////////////////////////////////////////////////////////////// // retrieve fit parameters and errors. run calcParameters to fill in calculated parameters and make sure // we are working with a complete set of parameters ///////////////////////////////////////////////////////////////////////////////// double* fullParams=(double*)qfCalloc(ffunc->paramCount(), sizeof(double)); double* errors=(double*)qfCalloc(ffunc->paramCount(), sizeof(double)); double Nparticle=0; bool hasNParticle=false; for (int p=0; p<ffunc->paramCount(); p++) { QFFitFunction::ParameterDescription d=ffunc->getDescription(p); QString id=d.id; if (params.contains(id)) { fullParams[p]=params[id].value; errors[p]=params[id].error; } else { fullParams[p]=d.initialValue; /*double value=0; if (overrideFitFunctionPreset(id, value)) d.initialValue=value;*/ errors[p]=0; } } ffunc->calcParameter(fullParams, errors); used_params.clear(); for (int p=0; p<ffunc->paramCount(); p++) { QFFitFunction::ParameterDescription d=ffunc->getDescription(p); QString id=d.id.toLower(); bool visible=ffunc->isParameterVisible(ffunc->getParameterNum(id), fullParams); if (visible) { if (id=="n_particle") { Nparticle=fullParams[p]; hasNParticle=true; } if (id=="1n_particle" && !hasNParticle) { Nparticle=1.0/fullParams[p]; hasNParticle=true; } used_params[id]=fullParams[p]; } } used_params["tau_min"]=ui->edtMinTau->value(); used_params["tau_max"]=ui->edtMaxTau->value(); used_params["runs"]=ui->spinRuns->value(); used_params["noise_enabled"]=ui->chkNoise->isChecked(); used_params["model_function"]=ffunc->id(); csv=""; // evaluate correlation function and determine small-lag amplitude double tau0avg=0; for (int r=0; r<runs; r++) { for (int i=0; i<tauN; i++) { corr[r*tauN+i]=ffunc->evaluate(tau[i], fullParams); } tau0avg=tau0avg+corr[r*tauN]; } tau0avg=tau0avg/double(runs); if (!hasNParticle) Nparticle=1.0/tau0avg; // calc noise if (ui->chkNoise->isChecked()) { MTRand rng; if (ui->cmbNoiseModel->currentIndex()==0) { double I=ui->spinAvgCountRate->value()*1000.0; double I2=sqr(I); double NN=Nparticle; if (NN<=0) NN=1.0; for (int r=0; r<runs; r++) { double corr0=corr[r*tauN]; for (int i=0; i<tauN; i++) { double corrT=corr[r*tauN+i]; double M=ui->spinMeasDuration->value()/tau[i]; double m=tau[0]/tau[i]; double var=((1.0+sqr(corr0))*(1.0+sqr(corrT))/(1.0-sqr(corr0))+2.0*m*sqr(corrT))/M/NN/NN+(2.0*(1.0+sqr(corrT))/NN/I+(1.0+corrT/NN)/I2)/M; corr[r*tauN+i]=corr[r*tauN+i]+rng.randNorm(0,1)*sqrt(var); } } used_params["noise_model"]=QString("Koppel"); used_params["noise_intensity_kHz"]=I; used_params["noise_measurement_duration"]=ui->spinMeasDuration->value(); } else if (ui->cmbNoiseModel->currentIndex()==1) { for (int r=0; r<runs; r++) { for (int i=0; i<tauN; i++) { corr[r*tauN+i]=corr[r*tauN+i]+rng.randNorm(0, 1)*(ui->spinNoiseLevel->value()/100.0*tau0avg); } } used_params["noise_model"]=QString("gaussian"); used_params["noise_level"]=ui->spinNoiseLevel->value(); } else if (ui->cmbNoiseModel->currentIndex()==2) { for (int r=0; r<runs; r++) { for (int i=0; i<tauN; i++) { corr[r*tauN+i]=corr[r*tauN+i]+(rng.rand()*2.0-1.0)*ui->spinNoiseLevel->value()/100.0*tau0avg; } } used_params["noise_model"]=QString("uniform"); used_params["noise_level"]=ui->spinNoiseLevel->value(); } else if (ui->cmbNoiseModel->currentIndex()==3) { for (int r=0; r<runs; r++) { for (int i=0; i<tauN; i++) { corr[r*tauN+i]=corr[r*tauN+i]+rng.randNorm(0, 1)*(ui->spinNoiseLevel->value()/100.0*corr[r*tauN+i]); } } used_params["noise_model"]=QString("local gaussian"); used_params["noise_level"]=ui->spinNoiseLevel->value(); } else if (ui->cmbNoiseModel->currentIndex()==4) { for (int r=0; r<runs; r++) { for (int i=0; i<tauN; i++) { corr[r*tauN+i]=corr[r*tauN+i]+(rng.rand()*2.0-1.0)*ui->spinNoiseLevel->value()/100.0*corr[r*tauN+i]; } } used_params["noise_model"]=QString("local uniform"); used_params["noise_level"]=ui->spinNoiseLevel->value(); } } for (int i=0; i<tauN; i++) { csv=csv+CDoubleToQString(tau[i]); for (int r=0; r<runs; r++) { csv=csv+", "+CDoubleToQString(corr[r*tauN+i]); } csv=csv+"\n"; } size_t c_tau = ds->addCopiedColumn(tau, tauN, "tau"); for (int r=0; r<runs; r++) { size_t c_fit = ds->addCopiedColumn(&(corr[r*tauN]), tauN, QString("function_r%1").arg(r)); ///////////////////////////////////////////////////////////////////////////////// // plot fit model and additional function graphs ///////////////////////////////////////////////////////////////////////////////// JKQTPxyLineGraph* g_fit=new JKQTPxyLineGraph(ui->pltFunction->get_plotter()); g_fit->set_drawLine(true); g_fit->set_title(tr("run %1").arg(r)); g_fit->set_xColumn(c_tau); g_fit->set_yColumn(c_fit); ui->pltFunction->addGraph(g_fit); } } ui->pltFunction->zoomToFit(); ui->pltFunction->set_doDrawing(true); ui->pltFunction->update_plot(); } catch(std::exception& E) { services->log_error(tr("error during plotting, error message: %1\n").arg(E.what())); } }
void QFRDRFCSFitFunctionSimulator::displayModel(bool newWidget){ QScopedPointer<QFFitFunction> ffunc(getFitFunction(NULL)); if (!ffunc) { ///////////////////////////////////////////////////////////////////////////////////////////// // delete all fit parameter widgets ///////////////////////////////////////////////////////////////////////////////////////////// for (int i=0; i<m_fitParameters.size(); i++) { if (m_fitParameters[i]) { m_fitParameters[i]->disableDatastore(); disconnect(tbEditRanges, SIGNAL(currentChanged(int)), m_fitParameters[i], SLOT(setEditRange(int))); disconnect(m_fitParameters[i], SIGNAL(valueChanged(QString, double)), this, SLOT(updateFitFunction())); disconnect(m_fitParameters[i], SIGNAL(errorChanged(QString, double)), this, SLOT(updateFitFunction())); disconnect(m_fitParameters[i], SIGNAL(rangeChanged(QString, double, double)), this, SLOT(updateFitFunction())); delete m_fitParameters[i]; } } m_fitParameters.clear(); return; } if (newWidget) { ///////////////////////////////////////////////////////////////////////////////////////////// // first delete all fit parameter widgets ///////////////////////////////////////////////////////////////////////////////////////////// for (int i=0; i<m_fitParameters.size(); i++) { if (m_fitParameters[i]) { m_fitParameters[i]->disableDatastore(); //disconnect(btnEditRanges, SIGNAL(toggled(bool)), m_fitParameters[i], SLOT(setEditRange(bool))); //disconnect(btnEditRanges, SIGNAL(toggled(bool)), m_fitParameters[i], SLOT(unsetEditValues(bool))); disconnect(tbEditRanges, SIGNAL(currentChanged(int)), m_fitParameters[i], SLOT(setEditRange(int))); disconnect(tbEditRanges, SIGNAL(currentChanged(int)), m_fitParameters[i], SLOT(unsetEditValues(int))); disconnect(m_fitParameters[i], SIGNAL(valueChanged(QString, double)), this, SLOT(updateFitFunction())); disconnect(m_fitParameters[i], SIGNAL(errorChanged(QString, double)), this, SLOT(updateFitFunction())); disconnect(m_fitParameters[i], SIGNAL(rangeChanged(QString, double, double)), this, SLOT(updateFitFunction())); delete m_fitParameters[i]; } } // remove all widgets from layout QLayoutItem *child; while ((child = layParameters->takeAt(0)) != 0) { delete child; } ///////////////////////////////////////////////////////////////////////////////////////////// // create header widget ///////////////////////////////////////////////////////////////////////////////////////////// QFFitParameterWidgetWrapper* header=new QFFitParameterWidgetWrapper(this, layParameters, 0, "", QFFitParameterWidgetWrapper::Header, true, true, QFFitFunction::DisplayError, true, this, tr("parameter")); m_fitParameters.append(header); //connect(btnEditRanges, SIGNAL(toggled(bool)), header, SLOT(setEditRange(bool))); //connect(btnEditRanges, SIGNAL(toggled(bool)), header, SLOT(unsetEditValues(bool))); connect(tbEditRanges, SIGNAL(currentChanged(int)), header, SLOT(setEditRange(int))); connect(tbEditRanges, SIGNAL(currentChanged(int)), header, SLOT(unsetEditValues(int))); //header->setEditRange(btnEditRanges->isChecked()); //header->unsetEditValues(!btnEditRanges->isChecked()); header->setEditRange(tbEditRanges->currentIndex()); header->unsetEditValues(tbEditRanges->currentIndex()); ///////////////////////////////////////////////////////////////////////////////////////////// // create new parameter widgets ///////////////////////////////////////////////////////////////////////////////////////////// for (int i=0; i<ffunc->paramCount(); i++) { QString id=ffunc->getParameterID(i); QFFitFunction::ParameterDescription d=ffunc->getDescription(i); QFFitParameterWidgetWrapper::WidgetType wtype=QFFitParameterWidgetWrapper::FloatEdit; if (d.widgetType==QFFitFunction::IntNumber) wtype=QFFitParameterWidgetWrapper::IntSpinBox; if (d.widgetType==QFFitFunction::IntCombo) wtype=QFFitParameterWidgetWrapper::IntDropDown; if (d.widgetType==QFFitFunction::LogFloatNumber) wtype=QFFitParameterWidgetWrapper::LogFloatEdit; bool editable=d.userEditable; bool displayFix=d.userEditable; QFFitFunction::ErrorDisplayMode displayError=d.displayError; bool editRange=d.userEditable && d.userRangeEditable; if (!d.fit) { displayFix=false; } QString l=QString("<font size=\"+1\">%1</font>:").arg(d.label); if (!d.unit.isEmpty()) l=QString("<font size=\"+1\">%1 [%2]</font>:").arg(d.label).arg(d.unitLabel); l.replace("<sub>", "<sub><font size=\"+2\">", Qt::CaseInsensitive); l.replace("<sup>", "<sup><font size=\"+2\">", Qt::CaseInsensitive); l.replace("</sup>", "</font></sup>", Qt::CaseInsensitive); l.replace("</sub>", "</font></sub>", Qt::CaseInsensitive); QFFitParameterWidgetWrapper* fpw=new QFFitParameterWidgetWrapper(this, layParameters, i+1, id, wtype, editable, displayFix, displayError, editRange, this, l, d.comboItems); fpw->setUnit(d.unit); fpw->setIncrement(d.inc); fpw->setWidgetWidth(75); fpw->setRangeEnabled(true); fpw->setValueAbsoluteRange(d.absMinValue, d.absMaxValue); fpw->setRangeEnabled(true); fpw->setToolTip(d.name); m_fitParameters.append(fpw); connect(tbEditRanges, SIGNAL(currentChanged(int)), fpw, SLOT(unsetEditValues(int))); connect(tbEditRanges, SIGNAL(currentChanged(int)), fpw, SLOT(setEditRange(int))); connect(fpw, SIGNAL(valueChanged(QString, double)), this, SLOT(updateFitFunction())); connect(fpw, SIGNAL(errorChanged(QString, double)), this, SLOT(updateFitFunction())); connect(fpw, SIGNAL(rangeChanged(QString, double, double)), this, SLOT(updateFitFunction())); fpw->setEditRange(tbEditRanges->currentIndex()); fpw->unsetEditValues(tbEditRanges->currentIndex()); } // add stretcher item in bottom row layParameters->addItem(new QSpacerItem(5,5, QSizePolicy::Minimum, QSizePolicy::Expanding), layParameters->rowCount(), 0); } updateParameterValues(); }