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

paulmthompson / WhiskerToolbox / 18840223125

27 Oct 2025 12:01PM UTC coverage: 73.058% (+0.2%) from 72.822%
18840223125

push

github

paulmthompson
fix failing tests from table designer redesign

69 of 74 new or added lines in 2 files covered. (93.24%)

669 existing lines in 10 files now uncovered.

56029 of 76691 relevant lines covered (73.06%)

45039.63 hits per line

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

97.88
/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_Threshold/analog_interval_threshold.hpp"
7
#include "AnalogTimeSeries/Analog_Scaling/analog_scaling.hpp"
8
#include "DigitalIntervalSeries/Digital_Interval_Group/digital_interval_group.hpp"
9
#include "DigitalIntervalSeries/Digital_Interval_Boolean/digital_interval_boolean.hpp"
10
#include "Lines/Line_Alignment/line_alignment.hpp"
11
#include "Lines/Line_Angle/line_angle.hpp"
12
#include "Lines/Line_Clip/line_clip.hpp"
13
#include "Lines/Line_Curvature/line_curvature.hpp"
14
#include "Lines/Line_Kalman_Grouping/line_kalman_grouping.hpp"
15
#include "Lines/Line_Min_Point_Dist/line_min_point_dist.hpp"
16
#include "Lines/Line_Point_Extraction/line_point_extraction.hpp"
17
#include "Lines/Line_Proximity_Grouping/line_proximity_grouping.hpp"
18
#include "Lines/Line_Resample/line_resample.hpp"
19
#include "Lines/Line_Subsegment/line_subsegment.hpp"
20
#include "Masks/Mask_Connected_Component/mask_connected_component.hpp"
21
#include "Masks/Mask_Median_Filter/mask_median_filter.hpp"
22
#include "Masks/Mask_Principal_Axis/mask_principal_axis.hpp"
23
#include "Masks/Mask_To_Line/mask_to_line.hpp"
24
#include "Media/whisker_tracing.hpp"
25

26
#include <iostream>
27

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

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

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

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

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

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

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

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

84
    // =============== Threshold Event Detection ===============
85

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

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

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

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

100
    // ============== Analog Interval Threshold ==============
101

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

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

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

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

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

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

125
    // ================== Analog Hilbert Phase ==================
126

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

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

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

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

156
    // ================== Analog Scaling ==================
157

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

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

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

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

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

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

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

188
    // ====================================================
189
    // ============== Digital Interval Series =============
190
    // ====================================================
191

192
    // ================= Digital Interval Group ===============
193

194
    registerBasicParameter<GroupParams, double>(
455✔
195
            "Group Intervals", "max_spacing", &GroupParams::maxSpacing);
196

197
    // ================= Digital Interval Boolean ===============
198

199
    std::unordered_map<std::string, BooleanParams::BooleanOperation> boolean_operation_map = {
91✔
200
            {"AND", BooleanParams::BooleanOperation::AND},
91✔
201
            {"OR", BooleanParams::BooleanOperation::OR},
91✔
202
            {"XOR", BooleanParams::BooleanOperation::XOR},
91✔
203
            {"NOT", BooleanParams::BooleanOperation::NOT},
91✔
204
            {"AND_NOT", BooleanParams::BooleanOperation::AND_NOT}};
910✔
205

206
    registerEnumParameter<BooleanParams, BooleanParams::BooleanOperation>(
455✔
207
            "Boolean Operation", "operation", &BooleanParams::operation, boolean_operation_map);
208

209
    registerDataParameter<BooleanParams, DigitalIntervalSeries>(
455✔
210
            "Boolean Operation", "other_series", &BooleanParams::other_series);
211

212
    // ====================================================
213
    // ============== Line Series ==================
214
    // ====================================================
215

216
    // ================= Line Alignment ===============
217

218
    registerDataParameter<LineAlignmentParameters, MediaData>(
455✔
219
            "Line Alignment to Bright Features", "media_data", &LineAlignmentParameters::media_data);
220

221
    registerBasicParameter<LineAlignmentParameters, int>(
455✔
222
            "Line Alignment to Bright Features", "width", &LineAlignmentParameters::width);
223

224
    registerBasicParameter<LineAlignmentParameters, int>(
455✔
225
            "Line Alignment to Bright Features", "perpendicular_range", &LineAlignmentParameters::perpendicular_range);
226

