Building Medical Digital Twins with Pulse: Open Source Simulation Tools for Developers and Researchers
×
SEDataRequestTracker.h
1 /* Distributed under the Apache License, Version 2.0.
2  See accompanying NOTICE file for details.*/
3 
4 #pragma once
5 
6 class DataTrack;
7 class SESystem;
8 class SEPatient;
9 class SEEnvironment;
11 class SEBagValveMask;
13 class SEECMO;
14 class SEInhaler;
16 class SEActionManager;
17 class SESubstanceManager;
19 class SEDataRequest;
21 class SEGasCompartment;
26 #include "cdm/properties/SEScalar.h"
27 
28 enum class CompartmentUpdate {None,
29  Inflow, Outflow,
30  HeatTransferRateIn, HeatTransferRateOut,
31  Volume,Pressure,
32  Heat, Temperature,
33  VolumeFraction,
34  Mass, Concentration,
35  pH, Molarity,
36  PartialPressure, Saturation};
37 enum class TrackMode { CSV, Dynamic };
39 {
40  friend class SEEngineTracker;
41 public:
43  {
44  idx = 0;
45  Heading = "";
46  UpdateProperty = CompartmentUpdate::None;
47  GasCmpt = nullptr;
48  GasSubstance = nullptr;
49  LiquidCmpt = nullptr;
50  LiquidSubstance = nullptr;
51  ThermalCmpt = nullptr;
52  }
53 
54 protected:
55  void UpdateScalar();
56  void SetScalarRequest(const SEScalar& s, SEDataRequest& dr);
57 
58  size_t idx;
59  std::string Heading;
60 
61  // Compartment related variables
62  CompartmentUpdate UpdateProperty;
68  // Tissue cmpts don't have children and they don't have computed data that changes on call (like flow)
69 };
70 
71 // This class connects the data requests to the CDM objects to the data tracker to an optional file
72 
73 class CDM_DECL SEDataRequestTracker : public Loggable
74 {
75 public:
76  SEDataRequestTracker(Logger* logger) : Loggable(logger) {}
77  virtual ~SEDataRequestTracker() {}
78 
79  virtual void Reset() = 0;
80 
81  // Close the active stream file using this method
82  // Will no longer stream data to this file until SetupDataRequests is called
83  virtual void CloseResultsFile() = 0;
84 
85  // Makes a copy of this data request
86  // Creates, connects, and manages SEDataRequestScalars for all data requests provided
87  // DataRequests and order of DataRequests from this manager can be used to easily get values of the connected engine scalars
88  virtual bool SetupDataRequests(const SEDataRequestManager& drMgr, double timeStep_s) = 0;
89 
90  virtual size_t NumTracks() const = 0;
91  virtual double GetValue(size_t idx) const = 0;
92  virtual double GetValue(const SEDataRequest& dr) const = 0;
93  virtual std::string GetUnit(const SEDataRequest& dr) const = 0;
94 
95  virtual void LogRequestedValues() const = 0;
96 
97  virtual const SEDataRequestManager& GetDataRequestManager() const = 0;
98 };
99 
100 class CDM_DECL SEEngineTracker : public SEDataRequestTracker
101 {
103 public:
104  SEEngineTracker(Logger* logger=nullptr);
105  virtual ~SEEngineTracker();
106 
107  void Clear();// Reset + Sets CDM objects to nullptr
108  void Reset() override; // Removes all the current tracks
109 
110  void OpenResultsFile(double currentTime_s);
111  void CloseResultsFile() override;
112 
113  bool SetupDataRequests(const SEDataRequestManager& drMgr, double timeStep_s) override;
114 
115  size_t NumTracks() const override;
116  double GetValue(size_t idx) const override;
117  // These methods will use the dr address, assumes they are a part of this tracker DataRequestManager
118  double GetValue(const SEDataRequest& dr) const override;
119  std::string GetUnit(const SEDataRequest& dr) const override;
120 
121  void LogRequestedValues() const override;
122 
123  const SEDataRequestManager& GetDataRequestManager() const override { return *m_DataRequestMgr; }
124 
125  // Add a CDM objecst to look for data in
126  void SetPatient(SEPatient& p);
127  void SetEnvironment(SEEnvironment& e);
128  void AddPhysiologySystem(SESystem& s);
129  void SetAnesthesiaMachine(SEAnesthesiaMachine& am);
130  void SetBagValveMask(SEBagValveMask& bvm);
131  void SetElectroCardioGram(SEElectroCardioGram& ecg);
132  void SetECMO(SEECMO& ecmo);
133  void SetInhaler(SEInhaler& i);
134  void SetMechanicalVentilator(SEMechanicalVentilator& mv);
135  void SetActionManager(SEActionManager& am);
136  void SetCompartmentManager(SECompartmentManager& cMgr);
137  void SetSubstanceManager(SESubstanceManager& sMgr);
138 
139  DataTrack& GetDataTrack() { return *m_DataTrack; }
140 
141  // CDM Values to DataTrack, also write to file if a results file was specified
142  void TrackData(double currentTime_s);
143 
145  // These 2 methods instantiates the scalar object in the engine associated with the data request
146  // That scalar will be set on a SEDataRequestScalar object
147  // Note, if you do not provide a unit in the dr, The unit the engine uses will set on the dr
148  //
149  // Connects all the managed SEDataRequestScalar's associated with the provided data request manager
150  bool ConnectRequest(SEDataRequest& dr);
151  // Connects the provided SEDataRequestScalar, which is NOT copied/captured by this class
152  // (No index associated for GetValue/GetUnit)
153  bool ConnectRequest(SEDataRequest& dr, SEDataRequestScalar& ds);
155 
156  // Finds the scalar associated with this data request
157  virtual const SEDataRequestScalar* GetScalar(const SEDataRequest& dr) const;
158 
159 protected:
160 
161  TrackMode m_Mode;
165 
166  std::stringstream m_ss;
167  std::ofstream* m_ResultsStream;
168 
171 
176 
178  std::vector<SESystem*> m_PhysiologySystems;
185  std::map<const SEDataRequest*, SEDataRequestScalar*> m_Request2Scalar;
186  std::map<std::string, std::ofstream> m_OutputFiles;
187 };
Utility class to read a CSV file.
Definition: CSV.h:13
Definition: DataTrack.h:17
Definition: Logger.h:23
Definition: Logger.h:71
Definition: SEActionManager.h:12
Definition: SEAnesthesiaMachine.h:24
Definition: SEBagValveMask.h:14
Definition: SECompartmentManager.h:25
Definition: SEDataRequest.h:18
Definition: SEDataRequestManager.h:10
Definition: SEDataRequestTracker.h:39
SEThermalCompartment * ThermalCmpt
Definition: SEDataRequestTracker.h:67
void SetScalarRequest(const SEScalar &s, SEDataRequest &dr)
Definition: SEDataRequestTracker.cpp:657
std::string Heading
Definition: SEDataRequestTracker.h:59
size_t idx
Definition: SEDataRequestTracker.h:58
SEGasSubstanceQuantity * GasSubstance
Definition: SEDataRequestTracker.h:64
void UpdateScalar()
Definition: SEDataRequestTracker.cpp:689
SEGasCompartment * GasCmpt
Definition: SEDataRequestTracker.h:63
SELiquidCompartment * LiquidCmpt
Definition: SEDataRequestTracker.h:65
SELiquidSubstanceQuantity * LiquidSubstance
Definition: SEDataRequestTracker.h:66
CompartmentUpdate UpdateProperty
Definition: SEDataRequestTracker.h:62
SEDataRequestScalar(Logger *logger)
Definition: SEDataRequestTracker.h:42
Definition: SEDataRequestTracker.h:74
virtual bool SetupDataRequests(const SEDataRequestManager &drMgr, double timeStep_s)=0
SEDataRequestTracker(Logger *logger)
Definition: SEDataRequestTracker.h:76
virtual void Reset()=0
virtual double GetValue(const SEDataRequest &dr) const =0
virtual ~SEDataRequestTracker()
Definition: SEDataRequestTracker.h:77
virtual void CloseResultsFile()=0
virtual void LogRequestedValues() const =0
virtual std::string GetUnit(const SEDataRequest &dr) const =0
virtual const SEDataRequestManager & GetDataRequestManager() const =0
virtual size_t NumTracks() const =0
virtual double GetValue(size_t idx) const =0
Definition: SEDynamicStabilizationPropertyConvergence.h:9
Definition: SEECMO.h:10
Definition: SEElectroCardioGram.h:9
Definition: SEDataRequestTracker.h:101
SECompartmentManager * m_CmptMgr
Definition: SEDataRequestTracker.h:174
DataTrack * m_DataTrack
Definition: SEDataRequestTracker.h:170
SEECMO * m_ECMO
Definition: SEDataRequestTracker.h:182
SEPatient * m_Patient
Definition: SEDataRequestTracker.h:172
size_t m_StepsPerSample
Definition: SEDataRequestTracker.h:164
SEAnesthesiaMachine * m_AnesthesiaMachine
Definition: SEDataRequestTracker.h:179
std::map< const SEDataRequest *, SEDataRequestScalar * > m_Request2Scalar
Definition: SEDataRequestTracker.h:185
std::stringstream m_ss
Definition: SEDataRequestTracker.h:166
SESubstanceManager * m_SubMgr
Definition: SEDataRequestTracker.h:175
TrackMode m_Mode
Definition: SEDataRequestTracker.h:161
SEEnvironment * m_Environment
Definition: SEDataRequestTracker.h:177
size_t m_CurrentSampleStep
Definition: SEDataRequestTracker.h:163
SEBagValveMask * m_BVM
Definition: SEDataRequestTracker.h:180
SEElectroCardioGram * m_ECG
Definition: SEDataRequestTracker.h:181
double m_LastPullTime_s
Definition: SEDataRequestTracker.h:162
SEInhaler * m_Inhaler
Definition: SEDataRequestTracker.h:183
std::ofstream * m_ResultsStream
Definition: SEDataRequestTracker.h:167
std::vector< SESystem * > m_PhysiologySystems
Definition: SEDataRequestTracker.h:178
SEActionManager * m_ActionMgr
Definition: SEDataRequestTracker.h:173
SEMechanicalVentilator * m_MechanicalVentilator
Definition: SEDataRequestTracker.h:184
std::map< std::string, std::ofstream > m_OutputFiles
Definition: SEDataRequestTracker.h:186
const SEDataRequestManager & GetDataRequestManager() const override
Definition: SEDataRequestTracker.h:123
SEDataRequestManager * m_DataRequestMgr
Definition: SEDataRequestTracker.h:169
DataTrack & GetDataTrack()
Definition: SEDataRequestTracker.h:139
Definition: SEEnvironment.h:13
Definition: SEGasCompartment.h:14
Definition: SEGasSubstanceQuantity.h:10
If you want to querry what a scalar is and don't know what scalar type you have...
Definition: SEScalar.h:282
Definition: SEInhaler.h:12
Definition: SELiquidCompartment.h:11
Definition: SELiquidSubstanceQuantity.h:12
Definition: SEMechanicalVentilator.h:10
Definition: SEPatient.h:13
Definition: SEScalar.h:19
Definition: SESubstanceManager.h:9
Definition: SESystem.h:8
Definition: SEThermalCompartment.h:12

Distributed under the Apache License, Version 2.0.

See accompanying NOTICE file for details.