Commit 0acd6a36 authored by Andreas Tille's avatar Andreas Tille

New upstream version 0.0.170427+dfsg

parent 19f9dff9
v.170427
Changes by Nikolai Hecker
- make the temp files thread safe
- fix a compile issue with GCC 6.2.0
- reduce the information written to stdout; disable with "-verbose"
v.150803
- force linear order of alignment anchors
- convert multifurcating trees to bifurcating ones
......
......@@ -44,7 +44,7 @@ bool BppAncestors::testExecutable()
{
#if defined (__CYGWIN__)
char path[200];
char path[200] = "";
int length = readlink("/proc/self/exe",path,200-1);
string epath = string(path).substr(0,length);
......@@ -58,7 +58,7 @@ bool BppAncestors::testExecutable()
# else
char path[200];
char path[200] = "";
string epath;
#if defined (__APPLE__)
......@@ -94,13 +94,9 @@ bool BppAncestors::testExecutable()
bool BppAncestors::inferAncestors(AncestralNode *root,map<string,string> *aseqs,string *atree,bool isDna)
{
string tmp_dir = this->get_temp_dir();
stringstream f_name;
stringstream t_name;
stringstream o_name;
stringstream m_name;
int r = rand();
while(true)
......@@ -109,21 +105,18 @@ bool BppAncestors::inferAncestors(AncestralNode *root,map<string,string> *aseqs,
f_name.str("");
t_name.str("");
o_name.str("");
m_name.str("");
f_name <<tmp_dir<<"f"<<r<<".fas";
f_name <<tmp_dir<<"/f"<<r<<".fas";
ifstream f_file(f_name.str().c_str());
t_name <<tmp_dir<<"t"<<r<<".tre";
t_name <<tmp_dir<<"/t"<<r<<".tre";
ifstream t_file(t_name.str().c_str());
o_name <<tmp_dir<<"o"<<r<<".fas";
o_name <<tmp_dir<<"/o"<<r<<".fas";
ifstream o_file(t_name.str().c_str());
m_name <<tmp_dir<<"m"<<r<<".tre";
ifstream m_file(t_name.str().c_str());
if(!f_file && !t_file && !o_file && !m_file)
if(!f_file && !t_file && !o_file )
{
ofstream f_tmp;
f_tmp.open(f_name.str().c_str(), (ios::out) );
......@@ -263,35 +256,13 @@ bool BppAncestors::inferAncestors(AncestralNode *root,map<string,string> *aseqs,
aseqs->insert(aseqs->begin(),pair<string,string>("#"+n.at(i)+"#",s.at(i)));
}
this->delete_files(r);
//delete files
if ( remove( f_name.str().c_str() ) != 0)
perror("Error deleting temporary file in BppAncestors::inferAncestors");
if ( remove( t_name.str().c_str()) != 0 )
perror("Error deleting temporary file in BppAncestors::inferAncestors");
if ( remove( o_name.str().c_str()) != 0 )
perror("Error deleting temporary file in BppAncestors::inferAncestors");
return (rv>0);
}
void BppAncestors::delete_files(int r)
{
string tmp_dir = this->get_temp_dir();
stringstream t_name;
t_name <<tmp_dir<<"t"<<r<<".tre";
stringstream f_name;
f_name <<tmp_dir<<"f"<<r<<".fas";
stringstream o_name;
o_name <<tmp_dir<<"o"<<r<<".fas";
// stringstream m_name;
// m_name <<tmp_dir<<"m"<<r<<".tre";
if ( remove( t_name.str().c_str() ) != 0 )
perror( "Error deleting file" );
if ( remove( f_name.str().c_str() ) != 0 )
perror( "Error deleting file");
if ( remove( o_name.str().c_str() ) != 0 )
perror( "Error deleting file");
// if ( remove( m_name.str().c_str() ) != 0 )
// perror( "Error deleting file");
}
......@@ -29,21 +29,6 @@ class BppAncestors
{
std::string bppdistpath;
std::string get_temp_dir()
{
std::string tmp_dir = "/tmp/";
if(tempdir != "")
tmp_dir = tempdir+"/";
struct stat st;
if(stat(tmp_dir.c_str(),&st) != 0)
tmp_dir = "";
return tmp_dir;
}
void delete_files(int r);
public:
BppAncestors();
bool testExecutable();
......
......@@ -181,4 +181,10 @@ extern float pwInitialMatrixSize;
extern double sumLogs(double a, double b);
extern std::string itos(int i);
//global variable for temporary directory
extern char tmp_dir[1000];
//global variable for verbose flag
extern bool verbose;
#endif
......@@ -28,7 +28,7 @@ bool Exonerate_reads::test_executable()
int status = -1;
#if defined (__CYGWIN__)
char path[200];
char path[200] = "";
int length = readlink("/proc/self/exe",path,200-1);
string epath = string(path).substr(0,length);
......@@ -42,7 +42,7 @@ bool Exonerate_reads::test_executable()
if(WEXITSTATUS(status) != 1)
{
char path[200];
char path[200] = "";
string epath;
#if defined (__APPLE__)
......@@ -117,17 +117,15 @@ void Exonerate_reads::local_alignment(string* ls,string* rs, vector<hit> *hits,
ofstream q_output;
ofstream t_output;
string tmp_dir = this->get_temp_dir();
stringstream q_name;
stringstream t_name;
int r = rand();
while(true)
{
stringstream q_name;
stringstream t_name;
q_name <<tmp_dir<<"q"<<r<<".fas";
t_name <<tmp_dir<<"t"<<r<<".fas";
q_name <<tmp_dir<<"/q"<<r<<".fas";
t_name <<tmp_dir<<"/t"<<r<<".fas";
ifstream q_file(q_name.str().c_str());
ifstream t_file(t_name.str().c_str());
......@@ -200,7 +198,7 @@ void Exonerate_reads::local_alignment(string* ls,string* rs, vector<hit> *hits,
// # else
// command<<"exonerate ";
// #endif
command << " -q "+tmp_dir+"q"<<r<<".fas -t "+tmp_dir+"t"<<r<<".fas --showalignment no --showsugar yes --showvulgar no 2>&1";
command << " -q " <<tmp_dir<<"/q"<<r<<".fas -t "<<tmp_dir<<"/t"<<r<<".fas --showalignment no --showsugar yes --showvulgar no 2>&1";
if(NOISE>0)
cout<<"cmd: "<<command.str()<<endl;
......@@ -406,22 +404,10 @@ void Exonerate_reads::local_alignment(string* ls,string* rs, vector<hit> *hits,
iter2++;
}
this->delete_files(r);
}
void Exonerate_reads::delete_files(int r)
{
string tmp_dir = this->get_temp_dir();
stringstream q_name;
q_name <<tmp_dir<<"q"<<r<<".fas";
stringstream t_name;
t_name <<tmp_dir<<"t"<<r<<".fas";
//delete files
if( remove( q_name.str().c_str() ) != 0 )
perror("Error deleting temporary file in Exonerate_reads::local_alignment");
if( remove( t_name.str().c_str() ) != 0 )
perror("Error deleting temporary file in Exonerate_reads::local_alignment");
if ( remove( q_name.str().c_str() ) != 0 )
perror( "Error deleting file" );
if ( remove( t_name.str().c_str() ) != 0 )
perror( "Error deleting file");
}
......@@ -34,20 +34,6 @@ class Exonerate_reads
}
bool split_sugar_string(const std::string& row,hit *h);
void delete_files(int r);
std::string get_temp_dir()
{
std::string tmp_dir = "/tmp/";
if(tempdir != "")
tmp_dir = tempdir+"/";
struct stat st;
if(stat(tmp_dir.c_str(),&st) != 0)
tmp_dir = "";
return tmp_dir;
}
public:
Exonerate_reads();
......
......@@ -431,7 +431,7 @@ void Hirschberg::alignSeqs(Sequence* s1,Sequence* s2,PhyloMatchScore *pms)
defineEnd();
unsigned int ii = 0;
if (SCREEN && totalSites>0)
if (SCREEN && totalSites>0 && verbose == true)
{
FOR( ii,message.length())
{
......@@ -859,7 +859,7 @@ void Hirschberg::divideSeq()
if (newsite->index()%reportLimit==0)
{
if (SCREEN)
if (SCREEN && verbose == true)
{
unsigned int ii;
FOR(ii,message.length())
......
......@@ -22,6 +22,7 @@
#include <cmath>
#include <ctime>
#include <fstream>
#include <iostream>
#include "hmmodel.h"
#include "eigen.h"
......@@ -1510,7 +1511,7 @@ void HMModel::alignmentModel(AncestralNode *tn)
}
else
{
cout<<"HMModel::alignmentModel: impossible 'as'"<<cout;
std::cout << "HMModel::alignmentModel: impossible 'as'";
exit(-1);
}
......
......@@ -20,7 +20,7 @@ Mafft_alignment::Mafft_alignment()
bool Mafft_alignment::test_executable()
{
#if defined (__CYGWIN__)
char path[200];
char path[200] = "";
int length = readlink("/proc/self/exe",path,200-1);
string epath = string(path).substr(0,length);
......@@ -33,7 +33,7 @@ bool Mafft_alignment::test_executable()
# else
char path[200];
char path[200] = "";
string epath;
#if defined (__APPLE__)
......@@ -70,14 +70,13 @@ bool Mafft_alignment::test_executable()
void Mafft_alignment::align_sequences(vector<string> *names,vector<string> *sequences)
{
ofstream m_output;
string tmp_dir = this->get_temp_dir();
stringstream m_name;
int r = rand();
while(true)
{
stringstream m_name;
m_name <<tmp_dir<<"m"<<r<<".fas";
m_name <<tmp_dir<<"/m"<<r<<".fas";
ifstream m_file(m_name.str().c_str());
if(!m_file)
......@@ -98,7 +97,7 @@ void Mafft_alignment::align_sequences(vector<string> *names,vector<string> *sequ
m_output.close();
stringstream command;
command << mafftpath<<"mafft "+tmp_dir+"m"<<r<<".fas 2> /dev/null";
command << mafftpath<<"mafft "<<tmp_dir<<"/m"<<r<<".fas 2> /dev/null";
if(NOISE>0)
cout<<"cmd: "<<command.str()<<endl;
......@@ -173,7 +172,7 @@ void Mafft_alignment::align_sequences(vector<string> *names,vector<string> *sequ
cout<<"\nError: Initial alignment with Mafft failed. The output generated was:\n";
command.str("");
command << mafftpath<<"mafft "+tmp_dir+"m"<<r<<".fas 2>&1";
command << mafftpath<<"mafft "<<tmp_dir<<"/m"<<r<<".fas 2>&1";
int i = system(command.str().c_str());
......@@ -181,19 +180,8 @@ void Mafft_alignment::align_sequences(vector<string> *names,vector<string> *sequ
exit(0);
}
this->delete_files(r);
}
void Mafft_alignment::delete_files(int r)
{
string tmp_dir = this->get_temp_dir();
stringstream m_name;
m_name <<tmp_dir<<"m"<<r<<".fas";
//remove file
if( remove( m_name.str().c_str() ) != 0)
perror("Error deleting temporary file in Mafft_alignment::align_sequences");
if ( remove( m_name.str().c_str() ) != 0 )
perror( "Error deleting file" );
}
......@@ -11,18 +11,6 @@ extern std::string tempdir;
class Mafft_alignment
{
std::string get_temp_dir()
{
std::string tmp_dir = "/tmp/";
if(tempdir != "")
tmp_dir = tempdir+"/";
struct stat st;
if(stat(tmp_dir.c_str(),&st) != 0)
tmp_dir = "";
return tmp_dir;
}
std::string remove_last_whitespaces(const std::string & s)
{
......@@ -61,7 +49,6 @@ class Mafft_alignment
|| (c == '\f');
}
void delete_files(int r);
public:
Mafft_alignment();
......
.\" Automatically generated by Pod::Man 2.25 (Pod::Simple 3.16)
.\" Automatically generated by Pod::Man 2.28 (Pod::Simple 3.29)
.\"
.\" Standard preamble:
.\" ========================================================================
......@@ -38,6 +38,8 @@
. ds PI \(*p
. ds L" ``
. ds R" ''
. ds C`
. ds C'
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
......@@ -48,21 +50,28 @@
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD. Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.ie \nF \{\
. de IX
. tm Index:\\$1\t\\n%\t"\\$2"
.\"
.\" Avoid warning from groff about undefined register 'F'.
.de IX
..
. nr % 0
. rr F
.\}
.el \{\
. de IX
.nr rF 0
.if \n(.g .if rF .nr rF 1
.if (\n(rF:(\n(.g==0)) \{
. if \nF \{
. de IX
. tm Index:\\$1\t\\n%\t"\\$2"
..
. if !\nF==2 \{
. nr % 0
. nr F 2
. \}
. \}
.\}
.rr rF
.\" ========================================================================
.\"
.IX Title "PRANK 1"
.TH PRANK 1 "2013-04-10" "v.130410" "The Probabilistic Alignment Kit"
.TH PRANK 1 "2017-04-27" "v.121211" "The Probabilistic Alignment Kit"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
......@@ -77,7 +86,7 @@ prank \- Computes probabilistic multiple sequence alignments
.SH "DESCRIPTION"
.IX Header "DESCRIPTION"
The Probabilistic Alignment Kit (\s-1PRANK\s0) is a probabilistic multiple alignment
program for \s-1DNA\s0, codon and amino-acid sequences. It's based on a novel algorithm
program for \s-1DNA,\s0 codon and amino-acid sequences. It's based on a novel algorithm
that treats insertions correctly and avoids over-estimation of the number of
deletion events.
.PP
......@@ -88,7 +97,7 @@ sequences to be aligned and then, simultaneously with the alignment, predicts
the locations of structural units in the sequences.
.SH "OPTIONS"
.IX Header "OPTIONS"
.SS "\s-1INPUT/OUTPUT\s0 \s-1PARAMETERS\s0"
.SS "\s-1INPUT/OUTPUT PARAMETERS\s0"
.IX Subsection "INPUT/OUTPUT PARAMETERS"
.IP "\fB\-d=\f(BIsequence_file\fB\fR" 8
.IX Item "-d=sequence_file"
......@@ -136,7 +145,7 @@ Truncate names at first space character.
.IP "\fB\-quiet\fR" 8
.IX Item "-quiet"
Reduce output.
.SS "\s-1ALIGNMENT\s0 \s-1MERGE\s0"
.SS "\s-1ALIGNMENT MERGE\s0"
.IX Subsection "ALIGNMENT MERGE"
.IP "\fB\-d1=\f(BIalignment_file\fB\fR" 8
.IX Item "-d1=alignment_file"
......@@ -150,7 +159,7 @@ The tree file for the first alignment. If unset, an appriximated \s-1NJ\s0 tree
.IP "\fB\-t2=\f(BItree_file\fB\fR" 8
.IX Item "-t2=tree_file"
The tree file for the second alignment. If unset, an appriximated \s-1NJ\s0 tree is generated.
.SS "\s-1MODEL\s0 \s-1PARAMETERS\s0"
.SS "\s-1MODEL PARAMETERS\s0"
.IX Subsection "MODEL PARAMETERS"
.IP "\fB\-F\fR, \fB+F\fR" 8
.IX Item "-F, +F"
......@@ -165,7 +174,7 @@ Set the gap extension probability. The default is \fB0.75\fR for \s-1DNA\s0 and
proteins.
.IP "\fB\-codon\fR" 8
.IX Item "-codon"
Use empirical codon model for coding \s-1DNA\s0.
Use empirical codon model for coding \s-1DNA.\s0
.IP "\fB\-DNA\fR, \fB\-protein\fR" 8
.IX Item "-DNA, -protein"
Use \s-1DNA\s0 or protein model, respectively. Disables auto-detection of model.
......@@ -178,7 +187,7 @@ No missing data. Use \fB\-F\fR for terminal gaps.
.IP "\fB\-keep\fR" 8
.IX Item "-keep"
Do not remove gaps from pre-aligned sequences.
.SS "\s-1OTHER\s0 \s-1PARAMETERS\s0"
.SS "\s-1OTHER PARAMETERS\s0"
.IX Subsection "OTHER PARAMETERS"
.IP "\fB\-iterate=#\fR" 8
.IX Item "-iterate=#"
......
......@@ -24,19 +24,61 @@
#include <iostream>
#include <string>
#include <sstream>
#include <unistd.h>
#include "progressivealignment.h"
#include "check_version.h"
#include "prank.h"
using namespace std;
// stores current temporary directory will be created and removed in main
char tmp_dir[1000] = "";
bool verbose = false;
//main
int main(int argc, char *argv[])
{
version = 150803;
version = 170427;
readArguments(argc, argv);
int time1 = time(0);
// character array for assigning system tmp path
char* tmpPath = NULL;
//mkdtemp template
const char* mktemplate = "tmpdirprankmsaXXXXXX";
//create temporary directory
//get tmpPath from environment or assign tmpPath to NULL (if last getenv fails)
if( (tmpPath = getenv("TMPDIR")) == NULL)
{
if( (tmpPath = getenv("TMP")) == NULL)
{
if( (tmpPath = getenv("TEMPDIR")) == NULL)
{
tmpPath = getenv("TEMP");
}
}
}
// define temp dir based on whether tmpPath was found
if(tmpPath == NULL)
{
sprintf(tmp_dir, "%s", mktemplate);
}
else
{
sprintf(tmp_dir, "%s/%s", tmpPath, mktemplate);
}
// call mkdtemp
if( (mkdtemp(tmp_dir) == NULL) )
{
perror("'mkdtemp' failed to generate temporary directory while creating ProgressiveAlignbment object.\n");
exit(EXIT_FAILURE);
}
ProgressiveAlignment* pa = new ProgressiveAlignment(treefile,seqfile,dnafile);
if (NOISE>=0)
cout<<endl<<"Analysis done. Total time "<<(time(0)-time1)<<"s"<<endl;
......@@ -44,6 +86,12 @@ int main(int argc, char *argv[])
delete pa;
delete hmm;
//unlink temporary directory
if( rmdir(tmp_dir) != 0)
{
perror("ERROR! failed removing temporary directory.");
}
cout<<endl;
exit(0);
}
......@@ -112,6 +160,13 @@ void readArguments(int argc, char *argv[])
exit(0);
}
else if (s=="-verbose")
{
verbose = true;
}
/********* input/output: **********/
// sequence data file
......@@ -845,6 +900,7 @@ void printHelp(bool complete)
if (complete)
cout<<" -dna=dna_sequence_file [DNA sequence file for backtranslation of protein alignment]"<<endl;
cout<<" -version [check for updates]"<<endl;
cout<<" -verbose [print progress etc. during runtime]"<<endl;
cout<<"\n -help [show more options]"<<endl;
cout<<""<<endl;
......
......@@ -184,7 +184,7 @@ bool ReadAlignment::readSeqs(Sequence* s1,Sequence* s2,PhyloMatchScore *pms,Tree
for (;; s++)
{
if (SCREEN && totalSites>0 && countSites%reportLimit==0)
if (SCREEN && totalSites>0 && countSites%reportLimit==0 && verbose == true)
{
FOR(ii,message.length())
{
......@@ -1114,7 +1114,7 @@ bool ReadAlignment::readSeqs(Sequence* s1,Sequence* s2,PhyloMatchScore *pms,Tree
newsite->setNeighbours(beg,end);
end->prev();
if (SCREEN && totalSites>0 && countSites%reportLimit==0)
if (SCREEN && totalSites>0 && countSites%reportLimit==0 && verbose == true)
{
FOR(ii,message.length())
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment