FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
SensorSilCam.h
1#pragma once
2
280#include "SampleClock.h"
281#include "SensorFrame.h"
282#include "SensorNoise.h"
283
284#include <fhsim/simobject/SimObject.h>
285#include <string>
286#include <vector>
287
288namespace environment
289{
290class EnvironmentProvider;
291}
292
293class SensorSilCam : public SimObject
294{
295public:
297 struct Settings
298 {
299 double frameRate = 4.0;
301 double sampleVolume[3] = {0.040, 0.055, 0.065};
302 double captureEfficiency = 0.85;
303 double detectionProbability = 0.92;
305 double falsePositiveRate = 0.05;
306 double individualMassKg = 1.1e-6;
307 double lengthM = 0.0028;
308 double lengthStdM = 0.0007;
309 double sizeErrorStdRelative = 0.08;
310 int numSizeBins = 8;
311 double sizeBinMin = 0.0005;
312 double sizeBinMax = 0.0060;
313 unsigned int noiseSeed = 0;
314 };
315
318 {
319 double concentration = 0.0;
320 double numberConcentration = 0.0;
321 double count = 0.0;
322 double sizeMean = 0.0;
323 double sizeStd = 0.0;
324 std::vector<double> histogram;
325 double sampleTime = 0.0;
326 double position[3] = {0.0, 0.0, 0.0};
327 double valid = 0.0;
328 };
329
335 SensorSilCam(std::string simObjectName, ISimObjectCreator* creator);
336
348 SensorSilCam(std::string simObjectName, const Settings& settings);
349
355 static double SampleVolumeOf(const double sideLengths[3]);
356
365 static double FrameLambdaOf(double numberConcentration, double sampleVolume,
366 double captureEfficiency, double detectionProbability);
367
374 static double LengthLogSigmaOf(double medianLength, double stdLength);
375
384 static int BinIndexOf(double length, double binMin, double binMax, int numBins);
385
387 void OdeFcn(const double dT, const double* const adX, double* const adXDot) const override;
388
394 void AcceptedStep(const double dT, const double* const adX) override;
395
402 void FinalSetup(const double dT, const double* const adX, ISimObjectCreator* const creator) override;
403
404#ifdef FH_VISUALIZATION
405 void RenderInit(Ogre::Root* const ogreRoot, ISimObjectCreator* const creator) override { }
406 void RenderUpdate(const double dT, const double* const adX) override { }
407#endif
408
419 int CaptureIfDue(double t, double numberConcentration, const double position[3]);
420
428 bool CaptureFrame(double t, double numberConcentration, const double position[3]);
429
431 const Measurement& HeldMeasurement() const { return m_held; }
432
434 const Settings& GetSettings() const { return m_settings; }
435
437 int FramesInWindow() const { return m_framesInWindow; }
438
440 long long FramesCaptured() const { return m_framesCaptured; }
441
443 double NextFrameTime() const { return m_frameClock.NextSampleTime(); }
444
445protected:
447 const double* OutConcentration(const double dT, const double* const adX);
448
450 const double* OutNumberConcentration(const double dT, const double* const adX);
451
453 const double* OutCount(const double dT, const double* const adX);
454
456 const double* OutSizeMean(const double dT, const double* const adX);
457
459 const double* OutSizeStd(const double dT, const double* const adX);
460
462 const double* OutSizeHistogram(const double dT, const double* const adX);
463
465 const double* OutSampleTime(const double dT, const double* const adX);
466
468 const double* OutPosition(const double dT, const double* const adX);
469
471 const double* OutValid(const double dT, const double* const adX);
472
473private:
475 struct Window
476 {
477 double count = 0.0;
478 double sumLength = 0.0;
479 double sumLengthSq = 0.0;
480 std::vector<double> binCounts;
481 double sumTime = 0.0;
482 double sumPosition[3] = {0.0, 0.0, 0.0};
483 };
484
486 struct AnalyticParticle
487 {
488 double meanLength = 0.0;
489 double secondMoment = 0.0;
490 std::vector<double> binProbabilities;
491 };
492
494 void UpdateAnalyticParticle();
495
497 void ResetWindow();
498
503 void AccumulateAnalyticFrame(double lambda);
504
509 void AccumulateDrawnFrame(double lambda);
510
516 void AddParticle(double length, double weight);
517
519 void CloseWindow();
520
522 double DrawAnimalLength();
523
525 double DrawFalsePositiveLength();
526
528 double TotalLogSigma() const;
529
534 void AnalyticBinProbabilities(std::vector<double>& out) const;
535
540 void ResolveEnvironment(ISimObjectCreator* const creator);
541
548 double NumberConcentrationAt(double dT, const double position[3]) const;
549
550 SensorFrame m_frame;
551 SampleClock m_frameClock;
552 SensorNoise m_noise;
553 Settings m_settings;
554
555 std::string m_name;
556 std::string m_speciesFieldName;
557 std::string m_parameterLibrary;
558
559 bool m_individualMassGiven = false;
560
561 environment::EnvironmentProvider* m_environment = nullptr;
562 int m_speciesHandle = -1;
563
564 bool m_hasPorts = false;
565
566 double m_sampleVolume = 0.0;
567
568 AnalyticParticle m_analytic;
569
570 Window m_window;
571 Measurement m_held;
572 int m_framesInWindow = 0;
573 long long m_framesCaptured = 0;
574};
Definition SampleClock.h:40
double NextSampleTime() const
The time at which the next sample is due, s.
Definition SampleClock.h:76
Definition SensorFrame.h:36
Definition SensorNoise.h:39
Definition SensorSilCam.h:294
void FinalSetup(const double dT, const double *const adX, ISimObjectCreator *const creator) override
SensorSilCam(std::string simObjectName, ISimObjectCreator *creator)
const double * OutSizeMean(const double dT, const double *const adX)
The mean measured particle length, m.
const double * OutSizeHistogram(const double dT, const double *const adX)
The normalised size distribution.
void AcceptedStep(const double dT, const double *const adX) override
long long FramesCaptured() const
The total number of frames captured since the instrument was built.
Definition SensorSilCam.h:440
static double LengthLogSigmaOf(double medianLength, double stdLength)
static int BinIndexOf(double length, double binMin, double binMax, int numBins)
const double * OutValid(const double dT, const double *const adX)
One once the first window has closed.
bool CaptureFrame(double t, double numberConcentration, const double position[3])
const double * OutNumberConcentration(const double dT, const double *const adX)
The measured number concentration, individuals per m^3.
int FramesInWindow() const
The number of frames captured since the current window opened.
Definition SensorSilCam.h:437
const Settings & GetSettings() const
The settings the instrument was built with.
Definition SensorSilCam.h:434
const double * OutSizeStd(const double dT, const double *const adX)
The standard deviation of the measured particle lengths, m.
const double * OutCount(const double dT, const double *const adX)
The raw aggregated count over the window.
const double * OutSampleTime(const double dT, const double *const adX)
The mid time of the held window, s.
const Measurement & HeldMeasurement() const
The measurement currently held on the output ports.
Definition SensorSilCam.h:431
void OdeFcn(const double dT, const double *const adX, double *const adXDot) const override
An empty function: nothing about a frame counting instrument is a continuous state.
const double * OutConcentration(const double dT, const double *const adX)
The measured mass concentration, kg/m^3.
SensorSilCam(std::string simObjectName, const Settings &settings)
static double SampleVolumeOf(const double sideLengths[3])
static double FrameLambdaOf(double numberConcentration, double sampleVolume, double captureEfficiency, double detectionProbability)
const double * OutPosition(const double dT, const double *const adX)
The mean NED position of the sensor head over the held window, m.
int CaptureIfDue(double t, double numberConcentration, const double position[3])
double NextFrameTime() const
The time at which the next frame is due, s.
Definition SensorSilCam.h:443
Window
Spatial window (validity interval) edge profiles.
Definition ParametricBathymetry.h:87
One completed measurement window, held on the output ports until the next closes.
Definition SensorSilCam.h:318
double count
The raw aggregated count.
Definition SensorSilCam.h:321
double sampleTime
The mid time of the window, s.
Definition SensorSilCam.h:325
double numberConcentration
The number concentration, individuals per m^3.
Definition SensorSilCam.h:320
double sizeMean
The mean measured length, m.
Definition SensorSilCam.h:322
double valid
One once a window has closed.
Definition SensorSilCam.h:327
double concentration
The mass concentration, kg/m^3.
Definition SensorSilCam.h:319
std::vector< double > histogram
The normalised size distribution.
Definition SensorSilCam.h:324
double position[3]
The mean sensor position over the window, m.
Definition SensorSilCam.h:326
double sizeStd
The standard deviation of the measured lengths, m.
Definition SensorSilCam.h:323
Everything that makes one silhouette camera out of the shared sensor machinery.
Definition SensorSilCam.h:298
int numSizeBins
The number of histogram bins.
Definition SensorSilCam.h:310
int framesPerOutput
Frames aggregated into one measurement.
Definition SensorSilCam.h:300
double lengthM
The median animal length, m.
Definition SensorSilCam.h:307
double frameRate
The imaging rate, Hz.
Definition SensorSilCam.h:299
double sizeErrorStdRelative
Relative standard deviation of the sizing error.
Definition SensorSilCam.h:309
double sizeBinMin
The lower edge of the first bin, m.
Definition SensorSilCam.h:311
double lengthStdM
The standard deviation of the animal length, m.
Definition SensorSilCam.h:308
double assumedDetectionProbability
The detection probability the instrument divides by.
Definition SensorSilCam.h:304
double sizeBinMax
The upper edge of the last bin, m.
Definition SensorSilCam.h:312
unsigned int noiseSeed
The random seed; zero is deterministic and noise free.
Definition SensorSilCam.h:313
double captureEfficiency
Fraction of present animals carried through the volume.
Definition SensorSilCam.h:302
double detectionProbability
Probability an imaged animal is counted.
Definition SensorSilCam.h:303
double individualMassKg
The mass of one animal, kg.
Definition SensorSilCam.h:306
double sampleVolume[3]
The imaged volume side lengths, m.
Definition SensorSilCam.h:301
double falsePositiveRate
Expected spurious detections per frame.
Definition SensorSilCam.h:305