3 #include <boost/lambda/lambda.hpp>
5 #include <utl/ErrorLogger.h>
6 #include <rdet/RDetector.h>
7 #include <rdet/RManagerRegister.h>
8 #include <det/VManager.h>
9 #include <utl/UTCDateTime.h>
10 #include <utl/TimeStamp.h>
11 #include <utl/LeapSeconds.h>
12 #include <utl/TabulatedFunctionComplexLgAmpPhase.h>
13 #include <utl/MathConstants.h>
15 #include <utl/AugerException.h>
16 #include <utl/AugerUnits.h>
36 MonitoringSQLManager::GetTemperature(
const std::string& site,
const double timeToAverage,
37 const unsigned int numberOfQueriesToBuffer,
41 const utl::TimeStamp& currentTime = det::Detector::GetInstance().GetTime();
42 unsigned int currentGPSSeconds = currentTime.
GetGPSSecond();
44 if (fTemperatureBuffer.find(site) == fTemperatureBuffer.end()) {
45 INFO(
"site not found in temperature buffer, buffering database...");
46 if (!BufferTemperature(site, timeToAverage, numberOfQueriesToBuffer)) {
47 WARNING(
"An error occurred while buffering temperature.");
48 return std::numeric_limits<double>::quiet_NaN();;
51 std::cout <<
"Temperatures buffered between " << fTemperatureBufferInterval[site].first <<
" and "
52 << fTemperatureBufferInterval[site].second <<
"\ncurrentGPSSeconds = "
53 << currentGPSSeconds << std::endl;
54 if (((fTemperatureBufferInterval[site].first - 0.9 * precision /
utl::second) > currentGPSSeconds) ||
55 ((fTemperatureBufferInterval[site].
second + 0.9 * precision /
utl::second) < currentGPSSeconds)) {
56 INFO(
"No temperature information at event-time found in buffer, rebuffering database...");
57 if (!BufferTemperature(site, timeToAverage, numberOfQueriesToBuffer)) {
58 WARNING(
"An error occurred while buffering temperature");
59 return std::numeric_limits<double>::quiet_NaN();;
64 for (
auto it = fTemperatureBuffer[site].begin(); it != fTemperatureBuffer[site].end(); ++it) {
65 if (fabs(it->first - currentGPSSeconds) < precision /
utl::second) {
67 sstr <<
"Temperature found in buffer. GPSsecond in buffer " << it->first
68 <<
", currentGPSseconds " << currentGPSSeconds <<
", difference "
69 << fabs(it->first - currentGPSSeconds) <<
", precision " << precision /
utl::second
77 sstr <<
"An error occurred reading temperature from buffer. "
78 "Most likely reason: There is no temperature information in the database for the event time "
84 return std::numeric_limits<double>::quiet_NaN();
89 MonitoringSQLManager::BufferTemperature(
const std::string& site,
const double timeToAverage,
90 const unsigned int numberOfQueriesToBuffer)
94 const utl::TimeStamp& currentTime = det::Detector::GetInstance().GetTime();
96 const utl::TimeStamp stopTime = currentTime + utl::TimeInterval(numberOfQueriesToBuffer * timeToAverage);
101 std::cout <<
"buffering DB for site " << site <<
" at time " << currentDateTime
102 <<
" buffer size is " << timeToAverage /
utl::second <<
"seconds with " << numberOfQueriesToBuffer
103 <<
" queries" << std::endl;
107 query <<
"select AVG(UNIX_TIMESTAMP(TimeStamp)), AVG(Temperature) from Weather where TimeStamp between \""
111 << timeToAverage /
utl::second <<
" -0.5) order by TimeStamp asc";
112 std::cout << query.str() << std::endl;
114 ostringstream error_msg;
115 error_msg <<
"Site " << site
116 <<
" is not implemented. The only current available site is \"CRS\"";
125 if (Query(query.str(), QueryInfoMessage(
"monitoring",
"temperature")) == eNotFound) {
126 std::cout <<
"error in DB Query" << std::endl;
132 vector<string> sqlResult;
134 std::vector<std::pair<unsigned long, double> > temp_vector;
135 while (FetchRow(sqlResult,
false) == eFound) {
136 unsigned long gpsSeconds = 0;
137 leapSeconds.
ConvertUnixToGPS(
long(boost::lexical_cast<double>(sqlResult[0])), gpsSeconds);
138 const double temperature = boost::lexical_cast<
double>(sqlResult[1]);
140 std::pair<unsigned long, double> temp_pair(gpsSeconds, temperature);
141 temp_vector.push_back(temp_pair);
143 fTemperatureBuffer[site] = temp_vector;
#define INFO(message)
Macro for logging informational messages.
std::string GetInMySQLFormat() const
void Init()
Initialise the registry.
Base class for exceptions trying to access non-existing components.
A TimeStamp holds GPS second and nanosecond for some event.
#define REGISTER_R_MANAGER(_name_, _Type_)
static const double precision
#define WARNING(message)
Macro for logging warning messages.
A TimeInterval is used to represent time elapsed between two events.
unsigned long GetGPSSecond() const
GPS second.
std::string GetInXMLFormat() const
#define ERROR(message)
Macro for logging error messages.
Manager to access monitoring data.
void ConvertUnixToGPS(const time_t unixSecond, unsigned long &gpsSecond) const