227
    registerBasicParameter<LineAlignmentParameters, bool>(
455✔
228
            "Line Alignment to Bright Features", "use_processed_data", &LineAlignmentParameters::use_processed_data);
229

230
    std::unordered_map<std::string, FWHMApproach> fwhm_approach_map = {
91✔
231
            {"PEAK_WIDTH_HALF_MAX", FWHMApproach::PEAK_WIDTH_HALF_MAX},
91✔
232
            {"GAUSSIAN_FIT", FWHMApproach::GAUSSIAN_FIT},
91✔
233
            {"THRESHOLD_BASED", FWHMApproach::THRESHOLD_BASED}};
728✔
234
    registerEnumParameter<LineAlignmentParameters, FWHMApproach>(
455✔
235
            "Line Alignment to Bright Features", "approach", &LineAlignmentParameters::approach, fwhm_approach_map);
236

237
    std::unordered_map<std::string, LineAlignmentOutputMode> line_alignment_output_mode_map = {
91✔
238
            {"ALIGNED_VERTICES", LineAlignmentOutputMode::ALIGNED_VERTICES},
91✔
239
            {"FWHM_PROFILE_EXTENTS", LineAlignmentOutputMode::FWHM_PROFILE_EXTENTS}};
637✔
240
    registerEnumParameter<LineAlignmentParameters, LineAlignmentOutputMode>(
455✔
241
            "Line Alignment to Bright Features", "output_mode", &LineAlignmentParameters::output_mode, line_alignment_output_mode_map);
242

243

244
    // ==================== Line Angle ===============
245

246
    registerBasicParameter<LineAngleParameters, float>(
455✔
247
            "Calculate Line Angle", "position", &LineAngleParameters::position);
248

249
    std::unordered_map<std::string, AngleCalculationMethod> angle_calculation_method_map = {
91✔
250
            {"Direct Points", AngleCalculationMethod::DirectPoints},
91✔
251
            {"Polynomial Fit", AngleCalculationMethod::PolynomialFit}};
637✔
252

253
    registerEnumParameter<LineAngleParameters, AngleCalculationMethod>(
455✔
254
            "Calculate Line Angle", "method", &LineAngleParameters::method, angle_calculation_method_map);
255

256
    registerBasicParameter<LineAngleParameters, int>(
455✔
257
            "Calculate Line Angle", "polynomial_order", &LineAngleParameters::polynomial_order);
258

259
    registerBasicParameter<LineAngleParameters, float>(
455✔
260
            "Calculate Line Angle", "reference_x", &LineAngleParameters::reference_x);
261

262
    registerBasicParameter<LineAngleParameters, float>(
455✔
263
            "Calculate Line Angle", "reference_y", &LineAngleParameters::reference_y);
264

265
    // ==================== Line Clip ===============
266

267
    std::unordered_map<std::string, ClipSide> clip_side_map = {
91✔
268
            {"KeepBase", ClipSide::KeepBase},   // Keep the portion from line start to intersection
91✔
269
            {"KeepDistal", ClipSide::KeepDistal}// Keep the portion from intersection to line end
91✔
270
    };
637✔
271
    registerEnumParameter<LineClipParameters, ClipSide>(
455✔
272
            "Clip Line by Reference Line", "clip_side", &LineClipParameters::clip_side, clip_side_map);
273

274
    registerDataParameter<LineClipParameters, LineData>(
455✔
275
            "Clip Line by Reference Line", "reference_line_data", &LineClipParameters::reference_line_data);
276

277
    registerBasicParameter<LineClipParameters, int>(
455✔
278
            "Clip Line by Reference Line", "reference_frame", &LineClipParameters::reference_frame);
279

280

281
    // ==================== Line Curvature ===============
282

283
    registerBasicParameter<LineCurvatureParameters, float>(
455✔
284
            "Calculate Line Curvature", "position", &LineCurvatureParameters::position);
285

286
    std::unordered_map<std::string, CurvatureCalculationMethod> curvature_calculation_method_map = {
91✔
287
            {"PolynomialFit", CurvatureCalculationMethod::PolynomialFit}// Only method for now
91✔
288
    };
546✔
289
    registerEnumParameter<LineCurvatureParameters, CurvatureCalculationMethod>(
455✔
290
            "Calculate Line Curvature", "method", &LineCurvatureParameters::method, curvature_calculation_method_map);
291

292
    registerBasicParameter<LineCurvatureParameters, int>(
455✔
293
            "Calculate Line Curvature", "polynomial_order", &LineCurvatureParameters::polynomial_order);
294

295
    registerBasicParameter<LineCurvatureParameters, float>(
455✔
296
            "Calculate Line Curvature", "fitting_window_percentage", &LineCurvatureParameters::fitting_window_percentage);
297

298
    // ==================== Line Min Point Dist ===============
299

300
    registerDataParameter<LineMinPointDistParameters, PointData>(
455✔
301
            "Calculate Line to Point Distance", "point_data", &LineMinPointDistParameters::point_data);
302

303
    // ==================== Line Point Extraction ===============
304

305
    std::unordered_map<std::string, PointExtractionMethod> point_extraction_method_map = {
91✔
306
            {"Direct", PointExtractionMethod::Direct},       // Direct point selection based on indices
91✔
307
            {"Parametric", PointExtractionMethod::Parametric}// Use parametric polynomial interpolation
91✔
308
    };
637✔
309
    registerEnumParameter<LinePointExtractionParameters, PointExtractionMethod>(
455✔
310
            "Extract Point from Line", "method", &LinePointExtractionParameters::method, point_extraction_method_map);
311

312
    registerBasicParameter<LinePointExtractionParameters, float>(
455✔
313
            "Extract Point from Line", "position", &LinePointExtractionParameters::position);
314

315
    registerBasicParameter<LinePointExtractionParameters, int>(
455✔
316
            "Extract Point from Line", "polynomial_order", &LinePointExtractionParameters::polynomial_order);
317

318
    registerBasicParameter<LinePointExtractionParameters, bool>(
455✔
319
            "Extract Point from Line", "use_interpolation", &LinePointExtractionParameters::use_interpolation);
320

321
    // ==================== Line Resample ===============
322

323
    std::unordered_map<std::string, LineSimplificationAlgorithm> line_simplification_map = {
91✔
324
            {"Fixed Spacing", LineSimplificationAlgorithm::FixedSpacing},
91✔
325
            {"Douglas-Peucker", LineSimplificationAlgorithm::DouglasPeucker}};
637✔
326
    registerEnumParameter<LineResampleParameters, LineSimplificationAlgorithm>(
455✔
327
            "Resample Line", "algorithm", &LineResampleParameters::algorithm, line_simplification_map);
328

329
    registerBasicParameter<LineResampleParameters, float>(
455✔
330
            "Resample Line", "target_spacing", &LineResampleParameters::target_spacing);
331

332
    registerBasicParameter<LineResampleParameters, float>(
455✔
333
            "Resample Line", "epsilon", &LineResampleParameters::epsilon);
334

335
    // ==================== Line Subsegment ===============
336

337
    std::unordered_map<std::string, SubsegmentExtractionMethod> subsegment_extraction_method_map = {
91✔
338
            {"Direct", SubsegmentExtractionMethod::Direct},       // Direct point extraction based on indices
91✔
339
            {"Parametric", SubsegmentExtractionMethod::Parametric}// Use parametric polynomial interpolation
91✔
340
    };
637✔
341
    registerEnumParameter<LineSubsegmentParameters, SubsegmentExtractionMethod>(
455✔
342
            "Extract Line Subsegment", "method", &LineSubsegmentParameters::method, subsegment_extraction_method_map);
343

344
    registerBasicParameter<LineSubsegmentParameters, float>(
455✔
345
            "Extract Line Subsegment", "start_position", &LineSubsegmentParameters::start_position);
346

347
    registerBasicParameter<LineSubsegmentParameters, float>(
455✔
348
            "Extract Line Subsegment", "end_position", &LineSubsegmentParameters::end_position);
349

350
    registerBasicParameter<LineSubsegmentParameters, int>(
455✔
351
            "Extract Line Subsegment", "polynomial_order", &LineSubsegmentParameters::polynomial_order);
352

353
    registerBasicParameter<LineSubsegmentParameters, int>(
455✔
354
            "Extract Line Subsegment", "output_points", &LineSubsegmentParameters::output_points);
355

356
    registerBasicParameter<LineSubsegmentParameters, bool>(
455✔
357
            "Extract Line Subsegment", "preserve_original_spacing", &LineSubsegmentParameters::preserve_original_spacing);
358

359
    // ====================================================
360
    // ============== Mask Series ==================
