|
|
@ -3,6 +3,8 @@ |
|
|
|
#include <pybind11/stl.h> |
|
|
|
#include <pybind11/stl.h> |
|
|
|
#include <vector> |
|
|
|
#include <vector> |
|
|
|
#include <fstream> |
|
|
|
#include <fstream> |
|
|
|
|
|
|
|
#include <ctime> |
|
|
|
|
|
|
|
#include <cmath> |
|
|
|
#include "stormpci.h" |
|
|
|
#include "stormpci.h" |
|
|
|
|
|
|
|
|
|
|
|
#define STRINGIFY(x) #x |
|
|
|
#define STRINGIFY(x) #x |
|
|
@ -18,6 +20,26 @@ typedef struct { |
|
|
|
} BlockBinary; |
|
|
|
} BlockBinary; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double haversine(double angle){ |
|
|
|
|
|
|
|
return sin(angle / 2.0)*sin(angle / 2.0); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double inverse_haversine(double value){ |
|
|
|
|
|
|
|
return 2.0 * asin(sqrt(value)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double distance(double lat1, double lon1, double lat2, double lon2) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
double theta = (lon2 - lon1) * M_PI / 180; |
|
|
|
|
|
|
|
double phi1 = lat1 * M_PI / 180; |
|
|
|
|
|
|
|
double phi2 = lat2 * M_PI / 180; |
|
|
|
|
|
|
|
double curve = inverse_haversine(haversine(phi1 - phi2) + |
|
|
|
|
|
|
|
cos(phi1) * cos(phi2) * haversine(theta)); |
|
|
|
|
|
|
|
return curve * 6'371'000; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class BlockReader |
|
|
|
class BlockReader |
|
|
|
{ |
|
|
|
{ |
|
|
|
public: |
|
|
|
public: |
|
|
@ -155,6 +177,43 @@ PYBIND11_MODULE(stormpci_bin_reader, m) { |
|
|
|
.def_readonly("EastPol", &StrikeData::EastPol) |
|
|
|
.def_readonly("EastPol", &StrikeData::EastPol) |
|
|
|
.def_readonly("EFieldPol", &StrikeData::EFieldPol) |
|
|
|
.def_readonly("EFieldPol", &StrikeData::EFieldPol) |
|
|
|
.def_readonly("lts2_data", &StrikeData::lts2_data) |
|
|
|
.def_readonly("lts2_data", &StrikeData::lts2_data) |
|
|
|
|
|
|
|
.def_property_readonly("_timestamp_ns", [](const StrikeData &strike) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::tm tm {}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tm.tm_year = (int)strike.lts2_data.year - 1900; |
|
|
|
|
|
|
|
tm.tm_mon = (int)strike.lts2_data.month - 1; |
|
|
|
|
|
|
|
tm.tm_mday = (int)strike.lts2_data.day; |
|
|
|
|
|
|
|
tm.tm_hour = (int)strike.lts2_data.hours; |
|
|
|
|
|
|
|
tm.tm_min = (int)strike.lts2_data.minutes; |
|
|
|
|
|
|
|
tm.tm_sec = (int)strike.lts2_data.seconds; |
|
|
|
|
|
|
|
tm.tm_isdst = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::time_t epoch_s = std::mktime(&tm); |
|
|
|
|
|
|
|
unsigned long long oscillator_ns = ((unsigned long long)strike.lts2_data.TS_time*1'000'000'000)/(unsigned long long)strike.lts2_data.TS_Osc; |
|
|
|
|
|
|
|
unsigned long long timestamp_ns = epoch_s*1'000'000'000 + oscillator_ns; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return timestamp_ns; |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
.def_property_readonly("_station_coords", [](const StrikeData &strike) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double lat = (double)strike.lts2_data.latitude_mas / 324000000 * 90; |
|
|
|
|
|
|
|
double lon = (double)strike.lts2_data.longitude_mas / 648000000 * 180; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
switch(strike.lts2_data.latitude_ns) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
case 'N': break; |
|
|
|
|
|
|
|
case 'S': lat = -lat; break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
switch(strike.lts2_data.longitude_ew) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
case 'E': break; |
|
|
|
|
|
|
|
case 'W': lon = -lon; break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return std::pair(lat, lon); |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; |
|
|
|
; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|