Skip to content

Commit

Permalink
Fixes #2401 plots lost during clone
Browse files Browse the repository at this point in the history
  • Loading branch information
msevestre committed Nov 14, 2022
1 parent 8668d38 commit 09ac3fd
Show file tree
Hide file tree
Showing 10 changed files with 105 additions and 76 deletions.
1 change: 0 additions & 1 deletion src/PKSim.Core/Chart/IPKSimChartFactory.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using System;
using OSPSuite.Core.Chart;
using OSPSuite.Core.Chart.Simulations;
using PKSim.Core.Model;

namespace PKSim.Core.Chart
Expand Down
10 changes: 0 additions & 10 deletions src/PKSim.Core/Chart/ISimulationChart.cs

This file was deleted.

9 changes: 9 additions & 0 deletions src/PKSim.Core/Chart/SimulationTimeProfileChart.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using OSPSuite.Core.Chart;

namespace PKSim.Core.Chart
{
public class SimulationTimeProfileChart : AnalysisChart
{

}
}
50 changes: 0 additions & 50 deletions src/PKSim.Core/Chart/SummaryChart.cs

This file was deleted.

5 changes: 4 additions & 1 deletion src/PKSim.Core/Model/IndividualSimulation.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.Linq;
using OSPSuite.Core.Chart;
using OSPSuite.Core.Domain;
using OSPSuite.Core.Domain.Data;
using OSPSuite.Core.Domain.Services;
Expand All @@ -13,7 +14,6 @@ namespace PKSim.Core.Model
public class IndividualSimulation : Simulation
{
private DataRepository _dataRepository;
public virtual IEnumerable<SimulationTimeProfileChart> TimeProfileAnalyses => Analyses.OfType<SimulationTimeProfileChart>();
public Cache<string, double?> AucDDI { get; } = new Cache<string, double?>(onMissingKey: x => null);
public Cache<string, double?> AucIV { get; } = new Cache<string, double?>(onMissingKey: x => null);
public Cache<string, double?> CMaxDDI { get; } = new Cache<string, double?>(onMissingKey: x => null);
Expand All @@ -33,8 +33,11 @@ public virtual DataRepository DataRepository
}

public override DataRepository ResultsDataRepository => _dataRepository;

public override bool HasResults => !DataRepository.IsNull() && DataRepository.Any();

public virtual IEnumerable<AnalysisChart> ChartAnalyses => Analyses.OfType<AnalysisChart>();

public int IndividualId => Results.AllIndividualIds().FirstOrDefault();

public override TBuildingBlock BuildingBlock<TBuildingBlock>()
Expand Down
4 changes: 2 additions & 2 deletions src/PKSim.Infrastructure/Services/ChartTemplatingTask.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,14 +90,14 @@ private void addObservedDataToChart(IChartEditorPresenter chartEditorPresenter,
allObservedDataColumnsToAdd.Each(x => AddCurveForColumnWithOptionsFromSourceCurve(chartEditorPresenter, x.column, x.curve));
}

public SimulationTimeProfileChart CloneChart(SimulationTimeProfileChart originalChart, IndividualSimulation simulation)
public T CloneChart<T>(T originalChart, IndividualSimulation simulation) where T: AnalysisChart
{
var clonedChart = _chartFactory.Create(originalChart.GetType()).WithName(originalChart.Name);
clonedChart.UpdatePropertiesFrom(originalChart, _cloneManager);

initializeFromTemplate(originalChart, clonedChart, simulation);

return clonedChart.DowncastTo<SimulationTimeProfileChart>();
return clonedChart.DowncastTo<T>();
}

private void initializeFromTemplate(CurveChart originalChart, CurveChart clonedChart, IndividualSimulation simulation)
Expand Down
6 changes: 3 additions & 3 deletions src/PKSim.Presentation/Services/IChartTemplatingTask.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
using System;
using System.Collections.Generic;
using PKSim.Core.Chart;
using PKSim.Core.Model;
using OSPSuite.Core.Chart;
using OSPSuite.Core.Domain;
using OSPSuite.Core.Domain.Data;
using OSPSuite.Presentation.Presenters.Charts;
using PKSim.Core.Model;

