Skip to content

Commit

Permalink
Fixes #2302 bug influx (#2327)
Browse files Browse the repository at this point in the history
* WIP #2302 add failing tests

* Update database

* Fixes #2302 bug influx

* Fixes #2302 bug influx

* Fixes #2310 remove global column

* Fixes #2310 remove global column

* Make test pass again

* Fixes #2302 bug influx
  • Loading branch information
msevestre authored Sep 12, 2022
1 parent 8e10dae commit 2ee6143
Show file tree
Hide file tree
Showing 27 changed files with 725 additions and 479 deletions.
182 changes: 88 additions & 94 deletions src/Db/Diff/PKSimDB_diff.txt

Large diffs are not rendered by default.

217 changes: 98 additions & 119 deletions src/Db/Dump/PKSimDB_dump.txt

Large diffs are not rendered by default.

Binary file modified src/Db/PKSimDB.sqlite
Binary file not shown.
3 changes: 2 additions & 1 deletion src/PKSim.Core/CoreConstants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -776,7 +776,8 @@ public static class ORM
public const string VIEW_SCHEMA_ITEMS = "VIEW_SCHEMA_ITEM_CONTAINERS";
public const string VIEW_OBSERVERS = "VIEW_OBSERVERS";
public const string VIEW_OBSERVER_DESCRIPTOR_CONDITIONS = "VIEW_OBSERVER_DESCRIPTOR_CONDITIONS";
public const string VIEW_INDIVIDUAL_ACTIVE_TRANSPORTS = "VIEW_INDIVIDUAL_ACTIVE_TRANSPORTS";
public const string VIEW_KNOWN_TRANSPORTER_CONTAINERS = "VIEW_KNOWN_TRANSPORTER_CONTAINERS";
public const string VIEW_KNOWN_TRANSPORTERS = "VIEW_KNOWN_TRANSPORTERS";
public const string VIEW_PROTEIN_SYNONYMS = "VIEW_PROTEIN_SYNONYMS";
public const string VIEW_PARAMETER_RHS = "VIEW_PARAMETER_RHS";
public const string VIEW_CALCULATION_METHODS = "VIEW_CALCULATION_METHODS";
Expand Down
19 changes: 8 additions & 11 deletions src/PKSim.Core/Model/TransporterContainerTemplate.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
using OSPSuite.Core.Domain;
using PKSim.Core.Snapshots.Services;

namespace PKSim.Core.Model
{
public class TransporterContainerTemplate : WithSynonyms
public class TransporterContainerTemplate
{
/// <summary>
/// Gene associated with the template
Expand All @@ -15,20 +16,16 @@ public class TransporterContainerTemplate : WithSynonyms
public string Species { get; set; }

/// <summary>
/// Organ where the transporter is defined
/// </summary>
public string OrganName { get; set; }

/// <summary>
/// Compartment of the organ named OrganName where the transporter is defined
/// Transporter type => Direction of transport
/// </summary>
public string CompartmentName { get; set; }
public TransportType TransportType { get; set; }

/// <summary>
/// Transporter type => Direction of transport
/// Organ where the transporter is defined
/// </summary>
public TransportType TransportType { get; set; }
public string ContainerName { get; set; }

public override string Name => Gene;
//Default membrane location of this specific transport. This will override the default definition for TransportType
public MembraneLocation MembraneLocation { get; set; }
}
}
24 changes: 24 additions & 0 deletions src/PKSim.Core/Model/TransporterTemplate.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using OSPSuite.Core.Domain;

namespace PKSim.Core.Model
{
public class TransporterTemplate : WithSynonyms
{
/// <summary>
/// Gene associated with the template
/// </summary>
public string Gene { get; set; }

/// <summary>
/// Species for which the template is defined
/// </summary>
public string Species { get; set; }

/// <summary>
/// Transporter type => Direction of transport
/// </summary>
public TransportType TransportType { get; set; }

public override string Name => Gene;
}
}
11 changes: 3 additions & 8 deletions src/PKSim.Core/Model/WithSynonyms.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,28 +8,23 @@ public abstract class WithSynonyms
{
private readonly List<string> _allSynonyms = new List<string>();


public void AddSynonym(string synonym)
{
_allSynonyms.Add(synonym);
}


public IReadOnlyList<string> Synonyms
{
get { return _allSynonyms; }
}
public IReadOnlyList<string> Synonyms => _allSynonyms;

public bool IsTemplateFor(string name)
{
return areSame(Name, name) || _allSynonyms.Any(s => areSame(s, name));
}

public abstract string Name { get; }
public abstract string Name { get; }

private bool areSame(string name1, string name2)
{
return string.Equals(name1, name2, StringComparison.OrdinalIgnoreCase);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,38 +8,12 @@ namespace PKSim.Core.Repositories
public interface ITransporterContainerTemplateRepository : IStartableRepository<TransporterContainerTemplate>
{
/// <summary>
/// Returns the default <see cref="TransportType"/> defined for a transporter named <paramref name="transporterName"/>
/// and for the species named <paramref name="speciesName"/>
/// </summary>
/// <param name="speciesName">Species where the transporter will be defined</param>
/// <param name="transporterName">Transporter name (e.g. user input)</param>
TransportType TransportTypeFor(string speciesName, string transporterName);

/// <summary>
/// Returns true if a template was defined for a transporter named <paramref name="transporterName"/> for the species named <paramref name="speciesName"/>
/// otherwise false;
/// </summary>
bool HasTransporterTemplateFor(string speciesName, string transporterName);

/// <summary>
/// Returns the default transporter templates defined for the concrete location <paramref name="containerName"/> and for a specific gene.
/// Returns the default transporter template container defined for the concrete location <paramref name="containerName"/> and for a specific gene.
/// </summary>
/// <param name="speciesName">Species where the transporter will be defined</param>
/// <param name="containerName">Concrete transporter location (e.g Kidney, Liver etc...)</param>
/// <param name="geneName">Specific gene for which templates should be returned</param>
IEnumerable<TransporterContainerTemplate> TransportersFor(string speciesName, string containerName, string geneName);

TransporterContainerTemplate TransporterContainerTemplateFor(string speciesName, string containerName, string geneName);

/// <summary>
/// Returns the default transporter templates defined for the concrete location <paramref name="containerName"/>
/// </summary>
/// <param name="speciesName">Species where the transporter will be defined</param>
/// <param name="containerName">Concrete transporter location (e.g Kidney, Liver etc...)</param>
IEnumerable<TransporterContainerTemplate> TransportersFor(string speciesName, string containerName);

/// <summary>
/// Returns the name of all transporters defined in the PKSim Database (template transporters and their synonyms)
/// </summary>
IReadOnlyList<string> AllTransporterNames { get; }
}
}
32 changes: 32 additions & 0 deletions src/PKSim.Core/Repositories/ITransporterTemplateRepository.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using System.Collections.Generic;
using OSPSuite.Core.Domain;
using OSPSuite.Utility.Collections;
using PKSim.Core.Model;

namespace PKSim.Core.Repositories
{
public interface ITransporterTemplateRepository : IStartableRepository<TransporterTemplate>
{
/// <summary>
/// Returns the name of all transporters defined in the PKSim Database (template transporters and their synonyms)
/// </summary>
IReadOnlyList<string> AllTransporterNames { get; }

/// <summary>
/// Returns the <see cref="TransportType" /> defined for a transporter named <paramref name="transporterName" />
/// and for the species named <paramref name="speciesName" /> or default if nothing is defined in the database (TransportType.Efflux)
/// </summary>
/// <param name="speciesName">Species where the transporter will be defined</param>
/// <param name="transporterName">Transporter name (e.g. user input)</param>
TransportType TransportTypeOrDefaultFor(string speciesName, string transporterName);

/// <summary>
/// Returns true if a template was defined for a transporter named <paramref name="transporterName" /> for the species
/// named <paramref name="speciesName" />
/// otherwise false;
/// </summary>
bool HasTransporterTemplateFor(string speciesName, string transporterName);

TransporterTemplate TransporterTemplateFor(string speciesName, string transporterName);
}
}
11 changes: 6 additions & 5 deletions src/PKSim.Core/Repositories/UsedMoleculeRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,18 @@ public class UsedMoleculeRepository : IUsedMoleculeRepository
private readonly IPKSimProjectRetriever _projectRetriever;
private readonly IOntogenyRepository _ontogenyRepository;
private readonly IMoleculeParameterRepository _moleculeParameterRepository;
private readonly ITransporterContainerTemplateRepository _transporterContainerTemplateRepository;
private readonly ITransporterTemplateRepository _transporterTemplateRepository;

public UsedMoleculeRepository(
IPKSimProjectRetriever projectRetriever,
IPKSimProjectRetriever projectRetriever,
IOntogenyRepository ontogenyRepository,
IMoleculeParameterRepository moleculeParameterRepository,
ITransporterContainerTemplateRepository transporterContainerTemplateRepository)
ITransporterTemplateRepository transporterTemplateRepository)
{
_projectRetriever = projectRetriever;
_ontogenyRepository = ontogenyRepository;
_moleculeParameterRepository = moleculeParameterRepository;
_transporterContainerTemplateRepository = transporterContainerTemplateRepository;
_transporterTemplateRepository = transporterTemplateRepository;
}

