15 #include <QtCore/QString>
16 #include <QtGui/QColor>
17 #include <QtGui/QCursor>
18 #include <QtCore/QMutexLocker>
20 #include <qwt_symbol.h>
21 #include <qwt_legend.h>
22 #include <qwt_legend_item.h>
23 #include <qwt_scale_engine.h>
40 #define ActivitySize 8
50 mMinX(std::numeric_limits<double>::quiet_NaN()),
51 mMaxX(std::numeric_limits<double>::quiet_NaN()),
52 mMinY(std::numeric_limits<double>::quiet_NaN()),
53 mMaxY(std::numeric_limits<double>::quiet_NaN())
63 mMinX(std::numeric_limits<double>::quiet_NaN()),
64 mMaxX(std::numeric_limits<double>::quiet_NaN()),
65 mMinY(std::numeric_limits<double>::quiet_NaN()),
66 mMaxY(std::numeric_limits<double>::quiet_NaN())
102 return QwtDoubleRect(1.0, 1.0, -2.0, -2.0);
111 mLastRectangle =
mSize;
114 bool MinXisNaN = isnan(
mMinX);
115 bool MaxXisNaN = isnan(
mMaxX);
116 bool MinYisNaN = isnan(
mMinY);
117 bool MaxYisNaN = isnan(
mMaxY);
121 const double xv = *xIt++;
125 if ((xv <
mMinX || MinXisNaN) && xv > -std::numeric_limits< double >::infinity())
131 if ((xv >
mMaxX || MaxXisNaN) && xv < std::numeric_limits< double >::infinity())
138 const double yv = *yIt++;
142 if ((yv <
mMinY || MinYisNaN) && yv > -std::numeric_limits< double >::infinity())
148 if ((yv >
mMaxY || MaxYisNaN) && yv < std::numeric_limits< double >::infinity())
157 return QwtDoubleRect(1.0, 1.0, -2.0, -2.0);
218 mMinX(std::numeric_limits<double>::quiet_NaN()),
219 mMaxX(std::numeric_limits<double>::quiet_NaN()),
220 mMinY(std::numeric_limits<double>::quiet_NaN()),
221 mMaxY(std::numeric_limits<double>::quiet_NaN())
235 mMinX(std::numeric_limits<double>::quiet_NaN()),
236 mMaxX(std::numeric_limits<double>::quiet_NaN()),
237 mMinY(std::numeric_limits<double>::quiet_NaN()),
238 mMaxY(std::numeric_limits<double>::quiet_NaN())
267 i = (2 *
mSize - i - 1);
300 return QwtDoubleRect(1.0, 1.0, -2.0, -2.0);
310 mLastRectangle =
mSize;
313 bool MinXisNaN = isnan(
mMinX);
314 bool MaxXisNaN = isnan(
mMaxX);
315 bool MinYisNaN = isnan(
mMinY);
316 bool MaxYisNaN = isnan(
mMaxY);
320 const double xv = *xIt++;
324 if (xv <
mMinX || MinXisNaN)
330 if (xv >
mMaxX || MaxXisNaN)
337 double yv1 = *yIt1++;
338 double yv2 = *yIt2++;
340 if (isnan(yv1) || isnan(yv2))
342 yv1 = isnan(yv1) ? yv2 : yv1;
354 if (yv1 <
mMinY || MinYisNaN)
360 if (yv2 >
mMaxY || MaxYisNaN)
369 return QwtDoubleRect(1.0, 1.0, -2.0, -2.0);
432 mMinX(std::numeric_limits<double>::quiet_NaN()),
433 mMaxX(std::numeric_limits<double>::quiet_NaN()),
434 mMinY(std::numeric_limits<double>::quiet_NaN()),
435 mMaxY(std::numeric_limits<double>::quiet_NaN()),
450 mMinX(std::numeric_limits<double>::quiet_NaN()),
451 mMaxX(std::numeric_limits<double>::quiet_NaN()),
452 mMinY(std::numeric_limits<double>::quiet_NaN()),
453 mMaxY(std::numeric_limits<double>::quiet_NaN()),
454 mIncrement(increment),
492 return QwtDoubleRect(1.0, 1.0, -2.0, -2.0);
500 mLastRectangle =
mSize;
504 for (; xIt != end; ++xIt)
510 if (-std::numeric_limits< C_FLOAT64 >::infinity() < *xIt &&
511 *xIt < std::numeric_limits< C_FLOAT64 >::infinity())
541 std::map<C_INT32, C_INT32>::const_iterator it =
mMap.begin();
542 std::map<C_INT32, C_INT32>::const_iterator itEnd =
mMap.end();
544 for (; it != itEnd; ++it, ++pX, ++pY)
548 *pY = (double)it->second * 100.0 / (
double)
mSize;
630 static_cast< C2DCurveData *
>(&data())->reallocated(pX, pY);
669 const QwtScaleMap &xMap,
const QwtScaleMap &yMap,
670 int from,
int to)
const
678 for (i = from; i <= to; ++i)
679 if (isnan(x(i)) || isnan(y(i)))
690 QwtPlotCurve::drawLines(painter, xMap, yMap, from, to2);
699 const QwtScaleMap &xMap,
const QwtScaleMap &yMap,
700 int from,
int to)
const
710 QwtPlotCurve::drawCurve(painter, style, xMap, yMap, from, to);
715 const QwtScaleMap &xMap,
const QwtScaleMap &yMap,
716 int from,
int to)
const
726 while (isnan(x(from2)) || isnan(y(from2)))
744 while (!(isnan(x(to2)) || isnan(y(to2))));
748 QwtPlotCurve::drawSymbols(painter, symbol, xMap, yMap, from2, to2);
760 C_FLOAT64 CopasiPlot::MissingValue = std::numeric_limits<C_FLOAT64>::quiet_NaN();
772 mpPlotSpecification(NULL),
774 mIgnoreUpdate(false),
776 mReplotFinished(false)
789 mpPlotSpecification(NULL),
791 mIgnoreUpdate(false),
793 mReplotFinished(false)
795 QwtLegend *legend =
new QwtLegend;
796 legend->setItemMode(QwtLegend::CheckableItem);
801 insertLegend(legend, QwtPlot::TopLegend);
803 insertLegend(legend, QwtPlot::BottomLegend);
808 mpZoomer->setRubberBandPen(QColor(Qt::black));
809 mpZoomer->setTrackerPen(QColor(Qt::black));
810 mpZoomer->setTrackerMode(QwtPicker::AlwaysOn);
811 mpZoomer->setTrackerFont(this->font());
814 setCanvasBackground(Qt::white);
817 setCanvasLineWidth(0);
819 canvas()->setPaintAttribute(QwtPlotCanvas::PaintPacked,
true);
821 connect(
this, SIGNAL(legendChecked(QwtPlotItem *,
bool)),
850 std::map< std::string, C2DPlotCurve * >::iterator found;
857 bool * pVisible = Visible.
array();
859 for (; itPlotItem != endPlotItem; ++itPlotItem, ++pVisible)
863 if ((found =
mCurveMap.find((*itPlotItem)->CCopasiParameter::getKey())) !=
mCurveMap.end())
865 *pVisible = found->second->isVisible();
870 std::map< std::string, C2DPlotCurve * >::iterator it =
mCurveMap.begin();
871 std::map< std::string, C2DPlotCurve * >::iterator end =
mCurveMap.end();
873 for (; it != end; ++it)
879 pVisible = Visible.
array();
881 unsigned long int k = 0;
882 bool needLeft =
false;
883 bool needRight =
false;
885 for (; itPlotItem != endPlotItem; ++itPlotItem, ++pVisible, ++ppCurve, ++k)
889 (*itPlotItem)->getType(),
890 (*itPlotItem)->getActivity(),
894 mCurveMap[(*itPlotItem)->CCopasiParameter::getKey()] = pCurve;
903 std::string colorstr = *(*itPlotItem)->getValue(
"Color").pSTRING;
907 pCurve->setPen(color);
908 pCurve->attach(
this);
916 pCurve->setRenderHint(QwtPlotItem::RenderAntialiased);
918 unsigned C_INT32 linetype = *(*itPlotItem)->getValue(
"Line type").pUINT;
923 pCurve->setStyle(QwtPlotCurve::Lines);
924 unsigned C_INT32 linesubtype = *(*itPlotItem)->getValue(
"Line subtype").pUINT;
925 C_FLOAT64 width = *(*itPlotItem)->getValue(
"Line width").pUDOUBLE;
930 pCurve->setPen(QPen(QBrush(color), width, Qt::DotLine, Qt::FlatCap));
934 pCurve->setPen(QPen(QBrush(color), width, Qt::DashLine));
938 pCurve->setPen(QPen(QBrush(color), width, Qt::DashDotLine));
942 pCurve->setPen(QPen(QBrush(color), width, Qt::DashDotDotLine));
947 pCurve->setPen(QPen(QBrush(color), width, Qt::SolidLine));
954 C_FLOAT64 width = *(*itPlotItem)->getValue(
"Line width").pUDOUBLE;
955 pCurve->setPen(QPen(color, width, Qt::SolidLine, Qt::RoundCap));
956 pCurve->setStyle(QwtPlotCurve::Dots);
961 pCurve->setStyle(QwtPlotCurve::NoCurve);
967 unsigned C_INT32 symbolsubtype = *(*itPlotItem)->getValue(
"Symbol subtype").pUINT;
969 switch (symbolsubtype)
972 pCurve->setSymbol(QwtSymbol(QwtSymbol::Cross, QBrush(), QPen(QBrush(color), 2), QSize(7, 7)));
976 pCurve->setSymbol(QwtSymbol(QwtSymbol::Ellipse, QBrush(), QPen(QBrush(color), 1), QSize(8, 8)));
981 pCurve->setSymbol(QwtSymbol(QwtSymbol::Cross, QBrush(color), QPen(QBrush(color), 1), QSize(5, 5)));
997 pCurve->
setIncrement(*(*itPlotItem)->getValue(
"increment").pDOUBLE);
999 pCurve->setStyle(QwtPlotCurve::Steps);
1000 pCurve->setYAxis(QwtPlot::yRight);
1001 pCurve->setCurveAttribute(QwtPlotCurve::Inverted);
1008 setAxisScaleEngine(xBottom,
new QwtLog10ScaleEngine());
1010 setAxisScaleEngine(xBottom,
new QwtLinearScaleEngine());
1012 setAxisAutoScale(xBottom);
1015 setAxisScaleEngine(yLeft,
new QwtLog10ScaleEngine());
1017 setAxisScaleEngine(yLeft,
new QwtLinearScaleEngine());
1019 setAxisAutoScale(yLeft);
1021 enableAxis(yLeft, needLeft);
1025 setAxisScaleEngine(yRight,
new QwtLinearScaleEngine());
1026 setAxisTitle(yRight,
"Percent %");
1043 std::pair< std::set< const CCopasiObject * >::iterator,
bool > Inserted;
1044 std::pair< Activity, size_t > DataIndex;
1045 std::vector< std::set < const CCopasiObject * > > ActivityObjects;
1053 std::vector< std::vector < const CCopasiObject * > >::iterator itX;
1054 assert(pDataModel != NULL);
1056 for (i = 0; i < imax; ++i)
1060 DataIndex.first = ItemActivity;
1066 for (j = 0; j < jmax; ++j)
1085 if (*itX->begin() == pObj)
break;
1089 std::vector < const CCopasiObject * > NewX;
1090 NewX.push_back(pObj);
1103 itX->push_back(pObj);
1107 Inserted = ActivityObjects[ItemActivity].insert(pObj);
1109 if (Inserted.second)
1118 DataIndex.second = ActivityObjects[ItemActivity].size() - 1;
1159 for (; itCurves != endCurves; ++itCurves, ++k)
1161 std::vector< CVector< double > * > & data =
mData[(*itCurves)->getActivity()];
1163 switch ((*itCurves)->getType())
1206 for (ItemActivity = 0; ItemActivity <
ActivitySize; ItemActivity++)
1207 if ((ItemActivity & activity) &&
mData[ItemActivity].size())
1209 std::vector< CVector< double > * > & data =
mData[ItemActivity];
1210 size_t & ndata =
mDataSize[ItemActivity];
1212 if ((imax = data.size()) != 0)
1214 if (ndata >= data[0]->size())
1220 for (i = 0; i < imax; ++i)
1244 for (ItemActivity = 0; ItemActivity <
ActivitySize; ItemActivity++)
1245 if ((ItemActivity & activity) &&
mData[ItemActivity].size())
1247 std::vector< CVector< double > * > & data =
mData[ItemActivity];
1248 size_t & ndata =
mDataSize[ItemActivity];
1250 if ((imax = data.size()) != 0)
1252 if (ndata >= data[0]->size())
1258 for (i = 0; i < imax; ++i)
1289 for (ItemActivity = 0; ItemActivity <
ActivitySize; ItemActivity++)
1299 for (; itCurves != endCurves; ++itCurves, ++k)
1300 if ((
size_t)(*itCurves)->getActivity() == activity)
1302 (*itCurves)->setDataSize(
mDataSize[activity]);
1308 std::vector< CVector< double > * > & data =
mData[activity];
1309 std::vector< CVector< double > * >::iterator it = data.begin();
1311 std::vector< CVector< double > * > OldData = data;
1312 std::vector< CVector< double > * >::iterator itOld = OldData.begin();
1313 std::vector< CVector< double > * >::iterator endOld = OldData.end();
1315 size_t oldSize = (*it)->size();
1316 size_t newSize = 2 * (*it)->size();
1320 for (; itOld != endOld; ++itOld, ++it)
1323 memcpy((*it)->array(), (*itOld)->array(), oldSize *
sizeof(double));
1332 for (; itCurves != endCurves; ++itCurves, ++k)
1334 if ((
size_t)(*itCurves)->getActivity() == activity)
1336 std::vector< CVector< double > * > & data =
mData[activity];
1338 switch ((*itCurves)->getType())
1341 (*itCurves)->reallocatedData(data[
mDataIndex[k][0].second],
1346 (*itCurves)->reallocatedData(data[
mDataIndex[k][0].second],
1352 (*itCurves)->reallocatedData(data[
mDataIndex[k][0].second],
1364 for (itOld = OldData.begin(); itOld != endOld; ++itOld)
1401 for (ItemActivity = 0; ItemActivity <
ActivitySize; ItemActivity++)
1402 if (
mDataSize[ItemActivity] != 0)
break;
1405 if (ItemActivity == ActivitySize)
return true;
1409 if (!fs.good())
return false;
1414 std::vector< std::vector < const CCopasiObject * > >::const_iterator itX;
1415 std::vector< std::vector < const CCopasiObject * > >::const_iterator endX =
1418 std::vector < const CCopasiObject * >::const_iterator it;
1419 std::vector < const CCopasiObject * >::const_iterator end;
1422 for (it = itX->begin(), end = itX->end(); it != end; ++it)
1424 fs << (*it)->getObjectDisplayName() <<
"\t";
1426 fs <<
"Not found\t";
1431 std::vector< CVector< double > * > Data;
1434 std::vector< CVector< double > * >::const_iterator itData;
1435 std::vector< CVector< double > * >::const_iterator endData = Data.end();
1437 std::vector< size_t > Offset;
1438 std::vector< size_t >::const_iterator itOffset;
1440 Offset.resize(imax);
1442 std::map< Activity, std::map< const CCopasiObject *, size_t > >::iterator itActivity;
1443 std::map< const CCopasiObject *, size_t >::iterator itObject;
1448 for (it = itX->begin(), end = itX->end(); it != end; ++it, ++i)
1451 (itObject = itActivity->second.find(*it)) != itActivity->second.end())
1458 (itObject = itActivity->second.find(*it)) != itActivity->second.end())
1465 (itObject = itActivity->second.find(*it)) != itActivity->second.end())
1472 (itObject = itActivity->second.find(*it)) != itActivity->second.end())
1483 for (itData = Data.begin(); itData != endData; ++itData)
1485 if (*itData) fs << (**itData)[i];
1498 for (it = itX->begin(), end = itX->end(); it != end; ++it, ++i)
1501 (itObject = itActivity->second.find(*it)) != itActivity->second.end())
1509 (itObject = itActivity->second.find(*it)) != itActivity->second.end())
1517 (itObject = itActivity->second.find(*it)) != itActivity->second.end())
1525 (itObject = itActivity->second.find(*it)) != itActivity->second.end())
1537 for (itData = Data.begin(), itOffset = Offset.begin(); itData != endData; ++itData)
1539 if (*itData) fs << (**itData)[i + *itOffset];
1552 for (it = itX->begin(), end = itX->end(); it != end; ++it, ++i)
1555 (itObject = itActivity->second.find(*it)) != itActivity->second.end())
1563 (itObject = itActivity->second.find(*it)) != itActivity->second.end())
1571 (itObject = itActivity->second.find(*it)) != itActivity->second.end())
1579 (itObject = itActivity->second.find(*it)) != itActivity->second.end())
1591 for (itData = Data.begin(), itOffset = Offset.begin(); itData != endData; ++itData)
1593 if (*itData) fs << (**itData)[i + *itOffset];
1603 bool FirstHistogram =
true;
1604 size_t HistogramIndex = 0;
1609 for (; itCurves != endCurves; ++itCurves)
1615 fs <<
"\n# The histograms: \n";
1616 FirstHistogram =
false;
1627 size_t i, imax = pData->
size();
1629 for (i = 0; i < imax; ++i)
1631 fs << pData->
x(i) <<
"\t" << pData->
y(i) <<
"\n";
1638 if (!fs.good())
return false;
1645 item->setVisible(on);
1646 item->setItemAttribute(QwtPlotItem::AutoScale, on);
1647 QWidget *w = legend()->find(item);
1649 if (w && w->inherits(
"QwtLegendItem"))
1650 static_cast< QwtLegendItem * >(w)->setChecked(on);
1658 std::map< std::string, C2DPlotCurve * >::iterator it =
mCurveMap.begin();
1659 std::map< std::string, C2DPlotCurve * >::iterator end =
mCurveMap.end();
1661 for (; it != end; ++it)
1663 it->second->setVisible(visibility);
1664 it->second->setItemAttribute(QwtPlotItem::AutoScale, visibility);
1665 QWidget *w = legend()->find(it->second);
1667 if (w && w->inherits(
"QwtLegendItem"))
1668 static_cast< QwtLegendItem * >(w)->setChecked(visibility);
1682 for (Activity = 0; Activity <
ActivitySize; Activity++)
1684 std::vector< CVector< double > * > & data =
mData[
Activity];
1687 for (i = 0, imax = data.size(); i < imax; i++)
1688 if (data[i] != NULL)
delete data[i];
1715 if (pObject == NULL)
return;
1717 std::string Units = pObject->
getUnits();
1733 QMutexLocker Locker(&
mMutex);
std::vector< size_t > mDataSize
CPlotItem::Type mCurveType
virtual size_t size() const
void resizeCurveData(const size_t &activity)
CVector< double > mHistoX
static C_FLOAT64 MissingValue
static QColor getColor(std::string colorstr, size_t colorindex)
CBandedGraphData & operator=(const CBandedGraphData &rhs)
virtual void separate(const Activity &activity)
void setIncrement(const C_FLOAT64 &increment)
CopasiPlot(QWidget *parent=NULL)
virtual ~CHistoCurveData()
const CPlotSpecification * mpPlotSpecification
virtual double x(size_t i) const
virtual size_t size() const
virtual size_t size() const
virtual QwtDoubleRect boundingRect() const
std::map< std::string, C2DPlotCurve * > mCurveMap
double y2(size_t i) const
void setSize(const size_t &size)
std::vector< CPlotDataChannelSpec > & getChannels()
size_t getNumChannels() const
void resize(size_t size, const bool ©=false)
void setCurvesVisibility(const bool &visibility)
double y1(size_t i) const
virtual double y(size_t i) const
std::vector< std::vector< const CCopasiObject * > > mSaveCurveObjects
virtual QwtDoubleRect boundingRect() const
CHistoCurveData & operator=(const CHistoCurveData &rhs)
std::vector< std::vector< bool > > mObjectInteger
virtual QwtData * copy() const
virtual QwtDoubleRect boundingRect() const
const CPlotItem::Type & getType() const
void setSize(const size_t &size)
void setAxisUnits(const C_INT32 &index, const CCopasiObject *pObject)
void updateCurves(const size_t &activity)
void reallocated(const CVector< double > *pX)
virtual double x(size_t i) const
virtual bool compile(std::vector< CCopasiContainer * > listOfContainer, const CCopasiDataModel *pDataModel)
const C_FLOAT64 & getIncrement() const
CVector< double > mHistoY
void reallocated(const CVector< double > *pX, const CVector< double > *pY)
std::vector< std::vector< std::pair< Activity, size_t > > > mDataIndex
std::map< Activity, std::map< const CCopasiObject *, size_t > > mObjectIndex
std::vector< std::vector< const C_FLOAT64 * > > mObjectValues
virtual double y(size_t i) const
void setDataSize(const size_t &size)
const CPlotItem::Type & getType() const
void reallocated(const CVector< double > *pX, const CVector< double > *pY1, const CVector< double > *pY2)
COutputInterface::Activity mActivity
static CCopasiTimeVariable getCurrentWallTime()
CVector< C2DPlotCurve * > mCurves
virtual QwtData * copy() const
std::vector< std::vector< CVector< double > * > > mData
const COutputInterface::Activity & getActivity() const
virtual double y(size_t i) const
std::map< C_INT32, C_INT32 > mMap
std::set< const CCopasiObject * > mObjects
std::vector< const CCopasiObject * > mSaveHistogramObjects
void setSize(const size_t &size)
C2DCurveData & operator=(const C2DCurveData &rhs)
void showCurve(QwtPlotItem *item, bool on)
virtual std::string getUnits() const
virtual void drawCurve(QPainter *painter, int style, const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to) const
const CCopasiVector< CPlotItem > & getItems() const
bool initFromSpec(const CPlotSpecification *plotspec)
virtual double x(size_t i) const
C_INT64 getMicroSeconds(const bool &bounded=false) const
virtual ~CBandedGraphData()
virtual QwtData * copy() const
bool saveData(const std::string &filename)
virtual void * getValuePointer() const
static CLocaleString fromUtf8(const std::string &utf8)
const std::string & getTitle() const
void reallocatedData(const CVector< double > *pX, const CVector< double > *pY, const CVector< double > *pY2=0)
virtual size_t size() const
CCopasiObject * ObjectFromName(const std::vector< CCopasiContainer * > &listOfContainer, const CCopasiObjectName &CN) const
const COutputInterface::Activity & getActivity() const
virtual void output(const Activity &activity)
void myDrawLines(QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to) const
virtual void drawSymbols(QPainter *painter, const QwtSymbol &symbol, const QwtScaleMap &xMap, const QwtScaleMap &yMap, int from, int to) const
CCopasiTimeVariable mNextPlotTime