[med-svn] [Git][med-team/maffilter][master] 3 commits: New upstream version 1.3.0+dfsg

Julien Y. Dutheil gitlab at salsa.debian.org
Mon Apr 30 14:32:34 BST 2018


Julien Y. Dutheil pushed to branch master at Debian Med / maffilter


Commits:
4bf43ea1 by Julien Y. Dutheil at 2018-04-30T11:37:30+02:00
New upstream version 1.3.0+dfsg
- - - - -
7f2b9bd4 by Julien Y. Dutheil at 2018-04-30T11:39:20+02:00
Update upstream source from tag 'upstream/1.3.0+dfsg'

Update to upstream version '1.3.0+dfsg'
with Debian dir c7613bacfe9ae30009e4eba2a8dc6d2135984278
- - - - -
8dda36da by Julien Y. Dutheil at 2018-04-30T15:26:01+02:00
Drafted version 1.3.0.

- - - - -


21 changed files:

- CMakeLists.txt
- ChangeLog
- MafFilter/CMakeLists.txt
- MafFilter/MafFilter.cpp
- MafFilter/OutputAsFeaturesMafIterator.h
- MafFilter/SystemCallMafIterator.cpp
- MafFilter/SystemCallMafIterator.h
- MafFilter/TreeBuildingSystemCallMafIterator.cpp
- MafFilter/TreeBuildingSystemCallMafIterator.h
- + README.md
- + _config.yml
- debian/changelog
- debian/control
- + debian/patches/fix_doc_compression.patch
- + debian/patches/series
- debian/rules
- doc/maffilter.texi
- + docs/_config.yml
- + docs/index.md
- maffilter.spec
- + utils/convertAln.py


Changes:

=====================================
CMakeLists.txt
=====================================
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -63,7 +63,7 @@ if (CMAKE_INSTALL_PREFIX)
 endif (CMAKE_INSTALL_PREFIX)
 
 include (GNUInstallDirs)
-find_package (bpp-phyl-omics 2.0.0 REQUIRED)
+find_package (bpp-phyl-omics 3.0.0 REQUIRED)
 
 #Find boost libraries
 SET(Boost_USE_STATIC_LIBS ${BUILD_STATIC})
@@ -152,10 +152,10 @@ ADD_SUBDIRECTORY(man)
 # Packager
 SET(CPACK_PACKAGE_NAME "maffilter")
 SET(CPACK_PACKAGE_VENDOR "Julien Y. Dutheil")
-SET(CPACK_PACKAGE_VERSION "1.2.1")
+SET(CPACK_PACKAGE_VERSION "1.3.0")
 SET(CPACK_PACKAGE_VERSION_MAJOR "1")
-SET(CPACK_PACKAGE_VERSION_MINOR "2")
-SET(CPACK_PACKAGE_VERSION_PATCH "1")
+SET(CPACK_PACKAGE_VERSION_MINOR "3")
+SET(CPACK_PACKAGE_VERSION_PATCH "0")
 SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Filtering of genome alignment in the Multiple Alignment Format (MAF)")
 SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE")
 SET(CPACK_RESOURCE_FILE_AUTHORS "${CMAKE_SOURCE_DIR}/AUTHORS")


=====================================
ChangeLog
=====================================
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+29/04/18 -*- Version 1.3.0 -*-
+
+13/04/18 Julien Dutheil
+* Error output when not enough ingroup sequences in DiversityStatistics and SiteFrequencySpectrum
+
+09/03/18 Julien Dutheil
+* Logfile can now be disabled
+* Merge filter can now rename chimeric contigs to avoid long concatenated names.
+
+21/01/18 Julien Dutheil
+* Added OrderFilter.
+
+16/12/17 Julien Dutheil
+* Added OutputAsTable filter
+* Improved LiftOver
+
 18/05/17 -*- Version 1.2.0 -*-
 
 13/04/17 Julien Dutheil


=====================================
MafFilter/CMakeLists.txt
=====================================
--- a/MafFilter/CMakeLists.txt
+++ b/MafFilter/CMakeLists.txt
@@ -12,7 +12,7 @@ foreach (target ${maffilter-targets})
   if (BUILD_STATIC)
     target_link_libraries (${target} ${BPP_LIBS_STATIC})
     target_link_libraries (${target} ${LIBS})
-    set_target_properties (${target} LINK_SEARCH_END_STATIC TRUE)
+    set_target_properties (${target} PROPERTIES LINK_SEARCH_END_STATIC TRUE)
   else (BUILD_STATIC)
     target_link_libraries (${target} ${BPP_LIBS_SHARED})
     target_link_libraries (${target} ${LIBS})


=====================================
MafFilter/MafFilter.cpp
=====================================
--- a/MafFilter/MafFilter.cpp
+++ b/MafFilter/MafFilter.cpp
@@ -80,6 +80,7 @@ using namespace boost::iostreams;
 #include <Bpp/Seq/Io/Maf/ConcatenateMafIterator.h>
 #include <Bpp/Seq/Io/Maf/RemoveEmptySequencesMafIterator.h>
 #include <Bpp/Seq/Io/Maf/DuplicateFilterMafIterator.h>
+#include <Bpp/Seq/Io/Maf/OrderFilterMafIterator.h>
 #include <Bpp/Seq/Io/Maf/FeatureFilterMafIterator.h>
 #include <Bpp/Seq/Io/Maf/QualityFilterMafIterator.h>
 #include <Bpp/Seq/Io/Maf/MaskFilterMafIterator.h>
@@ -97,6 +98,7 @@ using namespace boost::iostreams;
 #include <Bpp/Seq/Io/Maf/OutputDistanceMatrixMafIterator.h>
 #include <Bpp/Seq/Io/Maf/VcfOutputMafIterator.h>
 #include <Bpp/Seq/Io/Maf/MsmcOutputMafIterator.h>
+#include <Bpp/Seq/Io/Maf/TableOutputMafIterator.h>
 #include <Bpp/Seq/Io/Maf/SequenceStatisticsMafIterator.h>
 #include <Bpp/Seq/Io/Maf/FeatureExtractorMafIterator.h>
 #include <Bpp/Seq/Io/Maf/WindowSplitMafIterator.h>
