2 #include <boost/format.hpp>
3 #include <boost/lexical_cast.hpp>
4 #include <cdet/CStationListManager.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 StationIdIndex::const_iterator sIt = idIndex.find(
id);
29 if (sIt == idIndex.end())
30 return VManager::eNotFound;
32 if (componentProperty ==
"groupId")
33 returnData = sIt->fGroupId;
34 else if (componentProperty ==
"zone")
35 returnData = sIt->fZone;
37 return VManager::eNotFound;
39 return VManager::eFound;
47 const string& componentProperty,
51 const int id = GetStationId(componentIndex);
53 const StationIdIndex::const_iterator sIt = idIndex.find(
id);
55 if (sIt == idIndex.end())
56 return VManager::eNotFound;
58 if (componentProperty ==
"northing")
59 returnData = sIt->fNorthing;
60 else if (componentProperty ==
"easting")
61 returnData = sIt->fEasting;
62 else if (componentProperty ==
"altitude")
63 returnData = sIt->fAltitude;
64 else if (componentProperty ==
"axis1")
65 returnData = sIt->fAxis1;
66 else if (componentProperty ==
"axis2")
67 returnData = sIt->fAxis2;
69 return VManager::eNotFound;
71 return VManager::eFound;
79 const string& componentProperty,
83 const int id = GetStationId(componentIndex);
85 const StationIdIndex::const_iterator sIt = idIndex.find(
id);
87 if (sIt == idIndex.end())
88 return VManager::eNotFound;
90 if (componentProperty ==
"name")
91 returnData = sIt->fName;
92 else if (componentProperty ==
"commission")
93 returnData = sIt->fCommissionTime;
94 else if (componentProperty ==
"decommission")
95 returnData = sIt->fDecommissionTime;
96 else if (componentProperty ==
"band")
97 returnData = sIt->fBand;
98 else if (componentProperty ==
"ellipsoid")
99 returnData = sIt->fEllipsoid;
101 return VManager::eNotFound;
103 return VManager::eFound;
111 const string& componentProperty,
115 if (fStations.empty())
116 return VManager::eNotFound;
118 if (componentProperty ==
"fullStationList")
119 GetFullStationList(returnData);
120 else if (componentProperty ==
"groupIds")
121 return GetGroupIds(returnData);
122 else if (componentProperty ==
"group")
123 return GetGroup(returnData, VManager::FindComponent<int>(
"groupId", componentIndex));
124 else if (componentProperty ==
"stationGroup")
125 return GetStationGroup(returnData, GetStationId(componentIndex));
126 else if (componentProperty ==
"crown")
128 GetStationCrown(returnData,
129 GetStationId(componentIndex),
130 VManager::FindComponent<int>(
"crown", componentIndex));
132 return VManager::eNotFound;
134 return VManager::eFound;
142 const string& componentProperty,
146 if (fStations.empty())
147 return VManager::eNotFound;
149 if (componentProperty ==
"fullStationGroups")
150 GetFullStationGroups(returnData);
152 return VManager::eNotFound;
154 return VManager::eFound;
162 const string& componentProperty,
166 if (fStations.empty())
167 return VManager::eNotFound;
169 if (componentProperty ==
"inGrid")
171 const int id = GetStationId(componentIndex);
173 typedef StationIdIndex::const_iterator StationIterator;
174 const StationIterator sIt = idIndex.find(
id);
175 if (sIt == idIndex.end())
176 return VManager::eNotFound;
177 returnData = sIt->fInGrid;
180 return VManager::eNotFound;
182 return VManager::eFound;
189 if (HasStationData(station.
fId))
197 fStations.insert(station);
208 return idIndex.find(
id) != idIndex.end();
218 for (StationIdIndex::const_iterator sIt = idIndex.begin();
219 sIt != idIndex.end(); ++sIt)
220 returnList.push_back(sIt->fId);
228 if (fStations.empty())
233 const TimeStamp& dTime = Detector::GetInstance().GetTime();
235 typedef GroupIdIndex::const_iterator GroupIterator;
239 int currentGroupId = 0;
240 vector<int> currentGroup;
242 for (GroupIterator it = grIndex.begin(); it != grIndex.end(); ++it) {
244 const int stationGroupId = it->fGroupId;
247 if (!stationGroupId || it->fCommissionTimeRange != dTime)
251 if (stationGroupId != currentGroupId) {
252 if (!(currentGroup.size() > 1)) {
253 returnData.push_back(currentGroup);
254 currentGroup.clear();
256 currentGroupId = stationGroupId;
259 currentGroup.push_back(it->fId);
263 if (!(currentGroup.size() > 1))
264 returnData.push_back(currentGroup);
275 return VManager::eFound;
277 const TimeStamp& dTime = Detector::GetInstance().GetTime();
279 typedef GroupIdIndex::const_iterator GroupIterator;
282 for (sIt = grIndex.begin(); sIt != grIndex.end(); ++sIt)
283 if (sIt->fCommissionTimeRange == dTime)
286 if (sIt != grIndex.end())
287 returnData.push_back(sIt->fGroupId);
289 for (++sIt; sIt != grIndex.end(); ++sIt)
290 if (sIt->fCommissionTimeRange == dTime &&
291 returnData.back() != sIt->fGroupId)
292 returnData.push_back(sIt->fGroupId);
294 return VManager::eFound;
302 const TimeStamp& dTime = Detector::GetInstance().GetTime();
304 typedef GroupIdIndex::const_iterator GroupIterator;
305 typedef pair<GroupIterator, GroupIterator> GroupRange;
307 const GroupRange group =
308 fStations.get<
ByGroupId>().equal_range(groupId);
310 for (GroupIterator it = group.first; it != group.second; ++it)
311 if (it->fCommissionTimeRange == dTime)
312 returnData.push_back(it->fId);
314 return VManager::eFound;
323 typedef StationIdIndex::const_iterator StationIterator;
324 const StationIterator sIt = idIndex.find(
id);
325 if (sIt == idIndex.end())
326 return VManager::eNotFound;
330 const TimeStamp& dTime = Detector::GetInstance().GetTime();
333 return VManager::eFound;
335 typedef GroupIdIndex::const_iterator GroupIterator;
336 typedef pair<GroupIterator, GroupIterator> GroupRange;
338 const GroupRange group =
339 fStations.get<
ByGroupId>().equal_range(sIt->fGroupId);
341 for (GroupIterator it = group.first; it != group.second; ++it)
342 if (it->fCommissionTimeRange == dTime && it->fId !=
id)
343 returnData.push_back(it->fId);
345 return VManager::eFound;
358 typedef StationIdIndex::const_iterator StationIterator;
359 const StationIterator sIt = idIndex.find(
id);
360 if (sIt == idIndex.end())
361 return VManager::eNotFound;
365 if (
size_t(index) >= sIt->fInGrid.size() || !sIt->fInGrid[index])
366 return VManager::eFound;
370 return VManager::eFound;
373 double level = nCrown;
416 const double axis1 = sIt->fAxis1;
417 const double axis2 = sIt->fAxis2;
422 using boost::make_tuple;
425 typedef AxesIndex::const_iterator AxesIterator;
426 const AxesIterator start =
427 axesIndex.lower_bound(make_tuple(axis1 - level, axis2 - level));
428 const AxesIterator stop =
429 axesIndex.upper_bound(make_tuple(axis1 + level, axis2 + level));
431 const TimeStamp& detTime = det::Detector::GetInstance().GetTime();
433 for (AxesIterator it = start; it != stop; ++it) {
435 if (
size_t(index) >= it->fInGrid.size() || !it->fInGrid[index])
438 const double a = it->fAxis1 - axis1;
439 const double b = it->fAxis2 - axis2;
441 if (fabs(a) != level && fabs(b) != level)
443 }
else if (fabs(a - b) != level)
447 if (it->fCommissionTimeRange != detTime)
450 crown.push_back(it->fId);
454 return VManager::eFound;
463 for (string::const_iterator it = str.begin(); it != str.end(); ++it)
481 if (fStations.empty())
484 boost::format stationFmt(
485 "%1%<station id=\"%2%\">\n"
486 "%1% <northing unit=\"meter\"> %|3$.2f| </northing>\n"
487 "%1% <easting unit=\"meter\"> %|4$.2f| </easting>\n"
488 "%1% <altitude unit=\"meter\"> %|5$.2f| </altitude>\n"
489 "%1% <name> %6% </name>\n"
490 "%1% <commission> %7% </commission>\n"
491 "%1% <decommission> %8% </decommission>\n"
492 "%1% <inGrid> %9% </inGrid>\n"
493 "%1% <groupId> %10% </groupId>\n"
494 "%1% <axes> %11% %12% </axes>\n"
495 "%1% <ellipsoid> %13% </ellipsoid>\n"
496 "%1% <zone> %14% </zone>\n"
497 "%1% <band> %15% </band>\n"
502 for (StationIdIndex::const_iterator sIt = sIndex.begin();
503 sIt != sIndex.end(); ++sIt)
505 ostringstream inGrid;
506 if (sIt->fInGrid.size()==0)
509 for (
size_t i = 1; i < sIt->fInGrid.size(); ++i)
521 % sIt->fCommissionTime
522 % sIt->fDecommissionTime
std::string fCommissionTime
index< StationContainer, ByGroupId >::type GroupIdIndex
bool DumpXML(std::ostream &output, const std::string &indent="") const
det::VManager::Status GetGroupIds(std::vector< int > &returnData) const
Time interval defined by two TimeStamps.
bool ConditionalAddStationData(StationData &station)
adds station record only if it does not already exist
int crown(double x1, double x2, double y1, double y2)
bool HasStationData(const int id) const
A TimeStamp holds GPS second and nanosecond for some event.
det::VManager::Status GetData(T &returnData, const std::string &componentProperty, const det::VManager::IndexMap &componentIndex) const
utl::TimeRange fCommissionTimeRange
void GetFullStationGroups(std::vector< std::vector< int > > &returnList) const
det::VManager::Status GetStationGroup(std::vector< int > &returnData, const int id) const
std::string fDecommissionTime
det::VManager::Status GetStationCrown(std::vector< int > &crown, const int id, const int nCrown, CDetectorConstants::GridIndex index=CDetectorConstants::eStandard) const
Get crown accoding to detector time and station commission time range.
index< StationContainer, ByAxes >::type AxesIndex
std::map< std::string, std::string > IndexMap
string StringToXMLString(const string &str)
void GetFullStationList(std::vector< int > &returnList) const
det::VManager::Status GetGroup(std::vector< int > &returnData, const int groupId) const
index< StationContainer, ByStationId >::type StationIdIndex
Status
Specifies success or (eventually) various possible failure modes.