• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

paulmthompson / WhiskerToolbox / 18914877332

29 Oct 2025 03:47PM UTC coverage: 73.148% (+0.1%) from 73.01%
18914877332

push

github

paulmthompson
added UI for interval peak detection

56798 of 77648 relevant lines covered (73.15%)

44492.79 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.98
/src/DataManager/transforms/ParameterFactory.cpp
1
#include "ParameterFactory.hpp"
2

3
#include "AnalogTimeSeries/AnalogFilter/analog_filter.hpp"
4
#include "AnalogTimeSeries/AnalogHilbertPhase/analog_hilbert_phase.hpp"
5
#include "AnalogTimeSeries/Analog_Event_Threshold/analog_event_threshold.hpp"
6
#include "AnalogTimeSeries/Analog_Interval_Peak/analog_interval_peak.hpp"
7
#include "AnalogTimeSeries/Analog_Interval_Threshold/analog_interval_threshold.hpp"
8
#include "AnalogTimeSeries/Analog_Scaling/analog_scaling.hpp"
9
#include "DigitalIntervalSeries/Digital_Interval_Group/digital_interval_group.hpp"
10
#include "DigitalIntervalSeries/Digital_Interval_Boolean/digital_interval_boolean.hpp"
11
#include "Lines/Line_Alignment/line_alignment.hpp"
12
#include "Lines/Line_Angle/line_angle.hpp"
13
#include "Lines/Line_Clip/line_clip.hpp"
14
#include "Lines/Line_Curvature/line_curvature.hpp"
15
#include "Lines/Line_Kalman_Grouping/line_kalman_grouping.hpp"
16
#include "Lines/Line_Min_Point_Dist/line_min_point_dist.hpp"
17
#include "Lines/Line_Point_Extraction/line_point_extraction.hpp"
18
#include "Lines/Line_Proximity_Grouping/line_proximity_grouping.hpp"
19
#include "Lines/Line_Resample/line_resample.hpp"
20
#include "Lines/Line_Subsegment/line_subsegment.hpp"
21
#include "Masks/Mask_Connected_Component/mask_connected_component.hpp"
22
#include "Masks/Mask_Median_Filter/mask_median_filter.hpp"
23
#include "Masks/Mask_Principal_Axis/mask_principal_axis.hpp"
24
#include "Masks/Mask_To_Line/mask_to_line.hpp"
25
#include "Media/whisker_tracing.hpp"
26

27
#include <iostream>
28

29
void ParameterFactory::registerParameterSetter(std::string const & transform_name,// NOLINT(bugprone-easily-swappable-parameters)
9,282✔
30
                                               std::string const & param_name,    // NOLINT(bugprone-easily-swappable-parameters)
31
                                               ParameterSetter setter) {
32
    setters_[transform_name][param_name] = std::move(setter);
9,282✔
33
}
9,282✔
34

35
bool ParameterFactory::setParameter(std::string const & transform_name,
545✔
36
                                    TransformParametersBase * param_obj,
37
                                    std::string const & param_name,
38
                                    nlohmann::json const & json_value,
39
                                    DataManager * data_manager) {
40
    auto transform_it = setters_.find(transform_name);
545✔
41
    if (transform_it == setters_.end()) {
545✔
42
        std::cerr << "No parameter setters registered for transform: " << transform_name << std::endl;
×
43
        return false;
×
44
    }
45

46
    auto param_it = transform_it->second.find(param_name);
545✔
47
    if (param_it == transform_it->second.end()) {
545✔
48
        std::cerr << "No setter registered for parameter '" << param_name
49
                  << "' in transform '" << transform_name << "'" << std::endl;
×
50
        return false;
×
51
    }
52

53
    return param_it->second(param_obj, json_value, data_manager);
545✔
54
}
55

56
ParameterFactory & ParameterFactory::getInstance() {
584✔
57
    static ParameterFactory instance;
584✔
58
    return instance;
584✔
59
}
60

