MeteoIODoc 20250312.660e6d76
DataEditingAlgorithms.h
Go to the documentation of this file.
1// SPDX-License-Identifier: LGPL-3.0-or-later
2/***********************************************************************************/
3/* Copyright 2020 WSL Institute for Snow and Avalanche Research SLF-DAVOS */
4/***********************************************************************************/
5/* This file is part of MeteoIO.
6 MeteoIO is free software: you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 MeteoIO is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License
17 along with MeteoIO. If not, see <http://www.gnu.org/licenses/>.
18*/
19#ifndef DATAEDITINGALGS_H
20#define DATAEDITINGALGS_H
21
22#include <meteoio/IOInterface.h>
24
25#include <map>
26#include <set>
27#include <string>
28
29namespace mio {
30
36 public:
37 EditingBlock(const std::string& i_stationID, const std::vector< std::pair<std::string, std::string> >& vecArgs, const std::string& name, const Config &cfg);
38
39 virtual ~EditingBlock() {}
40
47 virtual void editTimeSeries(std::vector<METEO_SET>& vecMeteo) {(void)vecMeteo;}
48
55 virtual void editTimeSeries(STATIONS_SET& vecStation) {(void)vecStation;}
56
61 virtual std::set<std::string> requiredIDs() const {return std::set<std::string>();}
62
67 virtual std::set<std::string> providedIDs() const {return std::set<std::string>();}
68
73 virtual std::set<std::string> purgeIDs() const {return requiredIDs();}
74
75 const std::string toString() const;
76
77 protected:
78 std::string getName() const {return block_name;}
79 static std::set<std::string> initStationSet(const std::vector< std::pair<std::string, std::string> >& vecArgs, const std::string& keyword);
80 bool skipStation(const std::vector<MeteoData>& vecMeteo) const;
81 METEO_SET timeFilterFromStation(const METEO_SET& vecMeteo) const; //merge and automerge need this method
82
83 const std::set<std::string> excluded_stations, kept_stations;
84 const std::vector<DateRange> time_restrictions;
85 const std::string stationID, block_name;
86};
87
103class EditingSwap : public EditingBlock {
104 public:
105 EditingSwap(const std::string& i_stationID, const std::vector< std::pair<std::string, std::string> >& vecArgs, const std::string& name, const Config &cfg);
106
107 virtual void editTimeSeries(std::vector<METEO_SET>& vecMeteo) override;
108
109 private:
110 void parse_args(const std::vector< std::pair<std::string, std::string> >& vecArgs);
111 std::string dest_param, src_param;
112};
113
114
140 public:
141 EditingRename(const std::string& i_stationID, const std::vector< std::pair<std::string, std::string> >& vecArgs, const std::string& name, const Config &cfg);
142
143 virtual void editTimeSeries(std::vector<METEO_SET>& vecMeteo) override;
144
145 private:
146 void parse_args(const std::vector< std::pair<std::string, std::string> >& vecArgs);
147 std::set< std::string > src_params;
148 std::string dest_param;
149};
150
171 public:
172 EditingExclude(const std::string& i_stationID, const std::vector< std::pair<std::string, std::string> >& vecArgs, const std::string& name, const Config &cfg);
173
174 virtual void editTimeSeries(std::vector<METEO_SET>& vecMeteo) override;
175
176 private:
177 void parse_args(const std::vector< std::pair<std::string, std::string> >& vecArgs);
178 void processStation(METEO_SET& vecMeteo, const size_t& startIdx, const size_t& endIdx, const std::set< std::string >& params) const;
179 std::set< std::string > exclude_params;
180 bool wildcard;
181};
182
201class EditingKeep : public EditingBlock {
202 public:
203 EditingKeep(const std::string& i_stationID, const std::vector< std::pair<std::string, std::string> >& vecArgs, const std::string& name, const Config &cfg);
204
205 virtual void editTimeSeries(std::vector<METEO_SET>& vecMeteo) override;
206 static void processStation(METEO_SET& vecMeteo, const size_t& startIdx, const size_t& endIdx, const std::set< std::string >& params); //for use in DataEditingAlgorithms
207
208 private:
209 void parse_args(const std::vector< std::pair<std::string, std::string> >& vecArgs);
210 std::set< std::string > keep_params;
211};
212
257 public:
262 MAX
263 };
264 public:
265 EditingCombine(const std::string& i_stationID, const std::vector< std::pair<std::string, std::string> >& vecArgs, const std::string& name, const Config &cfg);
266
267 virtual void editTimeSeries(std::vector<METEO_SET>& vecMeteo) override;
268 private:
269 void parse_args(const std::vector< std::pair<std::string, std::string> >& vecArgs);
270 void processFIRST(METEO_SET& vecMeteo, const size_t& startIdx, const size_t& endIdx) const;
271 void processMIN(METEO_SET& vecMeteo, const size_t& startIdx, const size_t& endIdx) const;
272 void processAVG(METEO_SET& vecMeteo, const size_t& startIdx, const size_t& endIdx) const;
273 void processMAX(METEO_SET& vecMeteo, const size_t& startIdx, const size_t& endIdx) const;
274 std::vector< std::string > merged_params; //as vector since order is important
275 std::string dest_param;
276 CombineType type;
277 bool replace;
278};
279
330 public:
331 EditingMerge(const std::string& i_stationID, const std::vector< std::pair<std::string, std::string> >& vecArgs, const std::string& name, const Config &cfg);
332
333 virtual void editTimeSeries(std::vector<METEO_SET>& vecMeteo) override;
334 virtual void editTimeSeries(STATIONS_SET& vecStation) override;
335
336 std::set<std::string> requiredIDs() const override;
337 private:
338 void parse_args(const std::vector< std::pair<std::string, std::string> >& vecArgs);
339 std::vector< std::string > merged_stations;
340 std::set< std::string > merged_params;
341 MeteoData::Merge_Type merge_strategy;
342 MeteoData::MERGE_CONFLICTS merge_conflicts;
343};
344
363 public:
364 EditingAutoMerge(const std::string& i_stationID, const std::vector< std::pair<std::string, std::string> >& vecArgs, const std::string& name, const Config &cfg);
365
366 virtual void editTimeSeries(std::vector<METEO_SET>& vecMeteo) override;
367 virtual void editTimeSeries(STATIONS_SET& vecStation) override;
368
369 private:
370 void parse_args(const std::vector< std::pair<std::string, std::string> >& vecArgs);
371 static void mergeStations(const size_t& toStationIdx, STATIONS_SET& vecStation);
372 void mergeMeteo(const size_t& toStationIdx, std::vector<METEO_SET>& vecMeteo) const;
373 MeteoData::Merge_Type merge_strategy;
374 MeteoData::MERGE_CONFLICTS merge_conflicts;
375};
376
395class EditingCopy : public EditingBlock {
396 public:
397 EditingCopy(const std::string& i_stationID, const std::vector< std::pair<std::string, std::string> >& vecArgs, const std::string& name, const Config &cfg);
398
399 virtual void editTimeSeries(std::vector<METEO_SET>& vecMeteo) override;
400
401 private:
402 void parse_args(const std::vector< std::pair<std::string, std::string> >& vecArgs);
403 std::string dest_param, src_param;
404};
405
437 public:
438 EditingCreate(const std::string& i_stationID, const std::vector< std::pair<std::string, std::string> >& vecArgs, const std::string& name, const Config &cfg);
439
440 virtual void editTimeSeries(std::vector<METEO_SET>& vecMeteo) override;
441
442 private:
443 static const std::vector< std::pair<std::string, std::string> > cleanGeneratorArgs(const std::vector< std::pair<std::string, std::string> >& vecArgs);
444 void parse_args(const std::vector< std::pair<std::string, std::string> >& vecArgs);
445
446 const Config &cfg_copy;
447 const std::vector< std::pair<std::string, std::string> > vecArgs_copy;
448 std::string algorithm, dest_param;
449};
450
490 public:
491 EditingMetadata(const std::string& i_stationID, const std::vector< std::pair<std::string, std::string> >& vecArgs, const std::string& name, const Config &cfg);
492
493 virtual void editTimeSeries(std::vector<METEO_SET>& vecMeteo) override;
494 virtual void editTimeSeries(STATIONS_SET& vecStation) override;
495
496 std::set<std::string> providedIDs() const override;
497
498 private:
499 void parse_args(const std::vector< std::pair<std::string, std::string> >& vecArgs);
500 void mergeMigratedData(std::vector<METEO_SET>& vecMeteo, const std::vector<METEO_SET>& vecTmp) const;
501
502 std::string new_name, new_id;
503 double lat, lon, alt, slope, azi;
504 bool edit_in_place;
505};
506
544 public:
548 CUBIC
549 };
550
551 public:
552 EditingRegFill(const std::string& i_stationID, const std::vector< std::pair<std::string, std::string> >& vecArgs, const std::string& name, const Config &cfg);
553
554 virtual void editTimeSeries(std::vector<METEO_SET>& vecMeteo) override;
555
556 private:
557 void parse_args(const std::vector< std::pair<std::string, std::string> >& vecArgs);
558 void fillTimeseries(METEO_SET& vecMeteo1, const METEO_SET& vecMeteo2);
559 std::vector< std::string > source_stations;
560 std::set< std::string > params_to_merge;
561 RegressionType regtype;
562 bool print_regression_info;
563};
564
593class EditingMove : public EditingBlock {
594 public:
595
596 public:
597 EditingMove(const std::string& i_stationID, const std::vector< std::pair<std::string, std::string> >& vecArgs, const std::string& name, const Config &cfg);
598
599 virtual void editTimeSeries(std::vector<METEO_SET>& vecMeteo) override;
600
601 private:
602 void parse_args(const std::vector< std::pair<std::string, std::string> >& vecArgs);
603 std::set<std::string> dest_stations;
604 std::set< std::string > params_to_move;
605
606 std::vector<MeteoData> createFullTimeSeries(const std::vector<MeteoData>& source, const std::vector<MeteoData>& dest) const;
607 bool isDestination(const std::string& stationID) const;
608
609 bool param_wildcard;
610 bool station_wildcard;
611 bool station_glob;
612};
613
643 public:
644
645 public:
646 EditingSplit(const std::string& i_stationID, const std::vector< std::pair<std::string, std::string> >& vecArgs, const std::string& name, const Config &cfg);
647
648 virtual void editTimeSeries(std::vector<METEO_SET>& vecMeteo) override;
649
650 private:
651 void parse_args(const std::vector< std::pair<std::string, std::string> >& vecArgs);
652 std::string dest_station_id;
653 std::set< std::string > params_to_move;
654
655 std::vector<MeteoData> splitTimeSeries(std::vector<MeteoData>& source);
656};
657
659 public:
660 static EditingBlock* getBlock(const std::string& i_stationID, const std::vector< std::pair<std::string, std::string> >& vecArgs, const std::string& name, const Config &cfg);
661};
662
663} //namespace
664
665#endif
A class that reads a key/value file. These files (typically named *.ini) follow the INI file format s...
Definition: Config.h:77
AUTOMERGE input editing command.
Definition: DataEditingAlgorithms.h:362
virtual void editTimeSeries(std::vector< METEO_SET > &vecMeteo) override
Apply this editing block.
Definition: DataEditingAlgorithms.cc:488
EditingAutoMerge(const std::string &i_stationID, const std::vector< std::pair< std::string, std::string > > &vecArgs, const std::string &name, const Config &cfg)
Definition: DataEditingAlgorithms.cc:409
Definition: DataEditingAlgorithms.h:658
static EditingBlock * getBlock(const std::string &i_stationID, const std::vector< std::pair< std::string, std::string > > &vecArgs, const std::string &name, const Config &cfg)
Definition: DataEditingAlgorithms.cc:136
Base class for DataEditing algorithms.
Definition: DataEditingAlgorithms.h:35
virtual void editTimeSeries(std::vector< METEO_SET > &vecMeteo)
Apply this editing block.
Definition: DataEditingAlgorithms.h:47
std::string getName() const
Definition: DataEditingAlgorithms.h:78
virtual ~EditingBlock()
Definition: DataEditingAlgorithms.h:39
const std::vector< DateRange > time_restrictions
Definition: DataEditingAlgorithms.h:84
virtual std::set< std::string > requiredIDs() const
Get the station IDs this editing block depends on for this station.
Definition: DataEditingAlgorithms.h:61
const std::set< std::string > kept_stations
Definition: DataEditingAlgorithms.h:83
const std::string toString() const
Definition: DataEditingAlgorithms.cc:129
METEO_SET timeFilterFromStation(const METEO_SET &vecMeteo) const
Prepare a station that will be merged in case of time restrictions.
Definition: DataEditingAlgorithms.cc:179
const std::string stationID
Definition: DataEditingAlgorithms.h:85
bool skipStation(const std::vector< MeteoData > &vecMeteo) const
Return true if this station ID should be skipped.
Definition: DataEditingAlgorithms.cc:117
const std::string block_name
Definition: DataEditingAlgorithms.h:85
virtual void editTimeSeries(STATIONS_SET &vecStation)
Apply this editing block to the StationData.
Definition: DataEditingAlgorithms.h:55
static std::set< std::string > initStationSet(const std::vector< std::pair< std::string, std::string > > &vecArgs, const std::string &keyword)
Definition: DataEditingAlgorithms.cc:92
EditingBlock(const std::string &i_stationID, const std::vector< std::pair< std::string, std::string > > &vecArgs, const std::string &name, const Config &cfg)
Definition: DataEditingAlgorithms.cc:89
const std::set< std::string > excluded_stations
Definition: DataEditingAlgorithms.h:83
virtual std::set< std::string > purgeIDs() const
Get the station IDs to purge after using them for this station ID.
Definition: DataEditingAlgorithms.h:73
virtual std::set< std::string > providedIDs() const
Get the station IDs this editing block provides based on this station.
Definition: DataEditingAlgorithms.h:67
COMBINE input editing command.
Definition: DataEditingAlgorithms.h:256
CombineType
Definition: DataEditingAlgorithms.h:258
@ AVG
take the average of all valid data
Definition: DataEditingAlgorithms.h:261
@ FIRST
take the first valid data
Definition: DataEditingAlgorithms.h:259
@ MAX
take the MAX of all valid data
Definition: DataEditingAlgorithms.h:262
@ MIN
take the MIN of all valid data
Definition: DataEditingAlgorithms.h:260
EditingCombine(const std::string &i_stationID, const std::vector< std::pair< std::string, std::string > > &vecArgs, const std::string &name, const Config &cfg)
Definition: DataEditingAlgorithms.cc:514
virtual void editTimeSeries(std::vector< METEO_SET > &vecMeteo) override
Apply this editing block.
Definition: DataEditingAlgorithms.cc:658
COPY input editing command.
Definition: DataEditingAlgorithms.h:395
virtual void editTimeSeries(std::vector< METEO_SET > &vecMeteo) override
Apply this editing block.
Definition: DataEditingAlgorithms.cc:816
EditingCopy(const std::string &i_stationID, const std::vector< std::pair< std::string, std::string > > &vecArgs, const std::string &name, const Config &cfg)
Definition: DataEditingAlgorithms.cc:789
CREATE input editing command.
Definition: DataEditingAlgorithms.h:436
virtual void editTimeSeries(std::vector< METEO_SET > &vecMeteo) override
Apply this editing block.
Definition: DataEditingAlgorithms.cc:873
EditingCreate(const std::string &i_stationID, const std::vector< std::pair< std::string, std::string > > &vecArgs, const std::string &name, const Config &cfg)
Definition: DataEditingAlgorithms.cc:835
EXCLUDE input editing command.
Definition: DataEditingAlgorithms.h:170
EditingExclude(const std::string &i_stationID, const std::vector< std::pair< std::string, std::string > > &vecArgs, const std::string &name, const Config &cfg)
Definition: DataEditingAlgorithms.cc:300
virtual void editTimeSeries(std::vector< METEO_SET > &vecMeteo) override
Apply this editing block.
Definition: DataEditingAlgorithms.cc:339
KEEP input editing command.
Definition: DataEditingAlgorithms.h:201
virtual void editTimeSeries(std::vector< METEO_SET > &vecMeteo) override
Apply this editing block.
Definition: DataEditingAlgorithms.cc:395
EditingKeep(const std::string &i_stationID, const std::vector< std::pair< std::string, std::string > > &vecArgs, const std::string &name, const Config &cfg)
Definition: DataEditingAlgorithms.cc:356
static void processStation(METEO_SET &vecMeteo, const size_t &startIdx, const size_t &endIdx, const std::set< std::string > &params)
Definition: DataEditingAlgorithms.cc:377
MERGE input editing command.
Definition: DataEditingAlgorithms.h:329
virtual void editTimeSeries(std::vector< METEO_SET > &vecMeteo) override
Apply this editing block.
Definition: DataEditingAlgorithms.cc:740
EditingMerge(const std::string &i_stationID, const std::vector< std::pair< std::string, std::string > > &vecArgs, const std::string &name, const Config &cfg)
Definition: DataEditingAlgorithms.cc:680
std::set< std::string > requiredIDs() const override
Get the station IDs this editing block depends on for this station.
Definition: DataEditingAlgorithms.cc:781
METADATA input editing command.
Definition: DataEditingAlgorithms.h:489
virtual void editTimeSeries(std::vector< METEO_SET > &vecMeteo) override
Apply this editing block.
Definition: DataEditingAlgorithms.cc:978
EditingMetadata(const std::string &i_stationID, const std::vector< std::pair< std::string, std::string > > &vecArgs, const std::string &name, const Config &cfg)
Definition: DataEditingAlgorithms.cc:893
std::set< std::string > providedIDs() const override
Get the station IDs this editing block provides based on this station.
Definition: DataEditingAlgorithms.cc:930
MOVE input editing command.
Definition: DataEditingAlgorithms.h:593
EditingMove(const std::string &i_stationID, const std::vector< std::pair< std::string, std::string > > &vecArgs, const std::string &name, const Config &cfg)
Definition: DataEditingAlgorithms.cc:1316
virtual void editTimeSeries(std::vector< METEO_SET > &vecMeteo) override
Apply this editing block.
Definition: DataEditingAlgorithms.cc:1355
RegFill input editing command.
Definition: DataEditingAlgorithms.h:543
EditingRegFill(const std::string &i_stationID, const std::vector< std::pair< std::string, std::string > > &vecArgs, const std::string &name, const Config &cfg)
Definition: DataEditingAlgorithms.cc:1051
RegressionType
Definition: DataEditingAlgorithms.h:545
@ QUADRATIC
Definition: DataEditingAlgorithms.h:547
@ CUBIC
Definition: DataEditingAlgorithms.h:548
@ LINEAR
Definition: DataEditingAlgorithms.h:546
virtual void editTimeSeries(std::vector< METEO_SET > &vecMeteo) override
Apply this editing block.
Definition: DataEditingAlgorithms.cc:1092
RENAME input editing command.
Definition: DataEditingAlgorithms.h:139
EditingRename(const std::string &i_stationID, const std::vector< std::pair< std::string, std::string > > &vecArgs, const std::string &name, const Config &cfg)
Definition: DataEditingAlgorithms.cc:246
virtual void editTimeSeries(std::vector< METEO_SET > &vecMeteo) override
Apply this editing block.
Definition: DataEditingAlgorithms.cc:274
Split input editing command.
Definition: DataEditingAlgorithms.h:642
virtual void editTimeSeries(std::vector< METEO_SET > &vecMeteo) override
Apply this editing block.
Definition: DataEditingAlgorithms.cc:1497
EditingSplit(const std::string &i_stationID, const std::vector< std::pair< std::string, std::string > > &vecArgs, const std::string &name, const Config &cfg)
Definition: DataEditingAlgorithms.cc:1460
SWAP input editing command.
Definition: DataEditingAlgorithms.h:103
virtual void editTimeSeries(std::vector< METEO_SET > &vecMeteo) override
Apply this editing block.
Definition: DataEditingAlgorithms.cc:223
EditingSwap(const std::string &i_stationID, const std::vector< std::pair< std::string, std::string > > &vecArgs, const std::string &name, const Config &cfg)
Definition: DataEditingAlgorithms.cc:196
Merge_Type
Available MeteoData merging strategies. When the two stations both have data at a given time step,...
Definition: MeteoData.h:126
Definition: Config.cc:31
std::vector< MeteoData > METEO_SET
Definition: MeteoData.h:32
std::vector< StationData > STATIONS_SET
Definition: StationData.h:145