1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package fr.inrae.agroclim.indicators.model.data.climate;
18
19 import java.util.ArrayList;
20 import java.util.Arrays;
21 import java.util.List;
22 import java.util.StringJoiner;
23
24 import fr.inrae.agroclim.indicators.model.TimeScale;
25 import fr.inrae.agroclim.indicators.model.data.DailyData;
26 import fr.inrae.agroclim.indicators.model.data.Variable;
27 import fr.inrae.agroclim.indicators.model.data.Variable.Type;
28 import fr.inrae.agroclim.indicators.resources.Messages;
29 import lombok.Getter;
30 import lombok.NonNull;
31 import lombok.Setter;
32
33
34
35
36
37
38 public final class ClimaticDailyData extends DailyData {
39
40
41
42
43 private static final long serialVersionUID = 4872847709393688042L;
44
45
46
47
48
49 public static List<String> getAllColumnNames(@NonNull final TimeScale timescale) {
50 switch (timescale) {
51 case DAILY:
52 return Arrays.asList("year", "month", "day", "tmin", "tmax", "tmean", "radiation", "rain", "wind", "etp",
53 "rh", "soilwatercontent");
54 case HOURLY:
55 return Arrays.asList("year", "month", "day", "hour", "th", "radiation", "rain", "wind", "etp", "rh");
56 default:
57 throw new UnsupportedOperationException("Not implemented: " + timescale);
58 }
59 }
60
61
62
63
64
65 public static List<String> getOptionalColumnNames(final TimeScale timescale) {
66 switch (timescale) {
67 case DAILY:
68 return Arrays.asList("rh", "soilwatercontent");
69 case HOURLY:
70 return Arrays.asList("rh");
71 default:
72 throw new UnsupportedOperationException("Not implemented: " + timescale);
73 }
74 }
75
76
77
78
79
80 public static List<String> getRequiredColumnNames(final TimeScale timescale) {
81 switch (timescale) {
82 case DAILY:
83 return Arrays.asList("year", "month", "day");
84 case HOURLY:
85 return Arrays.asList("year", "month", "hour");
86 default:
87 throw new UnsupportedOperationException("Not implemented: " + timescale);
88 }
89 }
90
91
92
93
94 private final List<String> errors = new ArrayList<>();
95
96
97
98
99 @Getter
100 @Setter
101 private EtpCalculator etpCalcultator;
102
103
104
105
106 @Setter
107 private TimeScale timescale;
108
109
110
111
112 private final List<String> warnings = new ArrayList<>();
113
114
115
116
117 public ClimaticDailyData() {
118
119 }
120
121
122
123
124
125
126 public ClimaticDailyData(final ClimaticDailyData data) {
127 super(data);
128 this.timescale = data.timescale;
129 this.etpCalcultator = data.etpCalcultator;
130 }
131
132 @Override
133 public void check(final int line, final String path) {
134 if (getTmin() != null && getTmax() != null && getTmin() > getTmax()) {
135 warnings.add(Messages.format("warning.tmax.inferiorto.tmin", path, line));
136 }
137 final double rhMin = 0;
138 final double rhMax = 100;
139 if (getRh() != null && (getRh() < rhMin || getRh() > rhMax)) {
140 warnings.add(Messages.format("error.rh.outofrange", path, line));
141 }
142 if (timescale == TimeScale.DAILY && getRawValue(Variable.ETP) == null) {
143 boolean missing = false;
144 for (final Variable variable : etpCalcultator.getVariables()) {
145 if (getRawValue(variable) == null) {
146 missing = true;
147 }
148 }
149 if (missing) {
150 warnings.add(Messages.format("warning.missing", path, line, "ETP"));
151 }
152 }
153 for (final Variable variable : Variable.getByTimeScaleAndType(timescale, Type.CLIMATIC)) {
154 if (variable != Variable.ETP && getValue(variable) == null) {
155 warnings.add(Messages.format("warning.missing", path, line, variable.getName()));
156 }
157 }
158 if (getMonth() == null || getMonth() != null && getMonth() == 0) {
159 errors.add(Messages.format("error.month.null", path, line));
160 }
161 if (getDay() == null || getDay() != null && getDay() == 0) {
162 errors.add(Messages.format("error.day.null", path, line));
163 }
164 }
165
166 @Override
167 public ClimaticDailyData clone() throws CloneNotSupportedException {
168 final ClimaticDailyData clone = (ClimaticDailyData) super.clone();
169 if (etpCalcultator != null) {
170 clone.etpCalcultator = etpCalcultator.clone();
171 }
172 clone.errors.addAll(errors);
173 clone.warnings.addAll(warnings);
174 return clone;
175 }
176
177 @Override
178 public List<String> getErrors() {
179 return errors;
180 }
181
182
183
184
185 public Double getEtp() {
186 Double etp = getRawValue(Variable.ETP);
187 if (etp == null && etpCalcultator != null) {
188 try {
189 etp = etpCalcultator.compute(this);
190 setEtp(etp);
191 } catch (IllegalArgumentException e) {
192 etp = null;
193 }
194 }
195 return etp;
196 }
197
198
199
200
201 public Double getRadiation() {
202 return getRawValue(Variable.RADIATION);
203 }
204
205
206
207
208 public Double getRain() {
209 return getRawValue(Variable.RAIN);
210 }
211
212
213
214
215 public Double getRh() {
216 return getRawValue(Variable.RH);
217 }
218
219
220
221
222 public Double getSoilwatercontent() {
223 return getRawValue(Variable.SOILWATERCONTENT);
224 }
225
226
227
228
229 public Double getTh() {
230 return getRawValue(Variable.TH);
231 }
232
233
234
235
236 public Double getTmax() {
237 return getRawValue(Variable.TMAX);
238 }
239
240
241
242
243 public Double getTmean() {
244 return getRawValue(Variable.TMEAN);
245 }
246
247
248
249
250 public Double getTmin() {
251 return getRawValue(Variable.TMIN);
252 }
253
254 @Override
255 public Double getValue(final Variable variable) {
256 if (variable == Variable.ETP) {
257 return getEtp();
258 }
259 return super.getRawValue(variable);
260 }
261
262 @Override
263 public List<String> getWarnings() {
264 return warnings;
265 }
266
267
268
269
270 public Double getWind() {
271 return getValue(Variable.WIND);
272 }
273
274
275
276
277 public void setEtp(final Double value) {
278 setValue(Variable.ETP, value);
279 }
280
281
282
283
284 public void setRadiation(final Double value) {
285 setValue(Variable.RADIATION, value);
286 }
287
288
289
290
291 public void setRain(final Double value) {
292 setValue(Variable.RAIN, value);
293 }
294
295
296
297
298 public void setRh(final Double value) {
299 setValue(Variable.RH, value);
300 }
301
302
303
304
305 public void setSoilwatercontent(final Double value) {
306 setValue(Variable.SOILWATERCONTENT, value);
307 }
308
309
310
311
312 public void setTh(final Double value) {
313 setValue(Variable.TH, value);
314 }
315
316
317
318
319 public void setTmax(final Double value) {
320 setValue(Variable.TMAX, value);
321 }
322
323
324
325
326 public void setTmean(final Double value) {
327 setValue(Variable.TMEAN, value);
328 }
329
330
331
332
333 public void setTmin(final Double value) {
334 setValue(Variable.TMIN, value);
335 }
336
337
338
339
340 public void setWind(final Double value) {
341 setValue(Variable.WIND, value);
342 }
343
344 @Override
345 public String toString() {
346 final StringJoiner sj = new StringJoiner(", ");
347 for (final Variable variable : Variable.values()) {
348 sj.add(variable.name() + "=" + getRawValue(variable));
349 }
350 return "ClimaticDailyData [year=" + getYear() + ", month=" + getMonth()
351 + ", day=" + getDay() + ", hour=" + getHour() + ", " + sj.toString() + "]";
352 }
353 }