14 #include "fwk/CentralConfig.h"
16 #include "utl/LeapSeconds.h"
17 #include "utl/UTMPoint.h"
18 #include "utl/PhysicalConstants.h"
19 #include "utl/ErrorLogger.h"
20 #include "utl/Branch.h"
22 #include "det/Detector.h"
24 #include "boost/filesystem.hpp"
25 #include "boost/lexical_cast.hpp"
38 using namespace RdAirplane;
39 using namespace boost;
41 namespace fs = filesystem;
45 _coordinateSystem_(
Detector::GetInstance().GetReferenceCoordinateSystem()),
46 _timeShift_(pTimeShift),
47 _airplaneOffsets_(pAirplaneOffsets),
48 _rootTrajectoryFitFile_(pRootTrajectoryFitFileName.empty() ? NULL : new TFile(pRootTrajectoryFitFileName.c_str(),
"RECREATE")){}
51 for(AirplaneMap::iterator iter =
_airplanes_.begin();
72 for(vector<string>::const_iterator iter = pAds_bLogFileNames.begin();iter!=pAds_bLogFileNames.end();++iter) {
73 const string& fileName = *iter;
88 gettimeofday(&startTime, NULL);
89 INFO(
"Reading File: " + pAds_bLogFileName +
"...");
93 fs::path pathToFile = fs::path(pAds_bLogFileName);
97 ifstream
file(pAds_bLogFileName.c_str());
104 unsigned int lineNumber=0;
106 while(getline(
file,line)) {
108 string::size_type doubleWhiteSpacePosition=-1;
110 while((doubleWhiteSpacePosition=line.find(
" "))!=string::npos)
111 line.replace(doubleWhiteSpacePosition, 2,
" ");
113 if(line.empty() || line==
" ")
116 unsigned long capturedAtUnixTime=0;
118 double longitude=0.0;
121 string ads_bMessageAsHex;
122 stringstream lineAsStream(line);
123 lineAsStream >> capturedAtUnixTime;
124 lineAsStream >> ads_bMessageAsHex;
135 lineAsStream >> latitude;
136 lineAsStream >> longitude;
137 lineAsStream >> altitude;
139 ads_bMessageAsHex = ads_bMessageAsHex.substr(1, ads_bMessageAsHex.length()-2);
141 if( capturedAtUnixTime < 1388534400000 ||
143 latitude<-40.0 || latitude>-30.0 ||
144 longitude<-75.0 || longitude>-60.0 ||
145 altitude < 4000.0 || altitude > 16000.0) {
148 message <<
"Skipped bad data in Line " << lineNumber << endl;
150 message <<
"\t airplane id: " <<
id << endl;
151 message <<
"\t latitude: " << latitude << endl;
152 message <<
"\t longitude: " << longitude << endl;
153 message <<
"\t altitude: " << altitude << endl;
157 unsigned long unixMilliSeconds = capturedAtUnixTime%1000;
158 time_t unixSeconds = (capturedAtUnixTime-unixMilliSeconds)/1000.0;
159 unsigned long gpsSecond;
160 LeapSeconds::GetInstance().ConvertUnixToGPS(unixSeconds, gpsSecond);
161 TimeStamp capturedAtTime(gpsSecond, ((
double)unixMilliSeconds)*
pow(10.0,6));
164 airplane->
AddAds_bEvent(capturedAtTime,
UTMPoint(latitude*
degree, longitude*degree, altitude*
m, ReferenceEllipsoid::eWGS84), ads_bMessageAsHex);
172 gettimeofday(&endTime, NULL);
173 double passedTime = endTime.tv_sec-startTime.tv_sec+(1e-6)*(endTime.tv_usec-startTime.tv_usec);
174 INFO(
"(Finished in " + lexical_cast<string>(round(passedTime)) +
" s)");
190 if(airplanePosition==NULL)
193 double eX=airplanePosition->
GetX(pCoreCoordinateSystem);
194 double eY=airplanePosition->
GetY(pCoreCoordinateSystem);
195 double eZ=airplanePosition->
GetZ(pCoreCoordinateSystem);
196 double pX=pReconstructedEventPosition.
GetX(pCoreCoordinateSystem);
197 double pY=pReconstructedEventPosition.
GetY(pCoreCoordinateSystem);
198 double pZ=pReconstructedEventPosition.
GetZ(pCoreCoordinateSystem);
199 double absE=
sqrt(eX*eX+eY*eY+eZ*eZ);
200 double absP=
sqrt(pX*pX+pY*pY+pZ*pZ);
201 double scalarProduct=eX*pX+eY*pY+eZ*pZ;
202 double angle=acos(scalarProduct/absE/absP);
204 if(angle>pMaxAngleDifferenceInRadian)
227 info+=iter->second->getInformation()+
"\n";
237 for(AirplaneOffsetList::const_iterator iter = offsetList.begin(); iter != offsetList.end(); ++iter) {
238 double timeDifferenceInS =
std::abs((iter->getWhen()-pTime).GetSecond());
254 vector<string> fileNames;
255 istringstream fileNamesStream(pAds_bLogFileNames);
256 copy(istream_iterator<string>(fileNamesStream),
257 istream_iterator<string>(),
258 back_inserter(fileNames));
259 return InitSharedDataBase(fileNames, pTimeShift, pAirplaneOffsets, pRootTrajecotryFitFileName);
263 static bool initialized =
false;
266 string ads_bLogFiles;
267 string rootTrajecotryFitFileName;
269 Branch ads_bTopBranch = CentralConfig::GetInstance()->
GetTopBranch(
"RdAds_bDataBase");
272 ads_bTopBranch.
GetChild(
"RootTrajectoryFitOutputFile").
GetData(rootTrajecotryFitFileName);
277 double unixTimeStamp;
278 double altitudeOffset;
281 offsetElement.GetChild(
"UnixTimeStamp").GetData(unixTimeStamp);
282 offsetElement.GetChild(
"AltitudeOffset").GetData(altitudeOffset);
283 offsetElement.GetChild(
"TimeOffset").GetData(timeOffset);
284 AirplaneOffsetsMap::iterator iter = airplaneOffsetsMap.find(airplaneId);
286 if(iter == airplaneOffsetsMap.end()) {
287 airplaneOffsets = &airplaneOffsetsMap.insert(make_pair(airplaneId,
AirplaneOffsetList())).first->second;
289 airplaneOffsets = &iter->second;
291 unsigned long gpsSecond;
292 LeapSeconds::GetInstance().ConvertUnixToGPS((time_t)unixTimeStamp/
s, gpsSecond);
Branch GetTopBranch() const
std::list< FlightAndPositionPair > FlightsAndCoordinatesList
Airplane * _getOrCreateAndGetAirplaneById(const std::string &pId)
Class to hold and convert a point in geodetic coordinates.
utl::Point * getPosition(const utl::TimeStamp &pTime, Ads_bEvent::AltitudeType pAltitudeType) const
Flight * getFlight(const utl::TimeStamp &pTime) const
const utl::TimeInterval & getTimeShift() const
#define INFO(message)
Macro for logging informational messages.
Branch GetChild(const std::string &childName) const
Get child of this Branch by child name.
double pow(const double x, const unsigned int i)
A TimeStamp holds GPS second and nanosecond for some event.
Branch GetNextSibling() const
Get next sibling of this branch.
boost::shared_ptr< const CoordinateTransformer > CoordinateSystemPtr
Shared pointer for coordinate systems.
Class representing a document branch.
double GetX(const CoordinateSystemPtr &coordinateSystem) const
const std::string & getId() const
double abs(const SVector< n, T > &v)
Ads_bEvent * AddAds_bEvent(const utl::TimeStamp &pCaptureTime, const utl::UTMPoint &pCoordinates, const std::string &pAds_bMessageAsHex)
Top of the hierarchy of the detector description interface.
static bool comparator(const FlightAndPositionPair &pLHS, const FlightAndPositionPair &pRHS)
std::set< std::string > _logFiles_
void GetData(bool &b) const
Overloads of the GetData member template function.
FlightsAndCoordinatesList getFlights(const utl::TimeStamp &pTime, const utl::Point &pReconstructedEventPosition, const double &pMaxAngleDifferenceInRadian, utl::CoordinateSystemPtr pCoreCoordinateSystem)
Ads_bDataBase(const utl::TimeInterval &pTimeShift=0.0, const AirplaneOffsetsMap &pAirplaneOffsets=AirplaneOffsetsMap(), const std::string &pRootTrajectoryFitFileName="")
std::map< std::string, AirplaneOffsetList > AirplaneOffsetsMap
double GetY(const CoordinateSystemPtr &coordinateSystem) const
ReadLogFileResults AddAirplanesFromLogFiles(const std::vector< std::string > &pAds_bLogFileNames)
A TimeInterval is used to represent time elapsed between two events.
ReadLogFileResult _addAirplanesFromLogFile(const std::string &pAds_bLogFileName)
std::list< ReadLogFileResult > ReadLogFileResults
static ReadLogFileResults InitSharedDataBase(const std::vector< std::string > &pAds_bLogFileNames, const utl::TimeInterval &pTimeShift=0.0, const AirplaneOffsetsMap &pAirplaneOffsets=AirplaneOffsetsMap(), const std::string &pRootTrajecotryFitFileName="")
AirplaneOffsetsMap _airplaneOffsets_
TFile * _rootTrajectoryFitFile_
std::string getInformations() const
static Ads_bDataBase * _sharedDataBase
static Ads_bDataBase * getSharedDataBase()
Airplane * getAirplaneById(const std::string &pId)
const AirplaneOffset * getAirplaneOffset(const Airplane &pAirplane, const utl::TimeStamp &pTime) const
Branch GetFirstChild() const
Get first child of this Branch.
double GetZ(const CoordinateSystemPtr &coordinateSystem) const
static ReadLogFileResults InitSharedDataBaseFromCentralConfig()
std::list< AirplaneOffset > AirplaneOffsetList
std::string TimestampHumanReadAble(const double &pUnixTimeStampInS)
static const long LONGEST_TIMESSPAN_BETWEEN_TWO_ADS_B_EVENTS_DURING_ONE_FLIGHT_IN_SECONDS