isce3 0.25.0
Loading...
Searching...
No Matches
RadarGridParameters.h
1//-*- C++ -*-
2//-*- coding: utf-8 -*-
3
4#pragma once
5
6#include <cmath>
7#include "forward.h"
8
9// isce3::core
10#include <isce3/core/Metadata.h>
11#include <isce3/core/DateTime.h>
12#include <isce3/core/LookSide.h>
13#include <isce3/core/TimeDelta.h>
14#include <isce3/except/Error.h>
15
17
18 public:
20 inline RadarGridParameters();
21
28 char frequency = 'A');
29
36 isce3::core::LookSide lookSide);
37
41
44 double wavelength,
45 double prf,
46 double startingRange,
47 double rangePixelSpacing,
48 isce3::core::LookSide lookSide,
49 size_t length,
50 size_t width,
52
54 inline RadarGridParameters(const RadarGridParameters & rgparam);
55
58 operator=(const RadarGridParameters& rgparam);
59
61 inline isce3::core::LookSide lookSide() const { return _lookSide; }
62
64 inline void lookSide(isce3::core::LookSide side) { _lookSide = side; }
65
67 inline void lookSide(const std::string &);
68
70 inline const isce3::core::DateTime & refEpoch() const { return _refEpoch; }
71
75 inline void refEpoch(const isce3::core::DateTime &epoch) { _refEpoch = epoch; }
76
78 inline double sensingStart() const { return _sensingStart; }
79
81 inline void sensingStart(const double & t){ _sensingStart = t; }
82
84 inline double wavelength() const { return _wavelength; }
85
87 inline void wavelength(const double & t) { _wavelength = t; }
88
90 inline double prf() const { return _prf; }
91
93 inline void prf(const double & t){ _prf = t; }
94
96 inline double azimuthTimeInterval() const { return 1.0/_prf; };
97
99 inline double startingRange() const { return _startingRange; }
100
102 inline void startingRange(const double & r){ _startingRange = r; }
103
105 inline double rangePixelSpacing() const { return _rangePixelSpacing; }
106
108 inline void rangePixelSpacing(const double & t) { _rangePixelSpacing = t; }
109
111 inline size_t length() const { return _rlength; }
112
114 inline void length(const size_t & t) { _rlength = t; }
115
117 inline size_t width() const { return _rwidth; }
118
120 inline void width(const size_t & t) { _rwidth = t; }
121
123 inline size_t size() const { return _rlength * _rwidth; }
124
126 inline double sensingStop() const { return sensingTime(_rlength - 1.0); }
127
129 inline double sensingMid() const {
130 return 0.5 * (sensingStart() + sensingStop());
131 }
132
134 inline double sensingTime(double line) const {
135 return _sensingStart + line / _prf;
136 }
137
138 inline double azimuthIndex(double az_time) const {
139 return (az_time - _sensingStart) * _prf;
140 }
141
143 inline isce3::core::DateTime sensingDateTime(double line) const {
144 return _refEpoch + sensingTime(line);
145 }
146
148 inline double endingRange() const {
149 return slantRange(_rwidth - 1.0);
150 }
151
153 inline double midRange() const {
154 return 0.5 * (startingRange() + endingRange());
155 }
156
158 inline double slantRange(double sample) const {
159 return _startingRange + sample * _rangePixelSpacing;
160 }
161
163 inline double slantRangeIndex(double slant_range) const {
164 return (slant_range - _startingRange) / _rangePixelSpacing;
165 }
166
168 inline RadarGridParameters offsetAndResize(double yoff, double xoff, size_t ysize, size_t xsize) const
169 {
170 return RadarGridParameters( sensingTime(yoff),
171 wavelength(),
172 prf(),
173 slantRange(xoff),
175 lookSide(),
176 ysize,
177 xsize,
178 refEpoch());
179 }
180
186 size_t xsize) const
187 {
188 //Check for number of samples requested along the azimuth and slant range
189 if ((ysize <= 1) || (xsize <= 1))
190 {
191 std::string errstr = "Number of samples must be greater than 1. " +
192 std::to_string(ysize) + " azimuth and " +
193 std::to_string(xsize) + " range samples requested.";
194 throw isce3::except::OutOfRange(ISCE_SRCINFO(), errstr);
195 }
196
197 // Compute the new PRF and range pixel spacing to ensure that
198 // both start and stop points are kept
199 double prf = this->prf();
200 double dr = rangePixelSpacing();
201
202 if (length() > 1) prf = (ysize - 1.0) / (length() - 1.0) * prf;
203 dr = (width() - 1.0) / (xsize - 1.0) * dr;
204
206 startingRange(), dr, lookSide(),
207 ysize, xsize, refEpoch());
208 }
209
217 inline RadarGridParameters addMargin(size_t ymargin,
218 size_t xmargin,
219 std::string side = "both") const
220 {
221 double t0, r0;
222 size_t ysize, xsize;
223
224 if (side == "start") {
225 ysize = length() + ymargin;
226 xsize = width() + xmargin;
227 t0 = sensingStart() - ymargin / prf();
228 r0 = startingRange() - xmargin * rangePixelSpacing();
229 } else if (side == "stop") {
230 ysize = length() + ymargin;
231 xsize = width() + xmargin;
232 t0 = sensingStart();
233 r0 = startingRange();
234 } else if (side == "both") {
235 t0 = sensingStart() - ymargin / prf();
236 r0 = startingRange() - xmargin * rangePixelSpacing();
237 ysize = length() + 2 * ymargin;
238 xsize = width() + 2 * xmargin;
239 } else {
240 std::string errstr = "No recognized side '" + side +
241 "', please choose the side from 'start', 'stop', and 'both'";
242 throw isce3::except::InvalidArgument(ISCE_SRCINFO(), errstr);
243 }
244
245 return RadarGridParameters(t0, wavelength(), prf(),
247 ysize, xsize, refEpoch());
248 }
249
251 inline RadarGridParameters multilook(size_t azlooks, size_t rglooks) const
252 {
253 //Check for number of points on edge
254 if ((azlooks == 0) || (rglooks == 0))
255 {
256 std::string errstr = "Number of looks must be positive. " +
257 std::to_string(azlooks) + "Az x" +
258 std::to_string(rglooks) + "Rg looks requested.";
259 throw isce3::except::OutOfRange(ISCE_SRCINFO(), errstr);
260 }
261
262 //Currently implements the multilooking operation used in ISCE2
263 return RadarGridParameters( sensingTime(0.5 * (azlooks-1)),
264 wavelength(),
265 prf() / (1.0 * azlooks),
266 slantRange(0.5 * (rglooks-1)),
267 rangePixelSpacing() * rglooks,
268 lookSide(),
269 length()/azlooks,
270 width()/rglooks,
271 refEpoch());
272 }
273
276 upsample(size_t az_upsampling_factor, size_t rg_upsampling_factor) const
277 {
278 // Check for number of points on edge
279 if ((az_upsampling_factor == 0) || (rg_upsampling_factor == 0)) {
280 std::string errstr = "Upsampling factor must be positive. " +
281 std::to_string(az_upsampling_factor ) + "Az x" +
282 std::to_string(rg_upsampling_factor ) +
283 "Rg upsampling requested.";
284 throw isce3::except::OutOfRange(ISCE_SRCINFO(), errstr);
285 }
286
287 // important: differently from multilook(), upsample does not
288 // update _sensingStart or _startingRange
289 return RadarGridParameters(
290 sensingTime(0.0), wavelength(),
291 prf() * az_upsampling_factor, slantRange(0.0),
292 rangePixelSpacing() / (1.0 * rg_upsampling_factor),
293 lookSide(), length() * az_upsampling_factor,
294 width() * rg_upsampling_factor, refEpoch());
295 }
296
297 /*
298 * Check if given az and slant range are within radargrid
299 */
300 bool contains(const double az_time, const double srange) const;
301
302 // Protected data members can be accessed by derived classes
303 protected:
305 isce3::core::LookSide _lookSide;
306
309
312
314 double _prf;
315
318
321
323 size_t _rlength;
324
326 size_t _rwidth;
327
330
332 inline void validate() const;
333};
334
339
340// Constructor from an isce3::core::Metadata object.
346 _lookSide(meta.lookSide),
347 _sensingStart((meta.sensingStart - refEpoch).getTotalSeconds()),
348 _wavelength(meta.radarWavelength),
349 _prf(meta.prf),
350 _startingRange(meta.rangeFirstSample),
351 _rangePixelSpacing(meta.slantRangePixelSpacing),
352 _rlength(meta.length),
353 _rwidth(meta.width),
355
356// Copy constructors
360 _lookSide(rgparams.lookSide()),
361 _sensingStart(rgparams.sensingStart()),
362 _wavelength(rgparams.wavelength()),
363 _prf(rgparams.prf()),
364 _startingRange(rgparams.startingRange()),
366 _rlength(rgparams.length()),
367 _rwidth(rgparams.width()),
368 _refEpoch(rgparams.refEpoch()) { validate(); }
369
370// Assignment operator
374operator=(const RadarGridParameters & rgparams) {
375 _sensingStart = rgparams.sensingStart();
376 _wavelength = rgparams.wavelength();
377 _prf = rgparams.prf();
378 _startingRange = rgparams.startingRange();
380 _lookSide = rgparams.lookSide(),
381 _rlength = rgparams.length();
382 _rwidth = rgparams.width();
383 _refEpoch = rgparams.refEpoch();
384 validate();
385 return *this;
386}
387
388// Constructor from individual components and values
408
409// Validation of radar grid parameters
410void
412validate() const
413{
414
415 std::string errstr = "";
416
417 if (wavelength() <= 0.)
418 {
419 errstr += "Radar wavelength must be positive. \n";
420 }
421
422 if (prf() <= 0.)
423 {
424 errstr += "Pulse Repetition Frequency must be positive. \n";
425 }
426
427 if (startingRange() <= 0.)
428 {
429 errstr += "Starting Range must be positive. \n";
430 }
431
432 if (rangePixelSpacing() <= 0. )
433 {
434 errstr += "Slant range pixel spacing must be positive. \n";
435 }
436
437 if (length() == 0)
438 {
439 errstr += "Radar Grid should have length of at least 1. \n";
440 }
441
442 if (width() == 0)
443 {
444 errstr += "Radar Grid should have width of at least 1. \n";
445 }
446
447 if (! errstr.empty())
448 {
449 throw isce3::except::InvalidArgument(ISCE_SRCINFO(), errstr);
450 }
451}
452
453
455void
457lookSide(const std::string & inputLook) {
458 _lookSide = isce3::core::parseLookSide(inputLook);
459}
Data structure to store date time to nano-sec precision.
Definition DateTime.h:18
Data structure for storing basic radar geometry image metadata.
Definition Metadata.h:17
Definition RadarGridParameters.h:16
double _wavelength
Imaging wavelength.
Definition RadarGridParameters.h:311
RadarGridParameters multilook(size_t azlooks, size_t rglooks) const
Multilook.
Definition RadarGridParameters.h:251
void width(const size_t &t)
Set radar grid width.
Definition RadarGridParameters.h:120
double sensingStart() const
Get sensing start time in seconds since reference epoch.
Definition RadarGridParameters.h:78
double sensingMid() const
Get sensing mid time in seconds.
Definition RadarGridParameters.h:129
RadarGridParameters()
Default constructor.
Definition RadarGridParameters.h:335
const isce3::core::DateTime & refEpoch() const
Get reference epoch DateTime.
Definition RadarGridParameters.h:70
void prf(const double &t)
Set pulse repetition frequency in Hz - inverse of azimuth time interval.
Definition RadarGridParameters.h:93
size_t length() const
Get radar grid length.
Definition RadarGridParameters.h:111
RadarGridParameters addMargin(size_t ymargin, size_t xmargin, std::string side="both") const
Add margins to start, stop or both sides to the radar grid.
Definition RadarGridParameters.h:217
void sensingStart(const double &t)
Set sensing start time in seconds since reference epoch.
Definition RadarGridParameters.h:81
double startingRange() const
Get starting slant range in meters.
Definition RadarGridParameters.h:99
isce3::core::DateTime sensingDateTime(double line) const
Get a sensing DateTime for a given line (zero-index row)
Definition RadarGridParameters.h:143
RadarGridParameters upsample(size_t az_upsampling_factor, size_t rg_upsampling_factor) const
Upsample.
Definition RadarGridParameters.h:276
RadarGridParameters resizeKeepStartStop(size_t ysize, size_t xsize) const
Return a new resized radar grid with the same start and stop points.
Definition RadarGridParameters.h:185
double midRange() const
Get middle slant range.
Definition RadarGridParameters.h:153
size_t _rwidth
Number of samples in the image.
Definition RadarGridParameters.h:326
RadarGridParameters & operator=(const RadarGridParameters &rgparam)
Assignment operator.
Definition RadarGridParameters.h:374
isce3::core::LookSide _lookSide
Left or right looking geometry indicator.
Definition RadarGridParameters.h:305
isce3::core::DateTime _refEpoch
Reference epoch for time tags.
Definition RadarGridParameters.h:329
double wavelength() const
Get radar wavelength in meters.
Definition RadarGridParameters.h:84
double _sensingStart
Sensing start time.
Definition RadarGridParameters.h:308
size_t width() const
Get radar grid width.
Definition RadarGridParameters.h:117
void length(const size_t &t)
Set radar grid length.
Definition RadarGridParameters.h:114
double slantRangeIndex(double slant_range) const
Get slant range fractional index at a given slant range distance.
Definition RadarGridParameters.h:163
double rangePixelSpacing() const
Get slant range pixel spacing in meters.
Definition RadarGridParameters.h:105
void startingRange(const double &r)
Set starting slant range in meters.
Definition RadarGridParameters.h:102
double _prf
PRF.
Definition RadarGridParameters.h:314
void refEpoch(const isce3::core::DateTime &epoch)
Set reference epoch DateTime.
Definition RadarGridParameters.h:75
double _rangePixelSpacing
Slant range pixel spacing.
Definition RadarGridParameters.h:320
double endingRange() const
Get ending slant range.
Definition RadarGridParameters.h:148
double azimuthTimeInterval() const
Get azimuth time interval in seconds.
Definition RadarGridParameters.h:96
double _startingRange
Slant range to center of first pixel.
Definition RadarGridParameters.h:317
void lookSide(isce3::core::LookSide side)
Set look direction.
Definition RadarGridParameters.h:64
void validate() const
Validate parameters of data structure.
Definition RadarGridParameters.h:412
size_t size() const
Get total number of radar grid elements.
Definition RadarGridParameters.h:123
double azimuthIndex(double az_time) const
Get azimuth fractional index (line) at a given sensing time.
Definition RadarGridParameters.h:138
double prf() const
Get pulse repetition frequency in Hz - inverse of azimuth time interval.
Definition RadarGridParameters.h:90
size_t _rlength
Number of lines in the image.
Definition RadarGridParameters.h:323
void rangePixelSpacing(const double &t)
Set slant range pixel spacing in meters.
Definition RadarGridParameters.h:108
void wavelength(const double &t)
Set radar wavelength in meters.
Definition RadarGridParameters.h:87
RadarGridParameters offsetAndResize(double yoff, double xoff, size_t ysize, size_t xsize) const
Crop/ Expand while keeping the spacing the same with top left offset and size.
Definition RadarGridParameters.h:168
isce3::core::LookSide lookSide() const
Get the look direction.
Definition RadarGridParameters.h:61
double sensingTime(double line) const
Get sensing time for a given line (zero-index row)
Definition RadarGridParameters.h:134
double sensingStop() const
Get sensing stop time in seconds since reference epoch.
Definition RadarGridParameters.h:126
double slantRange(double sample) const
Get slant range for a given sample (zero-index column)
Definition RadarGridParameters.h:158
RadarGridProduct class declaration.
Definition RadarGridProduct.h:71
Definition Swath.h:23
The isce3::product namespace.
Definition forward.h:3
base interpolator is an abstract base class
Definition BinarySearchFunc.cpp:5

Generated for ISCE3.0 by doxygen 1.13.2.