361
    // ====================================================
362

363
    // ==================== Mask Area ===============
364
    // No parameters needed for mask area calculation
365

366
    // ==================== Mask Centroid ===============
367
    // No parameters needed for mask centroid calculation
368

369
    // ==================== Mask Connected Component ===============
370
    registerBasicParameter<MaskConnectedComponentParameters, int>(
455✔
371
            "Remove Small Connected Components", "threshold", &MaskConnectedComponentParameters::threshold);
372

373
    // ==================== Mask Hole Filling ===============
374
    // No parameters needed for mask hole filling calculation
375

376
    // ==================== Mask Median Filter ===============
377
    registerBasicParameter<MaskMedianFilterParameters, int>(
455✔
378
            "Apply Median Filter", "window_size", &MaskMedianFilterParameters::window_size);
379

380
    // ==================== Mask Principal Axis ===============
381
    std::unordered_map<std::string, PrincipalAxisType> principal_axis_type_map = {
91✔
382
            {"Major", PrincipalAxisType::Major},
91✔
383
            {"Minor", PrincipalAxisType::Minor}};
637✔
384

385
    registerEnumParameter<MaskPrincipalAxisParameters, PrincipalAxisType>(
455✔
386
            "Calculate Mask Principal Axis", "axis_type", &MaskPrincipalAxisParameters::axis_type, principal_axis_type_map);
387

388

389
    // ==================== Mask Skeletonize ===============
390
    // No parameters needed for mask skeletonize calculation
391

392
    // ==================== Mask To Line ===============
393

394
    std::unordered_map<std::string, LinePointSelectionMethod> line_point_selection_method_map = {
91✔
395
            {"NearestToReference", LinePointSelectionMethod::NearestToReference},
91✔
396
            {"Skeletonize", LinePointSelectionMethod::Skeletonize}};
637✔
397
    registerEnumParameter<MaskToLineParameters, LinePointSelectionMethod>(
455✔
398
            "Convert Mask To Line", "method", &MaskToLineParameters::method, line_point_selection_method_map);
399

400
    registerBasicParameter<MaskToLineParameters, float>(
455✔
401
            "Convert Mask To Line", "reference_x", &MaskToLineParameters::reference_x);
402

403
    registerBasicParameter<MaskToLineParameters, float>(
455✔
404
            "Convert Mask To Line", "reference_y", &MaskToLineParameters::reference_y);
405

406
    registerBasicParameter<MaskToLineParameters, int>(
455✔
407
            "Convert Mask To Line", "polynomial_order", &MaskToLineParameters::polynomial_order);
408

409
    registerBasicParameter<MaskToLineParameters, float>(
455✔
410
            "Convert Mask To Line", "error_threshold", &MaskToLineParameters::error_threshold);
411

412
    registerBasicParameter<MaskToLineParameters, bool>(
455✔
413
            "Convert Mask To Line", "remove_outliers", &MaskToLineParameters::remove_outliers);
414

415
    registerBasicParameter<MaskToLineParameters, int>(
455✔
416
            "Convert Mask To Line", "input_point_subsample_factor", &MaskToLineParameters::input_point_subsample_factor);
417

418
    registerBasicParameter<MaskToLineParameters, bool>(
455✔
419
            "Convert Mask To Line", "should_smooth_line", &MaskToLineParameters::should_smooth_line);
420

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

424
    // ====================================================
425
    // ============== Media Series ==================
426
    // ====================================================
427

428
    // ==================== Whisker Tracing ===============
429

430
    registerBasicParameter<WhiskerTracingParameters, bool>(
455✔
431
            "Whisker Tracing", "use_processed_data", &WhiskerTracingParameters::use_processed_data);
432

433
    registerBasicParameter<WhiskerTracingParameters, int>(
455✔
434
            "Whisker Tracing", "clip_length", &WhiskerTracingParameters::clip_length);
435

436
    registerBasicParameter<WhiskerTracingParameters, float>(
455✔
437
            "Whisker Tracing", "whisker_length_threshold", &WhiskerTracingParameters::whisker_length_threshold);
438

439
    registerBasicParameter<WhiskerTracingParameters, int>(
455✔
440
            "Whisker Tracing", "batch_size", &WhiskerTracingParameters::batch_size);
441

442
    registerBasicParameter<WhiskerTracingParameters, bool>(
455✔
443
            "Whisker Tracing", "use_parallel_processing", &WhiskerTracingParameters::use_parallel_processing);
