Commit 9590ab80 authored by Shayan Doust's avatar Shayan Doust
Browse files

Add header to patch

parent 8c625dba
Loading
Loading
Loading
Loading
+149 −141
Original line number Diff line number Diff line
diff --git a/format_input.py b/format_input.py
index dd3d2e0..8873ecb 100755
--- a/format_input.py
+++ b/format_input.py
@@ -55,7 +55,7 @@ def read_input_file(inp_file, CommonArea):
Description: use 2to3 to port from python2 to python3
Author: Shayan Doust <hello@shayandoust.me>
Bug-Debian: https://bugs.debian.org/936836
Last-Update: 2019-09-06

Index: lefse/format_input.py
===================================================================
--- lefse.orig/format_input.py	2019-09-06 12:01:19.030688896 +0100
+++ lefse/format_input.py	2019-09-06 12:01:19.010689029 +0100
@@ -55,7 +55,7 @@
 		return CommonArea
 
 def transpose(data):
@@ -11,7 +16,7 @@ index dd3d2e0..8873ecb 100755
 
 def read_params(args):
 	parser = argparse.ArgumentParser(description='LEfSe formatting modules')
@@ -170,24 +170,24 @@ def get_class_slices(data):
@@ -170,24 +170,24 @@
 
 def numerical_values(feats,norm):
 	mm = []
@@ -42,7 +47,7 @@ index dd3d2e0..8873ecb 100755
 		feats[k] = [val*mul[i] for i,val in enumerate(v)]
 		if numpy.mean(feats[k]) and (numpy.std(feats[k])/numpy.mean(feats[k])) < 1e-10:
 			feats[k] = [ float(round(kv*1e6)/1e6) for kv in feats[k]]
@@ -237,7 +237,7 @@ def add_missing_levels(ff):
@@ -237,7 +237,7 @@
 				clades2leaves[n].append( f )
 			else:
 				clades2leaves[n] = [f]
@@ -51,7 +56,7 @@ index dd3d2e0..8873ecb 100755
 		if k and k not in ff:
 			ff[k] = [sum(a) for a in zip(*[[float(fn) for fn in ff[vv]] for vv in v])]
 	return ff
@@ -306,7 +306,7 @@ def biom_processing(inp_file):
@@ -306,7 +306,7 @@
 	for IDMetadataEntry in CommonArea['abndData'].funcGetMetadataCopy()[IDMetadataName]:  #* Loop on all the metadata values
 		IDMetadata.append(IDMetadataEntry)
 	ResolvedData.append(IDMetadata)					#Add the IDMetadata with all its values to the resolved area
@@ -60,7 +65,7 @@ index dd3d2e0..8873ecb 100755
 		if  key  != IDMetadataName:
 			MetadataEntry = list()		#*  Set it up
 			MetadataEntry.append(key)	#*	And post it to the area
@@ -358,7 +358,7 @@ def  check_params_for_biom_case(params, CommonArea):
@@ -358,7 +358,7 @@
 			else:
 				FlagError = True
 		if FlagError == True:		#* If the User passed an invalid class
@@ -69,7 +74,7 @@ index dd3d2e0..8873ecb 100755
 			params['class'] =  2
 			params['subclass'] =  3
 	return params
@@ -375,8 +375,8 @@ if  __name__ == '__main__':
@@ -375,8 +375,8 @@
 	#*************************************************************
 	if  params['input_file'].endswith('.biom'):
 		try:
@@ -80,7 +85,7 @@ index dd3d2e0..8873ecb 100755
 		except ImportError:
 			sys.stderr.write("************************************************************************************************************ \n")
 			sys.stderr.write("* Error:   Breadcrumbs libraries not detected - required to process biom files - run abnormally terminated * \n")
@@ -403,16 +403,16 @@ if  __name__ == '__main__':
@@ -403,16 +403,16 @@
 	if not params['subclass'] is None: ncl += 1	
 	if not params['subject'] is None: ncl += 1	
 
@@ -101,7 +106,7 @@ index dd3d2e0..8873ecb 100755
 #	data.insert(0,first_line)
 #	data = remove_missing(data,params['missing_p'])
 	cls = {}
@@ -426,7 +426,7 @@ if  __name__ == '__main__':
@@ -426,7 +426,7 @@
 	
 	cls['subclass'] = rename_same_subcl(cls['class'],cls['subclass'])
 #	if 'subclass' in cls.keys(): cls = group_small_subclasses(cls,params['subcl_min_card'])