61
void ParameterFactory::initializeDefaultSetters() {
91✔
62

63
    // ==================================================
64
    // =============== Analog Time Series ===============
65
    // ==================================================
66

67
    // =============== Filter ===============
68
    
69
    // Register filter_specification as a special nested JSON object
70
    registerParameterSetter("Filter", "filter_specification",
546✔
71
        [](TransformParametersBase * param_obj, nlohmann::json const & json_value, DataManager *) -> bool {
91✔
72
            auto * filterParams = static_cast<AnalogFilterParams *>(param_obj);
7✔
73
            
74
            try {
75
                // Parse the filter specification from JSON
76
                auto spec = FilterSpecification::fromJson(json_value);
7✔
77
                filterParams->filter_specification = std::move(spec);
6✔
78
                return true;
6✔
79
            } catch (std::exception const& e) {
1✔
80
                std::cerr << "Failed to parse filter specification: " << e.what() << std::endl;
1✔
81
                return false;
1✔
82
            }
1✔
83
        });
84

85
    // =============== Threshold Event Detection ===============
86

87
    registerBasicParameter<ThresholdParams, double>(
455✔
88
            "Threshold Event Detection", "threshold_value", &ThresholdParams::thresholdValue);
89

90
    std::unordered_map<std::string, ThresholdParams::ThresholdDirection> event_direction_map = {
91✔
91
            {"Positive (Rising)", ThresholdParams::ThresholdDirection::POSITIVE},
91✔
92
            {"Negative (Falling)", ThresholdParams::ThresholdDirection::NEGATIVE},
91✔
93
            {"Absolute (Magnitude)", ThresholdParams::ThresholdDirection::ABSOLUTE}};
728✔
94

95
    registerEnumParameter<ThresholdParams, ThresholdParams::ThresholdDirection>(
455✔
96
            "Threshold Event Detection", "direction", &ThresholdParams::direction, event_direction_map);
97

98
    registerBasicParameter<ThresholdParams, double>(
455✔
99
            "Threshold Event Detection", "lockout_time", &ThresholdParams::lockoutTime);
100

101
    // ============== Analog Interval Threshold ==============
102

103
    std::unordered_map<std::string, IntervalThresholdParams::ThresholdDirection> threshold_direction_map = {
91✔
104
            {"Positive (Rising)", IntervalThresholdParams::ThresholdDirection::POSITIVE},
91✔
105
            {"Negative (Falling)", IntervalThresholdParams::ThresholdDirection::NEGATIVE},
91✔
106
            {"Absolute (Magnitude)", IntervalThresholdParams::ThresholdDirection::ABSOLUTE}};
728✔
107

108
    registerEnumParameter<IntervalThresholdParams, IntervalThresholdParams::ThresholdDirection>(
455✔
109
            "Threshold Interval Detection", "direction", &IntervalThresholdParams::direction, threshold_direction_map);
110

111
    registerBasicParameter<IntervalThresholdParams, double>(
455✔
112
            "Threshold Interval Detection", "lockout_time", &IntervalThresholdParams::lockoutTime);
113

114
    registerBasicParameter<IntervalThresholdParams, double>(
455✔
115
            "Threshold Interval Detection", "min_duration", &IntervalThresholdParams::minDuration);
116

117
    registerBasicParameter<IntervalThresholdParams, double>(
455✔
118
            "Threshold Interval Detection", "threshold_value", &IntervalThresholdParams::thresholdValue);
119

120
    std::unordered_map<std::string, IntervalThresholdParams::MissingDataMode> missing_data_mode_map = {
91✔
121
            {"Zero", IntervalThresholdParams::MissingDataMode::TREAT_AS_ZERO},
91✔
122
            {"Ignore", IntervalThresholdParams::MissingDataMode::IGNORE}};
637✔
123
    registerEnumParameter<IntervalThresholdParams, IntervalThresholdParams::MissingDataMode>(
455✔
124
            "Threshold Interval Detection", "missing_data_mode", &IntervalThresholdParams::missingDataMode, missing_data_mode_map);
125

126
    // ================== Analog Hilbert Phase ==================
127

128
    registerBasicParameter<HilbertPhaseParams, size_t>(
455✔
129
            "Hilbert Phase", "discontinuity_threshold", &HilbertPhaseParams::discontinuityThreshold);
130

131
    std::unordered_map<std::string, HilbertPhaseParams::OutputType> hilbert_output_type_map = {
91✔
132
            {"Phase", HilbertPhaseParams::OutputType::Phase},
91✔
133
            {"Amplitude", HilbertPhaseParams::OutputType::Amplitude}};
637✔
134
    registerEnumParameter<HilbertPhaseParams, HilbertPhaseParams::OutputType>(
455✔
135
            "Hilbert Phase", "output_type", &HilbertPhaseParams::outputType, hilbert_output_type_map);
136

137
    // Windowed processing parameters for long signals
138
    registerBasicParameter<HilbertPhaseParams, size_t>(
455✔
139
            "Hilbert Phase", "max_chunk_size", &HilbertPhaseParams::maxChunkSize);
140
    registerBasicParameter<HilbertPhaseParams, double>(
455✔
141
            "Hilbert Phase", "overlap_fraction", &HilbertPhaseParams::overlapFraction);
142
    registerBasicParameter<HilbertPhaseParams, bool>(
455✔
143
            "Hilbert Phase", "use_windowing", &HilbertPhaseParams::useWindowing);
144

145
    // Bandpass filtering parameters
146
    registerBasicParameter<HilbertPhaseParams, bool>(
455✔
147
            "Hilbert Phase", "apply_bandpass_filter", &HilbertPhaseParams::applyBandpassFilter);
148
    registerBasicParameter<HilbertPhaseParams, double>(
455✔
149
            "Hilbert Phase", "filter_low_freq", &HilbertPhaseParams::filterLowFreq);
150
    registerBasicParameter<HilbertPhaseParams, double>(
455✔
151
            "Hilbert Phase", "filter_high_freq", &HilbertPhaseParams::filterHighFreq);
152
    registerBasicParameter<HilbertPhaseParams, int>(
455✔
153
            "Hilbert Phase", "filter_order", &HilbertPhaseParams::filterOrder);
154
    registerBasicParameter<HilbertPhaseParams, double>(
455✔
155
            "Hilbert Phase", "sampling_rate", &HilbertPhaseParams::samplingRate);
156

157
    // ================== Analog Scaling ==================
158

159
    std::unordered_map<std::string, ScalingMethod> scaling_method_map = {
91✔
160
            {"FixedGain", ScalingMethod::FixedGain},                // Multiply by constant factor
91✔
161
            {"ZScore", ScalingMethod::ZScore},                      // (x - mean) / std
91✔
162
            {"StandardDeviation", ScalingMethod::StandardDeviation},// Scale so X std devs = 1.0
91✔
163
            {"MinMax", ScalingMethod::MinMax},                      // Scale to [0, 1] range
91✔
164
            {"RobustScaling", ScalingMethod::RobustScaling},        // (x - median) / IQR
91✔
165
            {"UnitVariance", ScalingMethod::UnitVariance},          // Scale to unit variance (std = 1)
91✔
166
            {"Centering", ScalingMethod::Centering}                 // Subtract mean (center around 0)
91✔
167
    };
1,092✔
168
    registerEnumParameter<AnalogScalingParams, ScalingMethod>(
455✔
169
            "Scale and Normalize", "method", &AnalogScalingParams::method, scaling_method_map);
170

171
    registerBasicParameter<AnalogScalingParams, double>(
455✔
172
            "Scale and Normalize", "gain_factor", &AnalogScalingParams::gain_factor);
173

174
    registerBasicParameter<AnalogScalingParams, double>(
455✔
175
            "Scale and Normalize", "std_dev_target", &AnalogScalingParams::std_dev_target);
176

177
    registerBasicParameter<AnalogScalingParams, double>(
455✔
178
            "Scale and Normalize", "min_target", &AnalogScalingParams::min_target);
179

180
    registerBasicParameter<AnalogScalingParams, double>(
455✔
181
            "Scale and Normalize", "max_target", &AnalogScalingParams::max_target);
182

183
    registerBasicParameter<AnalogScalingParams, double>(
455✔
184
            "Scale and Normalize", "quantile_low", &AnalogScalingParams::quantile_low);
185

186
    registerBasicParameter<AnalogScalingParams, double>(
455✔
187
            "Scale and Normalize", "quantile_high", &AnalogScalingParams::quantile_high);
188

189
    // ================== Analog Interval Peak ==================
190

191
    std::unordered_map<std::string, IntervalPeakParams::PeakType> peak_type_map = {
91✔
192
            {"Maximum", IntervalPeakParams::PeakType::MAXIMUM},
91✔
193
            {"Minimum", IntervalPeakParams::PeakType::MINIMUM}};
637✔
194
    registerEnumParameter<IntervalPeakParams, IntervalPeakParams::PeakType>(
455✔
195
            "Interval Peak Detection", "peak_type", &IntervalPeakParams::peak_type, peak_type_map);
196

197
    std::unordered_map<std::string, IntervalPeakParams::SearchMode> search_mode_map = {
91✔
198
            {"Within Intervals", IntervalPeakParams::SearchMode::WITHIN_INTERVALS},
91✔
199
            {"Between Interval Starts", IntervalPeakParams::SearchMode::BETWEEN_INTERVAL_STARTS}};
637✔
200
    registerEnumParameter<IntervalPeakParams, IntervalPeakParams::SearchMode>(
455✔
201
            "Interval Peak Detection", "search_mode", &IntervalPeakParams::search_mode, search_mode_map);
202

203
    // Register interval_series as a special nested object
204
   registerDataParameter<IntervalPeakParams, DigitalIntervalSeries>(
455✔
205
           "Interval Peak Detection", "interval_series", &IntervalPeakParams::interval_series);
206

207

208
    // ====================================================
209
    // ============== Digital Interval Series =============
210
    // ====================================================
211

212
    // ================= Digital Interval Group ===============
213

214
    registerBasicParameter<GroupParams, double>(
455✔
215
            "Group Intervals", "max_spacing", &GroupParams::maxSpacing);
216

217
    // ================= Digital Interval Boolean ===============
218

219
    std::unordered_map<std::string, BooleanParams::BooleanOperation> boolean_operation_map = {
91✔
220
            {"AND", BooleanParams::BooleanOperation::AND},
91✔
221
            {"OR", BooleanParams::BooleanOperation::OR},
91✔
222
            {"XOR", BooleanParams::BooleanOperation::XOR},
91✔
223
            {"NOT", BooleanParams::BooleanOperation::NOT},
91✔
224
            {"AND_NOT", BooleanParams::BooleanOperation::AND_NOT}};
910✔
225

226
    registerEnumParameter<BooleanParams, BooleanParams::BooleanOperation>(
455✔
227
            "Boolean Operation", "operation", &BooleanParams::operation, boolean_operation_map);
228

229
    registerDataParameter<BooleanParams, DigitalIntervalSeries>(
455✔
230
            "Boolean Operation", "other_series", &BooleanParams::other_series);
231

232
    // ====================================================
233
    // ============== Line Series ==================
234
    // ====================================================
235

236
    // ================= Line Alignment ===============
237

238
    registerDataParameter<LineAlignmentParameters, MediaData>(
455✔
239
            "Line Alignment to Bright Features", "media_data", &LineAlignmentParameters::media_data);
240

241
    registerBasicParameter<LineAlignmentParameters, int>(
455✔
242
            "Line Alignment to Bright Features", "width", &LineAlignmentParameters::width);
243

244
    registerBasicParameter<LineAlignmentParameters, int>(
455✔
245
            "Line Alignment to Bright Features", "perpendicular_range", &LineAlignmentParameters::perpendicular_range);
246

247
    registerBasicParameter<LineAlignmentParameters, bool>(
455✔
248
            "Line Alignment to Bright Features", "use_processed_data", &LineAlignmentParameters::use_processed_data);
249

250
    std::unordered_map<std::string, FWHMApproach> fwhm_approach_map = {
91✔
251
            {"PEAK_WIDTH_HALF_MAX", FWHMApproach::PEAK_WIDTH_HALF_MAX},
91✔
252
            {"GAUSSIAN_FIT", FWHMApproach::GAUSSIAN_FIT},
91✔
253
            {"THRESHOLD_BASED", FWHMApproach::THRESHOLD_BASED}};
728✔
254
    registerEnumParameter<LineAlignmentParameters, FWHMApproach>(
455✔
255
            "Line Alignment to Bright Features", "approach", &LineAlignmentParameters::approach, fwhm_approach_map);
256

257
    std::unordered_map<std::string, LineAlignmentOutputMode> line_alignment_output_mode_map = {
91✔
258
            {"ALIGNED_VERTICES", LineAlignmentOutputMode::ALIGNED_VERTICES},
91✔
259
            {"FWHM_PROFILE_EXTENTS", LineAlignmentOutputMode::FWHM_PROFILE_EXTENTS}};
637✔
260
    registerEnumParameter<LineAlignmentParameters, LineAlignmentOutputMode>(
455✔
261
            "Line Alignment to Bright Features", "output_mode", &LineAlignmentParameters::output_mode, line_alignment_output_mode_map);
262

263

264
    // ==================== Line Angle ===============
265

266
    registerBasicParameter<LineAngleParameters, float>(
455✔
267
            "Calculate Line Angle", "position", &LineAngleParameters::position);
268

269
    std::unordered_map<std::string, AngleCalculationMethod> angle_calculation_method_map = {
91✔
270
            {"Direct Points", AngleCalculationMethod::DirectPoints},
91✔
271
            {"Polynomial Fit", AngleCalculationMethod::PolynomialFit}};
637✔
272

273
    registerEnumParameter<LineAngleParameters, AngleCalculationMethod>(
455✔
274
            "Calculate Line Angle", "method", &LineAngleParameters::method, angle_calculation_method_map);
275

276
    registerBasicParameter<LineAngleParameters, int>(
455✔
277
            "Calculate Line Angle", "polynomial_order", &LineAngleParameters::polynomial_order);
278

279
    registerBasicParameter<LineAngleParameters, float>(
455✔
280
            "Calculate Line Angle", "reference_x", &LineAngleParameters::reference_x);
281

282
    registerBasicParameter<LineAngleParameters, float>(
455✔
283
            "Calculate Line Angle", "reference_y", &LineAngleParameters::reference_y);
284

285
    // ==================== Line Clip ===============
286

287
    std::unordered_map<std::string, ClipSide> clip_side_map = {
91✔
288
            {"KeepBase", ClipSide::KeepBase},   // Keep the portion from line start to intersection
91✔
289
            {"KeepDistal", ClipSide::KeepDistal}// Keep the portion from intersection to line end
91✔
290
    };
637✔
291
    registerEnumParameter<LineClipParameters, ClipSide>(
455✔
292
            "Clip Line by Reference Line", "clip_side", &LineClipParameters::clip_side, clip_side_map);
293

294
    registerDataParameter<LineClipParameters, LineData>(
455✔
295
            "Clip Line by Reference Line", "reference_line_data", &LineClipParameters::reference_line_data);
296

297
    registerBasicParameter<LineClipParameters, int>(
455✔
298
            "Clip Line by Reference Line", "reference_frame", &LineClipParameters::reference_frame);
299

300

301
    // ==================== Line Curvature ===============
302

303
    registerBasicParameter<LineCurvatureParameters, float>(
455✔
304
            "Calculate Line Curvature", "position", &LineCurvatureParameters::position);
305

306
    std::unordered_map<std::string, CurvatureCalculationMethod> curvature_calculation_method_map = {
91✔
307
            {"PolynomialFit", CurvatureCalculationMethod::PolynomialFit}// Only method for now
91✔
308
    };
546✔
309
    registerEnumParameter<LineCurvatureParameters, CurvatureCalculationMethod>(
455✔
310
            "Calculate Line Curvature", "method", &LineCurvatureParameters::method, curvature_calculation_method_map);
311

312
    registerBasicParameter<LineCurvatureParameters, int>(
455✔
313
            "Calculate Line Curvature", "polynomial_order", &LineCurvatureParameters::polynomial_order);
314

315
    registerBasicParameter<LineCurvatureParameters, float>(
455✔
316
            "Calculate Line Curvature", "fitting_window_percentage", &LineCurvatureParameters::fitting_window_percentage);
317

318
    // ==================== Line Min Point Dist ===============
319

320
    registerDataParameter<LineMinPointDistParameters, PointData>(
455✔
321
            "Calculate Line to Point Distance", "point_data", &LineMinPointDistParameters::point_data);
322

323
    // ==================== Line Point Extraction ===============
324

325
    std::unordered_map<std::string, PointExtractionMethod> point_extraction_method_map = {
91✔
326
            {"Direct", PointExtractionMethod::Direct},       // Direct point selection based on indices
91✔
327
            {"Parametric", PointExtractionMethod::Parametric}// Use parametric polynomial interpolation
91✔
328
    };
637✔
329
    registerEnumParameter<LinePointExtractionParameters, PointExtractionMethod>(
455✔
330
            "Extract Point from Line", "method", &LinePointExtractionParameters::method, point_extraction_method_map);
331

332
    registerBasicParameter<LinePointExtractionParameters, float>(
455✔
333
            "Extract Point from Line", "position", &LinePointExtractionParameters::position);
334

335
    registerBasicParameter<LinePointExtractionParameters, int>(
455✔
336
            "Extract Point from Line", "polynomial_order", &LinePointExtractionParameters::polynomial_order);
337

338
    registerBasicParameter<LinePointExtractionParameters, bool>(
455✔
339
            "Extract Point from Line", "use_interpolation", &LinePointExtractionParameters::use_interpolation);
340

341
    // ==================== Line Resample ===============
342

343
    std::unordered_map<std::string, LineSimplificationAlgorithm> line_simplification_map = {
91✔
344
            {"Fixed Spacing", LineSimplificationAlgorithm::FixedSpacing},
91✔
345
            {"Douglas-Peucker", LineSimplificationAlgorithm::DouglasPeucker}};
637✔
346
    registerEnumParameter<LineResampleParameters, LineSimplificationAlgorithm>(
455✔
347
            "Resample Line", "algorithm", &LineResampleParameters::algorithm, line_simplification_map);
348

349
    registerBasicParameter<LineResampleParameters, float>(
455✔
350
            "Resample Line", "target_spacing", &LineResampleParameters::target_spacing);
351

352
    registerBasicParameter<LineResampleParameters, float>(
455✔
353
            "Resample Line", "epsilon", &LineResampleParameters::epsilon);
354

355
    // ==================== Line Subsegment ===============
356

357
    std::unordered_map<std::string, SubsegmentExtractionMethod> subsegment_extraction_method_map = {
91✔
358
            {"Direct", SubsegmentExtractionMethod::Direct},       // Direct point extraction based on indices
91✔
359
            {"Parametric", SubsegmentExtractionMethod::Parametric}// Use parametric polynomial interpolation
91✔
360
    };
637✔
361
    registerEnumParameter<LineSubsegmentParameters, SubsegmentExtractionMethod>(
455✔
362
            "Extract Line Subsegment", "method", &LineSubsegmentParameters::method, subsegment_extraction_method_map);
363

364
    registerBasicParameter<LineSubsegmentParameters, float>(
455✔
365
            "Extract Line Subsegment", "start_position", &LineSubsegmentParameters::start_position);
366

367
    registerBasicParameter<LineSubsegmentParameters, float>(
455✔
368
            "Extract Line Subsegment", "end_position", &LineSubsegmentParameters::end_position);
369

370
    registerBasicParameter<LineSubsegmentParameters, int>(
455✔
371
            "Extract Line Subsegment", "polynomial_order", &LineSubsegmentParameters::polynomial_order);
372

373
    registerBasicParameter<LineSubsegmentParameters, int>(
455✔
374
            "Extract Line Subsegment", "output_points", &LineSubsegmentParameters::output_points);
375

376
    registerBasicParameter<LineSubsegmentParameters, bool>(
455✔
377
            "Extract Line Subsegment", "preserve_original_spacing", &LineSubsegmentParameters::preserve_original_spacing);
378

379
    // ====================================================
380
    // ============== Mask Series ==================
381
    // ====================================================
382

383
    // ==================== Mask Area ===============
384
    // No parameters needed for mask area calculation
385

386
    // ==================== Mask Centroid ===============
387
    // No parameters needed for mask centroid calculation
388

389
    // ==================== Mask Connected Component ===============
390
    registerBasicParameter<MaskConnectedComponentParameters, int>(
455✔
391
            "Remove Small Connected Components", "threshold", &MaskConnectedComponentParameters::threshold);
392

393
    // ==================== Mask Hole Filling ===============
394
    // No parameters needed for mask hole filling calculation
395

396
    // ==================== Mask Median Filter ===============
397
    registerBasicParameter<MaskMedianFilterParameters, int>(
455✔
398
            "Apply Median Filter", "window_size", &MaskMedianFilterParameters::window_size);
399

400
    // ==================== Mask Principal Axis ===============
401
    std::unordered_map<std::string, PrincipalAxisType> principal_axis_type_map = {
91✔
402
            {"Major", PrincipalAxisType::Major},
91✔
403
            {"Minor", PrincipalAxisType::Minor}};
637✔
404

405
    registerEnumParameter<MaskPrincipalAxisParameters, PrincipalAxisType>(
455✔
406
            "Calculate Mask Principal Axis", "axis_type", &MaskPrincipalAxisParameters::axis_type, principal_axis_type_map);
407

408

409
    // ==================== Mask Skeletonize ===============
410
    // No parameters needed for mask skeletonize calculation
411

412
    // ==================== Mask To Line ===============
413

414
    std::unordered_map<std::string, LinePointSelectionMethod> line_point_selection_method_map = {
91✔
415
            {"NearestToReference", LinePointSelectionMethod::NearestToReference},
91✔
416
            {"Skeletonize", LinePointSelectionMethod::Skeletonize}};
637✔
417
    registerEnumParameter<MaskToLineParameters, LinePointSelectionMethod>(
455✔
418
            "Convert Mask To Line", "method", &MaskToLineParameters::method, line_point_selection_method_map);
419

420
    registerBasicParameter<MaskToLineParameters, float>(
455✔
421
            "Convert Mask To Line", "reference_x", &MaskToLineParameters::reference_x);
422

423
    registerBasicParameter<MaskToLineParameters, float>(
455✔
424
            "Convert Mask To Line", "reference_y", &MaskToLineParameters::reference_y);
425

426
    registerBasicParameter<MaskToLineParameters, int>(
455✔
427
            "Convert Mask To Line", "polynomial_order", &MaskToLineParameters::polynomial_order);
428

429
    registerBasicParameter<MaskToLineParameters, float>(
455✔
430
            "Convert Mask To Line", "error_threshold", &MaskToLineParameters::error_threshold);
431

432
    registerBasicParameter<MaskToLineParameters, bool>(
455✔
433
            "Convert Mask To Line", "remove_outliers", &MaskToLineParameters::remove_outliers);
434

435
    registerBasicParameter<MaskToLineParameters, int>(
455✔
436
            "Convert Mask To Line", "input_point_subsample_factor", &MaskToLineParameters::input_point_subsample_factor);
437

438
    registerBasicParameter<MaskToLineParameters, bool>(
455✔
439
            "Convert Mask To Line", "should_smooth_line", &MaskToLineParameters::should_smooth_line);
440

441
    registerBasicParameter<MaskToLineParameters, float>(
455✔
442
            "Convert Mask To Line", "output_resolution", &MaskToLineParameters::output_resolution);
443

444
    // ====================================================
445
    // ============== Media Series ==================
446
    // ====================================================
447

448
    // ==================== Whisker Tracing ===============
449

450
    registerBasicParameter<WhiskerTracingParameters, bool>(
455✔
451
            "Whisker Tracing", "use_processed_data", &WhiskerTracingParameters::use_processed_data);
452

453
    registerBasicParameter<WhiskerTracingParameters, int>(
455✔
454
            "Whisker Tracing", "clip_length", &WhiskerTracingParameters::clip_length);
455

456
    registerBasicParameter<WhiskerTracingParameters, float>(
455✔
457
            "Whisker Tracing", "whisker_length_threshold", &WhiskerTracingParameters::whisker_length_threshold);
458

459
    registerBasicParameter<WhiskerTracingParameters, int>(
455✔
460
            "Whisker Tracing", "batch_size", &WhiskerTracingParameters::batch_size);
461

462
    registerBasicParameter<WhiskerTracingParameters, bool>(
455✔
463
            "Whisker Tracing", "use_parallel_processing", &WhiskerTracingParameters::use_parallel_processing);
464

465
    registerBasicParameter<WhiskerTracingParameters, bool>(
455✔
466
            "Whisker Tracing", "use_mask_data", &WhiskerTracingParameters::use_mask_data);
467

468
    registerDataParameter<WhiskerTracingParameters, MaskData>(
455✔
469
            "Whisker Tracing", "mask_data", &WhiskerTracingParameters::mask_data);
470

471
    // ====================================================
472
    // ============== Grouping Operations =================
473
    // ====================================================
474

475
    // ==================== Line Proximity Grouping ===============
476
    registerBasicParameter<LineProximityGroupingParameters, float>(
455✔
477
            "Group Lines by Proximity", "distance_threshold", &LineProximityGroupingParameters::distance_threshold);
478

479
    registerBasicParameter<LineProximityGroupingParameters, float>(
455✔
480
            "Group Lines by Proximity", "position_along_line", &LineProximityGroupingParameters::position_along_line);
481

482
    registerBasicParameter<LineProximityGroupingParameters, bool>(
455✔
483
            "Group Lines by Proximity", "create_new_group_for_outliers", &LineProximityGroupingParameters::create_new_group_for_outliers);
484

485
    registerBasicParameter<LineProximityGroupingParameters, std::string>(
455✔
486
            "Group Lines by Proximity", "new_group_name", &LineProximityGroupingParameters::new_group_name);
487

488
    // ==================== Line Kalman Grouping ===============
489
    registerBasicParameter<LineKalmanGroupingParameters, double>(
455✔
490
            "Group Lines using Kalman Filtering", "dt", &LineKalmanGroupingParameters::dt);
491

492
    registerBasicParameter<LineKalmanGroupingParameters, double>(
455✔
493
            "Group Lines using Kalman Filtering", "process_noise_position", &LineKalmanGroupingParameters::process_noise_position);
494

495
    registerBasicParameter<LineKalmanGroupingParameters, double>(
455✔
496
            "Group Lines using Kalman Filtering", "process_noise_velocity", &LineKalmanGroupingParameters::process_noise_velocity);
497

498
    registerBasicParameter<LineKalmanGroupingParameters, double>(
455✔
499
            "Group Lines using Kalman Filtering", "static_feature_process_noise_scale", &LineKalmanGroupingParameters::static_feature_process_noise_scale);
500

501
    registerBasicParameter<LineKalmanGroupingParameters, double>(
455✔
502
            "Group Lines using Kalman Filtering", "measurement_noise_position", &LineKalmanGroupingParameters::measurement_noise_position);
503

504
    registerBasicParameter<LineKalmanGroupingParameters, double>(
455✔
505
            "Group Lines using Kalman Filtering", "measurement_noise_length", &LineKalmanGroupingParameters::measurement_noise_length);
506

507
    registerBasicParameter<LineKalmanGroupingParameters, bool>(
455✔
508
            "Group Lines using Kalman Filtering", "auto_estimate_static_noise", &LineKalmanGroupingParameters::auto_estimate_static_noise);
509

510
    registerBasicParameter<LineKalmanGroupingParameters, bool>(
455✔
511
            "Group Lines using Kalman Filtering", "auto_estimate_measurement_noise", &LineKalmanGroupingParameters::auto_estimate_measurement_noise);
512

513
    registerBasicParameter<LineKalmanGroupingParameters, double>(
455✔
514
            "Group Lines using Kalman Filtering", "static_noise_percentile", &LineKalmanGroupingParameters::static_noise_percentile);
515

516
    registerBasicParameter<LineKalmanGroupingParameters, double>(
455✔
517
            "Group Lines using Kalman Filtering", "initial_position_uncertainty", &LineKalmanGroupingParameters::initial_position_uncertainty);
518

519
    registerBasicParameter<LineKalmanGroupingParameters, double>(
455✔
520
            "Group Lines using Kalman Filtering", "initial_velocity_uncertainty", &LineKalmanGroupingParameters::initial_velocity_uncertainty);
521

522
    registerBasicParameter<LineKalmanGroupingParameters, bool>(
455✔
523
            "Group Lines using Kalman Filtering", "verbose_output", &LineKalmanGroupingParameters::verbose_output);
524

525
    // New: cheap linkage threshold exposed to UI
526
    registerBasicParameter<LineKalmanGroupingParameters, double>(
455✔
527
            "Group Lines using Kalman Filtering", "cheap_assignment_threshold", &LineKalmanGroupingParameters::cheap_assignment_threshold);
528

529
    // New: putative output control
530
    registerBasicParameter<LineKalmanGroupingParameters, bool>(
455✔
531
            "Group Lines using Kalman Filtering", "write_to_putative_groups", &LineKalmanGroupingParameters::write_to_putative_groups);
532
    registerBasicParameter<LineKalmanGroupingParameters, std::string>(
455✔
533
            "Group Lines using Kalman Filtering", "putative_group_prefix", &LineKalmanGroupingParameters::putative_group_prefix);
534
}
1,820✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc