void IKoptions::setAdditionaltSamples(const RowVectorXd &t_samples) { if (t_samples.size() > 0) { set<double> unique_sort_t(t_samples.data(), t_samples.data() + t_samples.size()); this->additional_tSamples.resize(unique_sort_t.size()); int t_idx = 0; for (auto it = unique_sort_t.begin(); it != unique_sort_t.end(); it++) { this->additional_tSamples(t_idx) = *it; t_idx++; } } else { this->additional_tSamples.resize(0); } }
/* compares evaluations on corner cases */ void eval_spline3d_onbrks() { Spline3d spline = spline3d(); RowVectorXd u = spline.knots(); MatrixXd pts(11,3); pts << 0.959743958516081, 0.340385726666133, 0.585267750979777, 0.959743958516081, 0.340385726666133, 0.585267750979777, 0.959743958516081, 0.340385726666133, 0.585267750979777, 0.430282980289940, 0.713074680056118, 0.720373307943349, 0.558074875553060, 0.681617921034459, 0.804417124839942, 0.407076008291750, 0.349707710518163, 0.617275937419545, 0.240037008286602, 0.738739390398014, 0.324554153129411, 0.302434111480572, 0.781162443963899, 0.240177089094644, 0.251083857976031, 0.616044676146639, 0.473288848902729, 0.251083857976031, 0.616044676146639, 0.473288848902729, 0.251083857976031, 0.616044676146639, 0.473288848902729; pts.transposeInPlace(); for (int i=0; i<u.size(); ++i) { Vector3d pt = spline(u(i)); VERIFY( (pt - pts.col(i)).norm() < 1e-14 ); } }
void FrequencySpectrumDelegate::createPlotPath(const QModelIndex &index, const QStyleOptionViewItem &option, QPainterPath& path, RowVectorXd& data) const { const FrequencySpectrumModel* t_pModel = static_cast<const FrequencySpectrumModel*>(index.model()); float fMaxValue = data.maxCoeff(); float fValue; float fScaleY = option.rect.height()/(fMaxValue*0.5); float y_base = path.currentPosition().y(); QPointF qSamplePosition; qint32 lowerIdx = t_pModel->getLowerFrqBound(); qint32 upperIdx = t_pModel->getUpperFrqBound(); //Move to initial starting point if(data.size() > 0) { float val = 0; fValue = val*fScaleY; float newY = y_base+fValue; qSamplePosition.setY(newY); qSamplePosition.setX((double)option.rect.width()*t_pModel->getFreqScaleBound()[lowerIdx]); path.moveTo(qSamplePosition); } //create lines from one to the next sample qint32 i; for(i = lowerIdx+1; i <= upperIdx; ++i) { float val = data[i]-data[0]; //remove first sample data[0] as offset fValue = val*fScaleY; float newY = y_base+fValue; qSamplePosition.setY(newY); qSamplePosition.setX((double)option.rect.width()*t_pModel->getFreqScaleBound()[i]); path.lineTo(qSamplePosition); } }
void FrequencySpectrumDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { float t_fPlotHeight = option.rect.height(); switch(index.column()) { case 0: { //chnames painter->save(); painter->rotate(-90); painter->drawText(QRectF(-option.rect.y()-t_fPlotHeight,0,t_fPlotHeight,20),Qt::AlignCenter,index.model()->data(index,Qt::DisplayRole).toString()); painter->restore(); break; } case 1: { //data plot painter->save(); //draw special background when channel is marked as bad // QVariant v = index.model()->data(index,Qt::BackgroundRole); // if(v.canConvert<QBrush>() && !(option.state & QStyle::State_Selected)) { // QPointF oldBO = painter->brushOrigin(); // painter->setBrushOrigin(option.rect.topLeft()); // painter->fillRect(option.rect, qvariant_cast<QBrush>(v)); // painter->setBrushOrigin(oldBO); // } // //Highlight selected channels // if(option.state & QStyle::State_Selected) { // QPointF oldBO = painter->brushOrigin(); // painter->setBrushOrigin(option.rect.topLeft()); // painter->fillRect(option.rect, option.palette.highlight()); // painter->setBrushOrigin(oldBO); // } //Get data QVariant variant = index.model()->data(index,Qt::DisplayRole); RowVectorXd data = variant.value< RowVectorXd >(); const FrequencySpectrumModel* t_pModel = static_cast<const FrequencySpectrumModel*>(index.model()); if(data.size() > 0) { QPainterPath path(QPointF(option.rect.x(),option.rect.y()));//QPointF(option.rect.x()+t_rtmsaModel->relFiffCursor()-1,option.rect.y())); //Plot grid painter->setRenderHint(QPainter::Antialiasing, false); createGridPath(index, option, path, data); createGridTick(index, option, painter); //capture the mouse capturePoint(index, option, path, data, painter); painter->save(); QPen pen; pen.setStyle(Qt::DotLine); pen.setWidthF(0.5); painter->setPen(pen); painter->drawPath(path); painter->restore(); //Plot data path path = QPainterPath(QPointF(option.rect.x(),option.rect.y()));//QPointF(option.rect.x()+t_rtmsaModel->relFiffCursor(),option.rect.y())); createPlotPath(index, option, path, data); painter->save(); painter->translate(0,t_fPlotHeight/2); painter->setRenderHint(QPainter::Antialiasing, true); if(option.state & QStyle::State_Selected) painter->setPen(QPen(t_pModel->isFreezed() ? Qt::darkRed : Qt::red, 1, Qt::SolidLine)); else painter->setPen(QPen(t_pModel->isFreezed() ? Qt::darkGray : Qt::darkBlue, 1, Qt::SolidLine)); painter->drawPath(path); painter->restore(); } painter->restore(); break; } } }
void RealTimeButterflyPlot::createPlotPath(qint32 row, QPainterPath& path) const { //get maximum range of respective channel type (range value in FiffChInfo does not seem to contain a reasonable value) qint32 kind = m_pRealTimeEvokedModel->getKind(row); float fMaxValue = 1e-9f; switch(kind) { case FIFFV_MEG_CH: { qint32 unit =m_pRealTimeEvokedModel->getUnit(row); if(unit == FIFF_UNIT_T_M) { //gradiometers fMaxValue = 1e-10f; if(m_pRealTimeEvokedModel->getScaling().contains(FIFF_UNIT_T_M)) fMaxValue = m_pRealTimeEvokedModel->getScaling()[FIFF_UNIT_T_M]; } else if(unit == FIFF_UNIT_T) //magnitometers { if(m_pRealTimeEvokedModel->getCoil(row) == FIFFV_COIL_BABY_MAG) fMaxValue = 1e-11f; else fMaxValue = 1e-11f; if(m_pRealTimeEvokedModel->getScaling().contains(FIFF_UNIT_T)) fMaxValue = m_pRealTimeEvokedModel->getScaling()[FIFF_UNIT_T]; } break; } case FIFFV_REF_MEG_CH: { /*11/04/14 Added by Limin: MEG reference channel */ fMaxValue = 1e-11f; if(m_pRealTimeEvokedModel->getScaling().contains(FIFF_UNIT_T)) fMaxValue = m_pRealTimeEvokedModel->getScaling()[FIFF_UNIT_T]; break; } case FIFFV_EEG_CH: { fMaxValue = 1e-4f; if(m_pRealTimeEvokedModel->getScaling().contains(FIFFV_EEG_CH)) fMaxValue = m_pRealTimeEvokedModel->getScaling()[FIFFV_EEG_CH]; break; } case FIFFV_EOG_CH: { fMaxValue = 1e-3f; if(m_pRealTimeEvokedModel->getScaling().contains(FIFFV_EOG_CH)) fMaxValue = m_pRealTimeEvokedModel->getScaling()[FIFFV_EOG_CH]; break; } case FIFFV_STIM_CH: { fMaxValue = 5; if(m_pRealTimeEvokedModel->getScaling().contains(FIFFV_STIM_CH)) fMaxValue = m_pRealTimeEvokedModel->getScaling()[FIFFV_STIM_CH]; break; } case FIFFV_MISC_CH: { fMaxValue = 1e-3f; if(m_pRealTimeEvokedModel->getScaling().contains(FIFFV_MISC_CH)) fMaxValue = m_pRealTimeEvokedModel->getScaling()[FIFFV_MISC_CH]; break; } } float fValue; float fScaleY = this->height()/(2*fMaxValue); //restrictions for paint performance float fWinMaxVal = ((float)this->height()-2)/2.0f; qint32 iDownSampling = (m_pRealTimeEvokedModel->getNumSamples() * 4 / (this->width()-2)); if(iDownSampling < 1) iDownSampling = 1; float y_base = path.currentPosition().y(); QPointF qSamplePosition; float fDx = (float)(this->width()-2) / ((float)m_pRealTimeEvokedModel->getNumSamples()-1.0f);//((float)option.rect.width()) / m_pRealTimeEvokedModel->getMaxSamples(); // fDx *= iDownSampling; RowVectorXd rowVec = m_pRealTimeEvokedModel->data(row,1).value<RowVectorXd>(); //Move to initial starting point if(rowVec.size() > 0) { float val = rowVec[0]; fValue = (val/*-rowVec[m_pRealTimeEvokedModel->getNumPreStimSamples()-1]*/)*fScaleY;//ToDo -> -2 PreStim is one too short float newY = y_base+fValue; qSamplePosition.setY(-newY); qSamplePosition.setX(path.currentPosition().x()); path.moveTo(qSamplePosition); } //create lines from one to the next sample qint32 i; for(i = 1; i < rowVec.size(); ++i) { // if(i != m_pRealTimeEvokedModel->getNumPreStimSamples() - 2) // { float val = /*rowVec[m_pRealTimeEvokedModel->getNumPreStimSamples()-1] - */rowVec[i]; //remove first sample data[0] as offset fValue = val*fScaleY; fValue = fValue > fWinMaxVal ? fWinMaxVal : fValue < -fWinMaxVal ? -fWinMaxVal : fValue; float newY = y_base+fValue; qSamplePosition.setY(-newY); // } // else // qSamplePosition.setY(y_base); qSamplePosition.setX(path.currentPosition().x()+fDx); path.lineTo(qSamplePosition); } // //create lines from one to the next sample for last path // qint32 sample_offset = m_pRealTimeEvokedModel->numVLines() + 1; // qSamplePosition.setX(qSamplePosition.x() + fDx*sample_offset); // lastPath.moveTo(qSamplePosition); // for(i += sample_offset; i < lastData.size(); ++i) { // float val = lastData[i] - lastData[0]; //remove first sample lastData[0] as offset // fValue = val*fScaleY; // float newY = y_base+fValue; // qSamplePosition.setY(newY); // qSamplePosition.setX(lastPath.currentPosition().x()+fDx); // lastPath.lineTo(qSamplePosition); // } }