From f82ff4ca4c2037313cf48a43b56baf481c642ecd Mon Sep 17 00:00:00 2001 From: Fayorg Date: Sat, 24 Feb 2024 14:23:08 +0100 Subject: [PATCH] add: finding zero + cleaning --- main.cpp | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/main.cpp b/main.cpp index 48c9d65..c004ed5 100644 --- a/main.cpp +++ b/main.cpp @@ -2,13 +2,95 @@ // Created by Elie Baier on 23.02.24. // +#include #include "iostream" +#include "string" +#include "fstream" +#include "sstream" #include "matplot/matplot.h" using namespace std; +namespace plt = matplot; + +int MIN_ZERO_SEPARATION = 10; + +vector findZeroCrossings(const std::vector& data) { + std::vector zeroCrossings; + for (int i = 1; i < data.size(); ++i) { + if (data[i - 1] * data[i] < 0 || data[i - 1] * data[i] == 0) { + + // Cleaning the duplicate zero which are +-MIN_ZERO_SEPARATION + if(zeroCrossings.size() >= 1) { + if(zeroCrossings[zeroCrossings.size() - 1] - MIN_ZERO_SEPARATION < i && zeroCrossings[zeroCrossings.size() - 1] + MIN_ZERO_SEPARATION > i) { + // cout << "Found duplicate zero: " << i << endl; + continue; + } + } + + zeroCrossings.push_back(i); + } + } + return zeroCrossings; +} int main() { - cout << "Hello World" << endl; + ifstream dataFile; + dataFile.open("/Users/eliebaier/Workspace/Physique/TP8/DATA/ALL0000/F0000CH1.CSV"); + if (!dataFile.is_open()) { + std::cerr << "Error opening file." << std::endl; + return 1; + } + + string line; + + // Skipping TEKTRONICS DEFINITION lines + for(auto i = 0; i < 18; i++) { + getline(dataFile, line); + } + + std::vector xData, yData; + while(getline(dataFile, line)) { + // Cleaning the lines + line.erase(0, 3); + line.erase(line.size() - 1, line.size()); + + std::string cleanedLine; + for (char c : line) { + if (std::isdigit(c) || c == '.' || c == ',') { + cleanedLine += c; + } + } + + double x, y; + istringstream iss(line); + char comma; + if (!(iss >> x >> comma >> y)) { + std::cerr << "Error parsing line: " << line << std::endl; + continue; + } + xData.push_back(x); + yData.push_back(y); + } + + dataFile.close(); + + plt::plot(xData, yData); + plt::xlabel("X Label"); + plt::ylabel("Y Label"); + plt::title("Line Plot"); + + vector zeroCrossings = findZeroCrossings(yData); + + // Drawing lines on the found zeros + for(auto zero : zeroCrossings) { + cout << "Zero: " << zero << endl; + plt::line(xData[zero], -2, xData[zero], 2); + } + + // Show the plot + plt::show(); + + return 0; } \ No newline at end of file