Resolve and execute attribution for a single grain.
485{
487
488 if (ctx.execution_metadata.contains("attribute_executor")) {
489 exec = safe_any_cast_or_default<AttributeExecutor>(
490 ctx.execution_metadata.at("attribute_executor"), nullptr);
491 }
492
493 if (!exec) {
494 if (
auto p = this->
get_parameter(
"attribute_executor"); p.has_value())
495 exec = safe_any_cast_or_default<AttributeExecutor>(p, nullptr);
496 }
497
498 if (exec) {
500 return exec(std::span<const double>(samples.data(), samples.size()), ctx);
501 }
502
503 const auto grain_variants = container->get_region_data(grain);
504
505 const std::string qualifier = [&]() -> std::string {
506 if (ctx.execution_metadata.contains("analyzer_qualifier")) {
507 return safe_any_cast_or_default<std::string>(
508 ctx.execution_metadata.at("analyzer_qualifier"), {});
509 }
511 return p.has_value() ? safe_any_cast_or_default<std::string>(p, {}) :
std::string {};
512 }();
513
515 if (ctx.execution_metadata.contains("analysis_type")) {
516 return safe_any_cast_or_default<AnalysisType>(
518 }
519
521 return p.has_value()
524 }();
525
526 std::shared_ptr<void> raw_analyzer;
527 if (ctx.execution_metadata.contains("analyzer")) {
528 raw_analyzer = safe_any_cast_or_default<std::shared_ptr<void>>(
529 ctx.execution_metadata.at("analyzer"), nullptr);
530 }
531
532 if (!raw_analyzer) {
534 raw_analyzer = safe_any_cast_or_default<std::shared_ptr<void>>(p, nullptr);
535 }
536
537 if (raw_analyzer) {
540 std::static_pointer_cast<VariantEnergyAnalyzer<>>(raw_analyzer)
541 ->analyze_energy(grain_variants),
542 qualifier);
543 }
544
547 std::static_pointer_cast<VariantStatisticalAnalyzer<>>(raw_analyzer)
548 ->analyze_statistics(grain_variants),
549 qualifier);
550 }
551 return 0.0;
552 }
553
557 }
558
562 }
563
564 return 0.0;
565}
EnergyAnalysis analyze_energy(const input_type &data)
Type-safe energy analysis method.
VariantEnergyAnalyzer m_energy_analyzer
VariantStatisticalAnalyzer m_stat_analyzer
StatisticalAnalysis analyze_statistics(const input_type &data)
Type-safe statistical analysis method.
std::any get_parameter(const std::string &name) const override
Retrieves a parameter's current value.
std::vector< double > extract_region_channel(const Region ®ion, const std::shared_ptr< SignalSourceContainer > &container, uint32_t channel)
Extract samples for a single channel within a Region from a container.
std::function< double(std::span< const double >, const ExecutionContext &)> AttributeExecutor
Span-level escape hatch for fully custom per-grain feature computation.
AnalysisType
Categories of analysis operations for discovery and organization.
@ FEATURE
Feature extraction and characterization.
@ STATISTICAL
Mean, variance, distribution analysis.
MAYAFLUX_API double extract_scalar_energy(const EnergyAnalysis &analysis, const std::string &qualifier)
Extract a named scalar from an EnergyAnalysis result.
MAYAFLUX_API double extract_scalar_statistics(const StatisticalAnalysis &analysis, const std::string &qualifier)
Extract a named scalar from a StatisticalAnalysis result.