Documentation/ExampleApplications/RdAirplaneApplication/analysisTools/offline/shared/RdAirplaneDataWriter/src/DataWriter.cc
Go to the documentation of this file.
1 /*
2  * DataWriter.cpp
3  *
4  * Created on: Jul 24, 2015
5  * Author: leven
6  */
7 
8 #include "DataWriter.h"
9 #include "StationInfo.h"
10 #include "PulseInfoWriter.h"
11 #include "AirplaneUtil.h"
12 #include "DataWriterUtil.h"
13 
14 #include <limits> // setprecision
15 #include <iomanip> // setprecision
16 
17 using namespace std;
18 using namespace RdAirplane;
19 using namespace rdet;
20 using namespace utl;
21 namespace fs = boost::filesystem;
22 using namespace DataWriterUtil;
23 using namespace fwk;
24 
25 const char* DataWriter::stationInfosFileName = "stationsInfo.dat";
26 const char* DataWriter::generalInfoFileName = "generalInfo.dat";
27 
28 DataWriter::DataWriter(std::string pOutputDirectory, utl::CoordinateSystemPtr pCoordinateSystem) :
29  _outputDirectory_(fs::path(pOutputDirectory)),
30  _globalCoordinateSystem_(pCoordinateSystem) {
31  string error=_createOutputFolder();
32  if(!error.empty())
33  throw runtime_error(error);
34 }
35 
37  for(StationMap::iterator iter = _stations_.begin();
38  iter != _stations_.end();
39  ++iter) {
40  delete iter->second;
41  }
42  for(list<PulseInfoWriter*>::iterator iter = _pulseInfoWriters_.begin();
43  iter != _pulseInfoWriters_.end();
44  ++iter) {
45  delete *iter;
46  }
47 }
48 
50  const StationInfo* stationInfo = NULL;
51  StationMap::iterator iter = _stations_.find(pStation.GetId());
52  if(iter==_stations_.end()) {
53  stationInfo = new StationInfo(pStation);
54  _stations_.insert(make_pair(stationInfo->getId(), stationInfo));
55  } else {
56  stationInfo=iter->second;
57  }
58  return stationInfo;
59 }
60 
62  fs::path path(_outputDirectory_);
63  if(!fs::exists(path))
64  return false;
65  path+="/";
67  ofstream generalStationsInfoFileHandle;
68 
69  try {
70  generalStationsInfoFileHandle.open(path.c_str());
71 
72  if(!generalStationsInfoFileHandle.is_open()) {
73  ERROR("Could not write stations data.");
74  return false;
75  }
76 
77  generalStationsInfoFileHandle << "Station Id| "
78  << "Station Latitude (UTM) (degree)| "
79  << "Station Longitude (UTM) (degree)| "
80  << "Station Altitude (UTM) (m)| "
81  << "Station-CS-Origin-X In Global CS (m)| "
82  << "Station-CS-Origin-Y In Global CS (m)| "
83  << "Station-CS-Origin-Z In Global CS (m)| "
84  << "Station-CS eX In Global CS (m)| "
85  << "Station-CS eY In Global CS (m)| "
86  << "Station-CS eZ In Global CS (m)| "
87  << endl;
88 
89  for(StationMap::iterator iter = _stations_.begin(); iter!=_stations_.end();++iter) {
90  const StationInfo& station = *iter->second;
91  const Point stationPosition(0,0,0,station.getCoordinateSystem());
92  generalStationsInfoFileHandle << setprecision(numeric_limits<long double>::digits10 + 1)
93  << station.getId() << " ";
94  writeCoordinatesToStream_geodetic(&stationPosition, &generalStationsInfoFileHandle);
95  writeCoordinateSystemToStream(station.getCoordinateSystem(), _globalCoordinateSystem_, &generalStationsInfoFileHandle);
96  generalStationsInfoFileHandle << endl;
97  }
98  } catch(...) {
99  generalStationsInfoFileHandle.close();
100  throw;
101  }
102 
103  generalStationsInfoFileHandle.close();
104 
105  return true;
106 }
107 
110  if(!fs::create_directory(_outputDirectory_)) {
111  return "Could not create output directory: " + _outputDirectory_.string();
112  }
113  } else {
114  return "Output directory already existed: " + _outputDirectory_.string();
115  }
116  return "";
117 }
118 
119 fs::path DataWriter::_createOutputFolderForEvent(const std::string& pEventId) const {
120  fs::path eventOutputDirectory(_outputDirectory_);
121  eventOutputDirectory+="/"+pEventId;
122  if(!fs::exists(eventOutputDirectory)) {
123  if(!fs::create_directory(eventOutputDirectory)) {
124  return fs::path();
125  }
126  }
127  return eventOutputDirectory;
128 }
129 
131  evt::Event& pEvent,
132  const Flight& pFlight,
133  const Point& pReconstructedRadioEventOrigin,
134  CoordinateSystemPtr pCoreCoordinateSystem) {
135  string eventId = pEvent.GetHeader().GetId();
136  const TimeStamp& eventTime = pEvent.GetHeader().GetTime();
137  Point* airplanePosition_pressureAltitude_p = pFlight.getPosition(eventTime, Ads_bEvent::ePressureAltitude);
138  Point airplanePosition_pressureAltitude = airplanePosition_pressureAltitude_p==NULL ? Point(0,0,0, _globalCoordinateSystem_) : *airplanePosition_pressureAltitude_p;
139 
140  Point* airplanePosition_manuallyCorrectedPressureAltitude_p = pFlight.getPosition(eventTime, Ads_bEvent::eManuallyCorrectedPressureAltitude);
141  Point airplanePosition_manuallyCorrectedPressureAltitude = airplanePosition_manuallyCorrectedPressureAltitude_p==NULL ? Point(0,0,0, _globalCoordinateSystem_) : *airplanePosition_manuallyCorrectedPressureAltitude_p;
142 
143  Point* airplanePosition_CorrectedPressureAltitude_p = pFlight.getPosition(eventTime, Ads_bEvent::eGDASCorrectedPressureAltitude);
144  Point airplanePosition_CorrectedPressureAltitude = airplanePosition_CorrectedPressureAltitude_p==NULL ? Point(0,0,0, _globalCoordinateSystem_) : *airplanePosition_CorrectedPressureAltitude_p;
145 
146  Point* airplanePosition_GPSAltitude_p = pFlight.getPosition(eventTime, Ads_bEvent::eGPSAltitude);
147  Point airplanePosition_GPSAltitude = airplanePosition_GPSAltitude_p==NULL ? Point(0,0,0, _globalCoordinateSystem_) : *airplanePosition_GPSAltitude_p;
148 
149  Point coreCoordinateSystemOrigin(0,0,0,pCoreCoordinateSystem);
150 
151  Vector airplaneSpeed = *pFlight.getSpeed(eventTime);
152  fs::path eventFolder = _createOutputFolderForEvent(eventId);
153  fs::path generalInfoFile(eventFolder);
154 
155  generalInfoFile+="/";
156  generalInfoFile+=generalInfoFileName;
157  ofstream generalInfoFileHandle;
158  try {
159  generalInfoFileHandle.open(generalInfoFile.c_str());
160 
161  if(!generalInfoFileHandle.is_open()) {
162  return NULL;
163  }
164 
165  generalInfoFileHandle << "Radio Event Id| "
166  << "Unix Time Stamp (s)| "
167  << "Airplane Id| "
168  << "Flight Id| "
169 
170  << "Airplane X-Coordinate (Pressure Altitude) In Global CS (m)| "
171  << "Airplane Y-Coordinate (Pressure Altitude) In Global CS (m)| "
172  << "Airplane Z-Coordinate (Pressure Altitude) In Global CS (m)| "
173 
174  << "Airplane X-Coordinate (Manually Corrected Pressure Altitude) In Global CS (m)| "
175  << "Airplane Y-Coordinate (Manually Corrected Pressure Altitude) In Global CS (m)| "
176  << "Airplane Z-Coordinate (Manually Corrected Pressure Altitude) In Global CS (m)| "
177 
178  << "Airplane X-Coordinate (GDAS Corrected Pressure Altitude) In Global CS (m)| "
179  << "Airplane Y-Coordinate (GDAS Corrected Pressure Altitude) In Global CS (m)| "
180  << "Airplane Z-Coordinate (GDAS Corrected Pressure Altitude) In Global CS (m)| "
181 
182  << "Airplane X-Coordinate (GPS Altitude) In Global CS (m)| "
183  << "Airplane Y-Coordinate (GPS Altitude) In Global CS (m)| "
184  << "Airplane Z-Coordinate (GPS Altitude) In Global CS (m)| "
185 
186  << "Airplane X-Speed In Global CS (m/s)| "
187  << "Airplane Y-Speed in Global CS (m/s)| "
188  << "Airplane Z-Speed in Global CS (m/s)| "
189 
190  << "Reconstructed X-Coordinate In Global CS (m)| "
191  << "Reconstructed Y-Coordinate In Global CS (m)| "
192  << "Reconstructed Z-Coordinate In Global CS (m)| "
193 
194  << "Airplane Latitude (Pressure Altitude) (UTM) (degree)| "
195  << "Airplane Longitude (Pressure Altitude) (UTM) (degree)| "
196  << "Airplane Altitude (Pressure Altitude) (UTM) (m)| "
197 
198  << "Airplane Latitude (Manually Corrected Pressure Altitude) (UTM) (degree)| "
199  << "Airplane Longitude (Manually Corrected Pressure Altitude) (UTM) (degree)| "
200  << "Airplane Altitude (Manually Corrected Pressure Altitude) (UTM) (m)| "
201 
202  << "Airplane Latitude (GDAS Corrected Pressure Altitude) (UTM) (degree)| "
203  << "Airplane Longitude (GDAS Corrected Pressure Altitude) (UTM) (degree)| "
204  << "Airplane Altitude (GDAS Corrected Pressure Altitude) (UTM) (m)| "
205 
206  << "Airplane Latitude (GPS Altitude) (UTM) (degree)| "
207  << "Airplane Longitude (GPS Altitude) (UTM) (degree)| "
208  << "Airplane Altitude (GPS Altitude) (UTM) (m)| "
209 
210  << "Reconstructed Latitude (UTM) (degree)| "
211  << "Reconstructed Longitude (UTM) (degree)| "
212  << "Reconstructed Altitude (UTM) (m)| "
213 
214  << "Core Latitude (UTM) (degree)| "
215  << "Core Longitude (UTM) (degree)| "
216  << "Core Altitude (UTM) (m)| "
217 
218  << "Core-System-Origin-X-Coordinate In Global CS (m)| "
219  << "Core-System-Origin-Y-Coordinate In Global CS (m)| "
220  << "Core-System-Origin-Z-Coordinate In Global CS (m)| "
221 
222  << "Core-System eX_x In Global CS (m)| Core-System eX_y In Global CS (m)| Core-System eX_z In Global CS (m)| "
223  << "Core-System eY_x In Global CS (m)| Core-System eY_y In Global CS (m)| Core-System eY_z In Global CS (m)| "
224  << "Core-System eZ_x In Global CS (m)| Core-System eZ_y In Global CS (m)| Core-System eZ_z In Global CS (m)| "
225 
226  << "Airplane-System-Origin-X-Coordinate In Global CS (m)| "
227  << "Airplane-System-Origin-Y-Coordinate In Global CS (m)| "
228  << "Airplane-System-Origin-Z-Coordinate In Global CS (m)| "
229 
230  << "Airplane-System eX_x In Global CS (m)| Airplane-System eX_y In Global CS (m)| Airplane-System eX_z In Global CS (m)| "
231  << "Airplane-System eY_x In Global CS (m)| Airplane-System eY_y In Global CS (m)| Airplane-System eY_z In Global CS (m)| "
232  << "Airplane-System eZ_x In Global CS (m)| Airplane-System eZ_y In Global CS (m)| Airplane-System eZ_z In Global CS (m)| "
233  << endl;
234 
235  generalInfoFileHandle << setprecision(numeric_limits<long double>::digits10 + 1)
236  << eventId << " "
238  << pFlight.getAirplane().getId() << " "
239  << pFlight.getId() << " ";
240  writeCoordinatesToStream_cartesian(&airplanePosition_pressureAltitude, _globalCoordinateSystem_, &generalInfoFileHandle);
241  writeCoordinatesToStream_cartesian(&airplanePosition_manuallyCorrectedPressureAltitude, _globalCoordinateSystem_, &generalInfoFileHandle);
242  writeCoordinatesToStream_cartesian(&airplanePosition_CorrectedPressureAltitude, _globalCoordinateSystem_, &generalInfoFileHandle);
243  writeCoordinatesToStream_cartesian(&airplanePosition_GPSAltitude, _globalCoordinateSystem_, &generalInfoFileHandle);
244  writeVectorToStream_cartesian(&airplaneSpeed, _globalCoordinateSystem_, &generalInfoFileHandle);
245  writeCoordinatesToStream_cartesian(&pReconstructedRadioEventOrigin, _globalCoordinateSystem_, &generalInfoFileHandle);
246  writeCoordinatesToStream_geodetic(&airplanePosition_pressureAltitude, &generalInfoFileHandle);
247  writeCoordinatesToStream_geodetic(&airplanePosition_manuallyCorrectedPressureAltitude, &generalInfoFileHandle);
248  writeCoordinatesToStream_geodetic(&airplanePosition_CorrectedPressureAltitude, &generalInfoFileHandle);
249  writeCoordinatesToStream_geodetic(&airplanePosition_GPSAltitude, &generalInfoFileHandle);
250  writeCoordinatesToStream_geodetic(&pReconstructedRadioEventOrigin, &generalInfoFileHandle);
251  writeCoordinatesToStream_geodetic(&coreCoordinateSystemOrigin, &generalInfoFileHandle);
252  writeCoordinateSystemToStream(pCoreCoordinateSystem, _globalCoordinateSystem_, &generalInfoFileHandle);
253  writeCoordinateSystemToStream(LocalCoordinateSystem::Create(airplanePosition_pressureAltitude), _globalCoordinateSystem_, &generalInfoFileHandle);
254  generalInfoFileHandle << endl;
255  } catch(...) {
256  generalInfoFileHandle.close();
257  throw;
258  }
259  generalInfoFileHandle.close();
260  PulseInfoWriter* pulseInfoWriter = new PulseInfoWriter(
261  this,
262  eventFolder,
263  pEvent);
264  _pulseInfoWriters_.push_back(pulseInfoWriter);
265  return pulseInfoWriter;
266 }
unsigned int getId() const
Definition: StationInfo.h:23
Point object.
Definition: Point.h:32
Detector description interface for Station-related data.
evt::Header & GetHeader()
void writeCoordinateSystemToStream(utl::CoordinateSystemPtr pCoordinateSystem, utl::CoordinateSystemPtr pGlobalCoordinateSystem, std::ofstream *pStream)
utl::Point * getPosition(const utl::TimeStamp &pTime, Ads_bEvent::AltitudeType pAltitudeType) const
Definition: Flight.cc:186
const Airplane & getAirplane() const
Definition: Flight.h:57
A TimeStamp holds GPS second and nanosecond for some event.
Definition: TimeStamp.h:110
const utl::TimeStamp & GetTime() const
Definition: Event/Header.h:33
utl::Vector * getSpeed(const utl::TimeStamp &pTime, Ads_bEvent::AltitudeType pAltitudeType) const
Definition: Flight.cc:212
boost::shared_ptr< const CoordinateTransformer > CoordinateSystemPtr
Shared pointer for coordinate systems.
char * exists
Definition: XbArray.cc:12
const std::string & getId() const
Definition: Airplane.h:32
int GetId() const
Station ID.
const std::string & GetId() const
Get the event identifier.
Definition: Event/Header.h:31
void writeVectorToStream_cartesian(const utl::Vector *pVector, utl::CoordinateSystemPtr pCoordinateSystem, std::ofstream *pStream)
Vector object.
Definition: Vector.h:30
PulseInfoWriter * registerEvent(evt::Event &pEvent, const Flight &pFlight, const utl::Point &pReconstructedRadioEventOrigin, utl::CoordinateSystemPtr pCoreCoordinateSystem)
double ApproximatedUnixTimeStampFromTimestamp(const utl::TimeStamp &pTimeStamp)
Definition: AirplaneUtil.h:35
const utl::CoordinateSystemPtr & getCoordinateSystem() const
Definition: StationInfo.h:27
void writeCoordinatesToStream_geodetic(const utl::Point *pPoint, std::ofstream *pStream)
const std::string & getId() const
Definition: Flight.h:46
void writeCoordinatesToStream_cartesian(const utl::Point *pPoint, utl::CoordinateSystemPtr pCoordinateSystem, std::ofstream *pStream)
#define ERROR(message)
Macro for logging error messages.
Definition: ErrorLogger.h:165

, generated on Tue Sep 26 2023.