inital commit
This commit is contained in:
		
						commit
						2665dc80ba
					
				
					 5 changed files with 1470 additions and 0 deletions
				
			
		
							
								
								
									
										26
									
								
								CMakeLists.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								CMakeLists.txt
									
										
									
									
									
										Normal 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
									
								
							
							
						
						
									
										1273
									
								
								src/csvBackend.h
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										135
									
								
								src/main.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								src/main.cpp
									
										
									
									
									
										Normal 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
									
								
							
							
						
						
									
										30
									
								
								src/tokenize.cpp
									
										
									
									
									
										Normal 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
									
								
							
							
						
						
									
										6
									
								
								src/tokenize.h
									
										
									
									
									
										Normal 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');
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue