inital commit

This commit is contained in:
Carl Philipp Klemm 2023-01-24 16:20:38 +01:00
commit 2665dc80ba
5 changed files with 1470 additions and 0 deletions

26
CMakeLists.txt Normal file
View File

@ -0,0 +1,26 @@
cmake_minimum_required(VERSION 3.0)
project(mdaptoeis)
set(SRC_FILES
src/main.cpp
src/tokenize.cpp
)
add_executable(${PROJECT_NAME} ${SRC_FILES})
target_link_libraries( ${PROJECT_NAME} -leisgenerator)
target_include_directories(${PROJECT_NAME} PRIVATE)
target_compile_options(${PROJECT_NAME} PRIVATE
"-Wall"
"-Wno-reorder"
"-Wfatal-errors"
"-ffast-math"
"-ftree-vectorize"
"-g"
"-fno-strict-aliasing"
)
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)

1273
src/csvBackend.h Normal file

File diff suppressed because it is too large Load Diff

135
src/main.cpp Normal file
View File

@ -0,0 +1,135 @@
#include <eisgenerator/translators.h>
#include <eisgenerator/eistype.h>
#include <iostream>
#include <string>
#include <vector>
#include <filesystem>
#include "csvBackend.h"
#include "tokenize.h"
struct ModelData
{
std::string modelStr;
std::string id;
size_t classNum;
size_t classIndex;
double temperature;
std::vector<eis::DataPoint> data;
};
void trimBrackets(std::string& str)
{
if(str[0] == '[')
str.erase(str.begin());
if(str.back() == ']')
str.pop_back();
}
std::vector<eis::DataPoint> parseEisDataFromMadapArrays(std::string& freqArray, std::string& realArray, std::string& imaginaryArray)
{
assert(realArray.size() > 2);
assert(imaginaryArray.size() > 2);
trimBrackets(realArray);
trimBrackets(imaginaryArray);
trimBrackets(freqArray);
std::vector<std::string> freqTokens = tokenize(freqArray, ',');
std::vector<std::string> realTokens = tokenize(realArray, ',');
std::vector<std::string> imaginaryTokens = tokenize(imaginaryArray, ',');
assert(realTokens.size() == freqTokens.size() && realTokens.size() == imaginaryTokens.size());
std::vector<eis::DataPoint> data;
data.reserve(freqTokens.size());
for(size_t i = 0; i < freqTokens.size(); ++i)
data.push_back(eis::DataPoint(std::complex<fvalue>(std::stod(realTokens[i]), std::stod(imaginaryTokens[i])), 2*M_PI*std::stod(freqTokens[i])));
std::sort(data.begin(), data.end(), [](const eis::DataPoint& a, const eis::DataPoint& b){return a.omega < b.omega;});
return data;
}
bool saveData(const ModelData& data, const std::filesystem::path& outDir)
{
std::filesystem::path filename("madapExport_");
std::string modelStrWithoutParams = data.modelStr;
eis::purgeEisParamBrackets(modelStrWithoutParams);
filename.concat(modelStrWithoutParams);
filename.concat("_");
filename.concat(std::to_string(data.classIndex));
filename.concat(".csv");
if(!saveToDisk(data.data, outDir/filename, data.modelStr + ", " + data.id + "@" + std::to_string(data.temperature)))
{
std::cerr<<"Unable to save to "<<outDir/filename;
return false;
}
return true;
}
bool checkDir(const std::filesystem::path& outDir)
{
if(!std::filesystem::is_directory(outDir))
{
if(!std::filesystem::create_directory(outDir))
{
std::cerr<<outDir<<" dose not exist and can not be created\n";
return false;
}
}
return true;
}
int main(int argc, char** argv)
{
if(argc < 2)
{
std::cerr<<"a file name is required\n";
return 1;
}
io::CSVReader<7, io::trim_chars<' ', '\t'>, io::no_quote_escape<';'>> csvFile(argv[1]);
csvFile.read_header(io::ignore_extra_column, "experimentID", "temperature", "frequency",
"real_impedance", "imaginary_impedance", "EIS_fittedParameters", "EIS_circuit");
if(!csvFile.next_line())
return 1;
if(!csvFile.next_line())
return 1;
std::string frequencyArray;
std::string realArray;
std::string imaginaryArray;
std::string paramArray;
std::string circutString;
std::string idStr;
double temperature;
std::vector<std::pair<std::string, size_t>> modelStrings;
if(!checkDir("./out"))
return 1;
while(csvFile.read_row(idStr, temperature, frequencyArray, realArray, imaginaryArray, paramArray, circutString))
{
ModelData data;
data.modelStr = eis::madapToEis(circutString, paramArray);
data.id = idStr;
auto iterator = std::find_if(modelStrings.begin(), modelStrings.end(),
[circutString](std::pair<std::string, size_t>& pair){return circutString == pair.first;});
if(iterator != modelStrings.end())
{
++iterator->second;
data.classIndex = iterator->second;
data.classNum = std::distance(modelStrings.begin(), iterator);
}
else
{
modelStrings.push_back(std::pair<std::string, size_t>(circutString, 0));
data.classIndex = 0;
data.classNum = modelStrings.size()-1;
std::cout<<"found "<<circutString<<" as new class "<<data.classNum<<'\n';
}
data.temperature = temperature;
data.data = parseEisDataFromMadapArrays(frequencyArray, realArray, imaginaryArray);
saveData(data, "./out");
}
}

30
src/tokenize.cpp Normal file
View File

@ -0,0 +1,30 @@
#include "tokenize.h"
std::vector<std::string> tokenize(const std::string& str, const char delim, const char ignBracketStart, const char ignBracketEnd)
{
std::stringstream ss(str);
std::vector<std::string> tokens;
std::string token;
size_t bracketCounter = 0;
for(char ch : str)
{
if(ch == delim && bracketCounter == 0)
{
tokens.push_back(token);
token.clear();
}
else
{
token.push_back(ch);
}
if(ignBracketStart == ch)
++bracketCounter;
else if(ignBracketEnd == ch)
--bracketCounter;
}
if(bracketCounter == 0)
tokens.push_back(token);
return tokens;
}

6
src/tokenize.h Normal file
View File

@ -0,0 +1,6 @@
#pragma once
#include <string>
#include <vector>
#include <sstream>
std::vector<std::string> tokenize(const std::string& str, const char delim = ' ', const char ignBracketStart = '\0', const char ignBracketEnd = '\0');