#include #include #include #include #include using namespace std; class Basic_arg{ public: int intype=0, outype=0; char *itn, *otn; Basic_arg(int intype, int outype, char* itn, char *otn): intype(intype), outype(outype), itn(itn), otn(otn) {}; }; class Sample { public: unsigned ntax, nchar; string *taxas, *chars; Sample(unsigned ntax, unsigned nchar): ntax(ntax), nchar(nchar) { taxas = new string[ntax]; chars = new string[ntax]; }; }; Basic_arg procargs (int nargs, char ** arg, char* itn, char* otn); Sample read_input(char* itn, int intype); void show_help(int help_num); Sample readFas(char* itn); Sample readPhy(char* itn); Sample readTnt(char* itn); Sample readNex(char* itn); void write_output(class Sample sam, char* otn, int outype); void writeFas(class Sample sam, char* otn); void writePhy(class Sample sam, char* otn); void writeTnt(class Sample sam, char* otn); void writeNex(class Sample sam, char* otn); bool isNum(string strnum); bool checkalign(class Sample sam); string to_lower(string stri); string add_space(char x, string str_old); string checktype(string str); int countfre(string str, char c); int checkextension(string str); Sample readPhy(char* itn){ //read file ifstream matrixfile; matrixfile.open(itn); //read number of taxa and charcter string sntax, snseq, snall; getline(matrixfile,snall); istringstream istr(snall); istr >> sntax; istr >> snseq; int ntax, nchar; ntax = stoi (sntax); nchar = stoi (snseq); // string to int Sample sam(ntax, nchar); //read sequence int lennum; for(lennum=0;lennum> sam.taxas[lennum]; istr >> sam.chars[lennum]; } matrixfile.close(); // return to class return sam; } Sample readFas(char* itn){ int ntax, nchar, lnum; ifstream matrixfile; matrixfile.open(itn); // check line number and taxa number ntax = 0; string temln; for(lnum=0;getline(matrixfile,temln);lnum++){ if(temln[0]=='>'){ ntax++; } } matrixfile.clear(); matrixfile.seekg(0); // check the nchar string *str_a = new string; string *str_b = new string; int r = lnum/ntax; for (int i=0; i0){ *str_b = *str_b + *str_a; } } nchar = (*str_b).length(); delete str_a; str_a = nullptr; delete str_b; str_b = nullptr; matrixfile.clear(); matrixfile.seekg(0); // create class Sample sam(ntax, nchar); // get class string *str_c = new string; for (int a=1, b=0;a<=lnum;a++){ if(a%r==1){ getline(matrixfile,sam.taxas[b]); sam.taxas[b].erase(0,1); } if(a%r>1){ getline(matrixfile,*str_c); sam.chars[b] = sam.chars[b] + *str_c; } if(a%r==0){ getline(matrixfile,*str_c); sam.chars[b] = sam.chars[b] + *str_c; b++; } } delete str_c; str_c = nullptr; matrixfile.close(); return sam; } Sample readTnt(char* itn){ int ntax, nchar; ifstream matrixfile; matrixfile.open(itn); // get nchar and ntax string stri, sntax, snchar; for(int i=0;i<1;){ getline(matrixfile,stri); istringstream istr(stri); istr >> snchar; istr >> sntax; if(isNum(sntax) && isNum(snchar)){ ntax=stoi(sntax); nchar=stoi(snchar); i++; } } // create class Sample sam(ntax,nchar); // get class int lennum; for(lennum=0;lennum> sam.taxas[lennum]; istr >> sam.chars[lennum]; } matrixfile.close(); return sam; } bool isNum(string strnum) { char* p; strtol(strnum.c_str(), &p, 10); return *p == 0; } Sample readNex(char* itn){ int ntax, nchar; // open file ifstream matrixfile; matrixfile.open(itn); // some tem string snall, stri, str_a, str_b; bool found = false, found_ntax = false, found_nchar = false, found_equal = false; char x = '='; int lnum, eulnum; // getline line by line for(lnum=0;getline(matrixfile,snall);lnum++){ str_a = to_lower(snall); str_b = add_space(x,str_a); istringstream istr(str_b); // convert to words while(istr>> stri){ if(stri=="dimensions"){ found = true; } else if(stri=="ntax"){ found_ntax = true; } else if(stri=="nchar"){ found_nchar = true; } else if(stri=="="){ found_equal = true; } else if (found_ntax&&found_equal){ if(stri.back()==';'){ stri.pop_back(); found = false; } ntax = stoi(stri); found_equal = false; found_ntax = false; } else if (found_nchar&&found_equal){ if(stri.back()==';'){ stri.pop_back(); found = false; } nchar = stoi(stri); found_equal = false; found_nchar = false; } else if (stri=="matrix"){ eulnum = lnum+1; } } } // go back matrixfile.clear(); matrixfile.seekg(0); // create class Sample sam(ntax,nchar); // some temp, z is line number, l is the string arrary number int z=0; int l=0; // read line by line while(getline(matrixfile,snall)){ // convert to word istringstream istr(snall); // limit the read line number if(z>(eulnum-1)&&z<(eulnum+sam.ntax)){ istr >> sam.taxas[l]; istr >> sam.chars[l]; l++; } z++; } return sam; } string add_space (char x, string str_old) { int i; string str_new; for (i=0; i" << sam.taxas[i] << endl; matrixfile << sam.chars[i] << endl; } matrixfile.close(); } void writePhy(class Sample sam, char* otn){ ofstream matrixfile(otn); matrixfile << sam.ntax << " " << sam.nchar << endl; for(int i=0;i0.7){ datatype = "dna"; } else if ((standard/str.length())>0.7){ datatype = "standard"; } else { datatype = "protein"; } return datatype; } int countfre(string str, char c){ int num; str = to_lower(str); num = count(str.begin(),str.end(),c); return num; } void writeTnt(class Sample sam, char* otn){ ofstream matrixfile(otn); matrixfile << "xread" << endl << "\' \'" << endl; matrixfile << sam.nchar << " " << sam.ntax << endl; for(int i=0;i