lammps/tools/xmgrace/lammpsplot.cpp

831 lines
27 KiB
C++

// By Vikas Varshney @ vv0210 at gmail dot com
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cstring>
#include <cctype>
#include <cstdlib>
#include <map>
#include <iomanip>
#include <algorithm>
#include <cmath>
using namespace std;
typedef vector<string> sentence;
typedef vector<sentence> filedata;
typedef string::size_type s_type;
vector<filedata> f;
class fd {
public:
string filename;
string property;
vector <float> value;
};
/* This function splits the sentence into array of strings separated by " "*/
sentence split(const string& s) {
sentence a;
s_type i=0;
while (i!=s.size()) {
while (i!=s.size() && isspace(s[i])) {
++i;
}
s_type j=i;
while (j!=s.size() && !isspace(s[j]))
++j;
if (i!=j) {
a.push_back(s.substr(i,j-i));
i=j;
}
}
return a;
}
/* This function add array of strings (passed as string) to a sentence */
sentence add_strings(sentence& temp_entry, const string l) {
sentence temp=split(l);
s_type mm;
if (temp.size()!=0)
for (mm=0;mm!=temp.size();mm++)
temp_entry.push_back(temp[mm]);
else
return temp_entry;
return temp_entry;
}
/* This function reads the logfile produced by lammps */
void readlogfile_multi(filedata& atemp, ifstream& input, int leave_index) {
const string ll("----------------");
const string step("Step");
const string Mem("Memory");
const string Loop("Loop");
int leave=0;
string line;
s_type kk=0,mm,kkk;
s_type length;
int style;
int halffile=0;
while (getline(input,line)) {
sentence entry=split(line);
if (entry.size()!=0)
// Find keyword Memory
if (!entry[0].compare(Mem)) {
getline(input,line);
entry=split(line);
// Style = 1 means multi line format and style = 2 means single line format
if (!entry[0].compare(ll)) style=1; else if (!entry[0].compare(step)) style=2; else cout << "style not matching" << endl;
switch (style) {
case 1: {
// Read the line till ll comes up next and store it in a variable.
sentence zero;
sentence one;
zero.push_back(entry[1]);
one.push_back(entry[2]);
getline(input,line);
entry=split(line);
do {
if (entry.size()!=0)
for(int i=0;i<entry.size();i+=3) {
zero.push_back(entry[i]);
one.push_back(entry[i+2]);
}
getline(input,line);
entry=split(line);
if (!entry[0].compare(Loop))
break;
}
while (entry[0].compare(ll));
if (!atemp.size())
atemp.push_back(zero);
atemp.push_back(one);
int length=zero.size();
int t=0;
// Read all the lines till Loop comes up.
while (entry[0].compare(Loop)) {
t++;
sentence a1;
a1.push_back(entry[2]);
for(int j=0;j<(length+1)/3;j++) {
if (!getline(input,line)) {
halffile=1;
break;
}
entry=split(line);
for(int i=0;i<entry.size();i+=3)
a1.push_back(entry[i+2]);
}
if (a1.size()==length)
atemp.push_back(a1);
if (halffile)
break;
if (!getline(input,line))
break;
else
entry=split(line);
}
break;
}
case 2:
{
sentence zero;
for(int i=0;i!=entry.size();i++)
zero.push_back(entry[i]);
getline(input,line);
entry=split(line);
if (!atemp.size())
atemp.push_back(zero);
int length=zero.size();
while(entry[0].compare(Loop)) {
sentence a1;
for(int i=0;i!=entry.size();i++)
a1.push_back(entry[i]);
atemp.push_back(a1);
getline(input,line);
entry=split(line);
if (entry.size()<length) break;
}
break;
}
}
if (leave_index>leave) {
atemp.clear();
leave++;
}
}
}
}
/* This function1 searches for a string in a sentence and return true/false*/
bool search_string(string str, sentence sen, int& j) {
j=0;
while (j!=sen.size()) {
if (!sen[j].compare(str)) {
break;
}
j++;
}
if (j==sen.size()) return false; else return true;
}
/* This function is used to ask user to input parameters to be plotted*/
sentence get_userinput() {
string temp;
sentence t;
cout << "Enter the parameter(s) of which you want the plot for files, read successfully:" << endl;
getline(cin,temp);
t=split(temp);
if (!t[1].compare("cross"))
if (t.size()!=4) {
cout << "Currently only two cross parameters can be plotted \nThe syntax is s/p cross param1 param2\n" << endl;
exit(1);
}
return t;
}
/*This function replaces certain input keywords to their appropriate words found in lammps file*/
void transform_userinput(sentence& temp) {
if (temp.size()) {
for(int i=1;i!=temp.size();i++) {
if (!temp[i].compare("t")) temp[i].replace(0,temp[i].length(),"Temp");
if (!temp[i].compare("p")) temp[i].replace(0,temp[i].length(),"Press");
if (!temp[i].compare("v")) temp[i].replace(0,temp[i].length(),"Volume");
if (!temp[i].compare("vd")) temp[i].replace(0,temp[i].length(),"E_vdwl");
if (!temp[i].compare("te")) temp[i].replace(0,temp[i].length(),"TotEng");
if (!temp[i].compare("ke")) temp[i].replace(0,temp[i].length(),"KinEng");
if (!temp[i].compare("pe")) temp[i].replace(0,temp[i].length(),"PotEng");
if (!temp[i].compare("be")) temp[i].replace(0,temp[i].length(),"E_bond");
if (!temp[i].compare("ae")) temp[i].replace(0,temp[i].length(),"E_angle");
if (!temp[i].compare("de")) temp[i].replace(0,temp[i].length(),"E_dihed");
if (!temp[i].compare("ce")) temp[i].replace(0,temp[i].length(),"E_coul");
if (!temp[i].compare("le")) temp[i].replace(0,temp[i].length(),"E_long");
}
}
}
/* This function searches if the parameter is present in the lammps file and return a array of
associated with the parameter stored in string */
map<string, vector<int> > update2_userinput(sentence temp) {
if ((!temp[0].compare("s")) || (!temp[0].compare("p"))) {
s_type j;
int jtemp;
int notfind;
int notfindall=1;
map<string, vector<int> > ret;
sentence::iterator tb=temp.begin();
for(j=0;j!=f.size();j++)
ret[*tb].push_back(0);
tb++;
for(sentence::iterator aa=tb; aa!=temp.end(); aa++) {
notfind=1;
for(j=0;j!=f.size();j++) {
if (search_string(*aa,f[j][0],jtemp)) {
ret[*aa].push_back(jtemp);
notfind=0;
notfindall=0;
}
else
ret[*aa].push_back(0);
}
if (notfind) {
temp.erase(aa);
aa--;
}
}
if (notfindall) {
cerr << "\nDid not find any matching parameters in any input files, read successfully. Please check!!!\n\n";
exit(1);
}
return ret;
}
else {
cerr << "\nFirst string should be s (for series) or p (for parallel)\n\n" << endl;
exit(1);
}
}
/* This function just print out a line with string str on standard output*/
void print_line(string str) {
for(int i=0;i<100;i++)
cout << str;
cout << endl;
}
/*This function reads the data from the input files*/
void read_input(int argc, char** argv, sentence& sf,string& analysisfile) {
filedata a;
int success_filecounter=0;
int leave_index=0;
// Read the data into the file.
for (int i=1; i<argc; ++i) {
if (!strcmp(argv[i],"-leave")) {
leave_index=atoi(argv[i+1]);
i++;
continue;
}
if (!strcmp(argv[i],"-analysis")) {
analysisfile=argv[i+1];
i++;
continue;
}
ifstream in(argv[i]);
if (in) {
sf.push_back(argv[i]);
cout << "Reading file : " << argv[i] << endl;
if (a.size())
a.clear();
readlogfile_multi(a,in,leave_index);
f.push_back(a);
in.close();
success_filecounter++;
} else {
cerr << "Cannot open file: " << argv[i] << endl;
}
}
if(!success_filecounter)
exit(1);
else {
sentence aa;
int exists;
cout << endl;
cout << "Select parameters to plot from following: --- " << endl;
for (int i=0;i<success_filecounter;i++) {
for(int j=0;j<f[i][0].size();j++) {
exists=0;
for(int k=0;k!=aa.size();k++)
if (!f[i][0][j].compare(aa[k])) {
exists=1;
break;
}
if (!exists)
aa.push_back(f[i][0][j]);
}
}
for(int k=0;k!=aa.size();k++) {
if (!aa[k].compare("Temp")) aa[k].replace(0,aa[k].length(),"Temp(t)");
if (!aa[k].compare("Press")) aa[k].replace(0,aa[k].length(),"Press(p)");
if (!aa[k].compare("Volume")) aa[k].replace(0,aa[k].length(),"Volume(v)");
if (!aa[k].compare("E_vdwl")) aa[k].replace(0,aa[k].length(),"E_vdwl(vd)");
if (!aa[k].compare("TotEng")) aa[k].replace(0,aa[k].length(),"TotEng(te)");
if (!aa[k].compare("KinEng")) aa[k].replace(0,aa[k].length(),"KinEng(ke)");
if (!aa[k].compare("PotEng")) aa[k].replace(0,aa[k].length(),"PotEng(pe)");
if (!aa[k].compare("E_bond")) aa[k].replace(0,aa[k].length(),"E_bond(be)");
if (!aa[k].compare("E_angle")) aa[k].replace(0,aa[k].length(),"E_angle(ae)");
if (!aa[k].compare("E_dihed")) aa[k].replace(0,aa[k].length(),"E_dihed(de)");
if (!aa[k].compare("E_coul")) aa[k].replace(0,aa[k].length(),"E_coul(ce)");
if (!aa[k].compare("E_long")) aa[k].replace(0,aa[k].length(),"E_long(le)");
cout << aa[k];
if (aa[k].size()<8) cout << "\t";
cout << "\t";
if (k%6==5) cout << endl;
}
cout << "\n--------------\n\n";
cout << "Please enter your parameters in the following format: --- " << endl;
cout << "1. First string should be 'p' or 's' for plotting parameters from different files in parallel or series" << endl;
cout << "2. Please enter one or more parameters listed above after entering the first string." << endl;
cout << "3. For certain parameters, short forms may be used as listed in bracket above" << endl;
cout << " ----- Example: To plot total energy, please type 'p te'." << endl;
cout << "4. In order to plot one parameter with respect to other, please type 'cross' after p/s followed by two parameters" << endl;
cout << "5. The independent parameter could be 'Step' as mentioned above." << endl;
cout << "6. Currently, only two parameters can be plotted with respect to each other." << endl;
cout << " ----- Example: To plot temperature vs. pressure p cross t p" << endl ;
cout << "--------------\n\n";
cout << "For analysis, please exit and use -analysis flag with filename. The file should contain atleast one of these commands: --- " << endl;
cout << "1. average all/single_filename startvalue(start) endvalue(end)" << endl;
cout << "2. scale filename property factor" << endl;
cout << "3. inverse filename property" << endl;
cout << "4. write Under Coding" << endl;
cout << "5. subtract property1 property2 filename outputpropertyname" << endl;
cout << "6. add Under Coding" << endl;
cout << "--------------\n\n";
}
}
string print_space(int t) {
string f;
for (int i=0;i!=t;i++)
f.push_back(' ');
return f;
}
/*This function prints out the parameter associated index in successfully read file */
void print_file_index_output(sentence s, map<string, vector<int> > x, sentence sf) {
size_t maxlen=0;
for(int i=0;i!=sf.size();i++)
maxlen=max(maxlen,sf[i].length());
cout << print_space(maxlen+11);
for(sentence::iterator aa=++s.begin(); aa!=s.end(); aa++)
cout << *aa << "\t";
cout << endl;
for(int j=0;j!=f.size();j++) {
cout << "File-> " << sf[j] << print_space(maxlen-sf[j].length()+1) <<": ";
for(sentence::iterator aa=++s.begin(); aa!=s.end(); aa++) {
cout << x[*aa][j] << "\t";
}
cout << endl;
}
}
void plot_xmgrace(sentence s, vector <fd> data) {
ofstream out("temp");
// Some string definitions
string s1 = "@ s";
string s2 = " comment ";
string s3 = " legend ";
int plotiterator=0; int set; int style;
int half_data=data.size()/2;
// Printing out X and Y axis properties
out << "@ xaxis label char size 1.500000\n";
out << "@ xaxis ticklabel char size 1.250000\n";
if (s[1].compare("cross"))
out << "@ xaxis label " << "\"time\""<< endl;
else
out << "@ xaxis label " << "\"" << s[2] << "\""<< endl;
out << "@ yaxis label char size 1.500000\n";
out << "@ yaxis ticklabel char size 1.250000\n";
// Printing out legend properties
out << "@ legend box linestyle 0\n";
out << "@ legend 0.25, 0.8\n";
// Selecting style for series or parallel plotting.
if (!s[0].compare("s")) style=1; else style=2;
if (s[1].compare("cross")) {
if (s.size()==2) {
out << "@ yaxis label " << "\"";
for(int i=1;i!=s.size();i++)
out << s[i] << " ";
out << "\""<< endl;
}
}
else
out << "@ yaxis label " << "\"" << s[3] << "\""<< endl;
int length=data.size();
if (!s[1].compare("cross")) length/=2;
// Storing data in file "temp" as asked (series or parallel)
for(int i=0;i!=length;i++) {
switch (style) {
case 1: { // Series Case
if (s[1].compare("cross")) { // This is executed if not cross
out << s1 << plotiterator << s2 << "\""<< data[i].property << "\"" << endl;
out << s1 << plotiterator << s3 << "\""<< data[i].property << "\"" << endl;
}
else
{
out << s1 << plotiterator << s2 << "\""<< data[i+half_data].property << " vs " << data[i].property << "\"" << endl;
out << s1 << plotiterator << s3 << "\""<< data[i+half_data].property << " vs " << data[i].property << "\"" << endl;
}
out << s1 << plotiterator << " symbol 1" << endl;
out << s1 << plotiterator << " symbol size 0.50000" << endl;
out << s1 << plotiterator << " symbol color 1" << endl;
out << s1 << plotiterator << " symbol pattern 1" << endl;
out << s1 << plotiterator << " symbol fill color "<< plotiterator+1 << endl;
out << s1 << plotiterator << " symbol fill pattern 1" << endl;
out << s1 << plotiterator << " symbol linewidth 1.0" << endl;
out << s1 << plotiterator << " symbol linestyle 1" << endl;
out << s1 << plotiterator << " symbol char 65" << endl;
out << s1 << plotiterator << " symbol char font 0" << endl;
plotiterator++;
for(int j=0;j!=data[i].value.size(); j++)
if (s[1].compare("cross"))
out << data[i].value[j] << endl; // This is executed if not cross
else
out << data[i].value[j] << " " << data[i+half_data].value[j]<< endl; // This is executed if cross
out << "&" << endl;
break;
}
case 2: { // Parallel Case
if (s[1].compare("cross")) {
out << s1 << plotiterator << s2 << "\""<< data[i].property << ": " << data[i].filename << "\"" << endl;
if (s.size()<=2)
out << s1 << plotiterator << s3 << "\"" << data[i].filename << "\"" << endl;
else
out << s1 << plotiterator << s3 << "\""<< data[i].property << ": " << data[i].filename << "\"" << endl;
}
else {
out << s1 << plotiterator << s2 << "\""<< data[i+half_data].property << " vs " << data[i].property << ": " << data[i].filename << "\"" << endl;
out << s1 << plotiterator << s3 << "\""<< data[i+half_data].property << " vs " << data[i].property << ": " << data[i].filename << "\"" << endl;
}
out << s1 << plotiterator << " symbol 0" << endl;
out << s1 << plotiterator << " symbol size 0.50000" << endl;
out << s1 << plotiterator << " symbol color 1" << endl;
out << s1 << plotiterator << " symbol pattern 1" << endl;
out << s1 << plotiterator << " symbol fill color "<< plotiterator+1 << endl;
out << s1 << plotiterator << " symbol fill pattern 1" << endl;
out << s1 << plotiterator << " symbol linewidth 1.0" << endl;
out << s1 << plotiterator << " symbol linestyle 1" << endl;
out << s1 << plotiterator << " symbol char 65" << endl;
out << s1 << plotiterator << " symbol char font 0" << endl;
plotiterator++;
for(int j=0;j!=data[i].value.size(); j++)
if (s[1].compare("cross")) {
out << data[i].value[j] << endl; // This is executed if not cross
}
else
out << data[i].value[j] << " " << data[i+half_data].value[j]<< endl; // This is executed if cross
out << "&" << endl;
break;
}
}
}
int rv=system("xmgrace temp &");
}
void plot_xmgrace_cross(sentence s, vector <fd> data) {
ofstream out("temp");
// Some string definitions
string s1 = "@ s";
string s2 = " comment ";
string s3 = " legend ";
int plotiterator=0; int set; int style;
int half_data=data.size()/2;
// Printing out X and Y axis properties
out << "@ xaxis label char size 1.500000\n";
out << "@ xaxis ticklabel char size 1.250000\n";
out << "@ xaxis label " << "\"" << s[2] << "\""<< endl;
out << "@ yaxis label char size 1.500000\n";
out << "@ yaxis ticklabel char size 1.250000\n";
out << "@ yaxis label " << "\"" << s[3] << "\""<< endl;
// Printing out legend properties
out << "@ legend box linestyle 0\n";
out << "@ legend 0.25, 0.8\n";
// Selecting style for series or parallel plotting.
if (!s[0].compare("s")) style=1; else style=2;
// Storing data in file "temp" as asked (series or parallel)
for(int i=0;i!=data.size()/2;i++) {
switch (style) {
case 1: { // Series Case
out << s1 << plotiterator << s2 << "\""<< data[i+half_data].property << " vs " << data[i].property << "\"" << endl;
out << s1 << plotiterator << s3 << "\""<< data[i+half_data].property << " vs " << data[i].property << "\"" << endl;
out << s1 << plotiterator << " symbol 1" << endl;
out << s1 << plotiterator << " symbol size 0.50000" << endl;
out << s1 << plotiterator << " symbol color 1" << endl;
out << s1 << plotiterator << " symbol pattern 1" << endl;
out << s1 << plotiterator << " symbol fill color "<< plotiterator+1 << endl;
out << s1 << plotiterator << " symbol fill pattern 1" << endl;
out << s1 << plotiterator << " symbol linewidth 1.0" << endl;
out << s1 << plotiterator << " symbol linestyle 1" << endl;
out << s1 << plotiterator << " symbol char 65" << endl;
out << s1 << plotiterator << " symbol char font 0" << endl;
plotiterator++;
for(int j=0;j!=data[i].value.size(); j++)
out << data[i].value[j] << " " << data[i+half_data].value[j]<< endl;
out << "&" << endl;
break;
}
case 2: { // Parallel Case
out << s1 << plotiterator << s2 << "\""<< data[i+half_data].property << " vs " << data[i].property << ": " << data[i].filename << "\"" << endl;
out << s1 << plotiterator << s3 << "\""<< data[i+half_data].property << " vs " << data[i].property << ": " << data[i].filename << "\"" << endl;
out << s1 << plotiterator << " symbol 1" << endl;
out << s1 << plotiterator << " symbol size 0.50000" << endl;
out << s1 << plotiterator << " symbol color 1" << endl;
out << s1 << plotiterator << " symbol pattern 1" << endl;
out << s1 << plotiterator << " symbol fill color "<< plotiterator+1 << endl;
out << s1 << plotiterator << " symbol fill pattern 1" << endl;
out << s1 << plotiterator << " symbol linewidth 1.0" << endl;
out << s1 << plotiterator << " symbol linestyle 1" << endl;
out << s1 << plotiterator << " symbol char 65" << endl;
out << s1 << plotiterator << " symbol char font 0" << endl;
plotiterator++;
for(int j=0;j!=data[i].value.size(); j++)
out << data[i].value[j] << " " << data[i+half_data].value[j]<< endl;
out << "&" << endl;
break;
}
}
}
int rv=system("xmgrace temp &");
}
vector<fd> convert_to_float(sentence s, map<string, vector<int> > x, sentence sf) {
vector<fd> datatemp;
int style,set;
if (!s[0].compare("s")) style=1; else style=2;
for(int i=1;i!=s.size();i++) {
fd temp;
switch (style) {
case 1: { // This is series case
set=0;
for(int j=0;j!=f.size(); j++) {
if (x[s[i]][j]) {
if (!set) {
temp.filename="Allfiles";
temp.property=s[i];
set=1;
}
for(int tt=1;tt!=f[j].size();tt++) {
float t=atof(&f[j][tt][x[s[i]][j]][0]);
temp.value.push_back(t);
}
}
// datatemp.push_back(temp);
}
datatemp.push_back(temp);
break;
}
case 2: { // This is parallel case.
for(int j=0;j!=f.size(); j++) {
if (x[s[i]][j]) {
temp.filename=sf[j];
temp.property=s[i];
temp.value.clear();
for(int tt=1;tt!=f[j].size();tt++) {
float t= 0.0;
if ((f[j][tt][x[s[i]][j]].compare("nan")))
t = atof(&f[j][tt][x[s[i]][j]][0]);
temp.value.push_back(t);
}
datatemp.push_back(temp);
}
else if (!s[i].compare("Step")) {
temp.filename=sf[j];
temp.property=s[i];
temp.value.clear();
for(int tt=1;tt!=f[j].size();tt++) {
float t=atof(&f[j][tt][x[s[i]][j]][0]);
temp.value.push_back(t);
}
datatemp.push_back(temp);
}
}
break;
}
}
}
return datatemp;
}
void do_averageall(vector<fd> x,int start,int end) {
for(int i=0;i!=x.size();i++) {
double average=0;
double stdev=0;
int finish;
if (end==0)
finish=x[i].value.size();
else
finish=end;
for (int j=start;j!=finish;j++)
average+=x[i].value[j];
average/=(double)(finish-start);
for (int j=start;j!=finish;j++)
stdev+=pow((x[i].value[j]-average),2);
stdev/=(double)(finish-1-start);
stdev=sqrt(stdev);
cout << x[i].filename << ": " << x[i].property << "--- " << average << " " << stdev << " " << start << " " << finish << " Total Size " << x[i].value.size() << endl;
}
}
void do_averagesingle(vector<fd> x,int start,int end, string str) {
for(int i=0;i!=x.size();i++) {
if (!x[i].filename.compare(str)) {
float average=0;
float stdev=0;
int finish;
if (end==0) finish=x[i].value.size();
for (int j=start;j!=finish;j++)
average+=x[i].value[j];
average/=(double)(finish-start);
for (int j=start;j!=finish;j++)
stdev+=pow((x[i].value[j]-average),2);
stdev/=(double)(finish-1-start);
stdev=sqrt(stdev);
cout << x[i].filename << ": " << x[i].property << "--- " << average << " " << stdev << " " << start << " " << finish << endl;
}
}
}
void do_scale_single(vector<fd> &x,float factor, string filename, string property) {
for(int i=0;i!=x.size();i++)
if ((!x[i].filename.compare(filename)) && (!x[i].property.compare(property))) {
fd temp;
temp.filename=filename;
temp.property=property+".scl";
for (int j=0;j!=x[i].value.size();j++)
temp.value.push_back(x[i].value[j]*factor);
x.push_back(temp);
}
}
void do_inverse_single(vector<fd> &x, string filename, string property) {
for(int i=0;i!=x.size();i++)
if ((!x[i].filename.compare(filename)) && (!x[i].property.compare(property))) {
fd temp;
temp.filename=filename;
temp.property=property+".inv";
for (int j=0;j!=x[i].value.size();j++)
temp.value.push_back(1.0/x[i].value[j]);
x.push_back(temp);
}
}
void do_write_data(vector<fd> x, sentence line) {
// int startvalue,endvalue;
// if (!line_data[1].compare("start")) startvalue=0; else startvalue=atoi(&line_data[2][0]);
// if (!line_data[2].compare("end")) endvalue=0; else endvalue=atoi(&line_data[3][0]);
// for(int j=3;j!=line.size();j++)
// for(int i=0;i!=x.size();i++)
// if (!x[i].property.compare(line[i])) {
// // Create a filename
// // open a file.
// // Write the data
// }
}
void do_subtract(vector<fd>& x, sentence line) {
int indexfile1=-1;
int indexfile2=-1;
int minlength;
for(int i=0;i!=x.size();i++)
if ((!x[i].property.compare(line[1])) && (!x[i].filename.compare(line[3])))
indexfile1=i;
for(int i=0;i!=x.size();i++)
if ((!x[i].property.compare(line[2])) && (!x[i].filename.compare(line[3])))
indexfile2=i;
if ((indexfile1>=0) && (indexfile2>=0)) {
fd temp;
temp.property=line[4];
temp.filename=line[3];
if (x[indexfile1].value.size()<x[indexfile2].value.size())
minlength=x[indexfile1].value.size();
else
minlength=x[indexfile2].value.size();
for (int j=0;j!=minlength;j++)
temp.value.push_back(x[indexfile1].value[j]-x[indexfile2].value[j]);
x.push_back(temp);
}
}
void do_add(vector<fd>& x, sentence line) {
fd temp;
int length=line.size();
temp.property=line[length-1];
temp.filename=line[length-2];
vector <int> index;
int minlength=10000000;
for(int i=0;i!=length-3;i++)
index.push_back(-1);
for(int j=1;j!=length-2;j++)
for(int i=0;i!=x.size();i++)
if ((!x[i].property.compare(line[j])) && (!x[i].filename.compare(line[length-2])))
index[j-1]=i;
for(int i=0;i!=length-3;i++) {
if (index[i]>-1)
if (minlength>x[index[i]].value.size())
minlength=x[index[i]].value.size();
}
for (int j=0;j!=minlength;j++) {
float value=0;
for (int i=0;i!=length-2;i++)
if (index[i]>0)
value+=x[index[i]].value[j];
temp.value.push_back(value);
}
x.push_back(temp);
}
void do_analysis(vector<fd> &data,string file) {
ifstream inp_anal(file.c_str());
if (inp_anal) {
string line;
while(getline(inp_anal,line)) {
sentence line_data=split(line);
// Average
if (!line_data[0].compare("average")) {
int startvalue,endvalue;
if (!line_data[2].compare("start")) startvalue=0; else startvalue=atoi(&line_data[2][0]);
if (!line_data[3].compare("end")) endvalue=0; else endvalue=atoi(&line_data[3][0]);
if (!line_data[1].compare("all"))
do_averageall(data,startvalue,endvalue);
else
do_averagesingle(data,startvalue,endvalue,line_data[1]);
}
// Scale
if (!line_data[0].compare("scale")) {
float factor=atof(&line_data[3][0]);
do_scale_single(data,factor,line_data[1],line_data[2]);
}
// Inverse
if (!line_data[0].compare("inverse"))
do_inverse_single(data,line_data[1],line_data[2]);
// Write Data
if (!line_data[0].compare("write"))
do_write_data(data,line_data);
// Add : Think about it and write
if (!line_data[0].compare("write")) {
do_add(data,line_data);
}
// Subtract : Think about it and write
if (!line_data[0].compare("subtract")) {
cout << "coming here" << endl;
do_subtract(data,line_data);
}
if (!line_data[0].compare("graph")) {
}
}
}
}
void print_start() {
int rv=system("clear ");
cout << endl;
cout << "Files Read: --- " << endl;
}
int main (int argc, char **argv) {
sentence s;
sentence stringfile;
string anal_file="";
vector <fd> data;
map<string, vector<int> > inp_index;
print_start();
read_input(argc,argv,stringfile,anal_file); // Read the input file
s=get_userinput(); // Read the parameters
transform_userinput(s); // Transform the parameters to correct names
inp_index=update2_userinput(s); // Assign indices
print_file_index_output(s,inp_index,stringfile); // Print file index information
data=convert_to_float(s,inp_index,stringfile); // Convert the stored data in float formation
if (anal_file.size())
do_analysis(data,anal_file); // Do analysis if wanted.
plot_xmgrace(s,data); // Plot the data in xmgrace
return 0;
}