public IEnumerable<string> All()
Expand Down Expand Up @@ -57,9 +57,10 @@ private IEnumerable<string> allPredefinedMolecules()
//We use human as it has the most predefined molecules in the DB
return _ontogenyRepository.AllFor(CoreConstants.Species.HUMAN).Select(x => x.Name)
.Union(_moleculeParameterRepository.All().Select(x => x.MoleculeName))
.Union(_transporterContainerTemplateRepository.AllTransporterNames)
.Union(_transporterTemplateRepository.AllTransporterNames)
.OrderBy(x => x);
}

private IEnumerable<TBuildingBlock> allLoadedBuildingBlocks<TBuildingBlock>() where TBuildingBlock : class, IPKSimBuildingBlock
{
return _projectRetriever.Current.All<TBuildingBlock>(x => x.IsLoaded);
Expand Down
94 changes: 68 additions & 26 deletions src/PKSim.Core/Services/TransportContainerUpdater.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
using System.Linq;
using System;
using OSPSuite.Core.Domain;
using OSPSuite.Core.Extensions;
using OSPSuite.Utility.Events;
using OSPSuite.Utility.Extensions;
using PKSim.Core.Events;
using PKSim.Core.Model;
using PKSim.Core.Model.Extensions;
using PKSim.Core.Repositories;
using PKSim.Core.Snapshots.Services;
using static PKSim.Core.CoreConstants.Parameters;

namespace PKSim.Core.Services
{
Expand All @@ -15,61 +18,62 @@ public interface ITransportContainerUpdater
/// Update the default transporter settings using the template defined in the database based on the
/// <paramref name="transporterName" />/>
/// </summary>
void SetDefaultSettingsForTransporter(ISimulationSubject simulationSubject, IndividualTransporter transporter, string transporterName) ;
void SetDefaultSettingsForTransporter(ISimulationSubject simulationSubject, IndividualTransporter transporter, string transporterName);

void SetDefaultSettingsForTransporter(ISimulationSubject simulationSubject, IndividualTransporter transporter, TransportType transportType) ;
void SetDefaultSettingsForTransporter(ISimulationSubject simulationSubject, IndividualTransporter transporter, TransportType transportType);
}

public class TransportContainerUpdater : ITransportContainerUpdater
{
private readonly ITransporterContainerTemplateRepository _transporterContainerTemplateRepository;
private readonly ITransporterTemplateRepository _transporterTemplateRepository;
private readonly IEventPublisher _eventPublisher;

public TransportContainerUpdater(
ITransporterContainerTemplateRepository transporterContainerTemplateRepository,
ITransporterTemplateRepository transporterTemplateRepository,
IEventPublisher eventPublisher)
{
_transporterContainerTemplateRepository = transporterContainerTemplateRepository;
_transporterTemplateRepository = transporterTemplateRepository;
_eventPublisher = eventPublisher;
}

public void SetDefaultSettingsForTransporter(ISimulationSubject simulationSubject, IndividualTransporter transporter, string transporterName)
{
var speciesName = simulationSubject.Species.Name;
transporter.TransportType = _transporterContainerTemplateRepository.TransportTypeFor(speciesName, transporterName);
var transportType = _transporterTemplateRepository.TransportTypeOrDefaultFor(speciesName, transporterName);
transporter.TransportType = transportType;

if (!_transporterTemplateRepository.HasTransporterTemplateFor(speciesName, transporterName))
{
//No template was found for the given name. Raise event warning
_eventPublisher.PublishEvent(new NoTransporterTemplateAvailableEvent(transporter));
return;
}


foreach (var transporterContainer in simulationSubject.AllMoleculeContainersFor<TransporterExpressionContainer>(transporter))
{
//there is a db template
var transporterTemplate = _transporterContainerTemplateRepository
.TransportersFor(speciesName, transporterContainer.LogicalContainerName, transporterName)
.FirstOrDefault();
.TransporterContainerTemplateFor(speciesName, transporterContainer.LogicalContainerName, transporterName);

updateTransporterContainerFromTemplate(transporterContainer, transporterTemplate, transporter.TransportType);
updateTransporterContainerFromTemplate(transporterContainer, transporterTemplate, transportType);
}

if (_transporterContainerTemplateRepository.HasTransporterTemplateFor(speciesName, transporterName))
return;

//No template was found for the given name. Raise event warning
_eventPublisher.PublishEvent(new NoTransporterTemplateAvailableEvent(transporter));
}

public void SetDefaultSettingsForTransporter(ISimulationSubject simulationSubject, IndividualTransporter transporter, TransportType transportType)
{
foreach (var transporterContainer in simulationSubject.AllMoleculeContainersFor<TransporterExpressionContainer>(transporter))
{
updateTransporterContainerFromTemplate(transporterContainer, null, transportType);
updateFractionExpressedApical(transporterContainer, transportType);
}
var allTransporterContainers = simulationSubject.AllMoleculeContainersFor<TransporterExpressionContainer>(transporter);
allTransporterContainers.Each(transporterContainer => updateTransporterContainerForTransportType(transporterContainer, transportType));
}

private void updateFractionExpressedApical(TransporterExpressionContainer transporterContainer, TransportType transportType)
{
if (!transportType.IsOneOf(TransportType.Efflux, TransportType.Influx, TransportType.PgpLike))
return;
var fractionExpressedApical = transporterContainer.Parameter(CoreConstants.Parameters.FRACTION_EXPRESSED_APICAL);

var fractionExpressedApical = transporterContainer.Parameter(FRACTION_EXPRESSED_APICAL);
if (fractionExpressedApical == null)
return;

Expand All @@ -82,14 +86,52 @@ private void updateFractionExpressedApical(TransporterExpressionContainer transp
return;

//Set the value according to the new transport type (Efflux + pgp one, Influx 0) except in mucosa where it is always apical
fractionExpressedApical.Value = transporterContainer.IsInMucosa() ? 1 : transportType == TransportType.Influx ? 0 : 1;
fractionExpressedApical.Value = transporterContainer.IsInMucosa() ? 1 : transportType == TransportType.Influx ? 0 : 1;
}

private void updateTransporterContainerFromTemplate(TransporterExpressionContainer transporterContainer, TransporterContainerTemplate transporterContainerTemplate, TransportType transportType)
{
var transporterTypeToUse = transporterContainerTemplate?.TransportType ?? transportType;
//default update based on transport type
updateTransporterContainerForTransportType(transporterContainer, transporterTypeToUse);

//now overwrite if a template container is defined with value specific based on membrane location
if (transporterContainerTemplate == null)
return;


void setFractionValue(string fractionExpressedParameterName, double value)
{
var fractionExpressedParameter = transporterContainer.Parameter(fractionExpressedParameterName);
if (fractionExpressedParameter == null)
return;

fractionExpressedParameter.Value = value;
}

switch (transporterContainerTemplate.MembraneLocation)
{
case MembraneLocation.Apical:
setFractionValue(FRACTION_EXPRESSED_APICAL, 1);
break;
case MembraneLocation.Basolateral:
setFractionValue(FRACTION_EXPRESSED_APICAL, 0);
break;
case MembraneLocation.BloodBrainBarrier:
setFractionValue(FRACTION_EXPRESSED_AT_BLOOD_BRAIN_BARRIER, 1);
break;
case MembraneLocation.Tissue:
setFractionValue(FRACTION_EXPRESSED_AT_BLOOD_BRAIN_BARRIER, 0);
break;
default:
throw new ArgumentOutOfRangeException();
}
}

private void updateTransporterContainerFromTemplate(TransporterExpressionContainer expressionContainer,
TransporterContainerTemplate transporterContainerTemplate, TransportType defaultTransportType)
private void updateTransporterContainerForTransportType(TransporterExpressionContainer transporterContainer, TransportType transportType)
{
var transportType = transporterContainerTemplate?.TransportType ?? defaultTransportType;
expressionContainer.TransportDirection = TransportDirections.DefaultDirectionFor(transportType, expressionContainer);
transporterContainer.TransportDirection = TransportDirections.DefaultDirectionFor(transportType, transporterContainer);
updateFractionExpressedApical(transporterContainer, transportType);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,10 @@
using OSPSuite.Core.Domain;
using PKSim.Core.Model;
using PKSim.Core.Snapshots.Services;

namespace PKSim.Infrastructure.ORM.FlatObjects
{
public class FlatTransporterContainerTemplate
public class FlatTransporterContainerTemplate : FlatTransporterTemplate
{
public string Gene { get; set; }
public string Species { get; set; }
public string OrganName { get; set; }
public string CompartmentName { get; set; }
public TransportType TransportType { get; set; }
public string ContainerName { get; set; }
public MembraneLocation MembraneLocation { get; set; }
}
}
Loading

0 comments on commit 2ee6143

Please sign in to comment.