Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 40 additions & 69 deletions tests/UnitTest_SA.cxx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "../Podd/FadcStandaloneAnalyzer.h"
#include "RtypesCore.h"
#include "waveformGenerator.h"
#include <catch2/catch_approx.hpp>
#include <catch2/catch_test_macros.hpp>
Expand All @@ -16,37 +17,33 @@ std::vector<Double_t> ToDoubleWave(const std::vector<Int_t> &wave) {
FADCConfig GetTestConfig() {
FADCConfig conf;
conf.fNPedestalSamples = 4;
conf.fSampThreshold = 50.0;
conf.fSampThreshold = 25.0;
conf.fNSB = 1;
conf.fNSA = 2;
conf.fNSA = 4;
conf.fNSAT = 1;
conf.fMaxNPulses = 3;
return conf;
}

// ─── Tests ───────────────────────────────────────────────────────────────────

TEST_CASE("WaveformAnalyzer correctly processes fADC data", "[analyzer]") {

// Waveform generator v2 tests
TEST_CASE(
"WaveformAnalyzer correctly processes waveforms generated by generator v2",
"[analyzer]") {
FadcStandaloneAnalyzer analyzer;
analyzer.setConfig(GetTestConfig());
FADCCalib calib = {0.2441, 4.0 / 50.0};
analyzer.setCalib(calib);

WaveformData wfData;
wfData.TotNSamples = 100;
wfData.InitPedSamples = 4;
wfData.Pedestal = 100;
wfData.PedRange = 4;
wfData.NPulses = 4;
wfData.PulseAmp = 300;
wfData.PulseWidth = 5;
wfData.PulseSeparation = 10;
const FADCConfig &conf = analyzer.getConfig();

// Keeping default values
WaveformParams wfParams;
DigitizerParams daqParams;

waveformGenerator gen;
gen.setWaveformData(wfData);
gen.setAnalyzer(analyzer); // inject same config so singleWaveIntegral uses
// identical FADCConfig
gen.setDetectorParams(wfParams);
gen.setDigitizerParams(daqParams);

SECTION("Empty waveform returns no pulses and doesn't crash") {
std::vector<Double_t> empty_wave;
Expand All @@ -61,69 +58,43 @@ TEST_CASE("WaveformAnalyzer correctly processes fADC data", "[analyzer]") {
REQUIRE(results.fNSampPulses == 0);
}

SECTION("Single pulse waveform is detected with a positive "
"pedestal-subtracted integral") {
std::vector<Int_t> int_wave = gen.singlePulseWaveform();
std::vector<Double_t> wave = ToDoubleWave(int_wave);

// --- FADCStandaloneAnalyzer result ---
auto results = analyzer.Analyze(wave, 1.0, 4.0);

// At least one pulse must be detected.
REQUIRE(results.fNSampPulses != 0);

// Pulse parameters using waveformGenerator class (for comparison)
gen.clearWaveformInfo();
gen.calcPulseParameters(int_wave);
const WaveformInfo &wfInfo = gen.getWaveformInfo();
REQUIRE(results.fSampPulseIntPedSub[0] ==
Catch::Approx(static_cast<Double_t>(wfInfo.PedSubIntegral[0]))
.margin(wfData.PedRange));
REQUIRE(results.fSampPulseAmp[0] ==
Catch::Approx(static_cast<Double_t>(wfInfo.PulseAmp[0]))
.margin(wfData.PedRange));

// std::cout << "\nSingle Pulse:\nPulse Time: From Waveform generator " <<
// wfInfo.PulseTime[0] << " from FADCStandaloneAnalyzer " <<
// results.fSampPulseTime[0] << "\n";
REQUIRE(results.fSampPulseTime[0] ==
Catch::Approx(static_cast<Double_t>(wfInfo.PulseTime[0]))
.margin(wfData.PedRange));
}

SECTION("Multiple pulse waveform is detected with a positive "
"pedestal-subtracted integral") {
std::vector<Int_t> int_wave = gen.multiplePulseWaveform();
SECTION("Generate exponential waveform") {
std::vector<Int_t> int_wave = gen.generateWaveform();
std::vector<Double_t> wave = ToDoubleWave(int_wave);

// --- FADCStandaloneAnalyzer result ---
auto results = analyzer.Analyze(wave, 1.0, 4.0);

// Output shouldn't be empty
REQUIRE(results.fNSampPulses >= 2);

REQUIRE(results.fNSampPulses >= 1);
// Pulse parameters using waveformGenerator class (for comparison)
gen.clearWaveformInfo();
gen.calcPulseParameters(int_wave);
const WaveformInfo &wfInfo = gen.getWaveformInfo();

// std::cout << "\nCalculated Integrals and times for Multiple Pulses:\n";
for (int i = 0; i < (int)wfInfo.PedSubIntegral.size(); i++) {
// std::cout << "\tPulse " << i + 1 << ": " << wfInfo.PedSubIntegral[i] <<
// std::endl;
// gen.clearTruthInfo();
const TruthPulseInfo &wfInfo = gen.getTruthInfo();

Double_t int_margin = (daqParams.noise_sigma) * (conf.fNSA + conf.fNSB) *
daqParams.sample_rate;
Double_t amp_margin = daqParams.noise_sigma * 2;
Double_t time_margin = 64.0 * (wfParams.tts_sigma / daqParams.sample_rate);

std::cout << "\nCalculated Integrals and times for Multiple Pulses:\n";
for (int i = 0; i < (int)wfInfo.pulseIntegral.size(); i++) {
std::cout << "\tPulse Number: " << i + 1 << std::endl;
std::cout << "\tPulse Integral: From Waveform generator: "
<< wfInfo.pulseIntegral[i] << " from FADCStandaloneAnalyzer "
<< results.fSampPulseIntPedSub[i] << std::endl;
REQUIRE(results.fSampPulseIntPedSub[i] ==
Catch::Approx(static_cast<Double_t>(wfInfo.PedSubIntegral[i]))
.margin(wfData.PedRange));
Catch::Approx(static_cast<Double_t>(wfInfo.pulseIntegral[i]))
.margin(int_margin));
REQUIRE(results.fSampPulseAmp[i] ==
Catch::Approx(static_cast<Double_t>(wfInfo.PulseAmp[i]))
.margin(wfData.PedRange));
Catch::Approx(static_cast<Double_t>(wfInfo.pulseAmplitude[i]))
.margin(amp_margin));

// std::cout << "\tPulse Time: From Waveform generator " <<
// wfInfo.PulseTime[i] << " from FADCStandaloneAnalyzer " <<
// results.fSampPulseTime[i] << "\n\n";
std::cout << "\tPulse Time: From Waveform generator "
<< wfInfo.pulseTime[i] << " from FADCStandaloneAnalyzer "
<< results.fSampPulseTime[i] << "\n\n";
REQUIRE(results.fSampPulseTime[i] ==
Catch::Approx(static_cast<Double_t>(wfInfo.PulseTime[i]))
.margin(wfData.PedRange));
Catch::Approx(static_cast<Double_t>(wfInfo.pulseTime[i]))
.margin(time_margin));
}
}
}
Loading