Repository 'pampa_communitymetrics'
hg clone https://toolshed.g2.bx.psu.edu/repos/ecology/pampa_communitymetrics

Changeset 0:ddd5b2e74b8b (2020-07-21)
Next changeset 1:e2b0eec4e788 (2020-07-22)
Commit message:
"planemo upload for repository https://github.com/ColineRoyaux/PAMPA-Galaxy commit 07f1028cc764f920b1e6419c151f04ab4e3600fa"
added:
CalculateCommunityMetrics.xml
FunctExeCalcCommIndexesGalaxy.r
FunctPAMPAGalaxy.r
pampa_macros.xml
test-data/Community_metrics_cropped.tabular
test-data/ObservationsSansszcl_cropped.tabular
b
diff -r 000000000000 -r ddd5b2e74b8b CalculateCommunityMetrics.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/CalculateCommunityMetrics.xml Tue Jul 21 06:00:10 2020 -0400
[
@@ -0,0 +1,96 @@
+<tool id="pampa_communitymetrics" name="Calculate community metrics" version="@VERSION@">
+    <description>calculate community metrics from abundance data</description>
+    <macros>
+        <import>pampa_macros.xml</import>
+    </macros>
+    <expand macro="Pampa_requirements"/>
+    <command detect_errors="exit_code"><![CDATA[
+        Rscript 
+         '$__tool_directory__/FunctExeCalcCommIndexesGalaxy.r' 
+         '$input'
+         '$indexes'
+         '$__tool_directory__/FunctPAMPAGalaxy.r' 
+         '$output_community'
+    ]]>
+    </command>
+    <inputs>
+        <expand macro="pampa_input_calculate"/>
+        <param name="indexes" type="select" label="Choose the community metrics you want to compute" help="Presence/absence, Species richness, Simpson and Shannon index are systematically computed." multiple="true">
+            <option selected="true" value="all">All</option>
+            <option value="simpson.l">1-Simpson</option>
+            <option value="pielou">Pielou</option>
+            <option value="hill">Hill</option>
+        </param>
+    </inputs>
+    <outputs>
+        <data name="output_community" from_work_dir="TabCommunityIndexes.tabular" format="tabular"/>
+    </outputs>
+    <tests>
+        <test> 
+            <param name="input" value="ObservationsSansszcl_cropped.tabular"/>
+            <param name="indexes" value="all"/>
+            <output name="output_community" value="Community_metrics_cropped.tabular"/>
+        </test>
+    </tests>
+    <help><![CDATA[
+===============================================
+Calculate community metrics from abundance data
+===============================================
+
+**What it does**
+
+This tool from PAMPA toolsuite computes community metrics from abundance data:
+
+- Specific richness
+- Shannon index
+- Simpson index
+- Pielou index
+- Hill index
+- Relative richness
+
+|
+
+**Input description**
+
+A tabular file with observation data. Must at least contain three columns 'observation.unit'
+which associate year and location or 'year' and 'location', 'species.code' with species ID and 'number' for abundance.
+
++------------------+--------------+------------+
+| observation.unit | species.code |   number   |
++==================+==============+============+
+|   site_yearID    |   speciesID  |      4     |
++------------------+--------------+------------+
+|        ...       |      ...     |     ...    |
++------------------+--------------+------------+
+
+OR
+
++------+----------+--------------+------------+
+| year | location | species.code |   number   |
++======+==========+==============+============+
+| 2000 |locationID|   speciesID  |      4     |
++------+----------+--------------+------------+
+|  ... |    ...   |      ...     |     ...    |
++------+----------+--------------+------------+
+
+The data frame may also contain: 
+
+- 'size.class' field with 'G' representing big individuals in given species, 'M' middle-sized individuals and 'P' small individuals
+- 'rotation' field for STAVIRO data
+
+|
+
+**Output**
+
+A  tabular file with every metrics selected computed per observation unit
+
+|
+
+**Source**
+
+Derived from PAMPA scripts (https://wwz.ifremer.fr/pampa/Meth.-Outils/Outils) written by Yves Reecht.
+
+  ]]></help>
+
+  <expand macro="pampa_bibref" />
+</tool>
b
diff -r 000000000000 -r ddd5b2e74b8b FunctExeCalcCommIndexesGalaxy.r
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/FunctExeCalcCommIndexesGalaxy.r Tue Jul 21 06:00:10 2020 -0400
[
@@ -0,0 +1,157 @@
+#Rscript 
+
+#####################################################################################################################
+#####################################################################################################################
+################################# Calculate community indexes from observation data #################################
+#####################################################################################################################
+#####################################################################################################################
+
+###################### Packages R 
+
+suppressMessages(library(tidyr))
+
+###################### Load arguments and declaring variables
+
+args = commandArgs(trailingOnly=TRUE)
+#options(encoding = "UTF-8")
+
+if (length(args) < 4) {
+    stop("At least one argument must be supplied, an input dataset file (.tabular).", call.=FALSE) #si pas d'arguments -> affiche erreur et quitte / if no args -> error and exit1
+
+} else {
+    Importdata<-args[1] ###### Nom du fichier importé avec son extension / file name imported with the file type ".filetype"  
+    index <- args[2] ###### List of selected metrics to calculate
+    source(args[3]) ###### Import functions
+
+}
+#### Data must be a dataframe with at least 3 variables : unitobs representing location and year ("observation.unit"), species code ("species.code") and abundance ("number")
+
+
+#Import des données / Import data 
+obs<- read.table(Importdata,sep="\t",dec=".",header=TRUE,encoding="UTF-8") #
+obs[obs == -999] <- NA 
+factors <- fact.det.f(Obs=obs)
+ObsType <- def.typeobs.f(Obs=obs)
+obs <- create.unitobs(data=obs)
+
+vars_data<-c("observation.unit","species.code","number")
+err_msg_data<-"The input dataset doesn't have the right format. It need to have at least the following 3 variables :\n- observation.unit (or point and year)\n- species.code\n- number\n"
+check_file(obs,err_msg_data,vars_data,3)
+
+
+
+####################################################################################################
+################## create community metrics table ## Function : calcBiodiv.f #######################
+####################################################################################################
+
+########################################################################################################################
+calcBiodiv.f <- function(Data, MPA, unitobs="observation.unit", code.especes="species.code", nombres="number",
+                         indices=index)
+{
+    ## Purpose: calcul des indices de biodiversité
+    ## ----------------------------------------------------------------------
+    ## Arguments: Data : les données à partir desquelles calculer les
+    ##                   indices. Doivent comporter au minimum (colones) :
+    ##                     * unités d'observations/sites
+    ##                     * espèces présentes
+    ##                     * nombre d'individus /espèce/unitobs.
+    ##            refesp : le référentiel espèces.
+    ##            MPA : l'AMP (chaîne de charactères).
+    ##            unitobs : nom de la colone d'unités d'observation.
+    ##            code.especes : nom de la colone d'espèces.
+    ##            nombres : nom de la colone de nombres.
+    ##            indices : liste des indices à calculer
+    ##                      (vecteur de caractères)
+    ## ----------------------------------------------------------------------
+    ## Author: Yves Reecht, Date: 29 oct. 2010, 08:58
+
+    ## Supression de tout ce qui n'a pas d'espèce précisee (peut être du non biotique ou identification >= genre) :
+
+    notspline <- grep("(sp\\.)$|([1-9])$|^(Absencemacrofaune)$|^(NoID)$|^(Acrobranc)$|^(Acrodigit)$|^(Acroencr)$|^(Acrosubm)$|^(Acrotabu)$|^(Adredure)$|^(Adremoll)$|^(Algaturf)$|^(Balimona)$|^(Corablan)$|^(CoradurV)$|^(Coraenal)$|^(Coramor1)$|^(Coramor2)$|^(Coramou)$|^( Dallcora)$|^(Debrcora)$|^(Debris)$|^(Hare)$|^(HexaChar)$|^(MuraCong)$|^(Nacrbran)$|^(Nacrcham)$|^(Nacrencr)$|^(Nacrfoli)$|^(Nacrmass)$|^(Nacrsubm)$|^(Recrcora)$|^(Roche)$|^(Sable)$|^(Vase)$",Data[, code.especes], value=FALSE)
+    if (length(notspline) != 0)
+    {
+        Data <- Data[-notspline, ]
+    }else{}
+
+    ## Suppression des niveaux de facteur inutilisés :
+    Data <- dropLevels.f(df=Data)
+
+
+    ## Si les données ne sont pas encore agrégées /espèce/unitobs on le fait ici :
+    if (nrow(Data) > nrow(expand.grid(unique(Data[ , unitobs]), unique(Data[ , code.especes]))))
+    {
+        Data <- agregations.generic.f(Data=Data, metrics=nombres,
+                                      factors=c(unitobs, code.especes),
+                                      listFact=NULL)
+    }else{}
+
+    df.biodiv <- as.data.frame(as.table(tapply(Data[ , nombres],
+                                               Data[ , unitobs],
+                                               sum, na.rm=TRUE)))
+
+    colnames(df.biodiv) <- c(unitobs, nombres)
+
+## ##################################################
+    ## Richesse spécifique :
+    Data$pres.abs <- presAbs.f(nombres=Data[ , nombres], logical = FALSE)
+
+    df.biodiv$species.richness <- as.vector(tapply(Data$pres.abs,
+                                                   Data[ , unitobs], sum, na.rm=TRUE),
+                                            "integer")
+    ## ... as.vector to avoid the class "array".
+
+ ## ##################################################
+    ## Indices de Simpson et Shannon et dérivés :
+
+    matNombres <- tapply(Data[ , nombres], # Matrice de nombres d'individus /espèce/unitobs.
+                         list(Data[ , unitobs], Data[ , code.especes]),
+                         sum, na.rm=TRUE)
+
+    matNombres[is.na(matNombres)] <- 0  # Vrais zéros
+
+    ## Proportion d'individus de chaque espèce dans l'unitobs :
+    propIndiv <- sweep(matNombres, 1,                           
+                       apply(matNombres, 1, sum, na.rm = TRUE), # Nombre d'individus / unitobs ; équiv df.biodiv$nombre.
+                       FUN="/")
+
+    ## Indices de Simpson :
+    df.biodiv$simpson <- apply(propIndiv^2, 1, sum, na.rm=TRUE)
+
+    if (any(is.element(c("all", "simpson.l"), indices)))
+    {
+        df.biodiv$simpson.l <- 1 - df.biodiv$simpson
+    }
+
+    ## calcul de l'indice de Shannon :
+    df.biodiv$shannon <- -1 * apply(propIndiv * log(propIndiv), 1, sum, na.rm=TRUE)
+
+    ## calcul de l'indice de Pielou :
+    if (any(is.element(c("all", "pielou"), indices)))
+    {
+        df.biodiv$pielou <- df.biodiv$shannon / log(df.biodiv$species.richness)
+    }
+
+    ## calcul de l'indice de Hill :
+    if (any(is.element(c("all", "hill"), indices)))
+    {
+        df.biodiv$hill <- (1 - df.biodiv$simpson) / exp(df.biodiv$shannon)
+                                        # équiv df.biodiv$l.simpson / exp(df.biodiv$shannon)
+    }
+
+
+    return(df.biodiv)
+}
+
+################# Analysis
+
+res <- calc.numbers.f(obs, ObsType=ObsType , factors=factors, nbName="number")
+
+tableCommunityIndexes <- calcBiodiv.f(res, MPA, unitobs="observation.unit", code.especes="species.code", nombres="number",
+                         indices=index)
+tableCommunityIndexes <- create.year.point(tableCommunityIndexes)
+#Save dataframe in a tabular format
+
+filenameComm <- "TabCommunityIndexes.tabular"
+write.table(tableCommunityIndexes, filenameComm, row.names=FALSE, sep="\t", dec=".",fileEncoding="UTF-8")
+cat(paste("\nWrite table with Community indexes. \n--> \"",filenameComm,"\"\n",sep=""))
+
b
diff -r 000000000000 -r ddd5b2e74b8b FunctPAMPAGalaxy.r
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/FunctPAMPAGalaxy.r Tue Jul 21 06:00:10 2020 -0400
[
b'@@ -0,0 +1,3568 @@\n+#Rscript\n+\n+\n+##################################################################################################################################\n+####################### PAMPA Galaxy tools functions : Calculate metrics, compute GLM and plot   #################################\n+##################################################################################################################################\n+\n+#### Based on Yves Reecht R script\n+#### Modified by Coline ROYAUX for integrating within Galaxy-E\n+\n+######################################### start of the function fact.def.f called by FunctExeCalcCommIndexesGalaxy.r and FunctExeCalcPresAbsGalaxy.r\n+####### Define the finest aggregation with the observation table\n+\n+fact.det.f <- function (Obs,\n+                        size.class="size.class",\n+                        code.especes="species.code",\n+                        unitobs="observation.unit")\n+{\n+    if (any(is.element(c(size.class), colnames(obs))) && all(! is.na(obs[, size.class])))\n+        {\n+            factors <- c(unitobs, code.especes, size.class)\n+        }else{\n+            factors <- c(unitobs, code.especes)\n+        }\n+    return(factors)\n+}\n+\n+######################################### end of the function fact.def.f \n+\n+######################################### start of the function def.typeobs.f called by FunctExeCalcCommIndexesGalaxy.r and FunctExeCalcPresAbsGalaxy.r\n+####### Define observation type from colnames\n+\n+def.typeobs.f <- function(Obs)\n+{\n+    if (any(is.element(c("rotation","rot","rotate"),colnames(obs))))\n+    {\n+        ObsType <- "SVR"\n+    }else{\n+        ObsType <- "other"\n+    }\n+    return(ObsType)\n+}\n+######################################### end of the function fact.def.f \n+\n+######################################### start of the function create.unitobs called by FunctExeCalcCommIndexesGalaxy.r and FunctExeCalcPresAbsGalaxy.r\n+####### Create unitobs column when inexistant\n+create.unitobs <- function(data,year="year",point="point", unitobs="observation.unit")\n+{\n+    if (is.element(paste(unitobs),colnames(data)) && all(grepl("[1-2][0|8|9][0-9]{2}_.*",data[,unitobs])==FALSE))\n+    {\n+        unitab <- data\n+\n+    }else{ \n+\n+        unitab <- unite(data,col="observation.unit",c(year,point))\n+    }\n+    return(unitab)\n+}\n+######################################### start of the function create.unitobs\n+\n+######################################### start of the function create.year.point called by FunctExeCalcCommIndexesGalaxy.r and FunctExeCalcPresAbsGalaxy.r\n+####### separate unitobs column when existant\n+create.year.point <- function(data,year="year",point="point", unitobs="observation.unit")\n+{\n+    if (all(grepl("[1-2][0|8|9][0-9]{2}_.*",data[,unitobs]))==TRUE)\n+    {\n+        tab <- separate(data,col=unitobs,into=c(year,point),sep="_")\n+    }else{\n+        tab <- separate(data,col=unitobs,into=c("site1", year,"obs"),sep=c(2,4))\n+        tab <- unite(tab, col=point, c("site1","obs"))\n+\n+    }\n+\n+    tab <- cbind(tab,observation.unit = data[,unitobs])\n+\n+    return(tab)\n+}\n+######################################### start of the function create.unitobs\n+\n+######################################### start of the function check_file called by every Galaxy Rscripts\n+\n+check_file<-function(dataset,err_msg,vars,nb_vars){\n+\n+    ## Purpose: General function to check integrity of input file. Will \n+    ##          check numbers and contents of variables(colnames).\n+    ##          return an error message and exit if mismatch detected\n+    ## ----------------------------------------------------------------------\n+    ## Arguments: dataset : dataset name\n+    ##            err_msg : output error\n+    ##            vars : expected name of variables\n+    ##            nb_vars : expected number of variables\n+    ## ----------------------------------------------------------------------\n+    ## Author: Alan Amosse, Benjamin Yguel \n+\n+    if(ncol(dataset) < nb_vars){ #checking for r'..b'+  plot(predict(fittedModel), resid(fittedModel, type = "response") , main = "Raw residuals" , ylab = "Residual", xlab = "Predicted")\n+  mtext("Conventional residual plots", outer = T)\n+}\n+\n+\n+\n+\n+#\n+#\n+# if(quantreg == F){\n+#\n+#   lines(smooth.spline(simulationOutput$fittedPredictedResponse, simulationOutput$scaledResiduals, df = 10), lty = 2, lwd = 2, col = "red")\n+#\n+#   abline(h = 0.5, col = "red", lwd = 2)\n+#\n+# }else{\n+#\n+#   #library(gamlss)\n+#\n+#   # qrnn\n+#\n+#   # http://r.789695.n4.nabble.com/Quantile-GAM-td894280.html\n+#\n+#   #require(quantreg)\n+#   #dat <- plyr::arrange(dat,pred)\n+#   #fit<-quantreg::rqss(resid~qss(pred,constraint="N"),tau=0.5,data = dat)\n+#\n+#   probs = c(0.25, 0.50, 0.75)\n+#\n+#   w <- p <- list()\n+#   for(i in seq_along(probs)){\n+#     capture.output(w[[i]] <- qrnn::qrnn.fit(x = as.matrix(simulationOutput$fittedPredictedResponse), y = as.matrix(simulationOutput$scaledResiduals), n.hidden = 4, tau = probs[i], iter.max = 1000, n.trials = 1, penalty = 1))\n+#     p[[i]] <- qrnn::qrnn.predict(as.matrix(sort(simulationOutput$fittedPredictedResponse)), w[[i]])\n+#   }\n+#\n+#\n+#\n+#   #plot(simulationOutput$fittedPredictedResponse, simulationOutput$scaledResiduals, xlab = "Predicted", ylab = "Residual", main = "Residual vs. predicted\\n lines should match", cex.main = 1)\n+#\n+#   #lines(sort(simulationOutput$fittedPredictedResponse), as.vector(p[[1]]), col = "red")\n+#\n+#   matlines(sort(simulationOutput$fittedPredictedResponse), matrix(unlist(p), nrow = length(simulationOutput$fittedPredictedResponse), ncol = length(p)), col = "red", lty = 1)\n+#\n+#   #     as.vector(p[[1]])\n+#   #\n+#   #\n+#   #     lines(simulationOutput$fittedPredictedResponse,p[[1]], col = "red", lwd = 2)\n+#   #     abline(h = 0.5, col = "red", lwd = 2)\n+#   #\n+#   #     fit<-quantreg::rqss(resid~qss(pred,constraint="N"),tau=0.25,data = dat)\n+#   #     lines(unique(dat$pred)[-1],fit$coef[1] + fit$coef[-1], col = "green", lwd = 2, lty =2)\n+#   #     abline(h = 0.25, col = "green", lwd = 2, lty =2)\n+#   #\n+#   #     fit<-quantreg::rqss(resid~qss(pred,constraint="N"),tau=0.75,data = dat)\n+#   #     lines(unique(dat$pred)[-1],fit$coef[1] + fit$coef[-1], col = "blue", lwd = 2, lty = 2)\n+#   #     abline(h = 0.75, col = "blue", lwd = 2, lty =2)\n+# }\n+\n+####################### plot.R\n+\n+####################### random.R\n+\n+#\' Record and restore a random state\n+#\' \n+#\' The aim of this function is to record, manipualate and restor a random state\n+#\' \n+#\' @details This function is intended for two (not mutually exclusive tasks)\n+#\' \n+#\' a) record the current random state\n+#\' \n+#\' b) change the current random state in a way that the previous state can be restored\n+#\' \n+#\' @return a list with various infos about the random state that after function execution, as well as a function to restore the previous state before the function execution\n+#\' \n+#\' @param seed seed argument to set.seed(). NULL = no seed, but random state will be restored. F = random state will not be restored\n+#\' @export\n+#\' @example inst/examples/getRandomStateHelp.R\n+#\' @author Florian Hartig\n+#\' \n+getRandomState <- function(seed = NULL){\n+  \n+  # better to explicitly access the global RS?\n+  # current = get(".Random.seed", .GlobalEnv, ifnotfound = NULL)\n+  \n+  current = mget(".Random.seed", envir = .GlobalEnv, ifnotfound = list(NULL))[[1]]\n+  \n+  if(is.logical(seed) & seed == F){\n+    restoreCurrent <- function(){}    \n+  }else{\n+    restoreCurrent <- function(){\n+      if(is.null(current)) rm(".Random.seed", envir = .GlobalEnv) else assign(".Random.seed", current , envir = .GlobalEnv)\n+    }    \n+  }\n+\n+  # setting seed\n+  if(is.numeric(seed)) set.seed(seed)\n+\n+  # ensuring that RNG has been initialized\n+  if (is.null(current))runif(1) \n+  \n+  randomState = list(seed, state = get(".Random.seed", globalenv()), kind = RNGkind(), restoreCurrent = restoreCurrent)  \n+  return(randomState)\n+}\n+\n+####################### random.R\n+\n+######################################### Package DHARMa\n'
b
diff -r 000000000000 -r ddd5b2e74b8b pampa_macros.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/pampa_macros.xml Tue Jul 21 06:00:10 2020 -0400
b
@@ -0,0 +1,82 @@
+<macros>
+    <token name="@VERSION@">0.0.1</token>
+    <xml name="Pampa_requirements">
+        <requirements>
+            <requirement type="package" version="1.0.2">r-tidyr</requirement>
+        </requirements>    
+    </xml>
+    <xml name="GLM_requirements">
+        <requirements>
+            <requirement type="package" version="1.2.2">r-gap</requirement>
+            <requirement type="package" version="1.0.1">r-glmmtmb</requirement>
+            <requirement type="package" version="1.4_13">r-multcomp</requirement>
+        </requirements>    
+    </xml>
+    <xml name="Plot_requirements">
+        <requirements>
+            <requirement type="package" version="3.1.1">r-ggplot2</requirement>
+        </requirements>    
+    </xml>
+    <xml name="pampa_input_calculate">
+        <param name="input" type="data" format="tabular" label="Input file" help="Observation data file, with location, year, species and abundance."/>
+    </xml>
+    <xml name="pampa_advanced_params_select">
+        <param name="advanced" type="select" label="Specify advanced parameters">
+            <option value="simple" selected="true">No, use program defaults.</option>
+            <option value="advanced">Yes, see full parameter list.</option>
+        </param>        
+        <when value="simple">
+        </when>        
+    </xml>
+    <xml name="pampa_advanced_params_select_GLM">
+        <param name="advanced" type="select" label="Specify advanced parameters">
+            <option value="simple" selected="true">No, use program defaults.</option>
+            <option value="advanced">Yes, see full parameter list.</option>
+        </param>        
+        <when value="simple">
+        </when>        
+        <when value="advanced">
+            <param name="distrib" type="select" label="Distribution for model">
+                <option selected="true" value="None">Auto</option>
+                <option value="gaussian">Gaussian</option>
+                <option value="inverse.gaussian">Inverse Gaussian</option>
+                <option value="poisson">Poisson</option>
+                <option value="quasipoisson">Quasi-Poisson</option>
+                <option value="binomial">Binomial</option>
+                <option value="quasibinomial">Quasi-Binomial</option>
+                <option value="Gamma">Gamma</option>
+            </param>
+        </when>
+    </xml>
+    <xml name="pampa_input_GLM">
+        <param name="input_metric" type="data" format="tabular" label="Input metrics file" help="Metrics data file, with location, year, and metrics informations that can be used as interest variable."/>
+        <param name="input_unitobs" type="data" format="tabular" label="Unitobs informations file" help="Unitobs file, with all informations available about unitobs."/>
+        <param name="varint" type="data_column" data_ref="input_metric" label="Interest variable from metrics file" help= "Choose the field of the interest variable."/>
+    </xml>
+    <xml name="pampa_var_GLM">
+        <param name="varrep" type="select" label="Response variables" help= "Choose the response variables you want to include in your analysis." multiple="true">
+            <option selected="true" value="year">Year</option>
+            <option selected="true" value="site">Site</option>
+            <option selected="true" value="habitat">Habitat</option>
+        </param>
+        <param name="varrand" type="select" label="Random effect ?" help="Allocate a random effect on site or year makes your model more reliable as random events on a peculiar site or year can affect populations, it takes account of pseudoreplication. However, avoid applying it on a less than 10 levels variable (less than 10 different sites and/or year)." multiple="true">
+            <option value="year">Year</option>
+            <option selected="true" value="site">Site</option>
+        </param>
+    </xml>
+    <xml name="pampa_output_GLM">
+        <data name="output_recap" from_work_dir="GLMSummaryFull.txt" format="txt" label="Simple statistics on chosen variables on ${on_string}"/>
+        <data name="output_rate" from_work_dir="RatingGLM.txt" format="txt" label="Your analysis rating file on ${on_string}"/>
+    </xml>
+    <xml name="pampa_bibref">
+        <citations>
+            <citation type="bibtex">
+     @unpublished{pampayves,
+     title={ PAMPA "ressources et biodiversité" scripts },
+            author={Yves Reecht},
+            url={https://wwz.ifremer.fr/pampa/Meth.-Outils/Outils}
+            }
+            </citation>
+        </citations>
+    </xml>
+</macros>
b
diff -r 000000000000 -r ddd5b2e74b8b test-data/Community_metrics_cropped.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/Community_metrics_cropped.tabular Tue Jul 21 06:00:10 2020 -0400
b
b'@@ -0,0 +1,712 @@\n+"point"\t"year"\t"number"\t"species.richness"\t"simpson"\t"simpson.l"\t"shannon"\t"pielou"\t"hill"\t"observation.unit"\n+"AB_0008"\t"08"\t2.66666666666667\t1\t1\t0\t0\tNA\t0\t"AB080008"\n+"AB_0015"\t"08"\t3\t1\t1\t0\t0\tNA\t0\t"AB080015"\n+"AB_0027"\t"08"\t1.33333333333333\t1\t1\t0\t0\tNA\t0\t"AB080027"\n+"AB_0031"\t"08"\t1.33333333333333\t1\t1\t0\t0\tNA\t0\t"AB080031"\n+"AB_0037"\t"08"\t1\t1\t1\t0\t0\tNA\t0\t"AB080037"\n+"AB_0042"\t"08"\t1\t1\t1\t0\t0\tNA\t0\t"AB080042"\n+"AB_0057"\t"08"\t1\t1\t1\t0\t0\tNA\t0\t"AB080057"\n+"AB_0076"\t"09"\t1\t1\t1\t0\t0\tNA\t0\t"AB090076"\n+"AB_0081"\t"09"\t1\t1\t1\t0\t0\tNA\t0\t"AB090081"\n+"AB_0095"\t"09"\t2.33333333333333\t1\t1\t0\t0\tNA\t0\t"AB090095"\n+"AB_0097"\t"09"\t1\t1\t1\t0\t0\tNA\t0\t"AB090097"\n+"AB_0098"\t"09"\t1\t1\t1\t0\t0\tNA\t0\t"AB090098"\n+"AB_0104"\t"09"\t1.2\t1\t1\t0\t0\tNA\t0\t"AB090104"\n+"AB_0105"\t"09"\t1.33333333333333\t1\t1\t0\t0\tNA\t0\t"AB090105"\n+"AB_0106"\t"09"\t2\t1\t1\t0\t0\tNA\t0\t"AB090106"\n+"AB_0120"\t"09"\t1\t1\t1\t0\t0\tNA\t0\t"AB090120"\n+"AB_0121"\t"09"\t2.33333333333333\t1\t1\t0\t0\tNA\t0\t"AB090121"\n+"AB_0122"\t"09"\t1\t1\t1\t0\t0\tNA\t0\t"AB090122"\n+"AB_0123"\t"09"\t1.5\t1\t1\t0\t0\tNA\t0\t"AB090123"\n+"AB_0124"\t"09"\t1\t1\t1\t0\t0\tNA\t0\t"AB090124"\n+"AB_0125"\t"09"\t3.33333333333333\t1\t1\t0\t0\tNA\t0\t"AB090125"\n+"AB_0126"\t"09"\t4.33333333333333\t1\t1\t0\t0\tNA\t0\t"AB090126"\n+"AB_0127"\t"09"\t1.66666666666667\t1\t1\t0\t0\tNA\t0\t"AB090127"\n+"AB_0132"\t"09"\t1.5\t1\t1\t0\t0\tNA\t0\t"AB090132"\n+"AB_0133"\t"09"\t2\t1\t1\t0\t0\tNA\t0\t"AB090133"\n+"AB_0134"\t"09"\t2\t1\t1\t0\t0\tNA\t0\t"AB090134"\n+"AB_0135"\t"09"\t1\t1\t1\t0\t0\tNA\t0\t"AB090135"\n+"AB_0143"\t"09"\t1\t1\t1\t0\t0\tNA\t0\t"AB090143"\n+"AB_0148"\t"09"\t1\t1\t1\t0\t0\tNA\t0\t"AB090148"\n+"AB_0149"\t"09"\t3\t1\t1\t0\t0\tNA\t0\t"AB090149"\n+"AB_0151"\t"09"\t1.33333333333333\t1\t1\t0\t0\tNA\t0\t"AB090151"\n+"AB_0601"\t"09"\t1.66666666666667\t1\t1\t0\t0\tNA\t0\t"AB090601"\n+"AB_0602"\t"09"\t4.66666666666667\t2\t0.86734693877551\t0.13265306122449\t0.257318640543832\t0.371232326640876\t0.10255697699183\t"AB090602"\n+"AB_0603"\t"09"\t1\t1\t1\t0\t0\tNA\t0\t"AB090603"\n+"AB_0001"\t"10"\t2\t1\t1\t0\t0\tNA\t0\t"AB100001"\n+"AB_0002"\t"10"\t4.33333333333333\t1\t1\t0\t0\tNA\t0\t"AB100002"\n+"AB_0006"\t"10"\t2.33333333333333\t1\t1\t0\t0\tNA\t0\t"AB100006"\n+"AB_0008"\t"10"\t3.33333333333333\t1\t1\t0\t0\tNA\t0\t"AB100008"\n+"AB_0009"\t"10"\t1.5\t1\t1\t0\t0\tNA\t0\t"AB100009"\n+"AB_0010"\t"10"\t1.33333333333333\t1\t1\t0\t0\tNA\t0\t"AB100010"\n+"AB_0011"\t"10"\t1.66666666666667\t1\t1\t0\t0\tNA\t0\t"AB100011"\n+"AB_0015"\t"10"\t1\t1\t1\t0\t0\tNA\t0\t"AB100015"\n+"AB_0017"\t"10"\t3.33333333333333\t1\t1\t0\t0\tNA\t0\t"AB100017"\n+"AB_0019"\t"10"\t1.5\t1\t1\t0\t0\tNA\t0\t"AB100019"\n+"AB_0020"\t"10"\t2\t1\t1\t0\t0\tNA\t0\t"AB100020"\n+"AB_0021"\t"10"\t3\t1\t1\t0\t0\tNA\t0\t"AB100021"\n+"AB_0023"\t"10"\t5.33333333333333\t1\t1\t0\t0\tNA\t0\t"AB100023"\n+"AB_0024"\t"10"\t1.33333333333333\t1\t1\t0\t0\tNA\t0\t"AB100024"\n+"AB_0025"\t"10"\t1\t1\t1\t0\t0\tNA\t0\t"AB100025"\n+"AB_0028"\t"10"\t3.33333333333333\t1\t1\t0\t0\tNA\t0\t"AB100028"\n+"AB_0029"\t"10"\t7\t2\t0.909297052154195\t0.0907029478458048\t0.191444081957717\t0.276195427647939\t0.0748993922015743\t"AB100029"\n+"AB_0031"\t"10"\t1\t1\t1\t0\t0\tNA\t0\t"AB100031"\n+"AB_0035"\t"10"\t1\t1\t1\t0\t0\tNA\t0\t"AB100035"\n+"AB_0036"\t"10"\t2.66666666666667\t1\t1\t0\t0\tNA\t0\t"AB100036"\n+"AB_0038"\t"10"\t3\t1\t1\t0\t0\tNA\t0\t"AB100038"\n+"AB_0042"\t"10"\t1\t1\t1\t0\t0\tNA\t0\t"AB100042"\n+"AB_0046"\t"10"\t4\t1\t1\t0\t0\tNA\t0\t"AB100046"\n+"AB_0047"\t"10"\t2\t1\t1\t0\t0\tNA\t0\t"AB100047"\n+"AB_0048"\t"10"\t2.66666666666667\t1\t1\t0\t0\tNA\t0\t"AB100048"\n+"AB_0049"\t"10"\t1.66666666666667\t1\t1\t0\t0\tNA\t0\t"AB100049"\n+"AB_0052"\t"10"\t1\t1\t1\t0\t0\tNA\t0\t"AB100052"\n+"AB_0055"\t"10"\t1\t1\t1\t0\t0\tNA\t0\t"AB100055"\n+"AB_0060"\t"10"\t4.33333333333333\t1\t1\t0\t0\tNA\t0\t"AB100060"\n+"AB_0061"\t"10"\t2.66666666666667\t1\t1\t0\t0\tNA\t0\t"AB100061"\n+"AB_0062"\t"10"\t3.66666666666667\t2\t0.702479338842975\t0.297520661157025\t0.474139313057837\t0.684038435639042\t0.185182969156178\t"AB100062"\n+"AB_0072"\t"10"\t1\t1\t1\t0\t0\tNA\t0\t"AB100072"\n+"AB_0077"\t"10"\t1\t1\t1\t0\t0\tNA\t0\t"AB100077"\n+"AB_0078"\t"10"\t1\t1\t1\t0\t0\tNA\t0\t"AB100078"\n+"AB_0079"\t"10"\t1\t1\t1\t0\t0\tNA\t0\t"AB100079"\n+"AB_0081"\t"10"\t1\t1\t1\t0\t0\tNA\t0\t"AB100081"\n+"AB_0082"\t"10"\t2\t1\t1\t0\t0\tNA\t0\t"AB100082"\n+"AB_0085"\t"10"\t2\t1\t1\t0\t0\tNA\t0\t"AB100085"\n+"AB_0086"\t"10"\t3.33333333333333\t1\t1\t0\t0\tNA\t0\t"AB100086"\n+"AB_0087"\t"10"\t1.66666666666667\t1\t1\t0\t0\tNA\t0\t"AB100087"\n+"AB_0088"\t"10"\t2.33333333333333\t1\t1\t0\t0\tNA\t0\t"AB100088"\n+"AB_0089"\t"10"\t3\t1\t1\t0\t'..b'1\t0\t0\tNA\t0\t"PA170043"\n+"PA_0044"\t"17"\t1\t1\t1\t0\t0\tNA\t0\t"PA170044"\n+"PA_0050"\t"17"\t2.66666666666667\t2\t0.53125\t0.46875\t0.661563238157982\t0.954434002924965\t0.241895626852958\t"PA170050"\n+"PA_0051"\t"17"\t1\t2\t0.5\t0.5\t0.693147180559945\t1\t0.25\t"PA170051"\n+"PA_0054"\t"17"\t1\t1\t1\t0\t0\tNA\t0\t"PA170054"\n+"PA_0055"\t"17"\t2\t2\t0.5\t0.5\t0.693147180559945\t1\t0.25\t"PA170055"\n+"PA_0056"\t"17"\t4.66666666666667\t2\t0.755102040816326\t0.244897959183674\t0.410116318288409\t0.591672778582327\t0.162507688154577\t"PA170056"\n+"PA_0057"\t"17"\t10\t2\t0.935555555555555\t0.0644444444444447\t0.146144746008564\t0.210842300318532\t0.055682102748663\t"PA170057"\n+"PA_0058"\t"17"\t18\t1\t1\t0\t0\tNA\t0\t"PA170058"\n+"PA_0059"\t"17"\t1\t1\t1\t0\t0\tNA\t0\t"PA170059"\n+"PA_0060"\t"17"\t6\t2\t0.802469135802469\t0.197530864197531\t0.348832095843032\t0.503258334775646\t0.139360311832599\t"PA170060"\n+"PA_0066"\t"17"\t2\t1\t1\t0\t0\tNA\t0\t"PA170066"\n+"PA_0068"\t"17"\t1\t1\t1\t0\t0\tNA\t0\t"PA170068"\n+"PA_0074"\t"17"\t1\t1\t1\t0\t0\tNA\t0\t"PA170074"\n+"PA_0079"\t"17"\t1\t1\t1\t0\t0\tNA\t0\t"PA170079"\n+"PA_0080"\t"17"\t6.66666666666667\t2\t0.745\t0.255\t0.422709087805991\t0.6098403047164\t0.167093653955113\t"PA170080"\n+"PA_0081"\t"17"\t3\t2\t0.722222222222222\t0.277777777777778\t0.450561208866305\t0.650022421648354\t0.177019558178641\t"PA170081"\n+"PA_0083"\t"17"\t1\t1\t1\t0\t0\tNA\t0\t"PA170083"\n+"PA_0084"\t"17"\t2.33333333333333\t1\t1\t0\t0\tNA\t0\t"PA170084"\n+"PA_0088"\t"17"\t1.5\t1\t1\t0\t0\tNA\t0\t"PA170088"\n+"PA_0091"\t"17"\t1.66666666666667\t2\t0.68\t0.32\t0.500402423538188\t0.721928094887362\t0.194011720513331\t"PA170091"\n+"PA_0093"\t"17"\t1.5\t2\t0.555555555555556\t0.444444444444444\t0.636514168294813\t0.918295834054489\t0.235170526217511\t"PA170093"\n+"PA_0094"\t"17"\t3\t1\t1\t0\t0\tNA\t0\t"PA170094"\n+"PA_0100"\t"17"\t1\t1\t1\t0\t0\tNA\t0\t"PA170100"\n+"PE_0007"\t"14"\t1\t1\t1\t0\t0\tNA\t0\t"PE140007"\n+"PE_0025"\t"14"\t1\t1\t1\t0\t0\tNA\t0\t"PE140025"\n+"PE_0029"\t"14"\t1\t1\t1\t0\t0\tNA\t0\t"PE140029"\n+"PE_0031"\t"14"\t1\t1\t1\t0\t0\tNA\t0\t"PE140031"\n+"PE_0033"\t"14"\t1\t1\t1\t0\t0\tNA\t0\t"PE140033"\n+"PE_0035"\t"14"\t2.66666666666667\t2\t0.78125\t0.21875\t0.376770161256437\t0.543564443199596\t0.150078631085047\t"PE140035"\n+"PO_0001"\t"12"\t1\t1\t1\t0\t0\tNA\t0\t"PO120001"\n+"PO_0004"\t"12"\t1.5\t1\t1\t0\t0\tNA\t0\t"PO120004"\n+"PO_0007"\t"12"\t2\t1\t1\t0\t0\tNA\t0\t"PO120007"\n+"PO_0018"\t"12"\t1\t1\t1\t0\t0\tNA\t0\t"PO120018"\n+"PO_0028"\t"12"\t2\t1\t1\t0\t0\tNA\t0\t"PO120028"\n+"PO_0045"\t"12"\t2.33333333333333\t1\t1\t0\t0\tNA\t0\t"PO120045"\n+"PO_0048"\t"12"\t1\t1\t1\t0\t0\tNA\t0\t"PO120048"\n+"PO_0053"\t"12"\t1\t1\t1\t0\t0\tNA\t0\t"PO120053"\n+"PO_0066"\t"12"\t1\t1\t1\t0\t0\tNA\t0\t"PO120066"\n+"PO_0092"\t"12"\t6.16666666666667\t1\t1\t0\t0\tNA\t0\t"PO120092"\n+"PO_0094"\t"12"\t1\t1\t1\t0\t0\tNA\t0\t"PO120094"\n+"PO_0096"\t"12"\t2\t1\t1\t0\t0\tNA\t0\t"PO120096"\n+"PO_0121"\t"12"\t5\t1\t1\t0\t0\tNA\t0\t"PO120121"\n+"PO_0134"\t"12"\t1\t1\t1\t0\t0\tNA\t0\t"PO120134"\n+"PO_0136"\t"12"\t1\t1\t1\t0\t0\tNA\t0\t"PO120136"\n+"PO_0200"\t"12"\t2\t1\t1\t0\t0\tNA\t0\t"PO120200"\n+"PO_0203"\t"12"\t3.6\t1\t1\t0\t0\tNA\t0\t"PO120203"\n+"PO_0205"\t"12"\t1\t1\t1\t0\t0\tNA\t0\t"PO120205"\n+"PO_0206"\t"12"\t1.33333333333333\t1\t1\t0\t0\tNA\t0\t"PO120206"\n+"PO_0233"\t"12"\t2\t1\t1\t0\t0\tNA\t0\t"PO120233"\n+"RD_0219"\t"07"\t1\t1\t1\t0\t0\tNA\t0\t"RD070219"\n+"RD_0230"\t"07"\t1\t1\t1\t0\t0\tNA\t0\t"RD070230"\n+"RD_0031"\t"08"\t2\t1\t1\t0\t0\tNA\t0\t"RD080031"\n+"RD_0103"\t"09"\t1\t1\t1\t0\t0\tNA\t0\t"RD090103"\n+"RD_0105"\t"09"\t1\t1\t1\t0\t0\tNA\t0\t"RD090105"\n+"RD_0108"\t"09"\t1\t1\t1\t0\t0\tNA\t0\t"RD090108"\n+"RD_0109"\t"09"\t1\t1\t1\t0\t0\tNA\t0\t"RD090109"\n+"RD_0107"\t"10"\t1\t1\t1\t0\t0\tNA\t0\t"RD100107"\n+"RL_0250"\t"07"\t1\t1\t1\t0\t0\tNA\t0\t"RL070250"\n+"RL_0145"\t"08"\t1\t1\t1\t0\t0\tNA\t0\t"RL080145"\n+"RL_0078"\t"09"\t1.33333333333333\t1\t1\t0\t0\tNA\t0\t"RL090078"\n+"RL_0089"\t"09"\t2\t1\t1\t0\t0\tNA\t0\t"RL090089"\n+"RL_0093"\t"09"\t1\t1\t1\t0\t0\tNA\t0\t"RL090093"\n+"RL_0066"\t"10"\t1\t1\t1\t0\t0\tNA\t0\t"RL100066"\n+"RL_0076"\t"10"\t1.33333333333333\t1\t1\t0\t0\tNA\t0\t"RL100076"\n+"RS_0169"\t"07"\t2.33333333333333\t1\t1\t0\t0\tNA\t0\t"RS070169"\n+"RS_0189"\t"07"\t1\t1\t1\t0\t0\tNA\t0\t"RS070189"\n+"SI_0078"\t"07"\t1\t1\t1\t0\t0\tNA\t0\t"SI070078"\n+"SI_0079"\t"07"\t8.33333333333333\t1\t1\t0\t0\tNA\t0\t"SI070079"\n+"SI_0080"\t"07"\t2\t1\t1\t0\t0\tNA\t0\t"SI070080"\n+"SI_0082"\t"07"\t1\t1\t1\t0\t0\tNA\t0\t"SI070082"\n+"SI_0197"\t"07"\t1\t1\t1\t0\t0\tNA\t0\t"SI070197"\n+"SI_0222"\t"07"\t1\t1\t1\t0\t0\tNA\t0\t"SI070222"\n+"SI_0194"\t"08"\t1\t1\t1\t0\t0\tNA\t0\t"SI080194"\n+"WA_0002"\t"14"\t1\t1\t1\t0\t0\tNA\t0\t"WA140002"\n'
b
diff -r 000000000000 -r ddd5b2e74b8b test-data/ObservationsSansszcl_cropped.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/ObservationsSansszcl_cropped.tabular Tue Jul 21 06:00:10 2020 -0400
b
b'@@ -0,0 +1,2612 @@\n+"observation.unit"\t"rotation"\t"species.code"\t"sexe"\t"taille"\t"size.class"\t"poids"\t"number"\t"min.distance"\t"Dmax"\n+"AS140155"\t3\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"AS140081"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"AS140087"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"AS140092"\t3\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"AS140097"\t2\t"Hemifasc"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"AS140155"\t3\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"AS140156"\t2\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"AS140156"\t3\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"AS140159"\t1\t"Hemifasc"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"AS140159"\t2\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"AS140088"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"AS140088"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t23\t5\t-999\n+"AS140088"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"AS140048"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"AS140048"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t13\t5\t-999\n+"AS140048"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"AS140060"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"AS140060"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"AS140061"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t26\t5\t-999\n+"AS140061"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t26\t5\t-999\n+"AS140061"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t28\t5\t-999\n+"AS140054"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"AS140054"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"AS140059"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"AS140059"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"AS140059"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t13\t5\t-999\n+"AS140070"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"AS140081"\t1\t"Hemifasc"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"AS140081"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"AS140081"\t3\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"AS140087"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t13\t5\t-999\n+"AS140087"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t23\t5\t-999\n+"AS140087"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t13\t5\t-999\n+"AS140092"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t23\t5\t-999\n+"AS140092"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t13\t5\t-999\n+"AS140092"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t26\t5\t-999\n+"AS140092"\t3\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"AS140094"\t1\t"Hemifasc"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"AS140097"\t2\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"AS140157"\t2\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"AS140157"\t3\t"Hemifasc"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"AS140079"\t1\t"Hemifasc"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"AS140079"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t13\t5\t-999\n+"AS140079"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"AS140060"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"AS140060"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"AS140061"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"AS140061"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"AS140059"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"AS140156"\t2\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t8\t-999\n+"AS140156"\t3\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t8\t-999\n+"AS140159"\t2\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t9\t-999\n+"AS140048"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t8\t-999\n+"AS140054"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t7\t-999\n+"AS140059"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t8\t-999\n+"AS140059"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t7\t-999\n+"AS140081"\t3\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t8\t-999\n+"AS140087"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t6\t-999\n+"AS140092"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t8\t-999\n+"AS140092"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t7\t-999\n+"AS140157"\t2\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t6\t-999\n+"AS140079"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t6\t-999\n+"BE13S032"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"BE13S032"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"BE13S032"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"BE13S050"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t4\t5\t-999\n+"BE13S050"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t4\t5\t-999\n+"BE13S050"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t4\t5\t-999\n+"BE13S050"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t4\t5\t-999\n+"BE13S072"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"BL12P017"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"BL120155"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"BL120076"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"BL120094"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"BL1'..b'"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170080"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170043"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170043"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"PA170056"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"PA170056"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170056"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170016"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170022"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170022"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170084"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"PA170084"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170084"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"PA170084"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170084"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170083"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170088"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"PA170093"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170091"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170091"\t3\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170091"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170055"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170051"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170050"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170050"\t2\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170050"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170050"\t1\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170050"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170044"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170014"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"PA170014"\t2\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170014"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170015"\t3\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170013"\t3\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170012"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t5\t-999\n+"PA170011"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170011"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170011"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170011"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170005"\t3\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t7\t-999\n+"PA170042"\t1\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t7\t-999\n+"PA170042"\t2\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t7\t-999\n+"PA170058"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t8\t-999\n+"PA170058"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t8\t-999\n+"PA170058"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t3\t8\t-999\n+"PA170057"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t8\t-999\n+"PA170057"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t10\t-999\n+"PA170057"\t1\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t8\t-999\n+"PA170057"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t8\t-999\n+"PA170057"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t8\t-999\n+"PA170057"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t10\t-999\n+"PA170080"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t8\t-999\n+"PA170080"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t7\t-999\n+"PA170043"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t7\t-999\n+"PA170056"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t8\t-999\n+"PA170056"\t2\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t10\t-999\n+"PA170056"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t7\t-999\n+"PA170056"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t6\t-999\n+"PA170016"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t7\t-999\n+"PA170017"\t2\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t8\t-999\n+"PA170018"\t1\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t6\t-999\n+"PA170018"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t8\t-999\n+"PA170020"\t2\t"Hemifasc"\t-999\t-999\tNA\t-999\t2\t7\t-999\n+"PA170020"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t6\t-999\n+"PA170025"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t7\t-999\n+"PA170088"\t1\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t9\t-999\n+"PA170100"\t1\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t10\t-999\n+"PA170094"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t3\t6\t-999\n+"PA170093"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t10\t-999\n+"PA170091"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t6\t-999\n+"PA170091"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t7\t-999\n+"PA170055"\t3\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t6\t-999\n+"PA170014"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t7\t-999\n+"PA170013"\t2\t"Hemifasc"\t-999\t-999\tNA\t-999\t1\t5\t-999\n+"PA170030"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t2\t7\t-999\n+"PA170027"\t3\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t8\t-999\n+"PA170027"\t2\t"Zebrscop"\t-999\t-999\tNA\t-999\t1\t8\t-999\n'