@@ -139,9 +141,9 @@ void help()
 int main(int args, char** argv)
 {
   cout << "******************************************************************" << endl;
-  cout << "*                  MAF Filter, version 1.2.1                     *" << endl;
+  cout << "*                  MAF Filter, version 1.3.0                     *" << endl;
   cout << "* Author: J. Dutheil                        Created on  10/09/10 *" << endl;
-  cout << "*                                           Last Modif. 09/06/17 *" << endl;
+  cout << "*                                           Last Modif. 09/03/18 *" << endl;
   cout << "******************************************************************" << endl;
   cout << endl;
 
@@ -173,9 +175,11 @@ int main(int args, char** argv)
       throw Exception("Bad input incompression format: " + compress);
     stream.push(file_source(inputFile));
     
-    string logFile = ApplicationTools::getAFilePath("output.log", maffilter.getParams(), true, false);
-
-    StlOutputStream log(new ofstream(logFile.c_str(), ios::out));
+    string logFile = ApplicationTools::getAFilePath("output.log", maffilter.getParams(), false, false);
+    shared_ptr<StlOutputStream> log;
+    if (logFile != "none") {
+      log.reset(new StlOutputStream(new ofstream(logFile.c_str(), ios::out)));
+    }
 
     MafIterator* currentIterator;
 
@@ -237,7 +241,7 @@ int main(int args, char** argv)
         if (species.size() == 0)
           throw Exception("At least one species should be provided for command 'Subset'.");
         SequenceFilterMafIterator* iterator = new SequenceFilterMafIterator(currentIterator, species, strict, keep, rmdupl);
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         currentIterator = iterator;
         its.push_back(iterator);
@@ -256,7 +260,7 @@ int main(int args, char** argv)
         if (species.size() == 0)
           throw Exception("At least one species should be provided for command 'SelectOrphans'.");
         OrphanSequenceFilterMafIterator* iterator = new OrphanSequenceFilterMafIterator(currentIterator, species, strict, rmdupl);
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         currentIterator = iterator;
         its.push_back(iterator);
@@ -276,8 +280,10 @@ int main(int args, char** argv)
         }
         unsigned int distMax = ApplicationTools::getParameter<unsigned int>("dist_max", cmdArgs, 0);
         ApplicationTools::displayResult("-- Maximum distance allowed", distMax);
-        BlockMergerMafIterator* iterator = new BlockMergerMafIterator(currentIterator, species, distMax);
-        iterator->setLogStream(&log);
+        bool renameChimeras = ApplicationTools::getBooleanParameter("rename_chimeric_chromosomes", cmdArgs, false);
+        ApplicationTools::displayBooleanResult("-- Rename chimeric chromosomes", renameChimeras);
+        BlockMergerMafIterator* iterator = new BlockMergerMafIterator(currentIterator, species, distMax, renameChimeras);
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         if (cmdArgs.find("ignore.chr") != cmdArgs.end()) {
           throw Exception("ignore.chr argument in Merge is deprecated: use ignore_chr instead.");
@@ -307,7 +313,7 @@ int main(int args, char** argv)
         if (ref != "")
           ApplicationTools::displayResult("-- Reference species", ref);
         ConcatenateMafIterator* iterator = new ConcatenateMafIterator(currentIterator, minimumSize, ref);
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         currentIterator = iterator;
         its.push_back(iterator);
@@ -322,7 +328,7 @@ int main(int args, char** argv)
         if (species.size() == 0)
           throw Exception("At least one species should be provided for command 'XFullGap'.");
         FullGapFilterMafIterator* iterator = new FullGapFilterMafIterator(currentIterator, species);
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         currentIterator = iterator;
         its.push_back(iterator);
@@ -363,7 +369,7 @@ int main(int args, char** argv)
           iterator = new AlignmentFilterMafIterator(currentIterator, species, ws, st, rm, em, !trash, missingAsGap);
         else
           iterator = new AlignmentFilterMafIterator(currentIterator, species, ws, st, gm, em, !trash, missingAsGap);
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         its.push_back(iterator);
 
@@ -435,7 +441,7 @@ int main(int args, char** argv)
           iterator = new AlignmentFilter2MafIterator(currentIterator, species, ws, st, rm, pm, !trash, missingAsGap);
         else
           iterator = new AlignmentFilter2MafIterator(currentIterator, species, ws, st, gm, pm, !trash, missingAsGap);
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         its.push_back(iterator);
 
@@ -499,7 +505,7 @@ int main(int args, char** argv)
         if (ignoreGaps && missingAsGap)
           throw Exception("Error, incompatible options ingore_gaps=yes and missing_as_gap=yes.");
         EntropyFilterMafIterator* iterator = new EntropyFilterMafIterator(currentIterator, species, ws, st, em, pm, !trash, missingAsGap, ignoreGaps);
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         its.push_back(iterator);
 
@@ -555,7 +561,7 @@ int main(int args, char** argv)
         ApplicationTools::displayResult("-- Max. masked sites allowed in Window", mm);
         ApplicationTools::displayBooleanResult("-- Output removed blocks", !trash);
         MaskFilterMafIterator* iterator = new MaskFilterMafIterator(currentIterator, species, ws, st, mm, !trash);
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         its.push_back(iterator);
 
@@ -610,7 +616,7 @@ int main(int args, char** argv)
         ApplicationTools::displayResult("-- Min. average quality allowed in Window", mq);
         ApplicationTools::displayBooleanResult("-- Output removed blocks", !trash);
         QualityFilterMafIterator* iterator = new QualityFilterMafIterator(currentIterator, species, ws, st, mq, !trash);
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         its.push_back(iterator);
 
@@ -696,7 +702,7 @@ int main(int args, char** argv)
         }
         ApplicationTools::displayResult("-- Total number of features", featuresSet.getNumberOfFeatures());
         FeatureFilterMafIterator* iterator = new FeatureFilterMafIterator(currentIterator, refSpecies, featuresSet, !trash);
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         its.push_back(iterator);
 
@@ -745,7 +751,7 @@ int main(int args, char** argv)
         unsigned int minLength = ApplicationTools::getParameter<unsigned int>("min_length", cmdArgs, 0);
         ApplicationTools::displayResult("-- Minimum block length required", minLength);
         BlockLengthMafIterator* iterator = new BlockLengthMafIterator(currentIterator, minLength);
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         currentIterator = iterator;
         its.push_back(iterator);
       }
@@ -763,7 +769,7 @@ int main(int args, char** argv)
         if (minSize > 5)
           ApplicationTools::displayWarning("!! Warning, in previous version of maffilter BlockLength was named BlockSize... Check!");
         BlockSizeMafIterator* iterator = new BlockSizeMafIterator(currentIterator, minSize);
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         currentIterator = iterator;
         its.push_back(iterator);
       }
@@ -781,7 +787,7 @@ int main(int args, char** argv)
         string chr = ApplicationTools::getStringParameter("chromosome", cmdArgs, "");
         ApplicationTools::displayResult("-- Chromosome", chr);
         ChromosomeMafIterator* iterator = new ChromosomeMafIterator(currentIterator, ref, chr);
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         currentIterator = iterator;
         its.push_back(iterator);
