add support for whaterver maryam is useing
This commit is contained in:
		
							parent
							
								
									c78fa5bd42
								
							
						
					
					
						commit
						551e30b098
					
				
					 3 changed files with 71 additions and 144 deletions
				
			
		
							
								
								
									
										135
									
								
								src/main.cpp
									
										
									
									
									
								
							
							
						
						
									
										135
									
								
								src/main.cpp
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,135 +0,0 @@
 | 
			
		|||
#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");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										49
									
								
								src/maryam.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								src/maryam.cpp
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,49 @@
 | 
			
		|||
#include <iostream>
 | 
			
		||||
#include <filesystem>
 | 
			
		||||
#include <eisgenerator/translators.h>
 | 
			
		||||
#include <eisgenerator/eistype.h>
 | 
			
		||||
 | 
			
		||||
#include "csvBackend.h"
 | 
			
		||||
#include "common.h"
 | 
			
		||||
 | 
			
		||||
int main(int argc, char** argv)
 | 
			
		||||
{
 | 
			
		||||
	if(argc < 4)
 | 
			
		||||
	{
 | 
			
		||||
		std::cerr<<"Usage: "<<(argc > 0 ? argv[0] : "NULL")<<" [OUTDIR] [MODEL] [FILENAME(S)]\n";
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	std::filesystem::path outDir(argv[1]);
 | 
			
		||||
	if(!checkDir(outDir))
 | 
			
		||||
		return 1;
 | 
			
		||||
 | 
			
		||||
	try
 | 
			
		||||
	{
 | 
			
		||||
		for(int i = 3; i < argc; ++i)
 | 
			
		||||
		{
 | 
			
		||||
			io::CSVReader<3, io::trim_chars<' '>, io::no_quote_escape<'\t'>> csvFile(argv[i]);
 | 
			
		||||
			if(!csvFile.next_line())
 | 
			
		||||
				return 1;
 | 
			
		||||
 | 
			
		||||
			csvFile.read_header(io::ignore_extra_column, "Impedance Real part", "Impedance Imaginary Part", "Frequency [Hz]");
 | 
			
		||||
 | 
			
		||||
			std::string frequency;
 | 
			
		||||
			std::string real;
 | 
			
		||||
			std::string imaginary;
 | 
			
		||||
			ModelData data;
 | 
			
		||||
			data.modelStr = eis::relaxisToEis(argv[2]);
 | 
			
		||||
			data.id = std::to_string(i-3);
 | 
			
		||||
			while(csvFile.read_row(real, imaginary, frequency))
 | 
			
		||||
				data.data.push_back(eis::DataPoint(std::complex<fvalue>(std::stod(real), std::stod(imaginary)), std::stod(frequency)*2*M_PI));
 | 
			
		||||
 | 
			
		||||
			saveData("maryam", data, outDir, argv[i]);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	catch (const std::invalid_argument& err)
 | 
			
		||||
	{
 | 
			
		||||
		std::cerr<<"Could not read file "<<err.what();
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue