#include "SSEventSet.hpp" #include #include namespace StrideSearch { template EventSet::EventSet(const std::vector>& events_) { for (Index i=0; i void EventSet::extend(const EventSet& other) { for (Index i=0; i Real EventSet::minSeparationDistance() const { Real result = 2*PI*EARTH_RADIUS_KM; for (Index i=0; ilat, events[i]->lon, events[j]->lat, events[j]->lon); if (dist < result) result = dist; } } return result; } template Real EventSet::maxSeparationDistance() const { Real result = 0; for (Index i=0; ilat,events[i]->lon, events[j]->lat, events[j]->lon); if (dist > result) result = dist; } } return result; } template void EventSet::removeDuplicates(const Real dist_tol) { std::vector duplicates(events.size(), false); Index dup_ct = 0; /// Step 1: Mark and count duplicates for (Index i=0; iisDuplicate(*events[j])) { duplicates[j] = true; dup_ct += 1; } } } } } /// Step 2: Mark and count redundant events for (Index i=0; iisRedundant(*events[j], dist_tol)) { dup_ct += 1; if ( events[i]->lowerIntensity(*events[j])) { duplicates[i] = true; } else { duplicates[j] = true; } } } } } if (dup_ct > 0) { /// Step 3: remove duplicate and redundant events std::vector>> new_events; new_events.reserve(events.size()-dup_ct); for (Index i=0; i std::string EventSet::infoString(const int tab_lev, const bool printAll) const { std::string tabstr(""); for (int i=0; i std::map>>> EventSet::separateByDateTime() const{ std::map>>> result; for (Index i=0; idatetime].push_back(events[i]); } return result; } template void EventSet::consolidateRelated(const Real dist_tol) { std::vector already_used(events.size(), false); /// Step 1: process flat list for related events, nest related with first found for (Index i=0; i descs; descs.insert(events[i]->desc); for (Index j=i+1; jisNear(*events[j], dist_tol) && events[i]->datetime == events[j]->datetime) { /* Events i and j have the same datetime and are close enough to be related */ if (descs.count(events[j]->desc) == 0) { /* Event i is not related to an event of type j yet */ events[i]->addRelated(events[j]); descs.insert(events[j]->desc); } else { /* Event i is related to an event of type j already; pick the most intense one, discard the other */ if (events[i]->desc == events[j]->desc) { if (events[i]->lowerIntensity(*events[j])) { events[i]->lat = events[j]->lat; events[i]->lon = events[j]->lon; events[i]->value = events[j]->value; events[i]->loc_ind = events[j]->loc_ind; events[i]->loc_ind_3d = events[j]->loc_ind_3d; } } else { for (Index k=0; krelatedEvents.size(); ++k) { if(events[i]->relatedEvents[k]->desc == events[j]->desc) { if (events[i]->relatedEvents[k]->lowerIntensity(*events[j])) { events[i]->relatedEvents[k]->lat = events[j]->lat; events[i]->relatedEvents[k]->lon = events[j]->lon; events[i]->relatedEvents[k]->value = events[j]->value; events[i]->relatedEvents[k]->loc_ind = events[j]->loc_ind; events[i]->relatedEvents[k]->loc_ind_3d = events[j]->loc_ind_3d; } } } } } already_used[j] = true; } } } } } /// Step 2: replace flat list with nested list std::vector>> new_events; for (Index i=0; i // void EventSet::writeData(std::ostream& os) { // const char sep = ';'; // } template void EventSet::requireCollocation(const std::shared_ptr crit1, const std::shared_ptr crit2, const Real dist_tol) { std::vector is_collocated(events.size(), false); /// Step 1: mark collocated events for (Index i=0; iisCollocated(crit1.get(), crit2.get(), dist_tol); } /// Step 2: remove unmarked events std::vector>> new_events; for (Index i=0; i; template class EventSet; }