namespace PKSim.Presentation.Services
{
Expand All @@ -15,7 +15,7 @@ public interface IChartTemplatingTask : OSPSuite.Presentation.Services.Charts.IC
/// </summary>
/// <param name="originalChart">original chart to clone</param>
/// <param name="simulation">Simulation containing the chart to clone</param>
SimulationTimeProfileChart CloneChart(SimulationTimeProfileChart originalChart, IndividualSimulation simulation);
T CloneChart<T>(T originalChart, IndividualSimulation simulation) where T : AnalysisChart;

void InitFromTemplate(CurveChart chart, IChartEditorAndDisplayPresenter chartEditorPresenter,
IReadOnlyCollection<DataColumn> allAvailableColumns, IReadOnlyCollection<IndividualSimulation> simulations, Func<DataColumn, string> nameForColumn, CurveChartTemplate defaultChartTemplate = null);
Expand Down
3 changes: 2 additions & 1 deletion src/PKSim.Presentation/Services/SimulationResultsTask.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,8 @@ private void cloneIndividualSimulationResults(IndividualSimulation sourceSimulat
//Step 2 - update the data repository based on the results created above
targetSimulation.DataRepository = _dataRepositoryCreator.CreateResultsFor(targetSimulation);

sourceSimulation.TimeProfileAnalyses.Each(c => targetSimulation.AddAnalysis(_chartTemplatingTask.CloneChart(c, targetSimulation)));
//Step 3 - update all chart analyses
sourceSimulation.ChartAnalyses.Each(c => targetSimulation.AddAnalysis(_chartTemplatingTask.CloneChart(c, targetSimulation)));
}

private void copyResultsForIndividualSimulation(IndividualSimulation sourceSimulation, IndividualSimulation targetSimulation)
Expand Down
28 changes: 20 additions & 8 deletions src/PKSim.Presentation/Views/Charts/PKSimChartFactory.cs
Original file line number Diff line number Diff line change
@@ -1,25 +1,30 @@
using System;
using OSPSuite.Utility.Container;
using OSPSuite.Utility.Extensions;
using PKSim.Core.Chart;
using PKSim.Core.Model;
using PKSim.Presentation.Services;
using OSPSuite.Core.Chart;
using OSPSuite.Core.Chart.Simulations;
using OSPSuite.Core.Domain.Mappers;
using OSPSuite.Core.Domain.Services;
using OSPSuite.Core.Domain.UnitSystem;
using OSPSuite.Presentation;
using OSPSuite.Presentation.Services;
using OSPSuite.Core.Chart.Simulations;
using OSPSuite.Utility.Container;
using OSPSuite.Utility.Extensions;
using PKSim.Core.Chart;
using PKSim.Core.Model;
using PKSim.Presentation.Services;

namespace PKSim.Presentation.Views.Charts
{
public class PKSimChartFactory : ChartFactory, IPKSimChartFactory
{
private readonly IChartTask _chartTask;

public PKSimChartFactory(IContainer container, IIdGenerator idGenerator, IPresentationUserSettings presentationUserSettings,
IDimensionFactory dimensionFactory, ITableFormulaToDataRepositoryMapper dataRepositoryMapper, IChartTask chartTask)
public PKSimChartFactory(
IContainer container,
IIdGenerator idGenerator,
IPresentationUserSettings presentationUserSettings,
IDimensionFactory dimensionFactory,
ITableFormulaToDataRepositoryMapper dataRepositoryMapper,
IChartTask chartTask)
: base(container, idGenerator, presentationUserSettings, dimensionFactory, dataRepositoryMapper)
{
_chartTask = chartTask;
Expand All @@ -43,9 +48,16 @@ public ChartWithObservedData Create(Type chartType)
if (chartType.IsAnImplementationOf<SimulationTimeProfileChart>())
return Create<SimulationTimeProfileChart>();

if (chartType.IsAnImplementationOf<SimulationPredictedVsObservedChart>())
return Create<SimulationPredictedVsObservedChart>();

if (chartType.IsAnImplementationOf<SimulationResidualVsTimeChart>())
return Create<SimulationResidualVsTimeChart>();

if (chartType.IsAnImplementationOf<IndividualSimulationComparison>())
return Create<IndividualSimulationComparison>();

//This call is important here as it will ensure that we are implementing missing plots in the future
throw new ArgumentOutOfRangeException(nameof(chartType));
}
}
Expand Down
65 changes: 65 additions & 0 deletions tests/PKSim.Tests/Presentation/PKSimChartFactorySpecs.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
using FakeItEasy;
using OSPSuite.BDDHelper;
using OSPSuite.BDDHelper.Extensions;
using OSPSuite.Core.Chart.Simulations;
using OSPSuite.Core.Domain.Mappers;
using OSPSuite.Core.Domain.Services;
using OSPSuite.Core.Domain.UnitSystem;
using OSPSuite.Presentation;
using OSPSuite.Utility.Container;
using PKSim.Core.Chart;
using PKSim.Presentation.Services;
using PKSim.Presentation.Views.Charts;

namespace PKSim.Presentation
{
public abstract class concern_for_PKSimChartFactory : ContextSpecification<IPKSimChartFactory>
{
private IContainer _container;
private IIdGenerator _idGenerator;
private IPresentationUserSettings _presentationUserSettings;
private IDimensionFactory _dimensionFactory;
private ITableFormulaToDataRepositoryMapper _dataRepositoryMapper;
private IChartTask _chartTask;

protected override void Context()
{
_container = A.Fake<IContainer>();
_idGenerator = A.Fake<IIdGenerator>();
_presentationUserSettings = A.Fake<IPresentationUserSettings>();
_dimensionFactory = A.Fake<IDimensionFactory>();
_dataRepositoryMapper = A.Fake<ITableFormulaToDataRepositoryMapper>();
_chartTask = A.Fake<IChartTask>();


sut = new PKSimChartFactory(_container, _idGenerator, _presentationUserSettings, _dimensionFactory, _dataRepositoryMapper, _chartTask);
}
}

public class When_creating_a_chart_by_type : concern_for_PKSimChartFactory
{
[Observation]
public void should_be_able_to_create_for_time_profile_chart()
{
sut.Create(typeof(SimulationTimeProfileChart)).ShouldNotBeNull();
}

[Observation]
public void should_be_able_to_create_for_simulation_predicted_vs_observed()
{
sut.Create(typeof(SimulationPredictedVsObservedChart)).ShouldNotBeNull();
}

[Observation]
public void should_be_able_to_create_for_simulation_residual_vs_time()
{
sut.Create(typeof(SimulationResidualVsTimeChart)).ShouldNotBeNull();
}

[Observation]
public void should_be_able_to_create_for_individual_simulation_comparison()
{
sut.Create(typeof(IndividualSimulationComparison)).ShouldNotBeNull();
}
}
}

0 comments on commit 09ac3fd

Please sign in to comment.