-
Notifications
You must be signed in to change notification settings - Fork 49
/
FlatProcessToActiveProcessMapper.cs
154 lines (136 loc) · 6.07 KB
/
FlatProcessToActiveProcessMapper.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
using System;
using System.Linq;
using OSPSuite.Utility;
using PKSim.Core;
using PKSim.Core.Model;
using PKSim.Core.Repositories;
using PKSim.Infrastructure.ORM.FlatObjects;
using PKSim.Infrastructure.ORM.Repositories;
using OSPSuite.Core.Domain;
using OSPSuite.Core.Domain.Builder;
using OSPSuite.Core.Domain.Descriptors;
using OSPSuite.Core.Domain.Formulas;
using IFormulaFactory = PKSim.Core.Model.IFormulaFactory;
namespace PKSim.Infrastructure.ORM.Mappers
{
public interface IFlatProcessToActiveProcessMapper : IMapper<FlatProcess, IPKSimProcess>
{
}
public class FlatProcessToActiveProcessMapper : IFlatProcessToActiveProcessMapper
{
private readonly IObjectBaseFactory _entityBaseFactory;
private readonly IFormulaFactory _formulaFactory;
private readonly IFlatProcessDescriptorConditionRepository _processDescriptorRepository;
private readonly IRepresentationInfoRepository _representationInfoRepository;
private readonly IFlatReactionPartnerRepository _reactionPartnerRepository;
public FlatProcessToActiveProcessMapper(IObjectBaseFactory entityBaseFactory, IFormulaFactory formulaFactory,
IFlatProcessDescriptorConditionRepository processDescriptorRepository,
IRepresentationInfoRepository representationInfoRepository,
IFlatReactionPartnerRepository reactionPartnerRepository)
{
_entityBaseFactory = entityBaseFactory;
_formulaFactory = formulaFactory;
_processDescriptorRepository = processDescriptorRepository;
_representationInfoRepository = representationInfoRepository;
_reactionPartnerRepository = reactionPartnerRepository;
}
public IPKSimProcess MapFrom(FlatProcess flatProcess)
{
var activeProcess = createProcessFrom(flatProcess);
if (activeProcess == null)
return null;
activeProcess.Name = flatProcess.Name;
activeProcess.CalculationMethod = flatProcess.CalculationMethod;
activeProcess.Rate = flatProcess.Rate;
activeProcess.Formula = _formulaFactory.RateFor(activeProcess.CalculationMethod, activeProcess.Rate, new FormulaCache());
var repInfo = _representationInfoRepository.InfoFor(RepresentationObjectType.PROCESS, activeProcess.Name);
activeProcess.Icon = repInfo.IconName;
updateTransporterDescriptors(activeProcess as PKSimTransport);
activeProcess.CreateProcessRateParameter = flatProcess.CreateProcessRateParameter;
activeProcess.Dimension = activeProcess.Formula.Dimension;
return activeProcess;
}
private void updateTransporterDescriptors(PKSimTransport transport)
{
if (transport == null) return;
addDescriptorConditions(transport.SourceCriteria, ProcessTagType.Source, transport.Name);
addDescriptorConditions(transport.TargetCriteria, ProcessTagType.Target, transport.Name);
}
private IPKSimProcess createProcessFrom(FlatProcess flatProcess)
{
switch (flatProcess.ActionType)
{
case ProcessActionType.Reaction:
var reaction = newReaction();
addReactionPartnersTo(reaction, flatProcess.Name);
return reaction;
case ProcessActionType.Transport:
return _entityBaseFactory.Create<PKSimTransport>();
case ProcessActionType.Interaction:
return interactionProcessFor(flatProcess);
default:
throw new ArgumentOutOfRangeException(flatProcess.ActionType.ToString());
}
}
private IPKSimProcess interactionProcessFor(FlatProcess flatInteractionProcess)
{
var interactionType = EnumHelper.ParseValue<InteractionType>(flatInteractionProcess.ProcessType);
return interactionType.Is(InteractionType.ReactionInducer) ? newReaction() : null;
}
private PKSimReaction newReaction()
{
return _entityBaseFactory.Create<PKSimReaction>();
}
private void addReactionPartnersTo(PKSimReaction reaction, string reactionName)
{
var allPartners = (from rp in _reactionPartnerRepository.All()
where rp.Reaction.Equals(reactionName)
select rp).ToList();
foreach (var flatReactionPartner in allPartners)
{
addReactionPartnerTo(reaction, flatReactionPartner);
}
}
private void addReactionPartnerTo(PKSimReaction reaction, FlatReactionPartner flatReactionPartner)
{
if (flatReactionPartner.Direction.Equals(CoreConstants.ORM.PROCESS_MOLECULE_DIRECTION_MODIFIER))
{
//---- not Educt/Product, just a modifier
reaction.AddModifier(flatReactionPartner.Molecule);
return;
}
//---- from now on, must be educt/product
var reactionPartner = new ReactionPartnerBuilder()
{
MoleculeName = flatReactionPartner.Molecule,
StoichiometricCoefficient = flatReactionPartner.StoichCoeff
};
if (flatReactionPartner.Direction.Equals(CoreConstants.ORM.PROCESS_MOLECULE_DIRECTION_IN))
{
reaction.AddEduct(reactionPartner);
return;
}
if (flatReactionPartner.Direction.Equals(CoreConstants.ORM.PROCESS_MOLECULE_DIRECTION_OUT))
{
reaction.AddProduct(reactionPartner);
return;
}
//invalid direction (should never happen)
throw new ArgumentOutOfRangeException(flatReactionPartner.Direction);
}
private void addDescriptorConditions(DescriptorCriteria descriptorCriteria, ProcessTagType tagType, string transportName)
{
var conditions = from pd in _processDescriptorRepository.All()
where pd.TagType == tagType
where pd.Process == transportName
select pd;
foreach (var condition in conditions)
{
if (condition.ShouldHave)
descriptorCriteria.Add(new MatchTagCondition(condition.Tag));
else
descriptorCriteria.Add(new NotMatchTagCondition(condition.Tag));
}
}
}
}