From 2d3fdc3cc1c2d682784bed895948411f7e00a73a Mon Sep 17 00:00:00 2001
From: Carl Philipp Klemm <philipp@uvos.xyz>
Date: Mon, 12 Jun 2023 16:29:07 +0200
Subject: [PATCH] improve error handling and filtering

---
 src/common.cpp  |   2 +-
 src/relaxis.cpp | 102 ++++++++++++++++++++++++++++++++++--------------
 2 files changed, 73 insertions(+), 31 deletions(-)

diff --git a/src/common.cpp b/src/common.cpp
index 40465cb..045efdc 100644
--- a/src/common.cpp
+++ b/src/common.cpp
@@ -22,7 +22,7 @@ bool saveData(const std::string& exportName, const ModelData& data, const std::f
 		++classIndex;
 	} while(std::filesystem::exists(outDir/filename));
 
-	if(!saveToDisk(data.data, outDir/filename, data.modelStr + ", " + data.id + ", \"" + std::string(originFile.filename()) + "\""))
+	if(!saveToDisk(eis::EisSpectra(data.data, data.modelStr, data.id + ", \"" + std::string(originFile.filename()) + "\""), outDir/filename))
 	{
 		std::cerr<<"Unable to save to "<<outDir/filename;
 		return false;
diff --git a/src/relaxis.cpp b/src/relaxis.cpp
index 070c0b2..826eb75 100644
--- a/src/relaxis.cpp
+++ b/src/relaxis.cpp
@@ -1,5 +1,7 @@
+#include <cmath>
 #include <eisgenerator/translators.h>
 #include <eisgenerator/eistype.h>
+#include <eisgenerator/model.h>
 #include <relaxisloaderpp/relaxisloaderpp.h>
 #include <iostream>
 #include <string>
@@ -40,50 +42,90 @@ int main(int argc, char** argv)
 	{
 		if(ignoreArgs.find(arg) != ignoreArgs.end())
 			continue;
-		rlx::File file(argv[arg]);
 
-		std::cout<<"Loaded "<<argv[arg]<<" file has "<<file.getProjectCount()<<" project(s)\n";
-
-		for(size_t i = 0; i < file.getProjectCount(); ++i)
+		try
 		{
-			try
+			rlx::File file(argv[arg]);
+			std::cout<<"Loaded "<<argv[arg]<<" file has "<<file.getProjectCount()<<" project(s)\n";
+
+			for(size_t i = 0; i < file.getProjectCount(); ++i)
 			{
-				rlx::Project project = file.getProject(i);
-				std::cout<<"Project "<<i<<" has "<<project.getSpectraCount()<<" spectra\n";
-				for(size_t j = 0; j < project.getSpectraCount(); ++j)
+				try
 				{
-					try
+					rlx::Project project = file.getProject(i);
+					std::cout<<"Project "<<i<<" has "<<project.getSpectraCount()<<" spectra\n";
+					for(size_t j = 0; j < project.getSpectraCount(); ++j)
 					{
-						rlx::Spectra spectra = project.getSpectra(j);
-						if(!spectra.fitted)
+						try
+						{
+							rlx::Spectra spectra = project.getSpectra(j);
+							if(!spectra.fitted)
+							{
+								std::cout<<"skipping spectra "<<spectra.id<<" as this spectra is not fitted\n";
+								continue;
+							}
+							if(spectra.model.empty())
+							{
+								std::cout<<"skipping spectra "<<spectra.id<<" as this spectra has no model\n";
+								continue;
+							}
+
+							std::cout<<spectra.model<<'\n';
+
+							std::vector<fvalue> omega(spectra.data.size());
+							for(size_t i = 0; i < spectra.data.size(); ++i)
+								omega[i] = spectra.data[i].omega;
+
+							eis::Model model(spectra.model);
+
+							std::vector<eis::DataPoint> genData = model.executeSweep(omega);
+
+							fvalue dist = eisNyquistDistance(spectra.data, genData);
+
+							if(std::isnan(dist))
+							{
+								std::cout<<"skipping spectra "<<spectra.id<<" as this spectra dosent appear to be fitted correctly dist is NAN!\n";
+								continue;
+							}
+							else if(std::isinf(dist) || dist > 2.0)
+							{
+								std::cout<<"skipping spectra "<<spectra.id<<" as this spectra dosent appear to be fitted correctly dist is too large\n";
+								continue;
+							}
+							else
+							{
+								std::cout<<"spectra "<<dist<<" away from theoretical values\n";
+							}
+
+							ModelData data;
+							data.data = spectra.data;
+							data.modelStr = spectra.model;
+							data.id = std::to_string(spectra.id);
+							saveData("relaxis", data, outDir, argv[arg]);
+						}
+						catch(const eis::file_error& err)
 						{
-							std::cout<<"skipping spectra "<<spectra.id<<" as this spectra is not fitted\n";
+							std::cerr<<"error spectra " <<j<<" from file "<<argv[arg]<<" librelaxisloaderpp: "<<err.what()<<std::endl;
 							continue;
 						}
-						if(spectra.model.empty())
+						catch(const eis::parse_errror& err)
 						{
-							std::cout<<"skipping spectra "<<spectra.id<<" as this spectra has no model\n";
+							std::cerr<<"error spectra " <<j<<" from file "<<argv[arg]<<' '<<err.what()<<std::endl;
 							continue;
 						}
-
-						ModelData data;
-						data.data = spectra.data;
-						data.modelStr = spectra.model;
-						data.id = std::to_string(spectra.id);
-						saveData("relaxis", data, outDir, argv[arg]);
-					}
-					catch(const eis::file_error& err)
-					{
-						std::cerr<<"error spectra " <<i<<" from file "<<argv[arg]<<" librelaxisloaderpp: "<<err.what()<<std::endl;
-						continue;
 					}
 				}
+				catch(const eis::file_error& err)
+				{
+					std::cerr<<"error reading file "<<argv[arg]<<" librelaxisloaderpp: "<<err.what()<<std::endl;
+					continue;
+				}
 			}
-			catch(const eis::file_error& err)
-			{
-				std::cerr<<"error reading file "<<argv[arg]<<" librelaxisloaderpp: "<<err.what()<<std::endl;
-				continue;
-			}
+		}
+		catch(const eis::file_error& err)
+		{
+			std::cout<<"Cant load "<<argv[arg]<<' '<<err.what()<<std::endl;
+			continue;
 		}
 	}
 	return 0;
-- 
GitLab