@@ -797,7 +803,34 @@ int main(int args, char** argv)
         string ref = ApplicationTools::getStringParameter("reference", cmdArgs, "");
         ApplicationTools::displayResult("-- Reference species", ref);
         DuplicateFilterMafIterator* iterator = new DuplicateFilterMafIterator(currentIterator, ref);
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
+        iterator->setVerbose(verbose);
+        currentIterator = iterator;
+        its.push_back(iterator);
+      }
+
+
+      // +-----------------+
+      // | Order filtering |
+      // +-----------------+
+      else if (cmdName == "OrderFilter") {
+        string ref = ApplicationTools::getStringParameter("reference", cmdArgs, "");
+        ApplicationTools::displayResult("-- Reference species", ref);
+
+        string unsortedAction = ApplicationTools::getStringParameter("do_unsorted", cmdArgs, "exception");
+        ApplicationTools::displayResult("-- Unsorted block action", unsortedAction);
+        if (unsortedAction != "none" && unsortedAction != "discard" && unsortedAction != "error")
+          throw Exception("'do_unsorted' must be one of 'none', 'discard' or 'error'.");
+
+        string overlappingAction = ApplicationTools::getStringParameter("do_overlapping", cmdArgs, "exception");
+        ApplicationTools::displayResult("-- Overlapping block action", overlappingAction);
+        if (overlappingAction != "none" && overlappingAction != "discard" && overlappingAction != "error")
+          throw Exception("'do_overlapping' must be one of 'none', 'discard' or 'error'.");
+
+        OrderFilterMafIterator* iterator = new OrderFilterMafIterator(currentIterator, ref,
+            unsortedAction == "discard", unsortedAction == "error",
+            overlappingAction == "discard", overlappingAction == "error");
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         currentIterator = iterator;
         its.push_back(iterator);
@@ -811,7 +844,7 @@ int main(int args, char** argv)
         bool unresolvedAsGaps = ApplicationTools::getBooleanParameter("unresolved_as_gaps", cmdArgs, "");
         ApplicationTools::displayBooleanResult("-- Unresolved as gaps", unresolvedAsGaps);
         RemoveEmptySequencesMafIterator* iterator = new RemoveEmptySequencesMafIterator(currentIterator, unresolvedAsGaps);
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         currentIterator = iterator;
         its.push_back(iterator);
@@ -829,7 +862,7 @@ int main(int args, char** argv)
         string outputFile = ApplicationTools::getAFilePath("file", cmdArgs, false, false);
         bool trash = outputFile == "none";
         FilterTreeMafIterator* iterator = new FilterTreeMafIterator(currentIterator, treeProperty, maxBrLen, !trash);
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         its.push_back(iterator);
 
@@ -904,6 +937,8 @@ int main(int args, char** argv)
           } else if (statName == "SiteFrequencySpectrum") {
             vector<double> bounds  = ApplicationTools::getVectorParameter<double>("bounds", statArgs, ',', "", "", false, true);
             vector<string> ingroup = ApplicationTools::getVectorParameter<string>("ingroup", statArgs, ',', "", "", false, true);
+            if (ingroup.size() < 2)
+              throw Exception("ERROR: at least two ingroup sequences are required to compute the site frequency spectrum.");
             string outgroup        = ApplicationTools::getStringParameter("outgroup", statArgs, "", "", false, true);
             mafStat = new SiteFrequencySpectrumMafStatistics(&AlphabetTools::DNA_ALPHABET, bounds, ingroup, outgroup); 
           } else if (statName == "FourSpeciesSitePatternCounts") {
@@ -929,6 +964,8 @@ int main(int args, char** argv)
             mafStat = new PolymorphismMafStatistics(species); 
           } else if (statName == "DiversityStatistics") {
             vector<string> species = ApplicationTools::getVectorParameter<string>("ingroup", statArgs, ',', "", "", false, true);
+            if (species.size() < 2)
+              throw Exception("ERROR: at least two sequences are required to compute diversity estimators.");
             mafStat = new SequenceDiversityMafStatistics(species); 
           } else if (statName == "CountClusters") {
             string treeProperty = ApplicationTools::getStringParameter("tree", statArgs, "none");
@@ -1086,7 +1123,7 @@ int main(int args, char** argv)
         }
         ApplicationTools::displayResult("-- Total number of features", featuresSet.getNumberOfFeatures());
         FeatureExtractorMafIterator* iterator = new FeatureExtractorMafIterator(currentIterator, refSpecies, featuresSet, completeOnly, ignoreStrand);
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         its.push_back(iterator);
 
@@ -1121,7 +1158,7 @@ int main(int args, char** argv)
           ApplicationTools::displayBooleanResult("-- Keep small blocks", keepSmallBlocks);
 
         WindowSplitMafIterator* iterator = new WindowSplitMafIterator(currentIterator, preferredSize, splitOption, keepSmallBlocks);
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         currentIterator = iterator;
         its.push_back(iterator);
       }
@@ -1155,7 +1192,7 @@ int main(int args, char** argv)
 
           CountDistanceEstimationMafIterator* iterator = new CountDistanceEstimationMafIterator(currentIterator, gapOption, unresolvedAsGap, extendedSeqNames);
           ApplicationTools::displayResult("-- Block-wise matrices are registered as", iterator->getPropertyName());
-          iterator->setLogStream(&log);
+          iterator->setLogStream(log);
           currentIterator = iterator;
           its.push_back(iterator);
         } else if (distMethod == "ml") {
@@ -1188,7 +1225,7 @@ int main(int args, char** argv)
           
           OutputStream* profiler =
             (prPath == "none") ? 0 :
-              (prPath == "std") ? ApplicationTools::message :
+              (prPath == "std") ? ApplicationTools::message.get() :
               new StlOutputStream(new ofstream(prPath.c_str(), ios::out));
           if (profiler)
             profiler->setPrecision(20);
@@ -1198,7 +1235,7 @@ int main(int args, char** argv)
 
           OutputStream* messenger =
             (mhPath == "none") ? 0 :
-              (mhPath == "std") ? ApplicationTools::message :
+              (mhPath == "std") ? ApplicationTools::message.get() :
               new StlOutputStream(new ofstream(mhPath.c_str(), ios::out));
           if (messenger)
             messenger->setPrecision(20);
@@ -1209,7 +1246,7 @@ int main(int args, char** argv)
           MaximumLikelihoodDistanceEstimationMafIterator* iterator = new MaximumLikelihoodDistanceEstimationMafIterator(currentIterator,
               distEst.release(), propGapsToKeep, gapsAsUnresolved, paramOpt, extendedSeqNames);
           ApplicationTools::displayResult("-- Block-wise matrices are registered as", iterator->getPropertyName());
-          iterator->setLogStream(&log);
+          iterator->setLogStream(log);
           iterator->setVerbose(verbose);
           currentIterator = iterator;
           its.push_back(iterator);
@@ -1244,7 +1281,7 @@ int main(int args, char** argv)
 
         DistanceBasedPhylogenyReconstructionMafIterator* iterator = new DistanceBasedPhylogenyReconstructionMafIterator(currentIterator, distMethod, distProperty);
         ApplicationTools::displayResult("-- Writing block-wise trees to", iterator->getPropertyName());
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         currentIterator = iterator;
         its.push_back(iterator);
       }
