FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
SensorSilCam.h
1#pragma once
2
283#include "SampleClock.h"
284#include "SensorFrame.h"
285#include "SensorNoise.h"
286
287#include <fhsim/simobject/SimObject.h>
288#include <string>
289#include <vector>
290
291namespace environment
292{
293class EnvironmentProvider;
294}
295
296class SensorSilCam : public SimObject
297{
298public:
300 struct Settings
301 {
302 double frameRate = 4.0;
304 double sampleVolume[3] = {0.040, 0.055, 0.065};
305 double captureEfficiency = 0.85;
306 double detectionProbability = 0.92;
308 double falsePositiveRate = 0.05;
309 double individualMassKg = 1.1e-6;
310 double lengthM = 0.0028;
311 double lengthStdM = 0.0007;
312 double sizeErrorStdRelative = 0.08;
313 int numSizeBins = 8;
314 double sizeBinMin = 0.0005;
315 double sizeBinMax = 0.0060;
316 unsigned int noiseSeed = 0;
317 };
318
321 {
322 double concentration = 0.0;
323 double numberConcentration = 0.0;
324 double count = 0.0;
325 double sizeMean = 0.0;
326 double sizeStd = 0.0;
327 std::vector<double> histogram;
328 double sampleTime = 0.0;
329 double position[3] = {0.0, 0.0, 0.0};
330 double valid = 0.0;
331 };
332
338 SensorSilCam(std::string simObjectName, ISimObjectCreator* creator);
339
351 SensorSilCam(std::string simObjectName, const Settings& settings);
352
358 static double SampleVolumeOf(const double sideLengths[3]);
359
368 static double FrameLambdaOf(double numberConcentration, double sampleVolume,
369 double captureEfficiency, double detectionProbability);
370
377 static double LengthLogSigmaOf(double medianLength, double stdLength);
378
387 static int BinIndexOf(double length, double binMin, double binMax, int numBins);
388
390 void OdeFcn(const double dT, const double* const adX, double* const adXDot) const override;
391
397 void AcceptedStep(const double dT, const double* const adX) override;
398
405 void FinalSetup(const double dT, const double* const adX, ISimObjectCreator* const creator) override;
406
407#ifdef FH_VISUALIZATION
408 void RenderInit(Ogre::Root* const ogreRoot, ISimObjectCreator* const creator) override { }
409 void RenderUpdate(const double dT, const double* const adX) override { }
410#endif
411
422 int CaptureIfDue(double t, double numberConcentration, const double position[3]);
423
431 bool CaptureFrame(double t, double numberConcentration, const double position[3]);
432
434 const Measurement& HeldMeasurement() const { return m_held; }
435
437 const Settings& GetSettings() const { return m_settings; }
438
440 int FramesInWindow() const { return m_framesInWindow; }
441
443 long long FramesCaptured() const { return m_framesCaptured; }
444
446 double NextFrameTime() const { return m_frameClock.NextSampleTime(); }
447
448protected:
450 const double* OutConcentration(const double dT, const double* const adX);
451
453 const double* OutNumberConcentration(const double dT, const double* const adX);
454
456 const double* OutCount(const double dT, const double* const adX);
457
459 const double* OutSizeMean(const double dT, const double* const adX);
460
462 const double* OutSizeStd(const double dT, const double* const adX);
463
465 const double* OutSizeHistogram(const double dT, const double* const adX);
466
468 const double* OutSampleTime(const double dT, const double* const adX);
469
471 const double* OutPosition(const double dT, const double* const adX);
472
474 const double* OutValid(const double dT, const double* const adX);
475
476private:
478 struct Window
479 {
480 double count = 0.0;
481 double sumLength = 0.0;
482 double sumLengthSq = 0.0;
483 std::vector<double> binCounts;
484 double sumTime = 0.0;
485 double sumPosition[3] = {0.0, 0.0, 0.0};
486 };
487
489 void ResetWindow();
490
495 void AccumulateAnalyticFrame(double lambda);
496
501 void AccumulateDrawnFrame(double lambda);
502
508 void AddParticle(double length, double weight);
509
511 void CloseWindow();
512
514 double DrawAnimalLength();
515
517 double DrawFalsePositiveLength();
518
520 double TotalLogSigma() const;
521
526 void AnalyticBinProbabilities(std::vector<double>& out) const;
527
532 void ResolveEnvironment(ISimObjectCreator* const creator);
533
540 double NumberConcentrationAt(double dT, const double position[3]) const;
541
542 SensorFrame m_frame;
543 SampleClock m_frameClock;
544 SensorNoise m_noise;
545 Settings m_settings;
546
547 std::string m_name;
548 std::string m_speciesFieldName;
549
550 bool m_individualMassGiven = false;
551
552 environment::EnvironmentProvider* m_environment = nullptr;
553 int m_speciesHandle = -1;
554
555 bool m_hasPorts = false;
556
557 double m_sampleVolume = 0.0;
558
559 Window m_window;
560 Measurement m_held;
561 int m_framesInWindow = 0;
562 long long m_framesCaptured = 0;
563};
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:297
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:443
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:440
const Settings & GetSettings() const
The settings the instrument was built with.
Definition SensorSilCam.h:437
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:434
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:446
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:321
double count
The raw aggregated count.
Definition SensorSilCam.h:324
double sampleTime
The mid time of the window, s.
Definition SensorSilCam.h:328
double numberConcentration
The number concentration, individuals per m^3.
Definition SensorSilCam.h:323
double sizeMean
The mean measured length, m.
Definition SensorSilCam.h:325
double valid
One once a window has closed.
Definition SensorSilCam.h:330
double concentration
The mass concentration, kg/m^3.
Definition SensorSilCam.h:322
std::vector< double > histogram
The normalised size distribution.
Definition SensorSilCam.h:327
double position[3]
The mean sensor position over the window, m.
Definition SensorSilCam.h:329
double sizeStd
The standard deviation of the measured lengths, m.
Definition SensorSilCam.h:326
Everything that makes one silhouette camera out of the shared sensor machinery.
Definition SensorSilCam.h:301
int numSizeBins
The number of histogram bins.
Definition SensorSilCam.h:313
int framesPerOutput
Frames aggregated into one measurement.
Definition SensorSilCam.h:303
double lengthM
The median animal length, m.
Definition SensorSilCam.h:310
double frameRate
The imaging rate, Hz.
Definition SensorSilCam.h:302
double sizeErrorStdRelative
Relative standard deviation of the sizing error.
Definition SensorSilCam.h:312
double sizeBinMin
The lower edge of the first bin, m.
Definition SensorSilCam.h:314
double lengthStdM
The standard deviation of the animal length, m.
Definition SensorSilCam.h:311
double assumedDetectionProbability
The detection probability the instrument divides by.
Definition SensorSilCam.h:307
double sizeBinMax
The upper edge of the last bin, m.
Definition SensorSilCam.h:315
unsigned int noiseSeed
The random seed; zero is deterministic and noise free.
Definition SensorSilCam.h:316
double captureEfficiency
Fraction of present animals carried through the volume.
Definition SensorSilCam.h:305
double detectionProbability
Probability an imaged animal is counted.
Definition SensorSilCam.h:306
double individualMassKg
The mass of one animal, kg.
Definition SensorSilCam.h:309
double sampleVolume[3]
The imaged volume side lengths, m.
Definition SensorSilCam.h:304
double falsePositiveRate
Expected spurious detections per frame.
Definition SensorSilCam.h:308