@@ -110,7 +115,7 @@ index dd3d2e0..8873ecb 100755
     
 	feats = dict([(d[0],d[1:]) for d in data])
     
@@ -446,7 +446,7 @@ if  __name__ == '__main__':
@@ -446,7 +446,7 @@
 			if 'class' in cls: outf.write( "\t".join(list(["class"])+list(cls['class'])) + "\n" )
 			if 'subclass' in cls: outf.write( "\t".join(list(["subclass"])+list(cls['subclass'])) + "\n" )
 			if 'subject' in cls: outf.write( "\t".join(list(["subject"])+list(cls['subject']))  + "\n" )
@@ -119,11 +124,11 @@ index dd3d2e0..8873ecb 100755
 
 	with open(params['output_file'], 'wb') as back_file:
 		pickle.dump(out,back_file)    	
diff --git a/lefse.py b/lefse.py
index 0a29be0..75fc246 100755
--- a/lefse.py
+++ b/lefse.py
@@ -17,14 +17,14 @@ def init():
Index: lefse/lefse.py
===================================================================
--- lefse.orig/lefse.py	2019-09-06 12:01:19.030688896 +0100
+++ lefse/lefse.py	2019-09-06 12:01:19.010689029 +0100
@@ -17,14 +17,14 @@
 
 def get_class_means(class_sl,feats):
 	means = {}
@@ -141,7 +146,7 @@ index 0a29be0..75fc246 100755
 			out.write(k+"\t"+str(math.log(max(max(v),1.0),10.0))+"\t")
 			if k in res['lda_res_th']:
 				for i,vv in enumerate(v):
