Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2586 parameters not common for all species #2587

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Db/Diff/PKSimDB_diff.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
UPDATE tab_container_parameter_values SET default_value=124000.0 WHERE parameter_value_version='InVitroClearance_PKSim' AND species='Cattle' AND container_id=159 AND container_type='ORGAN' AND container_name='Liver' AND parameter_name='Number of cells/g tissue';

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for whatever reason the changes are not included into the diff file - so you can see them only in dump

58 changes: 58 additions & 0 deletions src/Db/Dump/PKSimDB_dump.txt
Original file line number Diff line number Diff line change
Expand Up @@ -91937,4 +91937,62 @@ CREATE VIEW VIEW_KNOWN_TRANSPORTER_CONTAINERS AS SELECT
t.CONTAINER_NAME AS ContainerName,
t.MEMBRANE AS MembraneLocation
FROM tab_known_transporters_containers t;
CREATE VIEW [ContainerParameters_Species]
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This view is database internal (not used by PK-Sim)

AS
SELECT DISTINCT
[cpc].[container_id],
[cpc].[container_type],
[cpc].[container_name],
[cpc].[parameter_name],
[species]
FROM [tab_container_parameter_curves] AS [cpc],
[tab_container_parameters] AS [cp]
WHERE [cpc].[container_id] = [cp].[container_id]
AND [cpc].[parameter_name] = [cp].[parameter_name]
AND [building_block_type] = "INDIVIDUAL"
UNION
SELECT DISTINCT
[cpv].[container_id],
[cpv].[container_type],
[cpv].[container_name],
[cpv].[parameter_name],
[species]
FROM [tab_container_parameter_values] AS [cpv],
[tab_container_parameters] AS [cp]
WHERE [cpv].[container_id] = [cp].[container_id]
AND [cpv].[parameter_name] = [cp].[parameter_name]
AND [building_block_type] = "INDIVIDUAL"
UNION
SELECT DISTINCT
[cpr].[container_id],
[cpr].[container_type],
[cpr].[container_name],
[cpr].[parameter_name],
[species]
FROM [tab_container_parameter_rates] AS [cpr],
[tab_species_calculation_methods] AS [scm],
[tab_container_parameters] AS [cp]
WHERE [cpr].[calculation_method] = [scm].[calculation_method]
AND [cpr].[container_id] = [cp].[container_id]
AND [cpr].[parameter_name] = [cp].[parameter_name]
AND [building_block_type] = "INDIVIDUAL";
CREATE VIEW [VIEW_CONTAINER_PARAMETER_NOT_FOR_ALL_SPECIES]
AS
SELECT DISTINCT
[ContainerParameters_Species].[container_id] AS [ContainerId],
[ContainerParameters_Species].[container_type] AS [ContainerType],
[ContainerParameters_Species].[container_name] AS [ContainerName],
[ContainerParameters_Species].[parameter_name] AS [ParameterName],
COUNT ([ContainerParameters_Species].[species]) AS [SpeciesCount]
FROM [ContainerParameters_Species]
GROUP BY
[container_id],
[container_type],
[container_name],
[parameter_name]
HAVING COUNT ([species]) < (SELECT COUNT ([species])
FROM [tab_species])
ORDER BY
[container_id],
[parameter_name];
Comment on lines +91979 to +91997
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the view used by PK-Sim. It retrieves the table

ContainerId ContainerType ContainerName ParameterName SpeciesCount

Species count tells in how many species the parameter is defined (currently this info is not used by PK-Sim)

COMMIT;
Expand Down
Binary file modified src/Db/PKSimDB.sqlite
Binary file not shown.
1 change: 1 addition & 0 deletions src/PKSim.Core/CoreConstants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -776,6 +776,7 @@ public static class ORM
public const string VIEW_DISEASE_STATES = "VIEW_DISEASE_STATES";
public const string VIEW_POPULATION_DISEASE_STATES = "VIEW_POPULATION_DISEASE_STATES";
public const string VIEW_CONTAINER_PARAMETER_DESCRIPTOR_CONDITIONS = "VIEW_CONTAINER_PARAMETER_DESCRIPTOR_CONDITIONS";
public const string VIEW_CONTAINER_PARAMETER_NOT_FOR_ALL_SPECIES = "VIEW_CONTAINER_PARAMETER_NOT_FOR_ALL_SPECIES";
}

public static class Organ
Expand Down
9 changes: 9 additions & 0 deletions src/PKSim.Core/Model/ContainerParameterBySpecies.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace PKSim.Core.Model
{
public class ContainerParameterBySpecies
{
public string ContainerPath { get; set; }
public string ParameterName { get; set; }
public int SpeciesCount { get; set; }
}
}
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added the new type (did not find a good name - if you can think of a better name - let me know :))

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using System;
using OSPSuite.Utility.Collections;
using PKSim.Core.Model;