@@ -1277,7 +1314,7 @@ int main(int args, char** argv)
 
         TreeBuildingSystemCallMafIterator* iterator = new TreeBuildingSystemCallMafIterator(currentIterator, alnWriter, programInputFile, treeReader, programOutputFile, command, propertyName);
 
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         currentIterator = iterator;
         its.push_back(iterator);
       }
@@ -1296,7 +1333,7 @@ int main(int args, char** argv)
         ApplicationTools::displayResult("-- Rerooting according to species", outgroup);
         NewOutgroupMafIterator* iterator = new NewOutgroupMafIterator(currentIterator, treePropertyInput, treePropertyOutput, outgroup);
         ApplicationTools::displayResult("-- Writing tree to", treePropertyOutput);
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         currentIterator = iterator;
         its.push_back(iterator);
       }
@@ -1314,7 +1351,7 @@ int main(int args, char** argv)
         ApplicationTools::displayResult("-- Removing leaves from species", species);
         DropSpeciesMafIterator* iterator = new DropSpeciesMafIterator(currentIterator, treePropertyInput, treePropertyOutput, species);
         ApplicationTools::displayResult("-- Writing tree to", treePropertyOutput);
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         currentIterator = iterator;
         its.push_back(iterator);
       }
@@ -1428,6 +1465,40 @@ int main(int args, char** argv)
 
 
 
+      // +-----------------+
+      // | Output as table |
+      // +-----------------+
+      else if (cmdName == "OutputAsTable") {
+        string outputFile = ApplicationTools::getAFilePath("file", cmdArgs, true, false);
+        compress = ApplicationTools::getStringParameter("compression", cmdArgs, "none");
+        ApplicationTools::displayResult("-- Output table file", outputFile);
+        filtering_ostream* out = new filtering_ostream;
+        if (compress == "none") {
+        } else if (compress == "gzip") {
+          out->push(gzip_compressor());
+        } else if (compress == "zip") {
+          out->push(zlib_compressor());
+        } else if (compress == "bzip2") {
+          out->push(bzip2_compressor());
+        } else
+          throw Exception("Bad output compression format: " + compress);
+        out->push(file_sink(outputFile));
+        ostreams.push_back(out);
+        ApplicationTools::displayResult("-- File compression", compress);
+        string reference = ApplicationTools::getStringParameter("reference", cmdArgs, "");
+        if (reference != "")
+        ApplicationTools::displayResult("-- Reference sequence", reference);
+ 
+        vector<string> species = ApplicationTools::getVectorParameter<string>("species", cmdArgs, ',', "", "", false, false);
+
+        TableOutputMafIterator* iterator = new TableOutputMafIterator(currentIterator, out, species, reference);
+        currentIterator = iterator;
+        its.push_back(iterator);
+      }
+
+
+
+
       // +------------+
       // | VCF output |
       // +------------+
@@ -1464,7 +1535,7 @@ int main(int args, char** argv)
 
         VcfOutputMafIterator* iterator = new VcfOutputMafIterator(currentIterator, out, reference, genotypes, outputAll);
 
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         currentIterator = iterator;
         its.push_back(iterator);
@@ -1503,7 +1574,7 @@ int main(int args, char** argv)
           throw Exception("MsmcOutput: at least two genomes are necessary to call SNPs.");
         MsmcOutputMafIterator* iterator = new MsmcOutputMafIterator(currentIterator, out, species, reference);
 
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         currentIterator = iterator;
         its.push_back(iterator);
@@ -1548,12 +1619,16 @@ int main(int args, char** argv)
         bool map3 = ApplicationTools::getBooleanParameter("map3", cmdArgs, false);
         ApplicationTools::displayBooleanResult("-- Ouput map3 file", map3);
 
+        bool recodeChr = ApplicationTools::getBooleanParameter("recode_chr", cmdArgs, false);
+        ApplicationTools::displayBooleanResult("-- Recode chromosomes", recodeChr);
+
         vector<string> species = ApplicationTools::getVectorParameter<string>("genotypes", cmdArgs, ',', "");
         if (species.size() < 2)
           throw Exception("PlinkOutput: at least two genomes are necessary to call SNPs.");
-        PlinkOutputMafIterator* iterator = new PlinkOutputMafIterator(currentIterator, outPed, outMap, species, reference, map3);
 
-        iterator->setLogStream(&log);
+        PlinkOutputMafIterator* iterator = new PlinkOutputMafIterator(currentIterator, outPed, outMap, species, reference, map3, recodeChr);
+
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         currentIterator = iterator;
         its.push_back(iterator);
@@ -1579,7 +1654,7 @@ int main(int args, char** argv)
 
         SequenceLDhotOutputMafIterator* iterator = new SequenceLDhotOutputMafIterator(currentIterator, outputFile, completeOnly, reference);
 
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         currentIterator = iterator;
         its.push_back(iterator);
@@ -1621,7 +1696,7 @@ int main(int args, char** argv)
         }
         CoordinatesOutputMafIterator* iterator = new CoordinatesOutputMafIterator(currentIterator, out, species, includeSrcSize);
 
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         currentIterator = iterator;
         its.push_back(iterator);
@@ -1639,9 +1714,11 @@ int main(int args, char** argv)
         string targetSpecies = ApplicationTools::getStringParameter("target_species", cmdArgs, "none");
         string featureFile   = ApplicationTools::getAFilePath("feature.file", cmdArgs, false, false);
         string featureFormat = ApplicationTools::getStringParameter("feature.format", cmdArgs, "GFF");
+        bool outputClosest   = ApplicationTools::getBooleanParameter("target_closest_position", cmdArgs, true);
         ApplicationTools::displayResult("-- Features to lift over", featureFile + " (" + featureFormat + ")");
         ApplicationTools::displayResult("-- from species", refSpecies);
         ApplicationTools::displayResult("-- to species", targetSpecies);
