From 45f033f8a3ac24deba30924d5fcc2d49f8625200 Mon Sep 17 00:00:00 2001 From: Damien Date: Sun, 11 Jan 2015 17:31:09 +0100 Subject: [PATCH] CPPlot: Some model testing --- src/CPPlot.cpp | 16 +++++ src/ExtendedCriticalPower.cpp | 110 +++++++++++++++++----------------- src/ExtendedCriticalPower.h | 74 +++++++++++------------ src/PDModel.cpp | 3 +- src/RideSummaryWindow.cpp | 3 - src/RideSummaryWindow.h | 2 +- 6 files changed, 112 insertions(+), 96 deletions(-) diff --git a/src/CPPlot.cpp b/src/CPPlot.cpp index 2d494d0d4..9d9cb1bf3 100644 --- a/src/CPPlot.cpp +++ b/src/CPPlot.cpp @@ -327,6 +327,22 @@ CPPlot::initModel() pdModel->setMinutes(true); // we're minutes here ... pdModel->setData(bestsCache->meanMaxArray(rideSeries)); } + + #if GC_HAVE_MODEL_LABS + // Test + ExtendedCriticalPower *ecp = new ExtendedCriticalPower(context); + + TestModel model = ecp->deriveExtendedCP_6_3_Parameters(true, bestsCache, rideSeries, sanI1, sanI2, anI1, anI2, aeI1, aeI2, laeI1, laeI2); + QwtPlotCurve* plot = ecp->getPlotCurveForExtendedCP_6_3(model); + plot->attach(this); + bestsCurves.append(plot); + + model = ecp->deriveExtendedCP_5_3_Parameters(true, bestsCache, rideSeries, sanI1, sanI2, anI1, anI2, aeI1, aeI2, laeI1, laeI2); + plot = ecp->getPlotCurveForExtendedCP_5_3(model); + plot->attach(this); + bestsCurves.append(plot); + #endif + } // Plot the dashed line model curve according to the parameters diff --git a/src/ExtendedCriticalPower.cpp b/src/ExtendedCriticalPower.cpp index 4c91a85a3..4f9e52c7f 100644 --- a/src/ExtendedCriticalPower.cpp +++ b/src/ExtendedCriticalPower.cpp @@ -34,10 +34,10 @@ ExtendedCriticalPower::~ExtendedCriticalPower() { } -Model_eCP +TestModel ExtendedCriticalPower::deriveExtendedCP_2_3_Parameters(RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2) { - Model_eCP model; + TestModel model; model.version = "eCP v2.3"; // bounds on anaerobic interval in minutes @@ -254,7 +254,7 @@ ExtendedCriticalPower::deriveExtendedCP_2_3_Parameters(RideFileCache *bests, Rid } QwtPlotCurve* -ExtendedCriticalPower::getPlotCurveForExtendedCP_2_3(Model_eCP model) +ExtendedCriticalPower::getPlotCurveForExtendedCP_2_3(TestModel model) { const int extendedCurve2_points = 1000; @@ -282,10 +282,10 @@ ExtendedCriticalPower::getPlotCurveForExtendedCP_2_3(Model_eCP model) return extendedCPCurve2; } -Model_eCP +TestModel ExtendedCriticalPower::deriveExtendedCP_4_3_Parameters(bool usebest, RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2) { - Model_eCP model; + TestModel model; model.version = "eCP v4.3"; // bounds on anaerobic interval in minutes @@ -530,10 +530,10 @@ ExtendedCriticalPower::deriveExtendedCP_4_3_Parameters(bool usebest, RideFileCac return model; } -Model_eCP +TestModel ExtendedCriticalPower::deriveExtendedCP_4_3_ParametersForBest(double best5s, double best1min, double best5min, double best1hour) { - Model_eCP model; + TestModel model; // initial estimate of tau model.paa = 300; @@ -609,7 +609,7 @@ ExtendedCriticalPower::deriveExtendedCP_4_3_ParametersForBest(double best5s, dou } QwtPlotCurve* -ExtendedCriticalPower::getPlotCurveForExtendedCP_4_3(Model_eCP model) +ExtendedCriticalPower::getPlotCurveForExtendedCP_4_3(TestModel model) { //qDebug() <<"getPlotCurveForExtendedCP_4_3()"; //qDebug() <<"Model eCP(4.3) " << "paa" << model.paa << "ecp" << model.ecp << "etau" << model.etau << "paa_dec" << model.paa_dec << "ecp_del" << model.ecp_del << "ecp_dec" << model.ecp_dec ; @@ -641,7 +641,7 @@ ExtendedCriticalPower::getPlotCurveForExtendedCP_4_3(Model_eCP model) } QwtPlotCurve* -ExtendedCriticalPower::getPlotLevelForExtendedCP_4_3(Model_eCP model) +ExtendedCriticalPower::getPlotLevelForExtendedCP_4_3(TestModel model) { const int extendedCurve2_points = 20; @@ -705,7 +705,7 @@ ExtendedCriticalPower::getPlotLevelForExtendedCP_4_3(Model_eCP model) } QwtPlotMarker* -ExtendedCriticalPower::getPlotMarkerForExtendedCP(Model_eCP model) +ExtendedCriticalPower::getPlotMarkerForExtendedCP(TestModel model) { QwtPlotMarker* extendedCurveTitle2 = new QwtPlotMarker(); QString extendedCurve2_title; @@ -719,7 +719,7 @@ ExtendedCriticalPower::getPlotMarkerForExtendedCP(Model_eCP model) } QwtPlotCurve* -ExtendedCriticalPower::getPlotCurveForExtendedCP_4_3_WSecond(Model_eCP model) +ExtendedCriticalPower::getPlotCurveForExtendedCP_4_3_WSecond(TestModel model) { const int extendedCurve2_points = 1000; @@ -748,7 +748,7 @@ ExtendedCriticalPower::getPlotCurveForExtendedCP_4_3_WSecond(Model_eCP model) } QwtPlotCurve* -ExtendedCriticalPower::getPlotCurveForExtendedCP_4_3_WPrime(Model_eCP model) +ExtendedCriticalPower::getPlotCurveForExtendedCP_4_3_WPrime(TestModel model) { const int extendedCurve2_points = 1000; @@ -777,7 +777,7 @@ ExtendedCriticalPower::getPlotCurveForExtendedCP_4_3_WPrime(Model_eCP model) } QwtPlotCurve* -ExtendedCriticalPower::getPlotCurveForExtendedCP_4_3_CP(Model_eCP model) +ExtendedCriticalPower::getPlotCurveForExtendedCP_4_3_CP(TestModel model) { const int extendedCurve2_points = 1000; @@ -808,7 +808,7 @@ ExtendedCriticalPower::getPlotCurveForExtendedCP_4_3_CP(Model_eCP model) QwtPlotCurve* -ExtendedCriticalPower::getPlotCurveForExtendedCP_4_3_WPrime_CP(Model_eCP model) +ExtendedCriticalPower::getPlotCurveForExtendedCP_4_3_WPrime_CP(TestModel model) { const int extendedCurve2_points = 1000; @@ -836,27 +836,27 @@ ExtendedCriticalPower::getPlotCurveForExtendedCP_4_3_WPrime_CP(Model_eCP model) return extendedCPCurve2; } -Model_eCP +TestModel ExtendedCriticalPower::deriveExtendedCP_5_3_Parameters(bool usebest, RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2) { - Model_eCP model; + TestModel model; model.version = "eCP v5.3"; // bounds on anaerobic interval in minutes - const double t1 = sanI1; - const double t2 = sanI2; + const double t1 = sanI1 / 60.0; + const double t2 = sanI2 / 60.0; // bounds on anaerobic interval in minutes - const double t3 = anI1; - const double t4 = anI2; + const double t3 = anI1 / 60.0; + const double t4 = anI2 / 60.0; // bounds on aerobic interval in minutes - const double t5 = aeI1; - const double t6 = aeI2; + const double t5 = aeI1 / 60.0; + const double t6 = aeI2 / 60.0; // bounds on long aerobic interval in minutes - const double t7 = laeI1; - const double t8 = laeI2; + const double t7 = laeI1 / 60.0; + const double t8 = laeI2 / 60.0; // bounds of these time values in the data int i1, i2, i3, i4, i5, i6, i7, i8; @@ -951,6 +951,8 @@ ExtendedCriticalPower::deriveExtendedCP_5_3_Parameters(bool usebest, RideFileCac // loop to convergence int iteration = 0; + + qDebug() << "start iteration"; do { if (iteration ++ > max_loops) { qDebug()<<"Maximum number of loops exceeded in ecp2 model"; @@ -1075,21 +1077,21 @@ ExtendedCriticalPower::deriveExtendedCP_5_3_Parameters(bool usebest, RideFileCac (fabs(model.ecp_dec - ecp_dec_prev) > ecp_dec_delta_max) ); - //qDebug() << iteration << "iterations"; + qDebug() << iteration << "iterations"; model.pMax = model.paa*(1.20-0.20*exp(-1*(1/60.0)))*exp(model.paa_dec*(1/60.0)) + model.ecp * (1-exp(model.tau_del*(1/60.0))) * (1-exp(model.ecp_del*(1/60.0))) * (1+model.ecp_dec*exp(model.ecp_dec_del/(1/60.0))) * ( 1 + model.etau/(1/60.0)); model.mmp60 = model.paa*(1.20-0.20*exp(-1*60.0))*exp(model.paa_dec*(60.0)) + model.ecp * (1-exp(model.tau_del*(60.0))) * (1-exp(model.ecp_del*60.0)) * (1+model.ecp_dec*exp(model.ecp_dec_del/60.0)) * ( 1 + model.etau/(60.0)); - qDebug() <<"eCP(5.3) " << "paa" << model.paa << "ecp" << model.ecp << "etau" << model.etau << "paa_dec" << model.paa_dec << "ecp_del" << model.ecp_del << "ecp_dec" << model.ecp_dec << "ecp_dec_del" << model.ecp_dec_del; - qDebug() <<"eCP(5.3) " << "pmax" << model.pMax << "mmp60" << model.mmp60; + qDebug() <<"-> eCP(5.3) " << "paa" << model.paa << "ecp" << model.ecp << "etau" << model.etau << "paa_dec" << model.paa_dec << "ecp_del" << model.ecp_del << "ecp_dec" << model.ecp_dec << "ecp_dec_del" << model.ecp_dec_del; + qDebug() <<"-> eCP(5.3) " << "pmax" << model.pMax << "mmp60" << model.mmp60; return model; } -Model_eCP +TestModel ExtendedCriticalPower::deriveExtendedCP_5_3_ParametersForBest(double best5s, double best1min, double best5min, double best1hour) { - Model_eCP model; + TestModel model; model.version = "eCP v5.3"; // initial estimate of tau @@ -1158,7 +1160,7 @@ ExtendedCriticalPower::deriveExtendedCP_5_3_ParametersForBest(double best5s, dou } QwtPlotCurve* -ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3(Model_eCP model) +ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3(TestModel model) { const int extendedCurve2_points = 1000; @@ -1177,7 +1179,7 @@ ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3(Model_eCP model) QwtPlotCurve *extendedCPCurve2 = new QwtPlotCurve("eCP_5_3"); if (appsettings->value(NULL, GC_ANTIALIAS, true).toBool() == true) extendedCPCurve2->setRenderHint(QwtPlotItem::RenderAntialiased); - QPen e2pen(GColor(CCP)); // Qt::cyan + QPen e2pen(Qt::cyan); // Qt::cyan GColor(CCP) e2pen.setWidth(1); e2pen.setStyle(Qt::DashLine); extendedCPCurve2->setPen(e2pen); @@ -1187,7 +1189,7 @@ ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3(Model_eCP model) } QwtPlotCurve* -ExtendedCriticalPower::getPlotLevelForExtendedCP_5_3(Model_eCP model) +ExtendedCriticalPower::getPlotLevelForExtendedCP_5_3(TestModel model) { const int extendedCurve2_points = 1000; @@ -1216,7 +1218,7 @@ ExtendedCriticalPower::getPlotLevelForExtendedCP_5_3(Model_eCP model) } QwtPlotIntervalCurve* -ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3_WSecond(Model_eCP model, bool) +ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3_WSecond(TestModel model, bool) { const int extendedCurve2_points = 1000; @@ -1258,7 +1260,7 @@ ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3_WSecond(Model_eCP model, bo } QwtPlotIntervalCurve* -ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3_WPrime(Model_eCP model, bool stacked) +ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3_WPrime(TestModel model, bool stacked) { const int extendedCurve2_points = 1000; @@ -1302,7 +1304,7 @@ ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3_WPrime(Model_eCP model, boo } QwtPlotIntervalCurve* -ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3_CP(Model_eCP model, bool stacked) +ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3_CP(TestModel model, bool stacked) { const int extendedCurve2_points = 1000; @@ -1351,27 +1353,27 @@ ExtendedCriticalPower::getPlotCurveForExtendedCP_5_3_CP(Model_eCP model, bool st * Version 6 * **************************************************/ -Model_eCP +TestModel ExtendedCriticalPower::deriveExtendedCP_6_3_Parameters(bool usebest, RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2) { - Model_eCP model; + TestModel model; model.version = "eCP v6.3"; // bounds on anaerobic interval in minutes - const double t1 = sanI1; - const double t2 = sanI2; + const double t1 = sanI1 / 60.0; + const double t2 = sanI2 / 60.0; // bounds on anaerobic interval in minutes - const double t3 = anI1; - const double t4 = anI2; + const double t3 = anI1 / 60.0; + const double t4 = anI2 / 60.0; // bounds on aerobic interval in minutes - const double t5 = aeI1; - const double t6 = aeI2; + const double t5 = aeI1 / 60.0; + const double t6 = aeI2 / 60.0; // bounds on long aerobic interval in minutes - const double t7 = laeI1; - const double t8 = laeI2; + const double t7 = laeI1 / 60.0; + const double t8 = laeI2 / 60.0; // bounds of these time values in the data int i1, i2, i3, i4, i5, i6, i7, i8; @@ -1595,14 +1597,14 @@ ExtendedCriticalPower::deriveExtendedCP_6_3_Parameters(bool usebest, RideFileCac model.pMax = model.paa*(1.10-(1.10-1)*exp(-8*(1/60.0)))*exp(model.paa_dec*(1/60.0)) + model.ecp * (1+model.ecp_dec*exp(model.ecp_dec_del/(1/60.0))) * ( 1 * (1-exp(model.ecp_del*(1/60.0))) + pow((1-exp(model.tau_del*(1/60.0))),2) * model.etau/(1/60.0)); model.mmp60 = model.paa*(1.10-(1.10-1)*exp(-8*60.0))*exp(model.paa_dec*(60.0)) + model.ecp * (1+model.ecp_dec*exp(model.ecp_dec_del/60.0)) * ( 1 * (1-exp(model.ecp_del*60.0)) + pow((1-exp(model.tau_del*(60.0))),2) * model.etau/(60.0)); - qDebug() <<"eCP(6.3) " << "paa" << model.paa << "ecp" << model.ecp << "etau" << model.etau << "paa_dec" << model.paa_dec << "ecp_del" << model.ecp_del << "ecp_dec" << model.ecp_dec << "ecp_dec_del" << model.ecp_dec_del; - qDebug() <<"eCP(6.3) " << "pmax" << model.pMax << "mmp60" << model.mmp60; + qDebug() <<"-> eCP(6.3) " << "paa" << model.paa << "ecp" << model.ecp << "etau" << model.etau << "paa_dec" << model.paa_dec << "ecp_del" << model.ecp_del << "ecp_dec" << model.ecp_dec << "ecp_dec_del" << model.ecp_dec_del; + qDebug() <<"-> eCP(6.3) " << "pmax" << model.pMax << "mmp60" << model.mmp60; return model; } QwtPlotCurve* -ExtendedCriticalPower::getPlotCurveForExtendedCP_6_3(Model_eCP model) +ExtendedCriticalPower::getPlotCurveForExtendedCP_6_3(TestModel model) { const int extendedCurve2_points = 1000; @@ -1621,7 +1623,7 @@ ExtendedCriticalPower::getPlotCurveForExtendedCP_6_3(Model_eCP model) QwtPlotCurve *extendedCPCurve2 = new QwtPlotCurve("eCP_6_3"); if (appsettings->value(NULL, GC_ANTIALIAS, true).toBool() == true) extendedCPCurve2->setRenderHint(QwtPlotItem::RenderAntialiased); - QPen e2pen(Qt::cyan); + QPen e2pen(Qt::blue); e2pen.setWidth(1); e2pen.setStyle(Qt::DashLine); extendedCPCurve2->setPen(e2pen); @@ -1631,7 +1633,7 @@ ExtendedCriticalPower::getPlotCurveForExtendedCP_6_3(Model_eCP model) } QwtPlotIntervalCurve* -ExtendedCriticalPower::getPlotCurveForExtendedCP_6_3_WSecond(Model_eCP model, bool) +ExtendedCriticalPower::getPlotCurveForExtendedCP_6_3_WSecond(TestModel model, bool) { const int extendedCurve2_points = 1000; @@ -1671,7 +1673,7 @@ ExtendedCriticalPower::getPlotCurveForExtendedCP_6_3_WSecond(Model_eCP model, bo } QwtPlotIntervalCurve* -ExtendedCriticalPower::getPlotCurveForExtendedCP_6_3_WPrime(Model_eCP model, bool stacked) +ExtendedCriticalPower::getPlotCurveForExtendedCP_6_3_WPrime(TestModel model, bool stacked) { const int extendedCurve2_points = 1000; @@ -1713,7 +1715,7 @@ ExtendedCriticalPower::getPlotCurveForExtendedCP_6_3_WPrime(Model_eCP model, boo } QwtPlotIntervalCurve* -ExtendedCriticalPower::getPlotCurveForExtendedCP_6_3_CP(Model_eCP model, bool stacked) +ExtendedCriticalPower::getPlotCurveForExtendedCP_6_3_CP(TestModel model, bool stacked) { const int extendedCurve2_points = 1000; @@ -1771,10 +1773,10 @@ ExtendedCriticalPower::decimateData(QVector data) } }*/ -Model_eCP +TestModel ExtendedCriticalPower::deriveDanVeloclinicCP_Parameters(bool usebest, RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2) { - Model_eCP model; + TestModel model; model.version = "2 components (Dan v1)"; // bounds on anaerobic interval in minutes diff --git a/src/ExtendedCriticalPower.h b/src/ExtendedCriticalPower.h index f863d5e76..72e686f27 100644 --- a/src/ExtendedCriticalPower.h +++ b/src/ExtendedCriticalPower.h @@ -31,11 +31,11 @@ #include // Model -class Model_eCP +class TestModel //: public PDModel { public: - Model_eCP() : + TestModel() : version(""), paa(0), paa_dec(0), ecp(0), etau(0), ecp_del(0), tau_del(0), ecp_dec(0), ecp_dec_del(0), pMax(0), mmp60(0) {} @@ -94,65 +94,65 @@ class ExtendedCriticalPower ExtendedCriticalPower(Context *context); ~ExtendedCriticalPower(); - //Model_eCP deriveExtendedCPParameters(RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2); + //TestModel deriveExtendedCPParameters(RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2); /*Model_wsCP deriveWardSmithCPParameters(RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2); QwtPlotCurve* getPlotCurveForWScp(Model_wsCP athleteModeleWSCP);*/ - Model_eCP deriveExtendedCP_2_1_Parameters(RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2); - QwtPlotCurve* getPlotCurveForExtendedCP_2_1(Model_eCP athleteModeleCP2); - QwtPlotMarker* getPlotMarkerForExtendedCP_2_1(Model_eCP athleteModeleCP2); + TestModel deriveExtendedCP_2_1_Parameters(RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2); + QwtPlotCurve* getPlotCurveForExtendedCP_2_1(TestModel athleteModeleCP2); + QwtPlotMarker* getPlotMarkerForExtendedCP_2_1(TestModel athleteModeleCP2); - Model_eCP deriveExtendedCP_2_3_Parameters(RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2); - //Model_eCP deriveExtendedCP_2_3_ParametersForBest(double best5s, double best1min, double best5min, double best60min); - QwtPlotCurve* getPlotCurveForExtendedCP_2_3(Model_eCP model); + TestModel deriveExtendedCP_2_3_Parameters(RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2); + //TestModel deriveExtendedCP_2_3_ParametersForBest(double best5s, double best1min, double best5min, double best60min); + QwtPlotCurve* getPlotCurveForExtendedCP_2_3(TestModel model); - Model_eCP deriveExtendedCP_3_1_Parameters(RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2); - QwtPlotCurve* getPlotCurveForExtendedCP_3_1(Model_eCP athleteModeleCP2); + TestModel deriveExtendedCP_3_1_Parameters(RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2); + QwtPlotCurve* getPlotCurveForExtendedCP_3_1(TestModel athleteModeleCP2); - Model_eCP deriveExtendedCP_4_1_Parameters(RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2); - QwtPlotCurve* getPlotCurveForExtendedCP_4_1(Model_eCP athleteModeleCP2); + TestModel deriveExtendedCP_4_1_Parameters(RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2); + QwtPlotCurve* getPlotCurveForExtendedCP_4_1(TestModel athleteModeleCP2); - Model_eCP deriveExtendedCP_4_2_Parameters(RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2); - QwtPlotCurve* getPlotCurveForExtendedCP_4_2(Model_eCP athleteModeleCP2); + TestModel deriveExtendedCP_4_2_Parameters(RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2); + QwtPlotCurve* getPlotCurveForExtendedCP_4_2(TestModel athleteModeleCP2); - Model_eCP deriveExtendedCP_4_3_Parameters(bool usebest, RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2); - Model_eCP deriveExtendedCP_4_3_ParametersForBest(double best5s, double best1min, double best5min, double best60min); - QwtPlotCurve* getPlotCurveForExtendedCP_4_3(Model_eCP athleteModeleCP2); - QwtPlotCurve* getPlotLevelForExtendedCP_4_3(Model_eCP athleteModeleCP2); + TestModel deriveExtendedCP_4_3_Parameters(bool usebest, RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2); + TestModel deriveExtendedCP_4_3_ParametersForBest(double best5s, double best1min, double best5min, double best60min); + QwtPlotCurve* getPlotCurveForExtendedCP_4_3(TestModel athleteModeleCP2); + QwtPlotCurve* getPlotLevelForExtendedCP_4_3(TestModel athleteModeleCP2); - QwtPlotCurve* getPlotCurveForExtendedCP_4_3_WSecond(Model_eCP athleteModeleCP2); - QwtPlotCurve* getPlotCurveForExtendedCP_4_3_WPrime(Model_eCP athleteModeleCP2); - QwtPlotCurve* getPlotCurveForExtendedCP_4_3_CP(Model_eCP athleteModeleCP2); - QwtPlotCurve* getPlotCurveForExtendedCP_4_3_WPrime_CP(Model_eCP athleteModeleCP2); + QwtPlotCurve* getPlotCurveForExtendedCP_4_3_WSecond(TestModel athleteModeleCP2); + QwtPlotCurve* getPlotCurveForExtendedCP_4_3_WPrime(TestModel athleteModeleCP2); + QwtPlotCurve* getPlotCurveForExtendedCP_4_3_CP(TestModel athleteModeleCP2); + QwtPlotCurve* getPlotCurveForExtendedCP_4_3_WPrime_CP(TestModel athleteModeleCP2); // Extended CP Model version 5 - Model_eCP deriveExtendedCP_5_3_Parameters(bool usebest, RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2); - QwtPlotCurve* getPlotCurveForExtendedCP_5_3(Model_eCP athleteModeleCP2); + TestModel deriveExtendedCP_5_3_Parameters(bool usebest, RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2); + QwtPlotCurve* getPlotCurveForExtendedCP_5_3(TestModel athleteModeleCP2); - Model_eCP deriveExtendedCP_5_3_ParametersForBest(double best5s, double best1min, double best5min, double best60min); - QwtPlotCurve* getPlotLevelForExtendedCP_5_3(Model_eCP athleteModeleCP2); + TestModel deriveExtendedCP_5_3_ParametersForBest(double best5s, double best1min, double best5min, double best60min); + QwtPlotCurve* getPlotLevelForExtendedCP_5_3(TestModel athleteModeleCP2); // Contributions - QwtPlotIntervalCurve* getPlotCurveForExtendedCP_5_3_WSecond(Model_eCP athleteModeleCP2, bool stacked); - QwtPlotIntervalCurve* getPlotCurveForExtendedCP_5_3_WPrime(Model_eCP athleteModeleCP2, bool stacked); - QwtPlotIntervalCurve* getPlotCurveForExtendedCP_5_3_CP(Model_eCP athleteModeleCP2, bool stacked); + QwtPlotIntervalCurve* getPlotCurveForExtendedCP_5_3_WSecond(TestModel athleteModeleCP2, bool stacked); + QwtPlotIntervalCurve* getPlotCurveForExtendedCP_5_3_WPrime(TestModel athleteModeleCP2, bool stacked); + QwtPlotIntervalCurve* getPlotCurveForExtendedCP_5_3_CP(TestModel athleteModeleCP2, bool stacked); // Extended CP Model version 6 - Model_eCP deriveExtendedCP_6_3_Parameters(bool usebest, RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2); - QwtPlotCurve* getPlotCurveForExtendedCP_6_3(Model_eCP athleteModeleCP2); + TestModel deriveExtendedCP_6_3_Parameters(bool usebest, RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2); + QwtPlotCurve* getPlotCurveForExtendedCP_6_3(TestModel athleteModeleCP2); // Contributions - QwtPlotIntervalCurve* getPlotCurveForExtendedCP_6_3_WSecond(Model_eCP athleteModeleCP2, bool stacked); - QwtPlotIntervalCurve* getPlotCurveForExtendedCP_6_3_WPrime(Model_eCP athleteModeleCP2, bool stacked); - QwtPlotIntervalCurve* getPlotCurveForExtendedCP_6_3_CP(Model_eCP athleteModeleCP2, bool stacked); + QwtPlotIntervalCurve* getPlotCurveForExtendedCP_6_3_WSecond(TestModel athleteModeleCP2, bool stacked); + QwtPlotIntervalCurve* getPlotCurveForExtendedCP_6_3_WPrime(TestModel athleteModeleCP2, bool stacked); + QwtPlotIntervalCurve* getPlotCurveForExtendedCP_6_3_CP(TestModel athleteModeleCP2, bool stacked); // Marker for Model - QwtPlotMarker* getPlotMarkerForExtendedCP(Model_eCP athleteModeleCP2); + QwtPlotMarker* getPlotMarkerForExtendedCP(TestModel athleteModeleCP2); // Dan-Veloclinic Model - Model_eCP deriveDanVeloclinicCP_Parameters(bool usebest, RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2); + TestModel deriveDanVeloclinicCP_Parameters(bool usebest, RideFileCache *bests, RideFile::SeriesType series, double sanI1, double sanI2, double anI1, double anI2, double aeI1, double aeI2, double laeI1, double laeI2); diff --git a/src/PDModel.cpp b/src/PDModel.cpp index 38c8c7ae2..803ab5d56 100644 --- a/src/PDModel.cpp +++ b/src/PDModel.cpp @@ -516,7 +516,8 @@ double ExtendedModel::y(double t) const { // don't start at zero ! - t += (!minutes?1.00f:1/60.00f); + if (t == 0) + t += (!minutes?1.00f:1/60.00f); if (!minutes) t /= 60.00f; return paa*(1.20-0.20*exp(-1*double(t)))*exp(paa_dec*(double(t))) + ecp * (1-exp(tau_del*double(t))) * (1-exp(ecp_del*double(t))) * (1+ecp_dec*exp(ecp_dec_del/double(t))) * ( 1 + etau/(double(t))); diff --git a/src/RideSummaryWindow.cpp b/src/RideSummaryWindow.cpp index 0d2d89ba8..2b7105b75 100644 --- a/src/RideSummaryWindow.cpp +++ b/src/RideSummaryWindow.cpp @@ -80,9 +80,6 @@ RideSummaryWindow::RideSummaryWindow(Context *context, bool ridesummary) : #endif cl->addRow(new QLabel(tr("Date range")), dateSetting); - - // ecp model - ecp = new ExtendedCriticalPower(context); } QVBoxLayout *vlayout = new QVBoxLayout; diff --git a/src/RideSummaryWindow.h b/src/RideSummaryWindow.h index cfb7fa135..a68d06b7e 100644 --- a/src/RideSummaryWindow.h +++ b/src/RideSummaryWindow.h @@ -147,7 +147,7 @@ class RideSummaryWindow : public GcChartWindow RideFileCache *bestsCache; ExtendedCriticalPower *ecp; - Model_eCP cpModel; + TestModel cpModel; QString WPrimeString, CPString, FTPString, PMaxString; QString WPrimeStringWPK, CPStringWPK, FTPStringWPK, PMaxStringWPK;