FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
SensorSilCam.h
1#pragma once
2
275#include "SampleClock.h"
276#include "SensorFrame.h"
277#include "SensorNoise.h"
278
279#include <fhsim/simobject/SimObject.h>
280#include <string>
281#include <vector>
282
283namespace environment
284{
285class EnvironmentProvider;
286}
287
288class SensorSilCam : public SimObject
289{
290public:
292 struct Settings
293 {
294 double frameRate = 4.0;
296 double sampleVolume[3] = {0.040, 0.055, 0.065};
297 double captureEfficiency = 0.85;
298 double detectionProbability = 0.92;
300 double falsePositiveRate = 0.05;
301 double individualMassKg = 1.1e-6;
302 double lengthM = 0.0028;
303 double lengthStdM = 0.0007;
304 double sizeErrorStdRelative = 0.08;
305 int numSizeBins = 8;
306 double sizeBinMin = 0.0005;
307 double sizeBinMax = 0.0060;
308 unsigned int noiseSeed = 0;
309 };
310
313 {
314 double concentration = 0.0;
315 double numberConcentration = 0.0;
316 double count = 0.0;
317 double sizeMean = 0.0;
318 double sizeStd = 0.0;
319 std::vector<double> histogram;
320 double sampleTime = 0.0;
321 double position[3] = {0.0, 0.0, 0.0};
322 double valid = 0.0;
323 };
324
330 SensorSilCam(std::string simObjectName, ISimObjectCreator* creator);
331
343 SensorSilCam(std::string simObjectName, const Settings& settings);
344
350 static double SampleVolumeOf(const double sideLengths[3]);
351
360 static double FrameLambdaOf(double numberConcentration, double sampleVolume,
361 double captureEfficiency, double detectionProbability);
362
369 static double LengthLogSigmaOf(double medianLength, double stdLength);
370
379 static int BinIndexOf(double length, double binMin, double binMax, int numBins);
380
382 void OdeFcn(const double dT, const double* const adX, double* const adXDot) const override;
383
389 void AcceptedStep(const double dT, const double* const adX) override;
390
397 void FinalSetup(const double dT, const double* const adX, ISimObjectCreator* const creator) override;
398
399#ifdef FH_VISUALIZATION
400 void RenderInit(Ogre::Root* const ogreRoot, ISimObjectCreator* const creator) override { }
401 void RenderUpdate(const double dT, const double* const adX) override { }
402#endif
403
414 int CaptureIfDue(double t, double numberConcentration, const double position[3]);
415
423 bool CaptureFrame(double t, double numberConcentration, const double position[3]);
424
426 const Measurement& HeldMeasurement() const { return m_held; }
427
429 const Settings& GetSettings() const { return m_settings; }
430
432 int FramesInWindow() const { return m_framesInWindow; }
433
435 long long FramesCaptured() const { return m_framesCaptured; }
436
438 double NextFrameTime() const { return m_frameClock.NextSampleTime(); }
439
440protected:
442 const double* OutConcentration(const double dT, const double* const adX);
443
445 const double* OutNumberConcentration(const double dT, const double* const adX);
446
448 const double* OutCount(const double dT, const double* const adX);
449
451 const double* OutSizeMean(const double dT, const double* const adX);
452
454 const double* OutSizeStd(const double dT, const double* const adX);
455
457 const double* OutSizeHistogram(const double dT, const double* const adX);
458
460 const double* OutSampleTime(const double dT, const double* const adX);
461
463 const double* OutPosition(const double dT, const double* const adX);
464
466 const double* OutValid(const double dT, const double* const adX);
467
468private:
470 struct Window
471 {
472 double count = 0.0;
473 double sumLength = 0.0;
474 double sumLengthSq = 0.0;
475 std::vector<double> binCounts;
476 double sumTime = 0.0;
477 double sumPosition[3] = {0.0, 0.0, 0.0};
478 };
479
481 void ResetWindow();
482
487 void AccumulateAnalyticFrame(double lambda);
488
493 void AccumulateDrawnFrame(double lambda);
494
500 void AddParticle(double length, double weight);
501
503 void CloseWindow();
504
506 double DrawAnimalLength();
507
509 double DrawFalsePositiveLength();
510
512 double TotalLogSigma() const;
513
518 void AnalyticBinProbabilities(std::vector<double>& out) const;
519
524 void ResolveEnvironment(ISimObjectCreator* const creator);
525
532 double NumberConcentrationAt(double dT, const double position[3]) const;
533
534 SensorFrame m_frame;
535 SampleClock m_frameClock;
536 SensorNoise m_noise;
537 Settings m_settings;
538
539 std::string m_name;
540 std::string m_speciesFieldName;
541
542 bool m_individualMassGiven = false;
543
544 environment::EnvironmentProvider* m_environment = nullptr;
545 int m_speciesHandle = -1;
546
547 bool m_hasPorts = false;
548
549 double m_sampleVolume = 0.0;
550
551 Window m_window;
552 Measurement m_held;
553 int m_framesInWindow = 0;
554 long long m_framesCaptured = 0;
555};
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:289
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:435
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:432
const Settings & GetSettings() const
The settings the instrument was built with.
Definition SensorSilCam.h:429
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:426
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:438
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:313
double count
The raw aggregated count.
Definition SensorSilCam.h:316
double sampleTime
The mid time of the window, s.
Definition SensorSilCam.h:320
double numberConcentration
The number concentration, individuals per m^3.
Definition SensorSilCam.h:315
double sizeMean
The mean measured length, m.
Definition SensorSilCam.h:317
double valid
One once a window has closed.
Definition SensorSilCam.h:322
double concentration
The mass concentration, kg/m^3.
Definition SensorSilCam.h:314
std::vector< double > histogram
The normalised size distribution.
Definition SensorSilCam.h:319
double position[3]
The mean sensor position over the window, m.
Definition SensorSilCam.h:321
double sizeStd
The standard deviation of the measured lengths, m.
Definition SensorSilCam.h:318
Everything that makes one silhouette camera out of the shared sensor machinery.
Definition SensorSilCam.h:293
int numSizeBins
The number of histogram bins.
Definition SensorSilCam.h:305
int framesPerOutput
Frames aggregated into one measurement.
Definition SensorSilCam.h:295
double lengthM
The median animal length, m.
Definition SensorSilCam.h:302
double frameRate
The imaging rate, Hz.
Definition SensorSilCam.h:294
double sizeErrorStdRelative
Relative standard deviation of the sizing error.
Definition SensorSilCam.h:304
double sizeBinMin
The lower edge of the first bin, m.
Definition SensorSilCam.h:306
double lengthStdM
The standard deviation of the animal length, m.
Definition SensorSilCam.h:303
double assumedDetectionProbability
The detection probability the instrument divides by.
Definition SensorSilCam.h:299
double sizeBinMax
The upper edge of the last bin, m.
Definition SensorSilCam.h:307
unsigned int noiseSeed
The random seed; zero is deterministic and noise free.
Definition SensorSilCam.h:308
double captureEfficiency
Fraction of present animals carried through the volume.
Definition SensorSilCam.h:297
double detectionProbability
Probability an imaged animal is counted.
Definition SensorSilCam.h:298
double individualMassKg
The mass of one animal, kg.
Definition SensorSilCam.h:301
double sampleVolume[3]
The imaged volume side lengths, m.
Definition SensorSilCam.h:296
double falsePositiveRate
Expected spurious detections per frame.
Definition SensorSilCam.h:300