@@ -64,7 +64,7 @@ def test_rep_wilcoxon_r(sl,cl_hie,feats,th,multiclass_strat,mul_cor,fn,min_c,com
@@ -64,7 +64,7 @@
 	tot_ok =  0
 	alpha_mtc = th
 	all_diff = []
@@ -150,7 +155,7 @@ index 0a29be0..75fc246 100755
 		dir_cmp = "not_set" #
 		l_subcl1, l_subcl2 = (len(cl_hie[pair[0]]), len(cl_hie[pair[1]]))
 		if mul_cor != 0: alpha_mtc = th*l_subcl1*l_subcl2 if mul_cor == 2 else 1.0-math.pow(1.0-th,l_subcl1*l_subcl2)
@@ -120,8 +120,8 @@ def test_rep_wilcoxon_r(sl,cl_hie,feats,th,multiclass_strat,mul_cor,fn,min_c,com
@@ -120,8 +120,8 @@
 		if not diff and multiclass_strat: return False
 		if diff and not multiclass_strat: all_diff.append(pair)
 	if not multiclass_strat:
@@ -161,7 +166,7 @@ index 0a29be0..75fc246 100755
 			nk = 0
 			for a in all_diff:
 				if k in a: nk += 1
@@ -132,7 +132,7 @@ def test_rep_wilcoxon_r(sl,cl_hie,feats,th,multiclass_strat,mul_cor,fn,min_c,com
@@ -132,7 +132,7 @@
 
 
 def contast_within_classes_or_few_per_class(feats,inds,min_cl,ncl):
@@ -170,7 +175,7 @@ index 0a29be0..75fc246 100755
 	cols = [ff[i] for i in inds]
 	cls = [feats['class'][i] for i in inds]
 	if len(set(cls)) < ncl:
@@ -147,8 +147,8 @@ def contast_within_classes_or_few_per_class(feats,inds,min_cl,ncl):
@@ -147,8 +147,8 @@
 	return False 
 
 def test_lda_r(cls,feats,cl_sl,boots,fract_sample,lda_th,tol_min,nlogs):
@@ -181,7 +186,7 @@ index 0a29be0..75fc246 100755
         feats['class'] = list(cls['class'])
         clss = list(set(feats['class']))
         for uu,k in enumerate(fk):
@@ -160,7 +160,7 @@ def test_lda_r(cls,feats,cl_sl,boots,fract_sample,lda_th,tol_min,nlogs):
@@ -160,7 +160,7 @@
                                 if feats['class'][i] == c:
                                         feats[k][i] = math.fabs(feats[k][i] + lrand.normalvariate(0.0,max(feats[k][i]*0.05,0.01)))
         rdict = {}
@@ -190,7 +195,7 @@ index 0a29be0..75fc246 100755
                 if a == 'class' or a == 'subclass' or a == 'subject':
                         rdict[a] = robjects.StrVector(b)
                 else: rdict[a] = robjects.FloatVector(b)
@@ -210,7 +210,7 @@ def test_lda_r(cls,feats,cl_sl,boots,fract_sample,lda_th,tol_min,nlogs):
@@ -210,7 +210,7 @@
         for k in fk:
 		m = max([numpy.mean([means[k][kk][p] for kk in range(boots)]) for p in range(len(pairs))])
                 res[k] = math.copysign(1.0,m)*math.log(1.0+math.fabs(m),10)
@@ -199,10 +204,10 @@ index 0a29be0..75fc246 100755
 
 
 def test_svm(cls,feats,cl_sl,boots,fract_sample,lda_th,tol_min,nsvm):
diff --git a/lefse2circlader.py b/lefse2circlader.py
index 79cc2a0..db01218 100755
--- a/lefse2circlader.py
+++ b/lefse2circlader.py
Index: lefse/lefse2circlader.py
===================================================================
--- lefse.orig/lefse2circlader.py	2019-09-06 12:01:19.030688896 +0100
+++ lefse/lefse2circlader.py	2019-09-06 12:01:19.010689029 +0100
@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 
@@ -211,11 +216,11 @@ index 79cc2a0..db01218 100755
 
 import sys
 import os
diff --git a/lefsebiom/AbundanceTable.py b/lefsebiom/AbundanceTable.py
index 77c11aa..349af50 100755
--- a/lefsebiom/AbundanceTable.py
+++ b/lefsebiom/AbundanceTable.py
@@ -4,24 +4,24 @@ Description: Class to abstract an abundance table and methods to run on such a t
Index: lefse/lefsebiom/AbundanceTable.py
===================================================================
--- lefse.orig/lefsebiom/AbundanceTable.py	2019-09-06 12:01:19.030688896 +0100
+++ lefse/lefsebiom/AbundanceTable.py	2019-09-06 12:01:19.018688976 +0100
@@ -4,24 +4,24 @@
 """
 
 #####################################################################################
@@ -255,7 +260,7 @@ index 77c11aa..349af50 100755
 #####################################################################################
 
 __author__ = "Timothy Tickle"
@@ -35,8 +35,8 @@ __status__ = "Development"
@@ -35,8 +35,8 @@
 import csv
 import sys
 import blist
@@ -266,7 +271,7 @@ index 77c11aa..349af50 100755
 import copy
 from datetime import date
 import numpy as np
@@ -44,690 +44,731 @@ import os
@@ -44,690 +44,731 @@
 import re
 import scipy.stats
 import string
@@ -523,13 +528,61 @@ index 77c11aa..349af50 100755
-
-		#The original number of features in the table
-		self._iOriginalFeatureCount = -1
+    """
+    Represents an abundance table and contains common function to perform on the object.
 
-
-		#The name of the object relating to the file it was read from or would have been read from if it exists
-		#Keeps tract of changes to the file through the name
-		#Will be used to write out the object to a file as needed
-		self._strOriginalName = strName
-
-		#The original number of samples in the table
-		self._iOriginalSampleCount = -1
-
-		#Data sparsity type
-		self.fSparseMatrix = dictFileMetadata.get(ConstantsBreadCrumbs.c_strSparsityKey,False) if dictFileMetadata else False
-
-		### Data metadata
-		#The column (sample) metdata
-		self._dictTableMetadata = dictMetadata
-
-		#The row (feature) metadata (Row Metadata object)
-		self.rwmtRowMetadata = rwmtRowMetadata
+    """
+    Represents an abundance table and contains common function to perform on the object.
 
-		### Data
-
-		#The abundance data
-		self._npaFeatureAbundance = npaAbundance
-
-
-		### Logistical
-
-		#Clade prefixes for biological samples
-		self._lsCladePrefixes = ["k__","p__","c__","o__","f__","g__","s__"]
-
-		#This is not a hashable object
-		self.__hash__ = None
-
-
-		### Prep the object
-
-		self._fIsNormalized = self._fIsSummed = None
-		#If contents is not a false then set contents to appropriate objects
-		# Checking to see if the data is normalized, summed and if we need to run a filter on it.
-		if ( self._npaFeatureAbundance != None ) and self._dictTableMetadata:
-			self._iOriginalFeatureCount = self._npaFeatureAbundance.shape[0]
-			self._iOriginalSampleCount = len(self.funcGetSampleNames())
-		
-			self._fIsNormalized = ( max( [max( list(a)[1:] or [0] ) for a in self._npaFeatureAbundance] or [0] ) <= 1 )
-
-			lsLeaves = AbundanceTable.funcGetTerminalNodesFromList( [a[0] for a in self._npaFeatureAbundance], self._cFeatureDelimiter )
-			self._fIsSummed = ( len( lsLeaves ) != len( self._npaFeatureAbundance ) )
-
-			#Occurence filtering
-			#Removes features that do not have a given level iLowestAbundance in a given amount of samples iLowestSampleOccurence
-			if ( not self._fIsNormalized ) and lOccurenceFilter:
-				iLowestAbundance, iLowestSampleOccurrence = lOccurenceFilter
-				self.funcFilterAbundanceBySequenceOccurence( iLowestAbundance, iLowestSampleOccurrence )
+    This class is made from an abundance data file. What is expected is a text file delimited by
+    a character (which is given to the object). The first column is expected to be the id column
+    for each of the rows. Metadata is expected before measurement data. Columns are samples and
@@ -537,15 +590,11 @@ index 77c11aa..349af50 100755
+
+    This object is currently not hashable.
+    """
 
-		#The original number of samples in the table
-		self._iOriginalSampleCount = -1
+
+    def __init__(self, npaAbundance, dictMetadata, strName, strLastMetadata, rwmtRowMetadata=None, dictFileMetadata=None, lOccurenceFilter=None, cFileDelimiter=ConstantsBreadCrumbs.c_cTab, cFeatureNameDelimiter="|"):
+        """
+        Constructor for an abundance table.
 
-		#Data sparsity type
-		self.fSparseMatrix = dictFileMetadata.get(ConstantsBreadCrumbs.c_strSparsityKey,False) if dictFileMetadata else False
+
+        :param	npaAbundance:	Structured Array of abundance data (Row=Features, Columns=Samples)
+        :type:	Numpy Structured Array abundance data (Row=Features, Columns=Samples)
+        :param	dictMetadata:	Dictionary of metadata {"String ID":["strValue","strValue","strValue","strValue","strValue"]}
@@ -651,51 +700,11 @@ index 77c11aa..349af50 100755
+
+            self._fIsNormalized = (
+                max([max(list(a)[1:] or [0]) for a in self._npaFeatureAbundance] or [0]) <= 1)
 
-		### Data metadata
-		#The column (sample) metdata
-		self._dictTableMetadata = dictMetadata
+
+            lsLeaves = AbundanceTable.funcGetTerminalNodesFromList(
+                [a[0] for a in self._npaFeatureAbundance], self._cFeatureDelimiter)
+            self._fIsSummed = (len(lsLeaves) != len(self._npaFeatureAbundance))
 
-		#The row (feature) metadata (Row Metadata object)
-		self.rwmtRowMetadata = rwmtRowMetadata
-
-		### Data
-
-		#The abundance data
-		self._npaFeatureAbundance = npaAbundance
-
-
-		### Logistical
-
-		#Clade prefixes for biological samples
-		self._lsCladePrefixes = ["k__","p__","c__","o__","f__","g__","s__"]
-
-		#This is not a hashable object
-		self.__hash__ = None
-
-
-		### Prep the object
-
-		self._fIsNormalized = self._fIsSummed = None
-		#If contents is not a false then set contents to appropriate objects
-		# Checking to see if the data is normalized, summed and if we need to run a filter on it.
-		if ( self._npaFeatureAbundance != None ) and self._dictTableMetadata:
-			self._iOriginalFeatureCount = self._npaFeatureAbundance.shape[0]
-			self._iOriginalSampleCount = len(self.funcGetSampleNames())
-		
-			self._fIsNormalized = ( max( [max( list(a)[1:] or [0] ) for a in self._npaFeatureAbundance] or [0] ) <= 1 )
-
-			lsLeaves = AbundanceTable.funcGetTerminalNodesFromList( [a[0] for a in self._npaFeatureAbundance], self._cFeatureDelimiter )
-			self._fIsSummed = ( len( lsLeaves ) != len( self._npaFeatureAbundance ) )
-
-			#Occurence filtering
-			#Removes features that do not have a given level iLowestAbundance in a given amount of samples iLowestSampleOccurence
-			if ( not self._fIsNormalized ) and lOccurenceFilter:
-				iLowestAbundance, iLowestSampleOccurrence = lOccurenceFilter
-				self.funcFilterAbundanceBySequenceOccurence( iLowestAbundance, iLowestSampleOccurrence )
+
+            # Occurence filtering
+            # Removes features that do not have a given level iLowestAbundance in a given amount of samples iLowestSampleOccurence
+            if (not self._fIsNormalized) and lOccurenceFilter:
@@ -1418,7 +1427,8 @@ index 77c11aa..349af50 100755
 +										The last dict is a collection of BIOM fielparameters when converting from a BIOM file
 +										[Numpy structured Array, Dictionary, Numpy structured array, dict]
-		"""
-
+        """
 
-		# Open file from a stream or file path
-		istmInput = open( xInputFile, 'rU' ) if isinstance(xInputFile, str) else xInputFile
-		# Flag that when incremented will switch from metadata parsing to data parsing
@@ -1529,8 +1539,6 @@ index 77c11aa..349af50 100755
-                    ConstantsBreadCrumbs.c_strTypekey:ConstantsBreadCrumbs.c_strDefaultPCLFileTpe,
-                    ConstantsBreadCrumbs.c_strURLKey:ConstantsBreadCrumbs.c_strDefaultPCLURL,
-                    ConstantsBreadCrumbs.c_strSparsityKey:ConstantsBreadCrumbs. c_fDefaultPCLSparsity}]
+        """
+
+        # Open file from a stream or file path
+        istmInput = open(xInputFile, 'rU') if isinstance(
+            xInputFile, str) else xInputFile
@@ -1654,7 +1662,7 @@ index 77c11aa..349af50 100755
 
 #	def funcAdd(self,abndTwo,strFileName=None):
 #		"""
@@ -769,7 +810,7 @@ class AbundanceTable:
@@ -769,7 +810,7 @@
 #		lsFeaturesCombined = list(set(lsFeatures1+lsFeature2))
 #
 #		#Add samples by features (Use 0.0 for empty data features, use NA for empty metadata features)
@@ -1663,7 +1671,7 @@ index 77c11aa..349af50 100755
 #
 #		#Combine metadata
 #		dictMetadata1 = self.funcGetMetadataCopy()
@@ -797,1660 +838,1753 @@ class AbundanceTable:
@@ -797,1660 +838,1753 @@
 #				strLastMetadata = self.funcGetLastMetadataName(),
 #				cFileDelimiter = self.funcGetFileDelimiter(), cFeatureNameDelimiter=self.funcGetFeatureDelimiter())
 
@@ -5074,11 +5082,11 @@ index 77c11aa..349af50 100755
+
+        BiomCommonArea[ConstantsBreadCrumbs.c_BiomFileInfo][strInsertKey] = PostBiomValue
+        return BiomCommonArea
diff --git a/lefsebiom/CClade.py b/lefsebiom/CClade.py
index 5bd1c44..48e7031 100644
--- a/lefsebiom/CClade.py
+++ b/lefsebiom/CClade.py
@@ -85,7 +85,7 @@ class CClade:
Index: lefse/lefsebiom/CClade.py
===================================================================
--- lefse.orig/lefsebiom/CClade.py	2019-09-06 12:01:19.030688896 +0100
+++ lefse/lefsebiom/CClade.py	2019-09-06 12:01:19.018688976 +0100
@@ -85,7 +85,7 @@
             #Then take a copy of the child's
             #If they now have a copy of a child's but have other children
             #Sum their children with thier current values
@@ -5087,7 +5095,7 @@ index 5bd1c44..48e7031 100644
 				adChild = pChild.impute( )
 				if self.m_adValues:
 					for i in range( len( adChild or [] ) ):
@@ -118,7 +118,7 @@ class CClade:
@@ -118,7 +118,7 @@
                         #Union all the results from freeze of all children
                         #Call freeze but append the child clade to the clade in the call.
                         #And give an incremented depth
@@ -5096,7 +5104,7 @@ index 5bd1c44..48e7031 100644
 				setiRet |= pChild._freeze( hashValues, iTarget, astrClade + [strChild], iDepth, fLeaves )
 			setiRet = set( ( i + 1 ) for i in setiRet )
 		else:
@@ -155,7 +155,7 @@ class CClade:
@@ -155,7 +155,7 @@
 			if self.m_hashChildren:
 				strRet += " "
 		if self.m_hashChildren:
@@ -5105,11 +5113,11 @@ index 5bd1c44..48e7031 100644
 		
 		return ( strRet + ">" )
 		
diff --git a/lefsebiom/ValidateData.py b/lefsebiom/ValidateData.py
index 5943240..d95222f 100755
--- a/lefsebiom/ValidateData.py
+++ b/lefsebiom/ValidateData.py
@@ -449,7 +449,7 @@ class ValidateData:
Index: lefse/lefsebiom/ValidateData.py
===================================================================
--- lefse.orig/lefsebiom/ValidateData.py	2019-09-06 12:01:19.030688896 +0100
+++ lefse/lefsebiom/ValidateData.py	2019-09-06 12:01:19.018688976 +0100
@@ -449,7 +449,7 @@
 
         #Check elements
         listSize = len(parameterValue)
@@ -5118,7 +5126,7 @@ index 5943240..d95222f 100755
             if(not ValidateData.funcIsValidNumeric(parameterValue[i])):
                 return False
         return True
@@ -472,7 +472,7 @@ class ValidateData:
@@ -472,7 +472,7 @@
 
         #Check elements
         listSize = len(parameterValue)
@@ -5127,7 +5135,7 @@ index 5943240..d95222f 100755
             if(not ValidateData.funcIsValidString(parameterValue[i])):
                 return False
         return True
@@ -520,7 +520,7 @@ class ValidateData:
@@ -520,7 +520,7 @@
             return False
 
         #Check key elements
@@ -5136,7 +5144,7 @@ index 5943240..d95222f 100755
         keyListSize = len(keyList)
         for i in range(0,keyListSize):
             if keyList[i] == None:
@@ -530,7 +530,7 @@ class ValidateData:
@@ -530,7 +530,7 @@
                     return False
 
         #Check key elements
@@ -5145,10 +5153,10 @@ index 5943240..d95222f 100755
         itemListSize = len(itemList)
 
         for i in range(0,itemListSize):
diff --git a/plot_cladogram.py b/plot_cladogram.py
index 1b95358..0faba08 100755
--- a/plot_cladogram.py
+++ b/plot_cladogram.py
Index: lefse/plot_cladogram.py
===================================================================
--- lefse.orig/plot_cladogram.py	2019-09-06 12:01:19.030688896 +0100
+++ lefse/plot_cladogram.py	2019-09-06 12:01:19.018688976 +0100
@@ -3,7 +3,7 @@
 import os,sys,matplotlib,argparse,string
 matplotlib.use('Agg')
@@ -5158,7 +5166,7 @@ index 1b95358..0faba08 100755
 import numpy as np
 
 colors = ['r','g','b','m','c',[1.0,0.5,0.0],[0.0,1.0,0.0],[0.33,0.125,0.0],[0.75,0.75,0.75],'k']
@@ -261,7 +261,7 @@ def plot_names(father,params,depth,ax,u_i,seps):
@@ -261,7 +261,7 @@
 		lab = ""
 		txt = father.last_name
 		if params['abrv_start_lev']  < l <= params['abrv_stop_lev'] + 1:
@@ -5167,7 +5175,7 @@ index 1b95358..0faba08 100755
 			lab = str(ide)+": "+father.last_name 
 			txt = str(ide)
 #		ax.bar(fr_0, clto, width = fr_1-fr_0, bottom = float(l-1)/float(depth-1), alpha = params['alpha'], color=col, edgecolor=col)
@@ -288,7 +288,7 @@ def draw_tree(out_file,tree,params):
@@ -288,7 +288,7 @@
 		params['clade_sep'] *= 0.75 	 
 		seps = [params['clade_sep']*sep/(float(depth-i+1)*0.25) for i in range(1,len(tree['nlev'])+1)]
 		totseps = sum([s*nlev[i] for i,s in enumerate(seps[:-1])])
@@ -5176,10 +5184,10 @@ index 1b95358..0faba08 100755
 
 	fig = plt.figure(edgecolor=params['back_color'],facecolor=params['back_color'])
 	ax = fig.add_subplot(111, polar=True, frame_on=False, axis_bgcolor=params['back_color'] )
diff --git a/plot_features.py b/plot_features.py
index 5371eb3..115cf61 100755
--- a/plot_features.py
+++ b/plot_features.py
Index: lefse/plot_features.py
===================================================================
--- lefse.orig/plot_features.py	2019-09-06 12:01:19.030688896 +0100
+++ lefse/plot_features.py	2019-09-06 12:01:19.018688976 +0100
@@ -3,7 +3,7 @@
 import os,sys,matplotlib,zipfile,argparse,string
 matplotlib.use('Agg')
@@ -5189,7 +5197,7 @@ index 5371eb3..115cf61 100755
 import random as rand
 
 colors = ['r','g','b','m','c']
@@ -40,7 +40,7 @@ def read_data(file_data,file_feats,params):
@@ -40,7 +40,7 @@
 	with open(file_feats, 'r') as features:
 		feats_to_plot = [(f.split()[:-1],len(f.split()) == 5) for f in features.readlines()]
 	if not feats_to_plot:
@@ -5198,7 +5206,7 @@ index 5371eb3..115cf61 100755
 		sys.exit(0)
 	feats,cls,class_sl,subclass_sl,class_hierarchy,params['norm_v'] = load_data(file_data, True)	 	
 	if params['feature_num'] > 0: 
@@ -51,7 +51,7 @@ def read_data(file_data,file_feats,params):
@@ -51,7 +51,7 @@
 		if params['f'] == "one" and f[0][0] != params['feature_name']: continue
 		features[f[0][0]] = {'dim':float(f[0][1]), 'abundances':feats[f[0][0]], 'sig':f[1], 'cls':cls, 'class_sl':class_sl, 'subclass_sl':subclass_sl, 'class_hierarchy':class_hierarchy} 
 	if not features:
@@ -5207,7 +5215,7 @@ index 5371eb3..115cf61 100755
                 sys.exit(0)
 	return features
 
@@ -62,7 +62,7 @@ def plot(name,k_n,feat,params):
@@ -62,7 +62,7 @@
 
 	max_m = 0.0
 	norm = 1.0 if float(params['norm_v']) < 0.0 else float(params['norm_v'])
@@ -5216,7 +5224,7 @@ index 5371eb3..115cf61 100755
 		fr,to  = v[0], v[1]
 		median = numpy.mean(feat['abundances'][fr:to])
 		if median > max_m: max_m = median
@@ -76,7 +76,7 @@ def plot(name,k_n,feat,params):
@@ -76,7 +76,7 @@
 	if max_v == 0.0: max_v = 0.0001
 	if max_v == min_v: max_v = min_v*1.1 
 
@@ -5225,7 +5233,7 @@ index 5371eb3..115cf61 100755
 	seps = []
 	xtics = []
 	x2tics = []
@@ -142,8 +142,8 @@ if __name__ == '__main__':
@@ -142,8 +142,8 @@
 	params['fore_color'] = 'w' if params['back_color'] == 'k' else 'k'
 	features = read_data(params['input_file_1'],params['input_file_2'],params)
 	if params['archive'] == "zip": file = zipfile.ZipFile(params['output_file'], "w")
@@ -5236,11 +5244,11 @@ index 5371eb3..115cf61 100755
 		if params['archive'] == "zip":
 			of = plot("/tmp/"+str(int(f['sig']))+"_"+"-".join(k.split("."))+"."+params['format'],k,f,params)
 			file.write(of, os.path.basename(of), zipfile.ZIP_DEFLATED)
diff --git a/plot_res.py b/plot_res.py
index f87e79e..e67153c 100755
--- a/plot_res.py
+++ b/plot_res.py
@@ -6,7 +6,7 @@ matplotlib.use('Agg')
Index: lefse/plot_res.py
===================================================================
--- lefse.orig/plot_res.py	2019-09-06 12:01:19.030688896 +0100
+++ lefse/plot_res.py	2019-09-06 12:01:19.022688949 +0100
@@ -6,7 +6,7 @@
 from pylab import *
 from collections import defaultdict
 
@@ -5249,7 +5257,7 @@ index f87e79e..e67153c 100755
 import argparse
 
 colors = ['r','g','b','m','c','y','k','w']
@@ -44,7 +44,7 @@ def read_data(input_file,output_file,otu_only):
@@ -44,7 +44,7 @@
             rows = [line.strip().split()[:-1] for line in inp.readlines() if len(line.strip().split())>3 and len(line.strip().split()[0].split('.'))==8] # a feature with length 8 will have an OTU id associated with it
     classes = list(set([v[2] for v in rows if len(v)>2]))
     if len(classes) < 1: 
@@ -5258,7 +5266,7 @@ index f87e79e..e67153c 100755
         os.system("touch "+output_file)
         sys.exit()
     data = {}
@@ -94,9 +94,9 @@ def plot_histo_hor(path,params,data,bcl,report_features):
@@ -94,9 +94,9 @@
         ax.barh(pos[i],vv, align='center', color=col, label=lab, height=0.8, edgecolor=params['fore_color'])
     mv = max([abs(float(v[3])) for v in data['rows']])  
     if report_features:
@@ -5270,7 +5278,7 @@ index f87e79e..e67153c 100755
     for i,r in enumerate(data['rows']):
         indcl = cls.index(data['rows'][i][2])
         if params['n_scl'] < 0: rr = r[0]
@@ -156,9 +156,9 @@ def plot_histo_ver(path,params,data,report_features):
@@ -156,9 +156,9 @@
         vv = fabs(float(v[3])) 
         ax.bar(pos[i],vv, align='center', color=col, label=lab)
     if report_features:
@@ -5282,11 +5290,11 @@ index f87e79e..e67153c 100755
     xticks(pos,nam,rotation=-20, ha = 'left',size=params['feature_font_size'])  
     ax.set_title(params['title'],size=params['title_font_size'])
     ax.set_ylabel("LDA SCORE (log 10)")
diff --git a/qiime2lefse.py b/qiime2lefse.py
index dffecc3..cdd09ec 100755
--- a/qiime2lefse.py
+++ b/qiime2lefse.py
@@ -43,8 +43,8 @@ def read_params(args):
Index: lefse/qiime2lefse.py
===================================================================
--- lefse.orig/qiime2lefse.py	2019-09-06 12:01:19.030688896 +0100
+++ lefse/qiime2lefse.py	2019-09-06 12:01:19.022688949 +0100
@@ -43,8 +43,8 @@
 def qiime2lefse(  fin, fmd, fout, all_md, sel_md ):
     with (fin if fin==sys.stdin else open(fin)) as inpf :
         lines = [list(ll) for ll in 
@@ -5297,7 +5305,7 @@ index dffecc3..cdd09ec 100755
     for i,(l1,l2) in enumerate(zip( lines[0], lines[-1] )):
         if not l2 == 'Consensus Lineage':
             lines[-1][i] = l2+"|"+l1
@@ -59,17 +59,17 @@ def qiime2lefse(  fin, fmd, fout, all_md, sel_md ):
@@ -59,17 +59,17 @@
         mdf = mdlines[0][1:]
 
         for l in mdlines:
@@ -5318,10 +5326,10 @@ index dffecc3..cdd09ec 100755
         if k == 'Consensus Lineage':
             continue
         out_m.append( [md[k][kmd] for kmd in selected_md] + list(v) )
diff --git a/run_lefse.py b/run_lefse.py
index df248ef..98c42a3 100755
--- a/run_lefse.py
+++ b/run_lefse.py
Index: lefse/run_lefse.py
===================================================================
--- lefse.orig/run_lefse.py	2019-09-06 12:01:19.030688896 +0100
+++ lefse/run_lefse.py	2019-09-06 12:01:19.022688949 +0100
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
@@ -5331,7 +5339,7 @@ index df248ef..98c42a3 100755
 
 def read_params(args):
         parser = argparse.ArgumentParser(description='LEfSe 1.0')
@@ -60,38 +60,38 @@ if __name__ == '__main__':
@@ -60,38 +60,38 @@
 	wilcoxon_res = {}
 	kw_n_ok = 0
 	nf = 0
@@ -5381,7 +5389,7 @@ index df248ef..98c42a3 100755
 		lda_res,lda_res_th = {},{}
 	outres = {}
 	outres['lda_res_th'] = lda_res_th
@@ -99,5 +99,5 @@ if __name__ == '__main__':
@@ -99,5 +99,5 @@
 	outres['cls_means'] = cls_means
 	outres['cls_means_kord'] = kord
 	outres['wilcox_res'] = wilcoxon_res