+        ApplicationTools::displayBooleanResult("-- closest position if gap", outputClosest);
         compress = ApplicationTools::getStringParameter("feature.file.compression", cmdArgs, "none");
         filtering_istream featureStream;
         if (compress == "none") {
@@ -1686,8 +1763,8 @@ int main(int args, char** argv)
         ApplicationTools::displayResult("-- File compression", compress);
         
         //Iterator initialization:
-        CoordinateTranslatorMafIterator* iterator = new CoordinateTranslatorMafIterator(currentIterator, refSpecies, targetSpecies, featuresSet, *out);
-        iterator->setLogStream(&log);
+        CoordinateTranslatorMafIterator* iterator = new CoordinateTranslatorMafIterator(currentIterator, refSpecies, targetSpecies, featuresSet, *out, outputClosest);
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         its.push_back(iterator);
 
@@ -1785,7 +1862,7 @@ int main(int args, char** argv)
 
         SystemCallMafIterator* iterator = new SystemCallMafIterator(currentIterator, alnWriter, programInputFile, alnReader, programOutputFile, command);
 
-        iterator->setLogStream(&log);
+        iterator->setLogStream(log);
         iterator->setVerbose(verbose);
         currentIterator = iterator;
         its.push_back(iterator);


=====================================
MafFilter/OutputAsFeaturesMafIterator.h
=====================================
--- a/MafFilter/OutputAsFeaturesMafIterator.h
+++ b/MafFilter/OutputAsFeaturesMafIterator.h
@@ -83,7 +83,7 @@ class OutputAsFeaturesMafIterator:
 
 
   public:
-    MafBlock* analyseCurrentBlock_() throw (Exception) {
+    MafBlock* analyseCurrentBlock_() {
       currentBlock_ = iterator_->nextBlock();
       if (output_ && currentBlock_)
         writeBlock(*output_, *currentBlock_);


=====================================
MafFilter/SystemCallMafIterator.cpp
=====================================
--- a/MafFilter/SystemCallMafIterator.cpp
+++ b/MafFilter/SystemCallMafIterator.cpp
@@ -42,7 +42,7 @@ knowledge of the CeCILL license and that you accept its terms.
 using namespace bpp;
 using namespace std;
 
-MafBlock* SystemCallMafIterator::analyseCurrentBlock_() throw (Exception) {
+MafBlock* SystemCallMafIterator::analyseCurrentBlock_() {
   currentBlock_ = iterator_->nextBlock();
   if (! currentBlock_)
     return 0;


=====================================
MafFilter/SystemCallMafIterator.h
=====================================
--- a/MafFilter/SystemCallMafIterator.h
+++ b/MafFilter/SystemCallMafIterator.h
@@ -100,7 +100,7 @@ class SystemCallMafIterator:
 
 
   public:
-    MafBlock* analyseCurrentBlock_() throw (Exception);
+    MafBlock* analyseCurrentBlock_();
 
 };
 


=====================================
MafFilter/TreeBuildingSystemCallMafIterator.cpp
=====================================
--- a/MafFilter/TreeBuildingSystemCallMafIterator.cpp
+++ b/MafFilter/TreeBuildingSystemCallMafIterator.cpp
@@ -45,7 +45,7 @@ knowledge of the CeCILL license and that you accept its terms.
 using namespace bpp;
 using namespace std;
 
-MafBlock* TreeBuildingSystemCallMafIterator::analyseCurrentBlock_() throw (Exception) {
+MafBlock* TreeBuildingSystemCallMafIterator::analyseCurrentBlock_() {
   currentBlock_ = iterator_->nextBlock();
   if (! currentBlock_)
     return 0;


=====================================
MafFilter/TreeBuildingSystemCallMafIterator.h
=====================================
--- a/MafFilter/TreeBuildingSystemCallMafIterator.h
+++ b/MafFilter/TreeBuildingSystemCallMafIterator.h
@@ -105,7 +105,7 @@ class TreeBuildingSystemCallMafIterator:
 
 
   public:
-    MafBlock* analyseCurrentBlock_() throw (Exception);
+    MafBlock* analyseCurrentBlock_();
 
 };
 


=====================================
README.md
=====================================
--- /dev/null
+++ b/README.md
@@ -0,0 +1,11 @@
+# MafFilter
+
+The MafFilter genome alignment processor [[website]](https://jydu.github.io/maffilter/).
+
+If you are using maffilter, please consider citing
+
+```
+Dutheil JY, Gaillard S, Stukenbrock EH.
+BMC Genomics. 2014 Jan 22;15:53.
+MafFilter: a highly flexible and extensible multiple genome alignment files processor.
+```


=====================================
_config.yml
=====================================
--- /dev/null
+++ b/_config.yml
@@ -0,0 +1 @@
+theme: jekyll-theme-tactile
\ No newline at end of file


=====================================
debian/changelog
=====================================
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,9 +1,17 @@
-maffilter (1.2.1-1+dfsg-2) UNRELEASED; urgency=medium
+maffilter (1.3.0+dfsg-1) UNRELEASED; urgency=medium
 
+  [ Steffen Moeller ]
   * Added ref to OMICtools registry
     (bio.tools and RRID entries not available)
 
- -- Steffen Moeller <moeller at debian.org>  Sat, 29 Jul 2017 19:29:20 +0200
+  [ Julien Y. Dutheil ]
+  * New upstream version (Closes: #896486).
+  * Standards-Version: 4.1.4
+  * debhelper 11
+  * Updated Vcs-Browser and Vcs-Git
+  * Updated Homepage
+
+ -- Julien Dutheil <julien.dutheil at univ-montp2.fr>  Mon, 30 Apr 2018 11:57:36 +0200
 
 maffilter (1.2.1+dfsg-1) unstable; urgency=medium
 


=====================================
debian/control
=====================================
--- a/debian/control
+++ b/debian/control
@@ -4,17 +4,17 @@ Uploaders: Andreas Tille <tille at debian.org>,
            Julien Dutheil <julien.dutheil at univ-montp2.fr>
 Section: science
 Priority: optional
-Build-Depends: debhelper (>= 10),
+Build-Depends: debhelper (>= 11~),
                cmake,
                texinfo,
-               libbpp-phyl-omics-dev (>= 2.3.1),
+               libbpp-phyl-omics-dev (>= 2.4.0),
                libboost-iostreams-dev (>= 1.54.0),
                zlib1g-dev,
                libbz2-dev
-Standards-Version: 3.9.8
-Vcs-Browser: https://anonscm.debian.org/cgit/debian-med/maffilter.git
-Vcs-Git: https://anonscm.debian.org/git/debian-med/maffilter.git
-Homepage: http://biopp.univ-montp2.fr/forge/maffilter
+Standards-Version: 4.1.4
+Vcs-Browser: https://salsa.debian.org/med-team/maffilter
+Vcs-Git: https://salsa.debian.org/med-team/maffilter.git
+Homepage: https://jydu.github.io/maffilter/ 
 
 Package: maffilter
 Architecture: any


=====================================
debian/patches/fix_doc_compression.patch
=====================================
--- /dev/null
+++ b/debian/patches/fix_doc_compression.patch
@@ -0,0 +1,15 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 2d4085b..0ee0c4d 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -50,7 +50,8 @@ else ()
+   # Generate command line args (always add -c to output compressed file to stdout)
+   if (${COMPRESS_PROGRAM} STREQUAL "gzip")
+     # -n for no timestamp in files (reproducible builds)
+-    set (COMPRESS_ARGS -c -n)
++    # -9 for maximum compression (lintian error)
++    set (COMPRESS_ARGS -c -n -9)
+   else ()
+     set (COMPRESS_ARGS -c)
+   endif ()
+


=====================================
debian/patches/series
=====================================
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1 @@
+fix_doc_compression.patch


=====================================
debian/rules
=====================================
--- a/debian/rules
+++ b/debian/rules
@@ -1,12 +1,17 @@
 #!/usr/bin/make -f
 
-# DH_VERBOSE := 1
+#export DH_VERBOSE=1
 
 export DEB_BUILD_MAINT_OPTIONS = hardening=+all
+export DEB_CFLAGS_MAINT_APPEND=-DNDEBUG -g
+export DEB_CXXFLAGS_MAINT_APPEND=-DNDEBUG -g
 
 %:
 	dh $@
 
+override_dh_auto_configure:
+	dh_auto_configure -- -DCMAKE_BUILD_TYPE=RelWithDebInfo
+
 override_dh_fixperms:
 	dh_fixperms
 	find debian/*/usr/share -name "*.bpp" -executable -exec chmod -x \{\} \;


=====================================
doc/maffilter.texi
=====================================
--- a/doc/maffilter.texi
+++ b/doc/maffilter.texi
@@ -1,7 +1,7 @@
 \input texinfo   @c -*-texinfo-*-
 @c %**start of header
 @setfilename maffilter.info
- at settitle MafFilter Manual 1.2.1
+ at settitle MafFilter Manual 1.3.0
 @c @documentencoding UTF-8
 @afourpaper
 @dircategory Science Biology Genetics
@@ -12,9 +12,9 @@
 
 
 @copying
-This is the manual of MafFilter, version 1.2.1.
+This is the manual of MafFilter, version 1.3.0.
 
-Copyright @copyright{} 2017 Julien Y. Dutheil
+Copyright @copyright{} 2018 Julien Y. Dutheil
 @end copying
 
 @titlepage
@@ -65,6 +65,7 @@ Extracting data
 * SelectOrphans::
 * Merge::
 * Concatenate::
+* OrderFilter::
 * ExtractFeature::
 * SelectChr::
 * WindowSplit::
@@ -115,6 +116,7 @@ Exporting blocks and data
 
 * Output::
 * OutputAlignments::
+* OutputAsTable::
 * VcfOutput::
 * MsmcOutput::
 * PlinkOutput::
@@ -340,6 +342,7 @@ The next section present all available filters and their corresponding arguments
 * SelectOrphans::
 * Merge::
 * Concatenate::
+* OrderFilter::
 * ExtractFeature::
 * SelectChr::
 * WindowSplit::
@@ -451,7 +454,8 @@ maf.filter=                                 \
     Merge(                                  \
         species=(species1, species2, etc),  \
         dist_max=0,                         \
-        ignore_chr=(Random,Unknown)),       \
+        ignore_chr=(Random,Unknown),        \
+        rename_chimeric_chromosomes=yes),   \
     [...]
 @end example
 @end cartouche
@@ -473,11 +477,15 @@ If dist_max is greater than 0, sequences will be filled with 'N' to preserve coo
 An optional parenthetic list of chromosomes to ignore (typically "Unknown", or "Random", etc.).
 Sequences annotated with such chromosomes will not be checked for synteny and the corresponding block will not be fused.
 
+ at item rename_chimeric_chromosomes=@{boolean@}
+When distinct chromosomes are merged (in non specified species), their names are concatenated. If this option is set to "yes",
+then merged chromosomes will be renamed as "chimtigXXX" where XXX is a number auto-incremented for each species.
+
 @end table
 
 @c ------------------------------------------------------------------------------------------------------------------
 
- at node Concatenate, ExtractFeature, Merge, Extracting
+ at node Concatenate, OrderFilter, Merge, Extracting
 @subsection Concatenating: merge consecutive blocks up to a certain size
 
 The @command{Concatenate} filter fuses consecutive blocks until the concatenated block reaches a minimal size.
@@ -507,7 +515,46 @@ If given, only blocks with identical chromosome tags in the reference species wi
 
 @c ------------------------------------------------------------------------------------------------------------------
 
- at node ExtractFeature, SelectChr, Concatenate, Extracting
+ at node OrderFilter, ExtractFeature, Concatenate, Extracting
+ at subsection OrderFilter: check and eventually discard unordered or overlapping blocks
+
+The @command{OrderFilter} filter check if blocks are sorted according to previous block.
+
+ at heading Synopsis:
+
+ at cartouche
+ at example
+maf.filter=                                 \
+    [...],
+    OrderFilter(                            \
+        reference=ref_genome,               \
+        do_unsorted=discard,                \
+        do_overlapping=discard),            \
+    [...]
+ at end example
+ at end cartouche
+
+ at heading Arguments:
+
+ at table @command
+
+ at item reference=@{string@}
+The sequence for which coordinates should be checked. Block where the reference sequence is absent will be considered as ordered.
+
+Important note: the alignment is supposed to be projected according to the reference sequence. Using the filter on another species might lead to unexpected behavior, in particular as the the reference species is supposed to be mapped on the + strand only.
+
+ at item do_unsorted=@{none|discard|error@}
+Action to perform in case an unsorted block is found (that is, when the right coordinate of the current block is before the left coordinate of the previous one).
+If 'discard', the block will be removed. If 'error', the maffilter with stop with an error.
+
+ at item do_overlapping=@{none|discard|error@}
+Action to perform in case an ovelrapping block is found (that is, when the left coordinate of the current block is before the right coordinate of the previous one, and the right coordinate of the current block is not before the left coordinate of the previous one).
+If 'discard', the block will be removed. If 'error', the maffilter with stop with an error.
+ at end table
+
+ at c ------------------------------------------------------------------------------------------------------------------
+
+ at node ExtractFeature, SelectChr, OrderFilter, Extracting
 @subsection Extract features from the alignment
 
 The @command{ExtractFeature} extracts parts of the alignment corresponding to certain features.
@@ -1399,7 +1446,7 @@ First species to consider (resp. second, third and fourth).
 @subsubsection Site frequency spectrum
 The @command{SiteFrequencySpectrum} computes the site frequency spectrum for each block.
 Only positions in the alignment with only two states are considered.
-The proportions of doubletons are then computed by bins.
+The proportions of bi-allelic sites are then computed by bins.
 Lets consider the following example with 7 sequences:
 @verbatim
 ACGT
@@ -1416,7 +1463,7 @@ It is possible to compute all these frequencies individually by settingthe @comm
 @verbatim
 SiteFrequencySpectrum(bounds=(-0.5,0.5,1.5,2.5,3.5,4.5), ...)
 @end verbatim
-which will output the number of site with 0, 1, 2, 3 or 4 minor states. Sites with more than 2 states are always ocounted separately, as well as sites containing unresolved characters.
+which will output the number of site with 0, 1, 2, 3 or 4 minor states. Sites with more than 2 states are always counted separately, as well as sites containing unresolved characters.
 If one want to count only constant sites for instance, one can simply type
 @verbatim
 SiteFrequencySpectrum(bounds=(-0.5,0.5), ...)
@@ -1523,7 +1570,7 @@ Note that the ``species'' terminology relates to multispecies alignments, as ori
 @command{DiversityStatistics} computes sequence diversity statistics, including:
 @itemize
 @item
-Number of seggregating sites,
+Number of segregating sites,
 @item
 Watterson's theta.
 @item
@@ -1979,6 +2026,7 @@ Compression format for output file (if file != none).
 @menu
 * Output::
 * OutputAlignments::
+* OutputAsTable::
 * VcfOutput::
 * MsmcOutput::
 * PlinkOutput::
@@ -2022,7 +2070,7 @@ Tell if sequences should be masked (if a mask annotation is available), or if ma
 
 @c ------------------------------------------------------------------------------------------------------------------
 
- at node OutputAlignments, VcfOutput, Output, Exporting
+ at node OutputAlignments, OutputAsTable, Output, Exporting
 @subsection Write alignment blocks to an external alignment file.
 
 The @command{OutputAlignments} filter writes all blocks to an external alignment file, potentially losing some information such as coordinates and scores.
@@ -2074,7 +2122,47 @@ The name of reference sequence, which will only be used when %c, %b or %e codes 
 
 @c ------------------------------------------------------------------------------------------------------------------
 
- at node VcfOutput, MsmcOutput, OutputAlignments, Exporting
+ at node OutputAsTable, VcfOutput, OutputAlignments, Exporting
+ at subsection Export given positions into a table format.
+
+The @command{OutputAsTable} filter writes the nucleotide content of given positions in a table format.
+
+ at heading Synopsis:
+
+ at cartouche
+ at example
+maf.filter=                                 \
+    [...],
+    OutputTable(                            \
+        file=data.txt,                      \
+        species=Species1,Species2,Species3, \
+        reference=RefSpecies,               \
+        compression=none),                  \
+    [...]
+ at end example
+ at end cartouche
+
+ at heading Arguments:
+
+ at table @command
+ at item file=@{none|@{path@}@}
+A file path where to write date in table format.
+
+ at item compression=@{none|gzip|zip|bzip2@}
+Compression format for output file.
+
+ at item species=@{list of @{string@}@}
+Select species for which data should be output (one column per species).
+
+ at item reference=@{string@}
+Which species should be used for outputting coordinates.
+
+ at end table
+
+
+ at c ------------------------------------------------------------------------------------------------------------------
+
+ at node VcfOutput, MsmcOutput, OutputAsTable, Exporting
 @subsection Call SNPs from alignment blocks and export to VCF file
 
 The @command{VcfOutput} filter call SNPs from each block and output them to a VCF file.
@@ -2155,7 +2243,7 @@ Compression format for output file.
 A species name corresponding to the sequence to use as reference.
 
 @item genotypes=@{list of species@}
-A list of species for which seggregating sites should be called. It might not contain the reference species, which is then only used for coordinates output.
+A list of species for which segregating sites should be called. It might not contain the reference species, which is then only used for coordinates output.
 Blocks with do not contain all species will not be called, as well as block not contianing the reference species. Note that the alignment has to be projected
 againt the reference species, otherwise an error will be reported.
 
@@ -2203,7 +2291,7 @@ Compression format for output file.
 A species name corresponding to the sequence to use as reference.
 
 @item genotypes=@{list of species@}
-A list of species for which seggregating sites should be called. It might not contain the reference species, which is then only used for coordinates output.
+A list of species for which segregating sites should be called. It might not contain the reference species, which is then only used for coordinates output.
 Blocks with do not contain all species will not be called, as well as block not contianing the reference species. Note that the alignment has to be projected
 againt the reference species, otherwise an error will be reported.
 
@@ -2362,6 +2450,7 @@ maf.filter=                                 \
     LiftOver(                               \
         ref_species=species1,               \
         target_species=species2,            \
+        target_closest_position=yes,        \
         feature.file=species1.gff3.gz,      \
         feature.file.compression=gzip,      \
         feature.format=GFF,                 \
@@ -2381,6 +2470,9 @@ The name of the species for which the coordinates of the features are provided.
 @item target_species=@{string@}
 The name of the species to which the coordinates of the features should be converted.
 
+ at item target_closest_position=@{boolean@}
+In case the target sequence has a gap at the given position, outputs the coordinate of the previous non-gap position, otherwise NA.
+
 @item feature.file=@{path@}
 The file where the features are described.
 


=====================================
docs/_config.yml
=====================================
--- /dev/null
+++ b/docs/_config.yml
@@ -0,0 +1,5 @@
+theme: jekyll-theme-tactile
+title: MafFilter
+description: a genome alignment processor
+show_downloads: true
+share: true


=====================================
docs/index.md
=====================================
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,54 @@
+**MafFilter** is a program dedicated to the analysis of genome alignments. It parses and manipulates [MAF files](https://genome.ucsc.edu/FAQ/FAQformat.html#format5) as well as more simple fasta files. Despite various filtering options and format conversion tools, **MafFilter** can compute a wide range of statistics (phylogenetic trees, nucleotide diversity, inferrence of selection, etc.). Current version is 1.2.1.
+
+
+## What can MafFilter do?
+
+**MafFilter** applies a series of "filters" to a MAF file, in order to clean it, extract data and computer statistics while keeping track of the associated meta-data such as genome coordinates and quality scores.
+
+* It can process the alignment to remove low-quality / ambiguous / masked regions.
+* It can export data into a single or multiple alignment file in format such as Fasta or Clustal.
+* It can read annotation data in GFF or GTF format, and extract the corresponding alignment.
+* It can perform sliding windows calculations.
+* It can reconstruct phylogeny/genealogy along the genome alignment.
+* It can compute population genetics statistics, such as site frequency spectrum, number of fixed/polymorphic sites, etc.
+
+## How can I get it?
+
+**MafFilter** is built using the [Bio++ libraries](http://biopp.univ-montp2.fr), as well as the boost iostream library for handling of compressed files. [Debian](https://packages.debian.org/search?keywords=maffilter&searchon=names&suite=all&section=all) and [RPM](https://download.opensuse.org/repositories/home:/jdutheil:/Bio++2.3.0/) packages are available.
+
+For compiling the programs yourself, from the downloaded sources or from the git repository, please follow the instructions from the [Bio++ website](http://biopp.univ-montp2.fr/wiki/index.php/Installation).
+
+## How do I use it? 
+
+Several example data sets are distributed along with the source code of the package. A reference manual is also available [here](http://biopp.univ-montp2.fr/manual/html/maffilter/), or can be downloaded as [PDF](http://biopp.univ-montp2.fr/manual/pdf/maffilter/). Questions can be asked on the dedicated forum: [here](https://groups.google.com/forum/?hl=en#!forum/maffilter).
+
+## References
+
+The **MafFilter** program was published in
+
+```
+Dutheil JY, Gaillard S, Stukenbrock EH.
+BMC Genomics. 2014 Jan 22;15:53.
+MafFilter: a highly flexible and extensible multiple genome alignment files processor.
+```
+Please consider citing this work if you are using the program. 
+
+MafFilter was originally developped in the context of the study of the Gorilla genome sequence
+
+```
+Scally A, Dutheil JY, Hillier LW, Jordan GE, Goodhead I, Herrero J, Hobolth A, Lappalainen T, Mailund T, Marques-Bonet T, McCarthy S, Montgomery SH, Schwalie PC, Tang YA, Ward MC, Xue Y, Yngvadottir B, Alkan C, Andersen LN, Ayub Q, Ball EV, Beal K, Bradley BJ, Chen Y, Clee CM, Fitzgerald S, Graves TA, Gu Y, Heath P, Heger A, Karakoc E, Kolb-Kokocinski A, Laird GK, Lunter G, Meader S, Mort M, Mullikin JC, Munch K, O'Connor TD, Phillips AD, Prado-Martinez J, Rogers AS, Sajjadian S, Schmidt D, Shaw K, Simpson JT, Stenson PD, Turner DJ, Vigilant L, Vilella AJ, Whitener W, Zhu B, Cooper DN, de Jong P, Dermitzakis ET, Eichler EE, Flicek P, Goldman N, Mundy NI, Ning Z, Odom DT, Ponting CP, Quail MA, Ryder OA, Searle SM, Warren WC, Wilson RK, Schierup MH, Rogers J, Tyler-Smith C, Durbin R.
+Nature. 2012 Mar 7;483(7388):169-75.
+Insights into hominid evolution from the gorilla genome sequence.
+```
+and was further developped in the following studies:
+
+```
+Stukenbrock EH, Bataillon T, Dutheil JY, Hansen TT, Li R, Zala M, McDonald BA, Wang J, Schierup MH.
+Genome Res. 2011 Dec;21(12):2157-66.
+The making of a new pathogen: insights from comparative population genomics of the domesticated wheat pathogen Mycosphaerella graminicola and its wild sister species.
+
+Stukenbrock EH, Christiansen FB, Hansen TT, Dutheil JY, Schierup MH.
+Proc Natl Acad Sci U S A. 2012 Jul 3;109(27):10954-9.
+Fusion of two divergent fungal individuals led to the recent emergence of a unique widespread pathogen species.
+
+```


=====================================
maffilter.spec
=====================================
--- a/maffilter.spec
+++ b/maffilter.spec
@@ -1,41 +1,38 @@
-%define _basename maffilter
-%define _version 1.2.1
-%define _release 1
 %define _prefix /usr
 
 URL: http://bioweb.me/maffilter
 
-Name: %{_basename}
-Version: %{_version}
-Release: %{_release}
+Name: maffilter
+Version: 1.3.0
+Release: 1%{?dist}
 License: CECILL-2.0
 Vendor: The Bio++ Project
-Source: %{_basename}-%{_version}.tar.gz
+Source: %{name}-%{version}.tar.gz
 Summary: The Multiple Alignment Format file processor
 Group: Productivity/Scientific/Other
 
-Requires: libbpp-phyl-omics2 = 2.3.1
-Requires: libbpp-seq-omics2 = 2.3.1
-Requires: libbpp-phyl11 = 2.3.1
-Requires: libbpp-seq11 = 2.3.1
-Requires: libbpp-core3 = 2.3.1
+Requires: libbpp-phyl-omics3 = 2.4.0
+Requires: libbpp-seq-omics3 = 2.4.0
+Requires: libbpp-phyl12 = 2.4.0
+Requires: libbpp-seq12 = 2.4.0
+Requires: libbpp-core4 = 2.4.0
 Requires: zlib
 
-BuildRoot: %{_builddir}/%{_basename}-root
+BuildRoot: %{_builddir}/%{name}-root
 BuildRequires: cmake >= 2.8.11
 BuildRequires: gcc-c++ >= 4.7.0
 BuildRequires: groff
 BuildRequires: texinfo >= 4.0.0
-BuildRequires: libbpp-core3 = 2.3.1
-BuildRequires: libbpp-core-devel = 2.3.1
-BuildRequires: libbpp-seq11 = 2.3.1
-BuildRequires: libbpp-seq-devel = 2.3.1
-BuildRequires: libbpp-phyl11 = 2.3.1
-BuildRequires: libbpp-phyl-devel = 2.3.1
-BuildRequires: libbpp-seq-omics2 = 2.3.1
-BuildRequires: libbpp-seq-omics-devel = 2.3.1
-BuildRequires: libbpp-phyl-omics2 = 2.3.1
-BuildRequires: libbpp-phyl-omics-devel = 2.3.1
+BuildRequires: libbpp-core4 = 2.4.0
+BuildRequires: libbpp-core-devel = 2.4.0
+BuildRequires: libbpp-seq12 = 2.4.0
+BuildRequires: libbpp-seq-devel = 2.4.0
+BuildRequires: libbpp-phyl12 = 2.4.0
+BuildRequires: libbpp-phyl-devel = 2.4.0
+BuildRequires: libbpp-seq-omics3 = 2.4.0
+BuildRequires: libbpp-seq-omics-devel = 2.4.0
+BuildRequires: libbpp-phyl-omics3 = 2.4.0
+BuildRequires: libbpp-phyl-omics-devel = 2.4.0
 BuildRequires: zlib-devel
 
 %if 0%{?fedora} >= 22
@@ -110,6 +107,7 @@ rm -rf $RPM_BUILD_ROOT
 %{_prefix}/share/info/maffilter.info.%{zipext}
 
 %changelog
+* Wed Mar 14 2018 Julien Dutheil <dutheil at evolbio.mpg.de> 1.3.0-1
 * Fri Jun 09 2017 Julien Dutheil <dutheil at evolbio.mpg.de> 1.2.1-1
 * Wed May 24 2017 Julien Dutheil <dutheil at evolbio.mpg.de> 1.2.0-1
 * Fri Sep 26 2014 Julien Dutheil <julien.dutheil at univ-montp2.fr> 1.1.0-1


=====================================
utils/convertAln.py
=====================================
--- /dev/null
+++ b/utils/convertAln.py
@@ -0,0 +1,15 @@
+#! /usr/bin/python
+
+# Convert an alignment into a single-block MAF file.
+import sys
+from Bio import AlignIO
+alignment = AlignIO.read(open(sys.argv[1] + ".phy"), "phylip")
+print "Alignment length %i" % alignment.get_alignment_length()
+# Convert to maf:
+maf = open(sys.argv[1] + ".maf", 'w')
+maf.write("##maf version=1\n")
+maf.write("#Generated from a single alignment\n\n")
+maf.write("a\n")
+for record in alignment :
+    maf.write("s seq%s.1\t0\t%d\t+\t%d\t%s\n" % (record.id, len(record.seq), len(record.seq), record.seq))
+maf.close()



View it on GitLab: https://salsa.debian.org/med-team/maffilter/compare/feedae8bf6b49603b50ac8dcf41dd6358c8d506a...8dda36da0cd603fd8a5ec0baceccd08bc30d4c9c

---
View it on GitLab: https://salsa.debian.org/med-team/maffilter/compare/feedae8bf6b49603b50ac8dcf41dd6358c8d506a...8dda36da0cd603fd8a5ec0baceccd08bc30d4c9c
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/debian-med-commit/attachments/20180430/491e302c/attachment-0001.html>


More information about the debian-med-commit mailing list