namespace PKSim.Core.Repositories
{
public interface IContainerParametersNotCommonForAllSpeciesRepository : IStartableRepository<ContainerParameterBySpecies>
{
bool UsedForAllSpecies(string containerPath, string parameterName);
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the function, which returns if a parameter in a container is used for all species or not.
@msevestre Is this sufficient? Or do you need another interface?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I need one for the parmaeter path completely as well probably. but I can add if required. Looks good


bool UsedForAllSpecies(string parameterFullPath);
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also query by full path (e.g. "Organism|Age")

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace PKSim.Infrastructure.ORM.FlatObjects
{
public class FlatContainerParametersNotCommonForAllSpecies
{
public int ContainerId { get; set; }
public string ContainerType { get; set; }
public string ContainerName { get; set; }
public string ParameterName { get; set; }
public int SpeciesCount { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
using System.Collections.Generic;
using System.Linq;
using OSPSuite.Core.Domain;
using OSPSuite.Utility.Collections;
using PKSim.Core.Model;
using PKSim.Core.Repositories;

namespace PKSim.Infrastructure.ORM.Repositories
{
public class ContainerParametersNotCommonForAllSpeciesRepository: StartableRepository<ContainerParameterBySpecies>, IContainerParametersNotCommonForAllSpeciesRepository
{
private readonly IFlatContainerRepository _flatContainerRepository;
private readonly IFlatContainerParametersNotCommonForAllSpeciesRepository _flatContainerParametersNotCommonForAllSpeciesRepository;

private readonly List<ContainerParameterBySpecies> _containerParametersNotCommonForAllSpecies;
private readonly ICache<string, List<string>> _parametersNotCommonForAllSpeciesByContainer;
private readonly ICache<string, string> _parametersNotCommonForAllSpeciesByFullPath;

public ContainerParametersNotCommonForAllSpeciesRepository(
IFlatContainerRepository flatContainerRepository,
IFlatContainerParametersNotCommonForAllSpeciesRepository flatContainerParametersNotCommonForAllSpeciesRepository)
{
_flatContainerRepository = flatContainerRepository;
_flatContainerParametersNotCommonForAllSpeciesRepository = flatContainerParametersNotCommonForAllSpeciesRepository;

_containerParametersNotCommonForAllSpecies = new List<ContainerParameterBySpecies>();
_parametersNotCommonForAllSpeciesByContainer = new Cache<string, List<string>>();
_parametersNotCommonForAllSpeciesByFullPath = new Cache<string, string>();
}

protected override void DoStart()
{
var flatContainerParametersNotCommonForAllSpecies = _flatContainerParametersNotCommonForAllSpeciesRepository.All().ToList();

foreach(var containerParameter in flatContainerParametersNotCommonForAllSpecies)
{
var containerPath = _flatContainerRepository.ContainerPathFrom(containerParameter.ContainerId).ToString();
var containerParameterBySpecies = new ContainerParameterBySpecies()
{
ContainerPath = containerPath,
ParameterName = containerParameter.ParameterName,
SpeciesCount = containerParameter.SpeciesCount
};
_containerParametersNotCommonForAllSpecies.Add(containerParameterBySpecies);

//cache by full path
var fullPath = $"{containerPath}{ObjectPath.PATH_DELIMITER}{containerParameter.ParameterName}";
Copy link
Member Author

@Yuri05 Yuri05 Apr 5, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do we have a function somewhere for concatenation of path strings?
We can add/insert a string to an object path object, but I didn't find a function like CombinePath(string path1,string path2)

_parametersNotCommonForAllSpeciesByFullPath.Add(fullPath, fullPath);
}

//cache the parameters by container path
foreach (var containerParametersInContainer in _containerParametersNotCommonForAllSpecies.GroupBy(x => x.ContainerPath))
{
_parametersNotCommonForAllSpeciesByContainer.Add(containerParametersInContainer.Key, containerParametersInContainer.Select(cp=>cp.ParameterName).ToList());
}
}

public override IEnumerable<ContainerParameterBySpecies> All()
{
Start();
return _containerParametersNotCommonForAllSpecies;
}

public bool UsedForAllSpecies(string containerPath, string parameterName)
{
Start();
var parametersUsedNotForAllSpeciesInContainer = _parametersNotCommonForAllSpeciesByContainer[containerPath];

return parametersUsedNotForAllSpeciesInContainer == null || !parametersUsedNotForAllSpeciesInContainer.Contains(parameterName);
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if the combination {containerPath, parameterName} is not stored in the repo - this parameter is used for all species.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This means, that if a container or parameter path is invalid - the function would also return true
(e.g. UsedForAllSpecies("alkremflsak","alkjfldsfkj") => true) - but I assume it's the task of the caller to pass only valid container and parameter names.

}

public bool UsedForAllSpecies(string parameterFullPath)
{
Start();
return !_parametersNotCommonForAllSpeciesByFullPath.Contains(parameterFullPath);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using PKSim.Core;
using PKSim.Infrastructure.ORM.Core;
using PKSim.Infrastructure.ORM.FlatObjects;
using PKSim.Infrastructure.ORM.Mappers;

namespace PKSim.Infrastructure.ORM.Repositories
{
public interface IFlatContainerParametersNotCommonForAllSpeciesRepository : IMetaDataRepository<FlatContainerParametersNotCommonForAllSpecies>
{
}

public class FlatContainerParametersNotCommonForAllSpeciesRepository : MetaDataRepository<FlatContainerParametersNotCommonForAllSpecies>, IFlatContainerParametersNotCommonForAllSpeciesRepository
{
public FlatContainerParametersNotCommonForAllSpeciesRepository(IDbGateway dbGateway, IDataTableToMetaDataMapper<FlatContainerParametersNotCommonForAllSpecies> mapper)
: base(dbGateway, mapper, CoreConstants.ORM.VIEW_CONTAINER_PARAMETER_NOT_FOR_ALL_SPECIES)
{
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using PKSim.Core.Model;

namespace PKSim.Infrastructure.Serialization.Xml.Serializers
{
public class ContainerParameterBySpeciesSerializer : BaseXmlSerializer<ContainerParameterBySpecies>
{
public override void PerformMapping()
{
Map(x => x.ContainerPath);
Map(x => x.ParameterName);
Map(x => x.SpeciesCount);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
using System.Collections.Generic;
using System.Linq;
using FluentNHibernate.Utils;
using OSPSuite.BDDHelper;
using OSPSuite.BDDHelper.Extensions;
using PKSim.Core.Model;
using PKSim.Core.Repositories;

namespace PKSim.IntegrationTests
{
public abstract class concern_for_ContainerParametersNotCommonForAllSpeciesRepository : ContextForIntegration<IContainerParametersNotCommonForAllSpeciesRepository>
{
}

public class When_retrieving_parameters_not_common_for_all_species_from_the_repository : concern_for_ContainerParametersNotCommonForAllSpeciesRepository
{
private IEnumerable<ContainerParameterBySpecies> _result;

protected override void Because()
{
_result = sut.All();
}

[Observation]
public void should_return_at_least_one_parameter()
{
_result.Count().ShouldBeGreaterThan(0);
}

[Observation]
public void all_parameter_paths_should_start_with_organism_or_neighborhoods()
{
//because we deal here with individual parameters only: only parameters with path "Organism|..." or "Neighborhoods|..." may appear in the list
_result.Each(p=>
{
var containerPath = p.ContainerPath;
(containerPath.StartsWith("Organism")|| containerPath.StartsWith("Neighborhoods")).ShouldBeTrue($"{p.ContainerPath}|{p.ParameterName}");
});
}
}

public class When_testing_if_a_parameter_is_common_for_all_species : concern_for_ContainerParametersNotCommonForAllSpeciesRepository
{
[Observation]
public void age_parameter_should_be_defined_not_for_all_species()
{
sut.UsedForAllSpecies("Organism","Age").ShouldBeFalse();
}

[Observation]
public void weight_parameter_should_be_defined_for_all_species()
{
sut.UsedForAllSpecies("Organism", "Weight").ShouldBeTrue();
}

[Observation]
public void age_parameter_should_be_defined_not_for_all_species_when_queried_by_full_path()
{
sut.UsedForAllSpecies("Organism|Age").ShouldBeFalse();
}

[Observation]
public void weight_parameter_should_be_defined_for_all_species_when_queried_by_full_path()
{
sut.UsedForAllSpecies("Organism|Weight").ShouldBeTrue();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using System.Collections.Generic;
using System.Linq;
using OSPSuite.BDDHelper;
using OSPSuite.BDDHelper.Extensions;
using PKSim.Infrastructure.ORM.FlatObjects;
using PKSim.Infrastructure.ORM.Repositories;

namespace PKSim.IntegrationTests
{
public abstract class concern_for_FlatContainerParametersNotCommonForAllSpeciesRepository : ContextForIntegration<IFlatContainerParametersNotCommonForAllSpeciesRepository>
{
}

public class When_resolving_all_parameters_not_common_for_all_species_as_a_flat_table : concern_for_FlatContainerParametersNotCommonForAllSpeciesRepository
{
private IEnumerable<FlatContainerParametersNotCommonForAllSpecies> _result;

protected override void Because()
{
_result = sut.All();
}

[Observation]
public void should_retrieve_some_object_from_the_underlying_database()
{
_result.Count().ShouldBeGreaterThan(0);
}
}
}