5 #include <boost/asio/thread_pool.hpp> 6 #include <boost/asio/post.hpp> 9 #include "ScannerHead.h" 10 #include "AbstractBeamDeflector.h" 12 #include "FWFSettings.h" 14 #include "maths/Directions.h" 15 #include "maths/Rotation.h" 16 #include "ThreadPool.h" 17 #include "SyncFileWriter.h" 19 #include <PyBeamDeflectorWrapper.h> 21 #include <PyIntegerList.h> 22 #include <PyNoiseSourceWrapper.h> 23 #include <PyRandomnessGeneratorWrapper.h> 24 #include <PyDoubleVector.h> 26 #include <Measurement.h> 155 std::shared_ptr<SyncFileWriter>
tfw =
nullptr;
267 std::shared_ptr<RandomnessGenerator<double>>
randGen1 =
nullptr;
271 std::shared_ptr<RandomnessGenerator<double>>
randGen2 =
nullptr;
275 std::shared_ptr<UniformNoiseSource<double>>
321 glm::dvec3 beamOrigin,
323 std::list<int> pulseFreqs,
324 double pulseLength_ns,
329 double receiverDiameter,
330 double atmosphericVisibility,
332 bool writeWaveform =
false,
333 bool calcEchowidth =
false,
334 bool fullWaveNoise =
false,
335 bool platformNoiseDisabled =
false 346 void applySettings(std::shared_ptr<ScannerSettings> settings);
437 glm::dvec3 & absoluteBeamOrigin,
452 unsigned int const legIndex,
453 glm::dvec3 &absoluteBeamOrigin,
507 {this->cfg_device_pulseLength_ns = pulseLength_ns;}
535 {this->cfg_device_beamDivergence_rad = beamDivergence;}
549 {this->cfg_device_averagePower_w = averagePower;}
563 {this->cfg_device_beamQuality = beamQuality;}
577 {this->cfg_device_efficiency = efficiency;}
592 {this->cfg_device_receiverDiameter_m = receiverDiameter;}
606 {this->cfg_device_visibility_km = visibility;}
620 {this->cfg_device_wavelength_m = wavelength;}
662 inline void setBt2(
double bt2) {this->cached_Bt2 = bt2;}
675 inline void setDr2(
double dr2) {this->cached_Dr2 = dr2;}
689 inline void setActive(
bool active) {this->state_isActive = active;}
792 {this->cfg_device_id = deviceId;}
794 #ifdef PYTHON_BINDING 820 {
return new PyIntegerList(cfg_device_supportedPulseFreqs_Hz);}
834 {
return new PythonDVec3(&cfg_device_headRelativeEmitterPosition);}
850 if(randGen1 ==
nullptr)
return nullptr;
859 if(randGen2 ==
nullptr)
return nullptr;
std::shared_ptr< std::vector< Measurement > > cycleMeasurements
Vector of measurements performed by the scanner at current cycle.
Definition: Scanner.h:205
double getBeamWaistRadius()
Obtain beam waist radius.
Definition: Scanner.h:642
std::shared_ptr< std::vector< Measurement > > allMeasurements
Historical vector of all measurements performed by the scanner.
Definition: Scanner.h:184
void setVisibility(double visibility)
Set device visibility.
Definition: Scanner.h:605
bool platformNoiseDisabled
Flag specifying if disable platform noise (true) or not (false)
Definition: Scanner.h:50
bool isCalcEchowidth()
Check if scanner is configured to compute echo width (true) or not (false)
Definition: Scanner.h:714
double calcAtmosphericAttenuation()
Compute the atmospheric attenuation to be used as the atmospheric attenuation.
Definition: Scanner.cpp:285
void handleSimStepNoise(glm::dvec3 &absoluteBeamOrigin, Rotation &absoluteBeamAttitude)
Handle position and attitude noise.
Definition: Scanner.cpp:349
void setLastPulseWasHit(bool lastPulseWasHit)
Specify if last pulse was hit (true) or not (false)
Definition: Scanner.cpp:341
std::list< int > cfg_device_supportedPulseFreqs_Hz
Pulse frequencies (hertz) supoported by the scanner.
Definition: Scanner.h:291
void setWriteWaveform(bool writeWaveform)
Set scanner write wave form configuration.
Definition: Scanner.h:705
void handleTrajectoryOutput(long currentGpsTime)
Handle trajectory output whatever it is to output file, to all trajectories vector or to cycle trajec...
Definition: Scanner.cpp:474
bool fixedIncidenceAngle
Flag specifying if use fixed incidence angle (true) or not (false)
Definition: Scanner.h:60
double getEfficiency()
Obtain device efficiency.
Definition: Scanner.h:570
std::shared_ptr< UniformNoiseSource< double > > intersectionHandlingNoiseSource
Uniform noise source for single thread mode.
Definition: Scanner.h:276
int numRays
Number of rays computed by the calcRaysNumber function.
Definition: Scanner.h:55
PyDoubleVector * getTimeWave()
Python wrapper for time wave vector.
Definition: Scanner.h:867
Rotation & getRelativeAttitudeByReference()
Python wrapper for head relative emitter attitude access.
Definition: Scanner.h:826
double getDr2()
Obtain .
Definition: Scanner.h:669
Wrapper for AbstractBeamDeflector class.
Definition: PyBeamDeflectorWrapper.h:15
long calcCurrentGpsTime()
Compute the current GPS time (milliseconds)
Definition: Scanner.cpp:396
int getPulseFreq_Hz()
Obtain the pulse frequency.
Definition: Scanner.h:486
std::shared_ptr< AbstractBeamDeflector > beamDeflector
Beam deflector composing the scanner.
Definition: Scanner.h:167
double calcFootprintArea(double distance)
Compute the footprint area .
Definition: Scanner.cpp:273
Base class for all assets.
Definition: Asset.h:10
Definition: Rotation.h:80
void setFullWaveNoise(bool fullWaveNoise)
Set scanner full wave noise policy.
Definition: Scanner.h:738
PyDetectorWrapper * getPyDetectorWrapper()
Python wrapper for detector access.
Definition: Scanner.cpp:336
double getBt2()
Obtain .
Definition: Scanner.h:656
double getAtmosphericExtinction()
Obtain atmospheric extinction.
Definition: Scanner.h:627
void setPulseLength_ns(double pulseLength_ns)
Set the pulse length.
Definition: Scanner.h:506
std::vector< double > time_wave
Discretization vector.
Definition: Scanner.h:261
PyRandomnessGeneratorWrapper * getRandGen2()
Python wrapper for second randomness generator.
Definition: Scanner.h:858
int getNumRays()
Obtain the number of rays.
Definition: Scanner.h:473
double cfg_device_efficiency
Device efficiency.
Definition: Scanner.h:89
int state_currentPulseNumber
Current pulse number.
Definition: Scanner.h:117
int numTimeBins
Number if bins defining discretization size.
Definition: Scanner.h:250
bool isActive()
Check if scanner is active (true) or not (false)
Definition: Scanner.h:682
bool isFullWaveNoise()
Check if scanner is configured to add noise to full wave (true) or not (false)
Definition: Scanner.h:731
double getBeamDivergence()
Obtain beam divergence.
Definition: Scanner.h:527
bool isFixedIncidenceAngle()
Check if incidence angle is fixed (true) or not (false)
Definition: Scanner.h:761
Wrapper for RandomnessGenerator class.
Definition: PyRandomnessGeneratorWrapper.h:10
bool writeWaveform
Flag specifying if write waveform (true) or not (false)
Definition: Scanner.h:38
double cached_Bt2
understood as the square of beam divergence
Definition: Scanner.h:149
double cfg_device_averagePower_w
Average power (watts)
Definition: Scanner.h:81
Base abstract class for detectors.
Definition: AbstractDetector.h:20
PyIntegerList * getSupportedPulseFrequencies()
Python wrapper for supported pulse frequencies list.
Definition: Scanner.h:819
Class representing a thread pool to deal with multi threading tasks.
Definition: ThreadPool.h:14
void applySettings(std::shared_ptr< ScannerSettings > settings)
Apply scanner settings.
Definition: Scanner.cpp:159
Full Waveform settings.
Definition: FWFSettings.h:8
void setReceiverDiameter(double receiverDiameter)
Set receiver diameter.
Definition: Scanner.h:591
bool state_isActive
Flag specifying if scanner is active (true) or not (false)
Definition: Scanner.h:127
double getPulseLength_ns()
Get the pulse length.
Definition: Scanner.h:499
void setBeamDivergence(double beamDivergence)
Set beam divergence.
Definition: Scanner.h:534
PythonDVec3 * getRelativePosition()
Python wrapper for head relative emitter position.
Definition: Scanner.h:833
double cfg_device_pulseLength_ns
Pulse length (nanoseconds)
Definition: Scanner.h:69
int calcTimePropagation(std::vector< double > &timeWave, int numBins)
Compute propagation time, which means obtaining the intensity peak index.
Definition: Scanner.cpp:250
void setAveragePower(double averagePower)
Set average power.
Definition: Scanner.h:548
std::shared_ptr< ScannerHead > scannerHead
Scanner head composing the scanner.
Definition: Scanner.h:162
Class representing a scanner asset.
Definition: Scanner.h:31
bool isPlatformNoiseDisabled()
Check if platform noise is disabled (true) or not (false)
Definition: Scanner.h:746
double cached_Dr2
understood as the square of receiver diameter
Definition: Scanner.h:139
std::string toString()
Build a string representation of the scanner.
Definition: Scanner.cpp:176
bool lastPulseWasHit()
Check if last pulse was hit (true) or not (false)
Definition: Scanner.h:514
double cfg_device_receiverDiameter_m
Receiver diamater (meters)
Definition: Scanner.h:93
int cfg_setting_pulseFreq_Hz
Pulse frequency (hertz)
Definition: Scanner.h:73
void setTrajectoryFileWriter(std::shared_ptr< SyncFileWriter > tfw)
Set synchronous file writer for trajectory.
Definition: Scanner.h:776
void applySettingsFWF(FWFSettings settings)
Apply full wave form settings.
Definition: Scanner.cpp:170
std::shared_ptr< RandomnessGenerator< double > > randGen1
First randomness generator for single thread mode.
Definition: Scanner.h:267
double getVisibility()
Get device visibility.
Definition: Scanner.h:599
std::shared_ptr< SyncFileWriter > tfw
Synchronous file writer.
Definition: Scanner.h:155
double cfg_device_wavelength_m
Wave length (meters)
Definition: Scanner.h:101
double getBeamQuality()
Get beam quality.
Definition: Scanner.h:556
glm::dvec3 cfg_device_headRelativeEmitterPosition
Head relative emitter position.
Definition: Scanner.h:282
void prepareDiscretization()
Prepare wave discretization.
Definition: Scanner.cpp:244
Wrapper for std::vector<double> class.
Definition: PyDoubleVector.h:15
double beamWaistRadius
Beam waist radius.
Definition: Scanner.h:110
void setAtmosphericExtinction(double atmosphericExtinction)
Set atmospheric extinction.
Definition: Scanner.h:634
Rotation calcAbsoluteBeamAttitude()
Compute the absolute beam attitude considering the mount relative attitude and the deflector relative...
Definition: Scanner.cpp:387
FWFSettings FWF_settings
Full wave form settings for the scanner.
Definition: Scanner.h:239
Rotation cfg_device_headRelativeEmitterAttitude
Head relative emitter attitude.
Definition: Scanner.h:286
bool isWriteWaveform()
Check if scanner is configured to write wave form (true) or not (false)
Definition: Scanner.h:698
bool state_lastPulseWasHit
Flag specifying if last pulse was hit (true) or not (false)
Definition: Scanner.h:121
long lastTrajectoryTime
GPS time (milliseconds) corresponding to last recorded trajectory point.
Definition: Scanner.h:232
PyRandomnessGeneratorWrapper * getRandGen1()
Python wrapper for first randomness generator.
Definition: Scanner.h:849
Wrapper for NoiseSource abstract class.
Definition: PyNoiseSourceWrapper.h:14
bool calcEchowidth
Flag specifying if calculate echo width (true) or not (false)
Definition: Scanner.h:42
bool fullWaveNoise
Flag specifying if compute full wave noise (true) or not (false)
Definition: Scanner.h:46
double getWavelength()
Obtain wave length.
Definition: Scanner.h:613
void handlePulseComputation(thread_pool &pool, unsigned int const legIndex, glm::dvec3 &absoluteBeamOrigin, Rotation &absoluteBeamAttitude, long currentGpsTime)
Handle pulse computation whatever it is single thread based or thread pool based. ...
Definition: Scanner.cpp:403
void setBeamQuality(double beamQuality)
Set beam quality.
Definition: Scanner.h:562
void setPulseFreq_Hz(int pulseFreq_Hz)
Set the pulse frequency.
Definition: Scanner.cpp:304
std::shared_ptr< RandomnessGenerator< double > > randGen2
Second randomness generator for single thread mode.
Definition: Scanner.h:271
void setCalcEchowidth(bool calcEchowidth)
Set scanner echo width configuration.
Definition: Scanner.h:721
Wrapper for std::list<int> class.
Definition: PyIntegerList.h:15
void doSimStep(thread_pool &pool, unsigned int legIndex)
Perform computations for current simulation step.
Definition: Scanner.cpp:187
std::shared_ptr< std::mutex > allMeasurementsMutex
Mutex to handle concurrent access to historical vector of all measurements and historical vector of a...
Definition: Scanner.h:199
void setFixedIncidenceAngle(bool fixedIncidenceAngle)
Set fixed incidence angle flag.
Definition: Scanner.h:768
double atmosphericExtinction
Atmospheric extinction.
Definition: Scanner.h:106
std::string getDeviceId()
Obtain scanner device identifier.
Definition: Scanner.h:785
PyBeamDeflectorWrapper * getPyBeamDeflector()
Python wrapper for beam deflector access.
Definition: Scanner.h:806
std::shared_ptr< std::vector< Trajectory > > allTrajectories
Historical vector of all trajectory points recorded by the scanner.
Definition: Scanner.h:191
double calcFootprintRadius(double distance)
Compute the footprint radius .
Definition: Scanner.cpp:279
Scanner(double beamDiv_rad, glm::dvec3 beamOrigin, Rotation beamOrientation, std::list< int > pulseFreqs, double pulseLength_ns, std::string id, double averagePower, double beamQuality, double efficiency, double receiverDiameter, double atmosphericVisibility, int wavelength, bool writeWaveform=false, bool calcEchowidth=false, bool fullWaveNoise=false, bool platformNoiseDisabled=false)
Scanner constructor.
Definition: Scanner.cpp:24
PyNoiseSourceWrapper * getIntersectionHandlingNoiseSource()
Python wrapper for intersection handling noise source.
Definition: Scanner.h:840
void setDr2(double dr2)
Set .
Definition: Scanner.h:675
std::shared_ptr< std::mutex > cycleMeasurementsMutex
Mutex to handle concurrent access to vector of measurements and vector of trajectory points by cycle...
Definition: Scanner.h:220
Wrapper for AbstractDetector class.
Definition: PyDetectorWrapper.h:16
double trajectoryTimeInterval
Time interval between record of trajectory points. When it is exactly 0, then no trajectory points wi...
Definition: Scanner.h:227
double cfg_device_beamQuality
Beam quality.
Definition: Scanner.h:85
void setBeamWaistRadius(double beamWaistRadius)
Set beam waist radius.
Definition: Scanner.h:648
static const glm::dvec3 right
x : left-right direction
Definition: Directions.h:17
double cfg_device_visibility_km
Visibility (kilometers)
Definition: Scanner.h:97
void setDeviceId(std::string const deviceId)
Set the scanner device identifier.
Definition: Scanner.h:791
void setNumRays(int numRays)
Set the number of rays.
Definition: Scanner.h:479
double cfg_device_beamDivergence_rad
Beam divergence (radians)
Definition: Scanner.h:65
std::shared_ptr< Platform > platform
Platform carrying the scanner.
Definition: Scanner.h:172
void setPlatformNoiseDisabled(bool platformNoiseDisabled)
Set platform noise disabled flag.
Definition: Scanner.h:753
ScannerHead & getScannerHead()
Python wrapper for scanner head access.
Definition: Scanner.h:800
int peakIntensityIndex
Index of bin containing the intensity peak. It is computed through calcTimePropagation function...
Definition: Scanner.h:257
double getAveragePower()
Obtain average power.
Definition: Scanner.h:542
void setWavelength(double wavelength)
Set wave length.
Definition: Scanner.h:619
void setEfficiency(double efficiency)
Set device efficiency.
Definition: Scanner.h:576
void setBt2(double bt2)
Set .
Definition: Scanner.h:662
void setActive(bool active)
Set scanner active status. True to make it active, false to make it inactive.
Definition: Scanner.h:689
void calcRaysNumber()
Compute the number of rays depending on beam sample quality.
Definition: Scanner.cpp:230
Wrapper to communicate glm::dvec3 with python.
Definition: PythonDVec3.h:14
double getReceiverDiameter()
Get receiver diamater.
Definition: Scanner.h:584
std::string cfg_device_id
Device identifier.
Definition: Scanner.h:77
std::shared_ptr< AbstractDetector > detector
Detector composing the scanner.
Definition: Scanner.h:177
std::shared_ptr< std::vector< Trajectory > > cycleTrajectories
Vector of trajectory points recorded by the scanner.
Definition: Scanner.h:212
Definition: ScannerHead.h:13