Building Medical Digital Twins with Pulse: Open Source Simulation Tools for Developers and Researchers
×
PulseEngine.h
1 /* Distributed under the Apache License, Version 2.0.
2  See accompanying NOTICE file for details.*/
3 
4 #pragma once
5 
6 #include "engine/CommonDefs.h"
7 #include "cdm/PhysiologyEngine.h"
8 #include "cdm/utils/ScopedMutex.h"
9 
10 struct PULSE_DECL PulseBuildInformation
11 {
12  static std::string Time();
13  static std::string Hash();
14  static std::string Version();
15 };
16 
17 enum class eModelType { HumanAdultWholeBody=0, HumanAdultVentilationMechanics, HumanAdultHemodynamics };
18 PULSE_DECL bool eModelType_ValueOf(const std::string s, eModelType& t);
19 
20 PULSE_DECL std::unique_ptr<PhysiologyEngine> CreatePulseEngine(eModelType type = eModelType::HumanAdultWholeBody, Logger* logger = nullptr);
21 
22 namespace pulse
23 {
25  // All Compartments used by Pulse //
27 
28  class Graph
29  {
30  public:
31  DEFINE_STATIC_STRING(ActiveCardiovascular);
32  DEFINE_STATIC_STRING(Cardiovascular);
33  DEFINE_STATIC_STRING(Renal);
34  DEFINE_STATIC_STRING(Respiratory);
35  DEFINE_STATIC_STRING(RespiratoryAndAnesthesiaMachine);
36  DEFINE_STATIC_STRING(RespiratoryAndBagValveMask);
37  DEFINE_STATIC_STRING(RespiratoryAndInhaler);
38  DEFINE_STATIC_STRING(RespiratoryAndMechanicalVentilation);
39  DEFINE_STATIC_STRING(RespiratoryAndMechanicalVentilator);
40  DEFINE_STATIC_STRING(RespiratoryAndNasalCannula);
41  DEFINE_STATIC_STRING(RespiratoryAndNonRebreatherMask);
42  DEFINE_STATIC_STRING(RespiratoryAndSimpleMask);
43  DEFINE_STATIC_STRING(Aerosol);
44  DEFINE_STATIC_STRING(AerosolAndBagValveMask);
45  DEFINE_STATIC_STRING(AerosolAndInhaler);
46  DEFINE_STATIC_STRING(AerosolAndMechanicalVentilation);
47  DEFINE_STATIC_STRING(AerosolAndMechanicalVentilator);
48  DEFINE_STATIC_STRING(AnesthesiaMachine);
49  DEFINE_STATIC_STRING(BagValveMask);
50  DEFINE_STATIC_STRING(MechanicalVentilator);
51 
52  static const std::vector<std::string>& GetValues()
53  {
54  ScopedMutex lock;
55  if (_values.empty())
56  {
57  _values.push_back(ActiveCardiovascular);
58  _values.push_back(Cardiovascular);
59  _values.push_back(Renal);
60  _values.push_back(Respiratory);
61  _values.push_back(RespiratoryAndAnesthesiaMachine);
62  _values.push_back(RespiratoryAndBagValveMask);
63  _values.push_back(RespiratoryAndInhaler);
64  _values.push_back(RespiratoryAndMechanicalVentilation);
65  _values.push_back(RespiratoryAndMechanicalVentilator);
66  _values.push_back(RespiratoryAndNasalCannula);
67  _values.push_back(RespiratoryAndNonRebreatherMask);
68  _values.push_back(RespiratoryAndSimpleMask);
69  _values.push_back(Aerosol);
70  _values.push_back(AerosolAndBagValveMask);
71  _values.push_back(AerosolAndInhaler);
72  _values.push_back(AerosolAndMechanicalVentilation);
73  _values.push_back(AerosolAndMechanicalVentilator);
74  _values.push_back(BagValveMask);
75  _values.push_back(AnesthesiaMachine);
76  _values.push_back(MechanicalVentilator);
77  }
78  return _values;
79  }
80  static bool HasValue(const std::string& v)
81  {
82  return std::find(_values.begin(), _values.end(), v) != _values.end();
83  }
84  static void AddValue(const std::string& v)
85  {
86  if (!HasValue(v))
87  {
88  ScopedMutex lock;
89  _values.push_back(v);
90  }
91  }
92  protected:
93  static std::vector<std::string> _values;
94  };
95 
96  // TODO Rachel
97  class CerebrospinalFluidCompartment
98  {
99  public:
100  DEFINE_STATIC_STRING(IntracranialSpace);
101 
102  static const std::vector<std::string>& GetValues()
103  {
104  ScopedMutex lock;
105  if (_values.empty())
106  {
107  _values.push_back(IntracranialSpace);
108  }
109  return _values;
110  }
111  static bool HasValue(const std::string& v)
112  {
113  return std::find(_values.begin(), _values.end(), v) != _values.end();
114  }
115  static void AddValue(const std::string& v)
116  {
117  if (!HasValue(v))
118  {
119  ScopedMutex lock;
120  _values.push_back(v);
121  }
122  }
123  protected:
124  static std::vector<std::string> _values;
125  };
126 
127  class ChymeCompartment
128  {
129  public:
130  DEFINE_STATIC_STRING_EX(SmallIntestine, SmallIntestineChyme);
131 
132  static const std::vector<std::string>& GetValues()
133  {
134  ScopedMutex lock;
135  if (_values.empty())
136  {
137  _values.push_back(SmallIntestine);
138  }
139  return _values;
140  }
141  static bool HasValue(const std::string& v)
142  {
143  return std::find(_values.begin(), _values.end(), v) != _values.end();
144  }
145  static void AddValue(const std::string& v)
146  {
147  if (!HasValue(v))
148  {
149  ScopedMutex lock;
150  _values.push_back(v);
151  }
152  }
153  protected:
154  static std::vector<std::string> _values;
155  };
156 
157  class ChymeLink
158  {
159  public:
160  DEFINE_STATIC_STRING(SmallIntestineChymeToVasculature);
161 
162  static const std::vector<std::string>& GetValues()
163  {
164  ScopedMutex lock;
165  if (_values.empty())
166  {
167  _values.push_back(SmallIntestineChymeToVasculature);
168  }
169  return _values;
170  }
171  static bool HasValue(const std::string& v)
172  {
173  return std::find(_values.begin(), _values.end(), v) != _values.end();
174  }
175  static void AddValue(const std::string& v)
176  {
177  if (!HasValue(v))
178  {
179  ScopedMutex lock;
180  _values.push_back(v);
181  }
182  }
183  protected:
184  static std::vector<std::string> _values;
185  };
186 
187  class PulmonaryCompartment
188  {
189  public:
190  DEFINE_STATIC_STRING(Airway);
191  DEFINE_STATIC_STRING(Stomach);
192  DEFINE_STATIC_STRING(Pharynx);
193  DEFINE_STATIC_STRING(Carina);
194  DEFINE_STATIC_STRING_EX(Lungs, PulmonaryLungs);
195  DEFINE_STATIC_STRING(Alveoli);
196  DEFINE_STATIC_STRING(AlveolarDeadSpace);
197  DEFINE_STATIC_STRING(AnatomicDeadSpace);
198  DEFINE_STATIC_STRING_EX(LeftLung, LeftLungPulmonary);
199  /***/DEFINE_STATIC_STRING(LeftAnatomicDeadSpace);
200  /***/DEFINE_STATIC_STRING(LeftAlveolarDeadSpace);
201  /***/DEFINE_STATIC_STRING(LeftAlveoli);
202  DEFINE_STATIC_STRING_EX(RightLung, RightLungPulmonary);
203  /***/DEFINE_STATIC_STRING(RightAnatomicDeadSpace);
204  /***/DEFINE_STATIC_STRING(RightAlveolarDeadSpace);
205  /***/DEFINE_STATIC_STRING(RightAlveoli);
206  DEFINE_STATIC_STRING(PleuralCavity);
207  DEFINE_STATIC_STRING(LeftPleuralCavity);
208  DEFINE_STATIC_STRING(RightPleuralCavity);
209 
210  DEFINE_STATIC_STRING(LeftAlveoliLeak);
211  DEFINE_STATIC_STRING(LeftChestLeak);
212  DEFINE_STATIC_STRING(LeftNeedle);
213  DEFINE_STATIC_STRING(RightAlveoliLeak);
214  DEFINE_STATIC_STRING(RightChestLeak);
215  DEFINE_STATIC_STRING(RightNeedle);
216 
217  static const std::vector<std::string>& GetValues()
218  {
219  ScopedMutex lock;
220  if (_values.empty())
221  {
222  _values.push_back(Airway);
223  _values.push_back(Stomach);
224  _values.push_back(Pharynx);
225  _values.push_back(Carina);
226  _values.push_back(Lungs);
227  _values.push_back(Alveoli);
228  _values.push_back(AlveolarDeadSpace);
229  _values.push_back(AnatomicDeadSpace);
230  _values.push_back(LeftLung);
231  _values.push_back(LeftAnatomicDeadSpace);
232  _values.push_back(LeftAlveolarDeadSpace);
233  _values.push_back(LeftAlveoli);
234  _values.push_back(RightLung);
235  _values.push_back(RightAnatomicDeadSpace);
236  _values.push_back(RightAlveolarDeadSpace);
237  _values.push_back(RightAlveoli);
238  _values.push_back(PleuralCavity);
239  _values.push_back(LeftPleuralCavity);
240  _values.push_back(RightPleuralCavity);
241  _values.push_back(LeftAlveoliLeak);
242  _values.push_back(LeftChestLeak);
243  _values.push_back(LeftNeedle);
244  _values.push_back(RightAlveoliLeak);
245  _values.push_back(RightChestLeak);
246  _values.push_back(RightNeedle);
247  }
248  return _values;
249  }
250  static bool HasValue(const std::string& v)
251  {
252  return std::find(_values.begin(), _values.end(), v) != _values.end();
253  }
254  static void AddValue(const std::string& v)
255  {
256  if (!HasValue(v))
257  {
258  ScopedMutex lock;
259  _values.push_back(v);
260  }
261  }
262  protected:
263  static std::vector<std::string> _values;
264  };
265 
266  class PulmonaryLink
267  {
268  public:
269  DEFINE_STATIC_STRING(EnvironmentToAirway);
270  DEFINE_STATIC_STRING(AirwayToPharynx);
271  DEFINE_STATIC_STRING(AirwayToStomach);
272  DEFINE_STATIC_STRING(PharynxToCarina);
273  DEFINE_STATIC_STRING(PharynxToEnvironment);
274  DEFINE_STATIC_STRING(CarinaToLeftAnatomicDeadSpace);
275  DEFINE_STATIC_STRING(LeftAnatomicDeadSpaceToLeftAlveolarDeadSpace);
276  DEFINE_STATIC_STRING(LeftAlveolarDeadSpaceToLeftAlveoli);
277  DEFINE_STATIC_STRING(CarinaToRightAnatomicDeadSpace);
278  DEFINE_STATIC_STRING(RightAnatomicDeadSpaceToRightAlveolarDeadSpace);
279  DEFINE_STATIC_STRING(RightAlveolarDeadSpaceToRightAlveoli);
280  DEFINE_STATIC_STRING(EnvironmentToLeftChestLeak);
281  DEFINE_STATIC_STRING(EnvironmentToRightChestLeak);
282  DEFINE_STATIC_STRING(LeftAlveoliLeakToLeftPleural);
283  DEFINE_STATIC_STRING(LeftAlveoliToLeftAlveoliLeak);
284  DEFINE_STATIC_STRING(LeftChestLeakToLeftPleural);
285  DEFINE_STATIC_STRING(LeftNeedleToLeftPleural);
286  DEFINE_STATIC_STRING(EnvironmentToLeftNeedle);
287  DEFINE_STATIC_STRING(RightAlveoliLeakToRightPleural);
288  DEFINE_STATIC_STRING(RightAlveoliToRightAlveoliLeak);
289  DEFINE_STATIC_STRING(RightChestLeakToRightPleural);
290  DEFINE_STATIC_STRING(RightNeedleToRightPleural);
291  DEFINE_STATIC_STRING(EnvironmentToRightNeedle);
292 
293  static const std::vector<std::string>& GetValues()
294  {
295  ScopedMutex lock;
296  if (_values.empty())
297  {
298  _values.push_back(EnvironmentToAirway);
299  _values.push_back(AirwayToPharynx);
300  _values.push_back(AirwayToStomach);
301  _values.push_back(PharynxToCarina);
302  _values.push_back(PharynxToEnvironment);
303  _values.push_back(CarinaToLeftAnatomicDeadSpace);
304  _values.push_back(LeftAnatomicDeadSpaceToLeftAlveolarDeadSpace);
305  _values.push_back(LeftAlveolarDeadSpaceToLeftAlveoli);
306  _values.push_back(CarinaToRightAnatomicDeadSpace);
307  _values.push_back(RightAnatomicDeadSpaceToRightAlveolarDeadSpace);
308  _values.push_back(RightAlveolarDeadSpaceToRightAlveoli);
309  _values.push_back(EnvironmentToLeftChestLeak);
310  _values.push_back(EnvironmentToRightChestLeak);
311  _values.push_back(LeftAlveoliLeakToLeftPleural);
312  _values.push_back(LeftAlveoliToLeftAlveoliLeak);
313  _values.push_back(LeftChestLeakToLeftPleural);
314  _values.push_back(LeftNeedleToLeftPleural);
315  _values.push_back(EnvironmentToLeftNeedle);
316  _values.push_back(RightAlveoliLeakToRightPleural);
317  _values.push_back(RightAlveoliToRightAlveoliLeak);
318  _values.push_back(RightChestLeakToRightPleural);
319  _values.push_back(RightNeedleToRightPleural);
320  _values.push_back(EnvironmentToRightNeedle);
321  }
322  return _values;
323  }
324  static bool HasValue(const std::string& v)
325  {
326  return std::find(_values.begin(), _values.end(), v)!=_values.end();
327  }
328  static void AddValue(const std::string& v)
329  {
330  if (!HasValue(v))
331  {
332  ScopedMutex lock;
333  _values.push_back(v);
334  }
335  }
336  protected:
337  static std::vector<std::string> _values;
338  };
339 
340  class ExpandedLungsPulmonaryCompartment
341  {
342  public:
343  DEFINE_STATIC_STRING(RightBranches);
344  DEFINE_STATIC_STRING(LeftBranches);
345 
346  DEFINE_STATIC_STRING(RightMainBronchus);
347  DEFINE_STATIC_STRING(LeftMainBronchus);
348  DEFINE_STATIC_STRING(RightIntermediateBronchus);
349  DEFINE_STATIC_STRING(RightSuperiorLobarBronchus);
350  DEFINE_STATIC_STRING(RightMiddleLobarBronchus);
351  DEFINE_STATIC_STRING(RightInferiorLobarBronchus1);
352  DEFINE_STATIC_STRING(LeftInferiorLobarBronchus1);
353  DEFINE_STATIC_STRING(LeftSuperiorLobarBronchus);
354  DEFINE_STATIC_STRING(RightInferiorLobarBronchus2);
355  DEFINE_STATIC_STRING(LeftInferiorLobarBronchus2);
356  DEFINE_STATIC_STRING(RightSuperiorApicoposteriorBronchus);
357  DEFINE_STATIC_STRING(RightInferiorLobarBronchus3);
358  DEFINE_STATIC_STRING(LeftInferiorLobarBronchus3);
359  DEFINE_STATIC_STRING(LeftLingularBonchus);
360  DEFINE_STATIC_STRING(LeftSuperiorApicoposteriorBronchus);
361  DEFINE_STATIC_STRING(RightInferiorLobarBronchus4);
362 
363  DEFINE_STATIC_STRING(RightSuperiorLobeApicalBronchiole);
364  DEFINE_STATIC_STRING(RightSuperiorLobePosteriorBronchiole);
365  DEFINE_STATIC_STRING(RightSuperiorLobeAnteriorBronchiole);
366  DEFINE_STATIC_STRING(RightMiddleLobeLateralBronchiole);
367  DEFINE_STATIC_STRING(RightMiddleLobeMedialBronchiole);
368  DEFINE_STATIC_STRING(RightInferiorLobeSuperiorBronchiole);
369  DEFINE_STATIC_STRING(RightInferiorLobeMedialBasalBronchiole);
370  DEFINE_STATIC_STRING(RightInferiorLobeAnteriorBasalBronchiole);
371  DEFINE_STATIC_STRING(RightInferiorLobeLateralBasalBronchiole);
372  DEFINE_STATIC_STRING(RightInferiorLobePosteriorBasalBronchiole);
373 
374  DEFINE_STATIC_STRING(LeftInferiorLobePosteriorBasalBronchiole);
375  DEFINE_STATIC_STRING(LeftInferiorLobeLateralBasalBronchiole);
376  DEFINE_STATIC_STRING(LeftInferiorLobeAnteromedialBasalBronchiole);
377  DEFINE_STATIC_STRING(LeftInferiorLobeSuperiorBronchiole);
378  DEFINE_STATIC_STRING(LeftSuperiorLobeInferiorLingulaBronchiole);
379  DEFINE_STATIC_STRING(LeftSuperiorLobeSuperiorLingulaBronchiole);
380  DEFINE_STATIC_STRING(LeftSuperiorLobeAnteriorBronchiole);
381  DEFINE_STATIC_STRING(LeftSuperiorLobeApicoposteriorBronchiole);
382 
383  DEFINE_STATIC_STRING(RightSuperiorLobeApicalAlveolarDeadSpace);
384  DEFINE_STATIC_STRING(RightSuperiorLobePosteriorAlveolarDeadSpace);
385  DEFINE_STATIC_STRING(RightSuperiorLobeAnteriorAlveolarDeadSpace);
386  DEFINE_STATIC_STRING(RightMiddleLobeLateralAlveolarDeadSpace);
387  DEFINE_STATIC_STRING(RightMiddleLobeMedialAlveolarDeadSpace);
388  DEFINE_STATIC_STRING(RightInferiorLobeSuperiorAlveolarDeadSpace);
389  DEFINE_STATIC_STRING(RightInferiorLobeMedialBasalAlveolarDeadSpace);
390  DEFINE_STATIC_STRING(RightInferiorLobeAnteriorBasalAlveolarDeadSpace);
391  DEFINE_STATIC_STRING(RightInferiorLobeLateralBasalAlveolarDeadSpace);
392  DEFINE_STATIC_STRING(RightInferiorLobePosteriorBasalAlveolarDeadSpace);
393 
394  DEFINE_STATIC_STRING(LeftInferiorLobePosteriorBasalAlveolarDeadSpace);
395  DEFINE_STATIC_STRING(LeftInferiorLobeLateralBasalAlveolarDeadSpace);
396  DEFINE_STATIC_STRING(LeftInferiorLobeAnteromedialBasalAlveolarDeadSpace);
397  DEFINE_STATIC_STRING(LeftInferiorLobeSuperiorAlveolarDeadSpace);
398  DEFINE_STATIC_STRING(LeftSuperiorLobeInferiorLingulaAlveolarDeadSpace);
399  DEFINE_STATIC_STRING(LeftSuperiorLobeSuperiorLingulaAlveolarDeadSpace);
400  DEFINE_STATIC_STRING(LeftSuperiorLobeAnteriorAlveolarDeadSpace);
401  DEFINE_STATIC_STRING(LeftSuperiorLobeApicoposteriorAlveolarDeadSpace);
402 
403  DEFINE_STATIC_STRING(RightSuperiorLobeApicalAlveoli);
404  DEFINE_STATIC_STRING(RightSuperiorLobePosteriorAlveoli);
405  DEFINE_STATIC_STRING(RightSuperiorLobeAnteriorAlveoli);
406  DEFINE_STATIC_STRING(RightMiddleLobeLateralAlveoli);
407  DEFINE_STATIC_STRING(RightMiddleLobeMedialAlveoli);
408  DEFINE_STATIC_STRING(RightInferiorLobeSuperiorAlveoli);
409  DEFINE_STATIC_STRING(RightInferiorLobeMedialBasalAlveoli);
410  DEFINE_STATIC_STRING(RightInferiorLobeAnteriorBasalAlveoli);
411  DEFINE_STATIC_STRING(RightInferiorLobeLateralBasalAlveoli);
412  DEFINE_STATIC_STRING(RightInferiorLobePosteriorBasalAlveoli);
413 
414  DEFINE_STATIC_STRING(LeftInferiorLobePosteriorBasalAlveoli);
415  DEFINE_STATIC_STRING(LeftInferiorLobeLateralBasalAlveoli);
416  DEFINE_STATIC_STRING(LeftInferiorLobeAnteromedialBasalAlveoli);
417  DEFINE_STATIC_STRING(LeftInferiorLobeSuperiorAlveoli);
418  DEFINE_STATIC_STRING(LeftSuperiorLobeInferiorLingulaAlveoli);
419  DEFINE_STATIC_STRING(LeftSuperiorLobeSuperiorLingulaAlveoli);
420  DEFINE_STATIC_STRING(LeftSuperiorLobeAnteriorAlveoli);
421  DEFINE_STATIC_STRING(LeftSuperiorLobeApicoposteriorAlveoli);
422 
423  static const std::vector<std::string>& GetValues()
424  {
425  ScopedMutex lock;
426  if (_values.empty())
427  {
428  _values.push_back(RightBranches);
429  _values.push_back(LeftBranches);
430 
431  _values.push_back(RightMainBronchus);
432  _values.push_back(LeftMainBronchus);
433  _values.push_back(RightIntermediateBronchus);
434  _values.push_back(RightSuperiorLobarBronchus);
435  _values.push_back(RightMiddleLobarBronchus);
436  _values.push_back(RightInferiorLobarBronchus1);
437  _values.push_back(LeftInferiorLobarBronchus1);
438  _values.push_back(LeftSuperiorLobarBronchus);
439  _values.push_back(RightInferiorLobarBronchus2);
440  _values.push_back(LeftInferiorLobarBronchus2);
441  _values.push_back(RightSuperiorApicoposteriorBronchus);
442  _values.push_back(RightInferiorLobarBronchus3);
443  _values.push_back(LeftInferiorLobarBronchus3);
444  _values.push_back(LeftLingularBonchus);
445  _values.push_back(LeftSuperiorApicoposteriorBronchus);
446  _values.push_back(RightInferiorLobarBronchus4);
447 
448  _values.push_back(RightSuperiorLobeApicalBronchiole);
449  _values.push_back(RightSuperiorLobePosteriorBronchiole);
450  _values.push_back(RightSuperiorLobeAnteriorBronchiole);
451  _values.push_back(RightMiddleLobeLateralBronchiole);
452  _values.push_back(RightMiddleLobeMedialBronchiole);
453  _values.push_back(RightInferiorLobeSuperiorBronchiole);
454  _values.push_back(RightInferiorLobeMedialBasalBronchiole);
455  _values.push_back(RightInferiorLobeAnteriorBasalBronchiole);
456  _values.push_back(RightInferiorLobeLateralBasalBronchiole);
457  _values.push_back(RightInferiorLobePosteriorBasalBronchiole);
458 
459  _values.push_back(LeftInferiorLobePosteriorBasalBronchiole);
460  _values.push_back(LeftInferiorLobeLateralBasalBronchiole);
461  _values.push_back(LeftInferiorLobeAnteromedialBasalBronchiole);
462  _values.push_back(LeftInferiorLobeSuperiorBronchiole);
463  _values.push_back(LeftSuperiorLobeInferiorLingulaBronchiole);
464  _values.push_back(LeftSuperiorLobeSuperiorLingulaBronchiole);
465  _values.push_back(LeftSuperiorLobeAnteriorBronchiole);
466  _values.push_back(LeftSuperiorLobeApicoposteriorBronchiole);
467 
468  _values.push_back(RightSuperiorLobeApicalAlveolarDeadSpace);
469  _values.push_back(RightSuperiorLobePosteriorAlveolarDeadSpace);
470  _values.push_back(RightSuperiorLobeAnteriorAlveolarDeadSpace);
471  _values.push_back(RightMiddleLobeLateralAlveolarDeadSpace);
472  _values.push_back(RightMiddleLobeMedialAlveolarDeadSpace);
473  _values.push_back(RightInferiorLobeSuperiorAlveolarDeadSpace);
474  _values.push_back(RightInferiorLobeMedialBasalAlveolarDeadSpace);
475  _values.push_back(RightInferiorLobeAnteriorBasalAlveolarDeadSpace);
476  _values.push_back(RightInferiorLobeLateralBasalAlveolarDeadSpace);
477  _values.push_back(RightInferiorLobePosteriorBasalAlveolarDeadSpace);
478 
479  _values.push_back(LeftInferiorLobePosteriorBasalAlveolarDeadSpace);
480  _values.push_back(LeftInferiorLobeLateralBasalAlveolarDeadSpace);
481  _values.push_back(LeftInferiorLobeAnteromedialBasalAlveolarDeadSpace);
482  _values.push_back(LeftInferiorLobeSuperiorAlveolarDeadSpace);
483  _values.push_back(LeftSuperiorLobeInferiorLingulaAlveolarDeadSpace);
484  _values.push_back(LeftSuperiorLobeSuperiorLingulaAlveolarDeadSpace);
485  _values.push_back(LeftSuperiorLobeAnteriorAlveolarDeadSpace);
486  _values.push_back(LeftSuperiorLobeApicoposteriorAlveolarDeadSpace);
487 
488  _values.push_back(RightSuperiorLobeApicalAlveoli);
489  _values.push_back(RightSuperiorLobePosteriorAlveoli);
490  _values.push_back(RightSuperiorLobeAnteriorAlveoli);
491  _values.push_back(RightMiddleLobeLateralAlveoli);
492  _values.push_back(RightMiddleLobeMedialAlveoli);
493  _values.push_back(RightInferiorLobeSuperiorAlveoli);
494  _values.push_back(RightInferiorLobeMedialBasalAlveoli);
495  _values.push_back(RightInferiorLobeAnteriorBasalAlveoli);
496  _values.push_back(RightInferiorLobeLateralBasalAlveoli);
497  _values.push_back(RightInferiorLobePosteriorBasalAlveoli);
498 
499  _values.push_back(LeftInferiorLobePosteriorBasalAlveoli);
500  _values.push_back(LeftInferiorLobeLateralBasalAlveoli);
501  _values.push_back(LeftInferiorLobeAnteromedialBasalAlveoli);
502  _values.push_back(LeftInferiorLobeSuperiorAlveoli);
503  _values.push_back(LeftSuperiorLobeInferiorLingulaAlveoli);
504  _values.push_back(LeftSuperiorLobeSuperiorLingulaAlveoli);
505  _values.push_back(LeftSuperiorLobeAnteriorAlveoli);
506  _values.push_back(LeftSuperiorLobeApicoposteriorAlveoli);
507  }
508  return _values;
509  }
510  static bool HasValue(const std::string& v)
511  {
512  return std::find(_values.begin(), _values.end(), v) != _values.end();
513  }
514  static void AddValue(const std::string& v)
515  {
516  if (!HasValue(v))
517  {
518  ScopedMutex lock;
519  _values.push_back(v);
520  }
521  }
522  protected:
523  static std::vector<std::string> _values;
524  };
525 
526  class ExpandedLungsPulmonaryLink
527  {
528  public:
529  DEFINE_STATIC_STRING(CarinaToRightMainBronchus);
530  DEFINE_STATIC_STRING(RightMainBronchusToRightIntermediateBronchus);
531  DEFINE_STATIC_STRING(RightMainBronchusToRightSuperiorLobarBronchus);
532  DEFINE_STATIC_STRING(RightIntermediateBronchusToRightMiddleLobarBronchus);
533  DEFINE_STATIC_STRING(RightIntermediateBronchusToRightInferiorLobarBronchus1);
534  DEFINE_STATIC_STRING(RightInferiorLobarBronchus1ToRightInferiorLobarBronchus2);
535  DEFINE_STATIC_STRING(RightSuperiorLobarBronchusToRightSuperiorApicoposteriorBronchus);
536  DEFINE_STATIC_STRING(RightInferiorLobarBronchus2ToRightInferiorLobarBronchus3);
537  DEFINE_STATIC_STRING(RightInferiorLobarBronchus2ToRightInferiorLobarBronchus4);
538 
539  DEFINE_STATIC_STRING(CarinaToLeftMainBronchus);
540  DEFINE_STATIC_STRING(LeftMainBronchusToLeftInferiorLobarBronchus1);
541  DEFINE_STATIC_STRING(LeftMainBronchusToLeftSuperiorLobarBronchus);
542  DEFINE_STATIC_STRING(LeftInferiorLobarBronchus1ToLeftInferiorLobarBronchus2);
543  DEFINE_STATIC_STRING(LeftInferiorLobarBronchus2ToLeftInferiorLobarBronchus3);
544  DEFINE_STATIC_STRING(LeftSuperiorLobarBronchusToLeftLingularBonchus);
545  DEFINE_STATIC_STRING(LeftSuperiorLobarBronchusToLeftSuperiorApicoposteriorBronchus);
546 
547  DEFINE_STATIC_STRING(RightSuperiorApicoposteriorBronchusToRightSuperiorLobeApicalBronchiole);
548  DEFINE_STATIC_STRING(RightSuperiorApicoposteriorBronchusToRightSuperiorLobePosteriorBronchiole);
549  DEFINE_STATIC_STRING(RightSuperiorLobarBronchusToRightSuperiorLobeAnteriorBronchiole);
550  DEFINE_STATIC_STRING(RightMiddleLobarBronchusToRightMiddleLobeLateralBronchiole);
551  DEFINE_STATIC_STRING(RightMiddleLobarBronchusToRightMiddleLobeMedialBronchiole);
552  DEFINE_STATIC_STRING(RightInferiorLobarBronchus1ToRightInferiorLobeSuperiorBronchiole);
553  DEFINE_STATIC_STRING(RightInferiorLobarBronchus2ToRightInferiorLobeMedialBasalBronchiole);
554  DEFINE_STATIC_STRING(RightInferiorLobarBronchus3ToRightInferiorLobeAnteriorBasalBronchiole);
555  DEFINE_STATIC_STRING(RightInferiorLobarBronchus4ToRightInferiorLobeLateralBasalBronchiole);
556  DEFINE_STATIC_STRING(RightInferiorLobarBronchus4ToRightInferiorLobePosteriorBasalBronchiole);
557 
558  DEFINE_STATIC_STRING(LeftInferiorLobarBronchus3ToLeftInferiorLobeLateralBasalBronchiole);
559  DEFINE_STATIC_STRING(LeftInferiorLobarBronchus3ToLeftInferiorLobePosteriorBasalBronchiole);
560  DEFINE_STATIC_STRING(LeftInferiorLobarBronchus2ToLeftInferiorLobeAnteromedialBasalBronchiole);
561  DEFINE_STATIC_STRING(LeftInferiorLobarBronchus1ToLeftInferiorLobeSuperiorBronchiole);
562  DEFINE_STATIC_STRING(LeftLingularBonchusToLeftSuperiorLobeInferiorLingulaBronchiole);
563  DEFINE_STATIC_STRING(LeftLingularBonchusToLeftSuperiorLobeSuperiorLingulaBronchiole);
564  DEFINE_STATIC_STRING(LeftSuperiorApicoposteriorBronchusToLeftSuperiorLobeAnteriorBronchiole);
565  DEFINE_STATIC_STRING(LeftSuperiorApicoposteriorBronchusToLeftSuperiorLobeApicoposteriorBronchiole);
566 
567  DEFINE_STATIC_STRING(RightSuperiorLobeApicalBronchioleToRightSuperiorLobeApicalAlveolarDeadSpace);
568  DEFINE_STATIC_STRING(RightSuperiorLobePosteriorBronchioleToRightSuperiorLobePosteriorAlveolarDeadSpace);
569  DEFINE_STATIC_STRING(RightSuperiorLobeAnteriorBronchioleToRightSuperiorLobeAnteriorAlveolarDeadSpace);
570  DEFINE_STATIC_STRING(RightMiddleLobeLateralBronchioleToRightMiddleLobeLateralAlveolarDeadSpace);
571  DEFINE_STATIC_STRING(RightMiddleLobeMedialBronchioleToRightMiddleLobeMedialAlveolarDeadSpace);
572  DEFINE_STATIC_STRING(RightInferiorLobeSuperiorBronchioleToRightInferiorLobeSuperiorAlveolarDeadSpace);
573  DEFINE_STATIC_STRING(RightInferiorLobeMedialBasalBronchioleToRightInferiorLobeMedialBasalAlveolarDeadSpace);
574  DEFINE_STATIC_STRING(RightInferiorLobeAnteriorBasalBronchioleToRightInferiorLobeAnteriorBasalAlveolarDeadSpace);
575  DEFINE_STATIC_STRING(RightInferiorLobeLateralBasalBronchioleToRightInferiorLobeLateralBasalAlveolarDeadSpace);
576  DEFINE_STATIC_STRING(RightInferiorLobePosteriorBasalBronchioleToRightInferiorLobePosteriorBasalAlveolarDeadSpace);
577 
578  DEFINE_STATIC_STRING(LeftInferiorLobePosteriorBasalBronchioleToLeftInferiorLobePosteriorBasalAlveolarDeadSpace);
579  DEFINE_STATIC_STRING(LeftInferiorLobeLateralBasalBronchioleToLeftInferiorLobeLateralBasalAlveolarDeadSpace);
580  DEFINE_STATIC_STRING(LeftInferiorLobeAnteromedialBasalBronchioleToLeftInferiorLobeAnteromedialBasalAlveolarDeadSpace);
581  DEFINE_STATIC_STRING(LeftInferiorLobeSuperiorBronchioleToLeftInferiorLobeSuperiorAlveolarDeadSpace);
582  DEFINE_STATIC_STRING(LeftSuperiorLobeInferiorLingulaBronchioleToLeftSuperiorLobeInferiorLingulaAlveolarDeadSpace);
583  DEFINE_STATIC_STRING(LeftSuperiorLobeSuperiorLingulaBronchioleToLeftSuperiorLobeSuperiorLingulaAlveolarDeadSpace);
584  DEFINE_STATIC_STRING(LeftSuperiorLobeAnteriorBronchioleToLeftSuperiorLobeAnteriorAlveolarDeadSpace);
585  DEFINE_STATIC_STRING(LeftSuperiorLobeApicoposteriorBronchioleToLeftSuperiorLobeApicoposteriorAlveolarDeadSpace);
586 
587  DEFINE_STATIC_STRING(RightSuperiorLobeApicalAlveolarDeadSpaceToRightSuperiorLobeApicalAlveoli);
588  DEFINE_STATIC_STRING(RightSuperiorLobePosteriorAlveolarDeadSpaceToRightSuperiorLobePosteriorAlveoli);
589  DEFINE_STATIC_STRING(RightSuperiorLobeAnteriorAlveolarDeadSpaceToRightSuperiorLobeAnteriorAlveoli);
590  DEFINE_STATIC_STRING(RightMiddleLobeLateralAlveolarDeadSpaceToRightMiddleLobeLateralAlveoli);
591  DEFINE_STATIC_STRING(RightMiddleLobeMedialAlveolarDeadSpaceToRightMiddleLobeMedialAlveoli);
592  DEFINE_STATIC_STRING(RightInferiorLobeSuperiorAlveolarDeadSpaceToRightInferiorLobeSuperiorAlveoli);
593  DEFINE_STATIC_STRING(RightInferiorLobeMedialBasalAlveolarDeadSpaceToRightInferiorLobeMedialBasalAlveoli);
594  DEFINE_STATIC_STRING(RightInferiorLobeAnteriorBasalAlveolarDeadSpaceToRightInferiorLobeAnteriorBasalAlveoli);
595  DEFINE_STATIC_STRING(RightInferiorLobeLateralBasalAlveolarDeadSpaceToRightInferiorLobeLateralBasalAlveoli);
596  DEFINE_STATIC_STRING(RightInferiorLobePosteriorBasalAlveolarDeadSpaceToRightInferiorLobePosteriorBasalAlveoli);
597 
598  DEFINE_STATIC_STRING(LeftInferiorLobePosteriorBasalAlveolarDeadSpaceToLeftInferiorLobePosteriorBasalAlveoli);
599  DEFINE_STATIC_STRING(LeftInferiorLobeLateralBasalAlveolarDeadSpaceToLeftInferiorLobeLateralBasalAlveoli);
600  DEFINE_STATIC_STRING(LeftInferiorLobeAnteromedialBasalAlveolarDeadSpaceToLeftInferiorLobeAnteromedialBasalAlveoli);
601  DEFINE_STATIC_STRING(LeftInferiorLobeSuperiorAlveolarDeadSpaceToLeftInferiorLobeSuperiorAlveoli);
602  DEFINE_STATIC_STRING(LeftSuperiorLobeInferiorLingulaAlveolarDeadSpaceToLeftSuperiorLobeInferiorLingulaAlveoli);
603  DEFINE_STATIC_STRING(LeftSuperiorLobeSuperiorLingulaAlveolarDeadSpaceToLeftSuperiorLobeSuperiorLingulaAlveoli);
604  DEFINE_STATIC_STRING(LeftSuperiorLobeAnteriorAlveolarDeadSpaceToLeftSuperiorLobeAnteriorAlveoli);
605  DEFINE_STATIC_STRING(LeftSuperiorLobeApicoposteriorAlveolarDeadSpaceToLeftSuperiorLobeApicoposteriorAlveoli);
606 
607  static const std::vector<std::string>& GetValues()
608  {
609  ScopedMutex lock;
610  if (_values.empty())
611  {
612  _values.push_back(CarinaToRightMainBronchus);
613  _values.push_back(RightMainBronchusToRightIntermediateBronchus);
614  _values.push_back(RightMainBronchusToRightSuperiorLobarBronchus);
615  _values.push_back(RightIntermediateBronchusToRightMiddleLobarBronchus);
616  _values.push_back(RightIntermediateBronchusToRightInferiorLobarBronchus1);
617  _values.push_back(RightInferiorLobarBronchus1ToRightInferiorLobarBronchus2);
618  _values.push_back(RightSuperiorLobarBronchusToRightSuperiorApicoposteriorBronchus);
619  _values.push_back(RightInferiorLobarBronchus2ToRightInferiorLobarBronchus3);
620  _values.push_back(RightInferiorLobarBronchus2ToRightInferiorLobarBronchus4);
621 
622  _values.push_back(CarinaToLeftMainBronchus);
623  _values.push_back(LeftMainBronchusToLeftInferiorLobarBronchus1);
624  _values.push_back(LeftMainBronchusToLeftSuperiorLobarBronchus);
625  _values.push_back(LeftInferiorLobarBronchus1ToLeftInferiorLobarBronchus2);
626  _values.push_back(LeftInferiorLobarBronchus2ToLeftInferiorLobarBronchus3);
627  _values.push_back(LeftSuperiorLobarBronchusToLeftLingularBonchus);
628  _values.push_back(LeftSuperiorLobarBronchusToLeftSuperiorApicoposteriorBronchus);
629 
630  _values.push_back(RightSuperiorApicoposteriorBronchusToRightSuperiorLobeApicalBronchiole);
631  _values.push_back(RightSuperiorApicoposteriorBronchusToRightSuperiorLobePosteriorBronchiole);
632  _values.push_back(RightSuperiorLobarBronchusToRightSuperiorLobeAnteriorBronchiole);
633  _values.push_back(RightMiddleLobarBronchusToRightMiddleLobeLateralBronchiole);
634  _values.push_back(RightMiddleLobarBronchusToRightMiddleLobeMedialBronchiole);
635  _values.push_back(RightInferiorLobarBronchus1ToRightInferiorLobeSuperiorBronchiole);
636  _values.push_back(RightInferiorLobarBronchus2ToRightInferiorLobeMedialBasalBronchiole);
637  _values.push_back(RightInferiorLobarBronchus3ToRightInferiorLobeAnteriorBasalBronchiole);
638  _values.push_back(RightInferiorLobarBronchus4ToRightInferiorLobeLateralBasalBronchiole);
639  _values.push_back(RightInferiorLobarBronchus4ToRightInferiorLobePosteriorBasalBronchiole);
640 
641  _values.push_back(LeftInferiorLobarBronchus3ToLeftInferiorLobeLateralBasalBronchiole);
642  _values.push_back(LeftInferiorLobarBronchus3ToLeftInferiorLobePosteriorBasalBronchiole);
643  _values.push_back(LeftInferiorLobarBronchus2ToLeftInferiorLobeAnteromedialBasalBronchiole);
644  _values.push_back(LeftInferiorLobarBronchus1ToLeftInferiorLobeSuperiorBronchiole);
645  _values.push_back(LeftLingularBonchusToLeftSuperiorLobeInferiorLingulaBronchiole);
646  _values.push_back(LeftLingularBonchusToLeftSuperiorLobeSuperiorLingulaBronchiole);
647  _values.push_back(LeftSuperiorApicoposteriorBronchusToLeftSuperiorLobeAnteriorBronchiole);
648  _values.push_back(LeftSuperiorApicoposteriorBronchusToLeftSuperiorLobeApicoposteriorBronchiole);
649 
650  _values.push_back(RightSuperiorLobeApicalBronchioleToRightSuperiorLobeApicalAlveolarDeadSpace);
651  _values.push_back(RightSuperiorLobePosteriorBronchioleToRightSuperiorLobePosteriorAlveolarDeadSpace);
652  _values.push_back(RightSuperiorLobeAnteriorBronchioleToRightSuperiorLobeAnteriorAlveolarDeadSpace);
653  _values.push_back(RightMiddleLobeLateralBronchioleToRightMiddleLobeLateralAlveolarDeadSpace);
654  _values.push_back(RightMiddleLobeMedialBronchioleToRightMiddleLobeMedialAlveolarDeadSpace);
655  _values.push_back(RightInferiorLobeSuperiorBronchioleToRightInferiorLobeSuperiorAlveolarDeadSpace);
656  _values.push_back(RightInferiorLobeMedialBasalBronchioleToRightInferiorLobeMedialBasalAlveolarDeadSpace);
657  _values.push_back(RightInferiorLobeAnteriorBasalBronchioleToRightInferiorLobeAnteriorBasalAlveolarDeadSpace);
658  _values.push_back(RightInferiorLobeLateralBasalBronchioleToRightInferiorLobeLateralBasalAlveolarDeadSpace);
659  _values.push_back(RightInferiorLobePosteriorBasalBronchioleToRightInferiorLobePosteriorBasalAlveolarDeadSpace);
660 
661  _values.push_back(LeftInferiorLobePosteriorBasalBronchioleToLeftInferiorLobePosteriorBasalAlveolarDeadSpace);
662  _values.push_back(LeftInferiorLobeLateralBasalBronchioleToLeftInferiorLobeLateralBasalAlveolarDeadSpace);
663  _values.push_back(LeftInferiorLobeAnteromedialBasalBronchioleToLeftInferiorLobeAnteromedialBasalAlveolarDeadSpace);
664  _values.push_back(LeftInferiorLobeSuperiorBronchioleToLeftInferiorLobeSuperiorAlveolarDeadSpace);
665  _values.push_back(LeftSuperiorLobeInferiorLingulaBronchioleToLeftSuperiorLobeInferiorLingulaAlveolarDeadSpace);
666  _values.push_back(LeftSuperiorLobeSuperiorLingulaBronchioleToLeftSuperiorLobeSuperiorLingulaAlveolarDeadSpace);
667  _values.push_back(LeftSuperiorLobeAnteriorBronchioleToLeftSuperiorLobeAnteriorAlveolarDeadSpace);
668  _values.push_back(LeftSuperiorLobeApicoposteriorBronchioleToLeftSuperiorLobeApicoposteriorAlveolarDeadSpace);
669 
670  _values.push_back(RightSuperiorLobeApicalAlveolarDeadSpaceToRightSuperiorLobeApicalAlveoli);
671  _values.push_back(RightSuperiorLobePosteriorAlveolarDeadSpaceToRightSuperiorLobePosteriorAlveoli);
672  _values.push_back(RightSuperiorLobeAnteriorAlveolarDeadSpaceToRightSuperiorLobeAnteriorAlveoli);
673  _values.push_back(RightMiddleLobeLateralAlveolarDeadSpaceToRightMiddleLobeLateralAlveoli);
674  _values.push_back(RightMiddleLobeMedialAlveolarDeadSpaceToRightMiddleLobeMedialAlveoli);
675  _values.push_back(RightInferiorLobeSuperiorAlveolarDeadSpaceToRightInferiorLobeSuperiorAlveoli);
676  _values.push_back(RightInferiorLobeMedialBasalAlveolarDeadSpaceToRightInferiorLobeMedialBasalAlveoli);
677  _values.push_back(RightInferiorLobeAnteriorBasalAlveolarDeadSpaceToRightInferiorLobeAnteriorBasalAlveoli);
678  _values.push_back(RightInferiorLobeLateralBasalAlveolarDeadSpaceToRightInferiorLobeLateralBasalAlveoli);
679  _values.push_back(RightInferiorLobePosteriorBasalAlveolarDeadSpaceToRightInferiorLobePosteriorBasalAlveoli);
680 
681  _values.push_back(LeftInferiorLobePosteriorBasalAlveolarDeadSpaceToLeftInferiorLobePosteriorBasalAlveoli);
682  _values.push_back(LeftInferiorLobeLateralBasalAlveolarDeadSpaceToLeftInferiorLobeLateralBasalAlveoli);
683  _values.push_back(LeftInferiorLobeAnteromedialBasalAlveolarDeadSpaceToLeftInferiorLobeAnteromedialBasalAlveoli);
684  _values.push_back(LeftInferiorLobeSuperiorAlveolarDeadSpaceToLeftInferiorLobeSuperiorAlveoli);
685  _values.push_back(LeftSuperiorLobeInferiorLingulaAlveolarDeadSpaceToLeftSuperiorLobeInferiorLingulaAlveoli);
686  _values.push_back(LeftSuperiorLobeSuperiorLingulaAlveolarDeadSpaceToLeftSuperiorLobeSuperiorLingulaAlveoli);
687  _values.push_back(LeftSuperiorLobeAnteriorAlveolarDeadSpaceToLeftSuperiorLobeAnteriorAlveoli);
688  _values.push_back(LeftSuperiorLobeApicoposteriorAlveolarDeadSpaceToLeftSuperiorLobeApicoposteriorAlveoli);
689  }
690  return _values;
691  }
692  static bool HasValue(const std::string& v)
693  {
694  return std::find(_values.begin(), _values.end(), v) != _values.end();
695  }
696  static void AddValue(const std::string& v)
697  {
698  if (!HasValue(v))
699  {
700  ScopedMutex lock;
701  _values.push_back(v);
702  }
703  }
704  protected:
705  static std::vector<std::string> _values;
706  };
707 
708  class TissueCompartment
709  {
710  public:
711  DEFINE_STATIC_STRING_EX(Bone, BoneTissue);
712  DEFINE_STATIC_STRING_EX(Brain, BrainTissue);
713  DEFINE_STATIC_STRING_EX(Fat, FatTissue);
714  DEFINE_STATIC_STRING_EX(Gut, GutTissue);
715  DEFINE_STATIC_STRING_EX(LeftKidney, LeftKidneyTissue);
716  DEFINE_STATIC_STRING_EX(LeftLung, LeftLungTissue);
717  DEFINE_STATIC_STRING_EX(Liver, LiverTissue);
718  DEFINE_STATIC_STRING_EX(Muscle, MuscleTissue);
719  DEFINE_STATIC_STRING_EX(Myocardium, MyocardiumTissue);
720  DEFINE_STATIC_STRING_EX(RightKidney, RightKidneyTissue);
721  DEFINE_STATIC_STRING_EX(RightLung, RightLungTissue);
722  DEFINE_STATIC_STRING_EX(Skin, SkinTissue);
723  DEFINE_STATIC_STRING_EX(Spleen, SpleenTissue);
724 
725  static const std::vector<std::string>& GetValues()
726  {
727  ScopedMutex lock;
728  if (_values.empty())
729  {
730  _values.push_back(Bone);
731  _values.push_back(Brain);
732  _values.push_back(Fat);
733  _values.push_back(Gut);
734  _values.push_back(LeftKidney);
735  _values.push_back(LeftLung);
736  _values.push_back(Liver);
737  _values.push_back(Muscle);
738  _values.push_back(Myocardium);
739  _values.push_back(RightKidney);
740  _values.push_back(RightLung);
741  _values.push_back(Skin);
742  _values.push_back(Spleen);
743  }
744  return _values;
745  }
746  static bool HasValue(const std::string& v)
747  {
748  return std::find(_values.begin(), _values.end(), v) != _values.end();
749  }
750  static void AddValue(const std::string& v)
751  {
752  if (!HasValue(v))
753  {
754  ScopedMutex lock;
755  _values.push_back(v);
756  }
757  }
758  protected:
759  static std::vector<std::string> _values;
760  };
761 
762  class ExtravascularCompartment
763  {
764  public:
765  DEFINE_STATIC_STRING_EX(BoneExtracellular, BoneTissueExtracellular);
766  DEFINE_STATIC_STRING_EX(BrainExtracellular, BrainTissueExtracellular);
767  DEFINE_STATIC_STRING_EX(FatExtracellular, FatTissueExtracellular);
768  DEFINE_STATIC_STRING_EX(GutExtracellular, GutTissueExtracellular);
769  DEFINE_STATIC_STRING_EX(LeftKidneyExtracellular, LeftKidneyTissueExtracellular);
770  DEFINE_STATIC_STRING_EX(LeftLungExtracellular, LeftLungTissueExtracellular);
771  DEFINE_STATIC_STRING_EX(LiverExtracellular, LiverTissueExtracellular);
772  DEFINE_STATIC_STRING_EX(MuscleExtracellular, MuscleTissueExtracellular);
773  DEFINE_STATIC_STRING_EX(MyocardiumExtracellular, MyocardiumTissueExtracellular);
774  DEFINE_STATIC_STRING_EX(RightKidneyExtracellular, RightKidneyTissueExtracellular);
775  DEFINE_STATIC_STRING_EX(RightLungExtracellular, RightLungTissueExtracellular);
776  DEFINE_STATIC_STRING_EX(SkinExtracellular, SkinTissueExtracellular);
777  DEFINE_STATIC_STRING_EX(SpleenExtracellular, SpleenTissueExtracellular);
778 
779  DEFINE_STATIC_STRING_EX(BoneIntracellular, BoneTissueIntracellular);
780  DEFINE_STATIC_STRING_EX(BrainIntracellular, BrainTissueIntracellular);
781  DEFINE_STATIC_STRING_EX(FatIntracellular, FatTissueIntracellular);
782  DEFINE_STATIC_STRING_EX(GutIntracellular, GutTissueIntracellular);
783  DEFINE_STATIC_STRING_EX(LeftKidneyIntracellular, LeftKidneyTissueIntracellular);
784  DEFINE_STATIC_STRING_EX(LeftLungIntracellular, LeftLungTissueIntracellular);
785  DEFINE_STATIC_STRING_EX(LiverIntracellular, LiverTissueIntracellular);
786  DEFINE_STATIC_STRING_EX(MuscleIntracellular, MuscleTissueIntracellular);
787  DEFINE_STATIC_STRING_EX(MyocardiumIntracellular, MyocardiumTissueIntracellular);
788  DEFINE_STATIC_STRING_EX(RightKidneyIntracellular, RightKidneyTissueIntracellular);
789  DEFINE_STATIC_STRING_EX(RightLungIntracellular, RightLungTissueIntracellular);
790  DEFINE_STATIC_STRING_EX(SkinIntracellular, SkinTissueIntracellular);
791  DEFINE_STATIC_STRING_EX(SpleenIntracellular, SpleenTissueIntracellular);
792 
793  static const std::vector<std::string>& GetValues()
794  {
795  ScopedMutex lock;
796  if (_values.empty())
797  {
798  _values.push_back(BoneExtracellular);
799  _values.push_back(BrainExtracellular);
800  _values.push_back(FatExtracellular);
801  _values.push_back(GutExtracellular);
802  _values.push_back(LeftKidneyExtracellular);
803  _values.push_back(LeftLungExtracellular);
804  _values.push_back(LiverExtracellular);
805  _values.push_back(MuscleExtracellular);
806  _values.push_back(MyocardiumExtracellular);
807  _values.push_back(RightKidneyExtracellular);
808  _values.push_back(RightLungExtracellular);
809  _values.push_back(SkinExtracellular);
810  _values.push_back(SpleenExtracellular);
811 
812  _values.push_back(BoneIntracellular);
813  _values.push_back(BrainIntracellular);
814  _values.push_back(FatIntracellular);
815  _values.push_back(GutIntracellular);
816  _values.push_back(LeftKidneyIntracellular);
817  _values.push_back(LeftLungIntracellular);
818  _values.push_back(LiverIntracellular);
819  _values.push_back(MuscleIntracellular);
820  _values.push_back(MyocardiumIntracellular);
821  _values.push_back(RightKidneyIntracellular);
822  _values.push_back(RightLungIntracellular);
823  _values.push_back(SkinIntracellular);
824  _values.push_back(SpleenIntracellular);
825  }
826  return _values;
827  }
828  static bool HasValue(const std::string& v)
829  {
830  return std::find(_values.begin(), _values.end(), v) != _values.end();
831  }
832  static void AddValue(const std::string& v)
833  {
834  if (!HasValue(v))
835  {
836  ScopedMutex lock;
837  _values.push_back(v);
838  }
839  }
840  protected:
841  static std::vector<std::string> _values;
842  };
843 
844  class VascularCompartment
845  {
846  public:
847  // Cardio
848  DEFINE_STATIC_STRING(Aorta);
849  DEFINE_STATIC_STRING(Heart);
850  DEFINE_STATIC_STRING_EX(Myocardium, MyocardiumVasculature);
851  DEFINE_STATIC_STRING(LeftHeart);
852  DEFINE_STATIC_STRING(RightHeart);
853  DEFINE_STATIC_STRING(Pericardium);
854  DEFINE_STATIC_STRING(VenaCava);
855  // Pulmonary
856  DEFINE_STATIC_STRING(PulmonaryArteries);
857  DEFINE_STATIC_STRING(PulmonaryCapillaries);
858  DEFINE_STATIC_STRING(PulmonaryVeins);
859  DEFINE_STATIC_STRING_EX(Lungs, LungsVasculature);
860  DEFINE_STATIC_STRING_EX(LeftLung, LeftLungVasculature);
861  /***/DEFINE_STATIC_STRING(LeftPulmonaryArteries);
862  /***/DEFINE_STATIC_STRING(LeftPulmonaryCapillaries);
863  /***/DEFINE_STATIC_STRING(LeftPulmonaryVeins);
864  DEFINE_STATIC_STRING_EX(RightLung, RightLungVasculature);
865  /***/DEFINE_STATIC_STRING(RightPulmonaryArteries);
866  /***/DEFINE_STATIC_STRING(RightPulmonaryCapillaries);
867  /***/DEFINE_STATIC_STRING(RightPulmonaryVeins);
868  // Renal
869  DEFINE_STATIC_STRING_EX(Kidneys, KidneyVasculature);
870  DEFINE_STATIC_STRING_EX(LeftKidney, LeftKidneyVasculature);
871  /***/DEFINE_STATIC_STRING(LeftRenalArtery);
872  /***/DEFINE_STATIC_STRING(LeftNephron);
873  /*********/DEFINE_STATIC_STRING(LeftAfferentArteriole);
874  /*********/DEFINE_STATIC_STRING(LeftGlomerularCapillaries);
875  /*********/DEFINE_STATIC_STRING(LeftEfferentArteriole);
876  /*********/DEFINE_STATIC_STRING(LeftPeritubularCapillaries);
877  /*********/DEFINE_STATIC_STRING(LeftBowmansCapsules);
878  /*********/DEFINE_STATIC_STRING(LeftTubules);
879  /***/DEFINE_STATIC_STRING(LeftRenalVein);
880  DEFINE_STATIC_STRING_EX(RightKidney, RightKidneyVasculature);
881  /***/DEFINE_STATIC_STRING(RightRenalArtery);
882  /***/DEFINE_STATIC_STRING(RightNephron);
883  /*********/DEFINE_STATIC_STRING(RightAfferentArteriole);
884  /*********/DEFINE_STATIC_STRING(RightGlomerularCapillaries);
885  /*********/DEFINE_STATIC_STRING(RightEfferentArteriole);
886  /*********/DEFINE_STATIC_STRING(RightPeritubularCapillaries);
887  /*********/DEFINE_STATIC_STRING(RightBowmansCapsules);
888  /*********/DEFINE_STATIC_STRING(RightTubules);
889  /***/DEFINE_STATIC_STRING(RightRenalVein);
890  // General Organs and Periphery
891  DEFINE_STATIC_STRING_EX(Bone, BoneVasculature);
892  DEFINE_STATIC_STRING_EX(Brain, BrainVasculature);
893  DEFINE_STATIC_STRING_EX(Fat, FatVasculature);
894  DEFINE_STATIC_STRING_EX(Gut, GutVasculature);
895  DEFINE_STATIC_STRING_EX(Splanchnic, SplanchnicVasculature);
896  DEFINE_STATIC_STRING_EX(SmallIntestine, SmallIntestineVasculature);
897  DEFINE_STATIC_STRING_EX(LargeIntestine, LargeIntestineVasculature);
898  DEFINE_STATIC_STRING_EX(Liver, LiverVasculature);
899  DEFINE_STATIC_STRING_EX(Spleen, SpleenVasculature);
900  DEFINE_STATIC_STRING_EX(Skin, SkinVasculature);
901  DEFINE_STATIC_STRING_EX(Muscle, MuscleVasculature);
902  DEFINE_STATIC_STRING_EX(LeftArm, LeftArmVasculature);
903  DEFINE_STATIC_STRING_EX(LeftLeg, LeftLegVasculature);
904  DEFINE_STATIC_STRING_EX(RightArm, RightArmVasculature);
905  DEFINE_STATIC_STRING_EX(RightLeg, RightLegVasculature);
906  DEFINE_STATIC_STRING(Abdomen);
907  DEFINE_STATIC_STRING(AbdominalCavity);
908 
909  DEFINE_STATIC_STRING(Ground);
910 
911 
912  static const std::vector<std::string>& GetValues()
913  {
914  ScopedMutex lock;
915  if (_values.empty())
916  {
917  _values.push_back(Aorta);
918  _values.push_back(Abdomen);
919  _values.push_back(Heart);
920  _values.push_back(Myocardium);
921  _values.push_back(LeftHeart);
922  _values.push_back(RightHeart);
923  _values.push_back(Pericardium);
924  _values.push_back(VenaCava);
925  _values.push_back(PulmonaryArteries);
926  _values.push_back(PulmonaryCapillaries);
927  _values.push_back(PulmonaryVeins);
928  _values.push_back(Lungs);
929  _values.push_back(LeftLung);
930  _values.push_back(LeftPulmonaryArteries);
931  _values.push_back(LeftPulmonaryCapillaries);
932  _values.push_back(LeftPulmonaryVeins);
933  _values.push_back(RightLung);
934  _values.push_back(RightPulmonaryArteries);
935  _values.push_back(RightPulmonaryCapillaries);
936  _values.push_back(RightPulmonaryVeins);
937  _values.push_back(Kidneys);
938  _values.push_back(LeftKidney);
939  _values.push_back(LeftRenalArtery);
940  _values.push_back(LeftNephron);
941  _values.push_back(LeftAfferentArteriole);
942  _values.push_back(LeftGlomerularCapillaries);
943  _values.push_back(LeftEfferentArteriole);
944  _values.push_back(LeftPeritubularCapillaries);
945  _values.push_back(LeftBowmansCapsules);
946  _values.push_back(LeftTubules);
947  _values.push_back(LeftRenalVein);
948  _values.push_back(RightKidney);
949  _values.push_back(RightRenalArtery);
950  _values.push_back(RightNephron);
951  _values.push_back(RightAfferentArteriole);
952  _values.push_back(RightGlomerularCapillaries);
953  _values.push_back(RightEfferentArteriole);
954  _values.push_back(RightPeritubularCapillaries);
955  _values.push_back(RightBowmansCapsules);
956  _values.push_back(RightTubules);
957  _values.push_back(RightRenalVein);
958  _values.push_back(Bone);
959  _values.push_back(Brain);
960  _values.push_back(Fat);
961  _values.push_back(Gut);
962  _values.push_back(Splanchnic);
963  _values.push_back(SmallIntestine);
964  _values.push_back(LargeIntestine);
965  _values.push_back(Liver);
966  _values.push_back(Spleen);
967  _values.push_back(Skin);
968  _values.push_back(Muscle);
969  _values.push_back(LeftArm);
970  _values.push_back(LeftLeg);
971  _values.push_back(RightArm);
972  _values.push_back(RightLeg);
973  //_values.push_back(Ground);
974  }
975  return _values;
976  }
977  static bool HasValue(const std::string& v)
978  {
979  return std::find(_values.begin(), _values.end(), v) != _values.end();
980  }
981  static void AddValue(const std::string& v)
982  {
983  if (!HasValue(v))
984  {
985  ScopedMutex lock;
986  _values.push_back(v);
987  }
988  }
989  protected:
990  static std::vector<std::string> _values;
991  };
992 
993  class VascularLink
994  {
995  public:
996  // Heart and Lungs
997  DEFINE_STATIC_STRING(VenaCavaToRightHeart);
998  DEFINE_STATIC_STRING(RightHeartToLeftPulmonaryArteries);
999  DEFINE_STATIC_STRING(LeftPulmonaryArteriesToCapillaries);
1000  DEFINE_STATIC_STRING(LeftPulmonaryArteriesToVeins);
1001  DEFINE_STATIC_STRING(LeftPulmonaryCapillariesToVeins);
1002  DEFINE_STATIC_STRING(LeftPulmonaryVeinsLeak);
1003  DEFINE_STATIC_STRING(LeftPulmonaryVeinsToLeftHeart);
1004  DEFINE_STATIC_STRING(RightHeartToRightPulmonaryArteries);
1005  DEFINE_STATIC_STRING(RightPulmonaryArteriesToCapillaries);
1006  DEFINE_STATIC_STRING(RightPulmonaryArteriesToVeins);
1007  DEFINE_STATIC_STRING(RightPulmonaryCapillariesToVeins);
1008  DEFINE_STATIC_STRING(RightPulmonaryVeinsLeak);
1009  DEFINE_STATIC_STRING(RightPulmonaryVeinsToLeftHeart);
1010  DEFINE_STATIC_STRING(LeftHeartToAorta);
1011  // Bone
1012  DEFINE_STATIC_STRING(AortaToBone);
1013  DEFINE_STATIC_STRING(BoneToVenaCava);
1014  // Brain
1015  DEFINE_STATIC_STRING(AortaToBrain);
1016  DEFINE_STATIC_STRING(BrainToVenaCava);
1017  // Fat
1018  DEFINE_STATIC_STRING(AortaToFat);
1019  DEFINE_STATIC_STRING(FatToVenaCava);
1020  // Large Intestine
1021  DEFINE_STATIC_STRING(AortaToLargeIntestine);
1022  DEFINE_STATIC_STRING(LargeIntestineToLiver);
1023  // Left Arm
1024  DEFINE_STATIC_STRING(AortaToLeftArm);
1025  DEFINE_STATIC_STRING(LeftArmToVenaCava);
1026  // Left Kidney
1027  DEFINE_STATIC_STRING(AortaToLeftKidney);
1028  DEFINE_STATIC_STRING(LeftKidneyToVenaCava);
1029  // Left Leg
1030  DEFINE_STATIC_STRING(AortaToLeftLeg);
1031  DEFINE_STATIC_STRING(LeftLegToVenaCava);
1032  // Liver
1033  DEFINE_STATIC_STRING(AortaToLiver);
1034  DEFINE_STATIC_STRING(LiverToVenaCava);
1035  // Muscle
1036  DEFINE_STATIC_STRING(AortaToMuscle);
1037  DEFINE_STATIC_STRING(MuscleToVenaCava);
1038  // Myocardium
1039  DEFINE_STATIC_STRING(AortaToMyocardium);
1040  DEFINE_STATIC_STRING(MyocardiumToVenaCava);
1041  // Right Arm
1042  DEFINE_STATIC_STRING(AortaToRightArm);
1043  DEFINE_STATIC_STRING(RightArmToVenaCava);
1044  // Right Kidney
1045  DEFINE_STATIC_STRING(AortaToRightKidney);
1046  DEFINE_STATIC_STRING(RightKidneyToVenaCava);
1047  // Right Leg
1048  DEFINE_STATIC_STRING(AortaToRightLeg);
1049  DEFINE_STATIC_STRING(RightLegToVenaCava);
1050  // Skin
1051  DEFINE_STATIC_STRING(AortaToSkin);
1052  DEFINE_STATIC_STRING(SkinToVenaCava);
1053  // Small Intestine
1054  DEFINE_STATIC_STRING(AortaToSmallIntestine);
1055  DEFINE_STATIC_STRING(SmallIntestineToLiver);
1056  // Splanchnic
1057  DEFINE_STATIC_STRING(AortaToSplanchnic);
1058  DEFINE_STATIC_STRING(SplanchnicToLiver);
1059  // Spleen
1060  DEFINE_STATIC_STRING(AortaToSpleen);
1061  DEFINE_STATIC_STRING(SpleenToLiver);
1062 
1063  // Hemorrhage and IV
1064  DEFINE_STATIC_STRING(VenaCavaIV);
1065 
1066  // Vascular To Tissue Links
1067  DEFINE_STATIC_STRING(BoneVascularToTissue);
1068  DEFINE_STATIC_STRING(BrainVascularToTissue);
1069  DEFINE_STATIC_STRING(FatVascularToTissue);
1070  DEFINE_STATIC_STRING(SmallIntestineVascularToTissue);
1071  DEFINE_STATIC_STRING(LargeIntestineVascularToTissue);
1072  DEFINE_STATIC_STRING(SplanchnicVascularToTissue);
1073  DEFINE_STATIC_STRING(LeftKidneyVascularToTissue);
1074  DEFINE_STATIC_STRING(LeftLungVascularToTissue);
1075  DEFINE_STATIC_STRING(LiverVascularToTissue);
1076  DEFINE_STATIC_STRING(MuscleVascularToTissue);
1077  DEFINE_STATIC_STRING(MyocardiumVascularToTissue);
1078  DEFINE_STATIC_STRING(RightKidneyVascularToTissue);
1079  DEFINE_STATIC_STRING(RightLungVascularToTissue);
1080  DEFINE_STATIC_STRING(SkinVascularToTissue);
1081  DEFINE_STATIC_STRING(SpleenVascularToTissue);
1082 
1083  // Renal Links
1084  // Reusing 'AortaToLeftKidney' to connect the Aorta To Left Renal Artery
1085  DEFINE_STATIC_STRING(LeftRenalArteryToAfferentArteriole);
1086  DEFINE_STATIC_STRING(LeftAfferentArterioleToGlomerularCapillaries);
1087  DEFINE_STATIC_STRING(LeftGlomerularCapillariesToEfferentArteriole);
1088  DEFINE_STATIC_STRING(LeftGlomerularCapillariesToBowmansCapsules);
1089  DEFINE_STATIC_STRING(LeftBowmansCapsulesToTubules);
1090  DEFINE_STATIC_STRING(LeftTubulesToPeritubularCapillaries);
1091  DEFINE_STATIC_STRING(LeftEfferentArterioleToPeritubularCapillaries);
1092  DEFINE_STATIC_STRING(LeftPeritubularCapillariesToRenalVein);
1093  // Reusing 'LeftKidneyToVenaCava' to connect the Left Renal Vein To Vena Cava
1094 
1095  // Reusing 'AortaToRightKidney' to connect the Aorta To Right Renal Artery
1096  DEFINE_STATIC_STRING(RightRenalArteryToAfferentArteriole);
1097  DEFINE_STATIC_STRING(RightAfferentArterioleToGlomerularCapillaries);
1098  DEFINE_STATIC_STRING(RightGlomerularCapillariesToEfferentArteriole);
1099  DEFINE_STATIC_STRING(RightGlomerularCapillariesToBowmansCapsules);
1100  DEFINE_STATIC_STRING(RightBowmansCapsulesToTubules);
1101  DEFINE_STATIC_STRING(RightTubulesToPeritubularCapillaries);
1102  DEFINE_STATIC_STRING(RightEfferentArterioleToPeritubularCapillaries);
1103  DEFINE_STATIC_STRING(RightPeritubularCapillariesToRenalVein);
1104  // Reusing 'RightKidneyToVenaCava' to connect the Right Renal Vein To Vena Cava);
1105 
1106  static const std::vector<std::string>& GetValues()
1107  {
1108  ScopedMutex lock;
1109  if (_values.empty())
1110  {
1111  _values.push_back(VenaCavaToRightHeart);
1112  _values.push_back(RightHeartToLeftPulmonaryArteries);
1113  _values.push_back(LeftPulmonaryArteriesToCapillaries);
1114  _values.push_back(LeftPulmonaryArteriesToVeins);
1115  _values.push_back(LeftPulmonaryCapillariesToVeins);
1116  _values.push_back(LeftPulmonaryVeinsLeak);
1117  _values.push_back(LeftPulmonaryVeinsToLeftHeart);
1118  _values.push_back(RightHeartToRightPulmonaryArteries);
1119  _values.push_back(RightPulmonaryArteriesToCapillaries);
1120  _values.push_back(RightPulmonaryArteriesToVeins);
1121  _values.push_back(RightPulmonaryCapillariesToVeins);
1122  _values.push_back(RightPulmonaryVeinsLeak);
1123  _values.push_back(RightPulmonaryVeinsToLeftHeart);
1124  _values.push_back(LeftHeartToAorta);
1125  _values.push_back(AortaToBone);
1126  _values.push_back(BoneToVenaCava);
1127  _values.push_back(AortaToBrain);
1128  _values.push_back(BrainToVenaCava);
1129  _values.push_back(AortaToFat);
1130  _values.push_back(FatToVenaCava);
1131  _values.push_back(AortaToLargeIntestine);
1132  _values.push_back(LargeIntestineToLiver);
1133  _values.push_back(AortaToLeftArm);
1134  _values.push_back(LeftArmToVenaCava);
1135  _values.push_back(AortaToLeftKidney);
1136  _values.push_back(LeftKidneyToVenaCava);
1137  _values.push_back(AortaToLeftLeg);
1138  _values.push_back(LeftLegToVenaCava);
1139  _values.push_back(AortaToLiver);
1140  _values.push_back(LiverToVenaCava);
1141  _values.push_back(AortaToMuscle);
1142  _values.push_back(MuscleToVenaCava);
1143  _values.push_back(AortaToMyocardium);
1144  _values.push_back(MyocardiumToVenaCava);
1145  _values.push_back(AortaToRightArm);
1146  _values.push_back(RightArmToVenaCava);
1147  _values.push_back(AortaToRightKidney);
1148  _values.push_back(RightKidneyToVenaCava);
1149  _values.push_back(AortaToRightLeg);
1150  _values.push_back(RightLegToVenaCava);
1151  _values.push_back(AortaToSkin);
1152  _values.push_back(SkinToVenaCava);
1153  _values.push_back(AortaToSmallIntestine);
1154  _values.push_back(SmallIntestineToLiver);
1155  _values.push_back(AortaToSplanchnic);
1156  _values.push_back(SplanchnicToLiver);
1157  _values.push_back(AortaToSpleen);
1158  _values.push_back(SpleenToLiver);
1159 
1160  _values.push_back(BoneVascularToTissue);
1161  _values.push_back(BrainVascularToTissue);
1162  _values.push_back(FatVascularToTissue);
1163  _values.push_back(SmallIntestineVascularToTissue);
1164  _values.push_back(LargeIntestineVascularToTissue);
1165  _values.push_back(SplanchnicVascularToTissue);
1166  _values.push_back(LeftKidneyVascularToTissue);
1167  _values.push_back(LeftLungVascularToTissue);
1168  _values.push_back(LiverVascularToTissue);
1169  _values.push_back(MuscleVascularToTissue);
1170  _values.push_back(MyocardiumVascularToTissue);
1171  _values.push_back(RightKidneyVascularToTissue);
1172  _values.push_back(RightLungVascularToTissue);
1173  _values.push_back(SkinVascularToTissue);
1174  _values.push_back(SpleenVascularToTissue);
1175 
1176  _values.push_back(LeftRenalArteryToAfferentArteriole);
1177  _values.push_back(LeftAfferentArterioleToGlomerularCapillaries);
1178  _values.push_back(LeftGlomerularCapillariesToEfferentArteriole);
1179  _values.push_back(LeftGlomerularCapillariesToBowmansCapsules);
1180  _values.push_back(LeftBowmansCapsulesToTubules);
1181  _values.push_back(LeftTubulesToPeritubularCapillaries);
1182  _values.push_back(LeftEfferentArterioleToPeritubularCapillaries);
1183  _values.push_back(LeftPeritubularCapillariesToRenalVein);
1184  _values.push_back(RightRenalArteryToAfferentArteriole);
1185  _values.push_back(RightAfferentArterioleToGlomerularCapillaries);
1186  _values.push_back(RightGlomerularCapillariesToEfferentArteriole);
1187  _values.push_back(RightGlomerularCapillariesToBowmansCapsules);
1188  _values.push_back(RightBowmansCapsulesToTubules);
1189  _values.push_back(RightTubulesToPeritubularCapillaries);
1190  _values.push_back(RightEfferentArterioleToPeritubularCapillaries);
1191  _values.push_back(RightPeritubularCapillariesToRenalVein);
1192  }
1193  return _values;
1194  }
1195  static bool HasValue(const std::string& v)
1196  {
1197  return std::find(_values.begin(), _values.end(), v) != _values.end();
1198  }
1199  static void AddValue(const std::string& v)
1200  {
1201  if (!HasValue(v))
1202  {
1203  ScopedMutex lock;
1204  _values.push_back(v);
1205  }
1206  }
1207  protected:
1208  static std::vector<std::string> _values;
1209  };
1210 
1211  class ExpandedLungsVascularCompartment
1212  {
1213  public:
1214  DEFINE_STATIC_STRING(RightSuperiorLobeApicalPulmonaryCapillaries);
1215  DEFINE_STATIC_STRING(RightSuperiorLobePosteriorPulmonaryCapillaries);
1216  DEFINE_STATIC_STRING(RightSuperiorLobeAnteriorPulmonaryCapillaries);
1217  DEFINE_STATIC_STRING(RightMiddleLobeLateralPulmonaryCapillaries);
1218  DEFINE_STATIC_STRING(RightMiddleLobeMedialPulmonaryCapillaries);
1219  DEFINE_STATIC_STRING(RightInferiorLobeSuperiorPulmonaryCapillaries);
1220  DEFINE_STATIC_STRING(RightInferiorLobeMedialBasalPulmonaryCapillaries);
1221  DEFINE_STATIC_STRING(RightInferiorLobeAnteriorBasalPulmonaryCapillaries);
1222  DEFINE_STATIC_STRING(RightInferiorLobeLateralBasalPulmonaryCapillaries);
1223  DEFINE_STATIC_STRING(RightInferiorLobePosteriorBasalPulmonaryCapillaries);
1224 
1225  DEFINE_STATIC_STRING(LeftInferiorLobePosteriorBasalPulmonaryCapillaries);
1226  DEFINE_STATIC_STRING(LeftInferiorLobeLateralBasalPulmonaryCapillaries);
1227  DEFINE_STATIC_STRING(LeftInferiorLobeAnteromedialBasalPulmonaryCapillaries);
1228  DEFINE_STATIC_STRING(LeftInferiorLobeSuperiorPulmonaryCapillaries);
1229  DEFINE_STATIC_STRING(LeftSuperiorLobeInferiorLingulaPulmonaryCapillaries);
1230  DEFINE_STATIC_STRING(LeftSuperiorLobeSuperiorLingulaPulmonaryCapillaries);
1231  DEFINE_STATIC_STRING(LeftSuperiorLobeAnteriorPulmonaryCapillaries);
1232  DEFINE_STATIC_STRING(LeftSuperiorLobeApicoposteriorPulmonaryCapillaries);
1233 
1234 
1235  static const std::vector<std::string>& GetValues()
1236  {
1237  ScopedMutex lock;
1238  if (_values.empty())
1239  {
1240  _values.push_back(RightSuperiorLobeApicalPulmonaryCapillaries);
1241  _values.push_back(RightSuperiorLobePosteriorPulmonaryCapillaries);
1242  _values.push_back(RightSuperiorLobeAnteriorPulmonaryCapillaries);
1243  _values.push_back(RightMiddleLobeLateralPulmonaryCapillaries);
1244  _values.push_back(RightMiddleLobeMedialPulmonaryCapillaries);
1245  _values.push_back(RightInferiorLobeSuperiorPulmonaryCapillaries);
1246  _values.push_back(RightInferiorLobeMedialBasalPulmonaryCapillaries);
1247  _values.push_back(RightInferiorLobeAnteriorBasalPulmonaryCapillaries);
1248  _values.push_back(RightInferiorLobeLateralBasalPulmonaryCapillaries);
1249  _values.push_back(RightInferiorLobePosteriorBasalPulmonaryCapillaries);
1250 
1251  _values.push_back(LeftInferiorLobePosteriorBasalPulmonaryCapillaries);
1252  _values.push_back(LeftInferiorLobeLateralBasalPulmonaryCapillaries);
1253  _values.push_back(LeftInferiorLobeAnteromedialBasalPulmonaryCapillaries);
1254  _values.push_back(LeftInferiorLobeSuperiorPulmonaryCapillaries);
1255  _values.push_back(LeftSuperiorLobeInferiorLingulaPulmonaryCapillaries);
1256  _values.push_back(LeftSuperiorLobeSuperiorLingulaPulmonaryCapillaries);
1257  _values.push_back(LeftSuperiorLobeAnteriorPulmonaryCapillaries);
1258  _values.push_back(LeftSuperiorLobeApicoposteriorPulmonaryCapillaries);
1259  }
1260  return _values;
1261  }
1262  static bool HasValue(const std::string& v)
1263  {
1264  return std::find(_values.begin(), _values.end(), v) != _values.end();
1265  }
1266  static void AddValue(const std::string& v)
1267  {
1268  if (!HasValue(v))
1269  {
1270  ScopedMutex lock;
1271  _values.push_back(v);
1272  }
1273  }
1274  protected:
1275  static std::vector<std::string> _values;
1276  };
1277 
1278  class ExpandedLungsVascularLink
1279  {
1280  public:
1281  DEFINE_STATIC_STRING(RightPulmonaryArteriesToRightSuperiorLobeApicalPulmonaryCapillaries);
1282  DEFINE_STATIC_STRING(RightPulmonaryArteriesToRightSuperiorLobePosteriorPulmonaryCapillaries);
1283  DEFINE_STATIC_STRING(RightPulmonaryArteriesToRightSuperiorLobeAnteriorPulmonaryCapillaries);
1284  DEFINE_STATIC_STRING(RightPulmonaryArteriesToRightMiddleLobeLateralPulmonaryCapillaries);
1285  DEFINE_STATIC_STRING(RightPulmonaryArteriesToRightMiddleLobeMedialPulmonaryCapillaries);
1286  DEFINE_STATIC_STRING(RightPulmonaryArteriesToRightInferiorLobeSuperiorPulmonaryCapillaries);
1287  DEFINE_STATIC_STRING(RightPulmonaryArteriesToRightInferiorLobeMedialBasalPulmonaryCapillaries);
1288  DEFINE_STATIC_STRING(RightPulmonaryArteriesToRightInferiorLobeAnteriorBasalPulmonaryCapillaries);
1289  DEFINE_STATIC_STRING(RightPulmonaryArteriesToRightInferiorLobeLateralBasalPulmonaryCapillaries);
1290  DEFINE_STATIC_STRING(RightPulmonaryArteriesToRightInferiorLobePosteriorBasalPulmonaryCapillaries);
1291 
1292  DEFINE_STATIC_STRING(LeftPulmonaryArteriesToLeftInferiorLobePosteriorBasalPulmonaryCapillaries);
1293  DEFINE_STATIC_STRING(LeftPulmonaryArteriesToLeftInferiorLobeLateralBasalPulmonaryCapillaries);
1294  DEFINE_STATIC_STRING(LeftPulmonaryArteriesToLeftInferiorLobeAnteromedialBasalPulmonaryCapillaries);
1295  DEFINE_STATIC_STRING(LeftPulmonaryArteriesToLeftInferiorLobeSuperiorPulmonaryCapillaries);
1296  DEFINE_STATIC_STRING(LeftPulmonaryArteriesToLeftSuperiorLobeInferiorLingulaPulmonaryCapillaries);
1297  DEFINE_STATIC_STRING(LeftPulmonaryArteriesToLeftSuperiorLobeSuperiorLingulaPulmonaryCapillaries);
1298  DEFINE_STATIC_STRING(LeftPulmonaryArteriesToLeftSuperiorLobeAnteriorPulmonaryCapillaries);
1299  DEFINE_STATIC_STRING(LeftPulmonaryArteriesToLeftSuperiorLobeApicoposteriorPulmonaryCapillaries);
1300 
1301  DEFINE_STATIC_STRING(RightSuperiorLobeApicalPulmonaryCapillariesToRightPulmonaryVeins);
1302  DEFINE_STATIC_STRING(RightSuperiorLobePosteriorPulmonaryCapillariesToRightPulmonaryVeins);
1303  DEFINE_STATIC_STRING(RightSuperiorLobeAnteriorPulmonaryCapillariesToRightPulmonaryVeins);
1304  DEFINE_STATIC_STRING(RightMiddleLobeLateralPulmonaryCapillariesToRightPulmonaryVeins);
1305  DEFINE_STATIC_STRING(RightMiddleLobeMedialPulmonaryCapillariesToRightPulmonaryVeins);
1306  DEFINE_STATIC_STRING(RightInferiorLobeSuperiorPulmonaryCapillariesToRightPulmonaryVeins);
1307  DEFINE_STATIC_STRING(RightInferiorLobeMedialBasalPulmonaryCapillariesToRightPulmonaryVeins);
1308  DEFINE_STATIC_STRING(RightInferiorLobeAnteriorBasalPulmonaryCapillariesToRightPulmonaryVeins);
1309  DEFINE_STATIC_STRING(RightInferiorLobeLateralBasalPulmonaryCapillariesToRightPulmonaryVeins);
1310  DEFINE_STATIC_STRING(RightInferiorLobePosteriorBasalPulmonaryCapillariesToRightPulmonaryVeins);
1311 
1312  DEFINE_STATIC_STRING(LeftInferiorLobePosteriorBasalPulmonaryCapillariesToLeftPulmonaryVeins);
1313  DEFINE_STATIC_STRING(LeftInferiorLobeLateralBasalPulmonaryCapillariesToLeftPulmonaryVeins);
1314  DEFINE_STATIC_STRING(LeftInferiorLobeAnteromedialBasalPulmonaryCapillariesToLeftPulmonaryVeins);
1315  DEFINE_STATIC_STRING(LeftInferiorLobeSuperiorPulmonaryCapillariesToLeftPulmonaryVeins);
1316  DEFINE_STATIC_STRING(LeftSuperiorLobeInferiorLingulaPulmonaryCapillariesToLeftPulmonaryVeins);
1317  DEFINE_STATIC_STRING(LeftSuperiorLobeSuperiorLingulaPulmonaryCapillariesToLeftPulmonaryVeins);
1318  DEFINE_STATIC_STRING(LeftSuperiorLobeAnteriorPulmonaryCapillariesToLeftPulmonaryVeins);
1319  DEFINE_STATIC_STRING(LeftSuperiorLobeApicoposteriorPulmonaryCapillariesToLeftPulmonaryVeins);
1320 
1321  DEFINE_STATIC_STRING(RightSuperiorLobeApicalShunt);
1322  DEFINE_STATIC_STRING(RightSuperiorLobePosteriorShunt);
1323  DEFINE_STATIC_STRING(RightSuperiorLobeAnteriorShunt);
1324  DEFINE_STATIC_STRING(RightMiddleLobeLateralShunt);
1325  DEFINE_STATIC_STRING(RightMiddleLobeMedialShunt);
1326  DEFINE_STATIC_STRING(RightInferiorLobeSuperiorShunt);
1327  DEFINE_STATIC_STRING(RightInferiorLobeMedialBasalShunt);
1328  DEFINE_STATIC_STRING(RightInferiorLobeAnteriorBasalShunt);
1329  DEFINE_STATIC_STRING(RightInferiorLobeLateralBasalShunt);
1330  DEFINE_STATIC_STRING(RightInferiorLobePosteriorBasalShunt);
1331 
1332  DEFINE_STATIC_STRING(LeftInferiorLobePosteriorBasalShunt);
1333  DEFINE_STATIC_STRING(LeftInferiorLobeLateralBasalShunt);
1334  DEFINE_STATIC_STRING(LeftInferiorLobeAnteromedialBasalShunt);
1335  DEFINE_STATIC_STRING(LeftInferiorLobeSuperiorShunt);
1336  DEFINE_STATIC_STRING(LeftSuperiorLobeInferiorLingulaShunt);
1337  DEFINE_STATIC_STRING(LeftSuperiorLobeSuperiorLingulaShunt);
1338  DEFINE_STATIC_STRING(LeftSuperiorLobeAnteriorShunt);
1339  DEFINE_STATIC_STRING(LeftSuperiorLobeApicoposteriorShunt);
1340 
1341 
1342  static const std::vector<std::string>& GetValues()
1343  {
1344  ScopedMutex lock;
1345  if (_values.empty())
1346  {
1347  _values.push_back(RightPulmonaryArteriesToRightSuperiorLobeApicalPulmonaryCapillaries);
1348  _values.push_back(RightPulmonaryArteriesToRightSuperiorLobePosteriorPulmonaryCapillaries);
1349  _values.push_back(RightPulmonaryArteriesToRightSuperiorLobeAnteriorPulmonaryCapillaries);
1350  _values.push_back(RightPulmonaryArteriesToRightMiddleLobeLateralPulmonaryCapillaries);
1351  _values.push_back(RightPulmonaryArteriesToRightMiddleLobeMedialPulmonaryCapillaries);
1352  _values.push_back(RightPulmonaryArteriesToRightInferiorLobeSuperiorPulmonaryCapillaries);
1353  _values.push_back(RightPulmonaryArteriesToRightInferiorLobeMedialBasalPulmonaryCapillaries);
1354  _values.push_back(RightPulmonaryArteriesToRightInferiorLobeAnteriorBasalPulmonaryCapillaries);
1355  _values.push_back(RightPulmonaryArteriesToRightInferiorLobeLateralBasalPulmonaryCapillaries);
1356  _values.push_back(RightPulmonaryArteriesToRightInferiorLobePosteriorBasalPulmonaryCapillaries);
1357 
1358  _values.push_back(LeftPulmonaryArteriesToLeftInferiorLobePosteriorBasalPulmonaryCapillaries);
1359  _values.push_back(LeftPulmonaryArteriesToLeftInferiorLobeLateralBasalPulmonaryCapillaries);
1360  _values.push_back(LeftPulmonaryArteriesToLeftInferiorLobeAnteromedialBasalPulmonaryCapillaries);
1361  _values.push_back(LeftPulmonaryArteriesToLeftInferiorLobeSuperiorPulmonaryCapillaries);
1362  _values.push_back(LeftPulmonaryArteriesToLeftSuperiorLobeInferiorLingulaPulmonaryCapillaries);
1363  _values.push_back(LeftPulmonaryArteriesToLeftSuperiorLobeSuperiorLingulaPulmonaryCapillaries);
1364  _values.push_back(LeftPulmonaryArteriesToLeftSuperiorLobeAnteriorPulmonaryCapillaries);
1365  _values.push_back(LeftPulmonaryArteriesToLeftSuperiorLobeApicoposteriorPulmonaryCapillaries);
1366 
1367  _values.push_back(RightSuperiorLobeApicalPulmonaryCapillariesToRightPulmonaryVeins);
1368  _values.push_back(RightSuperiorLobePosteriorPulmonaryCapillariesToRightPulmonaryVeins);
1369  _values.push_back(RightSuperiorLobeAnteriorPulmonaryCapillariesToRightPulmonaryVeins);
1370  _values.push_back(RightMiddleLobeLateralPulmonaryCapillariesToRightPulmonaryVeins);
1371  _values.push_back(RightMiddleLobeMedialPulmonaryCapillariesToRightPulmonaryVeins);
1372  _values.push_back(RightInferiorLobeSuperiorPulmonaryCapillariesToRightPulmonaryVeins);
1373  _values.push_back(RightInferiorLobeMedialBasalPulmonaryCapillariesToRightPulmonaryVeins);
1374  _values.push_back(RightInferiorLobeAnteriorBasalPulmonaryCapillariesToRightPulmonaryVeins);
1375  _values.push_back(RightInferiorLobeLateralBasalPulmonaryCapillariesToRightPulmonaryVeins);
1376  _values.push_back(RightInferiorLobePosteriorBasalPulmonaryCapillariesToRightPulmonaryVeins);
1377 
1378  _values.push_back(LeftInferiorLobePosteriorBasalPulmonaryCapillariesToLeftPulmonaryVeins);
1379  _values.push_back(LeftInferiorLobeLateralBasalPulmonaryCapillariesToLeftPulmonaryVeins);
1380  _values.push_back(LeftInferiorLobeAnteromedialBasalPulmonaryCapillariesToLeftPulmonaryVeins);
1381  _values.push_back(LeftInferiorLobeSuperiorPulmonaryCapillariesToLeftPulmonaryVeins);
1382  _values.push_back(LeftSuperiorLobeInferiorLingulaPulmonaryCapillariesToLeftPulmonaryVeins);
1383  _values.push_back(LeftSuperiorLobeSuperiorLingulaPulmonaryCapillariesToLeftPulmonaryVeins);
1384  _values.push_back(LeftSuperiorLobeAnteriorPulmonaryCapillariesToLeftPulmonaryVeins);
1385  _values.push_back(LeftSuperiorLobeApicoposteriorPulmonaryCapillariesToLeftPulmonaryVeins);
1386 
1387  _values.push_back(RightSuperiorLobeApicalShunt);
1388  _values.push_back(RightSuperiorLobePosteriorShunt);
1389  _values.push_back(RightSuperiorLobeAnteriorShunt);
1390  _values.push_back(RightMiddleLobeLateralShunt);
1391  _values.push_back(RightMiddleLobeMedialShunt);
1392  _values.push_back(RightInferiorLobeSuperiorShunt);
1393  _values.push_back(RightInferiorLobeMedialBasalShunt);
1394  _values.push_back(RightInferiorLobeAnteriorBasalShunt);
1395  _values.push_back(RightInferiorLobeLateralBasalShunt);
1396  _values.push_back(RightInferiorLobePosteriorBasalShunt);
1397 
1398  _values.push_back(LeftInferiorLobePosteriorBasalShunt);
1399  _values.push_back(LeftInferiorLobeLateralBasalShunt);
1400  _values.push_back(LeftInferiorLobeAnteromedialBasalShunt);
1401  _values.push_back(LeftInferiorLobeSuperiorShunt);
1402  _values.push_back(LeftSuperiorLobeInferiorLingulaShunt);
1403  _values.push_back(LeftSuperiorLobeSuperiorLingulaShunt);
1404  _values.push_back(LeftSuperiorLobeAnteriorShunt);
1405  _values.push_back(LeftSuperiorLobeApicoposteriorShunt);
1406  }
1407  return _values;
1408  }
1409  static bool HasValue(const std::string& v)
1410  {
1411  return std::find(_values.begin(), _values.end(), v) != _values.end();
1412  }
1413  static void AddValue(const std::string& v)
1414  {
1415  if (!HasValue(v))
1416  {
1417  ScopedMutex lock;
1418  _values.push_back(v);
1419  }
1420  }
1421  protected:
1422  static std::vector<std::string> _values;
1423  };
1424 
1425  class ComputationalLifeVascularCompartment
1426  {
1427  public:
1428  DEFINE_STATIC_STRING(ArterialBuffer);
1429  DEFINE_STATIC_STRING(VenousBuffer);
1430 
1431  DEFINE_STATIC_STRING_EX(Head, HeadVasculature);
1432  DEFINE_STATIC_STRING_EX(Extracranial, ExtracranialVasculature);
1433  DEFINE_STATIC_STRING_EX(Intracranial, IntracranialVasculature);
1434 
1435  DEFINE_STATIC_STRING_EX(Gut1, Gut1Vasculature);
1436  DEFINE_STATIC_STRING_EX(LeftArmArterioles, LeftArmArteriolesVasculature);
1437  DEFINE_STATIC_STRING_EX(LeftArmBone, LeftArmBoneVasculature);
1438  DEFINE_STATIC_STRING_EX(LeftArmFat, LeftArmFatVasculature);
1439  DEFINE_STATIC_STRING(LeftArmMicrovasculature);
1440  DEFINE_STATIC_STRING_EX(LeftArmMuscle, LeftArmMuscleVasculature);
1441  DEFINE_STATIC_STRING_EX(LeftArmSkin, LeftArmSkinVasculature);
1442  DEFINE_STATIC_STRING_EX(LeftArmVenules, LeftArmVenulesVasculature);
1443  DEFINE_STATIC_STRING_EX(LeftLegArterioles, LeftLegArteriolesVasculature);
1444  DEFINE_STATIC_STRING_EX(LeftLegBone, LeftLegBoneVasculature);
1445  DEFINE_STATIC_STRING_EX(LeftLegFat, LeftLegFatVasculature);
1446  DEFINE_STATIC_STRING(LeftLegMicrovasculature);
1447  DEFINE_STATIC_STRING_EX(LeftLegMuscle, LeftLegMuscleVasculature);
1448  DEFINE_STATIC_STRING_EX(LeftLegSkin, LeftLegSkinVasculature);
1449  DEFINE_STATIC_STRING_EX(LeftLegVenules, LeftLegVenulesVasculature);
1450  DEFINE_STATIC_STRING_EX(RightArmArterioles, RightArmArteriolesVasculature);
1451  DEFINE_STATIC_STRING_EX(RightArmBone, RightArmBoneVasculature);
1452  DEFINE_STATIC_STRING_EX(RightArmFat, RightArmFatVasculature);
1453  DEFINE_STATIC_STRING(RightArmMicrovasculature);
1454  DEFINE_STATIC_STRING_EX(RightArmMuscle, RightArmMuscleVasculature);
1455  DEFINE_STATIC_STRING_EX(RightArmSkin, RightArmSkinVasculature);
1456  DEFINE_STATIC_STRING_EX(RightArmVenules, RightArmVenulesVasculature);
1457  DEFINE_STATIC_STRING_EX(RightLegArterioles, RightLegArteriolesVasculature);
1458  DEFINE_STATIC_STRING_EX(RightLegBone, RightLegBoneVasculature);
1459  DEFINE_STATIC_STRING_EX(RightLegFat, RightLegFatVasculature);
1460  DEFINE_STATIC_STRING(RightLegMicrovasculature);
1461  DEFINE_STATIC_STRING_EX(RightLegMuscle, RightLegMuscleVasculature);
1462  DEFINE_STATIC_STRING_EX(RightLegSkin, RightLegSkinVasculature);
1463  DEFINE_STATIC_STRING_EX(RightLegVenules, RightLegVenulesVasculature);
1464  DEFINE_STATIC_STRING_EX(Torso, TorsoVasculature);
1465  DEFINE_STATIC_STRING_EX(TorsoArterioles, TorsoArteriolesVasculature);
1466  DEFINE_STATIC_STRING_EX(TorsoBone, TorsoBoneVasculature);
1467  DEFINE_STATIC_STRING_EX(TorsoFat, TorsoFatVasculature);
1468  DEFINE_STATIC_STRING(TorsoMicrovasculature);
1469  DEFINE_STATIC_STRING_EX(TorsoMuscle, TorsoMuscleVasculature);
1470  DEFINE_STATIC_STRING_EX(TorsoSkin, TorsoSkinVasculature);
1471  DEFINE_STATIC_STRING_EX(TorsoVenules, TorsoVenulesVasculature);
1472 
1473 
1474  static const std::vector<std::string>& GetValues()
1475  {
1476  ScopedMutex lock;
1477  if (_values.empty())
1478  {
1479  _values.push_back(ArterialBuffer);
1480  _values.push_back(VenousBuffer);
1481  _values.push_back(Head);
1482  _values.push_back(Extracranial);
1483  _values.push_back(Intracranial);
1484  _values.push_back(Gut1);
1485  _values.push_back(LeftArmArterioles);
1486  _values.push_back(LeftArmFat);
1487  _values.push_back(LeftArmMuscle);
1488  _values.push_back(LeftArmSkin);
1489  _values.push_back(LeftArmBone);
1490  _values.push_back(LeftArmMicrovasculature);
1491  _values.push_back(LeftArmVenules);
1492  _values.push_back(LeftLegArterioles);
1493  _values.push_back(LeftLegFat);
1494  _values.push_back(LeftLegMuscle);
1495  _values.push_back(LeftLegSkin);
1496  _values.push_back(LeftLegBone);
1497  _values.push_back(LeftLegMicrovasculature);
1498  _values.push_back(LeftLegVenules);
1499  _values.push_back(RightArmArterioles);
1500  _values.push_back(RightArmFat);
1501  _values.push_back(RightArmMuscle);
1502  _values.push_back(RightArmSkin);
1503  _values.push_back(RightArmBone);
1504  _values.push_back(RightArmMicrovasculature);
1505  _values.push_back(RightArmVenules);
1506  _values.push_back(RightLegArterioles);
1507  _values.push_back(RightLegFat);
1508  _values.push_back(RightLegMuscle);
1509  _values.push_back(RightLegSkin);
1510  _values.push_back(RightLegBone);
1511  _values.push_back(RightLegMicrovasculature);
1512  _values.push_back(RightLegVenules);
1513  _values.push_back(Torso);
1514  _values.push_back(TorsoArterioles);
1515  _values.push_back(TorsoBone);
1516  _values.push_back(TorsoFat);
1517  _values.push_back(TorsoMicrovasculature);
1518  _values.push_back(TorsoMuscle);
1519  _values.push_back(TorsoSkin);
1520  _values.push_back(TorsoVenules);
1521  }
1522  return _values;
1523  }
1524  static bool HasValue(const std::string& v)
1525  {
1526  return std::find(_values.begin(), _values.end(), v) != _values.end();
1527  }
1528  static void AddValue(const std::string& v)
1529  {
1530  if (!HasValue(v))
1531  {
1532  ScopedMutex lock;
1533  _values.push_back(v);
1534  }
1535  }
1536  protected:
1537  static std::vector<std::string> _values;
1538  };
1539 
1540  class ComputationalLifeVascularLink
1541  {
1542  public:
1543  // Heart and Lungs
1544  DEFINE_STATIC_STRING(VenousBufferToVenaCava);
1545  DEFINE_STATIC_STRING(AortaToArterialBuffer);
1546  // Head
1547  DEFINE_STATIC_STRING(AortaToIntracranial);
1548  DEFINE_STATIC_STRING(IntracranialToVenaCava);
1549  DEFINE_STATIC_STRING(AortaToExtracranial);
1550  DEFINE_STATIC_STRING(ExtracranialToVenaCava);
1551  // Left Arm
1552  DEFINE_STATIC_STRING(AortaToLeftArmArterioles);
1553  DEFINE_STATIC_STRING(LeftArmArteriolesToLeftArmBone);
1554  DEFINE_STATIC_STRING(LeftArmArteriolesToLeftArmFat);
1555  DEFINE_STATIC_STRING(LeftArmArteriolesToLeftArmMicrovasculature);
1556  DEFINE_STATIC_STRING(LeftArmArteriolesToLeftArmMuscle);
1557  DEFINE_STATIC_STRING(LeftArmArteriolesToLeftArmSkin);
1558 
1559  DEFINE_STATIC_STRING(LeftArmBoneToLeftArmVenules);
1560  DEFINE_STATIC_STRING(LeftArmFatToLeftArmVenules);
1561  DEFINE_STATIC_STRING(LeftArmMicrovasculatureToLeftArmVenules);
1562  DEFINE_STATIC_STRING(LeftArmMuscleToLeftArmVenules);
1563  DEFINE_STATIC_STRING(LeftArmSkinToLeftArmVenules);
1564  DEFINE_STATIC_STRING(LeftArmVenulesToVenaCava);
1565 
1566  // Left Leg
1567  DEFINE_STATIC_STRING(AortaToLeftLegArterioles);
1568  DEFINE_STATIC_STRING(LeftLegArteriolesToLeftLegBone);
1569  DEFINE_STATIC_STRING(LeftLegArteriolesToLeftLegFat);
1570  DEFINE_STATIC_STRING(LeftLegArteriolesToLeftLegMicrovasculature);
1571  DEFINE_STATIC_STRING(LeftLegArteriolesToLeftLegMuscle);
1572  DEFINE_STATIC_STRING(LeftLegArteriolesToLeftLegSkin);
1573 
1574  DEFINE_STATIC_STRING(LeftLegBoneToLeftLegVenules);
1575  DEFINE_STATIC_STRING(LeftLegFatToLeftLegVenules);
1576  DEFINE_STATIC_STRING(LeftLegMicrovasculatureToLeftLegVenules);
1577  DEFINE_STATIC_STRING(LeftLegMuscleToLeftLegVenules);
1578  DEFINE_STATIC_STRING(LeftLegSkinToLeftLegVenules);
1579  DEFINE_STATIC_STRING(LeftLegVenulesToVenaCava);
1580 
1581  // Gut
1582  DEFINE_STATIC_STRING(AortaToGut);
1583 
1584  // Right Arm
1585  DEFINE_STATIC_STRING(AortaToRightArmArterioles);
1586  DEFINE_STATIC_STRING(RightArmArteriolesToRightArmBone);
1587  DEFINE_STATIC_STRING(RightArmArteriolesToRightArmFat);
1588  DEFINE_STATIC_STRING(RightArmArteriolesToRightArmMicrovasculature);
1589  DEFINE_STATIC_STRING(RightArmArteriolesToRightArmMuscle);
1590  DEFINE_STATIC_STRING(RightArmArteriolesToRightArmSkin);
1591 
1592  DEFINE_STATIC_STRING(RightArmBoneToRightArmVenules);
1593  DEFINE_STATIC_STRING(RightArmFatToRightArmVenules);
1594  DEFINE_STATIC_STRING(RightArmMicrovasculatureToRightArmVenules);
1595  DEFINE_STATIC_STRING(RightArmMuscleToRightArmVenules);
1596  DEFINE_STATIC_STRING(RightArmSkinToRightArmVenules);
1597  DEFINE_STATIC_STRING(RightArmVenulesToVenaCava);
1598 
1599  // Right Leg
1600  DEFINE_STATIC_STRING(AortaToRightLegArterioles);
1601  DEFINE_STATIC_STRING(RightLegArteriolesToRightLegBone);
1602  DEFINE_STATIC_STRING(RightLegArteriolesToRightLegFat);
1603  DEFINE_STATIC_STRING(RightLegArteriolesToRightLegMicrovasculature);
1604  DEFINE_STATIC_STRING(RightLegArteriolesToRightLegMuscle);
1605  DEFINE_STATIC_STRING(RightLegArteriolesToRightLegSkin);
1606 
1607  DEFINE_STATIC_STRING(RightLegBoneToRightLegVenules);
1608  DEFINE_STATIC_STRING(RightLegFatToRightLegVenules);
1609  DEFINE_STATIC_STRING(RightLegMicrovasculatureToRightLegVenules);
1610  DEFINE_STATIC_STRING(RightLegMuscleToRightLegVenules);
1611  DEFINE_STATIC_STRING(RightLegSkinToRightLegVenules);
1612  DEFINE_STATIC_STRING(RightLegVenulesToVenaCava);
1613 
1614  // Torso
1615  DEFINE_STATIC_STRING(AortaToTorsoArterioles);
1616  DEFINE_STATIC_STRING(TorsoArteriolesToTorsoBone);
1617  DEFINE_STATIC_STRING(TorsoArteriolesToTorsoFat);
1618  DEFINE_STATIC_STRING(TorsoArteriolesToTorsoMicrovasculature);
1619  DEFINE_STATIC_STRING(TorsoArteriolesToTorsoMuscle);
1620  DEFINE_STATIC_STRING(TorsoArteriolesToTorsoSkin);
1621 
1622  DEFINE_STATIC_STRING(TorsoSkinToTorsoVenules);
1623  DEFINE_STATIC_STRING(TorsoMuscleToTorsoVenules);
1624  DEFINE_STATIC_STRING(TorsoMicrovasculatureToTorsoVenules);
1625  DEFINE_STATIC_STRING(TorsoFatToTorsoVenules);
1626  DEFINE_STATIC_STRING(TorsoBoneToTorsoVenules);
1627  DEFINE_STATIC_STRING(TorsoVenulesToVenaCava);
1628 
1629  // Vascular To Tissue Links
1630  DEFINE_STATIC_STRING(TorsoBoneVascularToTissue);
1631  DEFINE_STATIC_STRING(LeftArmBoneVascularToTissue);
1632  DEFINE_STATIC_STRING(LeftLegBoneVascularToTissue);
1633  DEFINE_STATIC_STRING(RightArmBoneVascularToTissue);
1634  DEFINE_STATIC_STRING(RightLegBoneVascularToTissue);
1635  DEFINE_STATIC_STRING(BrainVascularToTissue);
1636  DEFINE_STATIC_STRING(TorsoFatVascularToTissue);
1637  DEFINE_STATIC_STRING(LeftArmFatVascularToTissue);
1638  DEFINE_STATIC_STRING(LeftLegFatVascularToTissue);
1639  DEFINE_STATIC_STRING(RightArmFatVascularToTissue);
1640  DEFINE_STATIC_STRING(RightLegFatVascularToTissue);
1641  DEFINE_STATIC_STRING(SmallIntestineVascularToTissue);
1642  DEFINE_STATIC_STRING(LargeIntestineVascularToTissue);
1643  DEFINE_STATIC_STRING(SplanchnicVascularToTissue);
1644  DEFINE_STATIC_STRING(LeftKidneyVascularToTissue);
1645  DEFINE_STATIC_STRING(LeftLungVascularToTissue);
1646  DEFINE_STATIC_STRING(LiverVascularToTissue);
1647  DEFINE_STATIC_STRING(TorsoMuscleVascularToTissue);
1648  DEFINE_STATIC_STRING(LeftArmMuscleVascularToTissue);
1649  DEFINE_STATIC_STRING(LeftLegMuscleVascularToTissue);
1650  DEFINE_STATIC_STRING(RightArmMuscleVascularToTissue);
1651  DEFINE_STATIC_STRING(RightLegMuscleVascularToTissue);
1652  DEFINE_STATIC_STRING(MyocardiumVascularToTissue);
1653  DEFINE_STATIC_STRING(RightKidneyVascularToTissue);
1654  DEFINE_STATIC_STRING(RightLungVascularToTissue);
1655  DEFINE_STATIC_STRING(TorsoSkinVascularToTissue);
1656  DEFINE_STATIC_STRING(LeftArmSkinVascularToTissue);
1657  DEFINE_STATIC_STRING(LeftLegSkinVascularToTissue);
1658  DEFINE_STATIC_STRING(RightArmSkinVascularToTissue);
1659  DEFINE_STATIC_STRING(RightLegSkinVascularToTissue);
1660  DEFINE_STATIC_STRING(SpleenVascularToTissue);
1661 
1662  static const std::vector<std::string>& GetValues()
1663  {
1664  ScopedMutex lock;
1665  if (_values.empty())
1666  {
1667  _values.push_back(AortaToIntracranial);
1668  _values.push_back(IntracranialToVenaCava);
1669  _values.push_back(AortaToExtracranial);
1670  _values.push_back(ExtracranialToVenaCava);
1671 
1672  _values.push_back(LeftArmArteriolesToLeftArmBone);
1673  _values.push_back(LeftArmArteriolesToLeftArmFat);
1674  _values.push_back(LeftArmArteriolesToLeftArmMicrovasculature);
1675  _values.push_back(LeftArmArteriolesToLeftArmMuscle);
1676  _values.push_back(LeftArmArteriolesToLeftArmSkin);
1677 
1678  _values.push_back(LeftLegArteriolesToLeftLegBone);
1679  _values.push_back(LeftLegArteriolesToLeftLegFat);
1680  _values.push_back(LeftLegArteriolesToLeftLegMicrovasculature);
1681  _values.push_back(LeftLegArteriolesToLeftLegMuscle);
1682  _values.push_back(LeftLegArteriolesToLeftLegSkin);
1683 
1684  _values.push_back(RightArmArteriolesToRightArmBone);
1685  _values.push_back(RightArmArteriolesToRightArmFat);
1686  _values.push_back(RightArmArteriolesToRightArmMicrovasculature);
1687  _values.push_back(RightArmArteriolesToRightArmMuscle);
1688  _values.push_back(RightArmArteriolesToRightArmSkin);
1689 
1690  _values.push_back(RightLegArteriolesToRightLegBone);
1691  _values.push_back(RightLegArteriolesToRightLegFat);
1692  _values.push_back(RightLegArteriolesToRightLegMicrovasculature);
1693  _values.push_back(RightLegArteriolesToRightLegMuscle);
1694  _values.push_back(RightLegArteriolesToRightLegSkin);
1695 
1696  _values.push_back(AortaToTorsoArterioles);
1697  _values.push_back(TorsoArteriolesToTorsoBone);
1698  _values.push_back(TorsoArteriolesToTorsoFat);
1699  _values.push_back(TorsoArteriolesToTorsoMicrovasculature);
1700  _values.push_back(TorsoArteriolesToTorsoMuscle);
1701  _values.push_back(TorsoArteriolesToTorsoSkin);
1702 
1703  _values.push_back(RightArmBoneToRightArmVenules);
1704  _values.push_back(RightArmFatToRightArmVenules);
1705  _values.push_back(RightArmMicrovasculatureToRightArmVenules);
1706  _values.push_back(RightArmMuscleToRightArmVenules);
1707  _values.push_back(RightArmSkinToRightArmVenules);
1708  _values.push_back(RightLegBoneToRightLegVenules);
1709  _values.push_back(RightLegFatToRightLegVenules);
1710  _values.push_back(RightLegMicrovasculatureToRightLegVenules);
1711  _values.push_back(RightLegMuscleToRightLegVenules);
1712  _values.push_back(RightLegSkinToRightLegVenules);
1713  _values.push_back(LeftArmBoneToLeftArmVenules);
1714  _values.push_back(LeftArmFatToLeftArmVenules);
1715  _values.push_back(LeftArmMicrovasculatureToLeftArmVenules);
1716  _values.push_back(LeftArmMuscleToLeftArmVenules);
1717  _values.push_back(LeftArmSkinToLeftArmVenules);
1718  _values.push_back(LeftLegBoneToLeftLegVenules);
1719  _values.push_back(LeftLegFatToLeftLegVenules);
1720  _values.push_back(LeftLegMicrovasculatureToLeftLegVenules);
1721  _values.push_back(LeftLegMuscleToLeftLegVenules);
1722  _values.push_back(LeftLegSkinToLeftLegVenules);
1723  _values.push_back(TorsoSkinToTorsoVenules);
1724  _values.push_back(TorsoMuscleToTorsoVenules);
1725  _values.push_back(TorsoMicrovasculatureToTorsoVenules);
1726  _values.push_back(TorsoFatToTorsoVenules);
1727  _values.push_back(TorsoBoneToTorsoVenules);
1728  _values.push_back(TorsoVenulesToVenaCava);
1729 
1730 
1731  _values.push_back(TorsoBoneVascularToTissue);
1732  _values.push_back(LeftArmBoneVascularToTissue);
1733  _values.push_back(LeftLegBoneVascularToTissue);
1734  _values.push_back(RightArmBoneVascularToTissue);
1735  _values.push_back(RightLegBoneVascularToTissue);
1736  _values.push_back(BrainVascularToTissue);
1737  _values.push_back(TorsoFatVascularToTissue);
1738  _values.push_back(LeftArmFatVascularToTissue);
1739  _values.push_back(LeftLegFatVascularToTissue);
1740  _values.push_back(RightArmFatVascularToTissue);
1741  _values.push_back(RightLegFatVascularToTissue);
1742  _values.push_back(SmallIntestineVascularToTissue);
1743  _values.push_back(LargeIntestineVascularToTissue);
1744  _values.push_back(SplanchnicVascularToTissue);
1745  _values.push_back(LeftKidneyVascularToTissue);
1746  _values.push_back(LeftLungVascularToTissue);
1747  _values.push_back(LiverVascularToTissue);
1748  _values.push_back(TorsoMuscleVascularToTissue);
1749  _values.push_back(LeftArmMuscleVascularToTissue);
1750  _values.push_back(LeftLegMuscleVascularToTissue);
1751  _values.push_back(RightArmMuscleVascularToTissue);
1752  _values.push_back(RightLegMuscleVascularToTissue);
1753  _values.push_back(MyocardiumVascularToTissue);
1754  _values.push_back(RightKidneyVascularToTissue);
1755  _values.push_back(RightLungVascularToTissue);
1756  _values.push_back(TorsoSkinVascularToTissue);
1757  _values.push_back(LeftArmSkinVascularToTissue);
1758  _values.push_back(LeftLegSkinVascularToTissue);
1759  _values.push_back(RightArmSkinVascularToTissue);
1760  _values.push_back(RightLegSkinVascularToTissue);
1761  _values.push_back(SpleenVascularToTissue);
1762  }
1763  return _values;
1764  }
1765  static bool HasValue(const std::string& v)
1766  {
1767  return std::find(_values.begin(), _values.end(), v) != _values.end();
1768  }
1769  static void AddValue(const std::string& v)
1770  {
1771  if (!HasValue(v))
1772  {
1773  ScopedMutex lock;
1774  _values.push_back(v);
1775  }
1776  }
1777  protected:
1778  static std::vector<std::string> _values;
1779  };
1780 
1781  class UrineCompartment
1782  {
1783  public:
1784  DEFINE_STATIC_STRING(Ureters);
1785  /*****/DEFINE_STATIC_STRING(LeftUreter);
1786  /*****/DEFINE_STATIC_STRING(RightUreter);
1787  DEFINE_STATIC_STRING(Bladder);
1788 
1789  static const std::vector<std::string>& GetValues()
1790  {
1791  ScopedMutex lock;
1792  if (_values.empty())
1793  {
1794  _values.push_back(Ureters);
1795  _values.push_back(LeftUreter);
1796  _values.push_back(RightUreter);
1797  _values.push_back(Bladder);
1798  }
1799  return _values;
1800  }
1801  static bool HasValue(const std::string& v)
1802  {
1803  return std::find(_values.begin(), _values.end(), v) != _values.end();
1804  }
1805  static void AddValue(const std::string& v)
1806  {
1807  if (!HasValue(v))
1808  {
1809  ScopedMutex lock;
1810  _values.push_back(v);
1811  }
1812  }
1813  protected:
1814  static std::vector<std::string> _values;
1815  };
1816 
1817  class UrineLink
1818  {
1819  public:
1820  DEFINE_STATIC_STRING(LeftTubulesToUreter);
1821  DEFINE_STATIC_STRING(LeftUreterToBladder);
1822 
1823  DEFINE_STATIC_STRING(RightTubulesToUreter);
1824  DEFINE_STATIC_STRING(RightUreterToBladder);
1825 
1826  DEFINE_STATIC_STRING(BladderToGround);
1827  DEFINE_STATIC_STRING(BladderToGroundSource);
1828 
1829  static const std::vector<std::string>& GetValues()
1830  {
1831  ScopedMutex lock;
1832  if (_values.empty())
1833  {
1834  _values.push_back(LeftTubulesToUreter);
1835  _values.push_back(LeftUreterToBladder);
1836  _values.push_back(RightTubulesToUreter);
1837  _values.push_back(RightUreterToBladder);
1838  _values.push_back(BladderToGround);
1839  _values.push_back(BladderToGroundSource);
1840  }
1841  return _values;
1842  }
1843  static bool HasValue(const std::string& v)
1844  {
1845  return std::find(_values.begin(), _values.end(), v) != _values.end();
1846  }
1847  static void AddValue(const std::string& v)
1848  {
1849  if (!HasValue(v))
1850  {
1851  ScopedMutex lock;
1852  _values.push_back(v);
1853  }
1854  }
1855  protected:
1856  static std::vector<std::string> _values;
1857  };
1858 
1859  class LymphCompartment
1860  {
1861  public:
1862  DEFINE_STATIC_STRING(Lymph);
1863 
1864  static const std::vector<std::string>& GetValues()
1865  {
1866  ScopedMutex lock;
1867  if (_values.empty())
1868  {
1869  _values.push_back(Lymph);
1870  }
1871  return _values;
1872  }
1873  static bool HasValue(const std::string& v)
1874  {
1875  return std::find(_values.begin(), _values.end(), v) != _values.end();
1876  }
1877  static void AddValue(const std::string& v)
1878  {
1879  if (!HasValue(v))
1880  {
1881  ScopedMutex lock;
1882  _values.push_back(v);
1883  }
1884  }
1885  protected:
1886  static std::vector<std::string> _values;
1887  };
1888 
1889  class LymphLink
1890  {
1891  public:
1892  DEFINE_STATIC_STRING(BoneTissueToLymph);
1893  DEFINE_STATIC_STRING(BrainTissueToLymph);
1894  DEFINE_STATIC_STRING(FatTissueToLymph);
1895  DEFINE_STATIC_STRING(GutTissueToLymph);
1896  DEFINE_STATIC_STRING(LeftKidneyTissueToLymph);
1897  DEFINE_STATIC_STRING(LeftLungTissueToLymph);
1898  DEFINE_STATIC_STRING(LiverTissueToLymph);
1899  DEFINE_STATIC_STRING(MuscleTissueToLymph);
1900  DEFINE_STATIC_STRING(MyocardiumTissueToLymph);
1901  DEFINE_STATIC_STRING(RightKidneyTissueToLymph);
1902  DEFINE_STATIC_STRING(RightLungTissueToLymph);
1903  DEFINE_STATIC_STRING(SkinTissueToLymph);
1904  DEFINE_STATIC_STRING(SpleenTissueToLymph);
1905 
1906  DEFINE_STATIC_STRING(LymphToVenaCava);
1907 
1908  static const std::vector<std::string>& GetValues()
1909  {
1910  ScopedMutex lock;
1911  if (_values.empty())
1912  {
1913  _values.push_back(BoneTissueToLymph);
1914  _values.push_back(BrainTissueToLymph);
1915  _values.push_back(FatTissueToLymph);
1916  _values.push_back(GutTissueToLymph);
1917  _values.push_back(LeftKidneyTissueToLymph);
1918  _values.push_back(LeftLungTissueToLymph);
1919  _values.push_back(LiverTissueToLymph);
1920  _values.push_back(MuscleTissueToLymph);
1921  _values.push_back(MyocardiumTissueToLymph);
1922  _values.push_back(RightKidneyTissueToLymph);
1923  _values.push_back(RightLungTissueToLymph);
1924  _values.push_back(SkinTissueToLymph);
1925  _values.push_back(SpleenTissueToLymph);
1926  _values.push_back(LymphToVenaCava);
1927  }
1928  return _values;
1929  }
1930  static bool HasValue(const std::string& v)
1931  {
1932  return std::find(_values.begin(), _values.end(), v) != _values.end();
1933  }
1934  static void AddValue(const std::string& v)
1935  {
1936  if (!HasValue(v))
1937  {
1938  ScopedMutex lock;
1939  _values.push_back(v);
1940  }
1941  }
1942  protected:
1943  static std::vector<std::string> _values;
1944  };
1945 
1946  class TemperatureCompartment
1947  {
1948  public:
1949  DEFINE_STATIC_STRING(Active);
1950  DEFINE_STATIC_STRING(Ambient);
1951  DEFINE_STATIC_STRING(Clothing);
1952  DEFINE_STATIC_STRING(Enclosure);
1953  DEFINE_STATIC_STRING(ExternalCore);
1954  DEFINE_STATIC_STRING(ExternalSkin);
1955  DEFINE_STATIC_STRING(ExternalGround);
1956  DEFINE_STATIC_STRING(InternalCore);
1957  DEFINE_STATIC_STRING(InternalSkin);
1958  DEFINE_STATIC_STRING(InternalGround);
1959 
1960  static const std::vector<std::string>& GetValues()
1961  {
1962  ScopedMutex lock;
1963  if (_values.empty())
1964  {
1965  _values.push_back(Active);
1966  _values.push_back(Ambient);
1967  _values.push_back(Clothing);
1968  _values.push_back(Enclosure);
1969  _values.push_back(ExternalCore);
1970  _values.push_back(ExternalSkin);
1971  _values.push_back(ExternalGround);
1972  _values.push_back(InternalCore);
1973  _values.push_back(InternalSkin);
1974  _values.push_back(InternalGround);
1975  }
1976  return _values;
1977  }
1978  static bool HasValue(const std::string& v)
1979  {
1980  return std::find(_values.begin(), _values.end(), v) != _values.end();
1981  }
1982  static void AddValue(const std::string& v)
1983  {
1984  if (!HasValue(v))
1985  {
1986  ScopedMutex lock;
1987  _values.push_back(v);
1988  }
1989  }
1990  protected:
1991  static std::vector<std::string> _values;
1992  };
1993 
1994  class TemperatureLink
1995  {
1996  public:
1997 
1998  DEFINE_STATIC_STRING(ActiveToClothing);
1999  DEFINE_STATIC_STRING(ClothingToEnclosure);
2000  DEFINE_STATIC_STRING(ClothingToEnvironment);
2001  DEFINE_STATIC_STRING(ExternalCoreToGround);
2002  DEFINE_STATIC_STRING(GroundToActive);
2003  DEFINE_STATIC_STRING(GroundToClothing);
2004  DEFINE_STATIC_STRING(GroundToEnclosure);
2005  DEFINE_STATIC_STRING(GroundToEnvironment);
2006  DEFINE_STATIC_STRING(ExternalSkinToGround);
2007  DEFINE_STATIC_STRING(ExternalSkinToClothing);
2008  DEFINE_STATIC_STRING(GroundToInternalCore);
2009  DEFINE_STATIC_STRING(InternalCoreToInternalSkin);
2010  DEFINE_STATIC_STRING(InternalCoreToGround);
2011  DEFINE_STATIC_STRING(InternalSkinToGround);
2012  DEFINE_STATIC_STRING(InternalCoreToExternalCore);
2013  DEFINE_STATIC_STRING(InternalSkinToExternalSkin);
2014 
2015  static const std::vector<std::string>& GetValues()
2016  {
2017  ScopedMutex lock;
2018  if (_values.empty())
2019  {
2020  _values.push_back(ActiveToClothing);
2021  _values.push_back(ClothingToEnclosure);
2022  _values.push_back(ClothingToEnvironment);
2023  _values.push_back(ExternalCoreToGround);
2024  _values.push_back(GroundToActive);
2025  _values.push_back(GroundToClothing);
2026  _values.push_back(GroundToEnclosure);
2027  _values.push_back(GroundToEnvironment);
2028  _values.push_back(ExternalSkinToGround);
2029  _values.push_back(ExternalSkinToClothing);
2030  _values.push_back(GroundToInternalCore);
2031  _values.push_back(InternalCoreToInternalSkin);
2032  _values.push_back(InternalCoreToGround);
2033  _values.push_back(InternalSkinToGround);
2034  _values.push_back(InternalCoreToExternalCore);
2035  _values.push_back(InternalSkinToExternalSkin);
2036  }
2037  return _values;
2038  }
2039  static bool HasValue(const std::string& v)
2040  {
2041  return std::find(_values.begin(), _values.end(), v) != _values.end();
2042  }
2043  static void AddValue(const std::string& v)
2044  {
2045  if (!HasValue(v))
2046  {
2047  ScopedMutex lock;
2048  _values.push_back(v);
2049  }
2050  }
2051  protected:
2052  static std::vector<std::string> _values;
2053  };
2054 
2055  class EnvironmentCompartment
2056  {
2057  public:
2058  DEFINE_STATIC_STRING(Ambient);
2059 
2060  static const std::vector<std::string>& GetValues()
2061  {
2062  ScopedMutex lock;
2063  if (_values.empty())
2064  {
2065  _values.push_back(Ambient);
2066  }
2067  return _values;
2068  }
2069  static bool HasValue(const std::string& v)
2070  {
2071  return std::find(_values.begin(), _values.end(), v) != _values.end();
2072  }
2073  static void AddValue(const std::string& v)
2074  {
2075  if (!HasValue(v))
2076  {
2077  ScopedMutex lock;
2078  _values.push_back(v);
2079  }
2080  }
2081  protected:
2082  static std::vector<std::string> _values;
2083  };
2084 
2085  class AnesthesiaMachineCompartment
2086  {
2087  public:
2088  DEFINE_STATIC_STRING_EX(Connection, AnesthesiaMachineConnection);
2089  DEFINE_STATIC_STRING_EX(ExpiratoryLimb, AnesthesiaMachineExpiratoryLimb);
2090  DEFINE_STATIC_STRING_EX(GasInlet, AnesthesiaMachineGasInlet);
2091  DEFINE_STATIC_STRING_EX(GasSource, AnesthesiaMachineGasSource);
2092  DEFINE_STATIC_STRING_EX(InspiratoryLimb, AnesthesiaMachineInspiratoryLimb);
2093  DEFINE_STATIC_STRING_EX(ReliefValve, AnesthesiaMachineReliefValve);
2094  DEFINE_STATIC_STRING_EX(Scrubber, AnesthesiaMachineScrubber);
2095  DEFINE_STATIC_STRING_EX(Selector, AnesthesiaMachineSelector);
2096  DEFINE_STATIC_STRING_EX(Ventilator, AnesthesiaMachineVentilator);
2097  DEFINE_STATIC_STRING_EX(YPiece, AnesthesiaMachineYPiece);
2098 
2099  static const std::vector<std::string>& GetValues()
2100  {
2101  ScopedMutex lock;
2102  if (_values.empty())
2103  {
2104  _values.push_back(Connection);
2105  _values.push_back(ExpiratoryLimb);
2106  _values.push_back(GasInlet);
2107  _values.push_back(GasSource);
2108  _values.push_back(InspiratoryLimb);
2109  _values.push_back(ReliefValve);
2110  _values.push_back(Scrubber);
2111  _values.push_back(Selector);
2112  _values.push_back(Ventilator);
2113  _values.push_back(YPiece);
2114  }
2115  return _values;
2116  }
2117  static bool HasValue(const std::string& v)
2118  {
2119  return std::find(_values.begin(), _values.end(), v) != _values.end();
2120  }
2121  static void AddValue(const std::string& v)
2122  {
2123  if (!HasValue(v))
2124  {
2125  ScopedMutex lock;
2126  _values.push_back(v);
2127  }
2128  }
2129  protected:
2130  static std::vector<std::string> _values;
2131  };
2132 
2133  class AnesthesiaMachineLink
2134  {
2135  public:
2136  DEFINE_STATIC_STRING_EX(EnvironmentToReliefValve, EnvironmentToAnesthesiaMachineReliefValve);
2137  DEFINE_STATIC_STRING_EX(VentilatorToSelector, AnesthesiaMachineVentilatorToSelector);
2138  DEFINE_STATIC_STRING_EX(SelectorToReliefValve, AnesthesiaMachineSelectorToReliefValve);
2139  DEFINE_STATIC_STRING_EX(SelectorToScrubber, AnesthesiaMachineSelectorToScrubber);
2140  DEFINE_STATIC_STRING_EX(ScrubberToGasInlet, AnesthesiaMachineScrubberToGasInlet);
2141  DEFINE_STATIC_STRING_EX(GasSourceToGasInlet, AnesthesiaMachineGasSourceToGasInlet);
2142  DEFINE_STATIC_STRING_EX(GasInletToInspiratoryLimb, AnesthesiaMachineGasInletToInspiratoryLimb);
2143  DEFINE_STATIC_STRING_EX(InspiratoryLimbToYPiece, AnesthesiaMachineInspiratoryLimbToYPiece);
2144  DEFINE_STATIC_STRING_EX(YPieceToExpiratoryLimb, AnesthesiaMachineYPieceToExpiratoryLimb);
2145  DEFINE_STATIC_STRING_EX(ExpiratoryLimbToSelector, AnesthesiaMachineExpiratoryLimbToSelector);
2146  DEFINE_STATIC_STRING_EX(YPieceToConnection, AnesthesiaMachineYPieceToConnection);
2147  DEFINE_STATIC_STRING_EX(ConnectionLeak, AnesthesiaMachineConnectionLeak);
2148  DEFINE_STATIC_STRING_EX(ConnectionToAirway, AnesthesiaMachineConnectionToAirway);
2149 
2150  static const std::vector<std::string>& GetValues()
2151  {
2152  ScopedMutex lock;
2153  if (_values.empty())
2154  {
2155  _values.push_back(EnvironmentToReliefValve);
2156  _values.push_back(VentilatorToSelector);
2157  _values.push_back(SelectorToReliefValve);
2158  _values.push_back(SelectorToScrubber);
2159  _values.push_back(ScrubberToGasInlet);
2160  _values.push_back(GasSourceToGasInlet);
2161  _values.push_back(GasInletToInspiratoryLimb);
2162  _values.push_back(InspiratoryLimbToYPiece);
2163  _values.push_back(YPieceToExpiratoryLimb);
2164  _values.push_back(ExpiratoryLimbToSelector);
2165  _values.push_back(YPieceToConnection);
2166  _values.push_back(ConnectionLeak);
2167  _values.push_back(ConnectionToAirway);
2168  }
2169  return _values;
2170  }
2171  static bool HasValue(const std::string& v)
2172  {
2173  return std::find(_values.begin(), _values.end(), v) != _values.end();
2174  }
2175  static void AddValue(const std::string& v)
2176  {
2177  if (!HasValue(v))
2178  {
2179  ScopedMutex lock;
2180  _values.push_back(v);
2181  }
2182  }
2183  protected:
2184  static std::vector<std::string> _values;
2185  };
2186 
2187  class BagValveMaskCompartment
2188  {
2189  public:
2190  DEFINE_STATIC_STRING_EX(Reservoir, BagValveMaskReservoir);
2191  DEFINE_STATIC_STRING_EX(Bag, BagValveMaskBag);
2192  DEFINE_STATIC_STRING_EX(Valve, BagValveMaskValve);
2193  DEFINE_STATIC_STRING_EX(Filter, BagValveMaskFilter);
2194  DEFINE_STATIC_STRING_EX(Connection, BagValveMaskConnection);
2195 
2196  static const std::vector<std::string>& GetValues()
2197  {
2198  ScopedMutex lock;
2199  if (_values.empty())
2200  {
2201  _values.push_back(Reservoir);
2202  _values.push_back(Bag);
2203  _values.push_back(Valve);
2204  _values.push_back(Filter);
2205  _values.push_back(Connection);
2206  }
2207  return _values;
2208  }
2209  protected:
2210  static std::vector<std::string> _values;
2211  };
2212 
2213  class BagValveMaskLink
2214  {
2215  public:
2216  DEFINE_STATIC_STRING_EX(ReservoirToBag, BagValveMaskReservoirToBag);
2217  DEFINE_STATIC_STRING_EX(BagToValve, BagValveMaskBagToValve);
2218  DEFINE_STATIC_STRING_EX(ValveToFilter, BagValveMaskValveToFilter);
2219  DEFINE_STATIC_STRING_EX(FilterToConnection, BagValveMaskFilterToConnection);
2220  DEFINE_STATIC_STRING_EX(ConnectionToEnvironment, BagValveMaskConnectionToEnvironment);
2221  DEFINE_STATIC_STRING_EX(ConnectionToAirway, BagValveMaskConnectionToAirway);
2222 
2223  static const std::vector<std::string>& GetValues()
2224  {
2225  ScopedMutex lock;
2226  if (_values.empty())
2227  {
2228  _values.push_back(ReservoirToBag);
2229  _values.push_back(BagToValve);
2230  _values.push_back(ValveToFilter);
2231  _values.push_back(FilterToConnection);
2232  _values.push_back(ConnectionToEnvironment);
2233  _values.push_back(ConnectionToAirway);
2234  }
2235  return _values;
2236  }
2237  protected:
2238  static std::vector<std::string> _values;
2239  };
2240 
2241  class ECMOCompartment
2242  {
2243  public:
2244  DEFINE_STATIC_STRING_EX(Oxygenator, ECMOOxygenator);
2245  DEFINE_STATIC_STRING_EX(BloodSamplingPort, ECMOBloodSamplingPort);
2246 
2247  static const std::vector<std::string>& GetValues()
2248  {
2249  ScopedMutex lock;
2250  if (_values.empty())
2251  {
2252  _values.push_back(Oxygenator);
2253  _values.push_back(BloodSamplingPort);
2254  }
2255  return _values;
2256  }
2257  static bool HasValue(const std::string& v)
2258  {
2259  return std::find(_values.begin(), _values.end(), v) != _values.end();
2260  }
2261  static void AddValue(const std::string& v)
2262  {
2263  if (!HasValue(v))
2264  {
2265  ScopedMutex lock;
2266  _values.push_back(v);
2267  }
2268  }
2269  protected:
2270  static std::vector<std::string> _values;
2271  };
2272 
2273  class ECMOLink
2274  {
2275  public:
2276  DEFINE_STATIC_STRING(OxygenatorToVasculature);
2277  DEFINE_STATIC_STRING(VasculatureToBloodSamplingPort);
2278  DEFINE_STATIC_STRING(BloodSamplingPortToOxygenator);
2279 
2280  static const std::vector<std::string>& GetValues()
2281  {
2282  ScopedMutex lock;
2283  if (_values.empty())
2284  {
2285  _values.push_back(OxygenatorToVasculature);
2286  _values.push_back(VasculatureToBloodSamplingPort);
2287  _values.push_back(BloodSamplingPortToOxygenator);
2288  }
2289  return _values;
2290  }
2291  static bool HasValue(const std::string& v)
2292  {
2293  return std::find(_values.begin(), _values.end(), v) != _values.end();
2294  }
2295  static void AddValue(const std::string& v)
2296  {
2297  if (!HasValue(v))
2298  {
2299  ScopedMutex lock;
2300  _values.push_back(v);
2301  }
2302  }
2303  protected:
2304  static std::vector<std::string> _values;
2305  };
2306 
2307  class InhalerCompartment
2308  {
2309  public:
2310  DEFINE_STATIC_STRING_EX(Mouthpiece, InhalerMouthpiece);
2311 
2312  static const std::vector<std::string>& GetValues()
2313  {
2314  ScopedMutex lock;
2315  if (_values.empty())
2316  {
2317  _values.push_back(Mouthpiece);
2318  }
2319  return _values;
2320  }
2321  static bool HasValue(const std::string& v)
2322  {
2323  return std::find(_values.begin(), _values.end(), v) != _values.end();
2324  }
2325  static void AddValue(const std::string& v)
2326  {
2327  if (!HasValue(v))
2328  {
2329  ScopedMutex lock;
2330  _values.push_back(v);
2331  }
2332  }
2333  protected:
2334  static std::vector<std::string> _values;
2335  };
2336 
2337  class InhalerLink
2338  {
2339  public:
2340  DEFINE_STATIC_STRING_EX(EnvironmentToMouthpiece, EnvironmentToInhalerMouthpiece);
2341  DEFINE_STATIC_STRING_EX(MouthpieceToAirway, InhalerMouthpieceToAirway);
2342 
2343  static const std::vector<std::string>& GetValues()
2344  {
2345  ScopedMutex lock;
2346  if (_values.empty())
2347  {
2348  _values.push_back(EnvironmentToMouthpiece);
2349  _values.push_back(MouthpieceToAirway);
2350  }
2351  return _values;
2352  }
2353  static bool HasValue(const std::string& v)
2354  {
2355  return std::find(_values.begin(), _values.end(), v) != _values.end();
2356  }
2357  static void AddValue(const std::string& v)
2358  {
2359  if (!HasValue(v))
2360  {
2361  ScopedMutex lock;
2362  _values.push_back(v);
2363  }
2364  }
2365  protected:
2366  static std::vector<std::string> _values;
2367  };
2368 
2369  class MechanicalVentilationCompartment
2370  {
2371  public:
2372  DEFINE_STATIC_STRING_EX(Connection, MechanicalVentilationConnection);
2373  DEFINE_STATIC_STRING_EX(DeadSpace, MechanicalVentilationDeadSpace);
2374 
2375  static const std::vector<std::string>& GetValues()
2376  {
2377  ScopedMutex lock;
2378  if (_values.empty())
2379  {
2380  _values.push_back(Connection);
2381  _values.push_back(DeadSpace);
2382  }
2383  return _values;
2384  }
2385  static bool HasValue(const std::string& v)
2386  {
2387  return std::find(_values.begin(), _values.end(), v) != _values.end();
2388  }
2389  static void AddValue(const std::string& v)
2390  {
2391  if (!HasValue(v))
2392  {
2393  ScopedMutex lock;
2394  _values.push_back(v);
2395  }
2396  }
2397  protected:
2398  static std::vector<std::string> _values;
2399  };
2400 
2401  class MechanicalVentilationLink
2402  {
2403  public:
2404  DEFINE_STATIC_STRING_EX(ConnectionToDeadSpace, MechanicalVentilationConnectionToDeadSpace);
2405  DEFINE_STATIC_STRING_EX(DeadSpaceToAirway, MechanicalVentilationDeadSpaceToAirway);
2406 
2407  static const std::vector<std::string>& GetValues()
2408  {
2409  ScopedMutex lock;
2410  if (_values.empty())
2411  {
2412  _values.push_back(ConnectionToDeadSpace);
2413  _values.push_back(DeadSpaceToAirway);
2414  }
2415  return _values;
2416  }
2417  static bool HasValue(const std::string& v)
2418  {
2419  return std::find(_values.begin(), _values.end(), v) != _values.end();
2420  }
2421  static void AddValue(const std::string& v)
2422  {
2423  if (!HasValue(v))
2424  {
2425  ScopedMutex lock;
2426  _values.push_back(v);
2427  }
2428  }
2429  protected:
2430  static std::vector<std::string> _values;
2431  };
2432 
2433  class MechanicalVentilatorCompartment
2434  {
2435  public:
2436  DEFINE_STATIC_STRING(MechanicalVentilator);
2437  DEFINE_STATIC_STRING_EX(ExpiratoryValve, MechanicalVentilatorExpiratoryValve);
2438  DEFINE_STATIC_STRING_EX(InspiratoryValve, MechanicalVentilatorInspiratoryValve);
2439  DEFINE_STATIC_STRING_EX(ExpiratoryLimb, MechanicalVentilatorExpiratoryLimb);
2440  DEFINE_STATIC_STRING_EX(InspiratoryLimb, MechanicalVentilatorInspiratoryLimb);
2441  DEFINE_STATIC_STRING_EX(YPiece, MechanicalVentilatorYPiece);
2442  DEFINE_STATIC_STRING_EX(ReliefValve, MechanicalVentilatorReliefValve);
2443  DEFINE_STATIC_STRING_EX(Connection, MechanicalVentilatorConnection);
2444 
2445  static const std::vector<std::string>& GetValues()
2446  {
2447  ScopedMutex lock;
2448  if (_values.empty())
2449  {
2450  _values.push_back(MechanicalVentilator);
2451  _values.push_back(ExpiratoryValve);
2452  _values.push_back(InspiratoryValve);
2453  _values.push_back(ExpiratoryLimb);
2454  _values.push_back(InspiratoryLimb);
2455  _values.push_back(YPiece);
2456  _values.push_back(ReliefValve);
2457  _values.push_back(Connection);
2458  }
2459  return _values;
2460  }
2461  static bool HasValue(const std::string& v)
2462  {
2463  return std::find(_values.begin(), _values.end(), v) != _values.end();
2464  }
2465  static void AddValue(const std::string& v)
2466  {
2467  if (!HasValue(v))
2468  {
2469  ScopedMutex lock;
2470  _values.push_back(v);
2471  }
2472  }
2473  protected:
2474  static std::vector<std::string> _values;
2475  };
2476 
2477  class MechanicalVentilatorLink
2478  {
2479  public:
2480  DEFINE_STATIC_STRING(MechanicalVentilatorToExpiratoryValve);
2481  DEFINE_STATIC_STRING(MechanicalVentilatorToInspiratoryValve);
2482  DEFINE_STATIC_STRING_EX(ExpiratoryLimbToExpiratoryValve, MechanicalVentilatorExpiratoryLimbToExpiratoryValve);
2483  DEFINE_STATIC_STRING_EX(InspiratoryValveToInspiratoryLimb, MechanicalVentilatorInspiratoryValveToInspiratoryLimb);
2484  DEFINE_STATIC_STRING_EX(ExpiratoryLimbToYPiece, MechanicalVentilatorExpiratoryLimbToYPiece);
2485  DEFINE_STATIC_STRING_EX(InspiratoryLimbToYPiece, MechanicalVentilatorInspiratoryLimbToYPiece);
2486  DEFINE_STATIC_STRING_EX(YPieceToConnection, MechanicalVentilatorYPieceToConnection);
2487  DEFINE_STATIC_STRING_EX(LeakConnectionToEnvironment, MechanicalVentilatorLeakConnectionToEnvironment);
2488  DEFINE_STATIC_STRING_EX(ConnectionToReliefValve, MechanicalVentilatorConnectionToReliefValve);
2489  DEFINE_STATIC_STRING_EX(EnvironmentToReliefValve, MechanicalVentilatorEnvironmentToReliefValve);
2490  DEFINE_STATIC_STRING_EX(ConnectionToEnvironment, MechanicalVentilatorConnectionToEnvironment);
2491  DEFINE_STATIC_STRING_EX(ConnectionToAirway, MechanicalVentilatorConnectionToAirway);
2492 
2493  static const std::vector<std::string>& GetValues()
2494  {
2495  ScopedMutex lock;
2496  if (_values.empty())
2497  {
2498  _values.push_back(MechanicalVentilatorToExpiratoryValve);
2499  _values.push_back(MechanicalVentilatorToInspiratoryValve);
2500  _values.push_back(ExpiratoryLimbToExpiratoryValve);
2501  _values.push_back(InspiratoryValveToInspiratoryLimb);
2502  _values.push_back(ExpiratoryLimbToYPiece);
2503  _values.push_back(InspiratoryLimbToYPiece);
2504  _values.push_back(YPieceToConnection);
2505  _values.push_back(LeakConnectionToEnvironment);
2506  _values.push_back(ConnectionToReliefValve);
2507  _values.push_back(EnvironmentToReliefValve);
2508  _values.push_back(ConnectionToEnvironment);
2509  _values.push_back(ConnectionToAirway);
2510  }
2511  return _values;
2512  }
2513  static bool HasValue(const std::string& v)
2514  {
2515  return std::find(_values.begin(), _values.end(), v) != _values.end();
2516  }
2517  static void AddValue(const std::string& v)
2518  {
2519  if (!HasValue(v))
2520  {
2521  ScopedMutex lock;
2522  _values.push_back(v);
2523  }
2524  }
2525  protected:
2526  static std::vector<std::string> _values;
2527  };
2528 
2529  class NasalCannulaCompartment
2530  {
2531  public:
2532  DEFINE_STATIC_STRING(NasalCannulaOxygenSource);
2533  DEFINE_STATIC_STRING(NasalCannula);
2534 
2535  static const std::vector<std::string>& GetValues()
2536  {
2537  ScopedMutex lock;
2538  if (_values.empty())
2539  {
2540  _values.push_back(NasalCannulaOxygenSource);
2541  _values.push_back(NasalCannula);
2542  }
2543  return _values;
2544  }
2545  static bool HasValue(const std::string& v)
2546  {
2547  return std::find(_values.begin(), _values.end(), v) != _values.end();
2548  }
2549  static void AddValue(const std::string& v)
2550  {
2551  if (!HasValue(v))
2552  {
2553  ScopedMutex lock;
2554  _values.push_back(v);
2555  }
2556  }
2557  protected:
2558  static std::vector<std::string> _values;
2559  };
2560 
2561  class NasalCannulaLink
2562  {
2563  public:
2564  DEFINE_STATIC_STRING(NasalCannulaOxygenInlet);
2565  DEFINE_STATIC_STRING(NasalCannulaSeal);
2566  DEFINE_STATIC_STRING(NasalCannulaToAirway);
2567 
2568  static const std::vector<std::string>& GetValues()
2569  {
2570  ScopedMutex lock;
2571  if (_values.empty())
2572  {
2573  _values.push_back(NasalCannulaOxygenInlet);
2574  _values.push_back(NasalCannulaSeal);
2575  _values.push_back(NasalCannulaToAirway);
2576  }
2577  return _values;
2578  }
2579  static bool HasValue(const std::string& v)
2580  {
2581  return std::find(_values.begin(), _values.end(), v) != _values.end();
2582  }
2583  static void AddValue(const std::string& v)
2584  {
2585  if (!HasValue(v))
2586  {
2587  ScopedMutex lock;
2588  _values.push_back(v);
2589  }
2590  }
2591  protected:
2592  static std::vector<std::string> _values;
2593  };
2594 
2595  class NonRebreatherMaskCompartment
2596  {
2597  public:
2598  DEFINE_STATIC_STRING(NonRebreatherMaskOxygenSource);
2599  DEFINE_STATIC_STRING(NonRebreatherMaskPorts);
2600  DEFINE_STATIC_STRING(NonRebreatherMaskBag);
2601  DEFINE_STATIC_STRING(NonRebreatherMask);
2602 
2603  static const std::vector<std::string>& GetValues()
2604  {
2605  ScopedMutex lock;
2606  if (_values.empty())
2607  {
2608  _values.push_back(NonRebreatherMaskOxygenSource);
2609  _values.push_back(NonRebreatherMaskPorts);
2610  _values.push_back(NonRebreatherMaskBag);
2611  _values.push_back(NonRebreatherMask);
2612  }
2613  return _values;
2614  }
2615  static bool HasValue(const std::string& v)
2616  {
2617  return std::find(_values.begin(), _values.end(), v) != _values.end();
2618  }
2619  static void AddValue(const std::string& v)
2620  {
2621  if (!HasValue(v))
2622  {
2623  ScopedMutex lock;
2624  _values.push_back(v);
2625  }
2626  }
2627  protected:
2628  static std::vector<std::string> _values;
2629  };
2630 
2631  class NonRebreatherMaskLink
2632  {
2633  public:
2634  DEFINE_STATIC_STRING(NonRebreatherMaskOxygenInlet);
2635  DEFINE_STATIC_STRING(NonRebreatherMaskReservoirValve);
2636  DEFINE_STATIC_STRING(NonRebreatherMaskSeal);
2637  DEFINE_STATIC_STRING(NonRebreatherMaskExhalationValves);
2638  DEFINE_STATIC_STRING(NonRebreatherMaskExhalation);
2639  DEFINE_STATIC_STRING(NonRebreatherMaskToAirway);
2640 
2641  static const std::vector<std::string>& GetValues()
2642  {
2643  ScopedMutex lock;
2644  if (_values.empty())
2645  {
2646  _values.push_back(NonRebreatherMaskOxygenInlet);
2647  _values.push_back(NonRebreatherMaskReservoirValve);
2648  _values.push_back(NonRebreatherMaskSeal);
2649  _values.push_back(NonRebreatherMaskExhalationValves);
2650  _values.push_back(NonRebreatherMaskExhalation);
2651  _values.push_back(NonRebreatherMaskToAirway);
2652  }
2653  return _values;
2654  }
2655  static bool HasValue(const std::string& v)
2656  {
2657  return std::find(_values.begin(), _values.end(), v) != _values.end();
2658  }
2659  static void AddValue(const std::string& v)
2660  {
2661  if (!HasValue(v))
2662  {
2663  ScopedMutex lock;
2664  _values.push_back(v);
2665  }
2666  }
2667  protected:
2668  static std::vector<std::string> _values;
2669  };
2670 
2671  class SimpleMaskCompartment
2672  {
2673  public:
2674  DEFINE_STATIC_STRING(SimpleMaskOxygenSource);
2675  DEFINE_STATIC_STRING(SimpleMask);
2676 
2677  static const std::vector<std::string>& GetValues()
2678  {
2679  ScopedMutex lock;
2680  if (_values.empty())
2681  {
2682  _values.push_back(SimpleMaskOxygenSource);
2683  _values.push_back(SimpleMask);
2684  }
2685  return _values;
2686  }
2687  static bool HasValue(const std::string& v)
2688  {
2689  return std::find(_values.begin(), _values.end(), v) != _values.end();
2690  }
2691  static void AddValue(const std::string& v)
2692  {
2693  if (!HasValue(v))
2694  {
2695  ScopedMutex lock;
2696  _values.push_back(v);
2697  }
2698  }
2699  protected:
2700  static std::vector<std::string> _values;
2701  };
2702 
2703  class SimpleMaskLink
2704  {
2705  public:
2706  DEFINE_STATIC_STRING(SimpleMaskOxygenInlet);
2707  DEFINE_STATIC_STRING(SimpleMaskSeal);
2708  DEFINE_STATIC_STRING(SimpleMaskPorts);
2709  DEFINE_STATIC_STRING(SimpleMaskToAirway);
2710 
2711  static const std::vector<std::string>& GetValues()
2712  {
2713  ScopedMutex lock;
2714  if (_values.empty())
2715  {
2716  _values.push_back(SimpleMaskOxygenInlet);
2717  _values.push_back(SimpleMaskSeal);
2718  _values.push_back(SimpleMaskPorts);
2719  _values.push_back(SimpleMaskToAirway);
2720  }
2721  return _values;
2722  }
2723  static bool HasValue(const std::string& v)
2724  {
2725  return std::find(_values.begin(), _values.end(), v) != _values.end();
2726  }
2727  static void AddValue(const std::string& v)
2728  {
2729  if (!HasValue(v))
2730  {
2731  ScopedMutex lock;
2732  _values.push_back(v);
2733  }
2734  }
2735  protected:
2736  static std::vector<std::string> _values;
2737  };
2738 END_NAMESPACE
Definition: Logger.h:71
Definition: ScopedMutex.h:7
Definition: Logger.h:14
Definition: PulseEngine.h:11
static std::string Version()
static std::string Time()
static std::string Hash()

Distributed under the Apache License, Version 2.0.

See accompanying NOTICE file for details.