444

445
    registerBasicParameter<WhiskerTracingParameters, bool>(
455✔
446
            "Whisker Tracing", "use_mask_data", &WhiskerTracingParameters::use_mask_data);
447

448
    registerDataParameter<WhiskerTracingParameters, MaskData>(
455✔
449
            "Whisker Tracing", "mask_data", &WhiskerTracingParameters::mask_data);
450

451
    // ====================================================
452
    // ============== Grouping Operations =================
453
    // ====================================================
454

455
    // ==================== Line Proximity Grouping ===============
456
    registerBasicParameter<LineProximityGroupingParameters, float>(
455✔
457
            "Group Lines by Proximity", "distance_threshold", &LineProximityGroupingParameters::distance_threshold);
458

459
    registerBasicParameter<LineProximityGroupingParameters, float>(
455✔
460
            "Group Lines by Proximity", "position_along_line", &LineProximityGroupingParameters::position_along_line);
461

462
    registerBasicParameter<LineProximityGroupingParameters, bool>(
455✔
463
            "Group Lines by Proximity", "create_new_group_for_outliers", &LineProximityGroupingParameters::create_new_group_for_outliers);
464

465
    registerBasicParameter<LineProximityGroupingParameters, std::string>(
455✔
466
            "Group Lines by Proximity", "new_group_name", &LineProximityGroupingParameters::new_group_name);
467

468
    // ==================== Line Kalman Grouping ===============
469
    registerBasicParameter<LineKalmanGroupingParameters, double>(
455✔
470
            "Group Lines using Kalman Filtering", "dt", &LineKalmanGroupingParameters::dt);
471

472
    registerBasicParameter<LineKalmanGroupingParameters, double>(
455✔
473
            "Group Lines using Kalman Filtering", "process_noise_position", &LineKalmanGroupingParameters::process_noise_position);
474

475
    registerBasicParameter<LineKalmanGroupingParameters, double>(
455✔
476
            "Group Lines using Kalman Filtering", "process_noise_velocity", &LineKalmanGroupingParameters::process_noise_velocity);
477

478
    registerBasicParameter<LineKalmanGroupingParameters, double>(
455✔
479
            "Group Lines using Kalman Filtering", "static_feature_process_noise_scale", &LineKalmanGroupingParameters::static_feature_process_noise_scale);
480

481
    registerBasicParameter<LineKalmanGroupingParameters, double>(
455✔
482
            "Group Lines using Kalman Filtering", "measurement_noise_position", &LineKalmanGroupingParameters::measurement_noise_position);
483

484
    registerBasicParameter<LineKalmanGroupingParameters, double>(
455✔
485
            "Group Lines using Kalman Filtering", "measurement_noise_length", &LineKalmanGroupingParameters::measurement_noise_length);
486

487
    registerBasicParameter<LineKalmanGroupingParameters, bool>(
455✔
488
            "Group Lines using Kalman Filtering", "auto_estimate_static_noise", &LineKalmanGroupingParameters::auto_estimate_static_noise);
489

490
    registerBasicParameter<LineKalmanGroupingParameters, bool>(
455✔
491
            "Group Lines using Kalman Filtering", "auto_estimate_measurement_noise", &LineKalmanGroupingParameters::auto_estimate_measurement_noise);
492

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

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

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

502
    registerBasicParameter<LineKalmanGroupingParameters, bool>(
455✔
503
            "Group Lines using Kalman Filtering", "verbose_output", &LineKalmanGroupingParameters::verbose_output);
504

505
    // New: cheap linkage threshold exposed to UI
506
    registerBasicParameter<LineKalmanGroupingParameters, double>(
455✔
507
            "Group Lines using Kalman Filtering", "cheap_assignment_threshold", &LineKalmanGroupingParameters::cheap_assignment_threshold);
508

509
    // New: putative output control
510
    registerBasicParameter<LineKalmanGroupingParameters, bool>(
455✔
511
            "Group Lines using Kalman Filtering", "write_to_putative_groups", &LineKalmanGroupingParameters::write_to_putative_groups);
512
    registerBasicParameter<LineKalmanGroupingParameters, std::string>(
455✔
513
            "Group Lines using Kalman Filtering", "putative_group_prefix", &LineKalmanGroupingParameters::putative_group_prefix);
514
}
1,638✔
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