2 #include <boost/format.hpp>
3 #include <boost/lexical_cast.hpp>
4 #include <sdet/SStationListManager.h>
5 #include <det/Detector.h>
6 #include <utl/UTCDateTime.h>
12 using namespace ::boost::multi_index;
21 const string& componentProperty,
25 const int id = GetStationId(componentIndex);
27 const auto sIt = idIndex.find(
id);
29 if (sIt == idIndex.end())
30 return VManager::eNotFound;
32 if (componentProperty ==
"isUUB")
33 returnData = sIt->fIsUUB;
34 else if (componentProperty ==
"hasSmallPMT")
35 returnData = sIt->fHasSmallPMT;
36 else if (componentProperty ==
"hasScintillator")
37 returnData = sIt->fHasScintillator;
38 else if (componentProperty ==
"groupId")
39 returnData = sIt->fGroupId;
40 else if (componentProperty ==
"zone")
41 returnData = sIt->fZone;
43 return VManager::eNotFound;
45 return VManager::eFound;
53 const string& componentProperty,
57 const int id = GetStationId(componentIndex);
59 const auto sIt = idIndex.find(
id);
61 if (sIt == idIndex.end())
62 return VManager::eNotFound;
64 if (componentProperty ==
"northing")
65 returnData = sIt->fNorthing;
66 else if (componentProperty ==
"easting")
67 returnData = sIt->fEasting;
68 else if (componentProperty ==
"altitude")
69 returnData = sIt->fAltitude;
70 else if (componentProperty ==
"axis1")
71 returnData = sIt->fAxis1;
72 else if (componentProperty ==
"axis2")
73 returnData = sIt->fAxis2;
75 return VManager::eNotFound;
77 return VManager::eFound;
85 const string& componentProperty,
89 const int id = GetStationId(componentIndex);
91 const auto sIt = idIndex.find(
id);
93 if (sIt == idIndex.end())
94 return VManager::eNotFound;
96 if (componentProperty ==
"name")
97 returnData = sIt->fName;
98 else if (componentProperty ==
"commission")
99 returnData = sIt->fCommissionTime;
100 else if (componentProperty ==
"commissionUUB")
101 returnData = sIt->fUUBCommissionTime;
102 else if (componentProperty ==
"decommission")
103 returnData = sIt->fDecommissionTime;
104 else if (componentProperty ==
"band")
105 returnData = sIt->fBand;
106 else if (componentProperty ==
"ellipsoid")
107 returnData = sIt->fEllipsoid;
109 return VManager::eNotFound;
111 return VManager::eFound;
119 const string& componentProperty,
123 if (fStations.empty())
124 return VManager::eNotFound;
126 if (componentProperty ==
"fullStationList")
127 GetFullStationList(returnData);
128 else if (componentProperty ==
"groupIds")
129 return GetGroupIds(returnData);
130 else if (componentProperty ==
"group")
131 return GetGroup(returnData, VManager::FindComponent<int>(
"groupId", componentIndex));
132 else if (componentProperty ==
"stationGroup")
133 return GetStationGroup(returnData, GetStationId(componentIndex));
134 else if (componentProperty ==
"crown")
136 GetStationCrown(returnData,
137 GetStationId(componentIndex),
138 VManager::FindComponent<int>(
"crown", componentIndex));
140 return VManager::eNotFound;
142 return VManager::eFound;
150 const string& componentProperty,
154 if (fStations.empty())
155 return VManager::eNotFound;
157 if (componentProperty ==
"fullStationGroups")
158 GetFullStationGroups(returnData);
160 return VManager::eNotFound;
162 return VManager::eFound;
170 const string& componentProperty,
174 if (fStations.empty())
175 return VManager::eNotFound;
177 if (componentProperty ==
"inGrid") {
178 const int id = GetStationId(componentIndex);
179 const auto& idIndex = fStations.get<
ByStationId>();
180 const auto sIt = idIndex.find(
id);
181 if (sIt == idIndex.end())
182 return VManager::eNotFound;
183 returnData = sIt->fInGrid;
185 return VManager::eNotFound;
187 return VManager::eFound;
194 if (HasStationData(station.
fId))
202 fStations.insert(station);
212 const auto& idIndex = fStations.get<
ByStationId>();
213 return idIndex.find(
id) != idIndex.end();
222 const auto& idIndex = fStations.get<
ByStationId>();
223 for (
const auto&
s : idIndex)
224 returnList.push_back(
s.fId);
232 if (fStations.empty())
237 const TimeStamp& dTime = Detector::GetInstance().GetTime();
239 const auto& grIndex = fStations.get<
ByGroupId>();
241 int currentGroupId = 0;
242 vector<int> currentGroup;
244 for (
const auto& gr : grIndex) {
246 const int stationGroupId = gr.fGroupId;
249 if (!stationGroupId || gr.fCommissionTimeRange != dTime)
253 if (stationGroupId != currentGroupId) {
254 if (!(currentGroup.size() > 1)) {
255 returnData.push_back(move(currentGroup));
256 currentGroup.clear();
258 currentGroupId = stationGroupId;
261 currentGroup.push_back(gr.fId);
265 if (!(currentGroup.size() > 1))
266 returnData.push_back(currentGroup);
274 const auto& grIndex = fStations.get<
ByGroupId>();
277 return VManager::eFound;
279 const TimeStamp& dTime = Detector::GetInstance().GetTime();
281 auto it = grIndex.begin();
282 for ( ; it != grIndex.end(); ++it)
283 if (it->fCommissionTimeRange == dTime)
286 if (it != grIndex.end())
287 returnData.push_back(it->fGroupId);
289 for (++it; it != grIndex.end(); ++it)
290 if (it->fCommissionTimeRange == dTime &&
291 returnData.back() != it->fGroupId)
292 returnData.push_back(it->fGroupId);
294 return VManager::eFound;
302 const TimeStamp& dTime = Detector::GetInstance().GetTime();
304 const auto group = fStations.get<
ByGroupId>().equal_range(groupId);
306 for (
auto it = group.first; it != group.second; ++it)
307 if (it->fCommissionTimeRange == dTime)
308 returnData.push_back(it->fId);
310 return VManager::eFound;
318 const auto& idIndex = fStations.get<
ByStationId>();
319 const auto sIt = idIndex.find(
id);
320 if (sIt == idIndex.end())
321 return VManager::eNotFound;
325 const TimeStamp& dTime = Detector::GetInstance().GetTime();
328 return VManager::eFound;
330 const auto group = fStations.get<
ByGroupId>().equal_range(sIt->fGroupId);
332 for (
auto it = group.first; it != group.second; ++it)
333 if (it->fCommissionTimeRange == dTime && it->fId !=
id)
334 returnData.push_back(it->fId);
336 return VManager::eFound;
348 const auto& idIndex = fStations.get<
ByStationId>();
349 const auto sIt = idIndex.find(
id);
350 if (sIt == idIndex.end())
351 return VManager::eNotFound;
355 if (
size_t(index) >= sIt->fInGrid.size() || !sIt->fInGrid[index])
356 return VManager::eFound;
360 return VManager::eFound;
363 double level = nCrown;
406 const double axis1 = sIt->fAxis1;
407 const double axis2 = sIt->fAxis2;
412 using boost::make_tuple;
414 const auto& axesIndex = fStations.get<
ByAxes>();
415 const auto start = axesIndex.lower_bound(make_tuple(axis1 - level, axis2 - level));
416 const auto stop = axesIndex.upper_bound(make_tuple(axis1 + level, axis2 + level));
418 const TimeStamp& detTime = det::Detector::GetInstance().GetTime();
420 for (
auto it = start; it != stop; ++it) {
422 if (
size_t(index) >= it->fInGrid.size() || !it->fInGrid[index])
425 const double a = it->fAxis1 - axis1;
426 const double b = it->fAxis2 - axis2;
428 if (fabs(a) != level && fabs(b) != level)
430 }
else if (fabs(a - b) != level)
434 if (it->fCommissionTimeRange != detTime)
437 crown.push_back(it->fId);
441 return VManager::eFound;
450 for (
const auto&
c : str)
468 if (fStations.empty())
471 boost::format stationFmt(
472 "%1%<station id=\"%2%\">\n"
473 "%1% <northing unit=\"meter\"> %|3$.2f| </northing>\n"
474 "%1% <easting unit=\"meter\"> %|4$.2f| </easting>\n"
475 "%1% <altitude unit=\"meter\"> %|5$.2f| </altitude>\n"
476 "%1% <name> %6% </name>\n"
477 "%1% <commission> %7% </commission>\n"
478 "%1% <commissionUUB> %8% </commissionUUB>\n"
479 "%1% <decommission> %9% </decommission>\n"
480 "%1% <isUUB> %10% </isUUB>\n"
481 "%1% <hasSmallPMT> %11% </hasSmallPMT>\n"
482 "%1% <hasScintillator> %12% </hasScintillator>\n"
483 "%1% <inGrid> %13% </inGrid>\n"
484 "%1% <groupId> %14% </groupId>\n"
485 "%1% <axes> %15% %16% </axes>\n"
486 "%1% <ellipsoid> %17% </ellipsoid>\n"
487 "%1% <zone> %18% </zone>\n"
488 "%1% <band> %19% </band>\n"
493 for (
const auto&
s : sIndex) {
494 ostringstream inGrid;
495 if (
s.fInGrid.empty())
498 for (
size_t i = 1, n =
s.fInGrid.size(); i < n; ++i)
511 %
s.fUUBCommissionTime
512 %
s.fDecommissionTime
string StringToXMLString(const string &str)
det::VManager::Status GetStationGroup(std::vector< int > &returnData, const int id) const
Time interval defined by two TimeStamps.
std::string fCommissionTime
int crown(double x1, double x2, double y1, double y2)
A TimeStamp holds GPS second and nanosecond for some event.
bool HasStationData(const int id) const
det::VManager::Status GetStationCrown(std::vector< int > &crown, const int id, const int nCrown, SDetectorConstants::GridIndex index=SDetectorConstants::eStandard) const
Get crown accoding to detector time and station commission time range.
det::VManager::Status GetGroupIds(std::vector< int > &returnData) const
det::VManager::Status GetData(T &returnData, const std::string &componentProperty, const det::VManager::IndexMap &componentIndex) const
void GetFullStationGroups(std::vector< std::vector< int > > &returnList) const
det::VManager::Status GetGroup(std::vector< int > &returnData, const int groupId) const
std::map< std::string, std::string > IndexMap
bool DumpXML(std::ostream &output, const std::string &indent="") const
void GetFullStationList(std::vector< int > &returnList) const
std::string fDecommissionTime
bool ConditionalAddStationData(StationData &station)
adds station record only if it does not already exist
utl::TimeRange fCommissionTimeRange
Status
Specifies success or (eventually) various possible failure modes.