Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F82946224
lammpsplot.cpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Sat, Sep 14, 09:07
Size
26 KB
Mime Type
text/x-c++
Expires
Mon, Sep 16, 09:07 (2 d)
Engine
blob
Format
Raw Data
Handle
20525516
Attached To
rLAMMPS lammps
lammpsplot.cpp
View Options
// 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 seperated 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;
}
Event Timeline
Log In to Comment