FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
SensorSilCam.h
1#pragma once
2
274#include "SampledSensor.h"
275
276#include <fhsim/simobject/SimObject.h>
277#include <string>
278#include <vector>
279
280namespace environment
281{
282class EnvironmentProvider;
283}
284
285class SensorSilCam : public SimObject
286{
287public:
289 struct Settings
290 {
291 double frameRate = 4.0;
293 double sampleVolume[3] = {0.040, 0.055, 0.065};
294 double captureEfficiency = 0.85;
295 double detectionProbability = 0.92;
297 double falsePositiveRate = 0.05;
298 double individualMassKg = 1.1e-6;
299 double lengthM = 0.0028;
300 double lengthStdM = 0.0007;
301 double sizeErrorStdRelative = 0.08;
302 int numSizeBins = 8;
303 double sizeBinMin = 0.0005;
304 double sizeBinMax = 0.0060;
305 unsigned int noiseSeed = 0;
306 };
307
310 {
311 double concentration = 0.0;
312 double numberConcentration = 0.0;
313 double count = 0.0;
314 double sizeMean = 0.0;
315 double sizeStd = 0.0;
316 std::vector<double> histogram;
317 double sampleTime = 0.0;
318 double position[3] = {0.0, 0.0, 0.0};
319 double valid = 0.0;
320 };
321
327 SensorSilCam(std::string simObjectName, ISimObjectCreator* creator);
328
340 SensorSilCam(std::string simObjectName, const Settings& settings);
341
347 static double SampleVolumeOf(const double sideLengths[3]);
348
357 static double FrameLambdaOf(double numberConcentration, double sampleVolume,
358 double captureEfficiency, double detectionProbability);
359
366 static double LengthLogSigmaOf(double medianLength, double stdLength);
367
376 static int BinIndexOf(double length, double binMin, double binMax, int numBins);
377
379 void OdeFcn(const double dT, const double* const adX, double* const adXDot) const override;
380
386 void AcceptedStep(const double dT, const double* const adX) override;
387
394 void FinalSetup(const double dT, const double* const adX, ISimObjectCreator* const creator) override;
395
406 int CaptureIfDue(double t, double numberConcentration, const double position[3]);
407
415 bool CaptureFrame(double t, double numberConcentration, const double position[3]);
416
418 const Measurement& HeldMeasurement() const { return m_held; }
419
421 const Settings& GetSettings() const { return m_settings; }
422
424 int FramesInWindow() const { return m_framesInWindow; }
425
427 long long FramesCaptured() const { return m_framesCaptured; }
428
430 double NextFrameTime() const { return m_sampler.NextSampleTime(); }
431
432protected:
434 const double* OutConcentration(const double dT, const double* const adX);
435
437 const double* OutNumberConcentration(const double dT, const double* const adX);
438
440 const double* OutCount(const double dT, const double* const adX);
441
443 const double* OutSizeMean(const double dT, const double* const adX);
444
446 const double* OutSizeStd(const double dT, const double* const adX);
447
449 const double* OutSizeHistogram(const double dT, const double* const adX);
450
452 const double* OutSampleTime(const double dT, const double* const adX);
453
455 const double* OutPosition(const double dT, const double* const adX);
456
458 const double* OutValid(const double dT, const double* const adX);
459
460private:
462 struct Window
463 {
464 double count = 0.0;
465 double sumLength = 0.0;
466 double sumLengthSq = 0.0;
467 std::vector<double> binCounts;
468 double sumTime = 0.0;
469 double sumPosition[3] = {0.0, 0.0, 0.0};
470 };
471
473 struct AnalyticParticle
474 {
475 double meanLength = 0.0;
476 double secondMoment = 0.0;
477 std::vector<double> binProbabilities;
478 };
479
481 void UpdateAnalyticParticle();
482
484 void ResetWindow();
485
490 void AccumulateAnalyticFrame(double lambda);
491
496 void AccumulateDrawnFrame(double lambda);
497
503 void AddParticle(double length, double weight);
504
506 void CloseWindow();
507
509 double DrawAnimalLength();
510
512 double DrawFalsePositiveLength();
513
515 double TotalLogSigma() const;
516
521 void AnalyticBinProbabilities(std::vector<double>& out) const;
522
529 double NumberConcentrationAt(double dT, const double position[3]) const;
530
531 SampledSensor m_sampler;
532 Settings m_settings;
533
534 std::string m_speciesFieldName;
535 std::string m_parameterLibrary;
536
537 bool m_individualMassGiven = false;
538
539 int m_speciesHandle = -1;
540
541 double m_sampleVolume = 0.0;
542
543 AnalyticParticle m_analytic;
544
545 Window m_window;
546 Measurement m_held;
547 int m_framesInWindow = 0;
548 long long m_framesCaptured = 0;
549};
Definition SampledSensor.h:49
double NextSampleTime() const
The time of the next sample, s.
Definition SampledSensor.h:129
Definition SensorSilCam.h:286
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:427
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:424
const Settings & GetSettings() const
The settings the instrument was built with.
Definition SensorSilCam.h:421
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:418
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:430
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:310
double count
The raw aggregated count.
Definition SensorSilCam.h:313
double sampleTime
The mid time of the window, s.
Definition SensorSilCam.h:317
double numberConcentration
The number concentration, individuals per m^3.
Definition SensorSilCam.h:312
double sizeMean
The mean measured length, m.
Definition SensorSilCam.h:314
double valid
One once a window has closed.
Definition SensorSilCam.h:319
double concentration
The mass concentration, kg/m^3.
Definition SensorSilCam.h:311
std::vector< double > histogram
The normalised size distribution.
Definition SensorSilCam.h:316
double position[3]
The mean sensor position over the window, m.
Definition SensorSilCam.h:318
double sizeStd
The standard deviation of the measured lengths, m.
Definition SensorSilCam.h:315
Everything that makes one silhouette camera out of the shared sensor machinery.
Definition SensorSilCam.h:290
int numSizeBins
The number of histogram bins.
Definition SensorSilCam.h:302
int framesPerOutput
Frames aggregated into one measurement.
Definition SensorSilCam.h:292
double lengthM
The median animal length, m.
Definition SensorSilCam.h:299
double frameRate
The imaging rate, Hz.
Definition SensorSilCam.h:291
double sizeErrorStdRelative
Relative standard deviation of the sizing error.
Definition SensorSilCam.h:301
double sizeBinMin
The lower edge of the first bin, m.
Definition SensorSilCam.h:303
double lengthStdM
The standard deviation of the animal length, m.
Definition SensorSilCam.h:300
double assumedDetectionProbability
The detection probability the instrument divides by.
Definition SensorSilCam.h:296
double sizeBinMax
The upper edge of the last bin, m.
Definition SensorSilCam.h:304
unsigned int noiseSeed
The random seed; zero is deterministic and noise free.
Definition SensorSilCam.h:305
double captureEfficiency
Fraction of present animals carried through the volume.
Definition SensorSilCam.h:294
double detectionProbability
Probability an imaged animal is counted.
Definition SensorSilCam.h:295
double individualMassKg
The mass of one animal, kg.
Definition SensorSilCam.h:298
double sampleVolume[3]
The imaged volume side lengths, m.
Definition SensorSilCam.h:293
double falsePositiveRate
Expected spurious detections per frame.
Definition SensorSilCam.h:297